int i, j, k;
edgeLine_t *e;
edgePoint_t *p;
- int originalVerts;
int counts[MAX_SURFACE_VERTS];
int originals[MAX_SURFACE_VERTS];
- int firstVert[MAX_SURFACE_VERTS];
bspDrawVert_t verts[MAX_SURFACE_VERTS], *v1, *v2;
int numVerts;
float start, end, frac, c;
vec3_t delta;
- originalVerts = ds->numVerts;
-
numVerts = 0;
for ( i = 0 ; i < ds->numVerts ; i++ )
{
counts[i] = 0;
- firstVert[i] = numVerts;
// copy first vert
if ( numVerts == MAX_SURFACE_VERTS ) {
qboolean FixBrokenSurface( mapDrawSurface_t *ds )
{
- qboolean valid = qtrue;
bspDrawVert_t *dv1, *dv2, avg;
int i, j, k;
float dist;
/* check all verts */
for( i = 0; i < ds->numVerts; i++ )
{
- /* don't remove points if winding is a triangle */
- if( ds->numVerts == 3 )
- return valid;
-
/* get verts */
dv1 = &ds->verts[ i ];
dv2 = &ds->verts[ (i + 1) % ds->numVerts ];
dist = VectorLength( avg.xyz );
if( dist < DEGENERATE_EPSILON )
{
- //valid = qfalse; // no, valid = qfalse is only done if less than 3 verts are left
Sys_FPrintf( SYS_VRB, "WARNING: Degenerate T-junction edge found, fixing...\n" );
/* create an average drawvert */
memcpy( dv2, dv1, sizeof( bspDrawVert_t ) );
}
ds->numVerts--;
+
+ /* after welding, we have to consider the same vertex again, as it now has a new neighbor dv2 */
+ --i;
+
+ /* should ds->numVerts have become 0, then i is now -1. In the next iteration, the loop will abort. */
}
}
/* one last check and return */
- if( ds->numVerts < 3 )
- valid = qfalse;
- return valid;
+ return ds->numVerts >= 3;
}
int EdgeCompare( const void *elem1, const void *elem2 ) {
float d1, d2;
- d1 = ((originalEdge_t *)elem1)->length;
- d2 = ((originalEdge_t *)elem2)->length;
+ d1 = ((const originalEdge_t *)elem1)->length;
+ d2 = ((const originalEdge_t *)elem2)->length;
if ( d1 < d2 ) {
return -1;