From fcad48e2ce80c01b7d3ffabe15b0986e24c05c30 Mon Sep 17 00:00:00 2001
From: rez <chiptune@gmail.com>
Date: Fri, 24 Aug 2012 01:21:53 +0000
Subject: [PATCH] moved noise/offset/retrace into a new shader

---
 neercs/Makefile.am            |   4 +-
 neercs/neercs.vcxproj         |   7 +-
 neercs/neercs.vcxproj.filters |  13 ++--
 neercs/video/noise.lolfx      |  38 ++++++++++
 neercs/video/postfx.lolfx     |  23 +-----
 neercs/video/render.cpp       | 137 +++++++++++++++++++++-------------
 neercs/video/render.h         |   2 +
 neercs/video/simple.lolfx     |  15 ++--
 8 files changed, 149 insertions(+), 90 deletions(-)
 create mode 100644 neercs/video/noise.lolfx

diff --git a/neercs/Makefile.am b/neercs/Makefile.am
index 9bdee43..1efa67a 100644
--- a/neercs/Makefile.am
+++ b/neercs/Makefile.am
@@ -11,8 +11,8 @@ neercs_SOURCES = \
     video/render.cpp video/render.h \
     video/text-render.cpp video/text-render.h \
     video/simple.lolfx \
-    video/blurh.lolfx video/blurv.lolfx \
-    video/remanency.lolfx video/glow.lolfx video/postfx.lolfx video/radial.lolfx \
+    video/blurh.lolfx video/blurv.lolfx video/glow.lolfx video/radial.lolfx \
+    video/remanency.lolfx video/noise.lolfx video/postfx.lolfx\
     video/text.lolfx
 neercs_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ @CACA_CFLAGS@ -Iold
 neercs_LDADD =
diff --git a/neercs/neercs.vcxproj b/neercs/neercs.vcxproj
index 66b92e7..50dd44b 100644
--- a/neercs/neercs.vcxproj
+++ b/neercs/neercs.vcxproj
@@ -78,14 +78,15 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
+    <LolFxCompile Include="video\simple.lolfx" />
+    <LolFxCompile Include="video\text.lolfx" />
     <LolFxCompile Include="video\blurh.lolfx" />
     <LolFxCompile Include="video\blurv.lolfx" />
     <LolFxCompile Include="video\glow.lolfx" />
-    <LolFxCompile Include="video\postfx.lolfx" />
     <LolFxCompile Include="video\radial.lolfx" />
     <LolFxCompile Include="video\remanency.lolfx" />
-    <LolFxCompile Include="video\simple.lolfx" />
-    <LolFxCompile Include="video\text.lolfx" />
+    <LolFxCompile Include="video\noise.lolfx" />
+    <LolFxCompile Include="video\postfx.lolfx" />
   </ItemGroup>
   <PropertyGroup Label="Globals">
     <ProjectGuid>{587FCCE9-1D8D-4398-B8B6-E8F4E9A92233}</ProjectGuid>
diff --git a/neercs/neercs.vcxproj.filters b/neercs/neercs.vcxproj.filters
index 3ccf4e3..36dd003 100644
--- a/neercs/neercs.vcxproj.filters
+++ b/neercs/neercs.vcxproj.filters
@@ -114,6 +114,12 @@
     </Filter>
   </ItemGroup>
   <ItemGroup>
+    <LolFxCompile Include="video\simple.lolfx">
+      <Filter>video</Filter>
+    </LolFxCompile>
+    <LolFxCompile Include="video\text.lolfx">
+      <Filter>video</Filter>
+    </LolFxCompile>
     <LolFxCompile Include="video\blurh.lolfx">
       <Filter>video</Filter>
     </LolFxCompile>
@@ -123,19 +129,16 @@
     <LolFxCompile Include="video\glow.lolfx">
       <Filter>video</Filter>
     </LolFxCompile>
-    <LolFxCompile Include="video\postfx.lolfx">
-      <Filter>video</Filter>
-    </LolFxCompile>
     <LolFxCompile Include="video\radial.lolfx">
       <Filter>video</Filter>
     </LolFxCompile>
     <LolFxCompile Include="video\remanency.lolfx">
       <Filter>video</Filter>
     </LolFxCompile>
-    <LolFxCompile Include="video\simple.lolfx">
+    <LolFxCompile Include="video\noise.lolfx">
       <Filter>video</Filter>
     </LolFxCompile>
-    <LolFxCompile Include="video\text.lolfx">
+    <LolFxCompile Include="video\postfx.lolfx">
       <Filter>video</Filter>
     </LolFxCompile>
   </ItemGroup>
