Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 

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