[iortcw] 339/497: Rend2: Fix player on fire effect

Simon McVittie smcv at debian.org
Fri Sep 8 10:37:24 UTC 2017


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to annotated tag 1.42d
in repository iortcw.

commit a3a0a23ad620e8fee7b9eb7caa7be7196813411f
Author: Zack Middleton <zturtleman at gmail.com>
Date:   Thu May 7 23:38:05 2015 -0500

    Rend2: Fix player on fire effect
    
    Add support for alphaGen normalzfade, except the zombie effect part.
    Add support for negative deform wave frequency only effecting Z using amount
    based on fireRiseDir.
---
 MP/code/rend2/glsl/generic_vp.glsl |  55 +++++++++++++++
 MP/code/rend2/tr_glsl.c            |   9 ++-
 MP/code/rend2/tr_local.h           |   4 ++
 MP/code/rend2/tr_shade.c           | 136 +++++++++++++++++++++++++++++++++++++
 MP/code/rend2/tr_shader.c          |   1 +
 SP/code/rend2/glsl/generic_vp.glsl |  55 +++++++++++++++
 SP/code/rend2/tr_glsl.c            |   9 ++-
 SP/code/rend2/tr_local.h           |   4 ++
 SP/code/rend2/tr_shade.c           | 136 +++++++++++++++++++++++++++++++++++++
 SP/code/rend2/tr_shader.c          |   1 +
 10 files changed, 408 insertions(+), 2 deletions(-)

diff --git a/MP/code/rend2/glsl/generic_vp.glsl b/MP/code/rend2/glsl/generic_vp.glsl
index e04b201..1cc6484 100644
--- a/MP/code/rend2/glsl/generic_vp.glsl
+++ b/MP/code/rend2/glsl/generic_vp.glsl
@@ -43,6 +43,10 @@ uniform mat4   u_ModelViewProjectionMatrix;
 uniform vec4   u_BaseColor;
 uniform vec4   u_VertColor;
 
+#if defined(USE_DEFORM_VERTEXES) || defined(USE_RGBAGEN)
+uniform vec3   u_FireRiseDir;
+#endif
+
 #if defined(USE_RGBAGEN)
 uniform int    u_ColorGen;
 uniform int    u_AlphaGen;
@@ -50,6 +54,8 @@ uniform vec3   u_AmbientLight;
 uniform vec3   u_DirectedLight;
 uniform vec3   u_ModelLightDir;
 uniform float  u_PortalRange;
+uniform float  u_ZFadeLowest;
+uniform float  u_ZFadeHighest;
 #endif
 
 #if defined(USE_VERTEX_ANIMATION)
@@ -68,6 +74,20 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
 	float frequency = u_DeformParams[3];
 	float spread =    u_DeformParams[4];
 
+	// a negative frequency is for Z deformation based on normal
+	float zDeformScale = 0;
+	if (frequency < 0)
+	{
+		zDeformScale = 1;
+		frequency *= -1;
+
+		if (frequency > 999)
+		{
+			frequency -= 999;
+			zDeformScale = -1;
+		}
+	}
+
 	if (u_DeformGen == DGEN_BULGE)
 	{
 		phase *= st.x;
@@ -105,6 +125,20 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
 		func = sin(value);
 	}
 
+	if (zDeformScale != 0)
+	{
+		vec3 dir = u_FireRiseDir * (0.4 + 0.6 * u_FireRiseDir.z);
+		float nDot = dot(dir, normal);
+		float scale = base + func * amplitude;
+
+		if (nDot * scale > 0)
+		{
+			return pos + dir * nDot * scale * zDeformScale;
+		}
+
+		return pos;
+	}
+
 	return pos + normal * (base + func * amplitude);
 }
 #endif
@@ -178,6 +212,27 @@ vec4 CalcColor(vec3 position, vec3 normal)
 	{
 		color.a = clamp(length(viewer) / u_PortalRange, 0.0, 1.0);
 	}
