You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

591 lines
20 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_blurh;
  28. extern char const *lolfx_blurv;
  29. extern char const *lolfx_remanency;
  30. extern char const *lolfx_glow;
  31. extern char const *lolfx_postfx;
  32. extern char const *lolfx_radial;
  33. extern char const *lolfx_simple;
  34. #define PID M_PI/180.0f // pi ratio
  35. #define CR 1.0f/256.0f // color ratio
  36. /*
  37. * Various variables
  38. */
  39. int active = true; // window active flag
  40. float nearplane = 0.1f; // nearplane
  41. float farplane = 1000.0f; // farplane
  42. int polygon_fillmode = GL_FILL; // fill mode
  43. /* timer variable */
  44. float timer = 0; // timer
  45. float timer_key = 0; // key timer
  46. float timer_key_repeat = 0.25f;// key repeat delay
  47. /* window variable */
  48. ivec2 screen_size; // screen size
  49. vec3 screen_color = CR * vec3(32, 32, 32); // screen color
  50. /* object variable */
  51. float main_angle = 0.0f; // main angle
  52. float part_angle = 0.0f; // part angle
  53. float fx_angle; // current angle
  54. /* fs_quad variable */
  55. 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};
  56. float fs_quad_tex[] = {0, 1.0f, 0, 0, 1.0f, 0, 1.0f, 1.0f};
  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 = 1.5f; // 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 = 1.0f; // 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. /* window variable */
  78. ivec2 border; // border width
  79. /* text variable */
  80. ivec2 ratio_2d(2,4); // 2d ratio
  81. ivec2 map_size(256,256); // texture map size
  82. ivec2 font_size(8,8); // font size
  83. ivec2 canvas_char(0,0); // canvas char number
  84. ivec2 canvas_size(0,0); // caca size
  85. /* common variable */
  86. float value, angle, radius, scale, speed;
  87. /* shader variable */
  88. vec2 buffer(0.75f,0.25f); // [new frame mix,old frame mix]
  89. vec2 remanency(0.25f,0.75f); // remanency [source mix,buffer mix]
  90. vec2 blur(0.25f,0.75f); // glow radius [normal,deform]
  91. vec2 glow_mix(0.5f,0.5f); // glow mix [source mix,glow mix]
  92. vec2 glow_large(2.0f,2.0f); // large glow radius [normal,deform]
  93. vec2 glow_small(1.0f,1.0f); // small glow radius [normal,deform]
  94. //vec3 radial(2.0f,0.8f,0); // radial [mix,strength,color mode]
  95. //---------------------------------[IDEAS] http://www.youtube.com/watch?v=d1qEP2vMe-I
  96. float postfx_deform = 0.625f; // deformation ratio
  97. vec3 postfx_filter(0.875f,0.75f,1.0f);// color filter [red,green,blue]
  98. vec3 postfx_retrace(0.025f,2.0f,4.0f);// retrace [color,length,speed]
  99. vec2 postfx_offset(3.0f,3.0f); // random line [horizontal,vertical]
  100. float postfx_noise = 0.125f; // noise
  101. float postfx_aberration = 3.0f; // chromatic aberration
  102. bool postfx_moire = true; // moire
  103. vec4 postfx_moire_h(0.75f,-0.25f,1.0f,2.0f);
  104. vec4 postfx_moire_v(0.75f,-0.25f,0.0f,1.0f);
  105. bool postfx_scanline = true; // scanline
  106. vec4 postfx_scanline_h(0.75f,-0.25f,2.0f,0.0f);// vertical scanline [base,variable,repeat]
  107. vec4 postfx_scanline_v(0.75f, 0.25f,0.0f,2.0f);// horizontal scanline [base,variable,repeat]
  108. vec2 postfx_smoothstep(0.025f,0.625f);// smoothstep [lower,upper]
  109. Shader *shader_simple;
  110. Shader *shader_blur_h, *shader_blur_v;
  111. Shader *shader_remanency, *shader_glow, *shader_radial, *shader_postfx;
  112. // shader variables
  113. ShaderUniform shader_simple_texture;
  114. ShaderUniform shader_blur_h_texture,
  115. shader_blur_h_radius,
  116. shader_blur_v_texture,
  117. shader_blur_v_radius;
  118. ShaderUniform shader_remanency_source,
  119. shader_remanency_buffer,
  120. shader_remanency_mix;
  121. ShaderUniform shader_glow_glow,
  122. shader_glow_source,
  123. shader_glow_mix;
  124. ShaderUniform shader_radial_texture,
  125. shader_radial_screen_size,
  126. shader_radial_time,
  127. shader_radial_value1,
  128. shader_radial_value2,
  129. shader_radial_color;
  130. ShaderUniform shader_postfx_texture,
  131. shader_postfx_texture_2d,
  132. shader_postfx_screen_size,
  133. shader_postfx_time,
  134. shader_postfx_deform,
  135. shader_postfx_filter,
  136. shader_postfx_retrace,
  137. shader_postfx_offset,
  138. shader_postfx_noise,
  139. shader_postfx_aberration,
  140. shader_postfx_moire,
  141. shader_postfx_moire_h,
  142. shader_postfx_moire_v,
  143. shader_postfx_scanline,
  144. shader_postfx_scanline_h,
  145. shader_postfx_scanline_v,
  146. shader_postfx_smoothstep,
  147. shader_postfx_flash,
  148. shader_postfx_sync;
  149. FrameBuffer *fbo_back, *fbo_front, *fbo_buffer;
  150. FrameBuffer *fbo_blur_h, *fbo_blur_v, *fbo_ping, *fbo_pong;
  151. TextRender *text_render;
  152. void fs_quad()
  153. {
  154. glLoadIdentity();
  155. glDrawArrays(GL_QUADS, 0, 4);
  156. }
  157. void draw_shader_simple(FrameBuffer *fbo_output, int n)
  158. {
  159. shader_simple->Bind();
  160. shader_simple->SetTexture(shader_simple_texture, fbo_output->GetTexture(), n);
  161. fs_quad();
  162. shader_simple->Unbind();
  163. }
  164. void rectangle(int x, int y, int w, int h)
  165. {
  166. glLoadIdentity();
  167. glBegin(GL_QUADS);
  168. glVertex2i(x+w, y );
  169. glVertex2i(x , y );
  170. glVertex2i(x , y+h);
  171. glVertex2i(x+w, y+h);
  172. glEnd();
  173. }
  174. int Render::InitDraw(void)
  175. {
  176. glDepthMask(GL_TRUE); // do not write z-buffer
  177. glEnable(GL_CULL_FACE); // disable cull face
  178. glCullFace(GL_BACK); // don't draw front face
  179. /* Initialise framebuffer objects */
  180. fbo_back = new FrameBuffer(screen_size);
  181. fbo_front = new FrameBuffer(screen_size);
  182. fbo_buffer = new FrameBuffer(screen_size);
  183. fbo_blur_h = new FrameBuffer(screen_size);
  184. fbo_blur_v = new FrameBuffer(screen_size);
  185. fbo_ping = new FrameBuffer(screen_size);
  186. fbo_pong = new FrameBuffer(screen_size);
  187. // shader simple
  188. shader_simple = Shader::Create(lolfx_simple);
  189. shader_simple_texture = shader_simple->GetUniformLocation("texture");
  190. // shader blur horizontal
  191. shader_blur_h = Shader::Create(lolfx_blurh);
  192. shader_blur_h_texture = shader_blur_h->GetUniformLocation("texture");
  193. shader_blur_h_radius = shader_blur_h->GetUniformLocation("radius");
  194. // shader blur vertical
  195. shader_blur_v = Shader::Create(lolfx_blurv);
  196. shader_blur_v_texture = shader_blur_v->GetUniformLocation("texture");
  197. shader_blur_v_radius = shader_blur_v->GetUniformLocation("radius");
  198. // shader remanency
  199. shader_remanency = Shader::Create(lolfx_remanency);
  200. shader_remanency_source = shader_remanency->GetUniformLocation("source");
  201. shader_remanency_buffer = shader_remanency->GetUniformLocation("buffer");
  202. shader_remanency_mix = shader_remanency->GetUniformLocation("mix");
  203. // shader glow
  204. shader_glow = Shader::Create(lolfx_glow);
  205. shader_glow_glow = shader_glow->GetUniformLocation("glow");
  206. shader_glow_source = shader_glow->GetUniformLocation("source");
  207. shader_glow_mix = shader_glow->GetUniformLocation("mix");
  208. // shader radial
  209. shader_radial = Shader::Create(lolfx_radial);
  210. shader_radial_texture = shader_radial->GetUniformLocation("texture");
  211. shader_radial_screen_size = shader_radial->GetUniformLocation("screen_size");
  212. shader_radial_time = shader_radial->GetUniformLocation("time");
  213. shader_radial_value1 = shader_radial->GetUniformLocation("value1");
  214. shader_radial_value2 = shader_radial->GetUniformLocation("value2");
  215. shader_radial_color = shader_radial->GetUniformLocation("color");
  216. // shader postfx
  217. shader_postfx = Shader::Create(lolfx_postfx);
  218. shader_postfx_texture = shader_postfx->GetUniformLocation("texture");
  219. shader_postfx_texture_2d = shader_postfx->GetUniformLocation("texture_2d");
  220. shader_postfx_screen_size = shader_postfx->GetUniformLocation("screen_size");
  221. shader_postfx_time = shader_postfx->GetUniformLocation("time");
  222. shader_postfx_deform = shader_postfx->GetUniformLocation("deform");
  223. shader_postfx_filter = shader_postfx->GetUniformLocation("filter");
  224. shader_postfx_retrace = shader_postfx->GetUniformLocation("retrace");
  225. shader_postfx_offset = shader_postfx->GetUniformLocation("offset");
  226. shader_postfx_noise = shader_postfx->GetUniformLocation("noise");
  227. shader_postfx_aberration = shader_postfx->GetUniformLocation("aberration");
  228. shader_postfx_moire = shader_postfx->GetUniformLocation("moire");
  229. shader_postfx_moire_h = shader_postfx->GetUniformLocation("moire_h");
  230. shader_postfx_moire_v = shader_postfx->GetUniformLocation("moire_v");
  231. shader_postfx_scanline = shader_postfx->GetUniformLocation("scanline");
  232. shader_postfx_scanline_h = shader_postfx->GetUniformLocation("scanline_h");
  233. shader_postfx_scanline_v = shader_postfx->GetUniformLocation("scanline_v");
  234. shader_postfx_smoothstep = shader_postfx->GetUniformLocation("smooth");
  235. shader_postfx_flash = shader_postfx->GetUniformLocation("flash");
  236. shader_postfx_sync = shader_postfx->GetUniformLocation("sync");
  237. return true;
  238. }
  239. int Render::CreateGLWindow()
  240. {
  241. screen_size = Video::GetSize();
  242. border = 18 * ratio_2d;
  243. border.y = border.x; // enabled to get same border everywhere
  244. canvas_char = (screen_size - border * 2) / (font_size * ratio_2d);
  245. canvas_size = canvas_char * font_size * ratio_2d;
  246. border = (screen_size - canvas_size) / 2;
  247. caca_set_canvas_size(m_caca, canvas_char.x, canvas_char.y);
  248. InitDraw();
  249. return true;
  250. }
  251. Render::Render(caca_canvas_t *caca)
  252. : m_caca(caca),
  253. m_ready(false),
  254. m_pause(false),
  255. m_polygon(true),
  256. m_shader(true),
  257. m_shader_remanency(true),
  258. m_shader_glow(true),
  259. m_shader_blur(true),
  260. m_shader_fx(true),
  261. m_shader_postfx(true),
  262. m_border(false)
  263. {
  264. text_render = new TextRender(m_caca, font_size);
  265. }
  266. void Render::TickGame(float seconds)
  267. {
  268. Entity::TickGame(seconds);
  269. }
  270. void Render::Pause()
  271. {
  272. m_pause=!m_pause;
  273. }
  274. void Render::TickDraw(float seconds)
  275. {
  276. /* keyboard manager */
  277. if (Input::GetButtonState(27/*SDLK_ESCAPE*/))
  278. Ticker::Shutdown();
  279. //if (Input::GetButtonState(282/*SDLK_F1*/))
  280. // LEAULE();
  281. if (Input::GetButtonState(283/*SDLK_F2*/)&&(timer-timer_key>timer_key_repeat))
  282. {
  283. m_polygon = !m_polygon;
  284. polygon_fillmode = (m_polygon)?GL_FILL:GL_LINE;
  285. glPolygonMode(GL_FRONT, polygon_fillmode);
  286. timer_key = timer;
  287. }
  288. if (Input::GetButtonState(284/*SDLK_F3*/)&&(timer-timer_key>timer_key_repeat))
  289. {
  290. m_shader = !m_shader;
  291. timer_key = timer;
  292. }
  293. if (Input::GetButtonState(285/*SDLK_F4*/)&&(timer-timer_key>timer_key_repeat))
  294. {
  295. m_shader_postfx = !m_shader_postfx;
  296. timer_key = timer;
  297. }
  298. if (Input::GetButtonState(286/*SDLK_F5*/)&&(timer-timer_key>timer_key_repeat))
  299. {
  300. Pause();
  301. timer_key = timer;
  302. }
  303. Entity::TickDraw(seconds);
  304. if (!m_ready)
  305. {
  306. CreateGLWindow();
  307. text_render->Init();
  308. m_ready = true;
  309. }
  310. // timer
  311. if (!m_pause)
  312. {
  313. timer += seconds;
  314. main_angle = timer * 100.0f * PID;
  315. }
  316. if (sync_flag)
  317. {
  318. angle=(main_angle-sync_angle)*sync_speed;
  319. sync_value=1.0f-sinf(angle);
  320. if (angle>90.0f*PID)
  321. {
  322. sync_value=0;
  323. sync_flag=false;
  324. }
  325. }
  326. if (beat_flag)
  327. {
  328. angle=(main_angle-beat_angle)*beat_speed;
  329. beat_value=1.0f-sinf(angle);
  330. if (angle>90.0f*PID)
  331. {
  332. beat_value=0;
  333. beat_flag=false;
  334. }
  335. }
  336. if (flash_flag)
  337. {
  338. angle=(main_angle-flash_angle)*flash_speed;
  339. flash_value=1.0f-sinf(angle);
  340. if (angle>90.0f*PID)
  341. {
  342. flash_value=0;
  343. flash_flag=false;
  344. }
  345. }
  346. if (fade_flag)
  347. {
  348. angle=(main_angle-fade_angle)*fade_speed;
  349. fade_value=1.0f-sinf(angle);
  350. if (angle>90.0f*PID)
  351. {
  352. fade_value=0;
  353. fade_flag=false;
  354. }
  355. }
  356. Draw2D();
  357. Draw3D();
  358. }
  359. void Render::Draw2D()
  360. {
  361. /* Draw text in an offline buffer */
  362. text_render->Render();
  363. if (m_shader)
  364. {
  365. fbo_back->Bind();
  366. }
  367. glViewport(0, 0, screen_size.x, screen_size.y);
  368. /* Clear the back buffer */
  369. glEnable(GL_BLEND);
  370. glBlendFunc(GL_SRC_COLOR,GL_DST_ALPHA);
  371. glClearColor(screen_color.r, screen_color.g, screen_color.b, 1.0f);
  372. glClearDepth(1.0f); // set depth buffer
  373. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  374. text_render->Blit(border, canvas_size);
  375. //if (m_polygon) glEnable(GL_LINE_SMOOTH); else glDisable(GL_LINE_SMOOTH);
  376. glLineWidth((m_polygon)?2.0f:1.0f);
  377. fx_angle=main_angle-part_angle;
  378. if (m_polygon)
  379. glEnable(GL_TEXTURE_2D);
  380. glMatrixMode(GL_PROJECTION);
  381. mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f);
  382. glLoadMatrixf(&m[0][0]);
  383. glMatrixMode(GL_MODELVIEW);
  384. // draw border
  385. if (m_border)
  386. {
  387. glDisable(GL_TEXTURE_2D);
  388. glDisable(GL_BLEND);
  389. glColor3f(1.0f, 1.0f, 1.0f);
  390. rectangle(border.x - ratio_2d.x, border.y - ratio_2d.y, canvas_size.x + ratio_2d.x * 2, ratio_2d.y);
  391. rectangle(border.x - ratio_2d.x, border.y, ratio_2d.x, canvas_size.y);
  392. rectangle(border.x + canvas_size.x, border.y, ratio_2d.x, canvas_size.y);
  393. rectangle(border.x - ratio_2d.x, border.y + canvas_size.y, canvas_size.x + ratio_2d.x * 2, ratio_2d.y);
  394. glEnable(GL_BLEND);
  395. }
  396. }
  397. void Render::Draw3D()
  398. {
  399. if (!m_shader)
  400. return;
  401. glDisable(GL_DEPTH_TEST);
  402. glDisable(GL_BLEND);
  403. glEnableClientState(GL_VERTEX_ARRAY);
  404. glVertexPointer(4, GL_FLOAT, 0, fs_quad_vtx);
  405. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  406. glTexCoordPointer(2, GL_FLOAT, 0, fs_quad_tex);
  407. if (m_shader_remanency)
  408. {
  409. // shader remanency
  410. fbo_ping->Bind();
  411. shader_remanency->Bind();
  412. shader_remanency->SetTexture(shader_remanency_source, fbo_back->GetTexture(), 0);
  413. shader_remanency->SetTexture(shader_remanency_buffer, fbo_buffer->GetTexture(), 1);
  414. shader_remanency->SetUniform(shader_remanency_mix, remanency);
  415. fs_quad();
  416. shader_remanency->Unbind();
  417. fbo_ping->Unbind();
  418. // shader simple
  419. fbo_back->Bind();
  420. draw_shader_simple(fbo_ping, 0);
  421. fbo_back->Unbind();
  422. // save previous fbo
  423. fbo_ping->Bind();
  424. shader_remanency->Bind();
  425. shader_remanency->SetTexture(shader_remanency_source, fbo_front->GetTexture(), 0);
  426. shader_remanency->SetTexture(shader_remanency_buffer, fbo_buffer->GetTexture(), 1);
  427. shader_remanency->SetUniform(shader_remanency_mix, buffer);
  428. fs_quad();
  429. shader_remanency->Unbind();
  430. fbo_ping->Unbind();
  431. // shader simple
  432. fbo_buffer->Bind();
  433. draw_shader_simple(fbo_ping, 0);
  434. fbo_buffer->Unbind();
  435. }
  436. // shader glow
  437. if (m_shader_fx && m_shader_glow)
  438. {
  439. // shader blur horizontal
  440. fbo_blur_h->Bind();
  441. shader_blur_h->Bind();
  442. shader_blur_h->SetTexture(shader_blur_h_texture, fbo_back->GetTexture(), 0);
  443. shader_blur_h->SetUniform(shader_blur_h_radius, glow_large / screen_size.x);
  444. fs_quad();
  445. shader_blur_h->Unbind();
  446. fbo_blur_h->Unbind();
  447. // shader blur vertical
  448. fbo_blur_v->Bind();
  449. shader_blur_v->Bind();
  450. shader_blur_v->SetTexture(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
  451. shader_blur_v->SetUniform(shader_blur_v_radius, glow_large / screen_size.y);
  452. fs_quad();
  453. shader_blur_v->Unbind();
  454. fbo_blur_v->Unbind();
  455. // shader blur horizontal
  456. fbo_blur_h->Bind();
  457. shader_blur_h->Bind();
  458. shader_blur_h->SetTexture(shader_blur_h_texture, fbo_blur_v->GetTexture(), 0);
  459. shader_blur_h->SetUniform(shader_blur_h_radius, glow_small / screen_size.x);
  460. fs_quad();
  461. shader_blur_h->Unbind();
  462. fbo_blur_h->Unbind();
  463. // shader blur vertical
  464. fbo_blur_v->Bind();
  465. shader_blur_v->Bind();
  466. shader_blur_v->SetTexture(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
  467. shader_blur_v->SetUniform(shader_blur_v_radius, glow_small / screen_size.y);
  468. fs_quad();
  469. shader_blur_v->Unbind();
  470. fbo_blur_v->Unbind();
  471. // shader glow
  472. fbo_front->Bind();
  473. shader_glow->Bind();
  474. shader_glow->SetTexture(shader_glow_glow, fbo_blur_v->GetTexture(), 0);
  475. shader_glow->SetTexture(shader_glow_source, fbo_back->GetTexture(), 1);
  476. shader_glow->SetUniform(shader_glow_mix, glow_mix);
  477. fs_quad();
  478. shader_glow->Unbind();
  479. fbo_front->Unbind();
  480. }
  481. else
  482. {
  483. // shader simple
  484. fbo_front->Bind();
  485. draw_shader_simple(fbo_back, 0);
  486. fbo_front->Unbind();
  487. }
  488. if (m_shader_fx && m_shader_blur)
  489. {
  490. // shader blur horizontal
  491. fbo_ping->Bind();
  492. shader_blur_h->Bind();
  493. shader_blur_h->SetTexture(shader_blur_h_texture, fbo_front->GetTexture(), 0);
  494. shader_blur_h->SetUniform(shader_blur_h_radius, blur / screen_size.x);
  495. fs_quad();
  496. shader_blur_h->Unbind();
  497. fbo_ping->Unbind();
  498. // shader blur vertical
  499. fbo_front->Bind();
  500. shader_blur_v->Bind();
  501. shader_blur_v->SetTexture(shader_blur_v_texture, fbo_ping->GetTexture(), 0);
  502. shader_blur_v->SetUniform(shader_blur_v_radius, blur / screen_size.y);
  503. fs_quad();
  504. shader_blur_v->Unbind();
  505. fbo_front->Unbind();
  506. }
  507. if (m_shader_postfx)
  508. {
  509. // shader postfx
  510. shader_postfx->Bind();
  511. shader_postfx->SetTexture(shader_postfx_texture, fbo_front->GetTexture(), 0);
  512. shader_postfx->SetUniform(shader_postfx_screen_size, (vec2)screen_size);
  513. shader_postfx->SetUniform(shader_postfx_time, fx_angle);
  514. shader_postfx->SetUniform(shader_postfx_deform, postfx_deform);
  515. shader_postfx->SetUniform(shader_postfx_filter, postfx_filter);
  516. shader_postfx->SetUniform(shader_postfx_retrace, postfx_retrace);
  517. shader_postfx->SetUniform(shader_postfx_offset, postfx_offset);
  518. shader_postfx->SetUniform(shader_postfx_noise, postfx_noise);
  519. shader_postfx->SetUniform(shader_postfx_aberration, postfx_aberration);
  520. shader_postfx->SetUniform(shader_postfx_moire, postfx_moire);
  521. shader_postfx->SetUniform(shader_postfx_moire_h, postfx_moire_h);
  522. shader_postfx->SetUniform(shader_postfx_moire_v, postfx_moire_v);
  523. shader_postfx->SetUniform(shader_postfx_scanline, postfx_scanline);
  524. shader_postfx->SetUniform(shader_postfx_scanline_h, postfx_scanline_h);
  525. shader_postfx->SetUniform(shader_postfx_scanline_v, postfx_scanline_v);
  526. shader_postfx->SetUniform(shader_postfx_smoothstep, postfx_smoothstep);
  527. shader_postfx->SetUniform(shader_postfx_flash, flash_value);
  528. shader_postfx->SetUniform(shader_postfx_sync, (float)fabs(beat_value*cosf((main_angle-beat_angle)*8.0f)));
  529. fs_quad();
  530. shader_postfx->Unbind();
  531. }
  532. else
  533. {
  534. // shader simple
  535. draw_shader_simple(fbo_front, 0);
  536. }
  537. glDisableClientState(GL_VERTEX_ARRAY);
  538. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  539. }
  540. Render::~Render()
  541. {
  542. }