[iortcw] 201/497: Rend2: Add support for wolf fog to shaders that use adjustColorsForFog

Simon McVittie smcv at debian.org
Fri Sep 8 10:36:51 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 417640ac13936d2b73eb4ab64b7559cee3c4aa8c
Author: ZTurtleMan at gmail.com <ZTurtleMan at gmail.com@e65d2741-a53d-b2dc-ae96-bb75fa5e4c4a>
Date:   Fri Aug 29 23:21:54 2014 +0000

    Rend2: Add support for wolf fog to shaders that use adjustColorsForFog
---
 MP/code/rend2/glsl/generic_vp.glsl | 10 ++++--
 MP/code/rend2/tr_glsl.c            | 19 +++++++++-
 MP/code/rend2/tr_local.h           |  8 +++--
 MP/code/rend2/tr_shade.c           | 72 ++++++++++++++++++++++++--------------
 SP/code/rend2/glsl/generic_vp.glsl | 10 ++++--
 SP/code/rend2/tr_glsl.c            | 19 +++++++++-
 SP/code/rend2/tr_local.h           |  8 +++--
 SP/code/rend2/tr_shade.c           | 72 ++++++++++++++++++++++++--------------
 8 files changed, 152 insertions(+), 66 deletions(-)

diff --git a/MP/code/rend2/glsl/generic_vp.glsl b/MP/code/rend2/glsl/generic_vp.glsl
index 8543ffd..60f6c99 100644
--- a/MP/code/rend2/glsl/generic_vp.glsl
+++ b/MP/code/rend2/glsl/generic_vp.glsl
@@ -189,7 +189,12 @@ vec4 CalcColor(vec3 position, vec3 normal)
 #if defined(USE_FOG)
 float CalcFog(vec3 position)
 {
-	float s = dot(vec4(position, 1.0), u_FogDistance) * 8.0;
+	float s = dot(vec4(position, 1.0), u_FogDistance);
+#if defined(USE_WOLF_FOG_LINEAR)
+	return 1.0 - (u_FogDepth.y - s) / (u_FogDepth.y - u_FogDepth.x);
+#elif defined(USE_WOLF_FOG_EXPONENTIAL)
+	return 1.0 - exp(-u_FogDepth.z * s);
+#else // defined(USE_QUAKE3_FOG)
 	float t = dot(vec4(position, 1.0), u_FogDepth);
 
 	float eyeOutside = float(u_FogEyeT < 0.0);
@@ -198,7 +203,8 @@ float CalcFog(vec3 position)
 	t += 1e-6;
 	t *= fogged / (t - u_FogEyeT * eyeOutside);
 
-	return s * t;
+	return s * 8.0 * t;
+#endif
 }
 #endif
 
diff --git a/MP/code/rend2/tr_glsl.c b/MP/code/rend2/tr_glsl.c
index ba75215..5f9d3ce 100644
--- a/MP/code/rend2/tr_glsl.c
+++ b/MP/code/rend2/tr_glsl.c
@@ -926,6 +926,12 @@ void GLSL_InitGPUShaders(void)
 		if (i & GENERICDEF_USE_LIGHTMAP)
 			Q_strcat(extradefines, 1024, "#define USE_LIGHTMAP\n");
 
+		if (i & GENERICDEF_USE_WOLF_FOG_LINEAR)
+			Q_strcat(extradefines, 1024, "#define USE_WOLF_FOG_LINEAR\n");
+		
+		if (i & GENERICDEF_USE_WOLF_FOG_EXPONENTIAL)
+			Q_strcat(extradefines, 1024, "#define USE_WOLF_FOG_EXPONENTIAL\n");
+
 		if (r_hdr->integer && !glRefConfig.floatLightmap)
 			Q_strcat(extradefines, 1024, "#define RGBM_LIGHTMAP\n");
 
@@ -1775,7 +1781,7 @@ void GLSL_VertexAttribPointers(uint32_t attribBits)
 }
 
 
-shaderProgram_t *GLSL_GetGenericShaderProgram(int stage)
+shaderProgram_t *GLSL_GetGenericShaderProgram(int stage, glfog_t *glFog)
 {
 	shaderStage_t *pStage = tess.xstages[stage];
 	int shaderAttribs = 0;
@@ -1785,6 +1791,17 @@ shaderProgram_t *GLSL_GetGenericShaderProgram(int stage)
 		shaderAttribs |= GENERICDEF_USE_FOG;
 	}
 
