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

Last change on this file since 1962 was 1962, checked in by rez, 6 years ago

NEERCS: fixed setup value bar length / fixed copper setup

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