diff --git a/neercs/video/noise.lolfx b/neercs/video/noise.lolfx
new file mode 100644
index 0000000..58b1842
--- /dev/null
+++ b/neercs/video/noise.lolfx
@@ -0,0 +1,38 @@
+-- GLSL.Vert --
+
+#version 120
+
+void main()
+	{
+	gl_Position=gl_Vertex;
+	gl_TexCoord[0]=gl_MultiTexCoord0;
+	}
+
+-- GLSL.Frag --
+
+#version 120
+
+uniform sampler2D texture;
+uniform vec2 screen_size;
+uniform float time;
+uniform vec2 offset;
+uniform float noise;
+uniform vec3 retrace;
+
+float rand(in vec2 p)
+	{
+	return fract(sin(dot(p,vec2(12.9898,78.233)))*43758.5453);
+	}
+
+void main(void)
+	{
+	vec2 p=gl_FragCoord.xy/screen_size.xy;
+
+	float rnd=rand(p+time);
+	vec2 o=(offset-offset*2.0*rnd)/screen_size;
+
+	vec3 c=texture2D(texture,p+o).xyz;						// offset
+	c-=rnd*noise;											// noise
+	c-=retrace.x*mod(p.y*retrace.y+time*retrace.z,1.0);		// retrace
+	gl_FragColor=vec4(c,1.0);
+	}
\ No newline at end of file
diff --git a/neercs/video/postfx.lolfx b/neercs/video/postfx.lolfx
index da4d076..d03cdf8 100644
--- a/neercs/video/postfx.lolfx
+++ b/neercs/video/postfx.lolfx
@@ -20,9 +20,6 @@ uniform vec4 ghost1;
 uniform vec4 ghost2;
 uniform vec3 filter;
 uniform vec3 color;
-uniform vec3 retrace;
-uniform vec2 offset;
-uniform float noise;
 uniform float aberration;
 uniform vec4 moire_h;
 uniform vec4 moire_v;
@@ -33,8 +30,6 @@ uniform float vignetting;
 uniform float flash;
 uniform float sync;
 
-const float PI=3.14159265358979323846;
-
 vec2 screen(in vec2 p,in float radius)
 	{
 	float d=deform.x+sync*0.0625;
@@ -46,11 +41,6 @@ vec3 get_color(in sampler2D tex,in vec2 p)
 	return texture2D(tex,clamp(p,-1.0,0.0)).xyz;
 	}
 
-float rand(in vec2 p)
-	{
-	return fract(sin(dot(p,vec2(12.9898,78.233)))*43758.5453);
-	}
-
 float letterbox(in vec2 p,in float radius,in float smooth)
 	{
 	return 1.0-smoothstep(smooth,1.0,length(max(abs(p*2.0+1.0)-vec2(radius),0.0))+radius);
@@ -66,19 +56,16 @@ void main(void)
 	vec2 z2=screen(p,deform.y+ghost2.z*0.01);
 	float mask=q.x*(6.0-q.x*6.0)*q.y*(6.0-q.y*6.0);
 
-	vec2 rnd=vec2(rand(vec2(p.x+time,p.y-time)),rand(vec2(p.x-time,p.y+time)));
-
-	vec2 o=(offset-offset*2.0*rnd.x)/screen_size;			// offset
-	vec3 source=get_color(texture,z+o);						// offset added to source
+	vec3 source=get_color(texture,z);
 	vec3 g1=get_color(texture,z1-ghost1.xy);
 	vec3 g2=get_color(texture,z2-ghost2.xy);
 
 	float v=aberration/float(screen_size.x)+aberration/float(screen_size.x)*(2.0-mask);
 
 	vec3 ca;
-	ca.x=get_color(texture,vec2(z.x+o.x-v,z.y+o.y)).x;
-	ca.y=get_color(texture,vec2(z.x+o.x  ,z.y+o.y)).y;
-	ca.z=get_color(texture,vec2(z.x+o.x+v,z.y+o.y)).z;
+	ca.x=get_color(texture,vec2(z.x-v,z.y)).x;
+	ca.y=get_color(texture,vec2(z.x  ,z.y)).y;
+	ca.z=get_color(texture,vec2(z.x+v,z.y)).z;
 
 	vec3 c=source+g1*g1*ghost1.w+g2*g2*ghost2.w;			// mix
 
@@ -91,8 +78,6 @@ void main(void)
 
 	c+=flash;												// flash
 	c+=ca;													// chromatic aberration
-	c-=retrace.x*mod(z.y*retrace.y+time*retrace.z,1.0);		// retrace
-	c-=(vec3(rnd.x-rnd.y))*noise;							// noise
 	c*=moire_h.x+moire_h.y*sin(z.y*float(screen_size.y*moire_h.z))*sin(0.5+z.x*float(screen_size.x*moire_h.w));	// moire h
 	c*=moire_v.x+moire_v.y*sin(z.x*float(screen_size.x*moire_v.z))*sin(0.5+z.y*float(screen_size.y*moire_v.w));	// moire v
 	c*=scanline_h.x+scanline_h.y*cos(z.y*float(screen_size.y*scanline_h.z+scanline_h.w));	// scanline h
diff --git a/neercs/video/render.cpp b/neercs/video/render.cpp
index 784d0d2..706176f 100644
--- a/neercs/video/render.cpp
+++ b/neercs/video/render.cpp
@@ -31,13 +31,14 @@ using namespace lol;
 #include "render.h"
 #include "text-render.h"
 
+extern char const *lolfx_simple;
+extern char const *lolfx_remanency;
 extern char const *lolfx_blurh;
 extern char const *lolfx_blurv;
-extern char const *lolfx_remanency;
 extern char const *lolfx_glow;
-extern char const *lolfx_postfx;
 extern char const *lolfx_radial;
-extern char const *lolfx_simple;
+extern char const *lolfx_noise;
+extern char const *lolfx_postfx;
 
 #define PID M_PI/180.0f    // pi ratio
 #define CR 1.0f/256.0f     // color ratio
@@ -91,17 +92,17 @@ 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]
+vec2 noise_offset(3.0f,3.0f);         // random line [horizontal,vertical]
+float noise_noise = 0.15f;            // noise
+vec3 noise_retrace(0.05f,2.0f,4.0f);  // retrace [strength,length,speed]
+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]
 float postfx_vignetting = -0.5f;      // vignetting strength