+	//
+	// RTCW fog
+	//
+	if (glFog) {
+		shaderAttribs |= GENERICDEF_USE_FOG;
+		if (glFog->mode == GL_LINEAR)
+			shaderAttribs |= GENERICDEF_USE_WOLF_FOG_LINEAR;
+		else // if (glFog->mode == GL_EXP)
+			shaderAttribs |= GENERICDEF_USE_WOLF_FOG_EXPONENTIAL;
+	}
+
 	if (pStage->bundle[1].image[0] && tess.shader->multitextureEnv)
 	{
 		shaderAttribs |= GENERICDEF_USE_LIGHTMAP;
diff --git a/MP/code/rend2/tr_local.h b/MP/code/rend2/tr_local.h
index 6b3cf59..84229a0 100644
--- a/MP/code/rend2/tr_local.h
+++ b/MP/code/rend2/tr_local.h
@@ -655,8 +655,10 @@ enum
 	GENERICDEF_USE_FOG              = 0x0008,
 	GENERICDEF_USE_RGBAGEN          = 0x0010,
 	GENERICDEF_USE_LIGHTMAP         = 0x0020,
-	GENERICDEF_ALL                  = 0x003F,
-	GENERICDEF_COUNT                = 0x0040,
+	GENERICDEF_USE_WOLF_FOG_LINEAR      = 0x0040,
+	GENERICDEF_USE_WOLF_FOG_EXPONENTIAL = 0x0080,
+	GENERICDEF_ALL                  = 0x00FF,
+	GENERICDEF_COUNT                = 0x0100,
 };
 
 enum
