Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 

1756 Zeilen
58 KiB

  1. //
  2. // Neercs
  3. //
  4. #if defined HAVE_CONFIG_H
  5. # include "config.h"
  6. #endif
  7. #include <cmath>
  8. #include <cstdio>
  9. #include <cstdlib>
  10. #include <ctime>
  11. #include <string>
  12. #include "core.h"
  13. #include "lolgl.h"
  14. #include "loldebug.h"
  15. using namespace std;
  16. using namespace lol;
  17. #include "../neercs.h"
  18. #include "render.h"
  19. #include "text-render.h"
  20. LOLFX_RESOURCE_DECLARE(simple);
  21. LOLFX_RESOURCE_DECLARE(blurh);
  22. LOLFX_RESOURCE_DECLARE(blurv);
  23. LOLFX_RESOURCE_DECLARE(glow);
  24. LOLFX_RESOURCE_DECLARE(remanence);
  25. LOLFX_RESOURCE_DECLARE(copper);
  26. LOLFX_RESOURCE_DECLARE(color);
  27. LOLFX_RESOURCE_DECLARE(noise);
  28. LOLFX_RESOURCE_DECLARE(postfx);
  29. LOLFX_RESOURCE_DECLARE(mirror);
  30. LOLFX_RESOURCE_DECLARE(radial);
  31. #define PID F_PI/180.0f // pi ratio
  32. /*
  33. * Global variable -- ugly (<rez> sam: c'est toi qui est ugly! \:D/)
  34. */
  35. bool g_setup = false;
  36. /*
  37. * Various variables
  38. */
  39. int active = true; // window active flag
  40. float nearplane = 0.1f; // nearplane
  41. float farplane = 1000.0f; // farplane
  42. /* timer variable */
  43. float timer = 0; // timer
  44. /* window variable */
  45. ivec2 screen_size; // screen size
  46. /* object variable */
  47. float main_angle = 0.0f; // main angle
  48. float part_angle = 0.0f; // part angle
  49. float fx_angle; // current angle
  50. /* fs_quad variable */
  51. float fs_quad_vtx[] =
  52. {
  53. -1.0f, 1.0f, 0, 1.0f,
  54. -1.0f, -1.0f, 0, 1.0f,
  55. 1.0f, -1.0f, 0, 1.0f,
  56. 1.0f, 1.0f, 0, 1.0f
  57. };
  58. /* flash variable */
  59. bool flash_flag = false; // flag
  60. float flash_angle = 0; // angle
  61. float flash_value = 0; // value
  62. float flash_speed = 2.0f; // speed
  63. /* fade variable */
  64. bool fade_flag = false; // flag
  65. float fade_angle = 0; // angle
  66. float fade_value = 0; // value
  67. float fade_speed = 0.2f; // speed
  68. /* sync variable */
  69. bool sync_flag = false; // flagsh
  70. float sync_angle = 0; // angle
  71. float sync_value = 0; // value
  72. float sync_speed = 1.0f; // speed
  73. /* beat variable */
  74. bool beat_flag = false; // flag
  75. float beat_angle = 0; // angle
  76. float beat_value = 0; // value
  77. float beat_speed = 2.0f; // speed
  78. /* common variable */
  79. float value, angle, radius, scale, speed;
  80. /* text variable */
  81. ivec2 map_size(256,256); // texture map size
  82. ivec2 canvas_char(0,0); // canvas char number
  83. ivec2 canvas_size(0,0); // caca size
  84. ivec2 font_size(8,8); // font size
  85. ivec2 ratio_2d(1,1); // 2d ratio
  86. ivec2 border(0,0); // border width
  87. /* shader variable */
  88. vec2 buffer; // [new frame mix,old frame mix]
  89. vec2 remanence; // remanence [source mix,buffer mix]
  90. vec2 glow_mix; // glow mix [source mix,glow mix]
  91. vec2 glow_large; // large glow radius [center,corner]
  92. vec2 glow_small; // small glow radius [center,corner]
  93. vec2 blur; // blur radius [center,corner]
  94. vec4 copper_copper; // copper [base,variable,repeat,color cycle]
  95. vec3 copper_mask_color; // color [red,green,blue]
  96. vec3 color_filter; // color filter [red,green,blue]
  97. vec4 color_color; // color modifier [brightness,contrast,level,grayscale]
  98. vec2 noise_offset; // random line [horizontal,vertical]
  99. float noise_noise; // noise
  100. vec3 noise_retrace; // retrace [strength,length,speed]
  101. vec2 postfx_deform; // deformation [ratio,zoom]
  102. float postfx_vignetting; // vignetting strength
  103. float postfx_aberration; // chromatic aberration
  104. vec4 postfx_ghost1; // ghost picture 1 [position x,position y,position z,strength]
  105. vec4 postfx_ghost2; // ghost picture 2 [position x,position y,position z,strength]
  106. vec3 postfx_gradient; // gradient [position y,height,strength]
  107. vec3 postfx_gradient_color;// gradient color [red,green,blue]
  108. vec4 postfx_glass; // glass [depth,thickness,strength,deform ratio]
  109. vec4 postfx_moire_h; // vertical moire [base,variable,repeat,shift]
  110. vec4 postfx_moire_v; // horizontal moire [base,variable,repeat,shift]
  111. vec4 postfx_scanline_h; // vertical scanline [base,variable,repeat,shift]
  112. vec4 postfx_scanline_v; // horizontal scanline [base,variable,repeat,shift]
  113. vec3 postfx_corner; // corner [width,radius,blur]
  114. vec4 mirror; // mirror [width,height,strength,ratio]
  115. vec4 radial; // radial [distance,fade ratio,iteration,strength]
  116. /* theme variable */
  117. int theme_i = 0; // current theme
  118. const int theme_n = 5; // theme number
  119. int theme_var_key = 0; // theme array key
  120. /* setup variable */
  121. bool setup_switch = false; // switch [option/item]
  122. int setup_n = 0; // item/option number
  123. int setup_h = 8; // height
  124. int setup_cursor = 0; // cursor position
  125. int setup_option_i = 0; // selected option
  126. const int setup_option_n = 15; // option number
  127. int setup_option_p = 0; // option position
  128. int setup_item_i = 0; // selected item
  129. int setup_item_n = 8; // item number
  130. int setup_item_p = 0; // item position
  131. int setup_item_key = 0; // item array key
  132. ivec3 setup_size(29, 9, 12); // size [w,h,split]
  133. ivec2 setup_canvas_size(ivec2(setup_size.x + 1, setup_size.y + 1) * font_size * ivec2(2,4));
  134. ivec2 setup_color(0xaaa, 0x222);// color [foreground,background] 0x678,0x234
  135. char const *setup_text[]={
  136. "main",
  137. "2d ratio w",
  138. "2d ratio h",
  139. "border w",
  140. "border h",
  141. "",
  142. "",
  143. "",
  144. "",
  145. "remanence",
  146. "buffer new frame",
  147. "buffer old frame",
  148. "source mix",
  149. "buffer mix",
  150. "",
  151. "",
  152. "",
  153. "",
  154. "glow",
  155. "source mix",
  156. "glow mix",
  157. "large center",
  158. "large corner",
  159. "small center",
  160. "small corner",
  161. "",
  162. "",
  163. "blur",
  164. "blur center",
  165. "blur corner",
  166. "",
  167. "",
  168. "",
  169. "",
  170. "",
  171. "",
  172. "screen",
  173. "deform ratio",
  174. "zoom base",
  175. "corner width",
  176. "corner radius",
  177. "corner blur",
  178. "vignetting",
  179. "",
  180. "",
  181. "copper",
  182. "base",
  183. "variable",
  184. "repeat",
  185. "color cycle",
  186. "color r",
  187. "color g",
  188. "color b",
  189. "",
  190. "color",
  191. "filter red",
  192. "filter green",
  193. "filter blue",
  194. "brightness",
  195. "contrast",
  196. "level",
  197. "grayscale",
  198. "aberration",
  199. "noise",
  200. "offset h",
  201. "offset v",
  202. "noise",
  203. "retrace strength",
  204. "retrace length",
  205. "retrace speed",
  206. "",
  207. "",
  208. "ghost",
  209. "back x",
  210. "back y",
  211. "back z",
  212. "back strength",
  213. "front x",
  214. "front y",
  215. "front z",
  216. "front strength",
  217. "gradient",
  218. "position",
  219. "thickness",
  220. "strength",
  221. "color r",
  222. "color g",
  223. "color b",
  224. "",
  225. "",
  226. "glass",
  227. "depth",
  228. "thickness",
  229. "strength",
  230. "deform ratio",
  231. "",
  232. "",
  233. "",
  234. "",
  235. "moire",
  236. "h base",
  237. "h variable",
  238. "h repeat",
  239. "h shift",
  240. "v base",
  241. "v variable",
  242. "v repeat",
  243. "v shift",
  244. "scanline",
  245. "h base",
  246. "h variable",
  247. "h repeat",
  248. "h shift",
  249. "v base",
  250. "v variable",
  251. "v repeat",
  252. "v shift",
  253. "mirror",
  254. "enable",
  255. "width",
  256. "height",
  257. "strength",
  258. "ratio",
  259. "",
  260. "",
  261. "",
  262. "radial",
  263. "distance",
  264. "fade ratio",
  265. "iteration",
  266. "strength",
  267. "",
  268. "",
  269. "",
  270. "",
  271. ""
  272. };
  273. vec4 setup_conf[]={ // setup variable [start,end,step,value]
  274. vec4(0), /* main */
  275. vec4(1, 8, 1, 0), // ratio_2d.x
  276. vec4(1, 8, 1, 0), // ratio_2d.y
  277. vec4(0, 16, 1, 0), // border.x
  278. vec4(0, 16, 1, 0), // border.y
  279. vec4(0),
  280. vec4(0),
  281. vec4(0),
  282. vec4(0),
  283. vec4(0), /* remanence */
  284. vec4(0.0f, 1.0f, 0.1f, 0), // buffer.x
  285. vec4(0.0f, 1.0f, 0.1f, 0), // buffer.y
  286. vec4(0.0f, 1.0f, 0.1f, 0), // remanence.x
  287. vec4(0.0f, 1.0f, 0.1f, 0), // remanence.y
  288. vec4(0),
  289. vec4(0),
  290. vec4(0),
  291. vec4(0),
  292. vec4(0), /* glow */
  293. vec4(0.0f, 1.0f, 0.1f, 0), // glow_mix.x
  294. vec4(0.0f, 1.0f, 0.1f, 0), // glow_mix.y
  295. vec4(0.0f, 4.0f, 0.1f, 0), // glow_large.x
  296. vec4(0.0f, 4.0f, 0.1f, 0), // glow_large.y
  297. vec4(0.0f, 2.0f, 0.1f, 0), // glow_small.x
  298. vec4(0.0f, 2.0f, 0.1f, 0), // glow_small.y
  299. vec4(0),
  300. vec4(0),
  301. vec4(0), /* blur */
  302. vec4(0, 2, 0.05f, 0), // blur.x
  303. vec4(0, 2, 0.05f, 0), // blur.y
  304. vec4(0),
  305. vec4(0),
  306. vec4(0),
  307. vec4(0),
  308. vec4(0),
  309. vec4(0),
  310. vec4(0), /* screen */
  311. vec4(0.0f, 1.0f, 0.05f, 0), // postfx_deform.x
  312. vec4(0.2f, 0.7f, 0.01f, 0), // postfx_deform.y
  313. vec4(0.0f, 4.0f, 0.10f, 0), // postfx_corner.x
  314. vec4(0.0f, 1.0f, 0.05f, 0), // postfx_corner.y
  315. vec4(0.8f, 1.0f, 0.01f, 0), // postfx_corner.z
  316. vec4(0.0f, 1.0f, 0.10f, 0), // postfx_vignetting
  317. vec4(0),
  318. vec4(0),
  319. vec4(0), /* copper */
  320. vec4(0.0f, 1.0f, 0.05f, 0), // copper_copper.x
  321. vec4(0.0f, 1.0f, 0.05f, 0), // copper_copper.y
  322. vec4(0.0f, 1.0f, 0.02f, 0), // copper_copper.z
  323. vec4(1.0f, 8.0f, 0.25f, 0), // copper_copper.w
  324. vec4(0.0f, 1.0f, 0.05f, 0), // copper_mask_color.x
  325. vec4(0.0f, 1.0f, 0.05f, 0), // copper_mask_color.y
  326. vec4(0.0f, 1.0f, 0.05f, 0), // copper_mask_color.z
  327. vec4(0),
  328. vec4(0), /* color */
  329. vec4( 0.0f, 1.0f, 0.05f, 0), // color_filter.x
  330. vec4( 0.0f, 1.0f, 0.05f, 0), // color_filter.y
  331. vec4( 0.0f, 1.0f, 0.05f, 0), // color_filter.z
  332. vec4( 0.0f, 2.0f, 0.05f, 0), // color_color.x
  333. vec4( 0.0f, 2.0f, 0.05f, 0), // color_color.y
  334. vec4(-1.0f, 1.0f, 0.05f, 0), // color_color.z
  335. vec4( 0.0f, 1.0f, 0.05f, 0), // color_color.w
  336. vec4( 0.0f, 8.0f, 0.50f, 0), // postfx_aberration
  337. vec4(0), /* noise */
  338. vec4(0.0f, 4.0f, 0.50f, 0), // noise_offset.x
  339. vec4(0.0f, 4.0f, 0.50f, 0), // noise_offset.y
  340. vec4(0.0f, 0.5f, 0.05f, 0), // noise_noise
  341. vec4(0.0f, 4.0f, 0.25f, 0), // noise_retrace.x
  342. vec4(0.0f, 8.0f, 0.50f, 0), // noise_retrace.y
  343. vec4(0.0f, 4.0f, 0.25f, 0), // noise_retrace.z
  344. vec4(0),
  345. vec4(0),
  346. vec4(0), /* ghost */
  347. vec4(-2.0f, 2.0f, 0.10f, 0), // postfx_ghost1.x
  348. vec4(-2.0f, 2.0f, 0.10f, 0), // postfx_ghost1.y
  349. vec4(-2.0f, 2.0f, 0.10f, 0), // postfx_ghost1.z
  350. vec4(-1.0f, 1.0f, 0.05f, 0), // postfx_ghost1.w
  351. vec4(-2.0f, 2.0f, 0.10f, 0), // postfx_ghost2.x
  352. vec4(-2.0f, 2.0f, 0.10f, 0), // postfx_ghost2.y
  353. vec4(-2.0f, 2.0f, 0.10f, 0), // postfx_ghost2.z
  354. vec4(-1.0f, 1.0f, 0.05f, 0), // postfx_ghost2.w
  355. vec4(0), /* gradient */
  356. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_gradient.x
  357. vec4( 0.0f, 0.5f, 0.05f, 0), // postfx_gradient.y
  358. vec4(-0.5f, 0.5f, 0.05f, 0), // postfx_gradient.z
  359. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_gradient_color.x
  360. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_gradient_color.y
  361. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_gradient_color.z
  362. vec4(0),
  363. vec4(0),
  364. vec4(0), /* glass */
  365. vec4(0.0f, 16.0f, 0.50f, 0), // postfx_glass.x
  366. vec4(0.0f, 1.0f, 0.05f, 0), // postfx_glass.y
  367. vec4(0.0f, 2.0f, 0.05f, 0), // postfx_glass.z
  368. vec4(0.0f, 1.0f, 0.05f, 0), // postfx_glass.w
  369. vec4(0),
  370. vec4(0),
  371. vec4(0),
  372. vec4(0),
  373. vec4(0), /* moire */
  374. vec4( 0.5f, 1.0f, 0.05f, 0), // postfx_moire_h.x
  375. vec4(-0.5f, 0.5f, 0.05f, 0), // postfx_moire_h.y
  376. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_moire_h.z
  377. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_moire_h.w
  378. vec4( 0.5f, 1.0f, 0.05f, 0), // postfx_moire_v.x
  379. vec4(-0.5f, 0.5f, 0.05f, 0), // postfx_moire_v.y
  380. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_moire_v.z
  381. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_moire_v.w
  382. vec4(0), /* scanline */
  383. vec4( 0.5f, 1.0f, 0.05f, 0), // postfx_scanline_h.x
  384. vec4(-0.5f, 0.5f, 0.05f, 0), // postfx_scanline_h.y
  385. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_scanline_h.z
  386. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_scanline_h.w
  387. vec4( 0.5f, 1.0f, 0.05f, 0), // postfx_scanline_v.x
  388. vec4(-0.5f, 0.5f, 0.05f, 0), // postfx_scanline_v.y
  389. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_scanline_v.z
  390. vec4( 0.0f, 1.0f, 0.05f, 0), // postfx_scanline_v.w
  391. vec4(0), /* mirror */
  392. vec4(0.0f, 2.0f, 0.05f, 0), // mirror.x
  393. vec4(0.0f, 2.0f, 0.05f, 0), // mirror.y
  394. vec4(0.0f, 1.0f, 0.05f, 0), // mirror.z
  395. vec4(1.0f, 8.0f, 1.00f, 0), // mirror.w
  396. vec4(0),
  397. vec4(0),
  398. vec4(0),
  399. vec4(0),
  400. vec4(0), /* radial blur */
  401. vec4(2.0f, 8.0f, 0.25f, 0), // radial.x
  402. vec4(0.8f, 1.0f, 0.01f, 0), // radial.y
  403. vec4(2.0f,32.0f, 2.00f, 0), // radial.z
  404. vec4(0.0f, 1.0f, 0.05f, 0), // radial.w
  405. vec4(0),
  406. vec4(0),
  407. vec4(0),
  408. vec4(0),
  409. vec4(0) /* ? */
  410. };
  411. float theme_var[]={
  412. /* default */
  413. 0,
  414. 1,1, // ratio_2d
  415. 0,0, // border
  416. 0,0,0,0,
  417. 0,
  418. 1.0f,0.8f, // buffer
  419. 0.0f,0.0f, // remanence
  420. 0,0,0,0,
  421. 0,
  422. 0.5f,0.0f, // glow_mix
  423. 0.0f,0.0f, // glow_large
  424. 0.0f,0.0f, // glow_small
  425. 0,0,
  426. 0,
  427. 0.0f,0.0f, // blur
  428. 0,0,0,0,0,0,
  429. 0,
  430. 0.0f,0.5f, // postfx_deform
  431. 0.0f,1.0f,1.0f, // postfx_corner
  432. 0.0f, // postfx_vignetting
  433. 0,0,
  434. 0,
  435. 0.75f,0.25f,0.42f,4.0f, // copper_copper
  436. 0.05f,1.0f,0.0f, // copper_mask_color
  437. 0,
  438. 0,
  439. 1.0f,1.0f,1.0f, // color_filter
  440. 1.0f,1.0f,0.0f,0.0f, // color_color
  441. 0.0f, // postfx_aberration
  442. 0,
  443. 0.0f,0.0f, // noise_offset
  444. 0.0f, // noise_noise
  445. 0.0f,0.0f,0.0f, // noise_retrace
  446. 0,0,
  447. 0,
  448. 0.0f,0.0f,0.0f,0.0f, // postfx_ghost1
  449. 0.0f,0.0f,0.0f,0.0f, // postfx_ghost2
  450. 0,
  451. 0.5f,0.0f,0.0f, // postfx_gradient
  452. 0.0f,0.0f,0.0f, // postfx_gradient_color
  453. 0,0,
  454. 0,
  455. 8.0f,0.0f,0.0f,0.0f, // postfx_glass
  456. 0,0,0,0,
  457. 0,
  458. 1.0f,0.0f,0.0f,0.0f, // postfx_moire_h
  459. 1.0f,0.0f,0.0f,0.0f, // postfx_moire_v
  460. 0,
  461. 1.0f,0.0f,0.0f,0.0f, // postfx_scanline_h
  462. 1.0f,0.0f,0.0f,0.0f, // postfx_scanline_v
  463. 0,
  464. 0.0f,0.0f,0.0f,1.0f, // mirror
  465. 0,0,0,0,
  466. 0,
  467. 4.0f,0.9f,1,0.0f, // radial
  468. 0,0,0,0,
  469. /* crt */
  470. 0,
  471. 2,3, // ratio_2d
  472. 2,1, // border
  473. 0,0,0,0,
  474. 0,
  475. 0.2f,0.8f, // buffer
  476. 0.6f,0.4f, // remanence
  477. 0,0,0,0,
  478. 0,
  479. 0.7f,0.3f, // glow_mix
  480. 3.0f,0.0f, // glow_large
  481. 1.5f,0.0f, // glow_small
  482. 0,0,
  483. 0,
  484. 0.5f,0.0f, // blur
  485. 0,0,0,0,0,0,
  486. 0,
  487. 0.8f,0.48f, // postfx_deform
  488. 0.0f,0.8f,0.96f, // postfx_corner
  489. 0.5f, // postfx_vignetting
  490. 0,0,
  491. 0,
  492. 0.75f,0.25f,0.42f,4.0f, // copper_copper
  493. 0.05f,1.0f,0.0f, // copper_mask_color
  494. 0,
  495. 0,
  496. 0.9f,0.95f,0.85f, // color_filter
  497. 1.0f,1.25f,0.1f,0.4f, // color_color
  498. 4.0f, // postfx_aberration
  499. 0,
  500. 1.0f,1.0f, // noise_offset
  501. 0.15f, // noise_noise
  502. 1.0f,1.0f,0.5f, // noise_retrace
  503. 0,0,
  504. 0,
  505. 1.0f,0.0f,0.0f,-0.25f, // postfx_ghost1
  506. 1.5f,0.0f,0.0f,0.25f, // postfx_ghost2
  507. 0,
  508. 0.5f,0.25f,0.05f, // postfx_gradient
  509. 0.9f,0.8f,0.5f, // postfx_gradient_color
  510. 0,0,
  511. 0,
  512. 8.0f,0.25f,0.75f,0.2f, // postfx_glass
  513. 0,0,0,0,
  514. 0,
  515. 1.0f,0.0f,0.0f,0.0f, // postfx_moire_h
  516. 0.75f,-0.25f,0.25f,0.25f, // postfx_moire_v
  517. 0,
  518. 1.0f,0.0f,0.0f,0.0f, // postfx_scanline_h
  519. 0.75f,-0.25f,0.5f,0.0f, // postfx_scanline_v
  520. 0,
  521. 0.95f,0.9f,0.5f,4.0f, // mirror
  522. 0,0,0,0,
  523. 0,
  524. 4.0f,0.9f,16,0.25f, // radial
  525. 0,0,0,0,
  526. /* amber screen */
  527. 0,
  528. 2,4, // ratio_2d
  529. 1,0, // border
  530. 0,0,0,0,
  531. 0,
  532. 0.2f,0.8f, // buffer
  533. 0.6f,0.4f, // remanence
  534. 0,0,0,0,
  535. 0,
  536. 0.4f,0.6f, // glow_mix
  537. 4.0f,0.0f, // glow_large
  538. 2.0f,0.0f, // glow_small
  539. 0,0,
  540. 0,
  541. 0.5f,0.0f, // blur
  542. 0,0,0,0,0,0,
  543. 0,
  544. 0.7f,0.5f, // postfx_deform
  545. 0.0f,0.85f,0.98f, // postfx_corner
  546. 0.5f, // postfx_vignetting
  547. 0,0,
  548. 0,
  549. 0.75f,0.25f,0.42f,4.0f, // copper_copper
  550. 0.05f,1.0f,0.0f, // copper_mask_color
  551. 0,
  552. 0,
  553. 1.0f,0.7f,0.0f, // color_filter
  554. 1.0f,1.25f,0.1f,1.0f, // color_color
  555. 1.5f, // postfx_aberration
  556. 0,
  557. 1.0f,0.0f, // noise_offset
  558. 0.25f, // noise_noise
  559. 1.0f,2.0f,2.0f, // noise_retrace
  560. 0,0,
  561. 0,
  562. 1.0f,0.0f,0.0f,-0.25f, // postfx_ghost1
  563. 1.5f,0.0f,0.0f,0.25f, // postfx_ghost2
  564. 0,
  565. 0.0f,0.25f,0.1f, // postfx_gradient
  566. 0.25f,0.5f,0.5f, // postfx_gradient_color
  567. 0,0,
  568. 0,
  569. 8.0f,0.0f,0.0f,0.0f, // postfx_glass
  570. 0,0,0,0,
  571. 0,
  572. 1.0f,0.0f,0.0f,0.0f, // postfx_moire_h
  573. 1.0f,0.0f,0.0f,0.0f, // postfx_moire_v
  574. 0,
  575. 0.6f,0.4f,1.0f,0.0f, // postfx_scanline_h
  576. 0.9f,0.1f,0.75f,0.0f, // postfx_scanline_v
  577. 0,
  578. 0.6f,0.6f,0.5f,4.0f, // mirror
  579. 0,0,0,0,
  580. 0,
  581. 4.0f,0.84f,16,0.25f, // radial
  582. 0,0,0,0,
  583. /* lcd */
  584. 0,
  585. 2,2, // ratio_2d
  586. 1,1, // border
  587. 0,0,0,0,
  588. 0,
  589. 0.7f,0.3f, // buffer
  590. 0.5f,0.5f, // remanence
  591. 0,0,0,0,
  592. 0,
  593. 0.5f,0.5f, // glow_mix
  594. 2.4f,0.0f, // glow_large
  595. 1.2f,0.0f, // glow_small
  596. 0,0,
  597. 0,
  598. 0.25f,0.0f, // blur
  599. 0,0,0,0,0,0,
  600. 0,
  601. 0.0f,0.5f, // postfx_deform
  602. 0.0f,1.0f,1.0f, // postfx_corner
  603. 0.0f, // postfx_vignetting
  604. 0,0,
  605. 0,
  606. 0.75f,0.25f,0.42f,4.0f, // copper_copper
  607. 0.05f,1.0f,0.0f, // copper_mask_color
  608. 0,
  609. 0,
  610. 1.0f,1.0f,0.9f, // color_filter
  611. 1.15f,1.25f,-0.1f,0.25f, // color_color
  612. 3.0f, // postfx_aberration
  613. 0,
  614. 0.0f,0.0f, // noise_offset
  615. 0.15f, // noise_noise
  616. 0.0f,0.0f,0.0f, // noise_retrace
  617. 0,0,
  618. 0,
  619. 0.0f,0.0f,0.0f,0.0f, // postfx_ghost1
  620. 0.0f,0.0f,0.0f,0.0f, // postfx_ghost2
  621. 0,
  622. 0.25f,0.5f,0.1f , // postfx_gradient
  623. 0.7f,0.9f,1.0f, // postfx_gradient_color
  624. 0,0,
  625. 0,
  626. 8.0f,0.0f,0.0f,0.0f, // postfx_glass
  627. 0,0,0,0,
  628. 0,
  629. 1.0f,0.0f,0.0f,0.0f, // postfx_moire_h
  630. 1.0f,0.0f,0.0f,0.0f, // postfx_moire_v
  631. 0,
  632. 0.75f,0.25f,0.7f,0.0f, // postfx_scanline_h
  633. 0.75f,0.25f,0.7f,0.0f, // postfx_scanline_v
  634. 0,
  635. 0.0f,0.0f,0.0f,1.0f, // mirror
  636. 0,0,0,0,
  637. 0,
  638. 4.0f,0.9f,1,0.0f, // radial
  639. 0,0,0,0,
  640. /* granpa tv */
  641. 0,
  642. 2,4, // ratio_2d
  643. 1,0, // border
  644. 0,0,0,0,
  645. 0,
  646. 0.2f,0.8f, // buffer
  647. 0.6f,0.4f, // remanence
  648. 0,0,0,0,
  649. 0,
  650. 0.4f,0.6f, // glow_mix
  651. 2.4f,2.0f, // glow_large
  652. 1.2f,1.0f, // glow_small
  653. 0,0,
  654. 0,
  655. 0.5f,0.5f, // blur
  656. 0,0,0,0,0,0,
  657. 0,
  658. 1.0f,0.5f, // postfx_deform
  659. 0.0f,0.5f,0.9f, // postfx_corner
  660. 0.5f, // postfx_vignetting
  661. 0,0,
  662. 0,
  663. 0.75f,0.25f,0.42f,4.0f, // copper_copper
  664. 0.05f,1.0f,0.0f, // copper_mask_color
  665. 0,
  666. 0,
  667. 0.7f,0.8f,1.0f, // color_filter
  668. 0.9f,1.1f,0.0f,1.0f, // color_color
  669. 0.0f, // postfx_aberration
  670. 0,
  671. 2.0f,0.0f, // noise_offset
  672. 0.25f, // noise_noise
  673. 1.0f,1.0f,4.0f, // noise_retrace
  674. 0,0,
  675. 0,
  676. -1.0f,0.0f,0.0f,-0.25f, // postfx_ghost1
  677. 1.0f,0.0f,0.0f,-0.25f, // postfx_ghost2
  678. 0,
  679. 0.5f,0.25f,0.05f, // postfx_gradient
  680. 0.9f,0.8f,0.5f, // postfx_gradient_color
  681. 0,0,
  682. 0,
  683. 8.0f,0.0f,0.0f,0.0f, // postfx_glass
  684. 0,0,0,0,
  685. 0,
  686. 1.0f,0.0f,0.0f,0.0f, // postfx_moire_h
  687. 1.0f,0.0f,0.0f,0.0f, // postfx_moire_v
  688. 0,
  689. 0.75f,-0.25f,0.75f,0.0f, // postfx_scanline_h
  690. 1.0f,0.0f,0.0f,0.0f, // postfx_scanline_v
  691. 0,
  692. 0.95f,0.9f,0.5f,4.0f, // mirror
  693. 0,0,0,0,
  694. 0,
  695. 4.0f,0.9f,16,0.5f, // radial
  696. 0,0,0,0,
  697. /* intex system 4000 */
  698. 0};
  699. void Render::InitShaderVar()
  700. {
  701. int k = theme_i * setup_option_n * 9 + 1; /* main */
  702. ratio_2d = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  703. border = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  704. k += 5; /* remanence */
  705. buffer = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  706. remanence = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  707. k += 5; /* glow */
  708. glow_mix = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  709. glow_large = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  710. glow_small = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  711. k += 3; /* blur */
  712. blur = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  713. k += 7; /* screen */
  714. postfx_deform = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  715. postfx_corner = vec3(theme_var[k], theme_var[k + 1], theme_var[k + 2]); k += 3;
  716. postfx_vignetting = theme_var[k]; k++;
  717. k += 3; /* copper */
  718. copper_copper = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  719. copper_mask_color = vec3(theme_var[k], theme_var[k + 1], theme_var[k + 2]); k += 3;
  720. k += 2; /* color */
  721. color_filter = vec3(theme_var[k], theme_var[k + 1], theme_var[k + 2]); k += 3;
  722. color_color = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  723. postfx_aberration = theme_var[k]; k++;
  724. k += 1; /* noise */
  725. noise_offset = vec2(theme_var[k], theme_var[k + 1]); k += 2;
  726. noise_noise = theme_var[k]; k++;
  727. noise_retrace = vec3(theme_var[k], theme_var[k + 1], theme_var[k + 2]); k += 3;
  728. k += 3; /* ghost */
  729. postfx_ghost1 = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  730. postfx_ghost2 = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  731. k += 1; /* gradient */
  732. postfx_gradient = vec3(theme_var[k], theme_var[k + 1], theme_var[k + 2]); k += 3;
  733. postfx_gradient_color = vec3(theme_var[k], theme_var[k + 1], theme_var[k + 2]); k += 3;
  734. k += 3; /* glass */
  735. postfx_glass = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  736. k += 5; /* moire */
  737. postfx_moire_h = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  738. postfx_moire_v = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  739. k += 1; /* scanline */
  740. postfx_scanline_h = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  741. postfx_scanline_v = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  742. k += 1; /* mirror */
  743. mirror = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  744. k += 5; /* radial blur */
  745. radial = vec4(theme_var[k], theme_var[k + 1], theme_var[k + 2], theme_var[k + 3]); k += 4;
  746. }
  747. void Render::UpdateSize()
  748. {
  749. screen_size = Video::GetSize();
  750. canvas_char = (screen_size - border * ratio_2d * font_size * 2) / (font_size * ratio_2d);
  751. canvas_char = max(canvas_char, ivec2(1, 1));
  752. canvas_size = canvas_char * font_size * ratio_2d;
  753. border = (screen_size - canvas_size) / 2;
  754. caca_set_canvas_size(m_cv_screen, canvas_char.x, canvas_char.y);
  755. caca_set_canvas_size(m_cv_setup, setup_size.x + 1, setup_size.y + 1);
  756. }
  757. int calc_item_length()
  758. {
  759. int n = !setup_switch ? setup_option_n : setup_item_n;
  760. for (int i = 0; i < n; i++)
  761. {
  762. int k = !setup_switch ? (i * (setup_item_n + 1)) : (setup_option_i * (setup_item_n + 1) + 1 + i);
  763. if (setup_text[k][0] == '\0') return i - 1;
  764. }
  765. return n - 1;
  766. }
  767. Shader *shader_simple;
  768. Shader *shader_blur_h, *shader_blur_v, *shader_glow;
  769. Shader *shader_remanence, *shader_copper, *shader_color;
  770. Shader *shader_noise, *shader_postfx, *shader_mirror, *shader_radial;
  771. // shader variables
  772. ShaderUniform shader_simple_texture;
  773. ShaderUniform shader_blur_h_texture,
  774. shader_blur_h_radius,
  775. shader_blur_v_texture,
  776. shader_blur_v_radius;
  777. ShaderUniform shader_glow_glow,
  778. shader_glow_source,
  779. shader_glow_mix;
  780. ShaderUniform shader_remanence_source,
  781. shader_remanence_buffer,
  782. shader_remanence_mix;
  783. ShaderUniform shader_copper_texture,
  784. shader_copper_screen_size,
  785. shader_copper_time,
  786. shader_copper_copper,
  787. shader_copper_mask_color;
  788. ShaderUniform shader_color_texture,
  789. shader_color_screen_size,
  790. shader_color_filter,
  791. shader_color_color,
  792. shader_color_flash;
  793. ShaderUniform shader_noise_texture,
  794. shader_noise_screen_size,
  795. shader_noise_time,
  796. shader_noise_offset,
  797. shader_noise_noise,
  798. shader_noise_retrace;
  799. ShaderUniform shader_postfx_texture,
  800. shader_postfx_texture_2d,
  801. shader_postfx_screen_size,
  802. shader_postfx_ratio_2d,
  803. shader_postfx_time,
  804. shader_postfx_deform,
  805. shader_postfx_ghost1,
  806. shader_postfx_ghost2,
  807. shader_postfx_glass,
  808. shader_postfx_vignetting,
  809. shader_postfx_gradient,
  810. shader_postfx_gradient_color,
  811. shader_postfx_aberration,
  812. shader_postfx_moire_h,
  813. shader_postfx_moire_v,
  814. shader_postfx_scanline_h,
  815. shader_postfx_scanline_v,
  816. shader_postfx_corner,
  817. shader_postfx_sync,
  818. shader_postfx_beat;
  819. ShaderUniform shader_mirror_texture,
  820. shader_mirror_screen_size,
  821. shader_mirror_mirror;
  822. ShaderUniform shader_radial_texture,
  823. shader_radial_screen_size,
  824. shader_radial_radial;
  825. void Render::TraceQuad()
  826. {
  827. m_vdecl->Bind();
  828. m_vdecl->DrawElements(MeshPrimitive::Triangles, 0, 6);
  829. m_vdecl->Unbind();
  830. }
  831. void Render::ShaderSimple(Framebuffer *fbo_output, int n)
  832. {
  833. shader_simple->Bind();
  834. shader_simple->SetUniform(shader_simple_texture, fbo_output->GetTextureUniform(), n);
  835. m_vdecl->SetStream(m_vbo, shader_simple->GetAttribLocation(VertexUsage::Position, 0));
  836. TraceQuad();
  837. shader_simple->Unbind();
  838. }
  839. int Render::InitDrawResources(void)
  840. {
  841. /* Initialise framebuffer objects */
  842. m_fbos.back = new Framebuffer(screen_size);
  843. m_fbos.screen = new Framebuffer(screen_size);
  844. m_fbos.front = new Framebuffer(screen_size);
  845. m_fbos.buffer = new Framebuffer(screen_size);
  846. m_fbos.blur_h = new Framebuffer(screen_size);
  847. m_fbos.blur_v = new Framebuffer(screen_size);
  848. m_fbos.tmp = new Framebuffer(screen_size);
  849. /* Initialise vertex declaration */
  850. m_vdecl = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position));
  851. array<vec2> vertices;
  852. vertices << vec2(-1, 1);
  853. vertices << vec2(-1, -1);
  854. vertices << vec2(1, -1);
  855. vertices << vec2(1, -1);
  856. vertices << vec2(1, 1);
  857. vertices << vec2(-1, 1);
  858. m_vbo = new VertexBuffer(vertices.Bytes());
  859. memcpy(m_vbo->Lock(0, 0), vertices.Data(), vertices.Bytes());
  860. m_vbo->Unlock();
  861. // shader simple
  862. shader_simple = Shader::Create(LOLFX_RESOURCE_NAME(simple));
  863. shader_simple_texture = shader_simple->GetUniformLocation("texture");
  864. // shader glow
  865. shader_glow = Shader::Create(LOLFX_RESOURCE_NAME(glow));
  866. shader_glow_glow = shader_glow->GetUniformLocation("glow");
  867. shader_glow_source = shader_glow->GetUniformLocation("source");
  868. shader_glow_mix = shader_glow->GetUniformLocation("mix");
  869. // shader blur horizontal
  870. shader_blur_h = Shader::Create(LOLFX_RESOURCE_NAME(blurh));
  871. shader_blur_h_texture = shader_blur_h->GetUniformLocation("texture");
  872. shader_blur_h_radius = shader_blur_h->GetUniformLocation("radius");
  873. // shader blur vertical
  874. shader_blur_v = Shader::Create(LOLFX_RESOURCE_NAME(blurv));
  875. shader_blur_v_texture = shader_blur_v->GetUniformLocation("texture");
  876. shader_blur_v_radius = shader_blur_v->GetUniformLocation("radius");
  877. // shader remanence
  878. shader_remanence = Shader::Create(LOLFX_RESOURCE_NAME(remanence));
  879. shader_remanence_source = shader_remanence->GetUniformLocation("source");
  880. shader_remanence_buffer = shader_remanence->GetUniformLocation("buffer");
  881. shader_remanence_mix = shader_remanence->GetUniformLocation("mix");
  882. // shader copper
  883. shader_copper = Shader::Create(LOLFX_RESOURCE_NAME(copper));
  884. shader_copper_texture = shader_copper->GetUniformLocation("texture");
  885. shader_copper_screen_size = shader_copper->GetUniformLocation("screen_size");
  886. shader_copper_time = shader_copper->GetUniformLocation("time");
  887. shader_copper_copper = shader_copper->GetUniformLocation("copper");
  888. shader_copper_mask_color = shader_copper->GetUniformLocation("mask_color");
  889. // shader color
  890. shader_color = Shader::Create(LOLFX_RESOURCE_NAME(color));
  891. shader_color_texture = shader_color->GetUniformLocation("texture");
  892. shader_color_screen_size = shader_color->GetUniformLocation("screen_size");
  893. shader_color_filter = shader_color->GetUniformLocation("filter");
  894. shader_color_color = shader_color->GetUniformLocation("color");
  895. shader_color_flash = shader_color->GetUniformLocation("flash");
  896. // shader noise
  897. shader_noise = Shader::Create(LOLFX_RESOURCE_NAME(noise));
  898. shader_noise_texture = shader_noise->GetUniformLocation("texture");
  899. shader_noise_screen_size = shader_noise->GetUniformLocation("screen_size");
  900. shader_noise_time = shader_noise->GetUniformLocation("time");
  901. shader_noise_offset = shader_noise->GetUniformLocation("offset");
  902. shader_noise_noise = shader_noise->GetUniformLocation("noise");
  903. shader_noise_retrace = shader_noise->GetUniformLocation("retrace");
  904. // shader postfx
  905. shader_postfx = Shader::Create(LOLFX_RESOURCE_NAME(postfx));
  906. shader_postfx_texture = shader_postfx->GetUniformLocation("texture");
  907. shader_postfx_texture_2d = shader_postfx->GetUniformLocation("texture_2d");
  908. shader_postfx_screen_size = shader_postfx->GetUniformLocation("screen_size");
  909. shader_postfx_ratio_2d = shader_postfx->GetUniformLocation("ratio_2d");
  910. shader_postfx_time = shader_postfx->GetUniformLocation("time");
  911. shader_postfx_deform = shader_postfx->GetUniformLocation("deform");
  912. shader_postfx_ghost1 = shader_postfx->GetUniformLocation("ghost1");
  913. shader_postfx_ghost2 = shader_postfx->GetUniformLocation("ghost2");
  914. shader_postfx_glass = shader_postfx->GetUniformLocation("glass");
  915. shader_postfx_gradient = shader_postfx->GetUniformLocation("gradient");
  916. shader_postfx_gradient_color = shader_postfx->GetUniformLocation("gradient_color");
  917. shader_postfx_vignetting = shader_postfx->GetUniformLocation("vignetting");
  918. shader_postfx_aberration = shader_postfx->GetUniformLocation("aberration");
  919. shader_postfx_moire_h = shader_postfx->GetUniformLocation("moire_h");
  920. shader_postfx_moire_v = shader_postfx->GetUniformLocation("moire_v");
  921. shader_postfx_scanline_h = shader_postfx->GetUniformLocation("scanline_h");
  922. shader_postfx_scanline_v = shader_postfx->GetUniformLocation("scanline_v");
  923. shader_postfx_corner = shader_postfx->GetUniformLocation("corner");
  924. shader_postfx_sync = shader_postfx->GetUniformLocation("sync");
  925. shader_postfx_beat = shader_postfx->GetUniformLocation("beat");
  926. // shader mirror
  927. shader_mirror = Shader::Create(LOLFX_RESOURCE_NAME(mirror));
  928. shader_mirror_texture = shader_mirror->GetUniformLocation("texture");
  929. shader_mirror_screen_size = shader_mirror->GetUniformLocation("screen_size");
  930. shader_mirror_mirror = shader_mirror->GetUniformLocation("mirror");
  931. // shader radial blur
  932. shader_radial = Shader::Create(LOLFX_RESOURCE_NAME(radial));
  933. shader_radial_texture = shader_radial->GetUniformLocation("texture");
  934. shader_radial_screen_size = shader_radial->GetUniformLocation("screen_size");
  935. shader_radial_radial = shader_radial->GetUniformLocation("radial");
  936. // initialize setup
  937. setup_n = calc_item_length();
  938. return true;
  939. }
  940. Render::Render(caca_canvas_t *caca)
  941. : m_cv_screen(caca),
  942. m_cv_setup(caca_create_canvas(1, 1)),
  943. m_fps_debug(0),
  944. m_ready(false),
  945. m_pause(false)
  946. {
  947. m_txt_screen = new TextRender(m_cv_screen, font_size);
  948. m_txt_setup = new TextRender(m_cv_setup, font_size);
  949. m_flags.shader = false;
  950. m_flags.remanence = true;
  951. m_flags.glow = true;
  952. m_flags.blur = true;
  953. m_flags.postfx = true;
  954. m_flags.copper = true;
  955. m_flags.color = true;
  956. m_flags.noise = true;
  957. m_flags.mirror = true;
  958. m_flags.radial = true;
  959. }
  960. void Render::TickGame(float seconds)
  961. {
  962. Entity::TickGame(seconds);
  963. /* draw setup */
  964. if (g_setup)
  965. {
  966. /* background */
  967. caca_set_color_argb(m_cv_setup, setup_color.x, setup_color.y);
  968. caca_fill_box(m_cv_setup, 0, 0, setup_size.x + 1, setup_size.y,' ');
  969. caca_draw_line(m_cv_setup, setup_size.z - 1, 1, setup_size.z - 1, setup_size.y - 1,'|');
  970. /* title */
  971. caca_set_color_argb(m_cv_setup, setup_color.y, setup_color.x);
  972. caca_draw_line(m_cv_setup, 0, 0, setup_size.x, 0, ' ');
  973. caca_put_str(m_cv_setup, setup_size.x / 2 - 3, 0, "SETUP");
  974. /* informations */
  975. /*
  976. int w = caca_get_canvas_width(m_cv_screen);
  977. int h = caca_get_canvas_height(m_cv_screen);
  978. caca_set_color_argb(m_cv_setup, setup_color.y, setup_color.x);
  979. caca_printf(m_cv_setup, 1, 0, "%i*%i", w, h);
  980. */
  981. /* display option */
  982. for (int i = 0; i < setup_h; i++)
  983. {
  984. int y = 1 + i;
  985. int k = (setup_option_p + i) * (setup_item_n + 1);
  986. if (setup_option_i != setup_option_p + i || setup_switch)
  987. {
  988. caca_set_color_argb(m_cv_setup, setup_color.x, setup_color.y);
  989. caca_put_str(m_cv_setup, 1, y, setup_text[k]);
  990. }
  991. else
  992. {
  993. caca_set_color_argb(m_cv_setup, setup_color.y, 0x0f0);//setup_color.x);
  994. caca_draw_line(m_cv_setup, 0, y, setup_size.z - 2, y,' ');
  995. caca_put_str(m_cv_setup, 1, y, setup_text[k]);
  996. }
  997. }
  998. /* display item */
  999. for (int i = 0; i < setup_h; i++)
  1000. {
  1001. int y = 1 + i;
  1002. int k = setup_option_i * (setup_item_n + 1) + 1 + setup_item_p + i;
  1003. if (setup_item_i != setup_item_p + i || !setup_switch)
  1004. {
  1005. caca_set_color_argb(m_cv_setup, setup_color.x, setup_color.y);
  1006. caca_put_str(m_cv_setup, setup_size.z + 1, y, setup_text[k]);
  1007. }
  1008. else
  1009. {
  1010. caca_set_color_argb(m_cv_setup, setup_color.y, 0x0f0);//setup_color.x);
  1011. caca_draw_line(m_cv_setup, setup_size.z, y, setup_size.x, y,' ');
  1012. caca_put_str(m_cv_setup, setup_size.z + 1, y, setup_text[k]);
  1013. }
  1014. }
  1015. /* display variable */
  1016. int y = setup_size.y;
  1017. setup_item_key = setup_option_i * (setup_item_n + 1) + 1 + setup_item_i;
  1018. theme_var_key = theme_i * setup_option_n * 9 + setup_item_key;
  1019. caca_set_color_argb(m_cv_setup, setup_color.y, setup_color.x);
  1020. caca_draw_line(m_cv_setup, 0, y, setup_size.x, y,' ');
  1021. if (setup_switch)
  1022. {
  1023. int x = 1;
  1024. int w = setup_size.x - 3 - 4;
  1025. float bar_w = w / (setup_conf[setup_item_key].y - setup_conf[setup_item_key].x);
  1026. int bar_x = bar_w * setup_conf[setup_item_key].x;
  1027. if ((setup_conf[setup_item_key].y - setup_conf[setup_item_key].x) / setup_conf[setup_item_key].z > 1)
  1028. {
  1029. /* work around a bug in libcaca */
  1030. if (setup_size.x - 4 < caca_get_canvas_width(m_cv_setup)) caca_printf(m_cv_setup, setup_size.x - 4, y, "%4.2f", theme_var[theme_var_key]);
  1031. caca_draw_line(m_cv_setup, x, y, x - bar_x + int(bar_w * setup_conf[setup_item_key].y), y,'.');
  1032. if (theme_var[theme_var_key] != setup_conf[setup_item_key].x) caca_draw_line(m_cv_setup, x, y, x - bar_x + int(bar_w * theme_var[theme_var_key]), y, 'x');
  1033. }
  1034. else
  1035. {
  1036. if (setup_conf[setup_item_key] != vec4(0))
  1037. {
  1038. caca_put_str(m_cv_setup, setup_size.x - 3, y, (theme_var[theme_var_key] == setup_conf[setup_item_key].y)?"YES":" NO");
  1039. }
  1040. }
  1041. }
  1042. else
  1043. {
  1044. caca_printf(m_cv_setup, 1, y, "%d/%d", setup_option_i, setup_n);
  1045. }
  1046. }
  1047. }
  1048. void Render::Pause()
  1049. {
  1050. m_pause=!m_pause;
  1051. }
  1052. void Render::TickDraw(float seconds, Scene &scene)
  1053. {
  1054. /* keyboard manager */
  1055. #if 0
  1056. if (Input::WasPressed(Key::F1))
  1057. {
  1058. g_setup = !g_setup;
  1059. if (g_setup) setup_n = calc_item_length();
  1060. sync_flag = true;
  1061. sync_angle = main_angle;
  1062. if (m_fps_debug)
  1063. {
  1064. Ticker::Unref(m_fps_debug);
  1065. m_fps_debug = NULL;
  1066. }
  1067. if (g_setup)
  1068. {
  1069. m_fps_debug = new DebugFps(2, 2);
  1070. Ticker::Ref(m_fps_debug);
  1071. }
  1072. }
  1073. if (Input::WasPressed(Key::F2))
  1074. {
  1075. m_flags.remanence = !m_flags.remanence;
  1076. m_flags.glow = !m_flags.glow;
  1077. m_flags.blur = !m_flags.blur;
  1078. m_flags.postfx = !m_flags.postfx;
  1079. //m_flags.copper = !m_flags.copper;
  1080. m_flags.color = !m_flags.color;
  1081. m_flags.noise = !m_flags.noise;
  1082. m_flags.mirror = !m_flags.mirror;
  1083. m_flags.radial = !m_flags.radial;
  1084. }
  1085. if (Input::WasPressed(Key::F4))
  1086. {
  1087. theme_i--;
  1088. if(theme_i < 0) theme_i = theme_n - 1;
  1089. InitShaderVar();
  1090. UpdateSize();
  1091. }
  1092. if (Input::WasPressed(Key::F5))
  1093. {
  1094. theme_i++;
  1095. if(theme_i > theme_n - 1) theme_i = 0;
  1096. InitShaderVar();
  1097. UpdateSize();
  1098. }
  1099. if (Input::WasPressed(Key::Tab))
  1100. {
  1101. if (g_setup)
  1102. {
  1103. setup_switch = !setup_switch;
  1104. setup_n = calc_item_length();
  1105. setup_cursor = (!setup_switch?setup_option_i:setup_item_i) - (!setup_switch?setup_option_p:setup_item_p);
  1106. }
  1107. }
  1108. if (Input::WasPressed(Key::Up))
  1109. {
  1110. if (g_setup)
  1111. {
  1112. if (!setup_switch)
  1113. {
  1114. if (setup_cursor > 0)
  1115. {
  1116. setup_cursor--;
  1117. }
  1118. else
  1119. {
  1120. if (setup_cursor == 0) setup_option_p--;
  1121. }
  1122. if (setup_option_i > 0)
  1123. {
  1124. setup_option_i--;
  1125. }
  1126. else
  1127. {
  1128. setup_option_i = setup_option_n - 1;
  1129. setup_option_p = setup_option_n - setup_h;
  1130. setup_cursor = setup_h - 1;
  1131. }
  1132. setup_item_i = 0;
  1133. setup_item_p = 0;
  1134. }
  1135. else
  1136. {
  1137. if (setup_cursor > 0)
  1138. {
  1139. setup_cursor--;
  1140. }
  1141. else
  1142. {
  1143. if (setup_cursor == 0) setup_item_p--;
  1144. }
  1145. if (setup_item_i > 0)
  1146. {
  1147. setup_item_i--;
  1148. }
  1149. else
  1150. {
  1151. setup_item_i = setup_n;
  1152. setup_item_p = (setup_n < setup_h) ? 0 : setup_n - setup_h + 1;
  1153. setup_cursor = (setup_n < setup_h) ? setup_n : setup_h - 1;
  1154. }
  1155. }
  1156. }
  1157. }
  1158. if (Input::WasPressed(Key::Down))
  1159. {
  1160. if (g_setup)
  1161. {
  1162. if (!setup_switch)
  1163. {
  1164. if (setup_cursor < setup_h - 1)
  1165. {
  1166. setup_cursor++;
  1167. }
  1168. else
  1169. {
  1170. if (setup_cursor == setup_h - 1) setup_option_p++;
  1171. }
  1172. if (setup_option_i < setup_option_n - 1)
  1173. {
  1174. setup_option_i++;
  1175. }
  1176. else
  1177. {
  1178. setup_option_i = 0;
  1179. setup_option_p = 0;
  1180. setup_cursor = 0;
  1181. }
  1182. setup_item_i = 0;
  1183. setup_item_p = 0;
  1184. }
  1185. else
  1186. {
  1187. if (setup_cursor < setup_h - 1)
  1188. {
  1189. setup_cursor++;
  1190. }
  1191. else
  1192. {
  1193. if (setup_cursor == setup_h - 1) setup_item_p++;
  1194. }
  1195. if (setup_item_i < setup_n)
  1196. {
  1197. setup_item_i++;
  1198. }
  1199. else
  1200. {
  1201. setup_item_i = 0;
  1202. setup_item_p = 0;
  1203. setup_cursor = 0;
  1204. }
  1205. }
  1206. }
  1207. }
  1208. if (Input::WasPressed(Key::PageUp))
  1209. {
  1210. if (g_setup)
  1211. {
  1212. if (!setup_switch)
  1213. {
  1214. if (setup_cursor > 0)
  1215. {
  1216. setup_option_i -= setup_cursor;
  1217. setup_cursor = 0;
  1218. }
  1219. else
  1220. {
  1221. if (setup_option_i > setup_h)
  1222. {
  1223. setup_option_i -= setup_h;
  1224. setup_option_p -= setup_h;
  1225. }
  1226. else
  1227. {
  1228. setup_option_i = 0;
  1229. setup_option_p = 0;
  1230. }
  1231. }
  1232. setup_item_i = 0;
  1233. }
  1234. else
  1235. {
  1236. if (setup_cursor > 0)
  1237. {
  1238. setup_item_i -= setup_cursor;
  1239. setup_cursor = 0;
  1240. }
  1241. else
  1242. {
  1243. if (setup_item_i > setup_h)
  1244. {
  1245. setup_item_i -= setup_h;
  1246. setup_item_p -= setup_h;
  1247. }
  1248. else
  1249. {
  1250. setup_item_i = 0;
  1251. setup_item_p = 0;
  1252. }
  1253. }
  1254. }
  1255. }
  1256. }
  1257. if (Input::WasPressed(Key::PageDown))
  1258. {
  1259. if (g_setup)
  1260. {
  1261. if (!setup_switch)
  1262. {
  1263. if (setup_cursor < setup_h - 1)
  1264. {
  1265. setup_option_i += setup_h - setup_cursor - 1;
  1266. setup_cursor = setup_h - 1;
  1267. setup_item_i = 0;
  1268. }
  1269. else
  1270. {
  1271. if (setup_option_i < setup_option_n - setup_h - 1)
  1272. {
  1273. setup_option_i += setup_h;
  1274. setup_option_p += setup_h;
  1275. }
  1276. else
  1277. {
  1278. setup_option_i = setup_option_n - 1;
  1279. setup_option_p = setup_option_n - setup_h;
  1280. }
  1281. }
  1282. }
  1283. else
  1284. {
  1285. if (setup_cursor < setup_h - 1)
  1286. {
  1287. setup_item_i += (setup_n < setup_h) ? setup_n - setup_cursor : setup_h - setup_cursor - 1;
  1288. setup_cursor = (setup_n < setup_h) ? setup_n : setup_h - 1;
  1289. }
  1290. else
  1291. {
  1292. if (setup_item_i < setup_n - setup_h + 1)
  1293. {
  1294. setup_item_i += setup_h;
  1295. setup_item_p += setup_h;
  1296. }
  1297. else
  1298. {
  1299. setup_item_i = setup_n;
  1300. setup_item_p = setup_n - setup_h + 1;
  1301. }
  1302. }
  1303. }
  1304. }
  1305. }
  1306. if (Input::WasPressed(Key::Left))
  1307. {
  1308. if (g_setup && setup_switch)
  1309. {
  1310. theme_var[theme_var_key] -= setup_conf[setup_item_key].z;
  1311. if (theme_var[theme_var_key] < setup_conf[setup_item_key].x) theme_var[theme_var_key] = setup_conf[setup_item_key].x;
  1312. InitShaderVar();
  1313. UpdateSize();
  1314. }
  1315. }
  1316. if (Input::WasPressed(Key::Right))
  1317. {
  1318. if (g_setup && setup_switch)
  1319. {
  1320. theme_var[theme_var_key] += setup_conf[setup_item_key].z;
  1321. if (theme_var[theme_var_key] > setup_conf[setup_item_key].y) theme_var[theme_var_key] = setup_conf[setup_item_key].y;
  1322. InitShaderVar();
  1323. UpdateSize();
  1324. }
  1325. }
  1326. if (Input::WasPressed(Key::Home))
  1327. {
  1328. if (g_setup && setup_switch)
  1329. {
  1330. theme_var[theme_var_key] = setup_conf[setup_item_key].x;
  1331. InitShaderVar();
  1332. UpdateSize();
  1333. }
  1334. }
  1335. if (Input::WasPressed(Key::End))
  1336. {
  1337. if (g_setup && setup_switch)
  1338. {
  1339. theme_var[theme_var_key] = setup_conf[setup_item_key].y;
  1340. InitShaderVar();
  1341. UpdateSize();
  1342. }
  1343. }
  1344. if (Input::WasPressed(Key::Return))
  1345. {
  1346. beat_flag = true;
  1347. beat_angle = main_angle;
  1348. //flash_flag = true;
  1349. //flash_angle = main_angle;
  1350. }
  1351. #endif
  1352. Entity::TickDraw(seconds, scene);
  1353. if (!m_ready)
  1354. {
  1355. InitShaderVar();
  1356. UpdateSize();
  1357. InitDrawResources();
  1358. m_txt_screen->Init();
  1359. m_txt_setup->Init();
  1360. m_ready = true;
  1361. }
  1362. // timer
  1363. if (!m_pause)
  1364. {
  1365. timer += seconds;
  1366. main_angle = timer * 100.0f * PID;
  1367. }
  1368. if (sync_flag)
  1369. {
  1370. angle = (main_angle - sync_angle) * sync_speed;
  1371. sync_value = 1.0f - sinf(angle);
  1372. if (angle > 90.0f * PID)
  1373. {
  1374. sync_value = 0;
  1375. sync_flag = false;
  1376. }
  1377. }
  1378. if (beat_flag)
  1379. {
  1380. angle = (main_angle - beat_angle) * beat_speed;
  1381. beat_value = 1.0f - sinf(angle);
  1382. if (angle > 90.0f * PID)
  1383. {
  1384. beat_value = 0;
  1385. beat_flag = false;
  1386. }
  1387. }
  1388. if (flash_flag)
  1389. {
  1390. angle = (main_angle - flash_angle) * flash_speed;
  1391. flash_value = 1.0f - sinf(angle);
  1392. if (angle > 90.0f * PID)
  1393. {
  1394. flash_value = 0;
  1395. flash_flag = false;
  1396. }
  1397. }
  1398. if (fade_flag)
  1399. {
  1400. angle = (main_angle - fade_angle) * fade_speed;
  1401. fade_value = 1.0f - sinf(angle);
  1402. if (angle > 90.0f * PID)
  1403. {
  1404. fade_value = 0;
  1405. fade_flag = false;
  1406. }
  1407. }
  1408. Draw2D();
  1409. Draw3D();
  1410. }
  1411. void Render::Draw2D()
  1412. {
  1413. /* Draw text in an offline buffer */
  1414. m_txt_screen->Render();
  1415. if (g_setup)
  1416. m_txt_setup->Render();
  1417. if (m_flags.shader)
  1418. m_fbos.back->Bind();
  1419. glViewport(0, 0, screen_size.x, screen_size.y);
  1420. /* Clear the back buffer */
  1421. RenderContext rc;
  1422. rc.SetBlendFunc(BlendFunc::SrcColor, BlendFunc::DstAlpha);
  1423. rc.SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));
  1424. rc.SetClearDepth(1.0f); // set depth buffer
  1425. glEnable(GL_TEXTURE_2D);
  1426. g_renderer->Clear(ClearMask::Color | ClearMask::Depth);
  1427. m_txt_screen->Blit(border, canvas_size);
  1428. if (g_setup)
  1429. m_txt_setup->Blit((screen_size - setup_canvas_size) / 2, setup_canvas_size);
  1430. if (m_flags.shader)
  1431. m_fbos.back->Unbind();
  1432. glMatrixMode(GL_PROJECTION);
  1433. mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f);
  1434. glLoadMatrixf(&m[0][0]);
  1435. glMatrixMode(GL_MODELVIEW);
  1436. fx_angle = main_angle - part_angle;
  1437. }
  1438. void Render::Draw3D()
  1439. {
  1440. if (!m_flags.shader)
  1441. return;
  1442. RenderContext rc;
  1443. rc.SetBlendFunc(BlendFunc::Disabled, BlendFunc::Disabled);
  1444. rc.SetDepthFunc(DepthFunc::Disabled);
  1445. rc.SetDepthMask(DepthMask::Disabled);
  1446. glEnableClientState(GL_VERTEX_ARRAY);
  1447. glVertexPointer(4, GL_FLOAT, 0, fs_quad_vtx);
  1448. if (m_flags.copper)
  1449. {
  1450. // shader copper
  1451. m_fbos.tmp->Bind();
  1452. shader_copper->Bind();
  1453. shader_copper->SetUniform(shader_copper_texture, m_fbos.back->GetTextureUniform(), 0);
  1454. shader_copper->SetUniform(shader_copper_screen_size, (vec2)screen_size);
  1455. shader_copper->SetUniform(shader_copper_time, fx_angle);
  1456. shader_copper->SetUniform(shader_copper_copper, vec4(copper_copper.x, copper_copper.y, copper_copper.z * 16.0f, copper_copper.w * 16.0f));
  1457. shader_copper->SetUniform(shader_copper_mask_color, copper_mask_color);
  1458. m_vdecl->SetStream(m_vbo, shader_copper->GetAttribLocation(VertexUsage::Position, 0));
  1459. TraceQuad();
  1460. shader_color->Unbind();
  1461. m_fbos.tmp->Unbind();
  1462. // shader simple
  1463. m_fbos.back->Bind();
  1464. ShaderSimple(m_fbos.tmp, 0);
  1465. m_fbos.back->Unbind();
  1466. }
  1467. if (m_flags.remanence)
  1468. {
  1469. // shader remanence
  1470. m_fbos.tmp->Bind();
  1471. shader_remanence->Bind();
  1472. shader_remanence->SetUniform(shader_remanence_source, m_fbos.back->GetTextureUniform(), 0);
  1473. shader_remanence->SetUniform(shader_remanence_buffer, m_fbos.buffer->GetTextureUniform(), 1);
  1474. shader_remanence->SetUniform(shader_remanence_mix, remanence);
  1475. m_vdecl->SetStream(m_vbo, shader_remanence->GetAttribLocation(VertexUsage::Position, 0));
  1476. TraceQuad();
  1477. shader_remanence->Unbind();
  1478. m_fbos.tmp->Unbind();
  1479. // shader simple
  1480. m_fbos.back->Bind();
  1481. ShaderSimple(m_fbos.tmp, 0);
  1482. m_fbos.back->Unbind();
  1483. // save previous fbo
  1484. m_fbos.tmp->Bind();
  1485. shader_remanence->Bind();
  1486. shader_remanence->SetUniform(shader_remanence_source, m_fbos.screen->GetTextureUniform(), 0);
  1487. shader_remanence->SetUniform(shader_remanence_buffer, m_fbos.buffer->GetTextureUniform(), 1);
  1488. shader_remanence->SetUniform(shader_remanence_mix, buffer);
  1489. m_vdecl->SetStream(m_vbo, shader_remanence->GetAttribLocation(VertexUsage::Position, 0));
  1490. TraceQuad();
  1491. shader_remanence->Unbind();
  1492. m_fbos.tmp->Unbind();
  1493. // shader simple
  1494. m_fbos.buffer->Bind();
  1495. ShaderSimple(m_fbos.tmp, 0);
  1496. m_fbos.buffer->Unbind();
  1497. }
  1498. // shader glow
  1499. if (m_flags.glow)
  1500. {
  1501. // shader blur horizontal
  1502. m_fbos.blur_h->Bind();
  1503. shader_blur_h->Bind();
  1504. shader_blur_h->SetUniform(shader_blur_h_texture, m_fbos.back->GetTextureUniform(), 0);
  1505. shader_blur_h->SetUniform(shader_blur_h_radius, glow_large / (float)screen_size.x);
  1506. m_vdecl->SetStream(m_vbo, shader_blur_h->GetAttribLocation(VertexUsage::Position, 0));
  1507. TraceQuad();
  1508. shader_blur_h->Unbind();
  1509. m_fbos.blur_h->Unbind();
  1510. // shader blur vertical
  1511. m_fbos.blur_v->Bind();
  1512. shader_blur_v->Bind();
  1513. shader_blur_v->SetUniform(shader_blur_v_texture, m_fbos.blur_h->GetTextureUniform(), 0);
  1514. shader_blur_v->SetUniform(shader_blur_v_radius, glow_large / (float)screen_size.y);
  1515. m_vdecl->SetStream(m_vbo, shader_blur_v->GetAttribLocation(VertexUsage::Position, 0));
  1516. TraceQuad();
  1517. shader_blur_v->Unbind();
  1518. m_fbos.blur_v->Unbind();
  1519. // shader blur horizontal
  1520. m_fbos.blur_h->Bind();
  1521. shader_blur_h->Bind();
  1522. shader_blur_h->SetUniform(shader_blur_h_texture, m_fbos.blur_v->GetTextureUniform(), 0);
  1523. shader_blur_h->SetUniform(shader_blur_h_radius, glow_small / (float)screen_size.x);
  1524. m_vdecl->SetStream(m_vbo, shader_blur_h->GetAttribLocation(VertexUsage::Position, 0));
  1525. TraceQuad();
  1526. shader_blur_h->Unbind();
  1527. m_fbos.blur_h->Unbind();
  1528. // shader blur vertical
  1529. m_fbos.blur_v->Bind();
  1530. shader_blur_v->Bind();
  1531. shader_blur_v->SetUniform(shader_blur_v_texture, m_fbos.blur_h->GetTextureUniform(), 0);
  1532. shader_blur_v->SetUniform(shader_blur_v_radius, glow_small / (float)screen_size.y);
  1533. m_vdecl->SetStream(m_vbo, shader_blur_v->GetAttribLocation(VertexUsage::Position, 0));
  1534. TraceQuad();
  1535. shader_blur_v->Unbind();
  1536. m_fbos.blur_v->Unbind();
  1537. // shader glow
  1538. m_fbos.screen->Bind();
  1539. shader_glow->Bind();
  1540. shader_glow->SetUniform(shader_glow_glow, m_fbos.blur_v->GetTextureUniform(), 0);
  1541. shader_glow->SetUniform(shader_glow_source, m_fbos.back->GetTextureUniform(), 1);
  1542. shader_glow->SetUniform(shader_glow_mix, glow_mix);
  1543. m_vdecl->SetStream(m_vbo, shader_glow->GetAttribLocation(VertexUsage::Position, 0));
  1544. TraceQuad();
  1545. shader_glow->Unbind();
  1546. m_fbos.screen->Unbind();
  1547. }
  1548. else
  1549. {
  1550. // shader simple
  1551. m_fbos.screen->Bind();
  1552. ShaderSimple(m_fbos.back, 0);
  1553. m_fbos.screen->Unbind();
  1554. }
  1555. if (m_flags.color)
  1556. {
  1557. // shader color
  1558. m_fbos.tmp->Bind();
  1559. shader_color->Bind();
  1560. shader_color->SetUniform(shader_color_texture, m_fbos.screen->GetTextureUniform(), 0);
  1561. shader_color->SetUniform(shader_color_screen_size, (vec2)screen_size);
  1562. shader_color->SetUniform(shader_color_filter, color_filter);
  1563. shader_color->SetUniform(shader_color_color, color_color);
  1564. shader_color->SetUniform(shader_color_flash, flash_value);
  1565. m_vdecl->SetStream(m_vbo, shader_color->GetAttribLocation(VertexUsage::Position, 0));
  1566. TraceQuad();
  1567. shader_color->Unbind();
  1568. m_fbos.tmp->Unbind();
  1569. // shader simple
  1570. m_fbos.screen->Bind();
  1571. ShaderSimple(m_fbos.tmp, 0);
  1572. m_fbos.screen->Unbind();
  1573. }
  1574. if (m_flags.noise)
  1575. {
  1576. // shader noise
  1577. m_fbos.tmp->Bind();
  1578. shader_noise->Bind();
  1579. shader_noise->SetUniform(shader_noise_texture, m_fbos.screen->GetTextureUniform(), 0);
  1580. shader_noise->SetUniform(shader_noise_screen_size, (vec2)screen_size);
  1581. shader_noise->SetUniform(shader_noise_time, fx_angle);
  1582. shader_noise->SetUniform(shader_noise_offset, noise_offset);
  1583. shader_noise->SetUniform(shader_noise_noise, noise_noise);
  1584. shader_noise->SetUniform(shader_noise_retrace, noise_retrace);
  1585. m_vdecl->SetStream(m_vbo, shader_noise->GetAttribLocation(VertexUsage::Position, 0));
  1586. TraceQuad();
  1587. shader_noise->Unbind();
  1588. m_fbos.tmp->Unbind();
  1589. // shader simple
  1590. m_fbos.screen->Bind();
  1591. ShaderSimple(m_fbos.tmp, 0);
  1592. m_fbos.screen->Unbind();
  1593. }
  1594. if (m_flags.blur)
  1595. {
  1596. // shader blur horizontal
  1597. m_fbos.tmp->Bind();
  1598. shader_blur_h->Bind();
  1599. shader_blur_h->SetUniform(shader_blur_h_texture, m_fbos.screen->GetTextureUniform(), 0);
  1600. shader_blur_h->SetUniform(shader_blur_h_radius, blur / (float)screen_size.x);
  1601. m_vdecl->SetStream(m_vbo, shader_blur_h->GetAttribLocation(VertexUsage::Position, 0));
  1602. TraceQuad();
  1603. shader_blur_h->Unbind();
  1604. m_fbos.tmp->Unbind();
  1605. // shader blur vertical
  1606. m_fbos.screen->Bind();
  1607. shader_blur_v->Bind();
  1608. shader_blur_v->SetUniform(shader_blur_v_texture, m_fbos.tmp->GetTextureUniform(), 0);
  1609. shader_blur_v->SetUniform(shader_blur_v_radius, blur / (float)screen_size.y);
  1610. m_vdecl->SetStream(m_vbo, shader_blur_v->GetAttribLocation(VertexUsage::Position, 0));
  1611. TraceQuad();
  1612. shader_blur_v->Unbind();
  1613. m_fbos.screen->Unbind();
  1614. }
  1615. if (m_flags.postfx)
  1616. {
  1617. // shader postfx
  1618. m_fbos.front->Bind();
  1619. shader_postfx->Bind();
  1620. shader_postfx->SetUniform(shader_postfx_texture, m_fbos.screen->GetTextureUniform(), 0);
  1621. shader_postfx->SetUniform(shader_postfx_screen_size, (vec2)screen_size);
  1622. shader_postfx->SetUniform(shader_postfx_ratio_2d, (vec2)ratio_2d * 0.5f);
  1623. shader_postfx->SetUniform(shader_postfx_time, fx_angle);
  1624. shader_postfx->SetUniform(shader_postfx_deform, postfx_deform);
  1625. shader_postfx->SetUniform(shader_postfx_ghost1, vec4(postfx_ghost1.xyz * 0.01f, postfx_ghost1.w));
  1626. shader_postfx->SetUniform(shader_postfx_ghost2, vec4(postfx_ghost2.xyz * 0.01f, postfx_ghost2.w));
  1627. shader_postfx->SetUniform(shader_postfx_glass, vec4(postfx_glass.xy * 0.01f, postfx_glass.z * 0.1f, postfx_glass.w));
  1628. shader_postfx->SetUniform(shader_postfx_gradient, postfx_gradient);
  1629. shader_postfx->SetUniform(shader_postfx_gradient_color, postfx_gradient_color);
  1630. shader_postfx->SetUniform(shader_postfx_vignetting, postfx_vignetting);
  1631. shader_postfx->SetUniform(shader_postfx_aberration, postfx_aberration);
  1632. shader_postfx->SetUniform(shader_postfx_moire_h, vec4(postfx_moire_h.xyz, postfx_moire_h.w * (2 * F_PI)));
  1633. shader_postfx->SetUniform(shader_postfx_moire_v, vec4(postfx_moire_v.xyz, postfx_moire_v.w * (2 * F_PI)));
  1634. shader_postfx->SetUniform(shader_postfx_scanline_h, vec4(postfx_scanline_h.xyz, postfx_scanline_h.w * (2 * F_PI)));
  1635. shader_postfx->SetUniform(shader_postfx_scanline_v, vec4(postfx_scanline_v.xyz, postfx_scanline_v.w * (2 * F_PI)));
  1636. shader_postfx->SetUniform(shader_postfx_corner, postfx_corner);
  1637. shader_postfx->SetUniform(shader_postfx_sync, (float)fabs(sync_value * cosf((main_angle - sync_angle) * 6.0f)));
  1638. shader_postfx->SetUniform(shader_postfx_beat, (float)fabs(beat_value * cosf((main_angle - beat_angle) * 6.0f)));
  1639. m_vdecl->SetStream(m_vbo, shader_postfx->GetAttribLocation(VertexUsage::Position, 0));
  1640. TraceQuad();
  1641. shader_postfx->Unbind();
  1642. m_fbos.front->Unbind();
  1643. }
  1644. else
  1645. {
  1646. // shader simple
  1647. m_fbos.front->Bind();
  1648. ShaderSimple(m_fbos.screen, 0);
  1649. m_fbos.front->Unbind();
  1650. }
  1651. if (m_flags.mirror)
  1652. {
  1653. // shader mirror
  1654. m_fbos.tmp->Bind();
  1655. shader_mirror->Bind();
  1656. shader_mirror->SetUniform(shader_mirror_texture, m_fbos.front->GetTextureUniform(), 0);
  1657. shader_mirror->SetUniform(shader_mirror_screen_size, (vec2)screen_size);
  1658. shader_mirror->SetUniform(shader_mirror_mirror, vec4(mirror.x * 0.1f, mirror.y * 0.1f, mirror.z, mirror.w));
  1659. m_vdecl->SetStream(m_vbo, shader_mirror->GetAttribLocation(VertexUsage::Position, 0));
  1660. TraceQuad();
  1661. shader_mirror->Unbind();
  1662. m_fbos.tmp->Unbind();
  1663. // shader simple
  1664. m_fbos.front->Bind();
  1665. ShaderSimple(m_fbos.tmp, 0);
  1666. m_fbos.front->Unbind();
  1667. }
  1668. if (m_flags.radial)
  1669. {
  1670. // shader radial blur
  1671. m_fbos.tmp->Bind();
  1672. shader_radial->Bind();
  1673. shader_radial->SetUniform(shader_radial_texture, m_fbos.front->GetTextureUniform(), 0);
  1674. shader_radial->SetUniform(shader_radial_screen_size, (vec2)screen_size);
  1675. shader_radial->SetUniform(shader_radial_radial, vec4(radial.x, radial.y, radial.z, radial.w * 0.1f));
  1676. m_vdecl->SetStream(m_vbo, shader_radial->GetAttribLocation(VertexUsage::Position, 0));
  1677. TraceQuad();
  1678. shader_radial->Unbind();
  1679. m_fbos.tmp->Unbind();
  1680. // shader simple
  1681. m_fbos.front->Bind();
  1682. ShaderSimple(m_fbos.tmp, 0);
  1683. m_fbos.front->Unbind();
  1684. }
  1685. // shader simple
  1686. ShaderSimple(m_fbos.front, 0);
  1687. glDisableClientState(GL_VERTEX_ARRAY);
  1688. }
  1689. Render::~Render()
  1690. {
  1691. if (m_fps_debug)
  1692. Ticker::Unref(m_fps_debug);
  1693. }