From a886c0d6df553f90ed56a547e602780b4471b368 Mon Sep 17 00:00:00 2001 From: rez Date: Thu, 16 Aug 2012 15:49:51 +0000 Subject: [PATCH] calculate the number of items for the current setup menu (avoid selection of empty slot) --- neercs/video/render.cpp | 141 +++++++++++++++++++++++++--------------- 1 file changed, 87 insertions(+), 54 deletions(-) diff --git a/neercs/video/render.cpp b/neercs/video/render.cpp index 4374e25..8c8efa8 100644 --- a/neercs/video/render.cpp +++ b/neercs/video/render.cpp @@ -84,6 +84,28 @@ bool beat_flag = false; // flag float beat_angle = 0; // angle float beat_value = 0; // value float beat_speed = 2.0f; // speed +/* common variable */ +float value, angle, radius, scale, speed; +/* shader variable */ +vec2 buffer(0.7f,0.3f); // [new frame mix,old frame mix] +vec2 remanency(0.3f,0.7f); // remanency [source mix,buffer mix] +vec2 glow_mix(0.6f,0.4f); // glow mix [source mix,glow mix] +vec2 glow_large(2.0f,2.0f); // large glow radius [center,corner] +vec2 glow_small(1.0f,1.0f); // small glow radius [center,corner] +vec2 blur(0.25f,0.5f); // glow radius [center,corner] +vec2 postfx_deform(0.7f,0.54f); // deformation [ratio,zoom] +vec3 postfx_filter(0.8f,0.9f,0.4f); // color filter [red,green,blue] +vec3 postfx_color(1.8f,1.5f,0.5f); // color modifier [brightness,contrast,grayscale] +vec2 postfx_corner(0.75f,0.95f); // corner [radius,blur] +vec3 postfx_retrace(0.05f,2.0f,4.0f); // retrace [strength,length,speed] +vec2 postfx_offset(3.0f,3.0f); // random line [horizontal,vertical] +float postfx_noise = 0.15f; // noise +float postfx_aberration = 3.0f; // chromatic aberration +vec4 postfx_ghost(0.1f,0.25f,0.1f,0.5f); // ghost picture [distance,strength,distance,strength] +vec4 postfx_moire_h(0.75f,-0.25f,0.0f,1.0f); // vertical moire [base,variable,repeat x,repeat y] +vec4 postfx_moire_v(0.75f,-0.25f,1.0f,1.5f); // horizontal moire [base,variable,repeat x,repeat y] +vec4 postfx_scanline_h(0.75f, 0.25f,0.0f,2.0f); // vertical scanline [base,variable,repeat x,repeat y] +vec4 postfx_scanline_v(0.75f,-0.25f,2.0f,0.0f); // horizontal scanline [base,variable,repeat x,repeat y] /* window variable */ ivec2 border; // border width /* text variable */ @@ -93,16 +115,27 @@ ivec2 font_size(8,8); // font size ivec2 canvas_char(0,0); // canvas char number ivec2 canvas_size(0,0); // caca size /* setup variable */ -bool setup_switch=false; // switch [option/item] -int setup_option=0; // selected option -int setup_option_n=9; // option number -int setup_item=0; // selected item -int setup_item_n=8; // item number -int setup_item_key=0; // item array key +bool setup_switch = false; // switch [option/item] +int setup_option = 0; // selected option +int setup_option_n = 10; // option number +int setup_item = 0; // selected item +int setup_item_n = 8; // item number +int setup_item_key = 0; // item array key +int setup_n = 0; // contextual option/item number ivec2 setup_p(1,1); // position [x,y] ivec3 setup_size(30,0,12); // size [w,h,split] -ivec2 setup_color(0x678,0x234); // size [w,h] +ivec2 setup_color(0x678,0x234); // color [foreground,background] +//vec3 radial(2.0f,0.8f,0); // radial [mix,strength,color mode] char const *setup_text[] = { + "theme", + "default", + "ye olde monitor", + "green screen", + "", + "", + "", + "", + "", "remanency", "enable", "buffer new frame", @@ -134,11 +167,11 @@ char const *setup_text[] = { "enable", "deform ratio", "zoom base", - "zoom variable", "corner radius", "corner blur", "", "", + "", "color", "filter red", "filter green", @@ -185,32 +218,16 @@ char const *setup_text[] = { "v repeat x", "v repeat y" }; -/* common variable */ -float value, angle, radius, scale, speed; -/* shader variable */ -vec2 buffer(0.7f,0.3f); // [new frame mix,old frame mix] -vec2 remanency(0.3f,0.7f); // remanency [source mix,buffer mix] -vec2 glow_mix(0.6f,0.4f); // glow mix [source mix,glow mix] -vec2 glow_large(2.0f,2.0f); // large glow radius [center,corner] -vec2 glow_small(1.0f,1.0f); // small glow radius [center,corner] -vec2 blur(0.25f,0.5f); // glow radius [center,corner] -//vec3 radial(2.0f,0.8f,0); // radial [mix,strength,color mode] -//------------------------------// [IDEAS] http://www.youtube.com/watch?v=d1qEP2vMe-I -vec2 postfx_deform(0.7f,0.54f); // deformation [ratio,zoom] -vec3 postfx_filter(0.8f,0.9f,0.4f); // color filter [red,green,blue] -vec3 postfx_color(1.8f,1.5f,0.5f); // color modifier [brightness,contrast,grayscale] -vec2 postfx_corner(0.75f,0.95f); // corner [radius,blur] -vec3 postfx_retrace(0.05f,2.0f,4.0f); // retrace [strength,length,speed] -vec2 postfx_offset(3.0f,3.0f); // random line [horizontal,vertical] -float postfx_noise = 0.15f; // noise -float postfx_aberration = 3.0f; // chromatic aberration -vec4 postfx_ghost(0.1f,0.25f,0.1f,0.5f); // ghost picture [distance,strength,distance,strength] -vec4 postfx_moire_h(0.75f,-0.25f,0.0f,1.0f); // vertical moire [base,variable,repeat x,repeat y] -vec4 postfx_moire_v(0.75f,-0.25f,1.0f,1.5f); // horizontal moire [base,variable,repeat x,repeat y] -vec4 postfx_scanline_h(0.75f, 0.25f,0.0f,2.0f); // vertical scanline [base,variable,repeat x,repeat y] -vec4 postfx_scanline_v(0.75f,-0.25f,2.0f,0.0f); // horizontal scanline [base,variable,repeat x,repeat y] -//------------------------------// -vec4 setup_var[]={ +vec4 setup_var[]={ // setup variable [start,end,step,value] + vec4(0), /* theme */ + vec4(0), + vec4(0), + vec4(0), + vec4(0), + vec4(0), + vec4(0), + vec4(0), + vec4(0), vec4(0), /* remanency */ vec4(0, 1, 1, 1), vec4(0.0f, 1.0f, 0.1f, buffer.x), @@ -297,40 +314,53 @@ vec4 setup_var[]={ void Render::UpdateVar() { - int k = 1; + int k = 1; /* theme */ + k += 9; /* remanency */ m_shader_remanency = (setup_var[k].w == 1) ? true : false; k++; buffer = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2; remanency = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2; - k += 4; + k += 4; /* glow */ m_shader_glow = (setup_var[k].w == 1) ? true : false; k++; glow_mix = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2; glow_large = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2; glow_small = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2; - k += 2; + k += 2; /* blur */ m_shader_blur = (setup_var[k].w == 1) ? true : false; k++; blur = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2; - k += 6; + k += 6; /* screen */ m_shader_postfx = (setup_var[k].w == 1) ? true : false; k++; postfx_deform = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2; postfx_corner = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2; - k += 4; + k += 4; /* color */ postfx_filter = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3; postfx_color = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3; - k += 3; + k += 3; /* noise */ postfx_offset = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2; postfx_noise = setup_var[k].w; k++; postfx_aberration = setup_var[k].w; k++; postfx_retrace = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3; - k += 2; + k += 2; /* ghost */ postfx_ghost = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4; - k += 5; + k += 5; /* moire */ 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; 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; - k++; + k++; /* scanline */ 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; 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; } +int calc_item_length() +{ + int n = !setup_switch ? setup_option_n : setup_item_n; + int v = 0; + for (int i = 0; i < n; i++) + { + int k = !setup_switch ? (i * (setup_item_n + 1)) : (setup_option * (setup_item_n + 1) + 1 + i); + if (setup_text[k] == "") return i; + } + return n - 1; +} + Shader *shader_simple; Shader *shader_blur_h, *shader_blur_v; Shader *shader_remanency, *shader_glow, *shader_radial, *shader_postfx; @@ -485,6 +515,8 @@ int Render::CreateGLWindow() setup_size.y = ((setup_option_n > setup_item_n) ? setup_option_n : setup_item_n) + 1; setup_p = (canvas_char - setup_size.xy) / 2; + setup_n = calc_item_length(); + InitDraw(); return true; } @@ -551,6 +583,7 @@ void Render::TickDraw(float seconds) if (m_setup) { setup_switch = !setup_switch; + setup_n = calc_item_length(); } timer_key = timer; } @@ -561,13 +594,13 @@ void Render::TickDraw(float seconds) if (!setup_switch) { setup_option--; - if (setup_option < 0) setup_option = setup_option_n - 1; + if (setup_option < 0) setup_option = setup_n; setup_item = 0; } else { setup_item--; - if (setup_item < 0) setup_item = setup_item_n - 1; + if (setup_item < 0) setup_item = setup_n; } } timer_key = timer; @@ -579,13 +612,13 @@ void Render::TickDraw(float seconds) if (!setup_switch) { setup_option++; - if (setup_option > setup_option_n - 1) setup_option = 0; + if (setup_option > setup_n) setup_option = 0; setup_item = 0; } else { setup_item++; - if (setup_item > setup_item_n - 1) setup_item = 0; + if (setup_item > setup_n) setup_item = 0; } } timer_key = timer; @@ -611,12 +644,12 @@ void Render::TickDraw(float seconds) { if (!setup_switch) { - setup_option = setup_option_n - 1; + setup_option = setup_n; setup_item = 0; } else { - setup_item = setup_item_n - 1; + setup_item = setup_n; } } timer_key = timer; @@ -733,17 +766,17 @@ void Render::TickDraw(float seconds) for (int i = 0; i < setup_item_n; i++) { int y = setup_p.y + 1 + i; - int k = setup_option * (setup_item_n + 1) + 1; + int k = setup_option * (setup_item_n + 1) + 1 + i; if (setup_item != i || !setup_switch) { caca_set_color_argb(m_caca, setup_color.x, setup_color.y); - caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k + i]); + caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k]); } else { caca_set_color_argb(m_caca, setup_color.y, setup_color.x); caca_draw_line(m_caca, setup_p.x + setup_size.z, y, setup_p.x + setup_size.x, y,' '); - caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k + i]); + caca_put_str(m_caca, setup_p.x + setup_size.z + 1, y, setup_text[k]); } } /* display variable */ @@ -751,7 +784,7 @@ void Render::TickDraw(float seconds) setup_item_key = setup_option * (setup_item_n + 1) + 1 + setup_item; caca_set_color_argb(m_caca, setup_color.y, setup_color.x); caca_draw_line(m_caca, setup_p.x, y, setup_p.x + setup_size.x, y,' '); - if (setup_switch && setup_text[setup_item_key] != "") + if (setup_switch) { int w = setup_size.x - 3 - 4; int bar_w = (w / (setup_var[setup_item_key].y - setup_var[setup_item_key].x) * setup_var[setup_item_key].w); @@ -958,4 +991,4 @@ void Render::Draw3D() Render::~Render() { -} \ No newline at end of file +}