+	else if (u_AlphaGen == AGEN_NORMALZFADE)
+	{
+		float nDot = dot(normal, u_FireRiseDir);
+		float halfRange = (u_ZFadeHighest - u_ZFadeLowest) / 2.0;
+
+		if (nDot < u_ZFadeHighest) {
+			if (nDot > u_ZFadeLowest) {
+				float frac;
+				if (nDot < u_ZFadeLowest + halfRange) {
+					frac = ( nDot - u_ZFadeLowest ) / halfRange;
+				} else {
+					frac = 1.0 - ( nDot - u_ZFadeLowest - halfRange ) / halfRange;
+				}
+				color.a *= clamp(frac, 0.0, 1.0);
+			} else {
+				color.a = 0;
+			}
+		} else {
+			color.a = 0;
+		}
+	}
 	
 	return color;
 }
diff --git a/MP/code/rend2/tr_glsl.c b/MP/code/rend2/tr_glsl.c
index ca8e5a5..ba62e26 100644
--- a/MP/code/rend2/tr_glsl.c
+++ b/MP/code/rend2/tr_glsl.c
@@ -146,6 +146,10 @@ static uniformInfo_t uniformsInfo[] =
 	{ "u_PrimaryLightRadius",  GLSL_FLOAT },
 
 	{ "u_CubeMapInfo", GLSL_VEC4 },
+
+	{ "u_FireRiseDir", GLSL_VEC3 },
+	{ "u_ZFadeLowest", GLSL_FLOAT },
+	{ "u_ZFadeHighest", GLSL_FLOAT },
 };
 
 
