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

Last change on this file since 1978 was 1978, checked in by rez, 8 years ago

neercs: minors debug (and some bugs added)

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