-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 = 4.0f; // chromatic aberration
 vec4 postfx_ghost1(0.01f,0.0f,0.1f,-0.4f);      // ghost picture 1 [position x,position y,position z,strength]
 vec4 postfx_ghost2(0.02f,0.0f,0.1f,0.4f);       // ghost picture 2 [position x,position y,position z,strength]
+float postfx_aberration = 4.0f;                 // chromatic aberration
 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]
@@ -179,17 +180,17 @@ char const *setup_text[] = {
         "brightness",
         "contrast",
         "grayscale",
-        "",
+        "aberration",
         "",
     "noise",
         "offset h",
         "offset v",
         "noise",
-        "aberration",
         "retrace strength",
         "retrace length",
         "retrace speed",
         "",
+        "",
     "ghost",
         "back x",
         "back y",
@@ -271,16 +272,16 @@ vec4 setup_var[]={ // setup variable [start,end,step,value]
         vec4(0.0f, 4.0f, 0.1f, postfx_color.x),
         vec4(0.0f, 4.0f, 0.1f, postfx_color.y),
         vec4(0.0f, 1.5f, 0.1f, postfx_color.z),
-        vec4(0),
+        vec4(0.0f, 8.0f, 0.5f, postfx_aberration),
         vec4(0),
     vec4(0), /* noise */
-        vec4(0.0f, 4.0f, 0.50f, postfx_offset.x),
-        vec4(0.0f, 4.0f, 0.50f, postfx_offset.y),
-        vec4(0.0f, 1.0f, 0.05f, postfx_noise),
-        vec4(0.0f, 8.0f, 0.50f, postfx_aberration),
-        vec4(0.0f, 0.2f, 0.01f, postfx_retrace.x),
-        vec4(0.0f, 8.0f, 0.50f, postfx_retrace.y),
-        vec4(0.0f, 4.0f, 0.25f, postfx_retrace.z),
+        vec4(0.0f, 4.0f, 0.50f, noise_offset.x),
+        vec4(0.0f, 4.0f, 0.50f, noise_offset.y),
+        vec4(0.0f, 1.0f, 0.05f, noise_noise),
+        vec4(0.0f, 0.2f, 0.01f, noise_retrace.x),
+        vec4(0.0f, 8.0f, 0.50f, noise_retrace.y),
+        vec4(0.0f, 4.0f, 0.25f, noise_retrace.z),
+        vec4(0),
         vec4(0),
     vec4(0), /* ghost */
         vec4(-0.5f, 0.5f, 0.01f, postfx_ghost1.x),
@@ -335,12 +336,12 @@ void Render::UpdateVar()
     k += 3; /* 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; /* 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; /* ghost */
+    k += 2; /* noise */
+    noise_offset = vec2(setup_var[k].w, setup_var[k + 1].w); k += 2;
+    noise_noise = setup_var[k].w; k++;
+    noise_retrace = vec3(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w); k += 3;
+    k += 3; /* ghost */
     postfx_ghost1 = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
     postfx_ghost2 = vec4(setup_var[k].w, setup_var[k + 1].w, setup_var[k + 2].w, setup_var[k + 3].w); k += 4;
     k += 1; /* moire */
@@ -364,26 +365,33 @@ int calc_item_length()
 }
 
 Shader *shader_simple;
-Shader *shader_blur_h, *shader_blur_v;
-Shader *shader_remanency, *shader_glow, *shader_radial, *shader_postfx;
+Shader *shader_remanency;
+Shader *shader_blur_h, *shader_blur_v, *shader_glow, *shader_radial;
+Shader *shader_noise, *shader_postfx;
 // shader variables
 ShaderUniform shader_simple_texture;
 ShaderUniform shader_remanency_source,
               shader_remanency_buffer,
               shader_remanency_mix;
-ShaderUniform shader_glow_glow,
-              shader_glow_source,
-              shader_glow_mix;
 ShaderUniform shader_blur_h_texture,
               shader_blur_h_radius,
               shader_blur_v_texture,
               shader_blur_v_radius;
+ShaderUniform shader_glow_glow,
+              shader_glow_source,
+              shader_glow_mix;
 ShaderUniform shader_radial_texture,
               shader_radial_screen_size,
               shader_radial_time,
               shader_radial_value1,
               shader_radial_value2,
               shader_radial_color;
+ShaderUniform shader_noise_texture,
+              shader_noise_screen_size,
+              shader_noise_time,
+              shader_noise_offset,
+              shader_noise_noise,
+              shader_noise_retrace;
 ShaderUniform shader_postfx_texture,
               shader_postfx_texture_2d,
               shader_postfx_screen_size,
@@ -395,9 +403,6 @@ ShaderUniform shader_postfx_texture,
               shader_postfx_color,
               shader_postfx_corner,
               shader_postfx_vignetting,
-              shader_postfx_retrace,
-              shader_postfx_offset,
-              shader_postfx_noise,
               shader_postfx_aberration,
               shader_postfx_moire_h,
               shader_postfx_moire_v,
@@ -479,6 +484,14 @@ int Render::InitDraw(void)
     shader_radial_value1 = shader_radial->GetUniformLocation("value1");
     shader_radial_value2 = shader_radial->GetUniformLocation("value2");
     shader_radial_color = shader_radial->GetUniformLocation("color");
+    // shader noise
+    shader_noise = Shader::Create(lolfx_noise);
+    shader_noise_texture = shader_noise->GetUniformLocation("texture");
+    shader_noise_screen_size = shader_noise->GetUniformLocation("screen_size");
+    shader_noise_time = shader_noise->GetUniformLocation("time");
+    shader_noise_offset = shader_noise->GetUniformLocation("offset");
+    shader_noise_noise = shader_noise->GetUniformLocation("noise");
+    shader_noise_retrace = shader_noise->GetUniformLocation("retrace");
     // shader postfx
     shader_postfx = Shader::Create(lolfx_postfx);
     shader_postfx_texture = shader_postfx->GetUniformLocation("texture");
@@ -492,10 +505,7 @@ int Render::InitDraw(void)
     shader_postfx_color = shader_postfx->GetUniformLocation("color");
     shader_postfx_corner = shader_postfx->GetUniformLocation("corner");
     shader_postfx_vignetting = shader_postfx->GetUniformLocation("vignetting");
-    shader_postfx_retrace = shader_postfx->GetUniformLocation("retrace");
-    shader_postfx_offset = shader_postfx->GetUniformLocation("offset");
-    shader_postfx_noise = shader_postfx->GetUniformLocation("noise");
-    shader_postfx_aberration = shader_postfx->GetUniformLocation("aberration");
+    shader_postfx_aberration = shader_noise->GetUniformLocation("aberration");
     shader_postfx_moire_h = shader_postfx->GetUniformLocation("moire_h");
     shader_postfx_moire_v = shader_postfx->GetUniformLocation("moire_v");
     shader_postfx_scanline_h = shader_postfx->GetUniformLocation("scanline_h");
@@ -537,6 +547,7 @@ Render::Render(caca_canvas_t *caca)
     m_shader_remanency(true),
     m_shader_glow(true),
     m_shader_blur(true),
+    m_shader_noise(true),
     m_shader_postfx(true)
 {
     text_render = new TextRender(m_caca, font_size);
@@ -571,19 +582,6 @@ void Render::TickDraw(float seconds)
         polygon_fillmode = (m_polygon)?GL_FILL:GL_LINE;
         glPolygonMode(GL_FRONT, polygon_fillmode);
     }
-    if (Input::WasPressed(Key::F3))
-    {
-        m_shader_glow = !m_shader_glow;
-        m_shader_blur = !m_shader_blur;
-    }
-    if (Input::WasPressed(Key::F4))
-    {
-        m_shader_postfx = !m_shader_postfx;
-    }
-    if (Input::WasPressed(Key::F5))
-    {
-        Pause();
-    }
    if (Input::WasPressed(Key::Tab))
     {
         if (m_setup)
@@ -673,10 +671,26 @@ void Render::TickDraw(float seconds)
             Render::UpdateVar();
         }
     }
