qboolean TraceWinding(traceWinding_t * tw, trace_t * trace) { int i; traceTriangle_t tt; /* initial setup */ tt.infoNum = tw->infoNum; tt.v[0] = tw->v[0]; /* walk vertex list */ for(i = 1; i + 1 < tw->numVerts; i++) { /* set verts */ tt.v[1] = tw->v[i]; tt.v[2] = tw->v[i + 1]; /* find vectors for two edges sharing the first vert */ VectorSubtract(tt.v[1].xyz, tt.v[0].xyz, tt.edge1); VectorSubtract(tt.v[2].xyz, tt.v[0].xyz, tt.edge2); /* trace it */ if(TraceTriangle(&traceInfos[tt.infoNum], &tt, trace)) return qtrue; } /* done */ return qfalse; }
void TraceLine( trace_t *trace ){ int i, j; traceNode_t *node; traceTriangle_t *tt; traceInfo_t *ti; /* setup output (note: this code assumes the input data is completely filled out) */ trace->passSolid = qfalse; trace->opaque = qfalse; trace->compileFlags = 0; trace->numTestNodes = 0; /* early outs */ if ( !trace->recvShadows || !trace->testOcclusion || trace->distance <= 0.00001f ) { return; } /* trace through nodes */ TraceLine_r( headNodeNum, trace->origin, trace->end, trace ); if ( trace->passSolid && !trace->testAll ) { trace->opaque = qtrue; return; } /* skip surfaces? */ if ( noSurfaces ) { return; } /* testall means trace through sky */ if ( trace->testAll && trace->numTestNodes < MAX_TRACE_TEST_NODES && trace->compileFlags & C_SKY && ( trace->numSurfaces == 0 || surfaceInfos[ trace->surfaces[ 0 ] ].childSurfaceNum < 0 ) ) { //% trace->testNodes[ trace->numTestNodes++ ] = skyboxNodeNum; TraceLine_r( skyboxNodeNum, trace->origin, trace->end, trace ); } /* walk node list */ for ( i = 0; i < trace->numTestNodes; i++ ) { /* get node */ node = &traceNodes[ trace->testNodes[ i ] ]; /* walk node item list */ for ( j = 0; j < node->numItems; j++ ) { tt = &traceTriangles[ node->items[ j ] ]; ti = &traceInfos[ tt->infoNum ]; if ( TraceTriangle( ti, tt, trace ) ) { return; } //% if( TraceWinding( &traceWindings[ node->items[ j ] ], trace ) ) //% return; } } }