inline SceneZoneCullingState::CullingTestResult SceneCullingState::_test( const T& bounds, Iter zoneIter, const PlaneF& nearPlane, const PlaneF& farPlane ) const { // Defer test of near and far plane until we've hit a zone // which actually has visible space. This prevents us from // doing near/far tests on objects that were included in the // potential render list but aren't actually in any visible // zone. bool haveTestedNearAndFar = false; // Test the culling states of all zones that the object // is assigned to. for( ; zoneIter.isValid(); ++ zoneIter ) { const SceneZoneCullingState& zoneState = getZoneState( *zoneIter ); // Skip zone if there are no positive culling volumes. if( !zoneState.hasIncluders() ) continue; // If we haven't tested the near and far plane yet, do so // now. if( !haveTestedNearAndFar ) { // Test near plane. PlaneF::Side nearSide = nearPlane.whichSide( bounds ); if( nearSide == PlaneF::Back ) return SceneZoneCullingState::CullingTestNegative; // Test far plane. PlaneF::Side farSide = farPlane.whichSide( bounds ); if( farSide == PlaneF::Back ) return SceneZoneCullingState::CullingTestNegative; haveTestedNearAndFar = true; } // If the object's world bounds overlaps any of the volumes // for this zone, it's rendered. SceneZoneCullingState::CullingTestResult result = zoneState.testVolumes( bounds ); if( result == SceneZoneCullingState::CullingTestPositiveByInclusion ) return result; else if( result == SceneZoneCullingState::CullingTestPositiveByOcclusion ) return result; } return SceneZoneCullingState::CullingTestNegative; }
inline SceneZoneCullingState::CullingTestResult SceneCullingState::_testOccludersOnly( const T& bounds, Iter zoneIter ) const { // Test the culling states of all zones that the object // is assigned to. for( ; zoneIter.isValid(); ++ zoneIter ) { const SceneZoneCullingState& zoneState = getZoneState( *zoneIter ); // Skip zone if there are no occluders. if( !zoneState.hasOccluders() ) continue; // If the object's world bounds overlaps any of the volumes // for this zone, it's rendered. if( zoneState.testVolumes( bounds, true ) == SceneZoneCullingState::CullingTestPositiveByOcclusion ) return SceneZoneCullingState::CullingTestPositiveByOcclusion; } return SceneZoneCullingState::CullingTestNegative; }