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

Last change on this file since 1918 was 1918, checked in by rez, 7 years ago

NEERCS: multiple pageup/pagedown now works

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