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

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

neercs: scanline auto-resize

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