25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1333 lines
46 KiB

  1. //
  2. // Neercs
  3. //
  4. #if defined HAVE_CONFIG_H
  5. # include "config.h"
  6. #endif
  7. #if defined _XBOX
  8. # define _USE_MATH_DEFINES /* for M_PI */
  9. # include <xtl.h>
  10. #elif defined _WIN32
  11. # define _USE_MATH_DEFINES /* for M_PI */
  12. # define WIN32_LEAN_AND_MEAN
  13. # include <windows.h>
  14. #endif
  15. #include <cmath>
  16. #include <cstdio>
  17. #include <cstdlib>
  18. #include <ctime>
  19. #include <string>
  20. #include "core.h"
  21. #include "lolgl.h"
  22. using namespace std;
  23. using namespace lol;
  24. #include "../neercs.h"
  25. #include "render.h"
  26. #include "text-render.h"
  27. extern char const *lolfx_simple;
  28. extern char const *lolfx_blurh;
  29. extern char const *lolfx_blurv;
  30. extern char const *lolfx_glow;
  31. extern char const *lolfx_remanence;
  32. extern char const *lolfx_copper;
  33. extern char const *lolfx_color;
  34. extern char const *lolfx_noise;
  35. extern char const *lolfx_postfx;
  36. extern char const *lolfx_mirror;
  37. #define PID M_PI/180.0f // pi ratio
  38. /*
  39. * Global variable -- ugly
  40. */
  41. bool g_setup = true;
  42. /*
  43. * Various variables
  44. */
  45. int active = true; // window active flag
  46. float nearplane = 0.1f; // nearplane
  47. float farplane = 1000.0f; // farplane
  48. int polygon_fillmode = GL_FILL; // fill mode
  49. /* timer variable */
  50. float timer = 0; // timer
  51. /* window variable */
  52. ivec2 screen_size; // screen size
  53. vec3 screen_color = vec3(0.125f, 0.125f, 0.125f); // screen color
  54. /* object variable */
  55. float main_angle = 0.0f; // main angle
  56. float part_angle = 0.0f; // part angle
  57. float fx_angle; // current angle
  58. /* fs_quad variable */
  59. float fs_quad_vtx[] = {-1.0f, 1.0f, 0, 1.0f, -1.0f, -1.0f, 0, 1.0f, 1.0f, -1.0f, 0, 1.0f, 1.0f, 1.0f, 0, 1.0f};
  60. float fs_quad_tex[] = {0, 1.0f, 0, 0, 1.0f, 0, 1.0f, 1.0f};
  61. /* flash variable */
  62. bool flash_flag = false; // flag
  63. float flash_angle = 0; // angle
  64. float flash_value = 0; // value
  65. float flash_speed = 2.0f; // speed
  66. /* fade variable */
  67. bool fade_flag = false; // flag
  68. float fade_angle = 0; // angle
  69. float fade_value = 0; // value
  70. float fade_speed = 0.2f; // speed
  71. /* sync variable */
  72. bool sync_flag = false; // flagsh
  73. float sync_angle = 0; // angle
  74. float sync_value = 0; // value
  75. float sync_speed = 1.0f; // speed
  76. /* beat variable */
  77. bool beat_flag = false; // flag
  78. float beat_angle = 0; // angle
  79. float beat_value = 0; // value
  80. float beat_speed = 2.0f; // speed
  81. /* common variable */
  82. float value, angle, radius, scale, speed;
  83. /* shader variable */
  84. vec2 buffer(0.7f,0.3f); // [new frame mix,old frame mix]
  85. vec2 remanence(0.6f,0.4f); // remanence [source mix,buffer mix]
  86. vec2 glow_mix(0.7f,0.3f); // glow mix [source mix,glow mix]
  87. vec2 glow_large(3.0f,0.0f); // large glow radius [center,corner]
  88. vec2 glow_small(1.5f,0.0f); // small glow radius [center,corner]
  89. vec2 blur(0.5f,0.0f); // blur radius [center,corner]
  90. vec4 copper_copper(0.75f,0.25f,0.42f,4.0f); // copper [base,variable,repeat,color cycle]
  91. vec3 copper_mask_color(4.0f,4.0f,4.0f); // color [red,green,blue]
  92. vec3 color_filter(0.9f,0.95f,0.85f); // color filter [red,green,blue]
  93. vec4 color_color(1.5f,1.2f,0.1f,0.35f); // color modifier [brightness,contrast,level,grayscale]
  94. vec2 noise_offset(2.0f,2.0f); // random line [horizontal,vertical]
  95. float noise_noise = 0.25f; // noise
  96. vec3 noise_retrace(1.0f,1.0f,0.5f); // retrace [strength,length,speed]
  97. vec2 postfx_deform(0.8f,0.52f); // deformation [ratio,zoom]
  98. float postfx_vignetting = 0.5f; // vignetting strength
  99. float postfx_aberration = 4.0f; // chromatic aberration
  100. vec4 postfx_ghost1(1.0f,0.0f,0.0f,-0.25f); // ghost picture 1 [position x,position y,position z,strength]
  101. vec4 postfx_ghost2(1.5f,0.0f,0.0f,0.25f); // ghost picture 2 [position x,position y,position z,strength]
  102. vec4 postfx_moire_h(0.75f,-0.25f,0.0f,1.0f); // vertical moire [base,variable,repeat,shift]
  103. vec4 postfx_moire_v(0.75f,-0.25f,1.0f,1.5f); // horizontal moire [base,variable,repeat,shift]
  104. vec4 postfx_scanline_h(0.75f,0.0f,0.0f,0.0f); // vertical scanline [base,variable,repeat,shift]
  105. vec4 postfx_scanline_v(0.75f,-0.25f,2.0f,0.0f); // horizontal scanline [base,variable,repeat,shift]
  106. vec3 postfx_corner(0.0f,0.75f,0.95f); // corner [width,radius,blur]
  107. vec4 mirror(0.7f,0.7f,0.5f,4.0f); // mirror [width,height,strength,ratio]
  108. /* text variable */
  109. ivec2 ratio_2d(2,3); // 2d ratio
  110. ivec2 map_size(256,256); // texture map size
  111. ivec2 font_size(8,8); // font size
  112. ivec2 canvas_char(0,0); // canvas char number
  113. ivec2 canvas_size(0,0); // caca size
  114. /* window variable */
  115. ivec2 border = vec2(2,1) * ratio_2d * font_size; // border width
  116. /* setup variable */
  117. bool setup_switch = false; // switch [option/item]
  118. int setup_n = 0; // item/option number
  119. int setup_h = 8; // height
  120. int setup_cursor = 0; // cursor position
  121. int setup_option_i = 0; // selected option
  122. int setup_option_n = 12; // option number
  123. int setup_option_p = 0; // option position
  124. int setup_item_i = 0; // selected item
  125. int setup_item_n = 8; // item number
  126. int setup_item_p = 0; // item position
  127. int setup_item_key = 0; // item array key
  128. ivec3 setup_size(29,9,12); // size [w,h,split]
  129. ivec2 setup_canvas_size(ivec2(setup_size.x + 1, setup_size.y + 1) * font_size * ivec2(2,4));
  130. ivec2 setup_color(0xaaa,0x222); // color [foreground,background] 0x678,0x234
  131. char const *setup_text[] = {
  132. "main",
  133. "2d ratio w",
  134. "2d ratio h",
  135. "border w",
  136. "border h",
  137. "",
  138. "",
  139. "",
  140. "",
  141. "remanence",
  142. "enable",
  143. "buffer new frame",
  144. "buffer old frame",
  145. "source mix",
  146. "buffer mix",
  147. "",
  148. "",
  149. "",
  150. "glow",
  151. "enable",
  152. "source mix",
  153. "glow mix",
  154. "large center",
  155. "large corner",
  156. "small center",
  157. "small corner",
  158. "",
  159. "blur",
  160. "enable",
  161. "blur center",
  162. "blur corner",
  163. "",
  164. "",
  165. "",
  166. "",
  167. "",
  168. "screen",
  169. "enable",
  170. "deform ratio",
  171. "zoom base",
  172. "corner width",
  173. "corner radius",
  174. "corner blur",
  175. "vignetting",
  176. "",
  177. "copper",
  178. "enable",
  179. "base",
  180. "variable",
  181. "repeat",
  182. "color cycle",
  183. "color r",
  184. "color g",
  185. "color b",
  186. "color",
  187. "filter red",
  188. "filter green",
  189. "filter blue",
  190. "brightness",
  191. "contrast",
  192. "level",
  193. "grayscale",
  194. "aberration",
  195. "noise",
  196. "enable",
  197. "offset h",
  198. "offset v",
  199. "noise",
  200. "retrace strength",
  201. "retrace length",
  202. "retrace speed",
  203. "",
  204. "ghost",
  205. "back x",
  206. "back y",
  207. "back z",
  208. "back strength",
  209. "front x",
  210. "front y",
  211. "front z",
  212. "front strength",
  213. "moire",
  214. "h base",
  215. "h variable",
  216. "h repeat",
  217. "h shift",
  218. "v base",
  219. "v variable",
  220. "v repeat",
  221. "v shift",
  222. "scanline",
  223. "h base",
  224. "h variable",
  225. "h repeat",
  226. "h shift",
  227. "v base",
  228. "v variable",
  229. "v repeat",
  230. "v shift",
  231. "mirror",
  232. "enable",
  233. "width",
  234. "height",
  235. "strength",
  236. "ratio",
  237. "",
  238. "",
  239. ""
  240. };
  241. vec4 setup_var[]={ // setup variable [start,end,step,value]
  242. vec4(0), /* main */
  243. vec4(1, 8, 1, ratio_2d.x),
  244. vec4(1, 8, 1, ratio_2d.y),
  245. vec4(0, 16, 1, border.x / ratio_2d.x / font_size.x),
  246. vec4(0, 16, 1, border.y / ratio_2d.y / font_size.y),
  247. vec4(0),
  248. vec4(0),
  249. vec4(0),
  250. vec4(0),
  251. vec4(0), /* remanence */
  252. vec4(0, 1, 1, 1),
  253. vec4(0.0f, 1.0f, 0.1f, buffer.x),
  254. vec4(0.0f, 1.0f, 0.1f, buffer.y),
  255. vec4(0.0f, 1.0f, 0.1f, remanence.x),
  256. vec4(0.0f, 1.0f, 0.1f, remanence.y),
  257. vec4(0),
  258. vec4(0),
  259. vec4(0),
  260. vec4(0), /* glow */
  261. vec4(0, 1, 1, 1),
  262. vec4(0.0f, 1.0f, 0.1f, glow_mix.x),
  263. vec4(0.0f, 1.0f, 0.1f, glow_mix.y),
  264. vec4(0.0f, 4.0f, 0.1f, glow_large.x),
  265. vec4(0.0f, 4.0f, 0.1f, glow_large.y),
  266. vec4(0.0f, 2.0f, 0.1f, glow_small.x),
  267. vec4(0.0f, 2.0f, 0.1f, glow_small.y),
  268. vec4(0),
  269. vec4(0), /* blur */
  270. vec4(0, 1, 1, 1),
  271. vec4(0, 2, 0.05f, blur.x),
  272. vec4(0, 2, 0.05f, blur.y),
  273. vec4(0),
  274. vec4(0),
  275. vec4(0),
  276. vec4(0),
  277. vec4(0),
  278. vec4(0), /* screen */
  279. vec4(0, 1, 1, 1),
  280. vec4(0.0f, 1.0f, 0.05f, postfx_deform.x),
  281. vec4(0.5f, 0.7f, 0.01f, postfx_deform.y),
  282. vec4(0.0f, 4.0f, 0.10f, postfx_corner.x),
  283. vec4(0.0f, 1.0f, 0.05f, postfx_corner.y),
  284. vec4(0.0f, 1.0f, 0.05f, postfx_corner.z),
  285. vec4(0.0f, 1.0f, 0.10f, postfx_vignetting),
  286. vec4(0),
  287. vec4(0), /* copper */
  288. vec4(0, 1, 1, 1),
  289. vec4(0.0f, 1.0f, 0.05f, copper_copper.x),
  290. vec4(0.0f, 1.0f, 0.05f, copper_copper.y),
  291. vec4(0.0f, 1.0f, 0.02f, copper_copper.z),
  292. vec4(1.0f, 8.0f, 0.25f, copper_copper.w),
  293. vec4(0.0f, 4.0f, 0.25f, copper_mask_color.x),
  294. vec4(0.0f, 4.0f, 0.25f, copper_mask_color.y),
  295. vec4(0.0f, 4.0f, 0.25f, copper_mask_color.z),
  296. vec4(0), /* color */
  297. vec4( 0.0f, 1.0f, 0.05f, color_filter.x),
  298. vec4( 0.0f, 1.0f, 0.05f, color_filter.y),
  299. vec4( 0.0f, 1.0f, 0.05f, color_filter.z),
  300. vec4( 0.0f, 2.0f, 0.05f, color_color.x),
  301. vec4( 0.0f, 2.0f, 0.05f, color_color.y),
  302. vec4(-1.0f, 1.0f, 0.05f, color_color.z),
  303. vec4( 0.0f, 1.0f, 0.05f, color_color.w),
  304. vec4( 0.0f, 8.0f, 0.50f, postfx_aberration),
  305. vec4(0), /* noise */
  306. vec4(0, 1, 1, 1),
  307. vec4(0.0f, 4.0f, 0.50f, noise_offset.x),
  308. vec4(0.0f, 4.0f, 0.50f, noise_offset.y),
  309. vec4(0.0f, 0.5f, 0.05f, noise_noise),
  310. vec4(0.0f, 4.0f, 0.25f, noise_retrace.x),
  311. vec4(0.0f, 8.0f, 0.50f, noise_retrace.y),
  312. vec4(0.0f, 4.0f, 0.25f, noise_retrace.z),
  313. vec4(0),
  314. vec4(0), /* ghost */
  315. vec4(-2.0f, 2.0f, 0.10f, postfx_ghost1.x),
  316. vec4(-2.0f, 2.0f, 0.10f, postfx_ghost1.y),
  317. vec4(-2.0f, 2.0f, 0.10f, postfx_ghost1.z),
  318. vec4(-1.0f, 1.0f, 0.05f, postfx_ghost1.w),
  319. vec4(-2.0f, 2.0f, 0.10f, postfx_ghost2.x),
  320. vec4(-2.0f, 2.0f, 0.10f, postfx_ghost2.y),
  321. vec4(-2.0f, 2.0f, 0.10f, postfx_ghost2.z),
  322. vec4(-1.0f, 1.0f, 0.05f, postfx_ghost2.w),
  323. vec4(0), /* moire */
  324. vec4( 0.5f, 1.0f, 0.05f, postfx_moire_h.x),
  325. vec4(-0.5f, 0.5f, 0.05f, postfx_moire_h.y),
  326. vec4( 0.0f, 4.0f, 0.50f, postfx_moire_h.z),
  327. vec4( 0.0f, 4.0f, 0.50f, postfx_moire_h.w),
  328. vec4( 0.5f, 1.0f, 0.05f, postfx_moire_v.x),
  329. vec4(-0.5f, 0.5f, 0.05f, postfx_moire_v.y),
  330. vec4( 0.0f, 4.0f, 0.50f, postfx_moire_v.z),
  331. vec4( 0.0f, 4.0f, 0.50f, postfx_moire_v.w),
  332. vec4(0), /* scanline */
  333. vec4( 0.5f, 1.0f, 0.05f, postfx_scanline_h.x),
  334. vec4(-0.5f, 0.5f, 0.05f, postfx_scanline_h.y),
  335. vec4( 0.0f, 4.0f, 0.50f, postfx_scanline_h.z),
  336. vec4( 0.0f, 4.0f, 0.50f, postfx_scanline_h.w),
  337. vec4( 0.5f, 1.0f, 0.05f, postfx_scanline_v.x),
  338. vec4(-0.5f, 0.5f, 0.05f, postfx_scanline_v.y),
  339. vec4( 0.0f, 4.0f, 0.50f, postfx_scanline_v.z),
  340. vec4( 0.0f, 4.0f, 0.50f, postfx_scanline_v.w),
  341. vec4(0), /* mirror */
  342. vec4(0, 1, 1, 1),
  343. vec4(0.0f, 2.0f, 0.05f, mirror.x),
  344. vec4(0.0f, 2.0f, 0.05f, mirror.y),
  345. vec4(0.0f, 1.0f, 0.05f, mirror.z),
  346. vec4(1.0f, 4.0f, 0.25f, mirror.w),
  347. vec4(0),
  348. vec4(0),
  349. vec4(0),
  350. vec4(0) /* ? */
  351. };
  352. void Render::UpdateVar()
  353. {
  354. int k = 1; /* main */
  355. ratio_2d = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  356. border = vec2(setup_var[k].w, setup_var[k + 1].w) * ratio_2d * font_size; k += 2;
  357. k += 5; /* remanence */
  358. m_shader_remanence = (setup_var[k].w == 1) ? true : false; k++;
  359. buffer = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  360. remanence = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  361. k += 4; /* glow */
  362. m_shader_glow = (setup_var[k].w == 1) ? true : false; k++;
  363. glow_mix = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  364. glow_large = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  365. glow_small = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  366. k += 2; /* blur */
  367. m_shader_blur = (setup_var[k].w == 1) ? true : false; k++;
  368. blur = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  369. k += 6; /* screen */
  370. m_shader_postfx = (setup_var[k].w == 1) ? true : false; k++;
  371. postfx_deform = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  372. postfx_corner = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
  373. postfx_vignetting = setup_var[k].w; k++;
  374. k += 2; /* copper */
  375. m_shader_copper = (setup_var[k].w == 1) ? true : false; k++;
  376. copper_copper = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  377. copper_mask_color = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
  378. k += 1; /* color */
  379. color_filter = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
  380. color_color = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  381. postfx_aberration = setup_var[k].w; k++;
  382. k += 1; /* noise */
  383. m_shader_noise = (setup_var[k].w == 1) ? true : false; k++;
  384. noise_offset = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  385. noise_noise = setup_var[k].w; k++;
  386. noise_retrace = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
  387. k += 2; /* ghost */
  388. postfx_ghost1 = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  389. postfx_ghost2 = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  390. k += 1; /* moire */
  391. postfx_moire_h = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  392. postfx_moire_v = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  393. k += 1; /* scanline */
  394. postfx_scanline_h = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  395. postfx_scanline_v = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  396. k += 1; /* mirror */
  397. m_shader_mirror = (setup_var[k].w == 1) ? true : false; k++;
  398. mirror = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  399. UpdateSize();
  400. }
  401. void Render::UpdateSize()
  402. {
  403. screen_size = Video::GetSize();
  404. canvas_char = (screen_size - border * 2) / (font_size * ratio_2d);
  405. canvas_char = max(canvas_char, ivec2(1, 1));
  406. canvas_size = canvas_char * font_size * ratio_2d;
  407. border = (screen_size - canvas_size) / 2;
  408. caca_set_canvas_size(m_cv_screen, canvas_char.x, canvas_char.y);
  409. caca_set_canvas_size(m_cv_setup, setup_size.x + 1, setup_size.y + 1);
  410. }
  411. int calc_item_length()
  412. {
  413. int n = !setup_switch ? setup_option_n : setup_item_n;
  414. for (int i = 0; i < n; i++)
  415. {
  416. int k = !setup_switch ? (i * (setup_item_n + 1)) : (setup_option_i * (setup_item_n + 1) + 1 + i);
  417. if (setup_text[k][0] == '\0') return i - 1;
  418. }
  419. return n - 1;
  420. }
  421. Shader *shader_simple;
  422. Shader *shader_blur_h, *shader_blur_v, *shader_glow;
  423. Shader *shader_remanence, *shader_copper, *shader_color;
  424. Shader *shader_noise, *shader_postfx, *shader_mirror;
  425. // shader variables
  426. ShaderUniform shader_simple_texture;
  427. ShaderUniform shader_blur_h_texture,
  428. shader_blur_h_radius,
  429. shader_blur_v_texture,
  430. shader_blur_v_radius;
  431. ShaderUniform shader_glow_glow,
  432. shader_glow_source,
  433. shader_glow_mix;
  434. ShaderUniform shader_remanence_source,
  435. shader_remanence_buffer,
  436. shader_remanence_mix;
  437. ShaderUniform shader_copper_texture,
  438. shader_copper_screen_size,
  439. shader_copper_time,
  440. shader_copper_copper,
  441. shader_copper_mask_color;
  442. ShaderUniform shader_color_texture,
  443. shader_color_screen_size,
  444. shader_color_filter,
  445. shader_color_color,
  446. shader_color_flash;
  447. ShaderUniform shader_noise_texture,
  448. shader_noise_screen_size,
  449. shader_noise_time,
  450. shader_noise_offset,
  451. shader_noise_noise,
  452. shader_noise_retrace;
  453. ShaderUniform shader_postfx_texture,
  454. shader_postfx_texture_2d,
  455. shader_postfx_screen_size,
  456. shader_postfx_time,
  457. shader_postfx_deform,
  458. shader_postfx_ghost1,
  459. shader_postfx_ghost2,
  460. shader_postfx_vignetting,
  461. shader_postfx_aberration,
  462. shader_postfx_moire_h,
  463. shader_postfx_moire_v,
  464. shader_postfx_scanline_h,
  465. shader_postfx_scanline_v,
  466. shader_postfx_corner,
  467. shader_postfx_sync,
  468. shader_postfx_beat;
  469. ShaderUniform shader_mirror_texture,
  470. shader_mirror_screen_size,
  471. shader_mirror_mirror;
  472. FrameBuffer *fbo_back, *fbo_front, *fbo_screen;
  473. FrameBuffer *fbo_blur_h, *fbo_blur_v;
  474. FrameBuffer *fbo_tmp, *fbo_buffer;
  475. void Render::TraceQuad()
  476. {
  477. glLoadIdentity();
  478. glDrawArrays(GL_QUADS, 0, 4);
  479. }
  480. void Render::ShaderSimple(FrameBuffer *fbo_output, int n)
  481. {
  482. shader_simple->Bind();
  483. shader_simple->SetUniform(shader_simple_texture, fbo_output->GetTexture(), n);
  484. TraceQuad();
  485. shader_simple->Unbind();
  486. }
  487. int Render::InitDraw(void)
  488. {
  489. glDepthMask(GL_TRUE); // do not write z-buffer
  490. glEnable(GL_CULL_FACE); // disable cull face
  491. glCullFace(GL_BACK); // don't draw front face
  492. /* initialise framebuffer objects */
  493. fbo_back = new FrameBuffer(screen_size);
  494. fbo_screen = new FrameBuffer(screen_size);
  495. fbo_front = new FrameBuffer(screen_size);
  496. fbo_buffer = new FrameBuffer(screen_size);
  497. fbo_blur_h = new FrameBuffer(screen_size);
  498. fbo_blur_v = new FrameBuffer(screen_size);
  499. fbo_tmp = new FrameBuffer(screen_size);
  500. // shader simple
  501. shader_simple = Shader::Create(lolfx_simple);
  502. shader_simple_texture = shader_simple->GetUniformLocation("texture");
  503. // shader glow
  504. shader_glow = Shader::Create(lolfx_glow);
  505. shader_glow_glow = shader_glow->GetUniformLocation("glow");
  506. shader_glow_source = shader_glow->GetUniformLocation("source");
  507. shader_glow_mix = shader_glow->GetUniformLocation("mix");
  508. // shader blur horizontal
  509. shader_blur_h = Shader::Create(lolfx_blurh);
  510. shader_blur_h_texture = shader_blur_h->GetUniformLocation("texture");
  511. shader_blur_h_radius = shader_blur_h->GetUniformLocation("radius");
  512. // shader blur vertical
  513. shader_blur_v = Shader::Create(lolfx_blurv);
  514. shader_blur_v_texture = shader_blur_v->GetUniformLocation("texture");
  515. shader_blur_v_radius = shader_blur_v->GetUniformLocation("radius");
  516. // shader remanence
  517. shader_remanence = Shader::Create(lolfx_remanence);
  518. shader_remanence_source = shader_remanence->GetUniformLocation("source");
  519. shader_remanence_buffer = shader_remanence->GetUniformLocation("buffer");
  520. shader_remanence_mix = shader_remanence->GetUniformLocation("mix");
  521. // shader copper
  522. shader_copper = Shader::Create(lolfx_copper);
  523. shader_copper_texture = shader_copper->GetUniformLocation("texture");
  524. shader_copper_screen_size = shader_copper->GetUniformLocation("screen_size");
  525. shader_copper_time = shader_copper->GetUniformLocation("time");
  526. shader_copper_copper = shader_copper->GetUniformLocation("copper");
  527. shader_copper_mask_color = shader_copper->GetUniformLocation("mask_color");
  528. // shader color
  529. shader_color = Shader::Create(lolfx_color);
  530. shader_color_texture = shader_color->GetUniformLocation("texture");
  531. shader_color_screen_size = shader_color->GetUniformLocation("screen_size");
  532. shader_color_filter = shader_color->GetUniformLocation("filter");
  533. shader_color_color = shader_color->GetUniformLocation("color");
  534. shader_color_flash = shader_color->GetUniformLocation("flash");
  535. // shader noise
  536. shader_noise = Shader::Create(lolfx_noise);
  537. shader_noise_texture = shader_noise->GetUniformLocation("texture");
  538. shader_noise_screen_size = shader_noise->GetUniformLocation("screen_size");
  539. shader_noise_time = shader_noise->GetUniformLocation("time");
  540. shader_noise_offset = shader_noise->GetUniformLocation("offset");
  541. shader_noise_noise = shader_noise->GetUniformLocation("noise");
  542. shader_noise_retrace = shader_noise->GetUniformLocation("retrace");
  543. // shader postfx
  544. shader_postfx = Shader::Create(lolfx_postfx);
  545. shader_postfx_texture = shader_postfx->GetUniformLocation("texture");
  546. shader_postfx_texture_2d = shader_postfx->GetUniformLocation("texture_2d");
  547. shader_postfx_screen_size = shader_postfx->GetUniformLocation("screen_size");
  548. shader_postfx_time = shader_postfx->GetUniformLocation("time");
  549. shader_postfx_deform = shader_postfx->GetUniformLocation("deform");
  550. shader_postfx_ghost1 = shader_postfx->GetUniformLocation("ghost1");
  551. shader_postfx_ghost2 = shader_postfx->GetUniformLocation("ghost2");
  552. shader_postfx_vignetting = shader_postfx->GetUniformLocation("vignetting");
  553. shader_postfx_aberration = shader_postfx->GetUniformLocation("aberration");
  554. shader_postfx_moire_h = shader_postfx->GetUniformLocation("moire_h");
  555. shader_postfx_moire_v = shader_postfx->GetUniformLocation("moire_v");
  556. shader_postfx_scanline_h = shader_postfx->GetUniformLocation("scanline_h");
  557. shader_postfx_scanline_v = shader_postfx->GetUniformLocation("scanline_v");
  558. shader_postfx_corner = shader_postfx->GetUniformLocation("corner");
  559. shader_postfx_sync = shader_postfx->GetUniformLocation("sync");
  560. shader_postfx_beat = shader_postfx->GetUniformLocation("beat");
  561. // shader mirror
  562. shader_mirror = Shader::Create(lolfx_mirror);
  563. shader_mirror_texture = shader_mirror->GetUniformLocation("texture");
  564. shader_mirror_screen_size = shader_mirror->GetUniformLocation("screen_size");
  565. shader_mirror_mirror = shader_mirror->GetUniformLocation("mirror");
  566. // initialize setup
  567. setup_n = calc_item_length();
  568. return true;
  569. }
  570. int Render::CreateGLWindow()
  571. {
  572. UpdateSize();
  573. InitDraw();
  574. return true;
  575. }
  576. Render::Render(caca_canvas_t *caca)
  577. : m_cv_screen(caca),
  578. m_cv_setup(caca_create_canvas(1, 1)),
  579. m_ready(false),
  580. m_pause(false),
  581. m_polygon(true),
  582. m_shader(true),
  583. m_shader_glow(true),
  584. m_shader_blur(true),
  585. m_shader_remanence(true),
  586. m_shader_copper(true),
  587. m_shader_color(true),
  588. m_shader_noise(true),
  589. m_shader_postfx(true),
  590. m_shader_mirror(true)
  591. {
  592. m_txt_screen = new TextRender(m_cv_screen, font_size);
  593. m_txt_setup = new TextRender(m_cv_setup, font_size);
  594. }
  595. void Render::TickGame(float seconds)
  596. {
  597. Entity::TickGame(seconds);
  598. /* draw LOLCUBE */
  599. /*
  600. caca_set_color_argb(m_cv_screen, 0xfff, 0x000);
  601. caca_put_str(m_cv_screen, canvas_char.x - 8, canvas_char.y - 6, "_______");
  602. caca_put_str(m_cv_screen, canvas_char.x - 9, canvas_char.y - 5, "/ /|");
  603. caca_put_str(m_cv_screen, canvas_char.x - 10, canvas_char.y - 4, "/______/ |");
  604. caca_put_str(m_cv_screen, canvas_char.x - 10, canvas_char.y - 3, "| | |");
  605. caca_put_str(m_cv_screen, canvas_char.x - 10, canvas_char.y - 2, "| :D | /");
  606. caca_put_str(m_cv_screen, canvas_char.x - 10, canvas_char.y - 1, "|______|/");
  607. */
  608. /* draw setup */
  609. if (g_setup)
  610. {
  611. /* background */
  612. caca_set_color_argb(m_cv_setup, setup_color.x, setup_color.y);
  613. caca_fill_box(m_cv_setup, 0, 0, setup_size.x + 1, setup_size.y,' ');
  614. caca_draw_line(m_cv_setup, setup_size.z - 1, 1, setup_size.z - 1, setup_size.y - 1,'|');
  615. /* title */
  616. caca_set_color_argb(m_cv_setup, setup_color.y, setup_color.x);
  617. caca_draw_line(m_cv_setup, 0, 0, setup_size.x, 0, ' ');
  618. caca_put_str(m_cv_setup, setup_size.x / 2 - 3, 0, "SETUP");
  619. /* informations */
  620. int w = caca_get_canvas_width(m_cv_screen);
  621. int h = caca_get_canvas_height(m_cv_screen);
  622. caca_set_color_argb(m_cv_setup, setup_color.y, setup_color.x);
  623. caca_printf(m_cv_setup, 1, 0, "%i*%i", w, h);
  624. /* display option */
  625. for (int i = 0; i < setup_h; i++)
  626. {
  627. int y = 1 + i;
  628. int k = (setup_option_p + i) * (setup_item_n + 1);
  629. if (setup_option_i != setup_option_p + i || setup_switch)
  630. {
  631. caca_set_color_argb(m_cv_setup, setup_color.x, setup_color.y);
  632. caca_put_str(m_cv_setup, 1, y, setup_text[k]);
  633. }
  634. else
  635. {
  636. caca_set_color_argb(m_cv_setup, setup_color.y, 0xfff);//setup_color.x);
  637. caca_draw_line(m_cv_setup, 0, y, setup_size.z - 2, y,' ');
  638. caca_put_str(m_cv_setup, 1, y, setup_text[k]);
  639. }
  640. }
  641. /* display item */
  642. for (int i = 0; i < setup_h; i++)
  643. {
  644. int y = 1 + i;
  645. int k = setup_option_i * (setup_item_n + 1) + 1 + setup_item_p + i;
  646. if (setup_item_i != setup_item_p + i || !setup_switch)
  647. {
  648. caca_set_color_argb(m_cv_setup, setup_color.x, setup_color.y);
  649. caca_put_str(m_cv_setup, setup_size.z + 1, y, setup_text[k]);
  650. }
  651. else
  652. {
  653. caca_set_color_argb(m_cv_setup, setup_color.y, 0xfff);//setup_color.x);
  654. caca_draw_line(m_cv_setup, setup_size.z, y, setup_size.x, y,' ');
  655. caca_put_str(m_cv_setup, setup_size.z + 1, y, setup_text[k]);
  656. }
  657. }
  658. /* display variable */
  659. int y = setup_size.y;
  660. setup_item_key = setup_option_i * (setup_item_n + 1) + 1 + setup_item_i;
  661. caca_set_color_argb(m_cv_setup, setup_color.y, setup_color.x);
  662. caca_draw_line(m_cv_setup, 0, y, setup_size.x, y,' ');
  663. if (setup_switch)
  664. {
  665. int x = 1;
  666. int w = setup_size.x - 3 - 4;
  667. float bar_w = w / (setup_var[setup_item_key].y - setup_var[setup_item_key].x);
  668. int bar_x = bar_w * setup_var[setup_item_key].x;
  669. if ((setup_var[setup_item_key].y - setup_var[setup_item_key].x) / setup_var[setup_item_key].z > 1)
  670. {
  671. /* Work around a bug in libcaca */
  672. if (setup_size.x - 4 < caca_get_canvas_width(m_cv_setup)) caca_printf(m_cv_setup, setup_size.x - 4, y, "%4.2f", setup_var[setup_item_key].w);
  673. caca_draw_line(m_cv_setup, x, y, x - bar_x + int(bar_w * setup_var[setup_item_key].y), y,'.');
  674. if (setup_var[setup_item_key].w != setup_var[setup_item_key].x) caca_draw_line(m_cv_setup, x, y, x - bar_x + int(bar_w * setup_var[setup_item_key].w), y, 'x');
  675. }
  676. else
  677. {
  678. if (setup_var[setup_item_key] != vec4(0))
  679. {
  680. caca_put_str(m_cv_setup, setup_size.x - 3, y, (setup_var[setup_item_key].w == setup_var[setup_item_key].y)?"YES":" NO");
  681. }
  682. }
  683. }
  684. else
  685. {
  686. caca_printf(m_cv_setup, 1, y, "%d/%d", setup_option_i, setup_n);
  687. }
  688. }
  689. }
  690. void Render::Pause()
  691. {
  692. m_pause=!m_pause;
  693. }
  694. void Render::TickDraw(float seconds)
  695. {
  696. /* keyboard manager */
  697. if (Input::WasReleased(Key::Escape))
  698. {
  699. Ticker::Shutdown();
  700. }
  701. if (Input::WasPressed(Key::F1))
  702. {
  703. g_setup = !g_setup;
  704. if (g_setup) setup_n = calc_item_length();
  705. sync_flag = true;
  706. sync_angle = main_angle;
  707. }
  708. if (Input::WasPressed(Key::F2))
  709. {
  710. m_shader_glow = !m_shader_glow;
  711. m_shader_blur = !m_shader_blur;
  712. m_shader_remanence = !m_shader_remanence;
  713. //m_shader_copper = !m_shader_copper;
  714. m_shader_color = !m_shader_color;
  715. m_shader_noise = !m_shader_noise;
  716. m_shader_postfx = !m_shader_postfx;
  717. m_shader_mirror = !m_shader_mirror;
  718. //m_polygon = !m_polygon;
  719. //polygon_fillmode = (m_polygon)?GL_FILL:GL_LINE;
  720. //glPolygonMode(GL_FRONT, polygon_fillmode);
  721. }
  722. if (Input::WasPressed(Key::Tab))
  723. {
  724. if (g_setup)
  725. {
  726. setup_switch = !setup_switch;
  727. setup_n = calc_item_length();
  728. setup_cursor = (!setup_switch?setup_option_i:setup_item_i) - (!setup_switch?setup_option_p:setup_item_p);
  729. }
  730. }
  731. if (Input::WasPressed(Key::Up))
  732. {
  733. if (g_setup)
  734. {
  735. if (!setup_switch)
  736. {
  737. if (setup_cursor > 0)
  738. {
  739. setup_cursor--;
  740. }
  741. else
  742. {
  743. if (setup_cursor == 0) setup_option_p--;
  744. }
  745. if (setup_option_i > 0)
  746. {
  747. setup_option_i--;
  748. }
  749. else
  750. {
  751. setup_option_i = setup_option_n - 1;
  752. setup_option_p = setup_option_n - setup_h;
  753. setup_cursor = setup_h - 1;
  754. }
  755. setup_item_i = 0;
  756. setup_item_p = 0;
  757. }
  758. else
  759. {
  760. if (setup_cursor > 0)
  761. {
  762. setup_cursor--;
  763. }
  764. else
  765. {
  766. if (setup_cursor == 0) setup_item_p--;
  767. }
  768. if (setup_item_i > 0)
  769. {
  770. setup_item_i--;
  771. }
  772. else
  773. {
  774. setup_item_i = setup_n;
  775. setup_item_p = (setup_n < setup_h) ? 0 : setup_n - setup_h + 1;
  776. setup_cursor = (setup_n < setup_h) ? setup_n : setup_h - 1;
  777. }
  778. }
  779. }
  780. }
  781. if (Input::WasPressed(Key::Down))
  782. {
  783. if (g_setup)
  784. {
  785. if (!setup_switch)
  786. {
  787. if (setup_cursor < setup_h - 1)
  788. {
  789. setup_cursor++;
  790. }
  791. else
  792. {
  793. if (setup_cursor == setup_h - 1) setup_option_p++;
  794. }
  795. if (setup_option_i < setup_option_n - 1)
  796. {
  797. setup_option_i++;
  798. }
  799. else
  800. {
  801. setup_option_i = 0;
  802. setup_option_p = 0;
  803. setup_cursor = 0;
  804. }
  805. setup_item_i = 0;
  806. setup_item_p = 0;
  807. }
  808. else
  809. {
  810. if (setup_cursor < setup_h - 1)
  811. {
  812. setup_cursor++;
  813. }
  814. else
  815. {
  816. if (setup_cursor == setup_h - 1) setup_item_p++;
  817. }
  818. if (setup_item_i < setup_n)
  819. {
  820. setup_item_i++;
  821. }
  822. else
  823. {
  824. setup_item_i = 0;
  825. setup_item_p = 0;
  826. setup_cursor = 0;
  827. }
  828. }
  829. }
  830. }
  831. if (Input::WasPressed(Key::PageUp))
  832. {
  833. if (g_setup)
  834. {
  835. if (!setup_switch)
  836. {
  837. if (setup_cursor > 0)
  838. {
  839. setup_option_i -= setup_cursor;
  840. setup_cursor = 0;
  841. }
  842. else
  843. {
  844. if (setup_option_i > setup_h)
  845. {
  846. setup_option_i -= setup_h;
  847. setup_option_p -= setup_h;
  848. }
  849. else
  850. {
  851. setup_option_i = 0;
  852. setup_option_p = 0;
  853. }
  854. }
  855. setup_item_i = 0;
  856. }
  857. else
  858. {
  859. if (setup_cursor > 0)
  860. {
  861. setup_item_i -= setup_cursor;
  862. setup_cursor = 0;
  863. }
  864. else
  865. {
  866. if (setup_item_i > setup_h)
  867. {
  868. setup_item_i -= setup_h;
  869. setup_item_p -= setup_h;
  870. }
  871. else
  872. {
  873. setup_item_i = 0;
  874. setup_item_p = 0;
  875. }
  876. }
  877. }
  878. }
  879. }
  880. if (Input::WasPressed(Key::PageDown))
  881. {
  882. if (g_setup)
  883. {
  884. if (!setup_switch)
  885. {
  886. if (setup_cursor < setup_h - 1)
  887. {
  888. setup_option_i += setup_h - setup_cursor - 1;
  889. setup_cursor = setup_h - 1;
  890. setup_item_i = 0;
  891. }
  892. else
  893. {
  894. if (setup_option_i < setup_option_n - setup_h - 1)
  895. {
  896. setup_option_i += setup_h;
  897. setup_option_p += setup_h;
  898. }
  899. else
  900. {
  901. setup_option_i = setup_option_n - 1;
  902. setup_option_p = setup_option_n - setup_h;
  903. }
  904. }
  905. }
  906. else
  907. {
  908. if (setup_cursor < setup_h - 1)
  909. {
  910. setup_item_i += (setup_n < setup_h) ? setup_n - setup_cursor : setup_h - setup_cursor - 1;
  911. setup_cursor = (setup_n < setup_h) ? setup_n : setup_h - 1;
  912. }
  913. else
  914. {
  915. if (setup_item_i < setup_n - setup_h + 1)
  916. {
  917. setup_item_i += setup_h;
  918. setup_item_p += setup_h;
  919. }
  920. else
  921. {
  922. setup_item_i = setup_n;
  923. setup_item_p = setup_n - setup_h + 1;
  924. }
  925. }
  926. }
  927. }
  928. }
  929. if (Input::WasPressed(Key::Left))
  930. {
  931. if (g_setup && setup_switch)
  932. {
  933. setup_var[setup_item_key].w -= setup_var[setup_item_key].z;
  934. if (setup_var[setup_item_key].w < setup_var[setup_item_key].x) setup_var[setup_item_key].w = setup_var[setup_item_key].x;
  935. UpdateVar();
  936. }
  937. }
  938. if (Input::WasPressed(Key::Right))
  939. {
  940. if (g_setup && setup_switch)
  941. {
  942. setup_var[setup_item_key].w += setup_var[setup_item_key].z;
  943. if (setup_var[setup_item_key].w > setup_var[setup_item_key].y) setup_var[setup_item_key].w = setup_var[setup_item_key].y;
  944. UpdateVar();
  945. }
  946. }
  947. if (Input::WasPressed(Key::Home))
  948. {
  949. if (g_setup && setup_switch)
  950. {
  951. setup_var[setup_item_key].w = setup_var[setup_item_key].x;
  952. UpdateVar();
  953. }
  954. }
  955. if (Input::WasPressed(Key::End))
  956. {
  957. if (g_setup && setup_switch)
  958. {
  959. setup_var[setup_item_key].w = setup_var[setup_item_key].y;
  960. UpdateVar();
  961. }
  962. }
  963. if (Input::WasPressed(Key::Return))
  964. {
  965. beat_flag = true;
  966. beat_angle = main_angle;
  967. //flash_flag = true;
  968. //flash_angle = main_angle;
  969. }
  970. Entity::TickDraw(seconds);
  971. if (!m_ready)
  972. {
  973. CreateGLWindow();
  974. m_txt_screen->Init();
  975. m_txt_setup->Init();
  976. m_ready = true;
  977. }
  978. // timer
  979. if (!m_pause)
  980. {
  981. timer += seconds;
  982. main_angle = timer * 100.0f * PID;
  983. }
  984. if (sync_flag)
  985. {
  986. angle = (main_angle - sync_angle) * sync_speed;
  987. sync_value = 1.0f - sinf(angle);
  988. if (angle > 90.0f * PID)
  989. {
  990. sync_value = 0;
  991. sync_flag = false;
  992. }
  993. }
  994. if (beat_flag)
  995. {
  996. angle = (main_angle - beat_angle) * beat_speed;
  997. beat_value = 1.0f - sinf(angle);
  998. if (angle > 90.0f * PID)
  999. {
  1000. beat_value = 0;
  1001. beat_flag = false;
  1002. }
  1003. }
  1004. if (flash_flag)
  1005. {
  1006. angle = (main_angle - flash_angle) * flash_speed;
  1007. flash_value = 1.0f - sinf(angle);
  1008. if (angle > 90.0f * PID)
  1009. {
  1010. flash_value = 0;
  1011. flash_flag = false;
  1012. }
  1013. }
  1014. if (fade_flag)
  1015. {
  1016. angle = (main_angle - fade_angle) * fade_speed;
  1017. fade_value = 1.0f - sinf(angle);
  1018. if (angle > 90.0f * PID)
  1019. {
  1020. fade_value = 0;
  1021. fade_flag = false;
  1022. }
  1023. }
  1024. Draw2D();
  1025. Draw3D();
  1026. }
  1027. void Render::Draw2D()
  1028. {
  1029. /* Draw text in an offline buffer */
  1030. m_txt_screen->Render();
  1031. if (g_setup)
  1032. m_txt_setup->Render();
  1033. if (m_shader)
  1034. fbo_back->Bind();
  1035. glViewport(0, 0, screen_size.x, screen_size.y);
  1036. /* Clear the back buffer */
  1037. glEnable(GL_BLEND);
  1038. glBlendFunc(GL_SRC_COLOR, GL_DST_ALPHA);
  1039. Video::SetClearColor(vec4(screen_color, 1.f));
  1040. Video::SetClearDepth(1.0f); // set depth buffer
  1041. Video::Clear(ClearMask::Color | ClearMask::Depth);
  1042. m_txt_screen->Blit(border, canvas_size);
  1043. if (g_setup)
  1044. m_txt_setup->Blit((screen_size - setup_canvas_size) / 2, setup_canvas_size);
  1045. //if (m_polygon) glEnable(GL_LINE_SMOOTH); else glDisable(GL_LINE_SMOOTH);
  1046. glLineWidth((m_polygon)?2.0f:1.0f);
  1047. fx_angle=main_angle-part_angle;
  1048. if (m_polygon)
  1049. glEnable(GL_TEXTURE_2D);
  1050. glMatrixMode(GL_PROJECTION);
  1051. mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f);
  1052. glLoadMatrixf(&m[0][0]);
  1053. glMatrixMode(GL_MODELVIEW);
  1054. }
  1055. void Render::Draw3D()
  1056. {
  1057. if (!m_shader)
  1058. return;
  1059. glDisable(GL_DEPTH_TEST);
  1060. glDisable(GL_BLEND);
  1061. glEnableClientState(GL_VERTEX_ARRAY);
  1062. glVertexPointer(4, GL_FLOAT, 0, fs_quad_vtx);
  1063. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  1064. glTexCoordPointer(2, GL_FLOAT, 0, fs_quad_tex);
  1065. if (m_shader_copper)
  1066. {
  1067. // shader copper
  1068. fbo_tmp->Bind();
  1069. shader_copper->Bind();
  1070. shader_copper->SetUniform(shader_copper_texture, fbo_back->GetTexture(), 0);
  1071. shader_copper->SetUniform(shader_copper_screen_size, (vec2)screen_size);
  1072. shader_copper->SetUniform(shader_copper_time, fx_angle);
  1073. shader_copper->SetUniform(shader_copper_copper, vec4(copper_copper.x, copper_copper.y, copper_copper.z * 16.0f, copper_copper.w * 16.0f));
  1074. shader_copper->SetUniform(shader_copper_mask_color, copper_mask_color / 4.0f);
  1075. TraceQuad();
  1076. shader_color->Unbind();
  1077. fbo_tmp->Unbind();
  1078. // shader simple
  1079. fbo_back->Bind();
  1080. ShaderSimple(fbo_tmp, 0);
  1081. fbo_back->Unbind();
  1082. }
  1083. if (m_shader_remanence)
  1084. {
  1085. // shader remanence
  1086. fbo_tmp->Bind();
  1087. shader_remanence->Bind();
  1088. shader_remanence->SetUniform(shader_remanence_source, fbo_back->GetTexture(), 0);
  1089. shader_remanence->SetUniform(shader_remanence_buffer, fbo_buffer->GetTexture(), 1);
  1090. shader_remanence->SetUniform(shader_remanence_mix, remanence);
  1091. TraceQuad();
  1092. shader_remanence->Unbind();
  1093. fbo_tmp->Unbind();
  1094. // shader simple
  1095. fbo_back->Bind();
  1096. ShaderSimple(fbo_tmp, 0);
  1097. fbo_back->Unbind();
  1098. // save previous fbo
  1099. fbo_tmp->Bind();
  1100. shader_remanence->Bind();
  1101. shader_remanence->SetUniform(shader_remanence_source, fbo_screen->GetTexture(), 0);
  1102. shader_remanence->SetUniform(shader_remanence_buffer, fbo_buffer->GetTexture(), 1);
  1103. shader_remanence->SetUniform(shader_remanence_mix, buffer);
  1104. TraceQuad();
  1105. shader_remanence->Unbind();
  1106. fbo_tmp->Unbind();
  1107. // shader simple
  1108. fbo_buffer->Bind();
  1109. ShaderSimple(fbo_tmp, 0);
  1110. fbo_buffer->Unbind();
  1111. }
  1112. // shader glow
  1113. if (m_shader_glow)
  1114. {
  1115. // shader blur horizontal
  1116. fbo_blur_h->Bind();
  1117. shader_blur_h->Bind();
  1118. shader_blur_h->SetUniform(shader_blur_h_texture, fbo_back->GetTexture(), 0);
  1119. shader_blur_h->SetUniform(shader_blur_h_radius, glow_large / screen_size.x);
  1120. TraceQuad();
  1121. shader_blur_h->Unbind();
  1122. fbo_blur_h->Unbind();
  1123. // shader blur vertical
  1124. fbo_blur_v->Bind();
  1125. shader_blur_v->Bind();
  1126. shader_blur_v->SetUniform(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
  1127. shader_blur_v->SetUniform(shader_blur_v_radius, glow_large / screen_size.y);
  1128. TraceQuad();
  1129. shader_blur_v->Unbind();
  1130. fbo_blur_v->Unbind();
  1131. // shader blur horizontal
  1132. fbo_blur_h->Bind();
  1133. shader_blur_h->Bind();
  1134. shader_blur_h->SetUniform(shader_blur_h_texture, fbo_blur_v->GetTexture(), 0);
  1135. shader_blur_h->SetUniform(shader_blur_h_radius, glow_small / screen_size.x);
  1136. TraceQuad();
  1137. shader_blur_h->Unbind();
  1138. fbo_blur_h->Unbind();
  1139. // shader blur vertical
  1140. fbo_blur_v->Bind();
  1141. shader_blur_v->Bind();
  1142. shader_blur_v->SetUniform(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
  1143. shader_blur_v->SetUniform(shader_blur_v_radius, glow_small / screen_size.y);
  1144. TraceQuad();
  1145. shader_blur_v->Unbind();
  1146. fbo_blur_v->Unbind();
  1147. // shader glow
  1148. fbo_screen->Bind();
  1149. shader_glow->Bind();
  1150. shader_glow->SetUniform(shader_glow_glow, fbo_blur_v->GetTexture(), 0);
  1151. shader_glow->SetUniform(shader_glow_source, fbo_back->GetTexture(), 1);
  1152. shader_glow->SetUniform(shader_glow_mix, glow_mix);
  1153. TraceQuad();
  1154. shader_glow->Unbind();
  1155. fbo_screen->Unbind();
  1156. }
  1157. else
  1158. {
  1159. // shader simple
  1160. fbo_screen->Bind();
  1161. ShaderSimple(fbo_back, 0);
  1162. fbo_screen->Unbind();
  1163. }
  1164. if (m_shader_color)
  1165. {
  1166. // shader color
  1167. fbo_tmp->Bind();
  1168. shader_color->Bind();
  1169. shader_color->SetUniform(shader_color_texture, fbo_screen->GetTexture(), 0);
  1170. shader_color->SetUniform(shader_color_screen_size, (vec2)screen_size);
  1171. shader_color->SetUniform(shader_color_filter, color_filter);
  1172. shader_color->SetUniform(shader_color_color, color_color);
  1173. shader_color->SetUniform(shader_color_flash, flash_value);
  1174. TraceQuad();
  1175. shader_color->Unbind();
  1176. fbo_tmp->Unbind();
  1177. // shader simple
  1178. fbo_screen->Bind();
  1179. ShaderSimple(fbo_tmp, 0);
  1180. fbo_screen->Unbind();
  1181. }
  1182. if (m_shader_noise)
  1183. {
  1184. // shader noise
  1185. fbo_tmp->Bind();
  1186. shader_noise->Bind();
  1187. shader_noise->SetUniform(shader_noise_texture, fbo_screen->GetTexture(), 0);
  1188. shader_noise->SetUniform(shader_noise_screen_size, (vec2)screen_size);
  1189. shader_noise->SetUniform(shader_noise_time, fx_angle);
  1190. shader_noise->SetUniform(shader_noise_offset, noise_offset);
  1191. shader_noise->SetUniform(shader_noise_noise, noise_noise);
  1192. shader_noise->SetUniform(shader_noise_retrace, noise_retrace);
  1193. TraceQuad();
  1194. shader_noise->Unbind();
  1195. fbo_tmp->Unbind();
  1196. // shader simple
  1197. fbo_screen->Bind();
  1198. ShaderSimple(fbo_tmp, 0);
  1199. fbo_screen->Unbind();
  1200. }
  1201. if (m_shader_blur)
  1202. {
  1203. // shader blur horizontal
  1204. fbo_tmp->Bind();
  1205. shader_blur_h->Bind();
  1206. shader_blur_h->SetUniform(shader_blur_h_texture, fbo_screen->GetTexture(), 0);
  1207. shader_blur_h->SetUniform(shader_blur_h_radius, blur / screen_size.x);
  1208. TraceQuad();
  1209. shader_blur_h->Unbind();
  1210. fbo_tmp->Unbind();
  1211. // shader blur vertical
  1212. fbo_screen->Bind();
  1213. shader_blur_v->Bind();
  1214. shader_blur_v->SetUniform(shader_blur_v_texture, fbo_tmp->GetTexture(), 0);
  1215. shader_blur_v->SetUniform(shader_blur_v_radius, blur / screen_size.y);
  1216. TraceQuad();
  1217. shader_blur_v->Unbind();
  1218. fbo_screen->Unbind();
  1219. }
  1220. if (m_shader_postfx)
  1221. {
  1222. // shader postfx
  1223. fbo_front->Bind();
  1224. shader_postfx->Bind();
  1225. shader_postfx->SetUniform(shader_postfx_texture, fbo_screen->GetTexture(), 0);
  1226. shader_postfx->SetUniform(shader_postfx_screen_size, (vec2)screen_size);
  1227. shader_postfx->SetUniform(shader_postfx_time, fx_angle);
  1228. shader_postfx->SetUniform(shader_postfx_deform, postfx_deform);
  1229. shader_postfx->SetUniform(shader_postfx_ghost1, postfx_ghost1);
  1230. shader_postfx->SetUniform(shader_postfx_ghost2, postfx_ghost2);
  1231. shader_postfx->SetUniform(shader_postfx_vignetting, postfx_vignetting);
  1232. shader_postfx->SetUniform(shader_postfx_aberration, postfx_aberration);
  1233. shader_postfx->SetUniform(shader_postfx_moire_h, postfx_moire_h);
  1234. shader_postfx->SetUniform(shader_postfx_moire_v, postfx_moire_v);
  1235. shader_postfx->SetUniform(shader_postfx_scanline_h, postfx_scanline_h);
  1236. shader_postfx->SetUniform(shader_postfx_scanline_v, postfx_scanline_v);
  1237. shader_postfx->SetUniform(shader_postfx_corner, postfx_corner);
  1238. shader_postfx->SetUniform(shader_postfx_sync, (float)fabs(sync_value * cosf((main_angle - sync_angle) * 6.0f)));
  1239. shader_postfx->SetUniform(shader_postfx_beat, (float)fabs(beat_value * cosf((main_angle - beat_angle) * 6.0f)));
  1240. TraceQuad();
  1241. shader_postfx->Unbind();
  1242. fbo_front->Unbind();
  1243. }
  1244. else
  1245. {
  1246. // shader simple
  1247. fbo_front->Bind();
  1248. ShaderSimple(fbo_screen, 0);
  1249. fbo_front->Unbind();
  1250. }
  1251. if (m_shader_mirror)
  1252. {
  1253. // shader mirror
  1254. fbo_tmp->Bind();
  1255. shader_mirror->Bind();
  1256. shader_mirror->SetUniform(shader_mirror_texture, fbo_front->GetTexture(), 0);
  1257. shader_mirror->SetUniform(shader_mirror_screen_size, (vec2)screen_size);
  1258. shader_mirror->SetUniform(shader_mirror_mirror, vec4(mirror.x * 0.1f, mirror.y * 0.1f, mirror.z, mirror.w));
  1259. TraceQuad();
  1260. shader_mirror->Unbind();
  1261. fbo_tmp->Unbind();
  1262. // shader simple
  1263. fbo_front->Bind();
  1264. ShaderSimple(fbo_tmp, 0);
  1265. fbo_front->Unbind();
  1266. }
  1267. // shader simple
  1268. ShaderSimple(fbo_front, 0);
  1269. glDisableClientState(GL_VERTEX_ARRAY);
  1270. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  1271. }
  1272. Render::~Render()
  1273. {
  1274. }