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

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

NEERCS: copper is working again!

File size: 43.0 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.75f,0.25f,2.0f,0.40f);  // 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        "color repeat",
230        "copper height",
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(1.0f, 5.0f, 0.10f, copper.z),
332        vec4(0.0f, 1.0f, 0.05f, 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 LOLCUBE */
586    caca_set_color_argb(m_caca, 0xfff, 0x000);
587    caca_put_str(m_caca, canvas_char.x -  8, canvas_char.y - 6, "_______");
588    caca_put_str(m_caca, canvas_char.x -  9, canvas_char.y - 5, "/      /|");
589    caca_put_str(m_caca, canvas_char.x - 10, canvas_char.y - 4, "/______/ |");
590    caca_put_str(m_caca, canvas_char.x - 10, canvas_char.y - 3, "|      | |");
591    caca_put_str(m_caca, canvas_char.x - 10, canvas_char.y - 2, "|  :D  | /");
592    caca_put_str(m_caca, canvas_char.x - 10, canvas_char.y - 1, "|______|/");
593
594    /* draw setup */
595    if (m_setup)
596    {
597        /* background */
598        caca_set_color_argb(m_caca, setup_color.x, setup_color.y);
599        caca_fill_box(m_caca, setup_p.x, setup_p.y, setup_size.x + 1, setup_size.y,' ');
600        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,'|');
601        /* title */
602        caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
603        caca_draw_line(m_caca, setup_p.x, setup_p.y, setup_p.x + setup_size.x, setup_p.y,' ');
604        caca_put_str(m_caca, setup_p.x + setup_size.x / 2 - 3, setup_p.y, "SETUP");
605        /* display option */
606        for (int i = 0; i < setup_h; i++)
607        {
608            int y = setup_p.y + 1 + i;
609            int k = (setup_option_p + i) * (setup_item_n + 1);
610            if (setup_option_i != setup_option_p + i || setup_switch)
611            {
612                caca_set_color_argb(m_caca, setup_color.x, setup_color.y);
613                caca_put_str(m_caca, setup_p.x + 1, y, setup_text[k]);
614            }
615            else
616            {
617                caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
618                caca_draw_line(m_caca, setup_p.x, y, setup_p.x + setup_size.z - 2, y,' ');
619                caca_put_str(m_caca, setup_p.x + 1, y, setup_text[k]);
620            }
621        }
622        /* display item */
623        for (int i = 0; i < setup_h; i++)
624        {
625            int y = setup_p.y + 1 + i;
626            int k = setup_option_i * (setup_item_n + 1) + 1 + setup_item_p + i;
627            if (setup_item_i != setup_item_p + i || !setup_switch)
628            {
629                caca_set_color_argb(m_caca, setup_color.x, setup_color.y);
630                caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k]);
631            }
632            else
633            {
634                caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
635                caca_draw_line(m_caca, setup_p.x + setup_size.z, y, setup_p.x + setup_size.x, y,' ');
636                caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k]);
637            }
638        }
639        /* display variable */
640        int y = setup_p.y + setup_size.y;
641        setup_item_key = setup_option_i * (setup_item_n + 1) + 1 + setup_item_i;
642        caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
643        caca_draw_line(m_caca, setup_p.x, y, setup_p.x + setup_size.x, y,' ');
644        if (setup_switch)
645        {
646            int x = setup_p.x + 1;
647            int w = setup_size.x - 3 - 4;
648            int bar_w = w / (setup_var[setup_item_key].y - setup_var[setup_item_key].x);
649            int bar_x = bar_w * setup_var[setup_item_key].x;
650            if ((setup_var[setup_item_key].y - setup_var[setup_item_key].x) / setup_var[setup_item_key].z > 1)
651            {
652                /* Work around a bug in libcaca */
653                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);
654                caca_draw_line(m_caca, x, y, x - bar_x + bar_w * setup_var[setup_item_key].y, y,'.');
655                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');
656            }
657            else
658            {
659                if (setup_var[setup_item_key] != vec4(0))
660                {
661                    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");
662                }
663            }
664        }
665        else
666        {
667            caca_printf(m_caca, setup_p.x + 1, y, "%d/%d [%d]", setup_option_i, setup_n, setup_option_p);
668        }
669
670        /* informations */
671        int w = caca_get_canvas_width(m_caca);
672        int h = caca_get_canvas_height(m_caca);
673        caca_set_color_argb(m_caca, 0xfff, 0x000);
674        caca_printf(m_caca, 0, 0, "%i*%i", w, h);
675    }
676
677}
678
679void Render::Pause()
680{
681    m_pause=!m_pause;
682}
683
684void Render::TickDraw(float seconds)
685{
686    /* keyboard manager */
687    if (Input::WasReleased(Key::Escape))
688    {
689        Ticker::Shutdown();
690    }
691    if (Input::WasPressed(Key::F1))
692    {
693        m_setup = !m_setup;
694        if (m_setup) setup_n = calc_item_length();
695        sync_flag = true;
696        sync_angle = main_angle;
697    }
698    if (Input::WasPressed(Key::F2))
699    {
700        m_shader_glow = !m_shader_glow;
701        m_shader_blur = !m_shader_blur;
702        m_shader_remanency = !m_shader_remanency;
703        //m_shader_copper = !m_shader_copper;
704        m_shader_color = !m_shader_color;
705        m_shader_noise = !m_shader_noise;
706        m_shader_postfx = !m_shader_postfx;
707        //m_polygon = !m_polygon;
708        //polygon_fillmode = (m_polygon)?GL_FILL:GL_LINE;
709        //glPolygonMode(GL_FRONT, polygon_fillmode);
710    }
711   if (Input::WasPressed(Key::Tab))
712    {
713        if (m_setup)
714        {
715            setup_switch = !setup_switch;
716            setup_n = calc_item_length();
717            setup_cursor = (!setup_switch?setup_option_i:setup_item_i) - (!setup_switch?setup_option_p:setup_item_p);
718        }
719    }
720    if (Input::WasPressed(Key::Up))
721    {
722        if (m_setup)
723        {
724            if (!setup_switch)
725            {
726                if (setup_cursor > 0)
727                {
728                    setup_cursor--;
729                }
730                else
731                {
732                    if (setup_cursor == 0) setup_option_p--;
733                }
734                if (setup_option_i > 0)
735                {
736                    setup_option_i--;
737                }
738                else
739                {
740                    setup_option_i = setup_option_n - 1;
741                    setup_option_p = setup_option_n - setup_h;
742                    setup_cursor = setup_h - 1;
743                }
744                setup_item_i = 0;
745                setup_item_p = 0;
746            }
747            else
748            {
749                if (setup_cursor > 0)
750                {
751                    setup_cursor--;
752                }
753                else
754                {
755                    if (setup_cursor == 0) setup_item_p--;
756                }
757                if (setup_item_i > 0)
758                {
759                    setup_item_i--;
760                }
761                else
762                {
763                    setup_item_i = setup_n;
764                    setup_item_p = (setup_n < setup_h) ? 0 : setup_n - setup_h + 1;
765                    setup_cursor = (setup_n < setup_h) ? setup_n : setup_h - 1;
766                }
767            }
768        }
769    }
770    if (Input::WasPressed(Key::Down))
771    {
772        if (m_setup)
773        {
774            if (!setup_switch)
775            {
776                if (setup_cursor < setup_h - 1)
777                {
778                    setup_cursor++;
779                }
780                else
781                {
782                    if (setup_cursor == setup_h - 1) setup_option_p++;
783                }
784                if (setup_option_i < setup_option_n - 1)
785                {
786                    setup_option_i++;
787                }
788                else
789                {
790                    setup_option_i = 0;
791                    setup_option_p = 0;
792                    setup_cursor = 0;
793                }
794                setup_item_i = 0;
795                setup_item_p = 0;
796            }
797            else
798            {
799                if (setup_cursor < setup_h - 1)
800                {
801                    setup_cursor++;
802                }
803                else
804                {
805                    if (setup_cursor == setup_h - 1) setup_item_p++;
806                }
807                if (setup_item_i < setup_n)
808                {
809                    setup_item_i++;
810                }
811                else
812                {
813                    setup_item_i = 0;
814                    setup_item_p = 0;
815                    setup_cursor = 0;
816                }
817            }
818        }
819    }
820    if (Input::WasPressed(Key::PageUp))
821    {
822        if (m_setup)
823        {
824            if (!setup_switch)
825            {
826                if (setup_cursor > 0)
827                {
828                    setup_option_i -= setup_cursor;
829                    setup_cursor = 0;
830                }
831                else
832                {
833                    if (setup_option_i > setup_h)
834                    {
835                        setup_option_i -= setup_h;
836                        setup_option_p -= setup_h;
837                    }
838                else
839                    {
840                        setup_option_i = 0;
841                        setup_option_p = 0;
842                    }
843                }
844            setup_item_i = 0;
845            }
846            else
847            {
848                if (setup_cursor > 0)
849                {
850                    setup_item_i -= setup_cursor;
851                    setup_cursor = 0;
852                }
853                else
854                {
855                    if (setup_item_i > setup_h)
856                    {
857                        setup_item_i -= setup_h;
858                        setup_item_p -= setup_h;
859                    }
860                else
861                    {
862                        setup_item_i = 0;
863                        setup_item_p = 0;
864                    }
865                }
866            }
867        }
868    }
869    if (Input::WasPressed(Key::PageDown))
870    {
871        if (m_setup)
872        {
873            if (!setup_switch)
874            {
875                if (setup_cursor < setup_h - 1)
876                {
877                    setup_option_i += setup_h - setup_cursor - 1;
878                    setup_cursor = setup_h - 1;
879                    setup_item_i = 0;
880                }
881                else
882                {
883                    if (setup_option_i < setup_option_n - setup_h - 1)
884                    {
885                        setup_option_i += setup_h;
886                        setup_option_p += setup_h;
887                    }
888                else
889                    {
890                        setup_option_i = setup_option_n - 1;
891                        setup_option_p = setup_option_n - setup_h;
892                    }
893                }
894            }
895            else
896            {
897                if (setup_cursor < setup_h - 1)
898                {
899                    setup_item_i += (setup_n < setup_h) ? setup_n - setup_cursor : setup_h - setup_cursor - 1;
900                    setup_cursor = (setup_n < setup_h) ? setup_n : setup_h - 1;
901                }
902                else
903                {
904                    if (setup_item_i < setup_n - setup_h + 1)
905                    {
906                        setup_item_i += setup_h;
907                        setup_item_p += setup_h;
908                    }
909                else
910                    {
911                        setup_item_i = setup_n;
912                        setup_item_p = setup_n - setup_h + 1;
913                    }
914                }
915            }
916        }
917    }
918    if (Input::WasPressed(Key::Left))
919    {
920        if (m_setup && setup_switch)
921        {
922            setup_var[setup_item_key].w -= setup_var[setup_item_key].z;
923            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;
924            UpdateVar();
925        }
926    }
927    if (Input::WasPressed(Key::Right))
928    {
929        if (m_setup && setup_switch)
930        {
931            setup_var[setup_item_key].w += setup_var[setup_item_key].z;
932            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;
933            UpdateVar();
934        }
935    }
936    if (Input::WasPressed(Key::Home))
937    {
938        if (m_setup && setup_switch)
939        {
940            setup_var[setup_item_key].w = setup_var[setup_item_key].x;
941            UpdateVar();
942        }
943    }
944    if (Input::WasPressed(Key::End))
945    {
946        if (m_setup && setup_switch)
947        {
948            setup_var[setup_item_key].w = setup_var[setup_item_key].y;
949            UpdateVar();
950        }
951    }
952    if (Input::WasPressed(Key::Return))
953    {
954        beat_flag = true;
955        beat_angle = main_angle;
956        //flash_flag = true;
957        //flash_angle = main_angle;
958    }
959
960    Entity::TickDraw(seconds);
961
962    if (!m_ready)
963    {
964        CreateGLWindow();
965        text_render->Init();
966        m_ready = true;
967    }
968
969    // timer
970    if (!m_pause)
971    {
972        timer += seconds;
973        main_angle = timer * 100.0f * PID;
974    }
975    if (sync_flag)
976    {
977        angle = (main_angle - sync_angle) * sync_speed;
978        sync_value = 1.0f - sinf(angle);
979        if (angle > 90.0f * PID)
980        {
981            sync_value = 0;
982            sync_flag = false;
983        }
984    }
985    if (beat_flag)
986    {
987        angle = (main_angle - beat_angle) * beat_speed;
988        beat_value = 1.0f - sinf(angle);
989        if (angle > 90.0f * PID)
990        {
991            beat_value = 0;
992            beat_flag = false;
993        }
994    }
995    if (flash_flag)
996    {
997        angle = (main_angle - flash_angle) * flash_speed;
998        flash_value = 1.0f - sinf(angle);
999        if (angle > 90.0f * PID)
1000        {
1001            flash_value = 0;
1002            flash_flag = false;
1003        }
1004    }
1005    if (fade_flag)
1006    {
1007        angle = (main_angle - fade_angle) * fade_speed;
1008        fade_value = 1.0f - sinf(angle);
1009        if (angle > 90.0f * PID)
1010        {
1011            fade_value = 0;
1012            fade_flag = false;
1013        }
1014    }
1015
1016    Draw2D();
1017    Draw3D();
1018}
1019
1020void Render::Draw2D()
1021{
1022    /* Draw text in an offline buffer */
1023    text_render->Render();
1024
1025    if (m_shader)
1026        fbo_back->Bind();
1027
1028    glViewport(0, 0, screen_size.x, screen_size.y);
1029
1030    /* Clear the back buffer */
1031    glEnable(GL_BLEND);
1032    glBlendFunc(GL_SRC_COLOR, GL_DST_ALPHA);
1033
1034    Video::SetClearColor(vec4(screen_color, 1.f));
1035    Video::SetClearDepth(1.0f); // set depth buffer
1036    Video::Clear(ClearMask::Color | ClearMask::Depth);
1037
1038    text_render->Blit(border, canvas_size);
1039
1040    //if (m_polygon) glEnable(GL_LINE_SMOOTH); else glDisable(GL_LINE_SMOOTH);
1041    glLineWidth((m_polygon)?2.0f:1.0f);
1042    fx_angle=main_angle-part_angle;
1043    if (m_polygon)
1044        glEnable(GL_TEXTURE_2D);
1045
1046    glMatrixMode(GL_PROJECTION);
1047    mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f);
1048    glLoadMatrixf(&m[0][0]);
1049    glMatrixMode(GL_MODELVIEW);
1050}
1051
1052void Render::Draw3D()
1053{
1054    if (!m_shader)
1055        return;
1056
1057    glDisable(GL_DEPTH_TEST);
1058    glDisable(GL_BLEND);
1059
1060    glEnableClientState(GL_VERTEX_ARRAY);
1061    glVertexPointer(4, GL_FLOAT, 0, fs_quad_vtx);
1062
1063    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1064    glTexCoordPointer(2, GL_FLOAT, 0, fs_quad_tex);
1065
1066    if (m_shader_copper)
1067    {
1068        // shader copper
1069        fbo_tmp->Bind();
1070        shader_copper->Bind();
1071        shader_copper->SetUniform(shader_copper_texture, fbo_back->GetTexture(), 0);
1072        shader_copper->SetUniform(shader_copper_screen_size, (vec2)screen_size);
1073        shader_copper->SetUniform(shader_copper_time, fx_angle * 2.0f);
1074        shader_copper->SetUniform(shader_copper_copper, vec4(copper.x, copper.y, copper.z * 16.0f, copper.w * 16.0f));
1075        TraceQuad();
1076        shader_color->Unbind();
1077        fbo_tmp->Unbind();
1078        // shader simple
1079        fbo_back->Bind();
1080        ShaderSimple(fbo_tmp, 0);
1081        fbo_back->Unbind();
1082    }
1083
1084    if (m_shader_remanency)
1085    {
1086        // shader remanency
1087        fbo_tmp->Bind();
1088        shader_remanency->Bind();
1089        shader_remanency->SetUniform(shader_remanency_source, fbo_back->GetTexture(), 0);
1090        shader_remanency->SetUniform(shader_remanency_buffer, fbo_buffer->GetTexture(), 1);
1091        shader_remanency->SetUniform(shader_remanency_mix, remanency);
1092        TraceQuad();
1093        shader_remanency->Unbind();
1094        fbo_tmp->Unbind();
1095        // shader simple
1096        fbo_back->Bind();
1097        ShaderSimple(fbo_tmp, 0);
1098        fbo_back->Unbind();
1099        // save previous fbo
1100        fbo_tmp->Bind();
1101        shader_remanency->Bind();
1102        shader_remanency->SetUniform(shader_remanency_source, fbo_front->GetTexture(), 0);
1103        shader_remanency->SetUniform(shader_remanency_buffer, fbo_buffer->GetTexture(), 1);
1104        shader_remanency->SetUniform(shader_remanency_mix, buffer);
1105        TraceQuad();
1106        shader_remanency->Unbind();
1107        fbo_tmp->Unbind();
1108        // shader simple
1109        fbo_buffer->Bind();
1110        ShaderSimple(fbo_tmp, 0);
1111        fbo_buffer->Unbind();
1112    }
1113
1114    // shader glow
1115    if (m_shader_glow)
1116    {
1117        // shader blur horizontal
1118        fbo_blur_h->Bind();
1119        shader_blur_h->Bind();
1120        shader_blur_h->SetUniform(shader_blur_h_texture, fbo_back->GetTexture(), 0);
1121        shader_blur_h->SetUniform(shader_blur_h_radius, glow_large / screen_size.x);
1122        TraceQuad();
1123        shader_blur_h->Unbind();
1124        fbo_blur_h->Unbind();
1125        // shader blur vertical
1126        fbo_blur_v->Bind();
1127        shader_blur_v->Bind();
1128        shader_blur_v->SetUniform(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
1129        shader_blur_v->SetUniform(shader_blur_v_radius, glow_large / screen_size.y);
1130        TraceQuad();
1131        shader_blur_v->Unbind();
1132        fbo_blur_v->Unbind();
1133        // shader blur horizontal
1134        fbo_blur_h->Bind();
1135        shader_blur_h->Bind();
1136        shader_blur_h->SetUniform(shader_blur_h_texture, fbo_blur_v->GetTexture(), 0);
1137        shader_blur_h->SetUniform(shader_blur_h_radius, glow_small / screen_size.x);
1138        TraceQuad();
1139        shader_blur_h->Unbind();
1140        fbo_blur_h->Unbind();
1141        // shader blur vertical
1142        fbo_blur_v->Bind();
1143        shader_blur_v->Bind();
1144        shader_blur_v->SetUniform(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
1145        shader_blur_v->SetUniform(shader_blur_v_radius, glow_small / screen_size.y);
1146        TraceQuad();
1147        shader_blur_v->Unbind();
1148        fbo_blur_v->Unbind();
1149        // shader glow
1150        fbo_front->Bind();
1151        shader_glow->Bind();
1152        shader_glow->SetUniform(shader_glow_glow, fbo_blur_v->GetTexture(), 0);
1153        shader_glow->SetUniform(shader_glow_source, fbo_back->GetTexture(), 1);
1154        shader_glow->SetUniform(shader_glow_mix, glow_mix);
1155        TraceQuad();
1156        shader_glow->Unbind();
1157        fbo_front->Unbind();
1158    }
1159    else
1160    {
1161        // shader simple
1162        fbo_front->Bind();
1163        ShaderSimple(fbo_back, 0);
1164        fbo_front->Unbind();
1165    }
1166
1167    if (m_shader_color)
1168    {
1169        // shader color
1170        fbo_tmp->Bind();
1171        shader_color->Bind();
1172        shader_color->SetUniform(shader_color_texture, fbo_front->GetTexture(), 0);
1173        shader_color->SetUniform(shader_color_screen_size, (vec2)screen_size);
1174        shader_color->SetUniform(shader_color_filter, color_filter);
1175        shader_color->SetUniform(shader_color_color, color_color);
1176        shader_color->SetUniform(shader_color_flash, flash_value);
1177        TraceQuad();
1178        shader_color->Unbind();
1179        fbo_tmp->Unbind();
1180        // shader simple
1181        fbo_front->Bind();
1182        ShaderSimple(fbo_tmp, 0);
1183        fbo_front->Unbind();
1184    }
1185
1186    if (m_shader_noise)
1187    {
1188        // shader noise
1189        fbo_tmp->Bind();
1190        shader_noise->Bind();
1191        shader_noise->SetUniform(shader_noise_texture, fbo_front->GetTexture(), 0);
1192        shader_noise->SetUniform(shader_noise_screen_size, (vec2)screen_size);
1193        shader_noise->SetUniform(shader_noise_time, fx_angle);
1194        shader_noise->SetUniform(shader_noise_offset, noise_offset);
1195        shader_noise->SetUniform(shader_noise_noise, noise_noise);
1196        shader_noise->SetUniform(shader_noise_retrace, noise_retrace);
1197        TraceQuad();
1198        shader_noise->Unbind();
1199        fbo_tmp->Unbind();
1200        // shader simple
1201        fbo_front->Bind();
1202        ShaderSimple(fbo_tmp, 0);
1203        fbo_front->Unbind();
1204    }
1205
1206    if (m_shader_blur)
1207    {
1208        // shader blur horizontal
1209        fbo_tmp->Bind();
1210        shader_blur_h->Bind();
1211        shader_blur_h->SetUniform(shader_blur_h_texture, fbo_front->GetTexture(), 0);
1212        shader_blur_h->SetUniform(shader_blur_h_radius, blur / screen_size.x);
1213        TraceQuad();
1214        shader_blur_h->Unbind();
1215        fbo_tmp->Unbind();
1216        // shader blur vertical
1217        fbo_front->Bind();
1218        shader_blur_v->Bind();
1219        shader_blur_v->SetUniform(shader_blur_v_texture, fbo_tmp->GetTexture(), 0);
1220        shader_blur_v->SetUniform(shader_blur_v_radius, blur / screen_size.y);
1221        TraceQuad();
1222        shader_blur_v->Unbind();
1223        fbo_front->Unbind();
1224    }
1225
1226    if (m_shader_postfx)
1227    {
1228        // shader postfx
1229        shader_postfx->Bind();
1230        shader_postfx->SetUniform(shader_postfx_texture, fbo_front->GetTexture(), 0);
1231        shader_postfx->SetUniform(shader_postfx_screen_size, (vec2)screen_size);
1232        shader_postfx->SetUniform(shader_postfx_time, fx_angle);
1233        shader_postfx->SetUniform(shader_postfx_deform, postfx_deform);
1234        shader_postfx->SetUniform(shader_postfx_ghost1, postfx_ghost1);
1235        shader_postfx->SetUniform(shader_postfx_ghost2, postfx_ghost2);
1236        shader_postfx->SetUniform(shader_postfx_vignetting, postfx_vignetting);
1237        shader_postfx->SetUniform(shader_postfx_aberration, postfx_aberration);
1238        shader_postfx->SetUniform(shader_postfx_moire_h, postfx_moire_h);
1239        shader_postfx->SetUniform(shader_postfx_moire_v, postfx_moire_v);
1240        shader_postfx->SetUniform(shader_postfx_scanline_h, postfx_scanline_h);
1241        shader_postfx->SetUniform(shader_postfx_scanline_v, postfx_scanline_v);
1242        shader_postfx->SetUniform(shader_postfx_corner, postfx_corner);
1243        shader_postfx->SetUniform(shader_postfx_sync, (float)fabs(sync_value*cosf((main_angle-sync_angle)*6.0f)));
1244        shader_postfx->SetUniform(shader_postfx_beat, (float)fabs(beat_value*cosf((main_angle-beat_angle)*6.0f)));
1245        TraceQuad();
1246        shader_postfx->Unbind();
1247    }
1248    else
1249    {
1250        // shader simple
1251        ShaderSimple(fbo_front, 0);
1252    }
1253
1254    glDisableClientState(GL_VERTEX_ARRAY);
1255    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1256}
1257
1258Render::~Render()
1259{
1260}
Note: See TracBrowser for help on using the repository browser.