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.
 
 
 
 
 

1032 lines
35 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_remanency;
  29. extern char const *lolfx_blurh;
  30. extern char const *lolfx_blurv;
  31. extern char const *lolfx_glow;
  32. extern char const *lolfx_radial;
  33. extern char const *lolfx_noise;
  34. extern char const *lolfx_postfx;
  35. #define PID M_PI/180.0f // pi ratio
  36. #define CR 1.0f/256.0f // color 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 = CR * vec3(32, 32, 32); // 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 = 1.5f; // 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.3f,0.7f); // remanency [source mix,buffer mix]
  81. vec2 glow_mix(0.6f,0.4f); // glow mix [source mix,glow mix]
  82. vec2 glow_large(2.0f,2.0f); // large glow radius [center,corner]
  83. vec2 glow_small(1.0f,1.0f); // small glow radius [center,corner]
  84. vec2 blur(0.25f,0.5f); // glow radius [center,corner]
  85. vec2 noise_offset(1.5f,1.5f); // random line [horizontal,vertical]
  86. float noise_noise = 0.15f; // noise
  87. vec3 noise_retrace(0.02f,1.0f,0.5f); // retrace [strength,length,speed]
  88. vec2 postfx_deform(0.7f,0.54f); // deformation [ratio,zoom]
  89. vec3 postfx_filter(0.8f,0.9f,0.4f); // color filter [red,green,blue]
  90. vec3 postfx_color(1.8f,1.5f,0.5f); // color modifier [brightness,contrast,grayscale]
  91. vec2 postfx_corner(0.75f,0.95f); // corner [radius,blur]
  92. float postfx_vignetting = -0.5f; // vignetting strength
  93. vec4 postfx_ghost1(0.01f,0.0f,0.1f,-0.4f); // ghost picture 1 [position x,position y,position z,strength]
  94. vec4 postfx_ghost2(0.02f,0.0f,0.1f,0.4f); // ghost picture 2 [position x,position y,position z,strength]
  95. float postfx_aberration = 4.0f; // chromatic aberration
  96. vec4 postfx_moire_h(0.75f,-0.25f,0.0f,1.0f); // vertical moire [base,variable,repeat x,repeat y]
  97. vec4 postfx_moire_v(0.75f,-0.25f,1.0f,1.5f); // horizontal moire [base,variable,repeat x,repeat y]
  98. vec4 postfx_scanline_h(0.75f, 0.25f,0.0f,2.0f); // vertical scanline [base,variable,repeat x,repeat y]
  99. vec4 postfx_scanline_v(0.75f,-0.25f,2.0f,0.0f); // horizontal scanline [base,variable,repeat x,repeat y]
  100. /* window variable */
  101. ivec2 border; // border width
  102. /* text variable */
  103. ivec2 ratio_2d(2,4); // 2d ratio
  104. ivec2 map_size(256,256); // texture map size
  105. ivec2 font_size(8,8); // font size
  106. ivec2 canvas_char(0,0); // canvas char number
  107. ivec2 canvas_size(0,0); // caca size
  108. /* setup variable */
  109. bool setup_switch = false; // switch [option/item]
  110. int setup_option = 0; // selected option
  111. int setup_option_n = 10; // option number
  112. int setup_item = 0; // selected item
  113. int setup_item_n = 8; // item number
  114. int setup_item_key = 0; // item array key
  115. int setup_n = 0; // contextual option/item number
  116. ivec2 setup_p(1,1); // position [x,y]
  117. ivec3 setup_size(30,0,12); // size [w,h,split]
  118. ivec2 setup_color(0x678,0x234); // color [foreground,background]
  119. //vec3 radial(2.0f,0.8f,0); // radial [mix,strength,color mode]
  120. char const *setup_text[] = {
  121. "theme",
  122. "default",
  123. "ye olde monitor",
  124. "green screen",
  125. "",
  126. "",
  127. "",
  128. "",
  129. "",
  130. "remanency",
  131. "enable",
  132. "buffer new frame",
  133. "buffer old frame",
  134. "source mix",
  135. "buffer mix",
  136. "",
  137. "",
  138. "",
  139. "glow",
  140. "enable",
  141. "source mix",
  142. "glow mix",
  143. "large center",
  144. "large corner",
  145. "small center",
  146. "small corner",
  147. "",
  148. "blur",
  149. "enable",
  150. "blur center",
  151. "blur corner",
  152. "",
  153. "",
  154. "",
  155. "",
  156. "",
  157. "screen",
  158. "enable",
  159. "deform ratio",
  160. "zoom base",
  161. "corner radius",
  162. "corner blur",
  163. "vignetting",
  164. "",
  165. "",
  166. "color",
  167. "filter red",
  168. "filter green",
  169. "filter blue",
  170. "brightness",
  171. "contrast",
  172. "grayscale",
  173. "aberration",
  174. "",
  175. "noise",
  176. "enable",
  177. "offset h",
  178. "offset v",
  179. "noise",
  180. "retrace strength",
  181. "retrace length",
  182. "retrace speed",
  183. "",
  184. "ghost",
  185. "back x",
  186. "back y",
  187. "back z",
  188. "back strength",
  189. "front x",
  190. "front y",
  191. "front z",
  192. "front strength",
  193. "moire",
  194. "h base",
  195. "h variable",
  196. "h repeat x",
  197. "h repeat y",
  198. "v base",
  199. "v variable",
  200. "v repeat x",
  201. "v repeat y",
  202. "scanline",
  203. "h base",
  204. "h variable",
  205. "h repeat x",
  206. "h repeat y",
  207. "v base",
  208. "v variable",
  209. "v repeat x",
  210. "v repeat y"
  211. };
  212. vec4 setup_var[]={ // setup variable [start,end,step,value]
  213. vec4(0), /* theme */
  214. vec4(0),
  215. vec4(0),
  216. vec4(0),
  217. vec4(0),
  218. vec4(0),
  219. vec4(0),
  220. vec4(0),
  221. vec4(0),
  222. vec4(0), /* remanency */
  223. vec4(0, 1, 1, 1),
  224. vec4(0.0f, 1.0f, 0.1f, buffer.x),
  225. vec4(0.0f, 1.0f, 0.1f, buffer.y),
  226. vec4(0.0f, 1.0f, 0.1f, remanency.x),
  227. vec4(0.0f, 1.0f, 0.1f, remanency.y),
  228. vec4(0),
  229. vec4(0),
  230. vec4(0),
  231. vec4(0), /* glow */
  232. vec4(0, 1, 1, 1),
  233. vec4(0.0f, 1.0f, 0.1f, glow_mix.x),
  234. vec4(0.0f, 1.0f, 0.1f, glow_mix.y),
  235. vec4(0.0f, 4.0f, 0.1f, glow_large.x),
  236. vec4(0.0f, 4.0f, 0.1f, glow_large.y),
  237. vec4(0.0f, 2.0f, 0.1f, glow_small.x),
  238. vec4(0.0f, 2.0f, 0.1f, glow_small.y),
  239. vec4(0),
  240. vec4(0), /* blur */
  241. vec4(0, 1, 1, 1),
  242. vec4(0.0f, 2.0f, 0.05f, blur.x),
  243. vec4(0.0f, 2.0f, 0.05f, blur.y),
  244. vec4(0),
  245. vec4(0),
  246. vec4(0),
  247. vec4(0),
  248. vec4(0),
  249. vec4(0), /* screen */
  250. vec4( 0, 1, 1, 1),
  251. vec4( 0.0f, 1.0f, 0.05f, postfx_deform.x),
  252. vec4( 0.5f, 0.7f, 0.01f, postfx_deform.y),
  253. vec4( 0.0f, 1.0f, 0.05f, postfx_corner.x),
  254. vec4( 0.0f, 1.0f, 0.05f, postfx_corner.y),
  255. vec4(-1.0f, 1.0f, 0.10f, postfx_vignetting),
  256. vec4(0),
  257. vec4(0),
  258. vec4(0), /* color */
  259. vec4(0.0f, 1.0f, 0.1f, postfx_filter.x),
  260. vec4(0.0f, 1.0f, 0.1f, postfx_filter.y),
  261. vec4(0.0f, 1.0f, 0.1f, postfx_filter.z),
  262. vec4(0.0f, 4.0f, 0.1f, postfx_color.x),
  263. vec4(0.0f, 4.0f, 0.1f, postfx_color.y),
  264. vec4(0.0f, 1.5f, 0.1f, postfx_color.z),
  265. vec4(0.0f, 8.0f, 0.5f, postfx_aberration),
  266. vec4(0),
  267. vec4(0), /* noise */
  268. vec4( 0, 1, 1, 1),
  269. vec4(0.0f, 4.0f, 0.50f, noise_offset.x),
  270. vec4(0.0f, 4.0f, 0.50f, noise_offset.y),
  271. vec4(0.0f, 0.5f, 0.25f, noise_noise),
  272. vec4(0.0f, 0.2f, 0.01f, noise_retrace.x),
  273. vec4(0.0f, 8.0f, 0.50f, noise_retrace.y),
  274. vec4(0.0f, 4.0f, 0.25f, noise_retrace.z),
  275. vec4(0),
  276. vec4(0), /* ghost */
  277. vec4(-0.5f, 0.5f, 0.01f, postfx_ghost1.x),
  278. vec4(-0.5f, 0.5f, 0.01f, postfx_ghost1.y),
  279. vec4(-2.0f, 2.0f, 0.10f, postfx_ghost1.z),
  280. vec4(-1.0f, 1.0f, 0.05f, postfx_ghost1.w),
  281. vec4(-0.5f, 0.5f, 0.01f, postfx_ghost2.x),
  282. vec4(-0.5f, 0.5f, 0.01f, postfx_ghost2.y),
  283. vec4(-2.0f, 2.0f, 0.10f, postfx_ghost2.z),
  284. vec4(-1.0f, 1.0f, 0.05f, postfx_ghost2.w),
  285. vec4(0), /* moire */
  286. vec4( 0.5f, 1.0f, 0.05f, postfx_moire_h.x),
  287. vec4(-0.5f, 0.5f, 0.05f, postfx_moire_h.y),
  288. vec4( 0.0f, 4.0f, 0.50f, postfx_moire_h.z),
  289. vec4( 0.0f, 4.0f, 0.50f, postfx_moire_h.w),
  290. vec4( 0.5f, 1.0f, 0.05f, postfx_moire_v.x),
  291. vec4(-0.5f, 0.5f, 0.05f, postfx_moire_v.y),
  292. vec4( 0.0f, 4.0f, 0.50f, postfx_moire_v.z),
  293. vec4( 0.0f, 4.0f, 0.50f, postfx_moire_v.w),
  294. vec4(0), /* scanline */
  295. vec4( 0.5f, 1.0f, 0.05f, postfx_scanline_h.x),
  296. vec4(-0.5f, 0.5f, 0.05f, postfx_scanline_h.y),
  297. vec4( 0.0f, 4.0f, 0.50f, postfx_scanline_h.z),
  298. vec4( 0.0f, 4.0f, 0.50f, postfx_scanline_h.w),
  299. vec4( 0.5f, 1.0f, 0.05f, postfx_scanline_v.x),
  300. vec4(-0.5f, 0.5f, 0.05f, postfx_scanline_v.y),
  301. vec4( 0.0f, 4.0f, 0.50f, postfx_scanline_v.z),
  302. vec4( 0.0f, 4.0f, 0.50f, postfx_scanline_v.w),
  303. vec4(0)
  304. };
  305. void Render::UpdateVar()
  306. {
  307. int k = 1; /* theme */
  308. k += 9; /* remanency */
  309. m_shader_remanency = (setup_var[k].w == 1) ? true : false; k++;
  310. buffer = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  311. remanency = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  312. k += 4; /* glow */
  313. m_shader_glow = (setup_var[k].w == 1) ? true : false; k++;
  314. glow_mix = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  315. glow_large = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  316. glow_small = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  317. k += 2; /* blur */
  318. m_shader_blur = (setup_var[k].w == 1) ? true : false; k++;
  319. blur = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  320. k += 6; /* screen */
  321. m_shader_postfx = (setup_var[k].w == 1) ? true : false; k++;
  322. postfx_deform = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  323. postfx_corner = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  324. postfx_vignetting = setup_var[k].w; k++;
  325. k += 3; /* color */
  326. postfx_filter = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
  327. postfx_color = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
  328. postfx_aberration = setup_var[k].w; k++;
  329. k += 2; /* noise */
  330. m_shader_noise = (setup_var[k].w == 1) ? true : false; k++;
  331. noise_offset = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
  332. noise_noise = setup_var[k].w; k++;
  333. noise_retrace = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
  334. k += 2; /* ghost */
  335. postfx_ghost1 = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  336. postfx_ghost2 = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
  337. k += 1; /* moire */
  338. 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;
  339. 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;
  340. k++; /* scanline */
  341. 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;
  342. 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;
  343. }
  344. int calc_item_length()
  345. {
  346. int n = !setup_switch ? setup_option_n : setup_item_n;
  347. int v = 0;
  348. for (int i = 0; i < n; i++)
  349. {
  350. int k = !setup_switch ? (i * (setup_item_n + 1)) : (setup_option * (setup_item_n + 1) + 1 + i);
  351. if (setup_text[k] == "") return i - 1;
  352. }
  353. return n - 1;
  354. }
  355. Shader *shader_simple;
  356. Shader *shader_remanency;
  357. Shader *shader_blur_h, *shader_blur_v, *shader_glow, *shader_radial;
  358. Shader *shader_noise, *shader_postfx;
  359. // shader variables
  360. ShaderUniform shader_simple_texture;
  361. ShaderUniform shader_remanency_source,
  362. shader_remanency_buffer,
  363. shader_remanency_mix;
  364. ShaderUniform shader_blur_h_texture,
  365. shader_blur_h_radius,
  366. shader_blur_v_texture,
  367. shader_blur_v_radius;
  368. ShaderUniform shader_glow_glow,
  369. shader_glow_source,
  370. shader_glow_mix;
  371. ShaderUniform shader_radial_texture,
  372. shader_radial_screen_size,
  373. shader_radial_time,
  374. shader_radial_value1,
  375. shader_radial_value2,
  376. shader_radial_color;
  377. ShaderUniform shader_noise_texture,
  378. shader_noise_screen_size,
  379. shader_noise_time,
  380. shader_noise_offset,
  381. shader_noise_noise,
  382. shader_noise_retrace;
  383. ShaderUniform shader_postfx_texture,
  384. shader_postfx_texture_2d,
  385. shader_postfx_screen_size,
  386. shader_postfx_time,
  387. shader_postfx_deform,
  388. shader_postfx_ghost1,
  389. shader_postfx_ghost2,
  390. shader_postfx_filter,
  391. shader_postfx_color,
  392. shader_postfx_corner,
  393. shader_postfx_vignetting,
  394. shader_postfx_aberration,
  395. shader_postfx_moire_h,
  396. shader_postfx_moire_v,
  397. shader_postfx_scanline_h,
  398. shader_postfx_scanline_v,
  399. shader_postfx_flash,
  400. shader_postfx_sync;
  401. FrameBuffer *fbo_back, *fbo_front, *fbo_buffer;
  402. FrameBuffer *fbo_blur_h, *fbo_blur_v, *fbo_ping, *fbo_pong;
  403. TextRender *text_render;
  404. void fs_quad()
  405. {
  406. glLoadIdentity();
  407. glDrawArrays(GL_QUADS, 0, 4);
  408. }
  409. void draw_shader_simple(FrameBuffer *fbo_output, int n)
  410. {
  411. shader_simple->Bind();
  412. shader_simple->SetUniform(shader_simple_texture, fbo_output->GetTexture(), n);
  413. fs_quad();
  414. shader_simple->Unbind();
  415. }
  416. void rectangle(int x, int y, int w, int h)
  417. {
  418. glLoadIdentity();
  419. glBegin(GL_QUADS);
  420. glVertex2i(x+w, y );
  421. glVertex2i(x , y );
  422. glVertex2i(x , y+h);
  423. glVertex2i(x+w, y+h);
  424. glEnd();
  425. }
  426. int Render::InitDraw(void)
  427. {
  428. glDepthMask(GL_TRUE); // do not write z-buffer
  429. glEnable(GL_CULL_FACE); // disable cull face
  430. glCullFace(GL_BACK); // don't draw front face
  431. /* Initialise framebuffer objects */
  432. fbo_back = new FrameBuffer(screen_size);
  433. fbo_front = new FrameBuffer(screen_size);
  434. fbo_buffer = new FrameBuffer(screen_size);
  435. fbo_blur_h = new FrameBuffer(screen_size);
  436. fbo_blur_v = new FrameBuffer(screen_size);
  437. fbo_ping = new FrameBuffer(screen_size);
  438. fbo_pong = new FrameBuffer(screen_size);
  439. // shader simple
  440. shader_simple = Shader::Create(lolfx_simple);
  441. shader_simple_texture = shader_simple->GetUniformLocation("texture");
  442. // shader remanency
  443. shader_remanency = Shader::Create(lolfx_remanency);
  444. shader_remanency_source = shader_remanency->GetUniformLocation("source");
  445. shader_remanency_buffer = shader_remanency->GetUniformLocation("buffer");
  446. shader_remanency_mix = shader_remanency->GetUniformLocation("mix");
  447. // shader glow
  448. shader_glow = Shader::Create(lolfx_glow);
  449. shader_glow_glow = shader_glow->GetUniformLocation("glow");
  450. shader_glow_source = shader_glow->GetUniformLocation("source");
  451. shader_glow_mix = shader_glow->GetUniformLocation("mix");
  452. // shader blur horizontal
  453. shader_blur_h = Shader::Create(lolfx_blurh);
  454. shader_blur_h_texture = shader_blur_h->GetUniformLocation("texture");
  455. shader_blur_h_radius = shader_blur_h->GetUniformLocation("radius");
  456. // shader blur vertical
  457. shader_blur_v = Shader::Create(lolfx_blurv);
  458. shader_blur_v_texture = shader_blur_v->GetUniformLocation("texture");
  459. shader_blur_v_radius = shader_blur_v->GetUniformLocation("radius");
  460. // shader radial
  461. shader_radial = Shader::Create(lolfx_radial);
  462. shader_radial_texture = shader_radial->GetUniformLocation("texture");
  463. shader_radial_screen_size = shader_radial->GetUniformLocation("screen_size");
  464. shader_radial_time = shader_radial->GetUniformLocation("time");
  465. shader_radial_value1 = shader_radial->GetUniformLocation("value1");
  466. shader_radial_value2 = shader_radial->GetUniformLocation("value2");
  467. shader_radial_color = shader_radial->GetUniformLocation("color");
  468. // shader noise
  469. shader_noise = Shader::Create(lolfx_noise);
  470. shader_noise_texture = shader_noise->GetUniformLocation("texture");
  471. shader_noise_screen_size = shader_noise->GetUniformLocation("screen_size");
  472. shader_noise_time = shader_noise->GetUniformLocation("time");
  473. shader_noise_offset = shader_noise->GetUniformLocation("offset");
  474. shader_noise_noise = shader_noise->GetUniformLocation("noise");
  475. shader_noise_retrace = shader_noise->GetUniformLocation("retrace");
  476. // shader postfx
  477. shader_postfx = Shader::Create(lolfx_postfx);
  478. shader_postfx_texture = shader_postfx->GetUniformLocation("texture");
  479. shader_postfx_texture_2d = shader_postfx->GetUniformLocation("texture_2d");
  480. shader_postfx_screen_size = shader_postfx->GetUniformLocation("screen_size");
  481. shader_postfx_time = shader_postfx->GetUniformLocation("time");
  482. shader_postfx_deform = shader_postfx->GetUniformLocation("deform");
  483. shader_postfx_ghost1 = shader_postfx->GetUniformLocation("ghost1");
  484. shader_postfx_ghost2 = shader_postfx->GetUniformLocation("ghost2");
  485. shader_postfx_filter = shader_postfx->GetUniformLocation("filter");
  486. shader_postfx_color = shader_postfx->GetUniformLocation("color");
  487. shader_postfx_corner = shader_postfx->GetUniformLocation("corner");
  488. shader_postfx_vignetting = shader_postfx->GetUniformLocation("vignetting");
  489. shader_postfx_aberration = shader_noise->GetUniformLocation("aberration");
  490. shader_postfx_moire_h = shader_postfx->GetUniformLocation("moire_h");
  491. shader_postfx_moire_v = shader_postfx->GetUniformLocation("moire_v");
  492. shader_postfx_scanline_h = shader_postfx->GetUniformLocation("scanline_h");
  493. shader_postfx_scanline_v = shader_postfx->GetUniformLocation("scanline_v");
  494. shader_postfx_flash = shader_postfx->GetUniformLocation("flash");
  495. shader_postfx_sync = shader_postfx->GetUniformLocation("sync");
  496. return true;
  497. }
  498. int Render::CreateGLWindow()
  499. {
  500. screen_size = Video::GetSize();
  501. border = 18 * ratio_2d;
  502. border.y = border.x; // enabled to get same border everywhere
  503. canvas_char = (screen_size - border * 2) / (font_size * ratio_2d);
  504. canvas_size = canvas_char * font_size * ratio_2d;
  505. border = (screen_size - canvas_size) / 2;
  506. caca_set_canvas_size(m_caca, canvas_char.x, canvas_char.y);
  507. setup_size.y = ((setup_option_n > setup_item_n) ? setup_option_n : setup_item_n) + 1;
  508. setup_p = (canvas_char - setup_size.xy) / 2;
  509. setup_n = calc_item_length();
  510. InitDraw();
  511. return true;
  512. }
  513. Render::Render(caca_canvas_t *caca)
  514. : m_caca(caca),
  515. m_ready(false),
  516. m_pause(false),
  517. m_polygon(true),
  518. m_setup(true),
  519. m_shader(true),
  520. m_shader_remanency(true),
  521. m_shader_glow(true),
  522. m_shader_blur(true),
  523. m_shader_noise(true),
  524. m_shader_postfx(true)
  525. {
  526. text_render = new TextRender(m_caca, font_size);
  527. }
  528. void Render::TickGame(float seconds)
  529. {
  530. Entity::TickGame(seconds);
  531. }
  532. void Render::Pause()
  533. {
  534. m_pause=!m_pause;
  535. }
  536. void Render::TickDraw(float seconds)
  537. {
  538. /* keyboard manager */
  539. if (Input::WasReleased(Key::Escape))
  540. {
  541. Ticker::Shutdown();
  542. }
  543. if (Input::WasPressed(Key::F1))
  544. {
  545. m_setup = !m_setup;
  546. sync_flag = true;
  547. sync_angle = main_angle;
  548. }
  549. if (Input::WasPressed(Key::F2))
  550. {
  551. m_polygon = !m_polygon;
  552. polygon_fillmode = (m_polygon)?GL_FILL:GL_LINE;
  553. glPolygonMode(GL_FRONT, polygon_fillmode);
  554. }
  555. if (Input::WasPressed(Key::Tab))
  556. {
  557. if (m_setup)
  558. {
  559. setup_switch = !setup_switch;
  560. setup_n = calc_item_length();
  561. }
  562. }
  563. if (Input::WasPressed(Key::Up))
  564. {
  565. if (m_setup)
  566. {
  567. if (!setup_switch)
  568. {
  569. setup_option--;
  570. if (setup_option < 0) setup_option = setup_n;
  571. setup_item = 0;
  572. }
  573. else
  574. {
  575. setup_item--;
  576. if (setup_item < 0) setup_item = setup_n;
  577. }
  578. }
  579. }
  580. if (Input::WasPressed(Key::Down))
  581. {
  582. if (m_setup)
  583. {
  584. if (!setup_switch)
  585. {
  586. setup_option++;
  587. if (setup_option > setup_n) setup_option = 0;
  588. setup_item = 0;
  589. }
  590. else
  591. {
  592. setup_item++;
  593. if (setup_item > setup_n) setup_item = 0;
  594. }
  595. }
  596. }
  597. if (Input::WasPressed(Key::PageUp))
  598. {
  599. if (m_setup)
  600. {
  601. if (!setup_switch)
  602. {
  603. setup_option = 0;
  604. }
  605. else
  606. {
  607. setup_item = 0;
  608. }
  609. }
  610. }
  611. if (Input::WasPressed(Key::PageDown))
  612. {
  613. if (m_setup)
  614. {
  615. if (!setup_switch)
  616. {
  617. setup_option = setup_n;
  618. setup_item = 0;
  619. }
  620. else
  621. {
  622. setup_item = setup_n;
  623. }
  624. }
  625. }
  626. if (Input::WasPressed(Key::Left))
  627. {
  628. if (m_setup && setup_switch)
  629. {
  630. setup_var[setup_item_key].w -= setup_var[setup_item_key].z;
  631. 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;
  632. Render::UpdateVar();
  633. }
  634. }
  635. if (Input::WasPressed(Key::Right))
  636. {
  637. if (m_setup && setup_switch)
  638. {
  639. setup_var[setup_item_key].w += setup_var[setup_item_key].z;
  640. 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;
  641. Render::UpdateVar();
  642. }
  643. }
  644. if (Input::WasPressed(Key::Home))
  645. {
  646. if (m_setup && setup_switch)
  647. {
  648. setup_var[setup_item_key].w = setup_var[setup_item_key].x;
  649. Render::UpdateVar();
  650. }
  651. }
  652. if (Input::WasPressed(Key::End))
  653. {
  654. if (m_setup && setup_switch)
  655. {
  656. setup_var[setup_item_key].w = setup_var[setup_item_key].y;
  657. Render::UpdateVar();
  658. }
  659. }
  660. if (Input::WasPressed(Key::Return))
  661. {
  662. fade_flag = true;
  663. fade_angle = main_angle;
  664. }
  665. Entity::TickDraw(seconds);
  666. if (!m_ready)
  667. {
  668. CreateGLWindow();
  669. text_render->Init();
  670. m_ready = true;
  671. }
  672. // timer
  673. if (!m_pause)
  674. {
  675. timer += seconds;
  676. main_angle = timer * 100.0f * PID;
  677. }
  678. if (sync_flag)
  679. {
  680. angle=(main_angle-sync_angle)*sync_speed;
  681. sync_value=1.0f-sinf(angle);
  682. if (angle>90.0f*PID)
  683. {
  684. sync_value=0;
  685. sync_flag=false;
  686. }
  687. }
  688. if (beat_flag)
  689. {
  690. angle=(main_angle-beat_angle)*beat_speed;
  691. beat_value=1.0f-sinf(angle);
  692. if (angle>90.0f*PID)
  693. {
  694. beat_value=0;
  695. beat_flag=false;
  696. }
  697. }
  698. if (flash_flag)
  699. {
  700. angle=(main_angle-flash_angle)*flash_speed;
  701. flash_value=1.0f-sinf(angle);
  702. if (angle>90.0f*PID)
  703. {
  704. flash_value=0;
  705. flash_flag=false;
  706. }
  707. }
  708. if (fade_flag)
  709. {
  710. angle=(main_angle-fade_angle)*fade_speed;
  711. fade_value=1.0f-sinf(angle);
  712. if (angle>90.0f*PID)
  713. {
  714. fade_value=0;
  715. fade_flag=false;
  716. }
  717. }
  718. /* draw setup */
  719. if (m_setup)
  720. {
  721. /* background */
  722. caca_set_color_argb(m_caca, setup_color.x, setup_color.y);
  723. caca_fill_box(m_caca, setup_p.x, setup_p.y, setup_size.x + 1, setup_size.y,' ');
  724. 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,'|');
  725. /* title */
  726. caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
  727. caca_draw_line(m_caca, setup_p.x, setup_p.y, setup_p.x + setup_size.x, setup_p.y,' ');
  728. caca_put_str(m_caca, setup_p.x + setup_size.x / 2 - 3, setup_p.y, "SETUP");
  729. /* display option */
  730. for (int i = 0; i < setup_option_n; i++)
  731. {
  732. int y = setup_p.y + 1 + i;
  733. int k = i * (setup_item_n + 1);
  734. if (setup_option != i || setup_switch)
  735. {
  736. caca_set_color_argb(m_caca, setup_color.x, setup_color.y);
  737. caca_put_str(m_caca, setup_p.x + 1, y, setup_text[k]);
  738. }
  739. else
  740. {
  741. caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
  742. caca_draw_line(m_caca, setup_p.x, y, setup_p.x + setup_size.z - 2, y,' ');
  743. caca_put_str(m_caca, setup_p.x + 1, y, setup_text[k]);
  744. }
  745. }
  746. /* display item */
  747. for (int i = 0; i < setup_item_n; i++)
  748. {
  749. int y = setup_p.y + 1 + i;
  750. int k = setup_option * (setup_item_n + 1) + 1 + i;
  751. if (setup_item != i || !setup_switch)
  752. {
  753. caca_set_color_argb(m_caca, setup_color.x, setup_color.y);
  754. caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k]);
  755. }
  756. else
  757. {
  758. caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
  759. caca_draw_line(m_caca, setup_p.x + setup_size.z, y, setup_p.x + setup_size.x, y,' ');
  760. caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k]);
  761. }
  762. }
  763. /* display variable */
  764. int y = setup_p.y + setup_size.y;
  765. setup_item_key = setup_option * (setup_item_n + 1) + 1 + setup_item;
  766. caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
  767. caca_draw_line(m_caca, setup_p.x, y, setup_p.x + setup_size.x, y,' ');
  768. if (setup_switch)
  769. {
  770. int x = setup_p.x + 1;
  771. int w = setup_size.x - 3 - 4;
  772. int bar_w = w / (setup_var[setup_item_key].y - setup_var[setup_item_key].x);
  773. int bar_x = bar_w * setup_var[setup_item_key].x;
  774. if ((setup_var[setup_item_key].y - setup_var[setup_item_key].x) / setup_var[setup_item_key].z > 2)
  775. {
  776. caca_printf(m_caca, setup_p.x + setup_size.x - 4, y, "%4.2f", setup_var[setup_item_key].w);
  777. caca_draw_line(m_caca, x, y, x - bar_x + bar_w * setup_var[setup_item_key].y, y,'.');
  778. 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');
  779. }
  780. else
  781. {
  782. 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");
  783. }
  784. }
  785. }
  786. Draw2D();
  787. Draw3D();
  788. }
  789. void Render::Draw2D()
  790. {
  791. /* Draw text in an offline buffer */
  792. text_render->Render();
  793. if (m_shader)
  794. fbo_back->Bind();
  795. glViewport(0, 0, screen_size.x, screen_size.y);
  796. /* Clear the back buffer */
  797. glEnable(GL_BLEND);
  798. glBlendFunc(GL_SRC_COLOR, GL_DST_ALPHA);
  799. Video::SetClearColor(vec4(screen_color, 1.f));
  800. Video::SetClearDepth(1.0f); // set depth buffer
  801. Video::Clear(ClearMask::Color | ClearMask::Depth);
  802. text_render->Blit(border, canvas_size);
  803. //if (m_polygon) glEnable(GL_LINE_SMOOTH); else glDisable(GL_LINE_SMOOTH);
  804. glLineWidth((m_polygon)?2.0f:1.0f);
  805. fx_angle=main_angle-part_angle;
  806. if (m_polygon)
  807. glEnable(GL_TEXTURE_2D);
  808. glMatrixMode(GL_PROJECTION);
  809. mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f);
  810. glLoadMatrixf(&m[0][0]);
  811. glMatrixMode(GL_MODELVIEW);
  812. }
  813. void Render::Draw3D()
  814. {
  815. if (!m_shader)
  816. return;
  817. glDisable(GL_DEPTH_TEST);
  818. glDisable(GL_BLEND);
  819. glEnableClientState(GL_VERTEX_ARRAY);
  820. glVertexPointer(4, GL_FLOAT, 0, fs_quad_vtx);
  821. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  822. glTexCoordPointer(2, GL_FLOAT, 0, fs_quad_tex);
  823. if (m_shader_remanency)
  824. {
  825. // shader remanency
  826. fbo_ping->Bind();
  827. shader_remanency->Bind();
  828. shader_remanency->SetUniform(shader_remanency_source, fbo_back->GetTexture(), 0);
  829. shader_remanency->SetUniform(shader_remanency_buffer, fbo_buffer->GetTexture(), 1);
  830. shader_remanency->SetUniform(shader_remanency_mix, remanency);
  831. fs_quad();
  832. shader_remanency->Unbind();
  833. fbo_ping->Unbind();
  834. // shader simple
  835. fbo_back->Bind();
  836. draw_shader_simple(fbo_ping, 0);
  837. fbo_back->Unbind();
  838. // save previous fbo
  839. fbo_ping->Bind();
  840. shader_remanency->Bind();
  841. shader_remanency->SetUniform(shader_remanency_source, fbo_front->GetTexture(), 0);
  842. shader_remanency->SetUniform(shader_remanency_buffer, fbo_buffer->GetTexture(), 1);
  843. shader_remanency->SetUniform(shader_remanency_mix, buffer);
  844. fs_quad();
  845. shader_remanency->Unbind();
  846. fbo_ping->Unbind();
  847. // shader simple
  848. fbo_buffer->Bind();
  849. draw_shader_simple(fbo_ping, 0);
  850. fbo_buffer->Unbind();
  851. }
  852. // shader glow
  853. if (m_shader_glow)
  854. {
  855. // shader blur horizontal
  856. fbo_blur_h->Bind();
  857. shader_blur_h->Bind();
  858. shader_blur_h->SetUniform(shader_blur_h_texture, fbo_back->GetTexture(), 0);
  859. shader_blur_h->SetUniform(shader_blur_h_radius, glow_large / screen_size.x);
  860. fs_quad();
  861. shader_blur_h->Unbind();
  862. fbo_blur_h->Unbind();
  863. // shader blur vertical
  864. fbo_blur_v->Bind();
  865. shader_blur_v->Bind();
  866. shader_blur_v->SetUniform(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
  867. shader_blur_v->SetUniform(shader_blur_v_radius, glow_large / screen_size.y);
  868. fs_quad();
  869. shader_blur_v->Unbind();
  870. fbo_blur_v->Unbind();
  871. // shader blur horizontal
  872. fbo_blur_h->Bind();
  873. shader_blur_h->Bind();
  874. shader_blur_h->SetUniform(shader_blur_h_texture, fbo_blur_v->GetTexture(), 0);
  875. shader_blur_h->SetUniform(shader_blur_h_radius, glow_small / screen_size.x);
  876. fs_quad();
  877. shader_blur_h->Unbind();
  878. fbo_blur_h->Unbind();
  879. // shader blur vertical
  880. fbo_blur_v->Bind();
  881. shader_blur_v->Bind();
  882. shader_blur_v->SetUniform(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
  883. shader_blur_v->SetUniform(shader_blur_v_radius, glow_small / screen_size.y);
  884. fs_quad();
  885. shader_blur_v->Unbind();
  886. fbo_blur_v->Unbind();
  887. // shader glow
  888. fbo_front->Bind();
  889. shader_glow->Bind();
  890. shader_glow->SetUniform(shader_glow_glow, fbo_blur_v->GetTexture(), 0);
  891. shader_glow->SetUniform(shader_glow_source, fbo_back->GetTexture(), 1);
  892. shader_glow->SetUniform(shader_glow_mix, glow_mix);
  893. fs_quad();
  894. shader_glow->Unbind();
  895. fbo_front->Unbind();
  896. }
  897. else
  898. {
  899. // shader simple
  900. fbo_front->Bind();
  901. draw_shader_simple(fbo_back, 0);
  902. fbo_front->Unbind();
  903. }
  904. if (m_shader_blur)
  905. {
  906. // shader blur horizontal
  907. fbo_ping->Bind();
  908. shader_blur_h->Bind();
  909. shader_blur_h->SetUniform(shader_blur_h_texture, fbo_front->GetTexture(), 0);
  910. shader_blur_h->SetUniform(shader_blur_h_radius, blur / screen_size.x);
  911. fs_quad();
  912. shader_blur_h->Unbind();
  913. fbo_ping->Unbind();
  914. // shader blur vertical
  915. fbo_front->Bind();
  916. shader_blur_v->Bind();
  917. shader_blur_v->SetUniform(shader_blur_v_texture, fbo_ping->GetTexture(), 0);
  918. shader_blur_v->SetUniform(shader_blur_v_radius, blur / screen_size.y);
  919. fs_quad();
  920. shader_blur_v->Unbind();
  921. fbo_front->Unbind();
  922. }
  923. if (m_shader_noise)
  924. {
  925. // shader noise
  926. fbo_ping->Bind();
  927. shader_noise->Bind();
  928. shader_noise->SetUniform(shader_noise_texture, fbo_front->GetTexture(), 0);
  929. shader_noise->SetUniform(shader_noise_screen_size, (vec2)screen_size);
  930. shader_noise->SetUniform(shader_noise_time, fx_angle);
  931. shader_noise->SetUniform(shader_noise_offset, noise_offset);
  932. shader_noise->SetUniform(shader_noise_noise, noise_noise);
  933. shader_noise->SetUniform(shader_noise_retrace, noise_retrace);
  934. fs_quad();
  935. shader_noise->Unbind();
  936. fbo_ping->Unbind();
  937. // shader simple
  938. fbo_front->Bind();
  939. draw_shader_simple(fbo_ping, 0);
  940. fbo_front->Unbind();
  941. }
  942. if (m_shader_postfx)
  943. {
  944. // shader postfx
  945. shader_postfx->Bind();
  946. shader_postfx->SetUniform(shader_postfx_texture, fbo_front->GetTexture(), 0);
  947. shader_postfx->SetUniform(shader_postfx_screen_size, (vec2)screen_size);
  948. shader_postfx->SetUniform(shader_postfx_time, fx_angle);
  949. shader_postfx->SetUniform(shader_postfx_deform, postfx_deform);
  950. shader_postfx->SetUniform(shader_postfx_ghost1, postfx_ghost1);
  951. shader_postfx->SetUniform(shader_postfx_ghost2, postfx_ghost2);
  952. shader_postfx->SetUniform(shader_postfx_filter, postfx_filter);
  953. shader_postfx->SetUniform(shader_postfx_color, postfx_color);
  954. shader_postfx->SetUniform(shader_postfx_corner, postfx_corner);
  955. shader_postfx->SetUniform(shader_postfx_vignetting, postfx_vignetting);
  956. shader_postfx->SetUniform(shader_postfx_aberration, postfx_aberration);
  957. shader_postfx->SetUniform(shader_postfx_moire_h, postfx_moire_h);
  958. shader_postfx->SetUniform(shader_postfx_moire_v, postfx_moire_v);
  959. shader_postfx->SetUniform(shader_postfx_scanline_h, postfx_scanline_h);
  960. shader_postfx->SetUniform(shader_postfx_scanline_v, postfx_scanline_v);
  961. shader_postfx->SetUniform(shader_postfx_flash, flash_value);
  962. shader_postfx->SetUniform(shader_postfx_sync, (float)fabs(sync_value*cosf((main_angle-sync_angle)*6.0f)));
  963. fs_quad();
  964. shader_postfx->Unbind();
  965. }
  966. else
  967. {
  968. // shader simple
  969. draw_shader_simple(fbo_front, 0);
  970. }
  971. glDisableClientState(GL_VERTEX_ARRAY);
  972. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  973. }
  974. Render::~Render()
  975. {
  976. }