int SceneManager::checkNodeVisibility( SceneNode &node, CameraNode &cam, bool checkOcclusion, bool calcLod ) { // Note: This function is a bit hacky with all the hard-coded node types if( node._dirty ) updateNodes(); // Check occlusion if( checkOcclusion && cam._occSet >= 0 ) { if( node.getType() == SceneNodeTypes::Mesh && cam._occSet < (int)((MeshNode *)&node)->_occQueries.size() ) { if( gRDI->getQueryResult( ((MeshNode *)&node)->_occQueries[cam._occSet] ) < 1 ) return -1; } else if( node.getType() == SceneNodeTypes::Emitter && cam._occSet < (int)((EmitterNode *)&node)->_occQueries.size() ) { if( gRDI->getQueryResult( ((EmitterNode *)&node)->_occQueries[cam._occSet] ) < 1 ) return -1; } else if( node.getType() == SceneNodeTypes::Light && cam._occSet < (int)((LightNode *)&node)->_occQueries.size() ) { if( gRDI->getQueryResult( ((LightNode *)&node)->_occQueries[cam._occSet] ) < 1 ) return -1; } } // Frustum culling if( cam.getFrustum().cullBox( node.getBBox() ) ) return -1; else if( calcLod ) return node.calcLodLevel( cam.getAbsPos() ); else return 0; }