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

Last change on this file since 1966 was 1966, checked in by sam, 6 years ago

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