-/*
+/* -------------------------------------------------------------------------------
+
Copyright (C) 1999-2007 id Software, Inc. and contributors.
For a list of contributors, see the accompanying CONTRIBUTORS file.
typedef struct traceInfo_s
{
shaderInfo_t *si;
- int surfaceNum, castShadows, padding;
+ int surfaceNum, castShadows;
}
traceInfo_t;
typedef struct traceTriangle_s
{
vec3_t edge1, edge2;
- int infoNum, padding;
+ int infoNum;
traceVert_t v[ 3 ];
}
traceTriangle_t;
node->maxItems *= 2;
else
node->maxItems += GROW_NODE_ITEMS;
+ if( node->maxItems <= 0 )
+ node->maxItems = GROW_NODE_ITEMS;
temp = safe_malloc( node->maxItems * sizeof( *node->items ) );
if( node->items != NULL )
{
{
bspLeafNum = -bspNode->children[ i ] - 1;
- #if 0
- /* solid leaf */
- if( bspLeafs[ bspLeafNum ].cluster == -1 )
- traceNodes[ nodeNum ].children[ i ] = -1;
-
- /* passable leaf */
- else
- traceNodes[ nodeNum ].children[ i ] = AllocTraceNode();
- #endif
-
/* new code */
traceNodes[ nodeNum ].children[ i ] = AllocTraceNode();
if( bspLeafs[ bspLeafNum ].cluster == -1 )
ti.castShadows = info->castShadows;
ti.surfaceNum = model->firstBSPBrush + i;
- /* setup trace winding */
- memset( &tw, 0, sizeof( tw ) );
- tw.infoNum = AddTraceInfo( &ti );
- tw.numVerts = 3;
-
/* choose which node (normal or skybox) */
if( info->parentSurfaceNum >= 0 )
+ {
nodeNum = skyboxNodeNum;
+
+ /* sky surfaces in portal skies are ignored */
+ if( info->si->compileFlags & C_SKY )
+ continue;
+ }
else
nodeNum = headNodeNum;
+ /* setup trace winding */
+ memset( &tw, 0, sizeof( tw ) );
+ tw.infoNum = AddTraceInfo( &ti );
+ tw.numVerts = 3;
+
/* switch on type */
switch( ds->surfaceType )
{
det = DotProduct( tt->edge1, pvec );
/* the non-culling branch */
- if( det > -COPLANAR_EPSILON && det < COPLANAR_EPSILON )
+ if( fabs( det ) < COPLANAR_EPSILON )
return qfalse;
invDet = 1.0f / det;
/* calculate t (depth) */
depth = DotProduct( tt->edge2, qvec ) * invDet;
- //% if( depth <= SELF_SHADOW_EPSILON || depth >= (trace->dist - SELF_SHADOW_EPSILON) )
- //% return qfalse;
if( depth <= trace->inhibitRadius || depth >= trace->distance )
return qfalse;
if( !(si->compileFlags & (C_ALPHASHADOW | C_LIGHTFILTER)) ||
si->lightImage == NULL || si->lightImage->pixels == NULL )
{
+ VectorMA( trace->origin, depth, trace->direction, trace->hit );
VectorClear( trace->color );
trace->opaque = qtrue;
return qtrue;
/* check filter for opaque */
if( trace->color[ 0 ] <= 0.001f && trace->color[ 1 ] <= 0.001f && trace->color[ 2 ] <= 0.001f )
{
+ VectorMA( trace->origin, depth, trace->direction, trace->hit );
trace->opaque = qtrue;
return qtrue;
}
/* bogus node number means solid, end tracing unless testing all */
if( nodeNum < 0 )
{
+ VectorCopy( origin, trace->hit );
trace->passSolid = qtrue;
return qtrue;
}
/* solid? */
if( node->type == TRACE_LEAF_SOLID )
{
+ VectorCopy( origin, trace->hit );
trace->passSolid = qtrue;
return qtrue;
}
/* fixme: check inhibit radius, then solid nodes and ignore */
+ /* set trace hit here */
+ //% VectorCopy( mid, trace->hit );
+
/* trace first side */
r = TraceLine_r( node->children[ side ], origin, mid, trace );
if( r )
/* trace through nodes */
TraceLine_r( headNodeNum, trace->origin, trace->end, trace );
- if( (trace->passSolid && !trace->testAll) )
+ if( trace->passSolid && !trace->testAll )
{
trace->opaque = qtrue;
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;
{
VectorSubtract( trace->end, trace->origin, trace->displacement );
trace->distance = VectorNormalize( trace->displacement, trace->direction );
+ VectorCopy( trace->origin, trace->hit );
return trace->distance;
}