[quake3-commits] r1672 - trunk/code/renderer

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Oct 16 16:26:18 EDT 2009


Author: thilo
Date: 2009-10-16 16:26:18 -0400 (Fri, 16 Oct 2009)
New Revision: 1672

Modified:
   trunk/code/renderer/tr_init.c
   trunk/code/renderer/tr_local.h
   trunk/code/renderer/tr_marks.c
Log:
Allow weapon marks on triangle meshes (default: disabled), patch by Oliver McFadden. http://bugzilla.icculus.org/show_bug.cgi?id=3774


Modified: trunk/code/renderer/tr_init.c
===================================================================
--- trunk/code/renderer/tr_init.c	2009-10-16 19:21:31 UTC (rev 1671)
+++ trunk/code/renderer/tr_init.c	2009-10-16 20:26:18 UTC (rev 1672)
@@ -155,6 +155,8 @@
 cvar_t	*r_printShaders;
 cvar_t	*r_saveFontData;
 
+cvar_t	*r_marksOnTriangleMeshes;
+
 cvar_t	*r_maxpolys;
 int		max_polys;
 cvar_t	*r_maxpolyverts;
@@ -1009,6 +1011,8 @@
 	r_noportals = ri.Cvar_Get ("r_noportals", "0", CVAR_CHEAT);
 	r_shadows = ri.Cvar_Get( "cg_shadows", "1", 0 );
 
+	r_marksOnTriangleMeshes = ri.Cvar_Get("r_marksOnTriangleMeshes", "0", CVAR_ARCHIVE);
+
 	r_maxpolys = ri.Cvar_Get( "r_maxpolys", va("%d", MAX_POLYS), 0);
 	r_maxpolyverts = ri.Cvar_Get( "r_maxpolyverts", va("%d", MAX_POLYVERTS), 0);
 

Modified: trunk/code/renderer/tr_local.h
===================================================================
--- trunk/code/renderer/tr_local.h	2009-10-16 19:21:31 UTC (rev 1671)
+++ trunk/code/renderer/tr_local.h	2009-10-16 20:26:18 UTC (rev 1672)
@@ -1114,6 +1114,8 @@
 extern	cvar_t	*r_printShaders;
 extern	cvar_t	*r_saveFontData;
 
+extern cvar_t	*r_marksOnTriangleMeshes;
+
 extern	cvar_t	*r_GLlibCoolDownMsec;
 
 //====================================================================

Modified: trunk/code/renderer/tr_marks.c
===================================================================
--- trunk/code/renderer/tr_marks.c	2009-10-16 19:21:31 UTC (rev 1671)
+++ trunk/code/renderer/tr_marks.c	2009-10-16 20:26:18 UTC (rev 1672)
@@ -173,7 +173,9 @@
 				surf->viewCount = tr.viewCount;
 			}
 		}
-		else if (*(surfaceType_t *) (surf->data) != SF_GRID) surf->viewCount = tr.viewCount;
+		else if (*(surfaceType_t *) (surf->data) != SF_GRID &&
+			 *(surfaceType_t *) (surf->data) != SF_TRIANGLES)
+			surf->viewCount = tr.viewCount;
 		// check the viewCount because the surface may have
 		// already been added if it spans multiple leafs
 		if (surf->viewCount != tr.viewCount) {
@@ -263,7 +265,6 @@
 	vec3_t			clipPoints[2][MAX_VERTS_ON_POLY];
 	int				numClipPoints;
 	float			*v;
-	srfSurfaceFace_t *surf;
 	srfGridMesh_t	*cv;
 	drawVert_t		*dv;
 	vec3_t			normal;
@@ -399,25 +400,20 @@
 		}
 		else if (*surfaces[i] == SF_FACE) {
 
-			surf = ( srfSurfaceFace_t * ) surfaces[i];
+			srfSurfaceFace_t *surf = ( srfSurfaceFace_t * ) surfaces[i];
+
 			// check the normal of this face
 			if (DotProduct(surf->plane.normal, projectionDir) > -0.5) {
 				continue;
 			}
 
-			/*
-			VectorSubtract(clipPoints[0][0], clipPoints[0][1], v1);
-			VectorSubtract(clipPoints[0][2], clipPoints[0][1], v2);
-			CrossProduct(v1, v2, normal);
-			VectorNormalize(normal);
-			if (DotProduct(normal, projectionDir) > -0.5) continue;
-			*/
 			indexes = (int *)( (byte *)surf + surf->ofsIndices );
 			for ( k = 0 ; k < surf->numIndices ; k += 3 ) {
 				for ( j = 0 ; j < 3 ; j++ ) {
 					v = surf->points[0] + VERTEXSIZE * indexes[k+j];;
 					VectorMA( v, MARKER_OFFSET, surf->plane.normal, clipPoints[0][j] );
 				}
+
 				// add the fragments of this face
 				R_AddMarkFragments( 3 , clipPoints,
 								   numPlanes, normals, dists,
@@ -428,14 +424,29 @@
 					return returnedFragments;	// not enough space for more fragments
 				}
 			}
-			continue;
 		}
-		else {
-			// ignore all other world surfaces
-			// might be cool to also project polygons on a triangle soup
-			// however this will probably create huge amounts of extra polys
-			// even more than the projection onto curves
-			continue;
+		else if(*surfaces[i] == SF_TRIANGLES && r_marksOnTriangleMeshes->integer) {
+
+			srfTriangles_t *surf = (srfTriangles_t *) surfaces[i];
+
+			for (k = 0; k < surf->numIndexes; k += 3)
+			{
+				for(j = 0; j < 3; j++)
+				{
+					v = surf->verts[surf->indexes[k + j]].xyz;
+					VectorMA(v, MARKER_OFFSET, surf->verts[surf->indexes[k + j]].normal, clipPoints[0][j]);
+				}
+
+				// add the fragments of this face
+				R_AddMarkFragments(3, clipPoints,
+								   numPlanes, normals, dists,
+								   maxPoints, pointBuffer,
+								   maxFragments, fragmentBuffer, &returnedPoints, &returnedFragments, mins, maxs);
+				if(returnedFragments == maxFragments)
+				{
+					return returnedFragments;	// not enough space for more fragments
+				}
+			}
 		}
 	}
 	return returnedFragments;



More information about the quake3-commits mailing list