summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSmileTheory <SmileTheory@gmail.com>2013-03-14 23:11:27 -0700
committerTim Angus <tim@ngus.net>2013-03-19 16:41:20 +0000
commitd848901749d5d3a73a7111bdbdd34b6c7ef85f67 (patch)
tree7b61938c4dd884848d9849219c78216fb15cdd66
parentee7ec241bf5fec5dcb97414e255573df52f42b0a (diff)
Support more tcgens in lightall shader.
-rw-r--r--src/renderergl2/glsl/lightall_vp.glsl40
-rw-r--r--src/renderergl2/tr_shader.c16
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