/* * R_RecursiveFragmentNode */ static void R_RecursiveFragmentNode( void ) { int stackdepth = 0; float dist; qboolean inside; mnode_t *node, *localstack[2048]; mleaf_t *leaf; msurface_t *surf, **mark; for( node = rsh.worldBrushModel->nodes, stackdepth = 0;; ) { if( node->plane == NULL ) { leaf = ( mleaf_t * )node; mark = leaf->firstFragmentSurface; if( !mark ) goto nextNodeOnStack; do { if( numFragmentVerts == maxFragmentVerts || numClippedFragments == maxClippedFragments ) return; // already reached the limit surf = *mark++; if( surf->fragmentframe == r_fragmentframecount ) continue; surf->fragmentframe = r_fragmentframecount; if( !BoundsAndSphereIntersect( surf->mins, surf->maxs, fragmentOrigin, fragmentRadius ) ) continue; if( surf->facetype == FACETYPE_PATCH ) inside = R_PatchSurfClipFragment( surf, fragmentNormal ); else inside = R_PlanarSurfClipFragment( surf, fragmentNormal ); // if there some fragments that are inside a surface, that doesn't mean that // there are no fragments that are OUTSIDE, so the check below is disabled //if( inside ) // return; (void)inside; // hush compiler warning } while( *mark ); if( numFragmentVerts == maxFragmentVerts || numClippedFragments == maxClippedFragments ) return; // already reached the limit nextNodeOnStack: if( !stackdepth ) break; node = localstack[--stackdepth]; continue; } dist = PlaneDiff( fragmentOrigin, node->plane ); if( dist > fragmentRadius ) { node = node->children[0]; continue; } if( ( dist >= -fragmentRadius ) && ( stackdepth < sizeof( localstack )/sizeof( mnode_t * ) ) ) localstack[stackdepth++] = node->children[0]; node = node->children[1]; } }
/* ================= R_RecursiveFragmentNode ================= */ static void R_RecursiveFragmentNode( void ) { int stackdepth = 0; float dist; bool inside; mnode_t *node, *localstack[2048]; mleaf_t *leaf; msurface_t *surf, **mark; for( node = r_worldbrushmodel->nodes, stackdepth = 0;; ) { if( node->plane == NULL ) { leaf = ( mleaf_t * )node; mark = leaf->firstFragmentSurface; if( !mark ) goto nextNodeOnStack; do { if( numFragmentVerts == maxFragmentVerts || numClippedFragments == maxClippedFragments ) return; // already reached the limit surf = *mark++; if( surf->fragmentframe == r_fragmentframecount ) continue; surf->fragmentframe = r_fragmentframecount; if( !BoundsAndSphereIntersect( surf->mins, surf->maxs, fragmentOrigin, fragmentRadius ) ) continue; if( surf->facetype == MST_PATCH ) inside = R_PatchSurfClipFragment( surf, fragmentNormal ); else inside = R_PlanarSurfClipFragment( surf, fragmentNormal ); if( inside ) return; } while( *mark ); if( numFragmentVerts == maxFragmentVerts || numClippedFragments == maxClippedFragments ) return; // already reached the limit nextNodeOnStack: if( !stackdepth ) break; node = localstack[--stackdepth]; continue; } dist = PlaneDiff( fragmentOrigin, node->plane ); if( dist > fragmentRadius ) { node = node->children[0]; continue; } if( ( dist >= -fragmentRadius ) && ( stackdepth < sizeof( localstack ) / sizeof( mnode_t * ))) localstack[stackdepth++] = node->children[0]; node = node->children[1]; } }