From: divverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Sun, 13 Oct 2013 16:40:38 +0000 (+0000)
Subject: Software tcmod/tcgen: skip if pass needs no texcoords. Fixes #1326.
X-Git-Tag: xonotic-v0.8.0~96^2~16
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=ff5325c494f56b820830f093d26c2d2480925199;p=xonotic%2Fdarkplaces.git

Software tcmod/tcgen: skip if pass needs no texcoords. Fixes #1326.

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12024 d7cf8633-e32d-0410-b094-e92efae38249
---

diff --git a/gl_rmain.c b/gl_rmain.c
index a5870e75..81287ccb 100644
--- a/gl_rmain.c
+++ b/gl_rmain.c
@@ -10090,77 +10090,80 @@ void RSurf_PrepareVerticesForBatch(int batchneed, int texturenumsurfaces, const
 		}
 	}
 
-	// generate texcoords based on the chosen texcoord source
-	switch(rsurface.texture->tcgen.tcgen)
+	if (rsurface.batchtexcoordtexture2f)
 	{
-	default:
-	case Q3TCGEN_TEXTURE:
-		break;
-	case Q3TCGEN_LIGHTMAP:
-//		rsurface.batchtexcoordtexture2f = R_FrameData_Alloc(batchnumvertices * sizeof(float[2]));
-//		rsurface.batchtexcoordtexture2f_vertexbuffer = NULL;
-//		rsurface.batchtexcoordtexture2f_bufferoffset = 0;
-		if (rsurface.batchtexcoordlightmap2f)
-			memcpy(rsurface.batchtexcoordlightmap2f, rsurface.batchtexcoordtexture2f, batchnumvertices * sizeof(float[2]));
-		break;
-	case Q3TCGEN_VECTOR:
-//		rsurface.batchtexcoordtexture2f = R_FrameData_Alloc(batchnumvertices * sizeof(float[2]));
-//		rsurface.batchtexcoordtexture2f_vertexbuffer = NULL;
-//		rsurface.batchtexcoordtexture2f_bufferoffset = 0;
-		for (j = 0;j < batchnumvertices;j++)
-		{
-			rsurface.batchtexcoordtexture2f[j*2+0] = DotProduct(rsurface.batchvertex3f + 3*j, rsurface.texture->tcgen.parms);
-			rsurface.batchtexcoordtexture2f[j*2+1] = DotProduct(rsurface.batchvertex3f + 3*j, rsurface.texture->tcgen.parms + 3);
-		}
-		break;
-	case Q3TCGEN_ENVIRONMENT:
-		// make environment reflections using a spheremap
-		rsurface.batchtexcoordtexture2f = (float *)R_FrameData_Alloc(batchnumvertices * sizeof(float[2]));
-		rsurface.batchtexcoordtexture2f_vertexbuffer = NULL;
-		rsurface.batchtexcoordtexture2f_bufferoffset = 0;
-		for (j = 0;j < batchnumvertices;j++)
+	// generate texcoords based on the chosen texcoord source
+		switch(rsurface.texture->tcgen.tcgen)
 		{
-			// identical to Q3A's method, but executed in worldspace so
-			// carried models can be shiny too
+		default:
+		case Q3TCGEN_TEXTURE:
+			break;
+		case Q3TCGEN_LIGHTMAP:
+	//		rsurface.batchtexcoordtexture2f = R_FrameData_Alloc(batchnumvertices * sizeof(float[2]));
+	//		rsurface.batchtexcoordtexture2f_vertexbuffer = NULL;
+	//		rsurface.batchtexcoordtexture2f_bufferoffset = 0;
+			if (rsurface.batchtexcoordlightmap2f)
+				memcpy(rsurface.batchtexcoordtexture2f, rsurface.batchtexcoordlightmap2f, batchnumvertices * sizeof(float[2]));
+			break;
+		case Q3TCGEN_VECTOR:
+	//		rsurface.batchtexcoordtexture2f = R_FrameData_Alloc(batchnumvertices * sizeof(float[2]));
+	//		rsurface.batchtexcoordtexture2f_vertexbuffer = NULL;
+	//		rsurface.batchtexcoordtexture2f_bufferoffset = 0;
+			for (j = 0;j < batchnumvertices;j++)
+			{
+				rsurface.batchtexcoordtexture2f[j*2+0] = DotProduct(rsurface.batchvertex3f + 3*j, rsurface.texture->tcgen.parms);
+				rsurface.batchtexcoordtexture2f[j*2+1] = DotProduct(rsurface.batchvertex3f + 3*j, rsurface.texture->tcgen.parms + 3);
+			}
+			break;
+		case Q3TCGEN_ENVIRONMENT:
+			// make environment reflections using a spheremap
+			rsurface.batchtexcoordtexture2f = (float *)R_FrameData_Alloc(batchnumvertices * sizeof(float[2]));
+			rsurface.batchtexcoordtexture2f_vertexbuffer = NULL;
+			rsurface.batchtexcoordtexture2f_bufferoffset = 0;
+			for (j = 0;j < batchnumvertices;j++)
+			{
+				// identical to Q3A's method, but executed in worldspace so
+				// carried models can be shiny too
 
-			float viewer[3], d, reflected[3], worldreflected[3];
+				float viewer[3], d, reflected[3], worldreflected[3];
 
-			VectorSubtract(rsurface.localvieworigin, rsurface.batchvertex3f + 3*j, viewer);
-			// VectorNormalize(viewer);
+				VectorSubtract(rsurface.localvieworigin, rsurface.batchvertex3f + 3*j, viewer);
+				// VectorNormalize(viewer);
 
-			d = DotProduct(rsurface.batchnormal3f + 3*j, viewer);
+				d = DotProduct(rsurface.batchnormal3f + 3*j, viewer);
 
-			reflected[0] = rsurface.batchnormal3f[j*3+0]*2*d - viewer[0];
-			reflected[1] = rsurface.batchnormal3f[j*3+1]*2*d - viewer[1];
-			reflected[2] = rsurface.batchnormal3f[j*3+2]*2*d - viewer[2];
-			// note: this is proportinal to viewer, so we can normalize later
+				reflected[0] = rsurface.batchnormal3f[j*3+0]*2*d - viewer[0];
+				reflected[1] = rsurface.batchnormal3f[j*3+1]*2*d - viewer[1];
+				reflected[2] = rsurface.batchnormal3f[j*3+2]*2*d - viewer[2];
+				// note: this is proportinal to viewer, so we can normalize later
 
-			Matrix4x4_Transform3x3(&rsurface.matrix, reflected, worldreflected);
-			VectorNormalize(worldreflected);
+				Matrix4x4_Transform3x3(&rsurface.matrix, reflected, worldreflected);
+				VectorNormalize(worldreflected);
 
-			// note: this sphere map only uses world x and z!
-			// so positive and negative y will LOOK THE SAME.
-			rsurface.batchtexcoordtexture2f[j*2+0] = 0.5 + 0.5 * worldreflected[1];
-			rsurface.batchtexcoordtexture2f[j*2+1] = 0.5 - 0.5 * worldreflected[2];
+				// note: this sphere map only uses world x and z!
+				// so positive and negative y will LOOK THE SAME.
+				rsurface.batchtexcoordtexture2f[j*2+0] = 0.5 + 0.5 * worldreflected[1];
+				rsurface.batchtexcoordtexture2f[j*2+1] = 0.5 - 0.5 * worldreflected[2];
+			}
+			break;
 		}
-		break;
-	}
-	// the only tcmod that needs software vertex processing is turbulent, so
-	// check for it here and apply the changes if needed
-	// and we only support that as the first one
-	// (handling a mixture of turbulent and other tcmods would be problematic
-	//  without punting it entirely to a software path)
-	if (rsurface.texture->tcmods[0].tcmod == Q3TCMOD_TURBULENT)
-	{
-		amplitude = rsurface.texture->tcmods[0].parms[1];
-		animpos = rsurface.texture->tcmods[0].parms[2] + rsurface.shadertime * rsurface.texture->tcmods[0].parms[3];
-//		rsurface.batchtexcoordtexture2f = R_FrameData_Alloc(batchnumvertices * sizeof(float[2]));
-//		rsurface.batchtexcoordtexture2f_vertexbuffer = NULL;
-//		rsurface.batchtexcoordtexture2f_bufferoffset = 0;
-		for (j = 0;j < batchnumvertices;j++)
-		{
-			rsurface.batchtexcoordtexture2f[j*2+0] += amplitude * sin(((rsurface.batchvertex3f[j*3+0] + rsurface.batchvertex3f[j*3+2]) * 1.0 / 1024.0f + animpos) * M_PI * 2);
-			rsurface.batchtexcoordtexture2f[j*2+1] += amplitude * sin(((rsurface.batchvertex3f[j*3+1]                                ) * 1.0 / 1024.0f + animpos) * M_PI * 2);
+		// the only tcmod that needs software vertex processing is turbulent, so
+		// check for it here and apply the changes if needed
+		// and we only support that as the first one
+		// (handling a mixture of turbulent and other tcmods would be problematic
+		//  without punting it entirely to a software path)
+		if (rsurface.texture->tcmods[0].tcmod == Q3TCMOD_TURBULENT)
+		{
+			amplitude = rsurface.texture->tcmods[0].parms[1];
+			animpos = rsurface.texture->tcmods[0].parms[2] + rsurface.shadertime * rsurface.texture->tcmods[0].parms[3];
+	//		rsurface.batchtexcoordtexture2f = R_FrameData_Alloc(batchnumvertices * sizeof(float[2]));
+	//		rsurface.batchtexcoordtexture2f_vertexbuffer = NULL;
+	//		rsurface.batchtexcoordtexture2f_bufferoffset = 0;
+			for (j = 0;j < batchnumvertices;j++)
+			{
+				rsurface.batchtexcoordtexture2f[j*2+0] += amplitude * sin(((rsurface.batchvertex3f[j*3+0] + rsurface.batchvertex3f[j*3+2]) * 1.0 / 1024.0f + animpos) * M_PI * 2);
+				rsurface.batchtexcoordtexture2f[j*2+1] += amplitude * sin(((rsurface.batchvertex3f[j*3+1]                                ) * 1.0 / 1024.0f + animpos) * M_PI * 2);
+			}
 		}
 	}