source: trunk/tools/neercs/video/render.cpp @ 2000

Last change on this file since 2000 was 2000, checked in by sam, 8 years ago

neercs: add missing "loldebug.h" include.

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