@@ -302,9 +306,11 @@ static void GLSL_GetShaderHeader( GLenum shaderType, const GLcharARB *extra, cha
 								"#define alphaGen_t\n"
 								"#define AGEN_LIGHTING_SPECULAR %i\n"
 								"#define AGEN_PORTAL %i\n"
+								"#define AGEN_NORMALZFADE %i\n"
 								"#endif\n",
 								AGEN_LIGHTING_SPECULAR,
-								AGEN_PORTAL));
+								AGEN_PORTAL,
+								AGEN_NORMALZFADE));
 
 	Q_strcat(dest, size,
 							 va("#ifndef texenv_t\n"
@@ -1528,6 +1534,7 @@ shaderProgram_t *GLSL_GetGenericShaderProgram(int stage, glfog_t *glFog)
 	{
 		case AGEN_LIGHTING_SPECULAR:
 		case AGEN_PORTAL:
+		case AGEN_NORMALZFADE:
 			shaderAttribs |= GENERICDEF_USE_RGBAGEN;
 			break;
 		default:
diff --git a/MP/code/rend2/tr_local.h b/MP/code/rend2/tr_local.h
index 77da8c2..13968e5 100644
--- a/MP/code/rend2/tr_local.h
+++ b/MP/code/rend2/tr_local.h
@@ -779,6 +779,10 @@ typedef enum
 
 	UNIFORM_CUBEMAPINFO,
 
+	UNIFORM_FIRERISEDIR,
+	UNIFORM_ZFADELOWEST,
+	UNIFORM_ZFADEHIGHEST,
+
 	UNIFORM_COUNT
 } uniform_t;
 
diff --git a/MP/code/rend2/tr_shade.c b/MP/code/rend2/tr_shade.c
index 402538e..c9bc81c 100644
--- a/MP/code/rend2/tr_shade.c
+++ b/MP/code/rend2/tr_shade.c
@@ -418,6 +418,23 @@ static void ProjectDlightTexture( void ) {
 		{
 			GLSL_SetUniformFloat5(sp, UNIFORM_DEFORMPARAMS, deformParams);
 			GLSL_SetUniformFloat(sp, UNIFORM_TIME, tess.shaderTime);
+
+			if (tess.shader->deforms[0].deformationWave.frequency < 0)
+			{
+				vec3_t worldUp;
+
+				if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+					VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+				}
+
+				if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+					VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+				} else {
+					VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+				}
+
+				GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+			}
 		}
 
 		vector[0] = dl->color[0];
@@ -602,6 +619,13 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t
 			vertColor[3] = 0.0f;
 			break;
 		case AGEN_NORMALZFADE:
+			baseColor[3] = pStage->constantColor[3] / 255.0f;
+			if (backEnd.currentEntity && backEnd.currentEntity->e.hModel)
+			{
+				baseColor[3] *= ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f;
+			}
+			vertColor[3] = 0.0f;
+			break;
 		case AGEN_VERTEX:
 			baseColor[3] = 0.0f;
 			vertColor[3] = 1.0f;
@@ -797,6 +821,24 @@ static void ForwardDlight( void ) {
 
 		GLSL_SetUniformFloat(sp, UNIFORM_VERTEXLERP, glState.vertexAttribsInterpolation);
 
+		if ((deformGen != DGEN_NONE && tess.shader->deforms[0].deformationWave.frequency < 0 )
+			|| pStage->alphaGen == AGEN_NORMALZFADE)
+		{
+			vec3_t worldUp;
+
+			if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+				VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+			}
+
+			if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+				VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+			} else {
+				VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+			}
+
+			GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+		}
+
 		GLSL_SetUniformInt(sp, UNIFORM_DEFORMGEN, deformGen);
 		if (deformGen != DGEN_NONE)
 		{
@@ -830,6 +872,27 @@ static void ForwardDlight( void ) {
 		{
 			GLSL_SetUniformFloat(sp, UNIFORM_PORTALRANGE, tess.shader->portalRange);
 		}
+		else if (pStage->alphaGen == AGEN_NORMALZFADE)
+		{
+			float lowest, highest;
+			//qboolean zombieEffect = qfalse;
+
+			lowest = pStage->zFadeBounds[0];
+			if ( lowest == -1000 ) {    // use entity alpha
+				lowest = backEnd.currentEntity->e.shaderTime;
+				//zombieEffect = qtrue;
+			}
+			highest = pStage->zFadeBounds[1];
+			if ( highest == -1000 ) {   // use entity alpha
+				highest = backEnd.currentEntity->e.shaderTime;
+				//zombieEffect = qtrue;
+			}
+
+			// TODO: Handle normalzfade zombie effect
+
+			GLSL_SetUniformFloat(sp, UNIFORM_ZFADELOWEST, lowest);
+			GLSL_SetUniformFloat(sp, UNIFORM_ZFADEHIGHEST, highest);
+		}
 
 		GLSL_SetUniformInt(sp, UNIFORM_COLORGEN, pStage->rgbGen);
 		GLSL_SetUniformInt(sp, UNIFORM_ALPHAGEN, pStage->alphaGen);
@@ -1087,6 +1150,23 @@ static void RB_FogPass( int wolfFog ) {
 	{
 		GLSL_SetUniformFloat5(sp, UNIFORM_DEFORMPARAMS, deformParams);
 		GLSL_SetUniformFloat(sp, UNIFORM_TIME, tess.shaderTime);
+
+		if (tess.shader->deforms[0].deformationWave.frequency < 0)
+		{
+			vec3_t worldUp;
+
+			if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+				VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+			}
+
+			if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+				VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+			} else {
+				VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+			}
+
+			GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+		}
 	}
 
 	if (wolfFog)
@@ -1273,6 +1353,24 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 		GLSL_SetUniformVec3(sp, UNIFORM_LOCALVIEWORIGIN, backEnd.or.viewOrigin);
 
 		GLSL_SetUniformFloat(sp, UNIFORM_VERTEXLERP, glState.vertexAttribsInterpolation);
+
+		if ((deformGen != DGEN_NONE && tess.shader->deforms[0].deformationWave.frequency < 0 )
+			|| pStage->alphaGen == AGEN_NORMALZFADE)
+		{
+			vec3_t worldUp;
+
+			if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+				VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+			}
+
+			if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+				VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+			} else {
+				VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+			}
+
+			GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+		}
 		
 		GLSL_SetUniformInt(sp, UNIFORM_DEFORMGEN, deformGen);
 		if (deformGen != DGEN_NONE)
@@ -1345,6 +1443,27 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 		{
 			GLSL_SetUniformFloat(sp, UNIFORM_PORTALRANGE, tess.shader->portalRange);
 		}