+    if (Input::WasPressed(Key::Home))
+    {
+        if (m_setup && setup_switch)
+        {
+            setup_var[setup_item_key].w = setup_var[setup_item_key].x;
+            Render::UpdateVar();
+        }
+    }
+    if (Input::WasPressed(Key::End))
+    {
+        if (m_setup && setup_switch)
+        {
+            setup_var[setup_item_key].w = setup_var[setup_item_key].y;
+            Render::UpdateVar();
+        }
+    }
     if (Input::WasPressed(Key::Return))
     {
-        sync_flag = true;
-        sync_angle = main_angle;
+        fade_flag = true;
+        fade_angle = main_angle;
     }
 
     Entity::TickDraw(seconds);
@@ -957,6 +971,26 @@ void Render::Draw3D()
         fbo_front->Unbind();
     }
 
+    if (m_shader_noise)
+    {
+        // shader noise
+        fbo_ping->Bind();
+        shader_noise->Bind();
+        shader_noise->SetUniform(shader_noise_texture, fbo_front->GetTexture(), 0);
+        shader_noise->SetUniform(shader_noise_screen_size, (vec2)screen_size);
+        shader_noise->SetUniform(shader_noise_time, fx_angle);
+        shader_noise->SetUniform(shader_noise_offset, noise_offset);
+        shader_noise->SetUniform(shader_noise_noise, noise_noise);
+        shader_noise->SetUniform(shader_noise_retrace, noise_retrace);
+        fs_quad();
+        shader_noise->Unbind();
+        fbo_ping->Unbind();
+        // shader simple
+        fbo_front->Bind();
+        draw_shader_simple(fbo_ping, 0);
+        fbo_front->Unbind();
+    }
+
     if (m_shader_postfx)
     {
         // shader postfx
@@ -971,9 +1005,6 @@ void Render::Draw3D()
         shader_postfx->SetUniform(shader_postfx_color, postfx_color);
         shader_postfx->SetUniform(shader_postfx_corner, postfx_corner);
         shader_postfx->SetUniform(shader_postfx_vignetting, postfx_vignetting);
-        shader_postfx->SetUniform(shader_postfx_retrace, postfx_retrace);
-        shader_postfx->SetUniform(shader_postfx_offset, postfx_offset);
-        shader_postfx->SetUniform(shader_postfx_noise, postfx_noise);
         shader_postfx->SetUniform(shader_postfx_aberration, postfx_aberration);
         shader_postfx->SetUniform(shader_postfx_moire_h, postfx_moire_h);
         shader_postfx->SetUniform(shader_postfx_moire_v, postfx_moire_v);
diff --git a/neercs/video/render.h b/neercs/video/render.h
index 4201ebe..51c64a9 100644
--- a/neercs/video/render.h
+++ b/neercs/video/render.h
@@ -36,6 +36,8 @@ private:
     bool m_shader_remanency;
     bool m_shader_blur;
     bool m_shader_glow;
+    bool m_shader_radial;
+    bool m_shader_noise;
     bool m_shader_postfx;
 };
 
diff --git a/neercs/video/simple.lolfx b/neercs/video/simple.lolfx
index b630c9d..c0a7e4e 100644
--- a/neercs/video/simple.lolfx
+++ b/neercs/video/simple.lolfx
@@ -3,10 +3,10 @@
 #version 120
 
 void main()
-{
-    gl_Position = gl_Vertex;
-    gl_TexCoord[0] = gl_MultiTexCoord0;
-}
+	{
+	gl_Position = gl_Vertex;
+	gl_TexCoord[0] = gl_MultiTexCoord0;
+	}
 
 -- GLSL.Frag --
 
@@ -15,7 +15,6 @@ void main()
 uniform sampler2D texture;
 
 void main(void)
-{
-    gl_FragColor = texture2D(texture, gl_TexCoord[0].xy);
-}
-
+	{
+	gl_FragColor = texture2D(texture, gl_TexCoord[0].xy);
+	}
\ No newline at end of file