diff options
author | SmileTheory <SmileTheory@gmail.com> | 2013-03-14 23:11:27 -0700 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2013-03-19 16:41:20 +0000 |
commit | d848901749d5d3a73a7111bdbdd34b6c7ef85f67 (patch) | |
tree | 7b61938c4dd884848d9849219c78216fb15cdd66 | |
parent | ee7ec241bf5fec5dcb97414e255573df52f42b0a (diff) |
Support more tcgens in lightall shader.
-rw-r--r-- | src/renderergl2/glsl/lightall_vp.glsl | 40 | ||||
-rw-r--r-- | src/renderergl2/tr_shader.c | 16 |
2 files changed, 38 insertions, 18 deletions
diff --git a/src/renderergl2/glsl/lightall_vp.glsl b/src/renderergl2/glsl/lightall_vp.glsl index 05a41f4d..4604b6ed 100644 --- a/src/renderergl2/glsl/lightall_vp.glsl +++ b/src/renderergl2/glsl/lightall_vp.glsl @@ -1,5 +1,5 @@ attribute vec4 attr_TexCoord0; -#if defined(USE_LIGHTMAP) +#if defined(USE_LIGHTMAP) || defined(USE_TCGEN) attribute vec4 attr_TexCoord1; #endif attribute vec4 attr_Color; @@ -31,6 +31,8 @@ uniform vec3 u_ViewOrigin; #if defined(USE_TCGEN) uniform int u_TCGen0; +uniform vec3 u_TCGen0Vector0; +uniform vec3 u_TCGen0Vector1; #endif #if defined(USE_TCMOD) @@ -92,6 +94,29 @@ varying vec3 var_VertLight; varying vec3 var_WorldLight; #endif +#if defined(USE_TCGEN) +vec2 GenTexCoords(int TCGen, vec3 position, vec3 normal, vec3 TCGenVector0, vec3 TCGenVector1) +{ + vec2 tex = attr_TexCoord0.st; + + if (TCGen == TCGEN_LIGHTMAP) + { + tex = attr_TexCoord1.st; + } + else if (TCGen == TCGEN_ENVIRONMENT_MAPPED) + { + vec3 viewer = normalize(u_ViewOrigin - position); + tex = -reflect(viewer, normal).yz * vec2(0.5, -0.5) + 0.5; + } + else if (TCGen == TCGEN_VECTOR) + { + tex = vec2(dot(position, TCGenVector0), dot(position, TCGenVector1)); + } + + return tex; +} +#endif + #if defined(USE_TCMOD) vec2 ModTexCoords(vec2 st, vec3 position, vec4 texMatrix, vec4 offTurb) { @@ -158,18 +183,11 @@ void main() var_SampleToView = SampleToView; #endif - vec2 tex; - #if defined(USE_TCGEN) - if (u_TCGen0 == TCGEN_ENVIRONMENT_MAPPED) - { - tex = -reflect(normalize(SampleToView), normal).yz * vec2(0.5, -0.5) + 0.5; - } - else + vec2 tex = GenTexCoords(u_TCGen0, position.xyz, normal, u_TCGen0Vector0, u_TCGen0Vector1); +#else + vec2 tex = attr_TexCoord0.st; #endif - { - tex = attr_TexCoord0.st; - } #if defined(USE_TCMOD) var_DiffuseTex = ModTexCoords(tex, position.xyz, u_DiffuseTexMatrix, u_DiffuseTexOffTurb); diff --git a/src/renderergl2/tr_shader.c b/src/renderergl2/tr_shader.c index 5dfe4d5f..06b004b1 100644 --- a/src/renderergl2/tr_shader.c +++ b/src/renderergl2/tr_shader.c @@ -2164,7 +2164,7 @@ static qboolean CollapseMultitexture( void ) { static void CollapseStagesToLightall(shaderStage_t *diffuse, shaderStage_t *normal, shaderStage_t *specular, shaderStage_t *lightmap, - qboolean useLightVector, qboolean useLightVertex, qboolean parallax, qboolean environment) + qboolean useLightVector, qboolean useLightVertex, qboolean parallax, qboolean tcgen) { int defs = 0; @@ -2242,7 +2242,7 @@ static void CollapseStagesToLightall(shaderStage_t *diffuse, } } - if (environment || diffuse->bundle[0].numTexMods) + if (tcgen || diffuse->bundle[0].numTexMods) { defs |= LIGHTDEF_USE_TCGEN_AND_TCMOD; } @@ -2348,7 +2348,7 @@ static qboolean CollapseStagesToGLSL(void) { shaderStage_t *pStage = &stages[i]; shaderStage_t *diffuse, *normal, *specular, *lightmap; - qboolean parallax, environment, diffuselit, vertexlit; + qboolean parallax, tcgen, diffuselit, vertexlit; if (!pStage->active) continue; @@ -2411,10 +2411,12 @@ static qboolean CollapseStagesToGLSL(void) } } - environment = qfalse; - if (diffuse->bundle[0].tcGen == TCGEN_ENVIRONMENT_MAPPED) + tcgen = qfalse; + if (diffuse->bundle[0].tcGen == TCGEN_ENVIRONMENT_MAPPED + || diffuse->bundle[0].tcGen == TCGEN_LIGHTMAP + || diffuse->bundle[0].tcGen == TCGEN_VECTOR) { - environment = qtrue; + tcgen = qtrue; } diffuselit = qfalse; @@ -2429,7 +2431,7 @@ static qboolean CollapseStagesToGLSL(void) vertexlit = qtrue; } - CollapseStagesToLightall(diffuse, normal, specular, lightmap, diffuselit, vertexlit, parallax, environment); + CollapseStagesToLightall(diffuse, normal, specular, lightmap, diffuselit, vertexlit, parallax, tcgen); } // deactivate lightmap stages |