+		else if (pStage->alphaGen == AGEN_NORMALZFADE)
+		{
+			float lowest, highest;
+			//qboolean zombieEffect = qfalse;
+
+			lowest = pStage->zFadeBounds[0];
+			if ( lowest == -1000 ) {    // use entity alpha
+				lowest = backEnd.currentEntity->e.shaderTime;
+				//zombieEffect = qtrue;
+			}
+			highest = pStage->zFadeBounds[1];
+			if ( highest == -1000 ) {   // use entity alpha
+				highest = backEnd.currentEntity->e.shaderTime;
+				//zombieEffect = qtrue;
+			}
+
+			// TODO: Handle normalzfade zombie effect
+
+			GLSL_SetUniformFloat(sp, UNIFORM_ZFADELOWEST, lowest);
+			GLSL_SetUniformFloat(sp, UNIFORM_ZFADEHIGHEST, highest);
+		}
 
 		GLSL_SetUniformInt(sp, UNIFORM_COLORGEN, pStage->rgbGen);
 		GLSL_SetUniformInt(sp, UNIFORM_ALPHAGEN, pStage->alphaGen);
@@ -1558,6 +1677,23 @@ static void RB_RenderShadowmap( shaderCommands_t *input )
 		{
 			GLSL_SetUniformFloat5(sp, UNIFORM_DEFORMPARAMS, deformParams);
 			GLSL_SetUniformFloat(sp, UNIFORM_TIME, tess.shaderTime);
+
+			if (tess.shader->deforms[0].deformationWave.frequency < 0)
+			{
+				vec3_t worldUp;
+
+				if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+					VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+				}
+
+				if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+					VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+				} else {
+					VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+				}
+
+				GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+			}
 		}
 
 		VectorCopy(backEnd.viewParms.or.origin, vector);
diff --git a/MP/code/rend2/tr_shader.c b/MP/code/rend2/tr_shader.c
index d568044..48b6083 100644
--- a/MP/code/rend2/tr_shader.c
+++ b/MP/code/rend2/tr_shader.c
@@ -2363,6 +2363,7 @@ static int CollapseStagesToGLSL(void)
 			{
 				case AGEN_LIGHTING_SPECULAR:
 				case AGEN_PORTAL:
+				case AGEN_NORMALZFADE:
 					skip = qtrue;
 					break;
 				default:
diff --git a/SP/code/rend2/glsl/generic_vp.glsl b/SP/code/rend2/glsl/generic_vp.glsl
index e04b201..1cc6484 100644
--- a/SP/code/rend2/glsl/generic_vp.glsl
+++ b/SP/code/rend2/glsl/generic_vp.glsl
@@ -43,6 +43,10 @@ uniform mat4   u_ModelViewProjectionMatrix;
 uniform vec4   u_BaseColor;
 uniform vec4   u_VertColor;
 
+#if defined(USE_DEFORM_VERTEXES) || defined(USE_RGBAGEN)
+uniform vec3   u_FireRiseDir;
+#endif
+
 #if defined(USE_RGBAGEN)
 uniform int    u_ColorGen;
 uniform int    u_AlphaGen;
@@ -50,6 +54,8 @@ uniform vec3   u_AmbientLight;
 uniform vec3   u_DirectedLight;
 uniform vec3   u_ModelLightDir;
 uniform float  u_PortalRange;
+uniform float  u_ZFadeLowest;
+uniform float  u_ZFadeHighest;
 #endif
 
 #if defined(USE_VERTEX_ANIMATION)
@@ -68,6 +74,20 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
 	float frequency = u_DeformParams[3];
 	float spread =    u_DeformParams[4];
 
+	// a negative frequency is for Z deformation based on normal
+	float zDeformScale = 0;
+	if (frequency < 0)
+	{
+		zDeformScale = 1;
+		frequency *= -1;
+
+		if (frequency > 999)
+		{
+			frequency -= 999;
+			zDeformScale = -1;
+		}
+	}
+
 	if (u_DeformGen == DGEN_BULGE)
 	{
 		phase *= st.x;
@@ -105,6 +125,20 @@ vec3 DeformPosition(const vec3 pos, const vec3 normal, const vec2 st)
 		func = sin(value);
 	}
 
+	if (zDeformScale != 0)
+	{
+		vec3 dir = u_FireRiseDir * (0.4 + 0.6 * u_FireRiseDir.z);
+		float nDot = dot(dir, normal);
+		float scale = base + func * amplitude;
+
+		if (nDot * scale > 0)
+		{
+			return pos + dir * nDot * scale * zDeformScale;
+		}
+
+		return pos;
+	}
+
 	return pos + normal * (base + func * amplitude);
 }
 #endif