@@ -2478,7 +2480,7 @@ void GLSL_SetUniformVec3(shaderProgram_t *program, int uniformNum, const vec3_t
 void GLSL_SetUniformVec4(shaderProgram_t *program, int uniformNum, const vec4_t v);
 void GLSL_SetUniformMat4(shaderProgram_t *program, int uniformNum, const mat4_t matrix);
 
-shaderProgram_t *GLSL_GetGenericShaderProgram(int stage);
+shaderProgram_t *GLSL_GetGenericShaderProgram(int stage, glfog_t *glFog);
 
 /*
 ============================================================
diff --git a/MP/code/rend2/tr_shade.c b/MP/code/rend2/tr_shade.c
index ad8ad92..f5a6718 100644
--- a/MP/code/rend2/tr_shade.c
+++ b/MP/code/rend2/tr_shade.c
@@ -1153,6 +1153,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 {
 	int stage;
 	
+	glfog_t *glFog;
 	vec4_t fogDistanceVector, fogDepthVector = {0, 0, 0, 0};
 	float eyeT = 0;
 
@@ -1161,8 +1162,6 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 
 	ComputeDeformValues(&deformGen, deformParams);
 
-	ComputeFogValues(fogDistanceVector, fogDepthVector, &eyeT, NULL);
-
 	for ( stage = 0; stage < MAX_SHADER_STAGES; stage++ )
 	{
 		shaderStage_t *pStage = input->xstages[stage];
@@ -1175,6 +1174,8 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 			break;
 		}
 
+		glFog = NULL;
+
 		if (backEnd.depthFill)
 		{
 			if (pStage->glslShaderGroup == tr.lightallShader)
@@ -1240,7 +1241,28 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 		}
 		else
 		{
-			sp = GLSL_GetGenericShaderProgram(stage);
+			if ( r_wolffog->integer && pStage->adjustColorsForFog && !backEnd.projection2D )
+			{
+				if ( !tess.shader->noFog || pStage->isFogged ) {
+					if ( backEnd.refdef.rdflags & RDF_DRAWINGSKY ) {
+						if ( glfogsettings[FOG_SKY].registered ) {
+							glFog = &glfogsettings[FOG_SKY];
+						}
+					}
+
+					if ( skyboxportal && backEnd.refdef.rdflags & RDF_SKYBOXPORTAL ) {
+						if ( glfogsettings[FOG_PORTALVIEW].registered ) {
+							glFog = &glfogsettings[FOG_PORTALVIEW];
+						}
+					} else {
+						if ( glfogNum > FOG_NONE ) {
+							glFog = &glfogsettings[FOG_CURRENT];
+						}
+					}
+				}
+			}
+
+			sp = GLSL_GetGenericShaderProgram(stage, glFog);
 
 			backEnd.pc.c_genericDraws++;
 		}
@@ -1260,7 +1282,9 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 			GLSL_SetUniformFloat(sp, UNIFORM_TIME, tess.shaderTime);
 		}
 
-		if ( input->fogNum ) {
+		if ( input->fogNum || glFog ) {
+			ComputeFogValues(fogDistanceVector, fogDepthVector, &eyeT, glFog);
+
 			GLSL_SetUniformVec4(sp, UNIFORM_FOGDISTANCE, fogDistanceVector);
 			GLSL_SetUniformVec4(sp, UNIFORM_FOGDEPTH, fogDepthVector);
 			GLSL_SetUniformFloat(sp, UNIFORM_FOGEYET, eyeT);
@@ -1326,7 +1350,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 		GLSL_SetUniformInt(sp, UNIFORM_COLORGEN, pStage->rgbGen);
 		GLSL_SetUniformInt(sp, UNIFORM_ALPHAGEN, pStage->alphaGen);
 
-		if ( input->fogNum )
+		if ( input->fogNum || glFog )
 		{
 			vec4_t fogColorMask;
 
@@ -1732,33 +1756,27 @@ void RB_StageIteratorGeneric( void )
 	if ( r_wolffog->integer && tess.shader->fogPass && tess.shader->sort <= SS_OPAQUE )
 	{
 		int stage, stageFog = 0;
-		
-		// make sure at least one stage has fog
-		for ( stage = 0; stage < MAX_SHADER_STAGES; stage++ )
-		{
-			shaderStage_t *pStage = tess.xstages[stage];
 
-			if ( !pStage )
+		if ( tess.shader->noFog ) {
+			// make sure at least one stage has fog
+			for ( stage = 0; stage < MAX_SHADER_STAGES; stage++ )
 			{
-				break;
-			}
+				shaderStage_t *pStage = tess.xstages[stage];
 
-			if (pStage->isFogged)
-			{
-				stageFog = 1;
-				break;
+				if ( !pStage )
+				{
+					break;
+				}
+
+				if (pStage->isFogged)
+				{
+					stageFog = 1;
+					break;
+				}
 			}
 		}
-		
-		// FIXME: this logic sucks
-		if (tess.shader->noFog && stageFog)
-		{
-			RB_FogPass(1);
-		}
-		else if (tess.shader->noFog && !stageFog)
-		{
-		}
-		else
+
+		if ( !tess.shader->noFog || stageFog )
 		{
 			RB_FogPass(1);
 		}
diff --git a/SP/code/rend2/glsl/generic_vp.glsl b/SP/code/rend2/glsl/generic_vp.glsl
index 8543ffd..60f6c99 100644
--- a/SP/code/rend2/glsl/generic_vp.glsl
+++ b/SP/code/rend2/glsl/generic_vp.glsl
@@ -189,7 +189,12 @@ vec4 CalcColor(vec3 position, vec3 normal)
 #if defined(USE_FOG)
 float CalcFog(vec3 position)
 {
-	float s = dot(vec4(position, 1.0), u_FogDistance) * 8.0;
+	float s = dot(vec4(position, 1.0), u_FogDistance);
+#if defined(USE_WOLF_FOG_LINEAR)
+	return 1.0 - (u_FogDepth.y - s) / (u_FogDepth.y - u_FogDepth.x);
+#elif defined(USE_WOLF_FOG_EXPONENTIAL)
+	return 1.0 - exp(-u_FogDepth.z * s);
+#else // defined(USE_QUAKE3_FOG)
 	float t = dot(vec4(position, 1.0), u_FogDepth);
 
 	float eyeOutside = float(u_FogEyeT < 0.0);
@@ -198,7 +203,8 @@ float CalcFog(vec3 position)
 	t += 1e-6;
 	t *= fogged / (t - u_FogEyeT * eyeOutside);
 
-	return s * t;
+	return s * 8.0 * t;
+#endif
 }
 #endif
 
diff --git a/SP/code/rend2/tr_glsl.c b/SP/code/rend2/tr_glsl.c
index ba75215..5f9d3ce 100644
--- a/SP/code/rend2/tr_glsl.c
+++ b/SP/code/rend2/tr_glsl.c
@@ -926,6 +926,12 @@ void GLSL_InitGPUShaders(void)
 		if (i & GENERICDEF_USE_LIGHTMAP)
 			Q_strcat(extradefines, 1024, "#define USE_LIGHTMAP\n");
 
+		if (i & GENERICDEF_USE_WOLF_FOG_LINEAR)
+			Q_strcat(extradefines, 1024, "#define USE_WOLF_FOG_LINEAR\n");
+		
+		if (i & GENERICDEF_USE_WOLF_FOG_EXPONENTIAL)
+			Q_strcat(extradefines, 1024, "#define USE_WOLF_FOG_EXPONENTIAL\n");
+
 		if (r_hdr->integer && !glRefConfig.floatLightmap)
 			Q_strcat(extradefines, 1024, "#define RGBM_LIGHTMAP\n");
 
@@ -1775,7 +1781,7 @@ void GLSL_VertexAttribPointers(uint32_t attribBits)
 }
 
 
-shaderProgram_t *GLSL_GetGenericShaderProgram(int stage)
+shaderProgram_t *GLSL_GetGenericShaderProgram(int stage, glfog_t *glFog)
 {
 	shaderStage_t *pStage = tess.xstages[stage];
 	int shaderAttribs = 0;
@@ -1785,6 +1791,17 @@ shaderProgram_t *GLSL_GetGenericShaderProgram(int stage)
 		shaderAttribs |= GENERICDEF_USE_FOG;
 	}
 
+	//
+	// RTCW fog
+	//
+	if (glFog) {
+		shaderAttribs |= GENERICDEF_USE_FOG;
+		if (glFog->mode == GL_LINEAR)
+			shaderAttribs |= GENERICDEF_USE_WOLF_FOG_LINEAR;
+		else // if (glFog->mode == GL_EXP)
+			shaderAttribs |= GENERICDEF_USE_WOLF_FOG_EXPONENTIAL;
+	}
+
 	if (pStage->bundle[1].image[0] && tess.shader->multitextureEnv)
 	{
 		shaderAttribs |= GENERICDEF_USE_LIGHTMAP;
diff --git a/SP/code/rend2/tr_local.h b/SP/code/rend2/tr_local.h
index 1bf8958..2d75320 100644
--- a/SP/code/rend2/tr_local.h
+++ b/SP/code/rend2/tr_local.h
@@ -660,8 +660,10 @@ enum
 	GENERICDEF_USE_FOG              = 0x0008,
 	GENERICDEF_USE_RGBAGEN          = 0x0010,
 	GENERICDEF_USE_LIGHTMAP         = 0x0020,
-	GENERICDEF_ALL                  = 0x003F,
-	GENERICDEF_COUNT                = 0x0040,
+	GENERICDEF_USE_WOLF_FOG_LINEAR      = 0x0040,
+	GENERICDEF_USE_WOLF_FOG_EXPONENTIAL = 0x0080,
+	GENERICDEF_ALL                  = 0x00FF,
+	GENERICDEF_COUNT                = 0x0100,
 };
 
 enum
@@ -2506,7 +2508,7 @@ void GLSL_SetUniformVec3(shaderProgram_t *program, int uniformNum, const vec3_t
 void GLSL_SetUniformVec4(shaderProgram_t *program, int uniformNum, const vec4_t v);
 void GLSL_SetUniformMat4(shaderProgram_t *program, int uniformNum, const mat4_t matrix);
 
-shaderProgram_t *GLSL_GetGenericShaderProgram(int stage);
+shaderProgram_t *GLSL_GetGenericShaderProgram(int stage, glfog_t *glFog);
 
 /*
 ============================================================
diff --git a/SP/code/rend2/tr_shade.c b/SP/code/rend2/tr_shade.c
index 44bcdf3..b1f8ed3 100644
--- a/SP/code/rend2/tr_shade.c
+++ b/SP/code/rend2/tr_shade.c
@@ -1147,6 +1147,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 {
 	int stage;
 	
+	glfog_t *glFog;
 	vec4_t fogDistanceVector, fogDepthVector = {0, 0, 0, 0};
 	float eyeT = 0;
 
@@ -1155,8 +1156,6 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 
 	ComputeDeformValues(&deformGen, deformParams);
 
-	ComputeFogValues(fogDistanceVector, fogDepthVector, &eyeT, NULL);
-
 	for ( stage = 0; stage < MAX_SHADER_STAGES; stage++ )
 	{
 		shaderStage_t *pStage = input->xstages[stage];
@@ -1169,6 +1168,8 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 			break;
 		}
 
+		glFog = NULL;
+
 		if (backEnd.depthFill)
 		{
 			if (pStage->glslShaderGroup == tr.lightallShader)
@@ -1234,7 +1235,28 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 		}
 		else
 		{
-			sp = GLSL_GetGenericShaderProgram(stage);
+			if ( r_wolffog->integer && pStage->adjustColorsForFog && !backEnd.projection2D )
+			{
+				if ( !tess.shader->noFog || pStage->isFogged ) {
+					if ( backEnd.refdef.rdflags & RDF_DRAWINGSKY ) {
+						if ( glfogsettings[FOG_SKY].registered ) {
+							glFog = &glfogsettings[FOG_SKY];
+						}
+					}
+
+					if ( skyboxportal && backEnd.refdef.rdflags & RDF_SKYBOXPORTAL ) {
+						if ( glfogsettings[FOG_PORTALVIEW].registered ) {
+							glFog = &glfogsettings[FOG_PORTALVIEW];
+						}
+					} else {
+						if ( glfogNum > FOG_NONE ) {
+							glFog = &glfogsettings[FOG_CURRENT];
+						}
+					}
+				}
+			}
+
+			sp = GLSL_GetGenericShaderProgram(stage, glFog);
 
 			backEnd.pc.c_genericDraws++;
 		}
@@ -1254,7 +1276,9 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 			GLSL_SetUniformFloat(sp, UNIFORM_TIME, tess.shaderTime);
 		}
 
-		if ( input->fogNum ) {
+		if ( input->fogNum || glFog ) {
+			ComputeFogValues(fogDistanceVector, fogDepthVector, &eyeT, glFog);
+
 			GLSL_SetUniformVec4(sp, UNIFORM_FOGDISTANCE, fogDistanceVector);
 			GLSL_SetUniformVec4(sp, UNIFORM_FOGDEPTH, fogDepthVector);
 			GLSL_SetUniformFloat(sp, UNIFORM_FOGEYET, eyeT);
@@ -1320,7 +1344,7 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
 		GLSL_SetUniformInt(sp, UNIFORM_COLORGEN, pStage->rgbGen);
 		GLSL_SetUniformInt(sp, UNIFORM_ALPHAGEN, pStage->alphaGen);
 
-		if ( input->fogNum )
+		if ( input->fogNum || glFog )
 		{
 			vec4_t fogColorMask;
 
@@ -1733,33 +1757,27 @@ void RB_StageIteratorGeneric( void )
 	if ( r_wolffog->integer && tess.shader->fogPass && tess.shader->sort <= SS_OPAQUE )
 	{
 		int stage, stageFog = 0;
-		
-		// make sure at least one stage has fog
-		for ( stage = 0; stage < MAX_SHADER_STAGES; stage++ )
-		{
-			shaderStage_t *pStage = tess.xstages[stage];
 
-			if ( !pStage )
+		if ( tess.shader->noFog ) {
+			// make sure at least one stage has fog
+			for ( stage = 0; stage < MAX_SHADER_STAGES; stage++ )
 			{
-				break;
-			}
+				shaderStage_t *pStage = tess.xstages[stage];
 
-			if (pStage->isFogged)
-			{
-				stageFog = 1;
-				break;
+				if ( !pStage )
+				{
+					break;
+				}
+
+				if (pStage->isFogged)
+				{
+					stageFog = 1;
+					break;
+				}
 			}
 		}
-		
-		// FIXME: this logic sucks
-		if (tess.shader->noFog && stageFog)
-		{
-			RB_FogPass(1);
-		}
-		else if (tess.shader->noFog && !stageFog)
-		{
-		}
-		else
+
+		if ( !tess.shader->noFog || stageFog )
 		{
 			RB_FogPass(1);
 		}

-- 
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