Index: tr_local.h =================================================================== --- tr_local.h (revision 1470) +++ tr_local.h (working copy) @@ -1113,6 +1113,8 @@ extern cvar_t *r_printShaders; extern cvar_t *r_saveFontData; +extern cvar_t *r_marksOnTriangleMeshes; + extern cvar_t *r_GLlibCoolDownMsec; //==================================================================== Index: tr_init.c =================================================================== --- tr_init.c (revision 1470) +++ tr_init.c (working copy) @@ -154,6 +154,8 @@ cvar_t *r_printShaders; cvar_t *r_saveFontData; +cvar_t *r_marksOnTriangleMeshes; + cvar_t *r_maxpolys; int max_polys; cvar_t *r_maxpolyverts; @@ -1006,6 +1008,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", "1", 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); Index: tr_marks.c =================================================================== --- tr_marks.c (revision 1470) +++ tr_marks.c (working copy) @@ -1,6 +1,7 @@ /* =========================================================================== Copyright (C) 1999-2005 Id Software, Inc. +Copyright (C) 2008 Oliver McFadden This file is part of Quake III Arena source code. @@ -173,7 +174,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 +266,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 +401,30 @@ } 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] ); } + + /* + // check the normal of this triangle + 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; + */ + // add the fragments of this face R_AddMarkFragments( 3 , clipPoints, numPlanes, normals, dists, @@ -428,14 +435,39 @@ 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]); + } + + /* + // check the normal of this triangle + 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; + */ + + // 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;