@@ -178,6 +212,27 @@ vec4 CalcColor(vec3 position, vec3 normal)
 	{
 		color.a = clamp(length(viewer) / u_PortalRange, 0.0, 1.0);
 	}
+	else if (u_AlphaGen == AGEN_NORMALZFADE)
+	{
+		float nDot = dot(normal, u_FireRiseDir);
+		float halfRange = (u_ZFadeHighest - u_ZFadeLowest) / 2.0;
+
+		if (nDot < u_ZFadeHighest) {
+			if (nDot > u_ZFadeLowest) {
+				float frac;
+				if (nDot < u_ZFadeLowest + halfRange) {
+					frac = ( nDot - u_ZFadeLowest ) / halfRange;
+				} else {
+					frac = 1.0 - ( nDot - u_ZFadeLowest - halfRange ) / halfRange;
+				}
+				color.a *= clamp(frac, 0.0, 1.0);
+			} else {
+				color.a = 0;
+			}
+		} else {
+			color.a = 0;
+		}
+	}
 	
 	return color;
 }
diff --git a/SP/code/rend2/tr_glsl.c b/SP/code/rend2/tr_glsl.c
index ca8e5a5..ba62e26 100644
--- a/SP/code/rend2/tr_glsl.c
+++ b/SP/code/rend2/tr_glsl.c
@@ -146,6 +146,10 @@ static uniformInfo_t uniformsInfo[] =
 	{ "u_PrimaryLightRadius",  GLSL_FLOAT },
 
 	{ "u_CubeMapInfo", GLSL_VEC4 },
+
+	{ "u_FireRiseDir", GLSL_VEC3 },
+	{ "u_ZFadeLowest", GLSL_FLOAT },
+	{ "u_ZFadeHighest", GLSL_FLOAT },
 };
 
 
