#include "StopAndWaitCullingManager.h" #include namespace GtpVisibility { //----------------------------------------------------------------------- void StopAndWaitCullingManager::RenderScene() { mNumFrustumCulledNodes = mNumQueryCulledNodes = 0; //OutputDebugString("Stop and Wait Culling\n"); while (!mHierarchyInterface->GetQueue()->empty()) { HierarchyNode *node = mHierarchyInterface->GetQueue()->top(); mHierarchyInterface->GetQueue()->pop(); // interesting for visualization purpose mHierarchyInterface->SetNodeVisible(node, false); mHierarchyInterface->SetLastVisited(node, mHierarchyInterface->GetFrameId()); bool intersects = false; if (!mHierarchyInterface->CheckFrustumVisible(node, intersects)) { mNumFrustumCulledNodes ++; } else { //if intersects near plane => skip occlusion query because wrong results possible if (intersects) { mHierarchyInterface->SetNodeVisible(node, true); mHierarchyInterface->TraverseNode(node); continue; } unsigned int visiblePixels = 0; mHierarchyInterface->IssueOcclusionQuery(node)->GetQueryResult(visiblePixels, true); // node visible if (visiblePixels > mVisibilityThreshold) { mHierarchyInterface->TraverseNode(node); } else { mNumQueryCulledNodes ++; } } } } } // namespace GtpVisibility