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

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

NEERCS: added copper in setup (not working yet)

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