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

Last change on this file since 1763 was 1763, checked in by rez, 11 years ago

calculate the number of items for the current setup menu (avoid selection of empty slot)

File size: 33.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
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_blurh;
35extern char const *lolfx_blurv;
36extern char const *lolfx_remanency;
37extern char const *lolfx_glow;
38extern char const *lolfx_postfx;
39extern char const *lolfx_radial;
40extern char const *lolfx_simple;
41
42#define PID M_PI/180.0f    // pi ratio
43#define CR 1.0f/256.0f     // color ratio
44
45/*
46 * Various variables
47 */
48
49int active = true;         // window active flag
50float nearplane = 0.1f;    // nearplane
51float farplane = 1000.0f;  // farplane
52int polygon_fillmode = GL_FILL; // fill mode
53/* timer variable */
54float timer = 0;           // timer
55float timer_key = 0;       // key timer
56float timer_key_repeat = 0.25f;// key repeat delay
57/* window variable */
58ivec2 screen_size;         // screen size
59vec3 screen_color = CR * vec3(32, 32, 32); // screen color
60/* object variable */
61float main_angle = 0.0f;   // main angle
62float part_angle = 0.0f;   // part angle
63float fx_angle;            // current angle
64/* fs_quad variable */
65float fs_quad_vtx[] = {-1.0f, 1.0f, 0, 1.0f, -1.0f, -1.0f, 0, 1.0f, 1.0f, -1.0f, 0, 1.0f, 1.0f, 1.0f, 0, 1.0f};
66float fs_quad_tex[] = {0, 1.0f, 0, 0, 1.0f, 0, 1.0f, 1.0f};
67/* flash variable */
68bool flash_flag = false;   // flag
69float flash_angle = 0;     // angle
70float flash_value = 0;     // value
71float flash_speed = 1.5f;  // speed
72/* fade variable */
73bool fade_flag = false;    // flag
74float fade_angle = 0;      // angle
75float fade_value = 0;      // value
76float fade_speed = 0.2f;   // speed
77/* sync variable */
78bool sync_flag = false;    // flagsh
79float sync_angle = 0;      // angle
80float sync_value = 1.0f;   // value
81float sync_speed = 1.0f;   // speed
82/* beat variable */
83bool beat_flag = false;    // flag
84float beat_angle = 0;      // angle
85float beat_value = 0;      // value
86float beat_speed = 2.0f;   // speed
87/* common variable */
88float value, angle, radius, scale, speed;
89/* shader variable */
90vec2 buffer(0.7f,0.3f);         // [new frame mix,old frame mix]
91vec2 remanency(0.3f,0.7f);      // remanency [source mix,buffer mix]
92vec2 glow_mix(0.6f,0.4f);       // glow mix [source mix,glow mix]
93vec2 glow_large(2.0f,2.0f);     // large glow radius [center,corner]
94vec2 glow_small(1.0f,1.0f);     // small glow radius [center,corner]
95vec2 blur(0.25f,0.5f);          // glow radius [center,corner]
96vec2 postfx_deform(0.7f,0.54f); // deformation [ratio,zoom]
97vec3 postfx_filter(0.8f,0.9f,0.4f);   // color filter [red,green,blue]
98vec3 postfx_color(1.8f,1.5f,0.5f);    // color modifier [brightness,contrast,grayscale]
99vec2 postfx_corner(0.75f,0.95f);      // corner [radius,blur]
100vec3 postfx_retrace(0.05f,2.0f,4.0f); // retrace [strength,length,speed]
101vec2 postfx_offset(3.0f,3.0f);  // random line [horizontal,vertical]
102float postfx_noise = 0.15f;     // noise
103float postfx_aberration = 3.0f; // chromatic aberration
104vec4 postfx_ghost(0.1f,0.25f,0.1f,0.5f);        // ghost picture [distance,strength,distance,strength]
105vec4 postfx_moire_h(0.75f,-0.25f,0.0f,1.0f);    // vertical moire [base,variable,repeat x,repeat y]
106vec4 postfx_moire_v(0.75f,-0.25f,1.0f,1.5f);    // horizontal moire [base,variable,repeat x,repeat y]
107vec4 postfx_scanline_h(0.75f, 0.25f,0.0f,2.0f); // vertical scanline [base,variable,repeat x,repeat y]
108vec4 postfx_scanline_v(0.75f,-0.25f,2.0f,0.0f); // horizontal scanline [base,variable,repeat x,repeat y]
109/* window variable */
110ivec2 border;              // border width
111/* text variable */
112ivec2 ratio_2d(2,4);       // 2d ratio
113ivec2 map_size(256,256);   // texture map size
114ivec2 font_size(8,8);      // font size
115ivec2 canvas_char(0,0);    // canvas char number
116ivec2 canvas_size(0,0);    // caca size
117/* setup variable */
118bool setup_switch = false;      // switch [option/item]
119int setup_option = 0;           // selected option
120int setup_option_n = 10;        // option number
121int setup_item = 0;             // selected item
122int setup_item_n = 8;           // item number
123int setup_item_key = 0;         // item array key
124int setup_n = 0;                // contextual option/item number
125ivec2 setup_p(1,1);             // position [x,y]
126ivec3 setup_size(30,0,12);      // size [w,h,split]
127ivec2 setup_color(0x678,0x234); // color [foreground,background]
128//vec3 radial(2.0f,0.8f,0);     // radial [mix,strength,color mode]
129char const *setup_text[] = {
130    "theme",
131        "default",
132        "ye olde monitor",
133        "green screen",
134        "",
135        "",
136        "",
137        "",
138        "",
139    "remanency",
140        "enable",
141        "buffer new frame",
142        "buffer old frame",
143        "source mix",
144        "buffer mix",
145        "",
146        "",
147        "",
148    "glow",
149        "enable",
150        "source mix",
151        "glow mix",
152        "large center",
153        "large corner",
154        "small center",
155        "small corner",
156        "",
157    "blur",
158        "enable",
159        "blur center",
160        "blur corner",
161        "",
162        "",
163        "",
164        "",
165        "",
166    "screen",
167        "enable",
168        "deform ratio",
169        "zoom base",
170        "corner radius",
171        "corner blur",
172        "",
173        "",
174        "",
175    "color",
176        "filter red",
177        "filter green",
178        "filter blue",
179        "brightness",
180        "contrast",
181        "grayscale",
182        "",
183        "",
184    "noise",
185        "offset h",
186        "offset v",
187        "noise",
188        "aberration",
189        "retrace strength",
190        "retrace length",
191        "retrace speed",
192        "",
193    "ghost",
194        "back distance",
195        "back strength",
196        "front distance",
197        "front strength",
198        "",
199        "",
200        "",
201        "",
202    "moire",
203        "h base",
204        "h variable",
205        "h repeat x",
206        "h repeat y",
207        "v base",
208        "v variable",
209        "v repeat x",
210        "v repeat y",
211    "scanline",
212        "h base",
213        "h variable",
214        "h repeat x",
215        "h repeat y",
216        "v base",
217        "v variable",
218        "v repeat x",
219        "v repeat y"
220    };
221vec4 setup_var[]={ // setup variable [start,end,step,value]
222    vec4(0), /* theme */
223        vec4(0),
224        vec4(0),
225        vec4(0),
226        vec4(0),
227        vec4(0),
228        vec4(0),
229        vec4(0),
230        vec4(0),
231    vec4(0), /* remanency */
232        vec4(0, 1, 1, 1),
233        vec4(0.0f, 1.0f, 0.1f, buffer.x),
234        vec4(0.0f, 1.0f, 0.1f, buffer.y),
235        vec4(0.0f, 1.0f, 0.1f, remanency.x),
236        vec4(0.0f, 1.0f, 0.1f, remanency.y),
237        vec4(0),
238        vec4(0),
239        vec4(0),
240    vec4(0), /* glow */
241        vec4(0, 1, 1, 1),
242        vec4(0.0f, 1.0f, 0.1f, glow_mix.x),
243        vec4(0.0f, 1.0f, 0.1f, glow_mix.y),
244        vec4(0.0f, 4.0f, 0.1f, glow_large.x),
245        vec4(0.0f, 4.0f, 0.1f, glow_large.y),
246        vec4(0.0f, 2.0f, 0.1f, glow_small.x),
247        vec4(0.0f, 2.0f, 0.1f, glow_small.y),
248        vec4(0),
249    vec4(0), /* blur */
250        vec4(0, 1, 1, 1),
251        vec4(0.0f, 2.0f, 0.1f, blur.x),
252        vec4(0.0f, 2.0f, 0.1f, blur.y),
253        vec4(0),
254        vec4(0),
255        vec4(0),
256        vec4(0),
257        vec4(0),
258    vec4(0), /* screen */
259        vec4(0, 1, 1, 1),
260        vec4(0.0f, 1.0f, 0.05f, postfx_deform.x),
261        vec4(0.5f, 0.7f, 0.01f, postfx_deform.y),
262        vec4(0.0f, 1.0f, 0.05f, postfx_corner.x),
263        vec4(0.0f, 1.0f, 0.05f, postfx_corner.y),
264        vec4(0),
265        vec4(0),
266        vec4(0),
267    vec4(0), /* color */
268        vec4(0.0f, 1.0f, 0.1f, postfx_filter.x),
269        vec4(0.0f, 1.0f, 0.1f, postfx_filter.y),
270        vec4(0.0f, 1.0f, 0.1f, postfx_filter.z),
271        vec4(0.0f, 4.0f, 0.1f, postfx_color.x),
272        vec4(0.0f, 4.0f, 0.1f, postfx_color.y),
273        vec4(0.0f, 1.5f, 0.1f, postfx_color.z),
274        vec4(0),
275        vec4(0),
276    vec4(0), /* noise */
277        vec4(0.0f, 4.0f, 0.5f, postfx_offset.x),
278        vec4(0.0f, 4.0f, 0.5f, postfx_offset.y),
279        vec4(0.0f, 1.0f, 0.05f, postfx_noise),
280        vec4(0.0f, 5.0f, 0.5f, postfx_aberration),
281        vec4(0.0f, 0.2f, 0.01f, postfx_retrace.x),
282        vec4(0.0f, 8.0f, 0.5f, postfx_retrace.y),
283        vec4(0.0f, 4.0f, 0.25f, postfx_retrace.z),
284        vec4(0),
285    vec4(0), /* ghost */
286        vec4(0.0f, 0.2f, 0.01f, postfx_ghost.x),
287        vec4(0.0f, 1.0f, 0.05f, postfx_ghost.y),
288        vec4(0.0f, 0.2f, 0.01f, postfx_ghost.z),
289        vec4(0.0f, 1.0f, 0.05f, postfx_ghost.w),
290        vec4(0),
291        vec4(0),
292        vec4(0),
293        vec4(0),
294    vec4(0), /* moire */
295        vec4(0.5f, 1.0f, 0.05f, postfx_moire_h.x),
296        vec4(-0.5f, 0.5f, 0.05f, postfx_moire_h.y),
297        vec4(0.0f, 4.0f, 0.5f, postfx_moire_h.z),
298        vec4(0.0f, 4.0f, 0.5f, postfx_moire_h.w),
299        vec4(0.5f, 1.0f, 0.1f, postfx_moire_v.x),
300        vec4(-0.5f, 0.5f, 0.1f, postfx_moire_v.y),
301        vec4(0.0f, 4.0f, 0.5f, postfx_moire_v.z),
302        vec4(0.0f, 4.0f, 0.5f, postfx_moire_v.w),
303    vec4(0), /* scanline */
304        vec4(0.5f, 1.0f, 0.05f, postfx_scanline_h.x),
305        vec4(-0.5f, 0.5f, 0.05f, postfx_scanline_h.y),
306        vec4(0.0f, 4.0f, 0.5f, postfx_scanline_h.z),
307        vec4(0.0f, 4.0f, 0.5f, postfx_scanline_h.w),
308        vec4(0.5f, 1.0f, 0.1f, postfx_scanline_v.x),
309        vec4(-0.5f, 0.5f, 0.1f, postfx_scanline_v.y),
310        vec4(0.0f, 4.0f, 0.5f, postfx_scanline_v.z),
311        vec4(0.0f, 4.0f, 0.5f, postfx_scanline_v.w),
312    vec4(0)
313    };
314
315void Render::UpdateVar()
316{
317    int k = 1; /* theme */
318    k += 9; /* remanency */
319    m_shader_remanency = (setup_var[k].w == 1) ? true : false; k++;
320    buffer = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
321    remanency = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
322    k += 4; /* glow */
323    m_shader_glow = (setup_var[k].w == 1) ? true : false; k++;
324    glow_mix = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
325    glow_large = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
326    glow_small = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
327    k += 2; /* blur */
328    m_shader_blur = (setup_var[k].w == 1) ? true : false; k++;
329    blur = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
330    k += 6; /* screen */
331    m_shader_postfx = (setup_var[k].w == 1) ? true : false; k++;
332    postfx_deform = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
333    postfx_corner = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
334    k += 4; /* color */
335    postfx_filter = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
336    postfx_color = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
337    k += 3; /* noise */
338    postfx_offset = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
339    postfx_noise = setup_var[k].w; k++;
340    postfx_aberration = setup_var[k].w; k++;
341    postfx_retrace = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
342    k += 2; /* ghost */
343    postfx_ghost = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
344    k += 5; /* moire */
345    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;
346    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;
347    k++; /* scanline */
348    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;
349    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;
350}
351
352int calc_item_length()
353{
354    int n = !setup_switch ? setup_option_n : setup_item_n;
355    int v = 0;
356    for (int i = 0; i < n; i++)
357    {
358        int k = !setup_switch ? (i * (setup_item_n + 1)) : (setup_option * (setup_item_n + 1) + 1 + i);
359        if (setup_text[k] == "") return i;
360    }
361    return n - 1;
362}
363
364Shader *shader_simple;
365Shader *shader_blur_h, *shader_blur_v;
366Shader *shader_remanency, *shader_glow, *shader_radial, *shader_postfx;
367// shader variables
368ShaderUniform shader_simple_texture;
369ShaderUniform shader_remanency_source,
370              shader_remanency_buffer,
371              shader_remanency_mix;
372ShaderUniform shader_glow_glow,
373              shader_glow_source,
374              shader_glow_mix;
375ShaderUniform shader_blur_h_texture,
376              shader_blur_h_radius,
377              shader_blur_v_texture,
378              shader_blur_v_radius;
379ShaderUniform shader_radial_texture,
380              shader_radial_screen_size,
381              shader_radial_time,
382              shader_radial_value1,
383              shader_radial_value2,
384              shader_radial_color;
385ShaderUniform shader_postfx_texture,
386              shader_postfx_texture_2d,
387              shader_postfx_screen_size,
388              shader_postfx_time,
389              shader_postfx_deform,
390              shader_postfx_ghost,
391              shader_postfx_filter,
392              shader_postfx_color,
393              shader_postfx_corner,
394              shader_postfx_retrace,
395              shader_postfx_offset,
396              shader_postfx_noise,
397              shader_postfx_aberration,
398              shader_postfx_moire_h,
399              shader_postfx_moire_v,
400              shader_postfx_scanline_h,
401              shader_postfx_scanline_v,
402              shader_postfx_flash,
403              shader_postfx_sync;
404
405FrameBuffer *fbo_back, *fbo_front, *fbo_buffer;
406FrameBuffer *fbo_blur_h, *fbo_blur_v, *fbo_ping, *fbo_pong;
407
408TextRender *text_render;
409
410void fs_quad()
411{
412    glLoadIdentity();
413    glDrawArrays(GL_QUADS, 0, 4);
414}
415
416void draw_shader_simple(FrameBuffer *fbo_output, int n)
417{
418    shader_simple->Bind();
419    shader_simple->SetTexture(shader_simple_texture, fbo_output->GetTexture(), n);
420    fs_quad();
421    shader_simple->Unbind();
422}
423
424void rectangle(int x, int y, int w, int h)
425{
426    glLoadIdentity();
427    glBegin(GL_QUADS);
428        glVertex2i(x+w, y  );
429        glVertex2i(x  , y  );
430        glVertex2i(x  , y+h);
431        glVertex2i(x+w, y+h);
432    glEnd();
433}
434
435int Render::InitDraw(void)
436{
437    glDepthMask(GL_TRUE);     // do not write z-buffer
438    glEnable(GL_CULL_FACE);   // disable cull face
439    glCullFace(GL_BACK);      // don't draw front face
440
441    /* Initialise framebuffer objects */
442    fbo_back = new FrameBuffer(screen_size);
443    fbo_front = new FrameBuffer(screen_size);
444    fbo_buffer = new FrameBuffer(screen_size);
445    fbo_blur_h = new FrameBuffer(screen_size);
446    fbo_blur_v = new FrameBuffer(screen_size);
447    fbo_ping = new FrameBuffer(screen_size);
448    fbo_pong = new FrameBuffer(screen_size);
449    // shader simple
450    shader_simple = Shader::Create(lolfx_simple);
451    shader_simple_texture = shader_simple->GetUniformLocation("texture");
452    // shader remanency
453    shader_remanency = Shader::Create(lolfx_remanency);
454    shader_remanency_source = shader_remanency->GetUniformLocation("source");
455    shader_remanency_buffer = shader_remanency->GetUniformLocation("buffer");
456    shader_remanency_mix = shader_remanency->GetUniformLocation("mix");
457    // shader glow
458    shader_glow = Shader::Create(lolfx_glow);
459    shader_glow_glow = shader_glow->GetUniformLocation("glow");
460    shader_glow_source = shader_glow->GetUniformLocation("source");
461    shader_glow_mix = shader_glow->GetUniformLocation("mix");
462    // shader blur horizontal
463    shader_blur_h = Shader::Create(lolfx_blurh);
464    shader_blur_h_texture = shader_blur_h->GetUniformLocation("texture");
465    shader_blur_h_radius = shader_blur_h->GetUniformLocation("radius");
466    // shader blur vertical
467    shader_blur_v = Shader::Create(lolfx_blurv);
468    shader_blur_v_texture = shader_blur_v->GetUniformLocation("texture");
469    shader_blur_v_radius = shader_blur_v->GetUniformLocation("radius");
470    // shader radial
471    shader_radial = Shader::Create(lolfx_radial);
472    shader_radial_texture = shader_radial->GetUniformLocation("texture");
473    shader_radial_screen_size = shader_radial->GetUniformLocation("screen_size");
474    shader_radial_time = shader_radial->GetUniformLocation("time");
475    shader_radial_value1 = shader_radial->GetUniformLocation("value1");
476    shader_radial_value2 = shader_radial->GetUniformLocation("value2");
477    shader_radial_color = shader_radial->GetUniformLocation("color");
478    // shader postfx
479    shader_postfx = Shader::Create(lolfx_postfx);
480    shader_postfx_texture = shader_postfx->GetUniformLocation("texture");
481    shader_postfx_texture_2d = shader_postfx->GetUniformLocation("texture_2d");
482    shader_postfx_screen_size = shader_postfx->GetUniformLocation("screen_size");
483    shader_postfx_time = shader_postfx->GetUniformLocation("time");
484    shader_postfx_deform = shader_postfx->GetUniformLocation("deform");
485    shader_postfx_ghost = shader_postfx->GetUniformLocation("ghost");
486    shader_postfx_filter = shader_postfx->GetUniformLocation("filter");
487    shader_postfx_color = shader_postfx->GetUniformLocation("color");
488    shader_postfx_corner = shader_postfx->GetUniformLocation("corner");
489    shader_postfx_retrace = shader_postfx->GetUniformLocation("retrace");
490    shader_postfx_offset = shader_postfx->GetUniformLocation("offset");
491    shader_postfx_noise = shader_postfx->GetUniformLocation("noise");
492    shader_postfx_aberration = shader_postfx->GetUniformLocation("aberration");
493    shader_postfx_moire_h = shader_postfx->GetUniformLocation("moire_h");
494    shader_postfx_moire_v = shader_postfx->GetUniformLocation("moire_v");
495    shader_postfx_scanline_h = shader_postfx->GetUniformLocation("scanline_h");
496    shader_postfx_scanline_v = shader_postfx->GetUniformLocation("scanline_v");
497    shader_postfx_flash = shader_postfx->GetUniformLocation("flash");
498    shader_postfx_sync = shader_postfx->GetUniformLocation("sync");
499
500    return true;
501}
502
503int Render::CreateGLWindow()
504{
505    screen_size = Video::GetSize();
506    border = 18 * ratio_2d;
507    border.y = border.x; // enabled to get same border everywhere
508    canvas_char = (screen_size - border * 2) / (font_size * ratio_2d);
509    canvas_size = canvas_char * font_size * ratio_2d;
510
511    border = (screen_size - canvas_size) / 2;
512
513    caca_set_canvas_size(m_caca, canvas_char.x, canvas_char.y);
514
515    setup_size.y = ((setup_option_n > setup_item_n) ? setup_option_n : setup_item_n) + 1;
516    setup_p = (canvas_char - setup_size.xy) / 2;
517
518    setup_n = calc_item_length();
519
520    InitDraw();
521    return true;
522}
523
524Render::Render(caca_canvas_t *caca)
525  : m_caca(caca),
526    m_ready(false),
527    m_pause(false),
528    m_polygon(true),
529    m_setup(true),
530    m_shader(true),
531    m_shader_remanency(true),
532    m_shader_glow(true),
533    m_shader_blur(true),
534    m_shader_postfx(true)
535{
536    text_render = new TextRender(m_caca, font_size);
537}
538
539void Render::TickGame(float seconds)
540{
541    Entity::TickGame(seconds);
542}
543
544void Render::Pause()
545{
546    m_pause=!m_pause;
547}
548
549void Render::TickDraw(float seconds)
550{
551    /* keyboard manager */
552    if (Input::GetButtonState(27/*SDLK_ESCAPE*/))
553        Ticker::Shutdown();
554    if (Input::GetButtonState(282/*SDLK_F1*/) && (timer - timer_key > timer_key_repeat))
555    {
556        m_setup = !m_setup;
557        timer_key = timer;
558    }
559    if (Input::GetButtonState(283/*SDLK_F2*/) && (timer - timer_key > timer_key_repeat))
560    {
561        m_polygon = !m_polygon;
562        polygon_fillmode = (m_polygon)?GL_FILL:GL_LINE;
563        glPolygonMode(GL_FRONT, polygon_fillmode);
564        timer_key = timer;
565    }
566    if (Input::GetButtonState(284/*SDLK_F3*/) && (timer - timer_key > timer_key_repeat))
567    {
568        m_shader_glow = !m_shader_glow;
569        m_shader_blur = !m_shader_blur;
570        timer_key = timer;
571    }
572    if (Input::GetButtonState(285/*SDLK_F4*/)&&(timer-timer_key>timer_key_repeat))
573    {
574        m_shader_postfx = !m_shader_postfx;
575        timer_key = timer;
576    }
577    if (Input::GetButtonState(286/*SDLK_F5*/))
578    {
579        Pause();
580    }
581   if (Input::GetButtonState(9/*SDLK_TAB*/)&&(timer-timer_key>timer_key_repeat))
582    {
583        if (m_setup)
584        {
585            setup_switch = !setup_switch;
586            setup_n = calc_item_length();
587        }
588        timer_key = timer;
589    }
590    if (Input::GetButtonState(273/*SDLK_UP*/)&&(timer-timer_key>timer_key_repeat))
591    {
592        if (m_setup)
593        {
594            if (!setup_switch)
595            {
596                setup_option--;
597                if (setup_option < 0) setup_option = setup_n;
598                setup_item = 0;
599            }
600            else
601            {
602                setup_item--;
603                if (setup_item < 0) setup_item = setup_n;
604            }
605        }
606        timer_key = timer;
607    }
608    if (Input::GetButtonState(274/*SDLK_DOWN*/)&&(timer-timer_key>timer_key_repeat))
609    {
610        if (m_setup)
611        {
612            if (!setup_switch)
613            {
614                setup_option++;
615                if (setup_option > setup_n) setup_option = 0;
616                setup_item = 0;
617            }
618            else
619            {
620                setup_item++;
621                if (setup_item > setup_n) setup_item = 0;
622            }
623        }
624        timer_key = timer;
625    }
626    if (Input::GetButtonState(280/*SDLK_PAGEUP*/)&&(timer-timer_key>timer_key_repeat))
627    {
628        if (m_setup)
629        {
630            if (!setup_switch)
631            {
632                setup_option = 0;
633            }
634            else
635            {
636                setup_item = 0;
637            }
638        }
639        timer_key = timer;
640    }
641    if (Input::GetButtonState(281/*SDLK_PAGEDOWN*/)&&(timer-timer_key>timer_key_repeat))
642    {
643        if (m_setup)
644        {
645            if (!setup_switch)
646            {
647                setup_option = setup_n;
648                setup_item = 0;
649            }
650            else
651            {
652                setup_item = setup_n;
653            }
654        }
655        timer_key = timer;
656    }
657    if (Input::GetButtonState(276/*SDLK_LEFT*/)&&(timer-timer_key>timer_key_repeat))
658    {
659        if (m_setup && setup_switch)
660        {
661            setup_var[setup_item_key].w -= setup_var[setup_item_key].z;
662            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;
663            Render::UpdateVar();
664        }
665        timer_key = timer;
666    }
667    if (Input::GetButtonState(275/*SDLK_RIGHT*/)&&(timer-timer_key>timer_key_repeat))
668    {
669        if (m_setup && setup_switch)
670        {
671            setup_var[setup_item_key].w += setup_var[setup_item_key].z;
672            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;
673            Render::UpdateVar();
674        }
675        timer_key = timer;
676    }
677    if (Input::GetButtonState(13/*SDLK_RETURN*/)&&(timer-timer_key>timer_key_repeat))
678    {
679        timer_key = timer;
680    }
681
682    Entity::TickDraw(seconds);
683
684    if (!m_ready)
685    {
686        CreateGLWindow();
687        text_render->Init();
688        m_ready = true;
689    }
690
691    // timer
692    if (!m_pause)
693    {
694        timer += seconds;
695        main_angle = timer * 100.0f * PID;
696    }
697    if (sync_flag)
698    {
699        angle=(main_angle-sync_angle)*sync_speed;
700        sync_value=1.0f-sinf(angle);
701        if (angle>90.0f*PID)
702        {
703            sync_value=0;
704            sync_flag=false;
705        }
706    }
707    if (beat_flag)
708    {
709        angle=(main_angle-beat_angle)*beat_speed;
710        beat_value=1.0f-sinf(angle);
711        if (angle>90.0f*PID)
712        {
713            beat_value=0;
714            beat_flag=false;
715        }
716    }
717    if (flash_flag)
718    {
719        angle=(main_angle-flash_angle)*flash_speed;
720        flash_value=1.0f-sinf(angle);
721        if (angle>90.0f*PID)
722        {
723            flash_value=0;
724            flash_flag=false;
725        }
726    }
727    if (fade_flag)
728    {
729        angle=(main_angle-fade_angle)*fade_speed;
730        fade_value=1.0f-sinf(angle);
731        if (angle>90.0f*PID)
732        {
733            fade_value=0;
734            fade_flag=false;
735        }
736    }
737    /* draw setup */
738    if (m_setup)
739    {
740        /* background */
741        caca_set_color_argb(m_caca, setup_color.x, setup_color.y);
742        caca_fill_box(m_caca, setup_p.x, setup_p.y, setup_size.x + 1, setup_size.y,' ');
743        caca_draw_line(m_caca, setup_p.x + setup_size.z - 1, setup_p.y + 1, setup_p.x + setup_size.z - 1, setup_p.y + setup_size.y - 1,'|');
744        /* title */
745        caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
746        caca_draw_line(m_caca, setup_p.x, setup_p.y, setup_p.x + setup_size.x, setup_p.y,' ');
747        caca_put_str(m_caca, setup_p.x + setup_size.x / 2 - 3, setup_p.y, "SETUP");
748        /* display option */
749        for (int i = 0; i < setup_option_n; i++)
750        {
751            int y = setup_p.y + 1 + i;
752            int k = i * (setup_item_n + 1);
753            if (setup_option != i || setup_switch)
754            {
755                caca_set_color_argb(m_caca, setup_color.x, setup_color.y);
756                caca_put_str(m_caca, setup_p.x + 1, y, setup_text[k]);
757            }
758            else
759            {
760                caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
761                caca_draw_line(m_caca, setup_p.x, y, setup_p.x + setup_size.z - 2, y,' ');
762                caca_put_str(m_caca, setup_p.x + 1, y, setup_text[k]);
763            }
764        }
765        /* display item */
766        for (int i = 0; i < setup_item_n; i++)
767        {
768            int y = setup_p.y + 1 + i;
769            int k = setup_option * (setup_item_n + 1) + 1 + i;
770            if (setup_item != i || !setup_switch)
771            {
772                caca_set_color_argb(m_caca, setup_color.x, setup_color.y);
773                caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k]);
774            }
775            else
776            {
777                caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
778                caca_draw_line(m_caca, setup_p.x + setup_size.z, y, setup_p.x + setup_size.x, y,' ');
779                caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k]);
780            }
781        }
782        /* display variable */
783        int y = setup_p.y + setup_size.y;
784        setup_item_key = setup_option * (setup_item_n + 1) + 1 + setup_item;
785        caca_set_color_argb(m_caca, setup_color.y, setup_color.x);
786        caca_draw_line(m_caca, setup_p.x, y, setup_p.x + setup_size.x, y,' ');
787        if (setup_switch)
788        {
789            int w = setup_size.x - 3 - 4;
790            int bar_w = (w / (setup_var[setup_item_key].y - setup_var[setup_item_key].x) * setup_var[setup_item_key].w);
791            if ((setup_var[setup_item_key].y - setup_var[setup_item_key].x) / setup_var[setup_item_key].z > 2)
792            {
793                caca_printf(m_caca, setup_p.x + setup_size.x - 4, y, "%4.2f", setup_var[setup_item_key].w);
794                caca_draw_line(m_caca, setup_p.x + 1, y, setup_p.x + 1 + w, y,'.');
795                if(setup_var[setup_item_key].w > setup_var[setup_item_key].x) caca_draw_line(m_caca, setup_p.x + 1, y, setup_p.x + 1 + bar_w, y,'x');
796            }
797            else
798            {
799                caca_put_str(m_caca, setup_p.x + setup_size.x - 3, y, (setup_var[setup_item_key].w == setup_var[setup_item_key].y)?"YES":" NO");
800            }
801        }
802    }
803
804    Draw2D();
805    Draw3D();
806
807}
808
809void Render::Draw2D()
810{
811    /* Draw text in an offline buffer */
812    text_render->Render();
813
814    if (m_shader)
815        fbo_back->Bind();
816
817    glViewport(0, 0, screen_size.x, screen_size.y);
818
819    /* Clear the back buffer */
820    glEnable(GL_BLEND);
821    glBlendFunc(GL_SRC_COLOR,GL_DST_ALPHA);
822    glClearColor(screen_color.r, screen_color.g, screen_color.b, 1.0f);
823    glClearDepth(1.0f); // set depth buffer
824    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
825
826    text_render->Blit(border, canvas_size);
827
828    //if (m_polygon) glEnable(GL_LINE_SMOOTH); else glDisable(GL_LINE_SMOOTH);
829    glLineWidth((m_polygon)?2.0f:1.0f);
830    fx_angle=main_angle-part_angle;
831    if (m_polygon)
832        glEnable(GL_TEXTURE_2D);
833
834    glMatrixMode(GL_PROJECTION);
835    mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f);
836    glLoadMatrixf(&m[0][0]);
837    glMatrixMode(GL_MODELVIEW);
838}
839
840void Render::Draw3D()
841{
842    if (!m_shader)
843        return;
844
845    glDisable(GL_DEPTH_TEST);
846    glDisable(GL_BLEND);
847
848    glEnableClientState(GL_VERTEX_ARRAY);
849    glVertexPointer(4, GL_FLOAT, 0, fs_quad_vtx);
850
851    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
852    glTexCoordPointer(2, GL_FLOAT, 0, fs_quad_tex);
853
854    if (m_shader_remanency)
855    {
856        // shader remanency
857        fbo_ping->Bind();
858        shader_remanency->Bind();
859        shader_remanency->SetTexture(shader_remanency_source, fbo_back->GetTexture(), 0);
860        shader_remanency->SetTexture(shader_remanency_buffer, fbo_buffer->GetTexture(), 1);
861        shader_remanency->SetUniform(shader_remanency_mix, remanency);
862        fs_quad();
863        shader_remanency->Unbind();
864        fbo_ping->Unbind();
865        // shader simple
866        fbo_back->Bind();
867        draw_shader_simple(fbo_ping, 0);
868        fbo_back->Unbind();
869        // save previous fbo
870        fbo_ping->Bind();
871        shader_remanency->Bind();
872        shader_remanency->SetTexture(shader_remanency_source, fbo_front->GetTexture(), 0);
873        shader_remanency->SetTexture(shader_remanency_buffer, fbo_buffer->GetTexture(), 1);
874        shader_remanency->SetUniform(shader_remanency_mix, buffer);
875        fs_quad();
876        shader_remanency->Unbind();
877        fbo_ping->Unbind();
878        // shader simple
879        fbo_buffer->Bind();
880        draw_shader_simple(fbo_ping, 0);
881        fbo_buffer->Unbind();
882    }
883
884    // shader glow
885    if (m_shader_glow)
886    {
887        // shader blur horizontal
888        fbo_blur_h->Bind();
889        shader_blur_h->Bind();
890        shader_blur_h->SetTexture(shader_blur_h_texture, fbo_back->GetTexture(), 0);
891        shader_blur_h->SetUniform(shader_blur_h_radius, glow_large / screen_size.x);
892        fs_quad();
893        shader_blur_h->Unbind();
894        fbo_blur_h->Unbind();
895        // shader blur vertical
896        fbo_blur_v->Bind();
897        shader_blur_v->Bind();
898        shader_blur_v->SetTexture(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
899        shader_blur_v->SetUniform(shader_blur_v_radius, glow_large / screen_size.y);
900        fs_quad();
901        shader_blur_v->Unbind();
902        fbo_blur_v->Unbind();
903        // shader blur horizontal
904        fbo_blur_h->Bind();
905        shader_blur_h->Bind();
906        shader_blur_h->SetTexture(shader_blur_h_texture, fbo_blur_v->GetTexture(), 0);
907        shader_blur_h->SetUniform(shader_blur_h_radius, glow_small / screen_size.x);
908        fs_quad();
909        shader_blur_h->Unbind();
910        fbo_blur_h->Unbind();
911        // shader blur vertical
912        fbo_blur_v->Bind();
913        shader_blur_v->Bind();
914        shader_blur_v->SetTexture(shader_blur_v_texture, fbo_blur_h->GetTexture(), 0);
915        shader_blur_v->SetUniform(shader_blur_v_radius, glow_small / screen_size.y);
916        fs_quad();
917        shader_blur_v->Unbind();
918        fbo_blur_v->Unbind();
919        // shader glow
920        fbo_front->Bind();
921        shader_glow->Bind();
922        shader_glow->SetTexture(shader_glow_glow, fbo_blur_v->GetTexture(), 0);
923        shader_glow->SetTexture(shader_glow_source, fbo_back->GetTexture(), 1);
924        shader_glow->SetUniform(shader_glow_mix, glow_mix);
925        fs_quad();
926        shader_glow->Unbind();
927        fbo_front->Unbind();
928    }
929    else
930    {
931        // shader simple
932        fbo_front->Bind();
933        draw_shader_simple(fbo_back, 0);
934        fbo_front->Unbind();
935    }
936
937    if (m_shader_blur)
938    {
939        // shader blur horizontal
940        fbo_ping->Bind();
941        shader_blur_h->Bind();
942        shader_blur_h->SetTexture(shader_blur_h_texture, fbo_front->GetTexture(), 0);
943        shader_blur_h->SetUniform(shader_blur_h_radius, blur / screen_size.x);
944        fs_quad();
945        shader_blur_h->Unbind();
946        fbo_ping->Unbind();
947        // shader blur vertical
948        fbo_front->Bind();
949        shader_blur_v->Bind();
950        shader_blur_v->SetTexture(shader_blur_v_texture, fbo_ping->GetTexture(), 0);
951        shader_blur_v->SetUniform(shader_blur_v_radius, blur / screen_size.y);
952        fs_quad();
953        shader_blur_v->Unbind();
954        fbo_front->Unbind();
955    }
956
957    if (m_shader_postfx)
958    {
959        // shader postfx
960        shader_postfx->Bind();
961        shader_postfx->SetTexture(shader_postfx_texture, fbo_front->GetTexture(), 0);
962        shader_postfx->SetUniform(shader_postfx_screen_size, (vec2)screen_size);
963        shader_postfx->SetUniform(shader_postfx_time, fx_angle);
964        shader_postfx->SetUniform(shader_postfx_deform, postfx_deform);
965        shader_postfx->SetUniform(shader_postfx_ghost, postfx_ghost);
966        shader_postfx->SetUniform(shader_postfx_filter, postfx_filter);
967        shader_postfx->SetUniform(shader_postfx_color, postfx_color);
968        shader_postfx->SetUniform(shader_postfx_corner, postfx_corner);
969        shader_postfx->SetUniform(shader_postfx_retrace, postfx_retrace);
970        shader_postfx->SetUniform(shader_postfx_offset, postfx_offset);
971        shader_postfx->SetUniform(shader_postfx_noise, postfx_noise);
972        shader_postfx->SetUniform(shader_postfx_aberration, postfx_aberration);
973        shader_postfx->SetUniform(shader_postfx_moire_h, postfx_moire_h);
974        shader_postfx->SetUniform(shader_postfx_moire_v, postfx_moire_v);
975        shader_postfx->SetUniform(shader_postfx_scanline_h, postfx_scanline_h);
976        shader_postfx->SetUniform(shader_postfx_scanline_v, postfx_scanline_v);
977        shader_postfx->SetUniform(shader_postfx_flash, flash_value);
978        shader_postfx->SetUniform(shader_postfx_sync, (float)fabs(beat_value*cosf((main_angle-beat_angle)*8.0f)));
979        fs_quad();
980        shader_postfx->Unbind();
981    }
982    else
983    {
984        // shader simple
985        draw_shader_simple(fbo_front, 0);
986    }
987
988    glDisableClientState(GL_VERTEX_ARRAY);
989    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
990}
991
992Render::~Render()
993{
994}
Note: See TracBrowser for help on using the repository browser.