From 4734c5b64ac423766702881753c41a8cc09da65f Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 28 Jan 2012 21:20:34 +0900 Subject: [PATCH] Implement water alpha. --- libs/video/renderer/glsl/glsl_bsp.c | 16 ++++++++++++++++ libs/video/renderer/glsl/quakebsp.frag | 3 ++- libs/video/renderer/glsl/quakebsp.vert | 3 +++ libs/video/renderer/glsl/quaketrb.frag | 3 ++- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/libs/video/renderer/glsl/glsl_bsp.c b/libs/video/renderer/glsl/glsl_bsp.c index a53847ed1..8d9c22baa 100644 --- a/libs/video/renderer/glsl/glsl_bsp.c +++ b/libs/video/renderer/glsl/glsl_bsp.c @@ -132,6 +132,7 @@ static struct { shaderparam_t colormap; shaderparam_t texture; shaderparam_t lightmap; + shaderparam_t color; } quake_bsp = { 0, {"mvp_mat", 1}, @@ -140,6 +141,7 @@ static struct { {"colormap", 1}, {"texture", 1}, {"lightmap", 1}, + {"vcolor", 0}, }; static struct { @@ -150,6 +152,7 @@ static struct { shaderparam_t palette; shaderparam_t texture; shaderparam_t realtime; + shaderparam_t color; } quake_turb = { 0, {"mvp_mat", 1}, @@ -158,6 +161,7 @@ static struct { {"palette", 1}, {"texture", 1}, {"realtime", 1}, + {"vcolor", 0}, }; static struct { @@ -800,11 +804,15 @@ draw_elechain (elechain_t *ec, int matloc, int vertloc, int tlstloc) static void bsp_begin (void) { + static quat_t color = { 1, 1, 1, 1 }; Mat4Mult (glsl_projection, glsl_view, bsp_vp); qfglUseProgram (quake_bsp.program); qfglEnableVertexAttribArray (quake_bsp.vertex.location); qfglEnableVertexAttribArray (quake_bsp.tlst.location); + qfglDisableVertexAttribArray (quake_bsp.color.location); + + qfglVertexAttrib4fv (quake_bsp.color.location, color); qfglUniform1i (quake_bsp.colormap.location, 2); qfglActiveTexture (GL_TEXTURE0 + 2); @@ -842,11 +850,17 @@ bsp_end (void) static void turb_begin (void) { + static quat_t color = { 1, 1, 1, 1 }; + Mat4Mult (glsl_projection, glsl_view, bsp_vp); qfglUseProgram (quake_turb.program); qfglEnableVertexAttribArray (quake_turb.vertex.location); qfglEnableVertexAttribArray (quake_turb.tlst.location); + qfglDisableVertexAttribArray (quake_bsp.color.location); + + color[3] = bound (0, r_wateralpha->value, 1); + qfglVertexAttrib4fv (quake_turb.color.location, color); qfglUniform1i (quake_turb.palette.location, 1); qfglActiveTexture (GL_TEXTURE0 + 1); @@ -1168,6 +1182,7 @@ R_InitBsp (void) GL_ResolveShaderParam (quake_bsp.program, &quake_bsp.colormap); GL_ResolveShaderParam (quake_bsp.program, &quake_bsp.texture); GL_ResolveShaderParam (quake_bsp.program, &quake_bsp.lightmap); + GL_ResolveShaderParam (quake_bsp.program, &quake_bsp.color); frag = GL_CompileShader ("quaketrb.frag", quaketurb_frag, GL_FRAGMENT_SHADER); @@ -1178,6 +1193,7 @@ R_InitBsp (void) GL_ResolveShaderParam (quake_turb.program, &quake_turb.palette); GL_ResolveShaderParam (quake_turb.program, &quake_turb.texture); GL_ResolveShaderParam (quake_turb.program, &quake_turb.realtime); + GL_ResolveShaderParam (quake_turb.program, &quake_turb.color); vert = GL_CompileShader ("quakesky.vert", quakesky_vert, GL_VERTEX_SHADER); frag = GL_CompileShader ("quakeski.frag", quakeskyid_frag, diff --git a/libs/video/renderer/glsl/quakebsp.frag b/libs/video/renderer/glsl/quakebsp.frag index 162461309..bfdb24fbb 100644 --- a/libs/video/renderer/glsl/quakebsp.frag +++ b/libs/video/renderer/glsl/quakebsp.frag @@ -4,6 +4,7 @@ uniform sampler2D lightmap; varying vec2 tst; varying vec2 lst; +varying vec4 color; void main (void) @@ -12,5 +13,5 @@ main (void) float light = texture2D (lightmap, lst).r; float col; - gl_FragColor = texture2D (colormap, vec2 (pix, light * 4.0)); + gl_FragColor = texture2D (colormap, vec2 (pix, light * 4.0)) * color; } diff --git a/libs/video/renderer/glsl/quakebsp.vert b/libs/video/renderer/glsl/quakebsp.vert index 8992ac37e..fc22d17e6 100644 --- a/libs/video/renderer/glsl/quakebsp.vert +++ b/libs/video/renderer/glsl/quakebsp.vert @@ -1,10 +1,12 @@ uniform mat4 mvp_mat; +attribute vec4 vcolor; attribute vec4 tlst; attribute vec4 vertex; varying vec2 tst; varying vec2 lst; +varying vec4 color; void main (void) @@ -12,4 +14,5 @@ main (void) gl_Position = mvp_mat * vertex; tst = tlst.st; lst = tlst.pq; + color = vcolor; } diff --git a/libs/video/renderer/glsl/quaketrb.frag b/libs/video/renderer/glsl/quaketrb.frag index 7828cab87..cc3f13e0a 100644 --- a/libs/video/renderer/glsl/quaketrb.frag +++ b/libs/video/renderer/glsl/quaketrb.frag @@ -3,6 +3,7 @@ uniform sampler2D texture; uniform float realtime; varying vec2 tst; +varying vec4 color; const float SPEED = 20.0; const float CYCLE = 128.0; @@ -27,5 +28,5 @@ main (void) st = turb_st (tst, realtime); pix = texture2D (texture, st).r; - gl_FragColor = texture2D (palette, vec2 (pix, 0.0)); + gl_FragColor = texture2D (palette, vec2 (pix, 0.0)) * color; }