@@ -302,9 +306,11 @@ static void GLSL_GetShaderHeader( GLenum shaderType, const GLcharARB *extra, cha
 								"#define alphaGen_t\n"
 								"#define AGEN_LIGHTING_SPECULAR %i\n"
 								"#define AGEN_PORTAL %i\n"
+								"#define AGEN_NORMALZFADE %i\n"
 								"#endif\n",
 								AGEN_LIGHTING_SPECULAR,
-								AGEN_PORTAL));
+								AGEN_PORTAL,
+								AGEN_NORMALZFADE));
 
 	Q_strcat(dest, size,
 							 va("#ifndef texenv_t\n"
@@ -1528,6 +1534,7 @@ shaderProgram_t *GLSL_GetGenericShaderProgram(int stage, glfog_t *glFog)
 	{
 		case AGEN_LIGHTING_SPECULAR:
 		case AGEN_PORTAL:
+		case AGEN_NORMALZFADE:
 			shaderAttribs |= GENERICDEF_USE_RGBAGEN;
 			break;
 		default:
diff --git a/SP/code/rend2/tr_local.h b/SP/code/rend2/tr_local.h
index a7c480f..8690d96 100644
--- a/SP/code/rend2/tr_local.h
+++ b/SP/code/rend2/tr_local.h
@@ -784,6 +784,10 @@ typedef enum
 
 	UNIFORM_CUBEMAPINFO,
 
+	UNIFORM_FIRERISEDIR,
+	UNIFORM_ZFADELOWEST,
+	UNIFORM_ZFADEHIGHEST,
+
 	UNIFORM_COUNT
 } uniform_t;
 
diff --git a/SP/code/rend2/tr_shade.c b/SP/code/rend2/tr_shade.c
index cd847ef..ed8a489 100644
--- a/SP/code/rend2/tr_shade.c
+++ b/SP/code/rend2/tr_shade.c
@@ -412,6 +412,23 @@ static void ProjectDlightTexture( void ) {
 		{
 			GLSL_SetUniformFloat5(sp, UNIFORM_DEFORMPARAMS, deformParams);
 			GLSL_SetUniformFloat(sp, UNIFORM_TIME, tess.shaderTime);
+
+			if (tess.shader->deforms[0].deformationWave.frequency < 0)
+			{
+				vec3_t worldUp;
+
+				if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+					VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+				}
+
+				if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+					VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+				} else {
+					VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+				}
+
+				GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+			}
 		}
 
 		vector[0] = dl->color[0];
@@ -596,6 +613,13 @@ static void ComputeShaderColors( shaderStage_t *pStage, vec4_t baseColor, vec4_t
 			vertColor[3] = 0.0f;
 			break;
 		case AGEN_NORMALZFADE:
+			baseColor[3] = pStage->constantColor[3] / 255.0f;
+			if (backEnd.currentEntity && backEnd.currentEntity->e.hModel)
+			{
+				baseColor[3] *= ((unsigned char *)backEnd.currentEntity->e.shaderRGBA)[3] / 255.0f;
+			}
+			vertColor[3] = 0.0f;
+			break;
 		case AGEN_VERTEX:
 			baseColor[3] = 0.0f;
 			vertColor[3] = 1.0f;
@@ -791,6 +815,24 @@ static void ForwardDlight( void ) {
 
 		GLSL_SetUniformFloat(sp, UNIFORM_VERTEXLERP, glState.vertexAttribsInterpolation);
 
+		if ((deformGen != DGEN_NONE && tess.shader->deforms[0].deformationWave.frequency < 0 )
+			|| pStage->alphaGen == AGEN_NORMALZFADE)
+		{
+			vec3_t worldUp;
+
+			if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+				VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+			}
+
+			if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+				VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+			} else {
+				VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+			}
+
+			GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+		}
+
 		GLSL_SetUniformInt(sp, UNIFORM_DEFORMGEN, deformGen);
 		if (deformGen != DGEN_NONE)
 		{
@@ -824,6 +866,27 @@ static void ForwardDlight( void ) {
 		{
 			GLSL_SetUniformFloat(sp, UNIFORM_PORTALRANGE, tess.shader->portalRange);
 		}
+		else if (pStage->alphaGen == AGEN_NORMALZFADE)
+		{
+			float lowest, highest;
+			//qboolean zombieEffect = qfalse;
+
+			lowest = pStage->zFadeBounds[0];
+			if ( lowest == -1000 ) {    // use entity alpha
+				lowest = backEnd.currentEntity->e.shaderTime;
+				//zombieEffect = qtrue;
+			}
+			highest = pStage->zFadeBounds[1];
+			if ( highest == -1000 ) {   // use entity alpha
+				highest = backEnd.currentEntity->e.shaderTime;
+				//zombieEffect = qtrue;
+			}
+
+			// TODO: Handle normalzfade zombie effect
+
+			GLSL_SetUniformFloat(sp, UNIFORM_ZFADELOWEST, lowest);
+			GLSL_SetUniformFloat(sp, UNIFORM_ZFADEHIGHEST, highest);
+		}
 
 		GLSL_SetUniformInt(sp, UNIFORM_COLORGEN, pStage->rgbGen);
 		GLSL_SetUniformInt(sp, UNIFORM_ALPHAGEN, pStage->alphaGen);
@@ -1081,6 +1144,23 @@ static void RB_FogPass( int wolfFog ) {
 	{
 		GLSL_SetUniformFloat5(sp, UNIFORM_DEFORMPARAMS, deformParams);
 		GLSL_SetUniformFloat(sp, UNIFORM_TIME, tess.shaderTime);
+
+		if (tess.shader->deforms[0].deformationWave.frequency < 0)
+		{
+			vec3_t worldUp;
+
+			if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+				VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+			}
+
+			if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+				VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+			} else {
+				VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+			}
+
+			GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+		}
 	}
 
 	if (wolfFog)
@@ -1267,6 +1347,24 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 		GLSL_SetUniformVec3(sp, UNIFORM_LOCALVIEWORIGIN, backEnd.or.viewOrigin);
 
 		GLSL_SetUniformFloat(sp, UNIFORM_VERTEXLERP, glState.vertexAttribsInterpolation);
+
+		if ((deformGen != DGEN_NONE && tess.shader->deforms[0].deformationWave.frequency < 0 )
+			|| pStage->alphaGen == AGEN_NORMALZFADE)
+		{
+			vec3_t worldUp;
+
+			if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+				VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+			}
+
+			if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+				VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+			} else {
+				VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+			}
+
+			GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+		}
 		
 		GLSL_SetUniformInt(sp, UNIFORM_DEFORMGEN, deformGen);
 		if (deformGen != DGEN_NONE)
