Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

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