//============================================================================ // bvvfc.cpp : bounding-volume hierarchy ViewFrustumCuller BASE class implementation //============================================================================ #include "bvvfc.hpp" #ifdef STATS_ON // STATS GATHERING VARIABLES float BVvfc::_NumBVcompleteIn_; float BVvfc::_NumBVcompleteInObjs_; float BVvfc::_NumBVpartial_; float BVvfc::_NumBVpartialObjs_; float BVvfc::_NumBVcompleteOut_; float BVvfc::_NumBVcompleteOutObjs_; float BVvfc::_NumBVvisited_; #endif //-------------------------------------------------------------------------- // THE "STANDARD" CULLING TRAVERSAL ROUTINE: // RECURSIVELY TRAVERSE THE BVtree AND DETERMINE MINIMAL OVERLAPPING NODE SET. //-------------------------------------------------------------------------- void BVvfc::CullBVtree(BVtree* BVt) { CallBackVisitedBV(BVt); if (BVt) { int OVERLAP=BVt->OverlapVF(VF); if (OVERLAP==COMPLETEIN) { CallBackCompleteInBV(BVt); } else if (OVERLAP==PARTIAL) { if (BVt->IsLeaf()) CallBackPartialBV(BVt); else { CullBVtree(BVt->N); CullBVtree(BVt->P); } } else // OVERLAP==COMPLETEOUT { CallBackCompleteOutBV(BVt); } } } //-------------------------------------------------------------------------- // ALTERNATIVE CULLING TRAVERSAL ROUTINE: // Recursively traverses the BVtree to a specified level and checks for // overlap with the nodes at this level (or higher if leaf is reached). // A default value of -1 is used to traverse to the leaves. Assumes at least // one node is present. //-------------------------------------------------------------------------- void BVvfc::CullBVtreeToLevel(BVtree* BVt, int Level=-1) { CallBackVisitedBV(BVt); if (Level==0 || BVt->IsLeaf()) { int OVERLAP=BVt->OverlapVF(VF); if (OVERLAP==COMPLETEIN) CallBackCompleteInBV(BVt); else if (OVERLAP==PARTIAL) CallBackPartialBV(BVt); else CallBackCompleteOutBV(BVt); } else { CullBVtreeToLevel(BVt->N, Level-1); CullBVtreeToLevel(BVt->P, Level-1); }; };