@@ -1339,6 +1437,27 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 		{
 			GLSL_SetUniformFloat(sp, UNIFORM_PORTALRANGE, tess.shader->portalRange);
 		}
+		else if (pStage->alphaGen == AGEN_NORMALZFADE)
+		{
+			float lowest, highest;
+			//qboolean zombieEffect = qfalse;
+
+			lowest = pStage->zFadeBounds[0];
+			if ( lowest == -1000 ) {    // use entity alpha
+				lowest = backEnd.currentEntity->e.shaderTime;
+				//zombieEffect = qtrue;
+			}
+			highest = pStage->zFadeBounds[1];
+			if ( highest == -1000 ) {   // use entity alpha
+				highest = backEnd.currentEntity->e.shaderTime;
+				//zombieEffect = qtrue;
+			}
+
+			// TODO: Handle normalzfade zombie effect
+
+			GLSL_SetUniformFloat(sp, UNIFORM_ZFADELOWEST, lowest);
+			GLSL_SetUniformFloat(sp, UNIFORM_ZFADEHIGHEST, highest);
+		}
 
 		GLSL_SetUniformInt(sp, UNIFORM_COLORGEN, pStage->rgbGen);
 		GLSL_SetUniformInt(sp, UNIFORM_ALPHAGEN, pStage->alphaGen);
@@ -1553,6 +1672,23 @@ static void RB_RenderShadowmap( shaderCommands_t *input )
 		{
 			GLSL_SetUniformFloat5(sp, UNIFORM_DEFORMPARAMS, deformParams);
 			GLSL_SetUniformFloat(sp, UNIFORM_TIME, tess.shaderTime);
+
+			if (tess.shader->deforms[0].deformationWave.frequency < 0)
+			{
+				vec3_t worldUp;
+
+				if ( VectorCompare( backEnd.currentEntity->e.fireRiseDir, vec3_origin ) ) {
+					VectorSet( backEnd.currentEntity->e.fireRiseDir, 0, 0, 1 );
+				}
+
+				if ( backEnd.currentEntity->e.hModel ) {    // world surfaces dont have an axis
+					VectorRotate( backEnd.currentEntity->e.fireRiseDir, backEnd.currentEntity->e.axis, worldUp );
+				} else {
+					VectorCopy( backEnd.currentEntity->e.fireRiseDir, worldUp );
+				}
+
+				GLSL_SetUniformVec3(sp, UNIFORM_FIRERISEDIR, worldUp);
+			}
 		}
 
 		VectorCopy(backEnd.viewParms.or.origin, vector);
diff --git a/SP/code/rend2/tr_shader.c b/SP/code/rend2/tr_shader.c
index d821eaa..282b061 100644
--- a/SP/code/rend2/tr_shader.c
+++ b/SP/code/rend2/tr_shader.c
@@ -2384,6 +2384,7 @@ static int CollapseStagesToGLSL(void)
 			{
 				case AGEN_LIGHTING_SPECULAR:
 				case AGEN_PORTAL:
+				case AGEN_NORMALZFADE:
 					skip = qtrue;
 					break;
 				default:

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git



More information about the Pkg-games-commits mailing list