vec3_t origin;
vec3_t dir;
- edgePoint_t chain; // unused element of doubly linked list
+ edgePoint_t *chain; // unused element of doubly linked list
} edgeLine_t;
typedef struct {
bspDrawVert_t *dv[2];
} originalEdge_t;
-#define MAX_ORIGINAL_EDGES 0x80000
-originalEdge_t originalEdges[MAX_ORIGINAL_EDGES];
+originalEdge_t *originalEdges = NULL;
int numOriginalEdges;
+int allocatedOriginalEdges = 0;
-#define MAX_EDGE_LINES 0x80000
-edgeLine_t edgeLines[MAX_EDGE_LINES];
+edgeLine_t *edgeLines = NULL;
int numEdgeLines;
+int allocatedEdgeLines = 0;
int c_degenerateEdges;
int c_addedVerts;
p->intercept = d;
VectorCopy( v, p->xyz );
- if ( e->chain.next == &e->chain ) {
- e->chain.next = e->chain.prev = p;
- p->next = p->prev = &e->chain;
+ if ( e->chain->next == e->chain ) {
+ e->chain->next = e->chain->prev = p;
+ p->next = p->prev = e->chain;
return;
}
- scan = e->chain.next;
- for ( ; scan != &e->chain ; scan = scan->next ) {
+ scan = e->chain->next;
+ for ( ; scan != e->chain ; scan = scan->next ) {
d = p->intercept - scan->intercept;
if ( d > -LINE_POSITION_EPSILON && d < LINE_POSITION_EPSILON ) {
free( p );
if ( !createNonAxial ) {
if ( fabs( dir[0] + dir[1] + dir[2] ) != 1.0 ) {
- if ( numOriginalEdges == MAX_ORIGINAL_EDGES ) {
- Error( "MAX_ORIGINAL_EDGES" );
- }
+ AUTOEXPAND_BY_REALLOC(originalEdges, numOriginalEdges, allocatedOriginalEdges, 1024);
originalEdges[ numOriginalEdges ].dv[0] = (bspDrawVert_t *)v1;
originalEdges[ numOriginalEdges ].dv[1] = (bspDrawVert_t *)v2;
originalEdges[ numOriginalEdges ].length = d;
}
// create a new edge
- if ( numEdgeLines >= MAX_EDGE_LINES ) {
- Error( "MAX_EDGE_LINES" );
- }
+ AUTOEXPAND_BY_REALLOC(edgeLines, numEdgeLines, allocatedEdgeLines, 1024);
e = &edgeLines[ numEdgeLines ];
numEdgeLines++;
- e->chain.next = e->chain.prev = &e->chain;
+ e->chain = safe_malloc( sizeof(edgePoint_t) );
+ e->chain->next = e->chain->prev = e->chain;
VectorCopy( v1, e->origin );
VectorCopy( dir, e->dir );
FixSurfaceJunctions
====================
*/
-#define MAX_SURFACE_VERTS 1024
+#define MAX_SURFACE_VERTS 256
void FixSurfaceJunctions( mapDrawSurface_t *ds ) {
int i, j, k;
edgeLine_t *e;
if ( start < end ) {
- p = e->chain.next;
+ p = e->chain->next;
} else {
- p = e->chain.prev;
+ p = e->chain->prev;
}
- for ( ; p != &e->chain ; ) {
+ for ( ; p != e->chain ; ) {
if ( start < end ) {
if ( p->intercept > end - ON_EPSILON ) {
break;
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;
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;
}
shaderInfo_t *si;
int axialEdgeLines;
originalEdge_t *e;
-
+ bspDrawVert_t *dv;
/* meta mode has its own t-junction code (currently not as good as this code) */
//% if( meta )
// this gives the most accurate edge description
for ( i = 0 ; i < numOriginalEdges ; i++ ) {
e = &originalEdges[i];
- e->dv[ 0 ]->lightmap[ 0 ][ 0 ] = AddEdge( e->dv[ 0 ]->xyz, e->dv[ 1 ]->xyz, qtrue );
+ dv = e->dv[0]; // e might change during AddEdge
+ dv->lightmap[ 0 ][ 0 ] = AddEdge( e->dv[ 0 ]->xyz, e->dv[ 1 ]->xyz, qtrue );
}
Sys_FPrintf( SYS_VRB, "%9d axial edge lines\n", axialEdgeLines );