From ac7fbc63208ebb3a958b5dfce3f608dff9b356ae Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 11 Jun 2013 13:29:01 -0700 Subject: [PATCH] added occlusion tests to debug menu --- interface/src/Application.cpp | 100 +++++++++++++++++++--------------- interface/src/Application.h | 4 +- interface/src/VoxelSystem.cpp | 30 ++++++++++ interface/src/VoxelSystem.h | 2 + 4 files changed, 90 insertions(+), 46 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3dc18272c6..d97e488d90 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -964,6 +964,11 @@ void Application::doFalseColorizeInView() { _voxels.falseColorizeInView(&_viewFrustum); } +void Application::doFalseColorizeOccluded() { + _debugShowVirtualOccluders->setChecked(true); + _voxels.falseColorizeOccluded(); +} + void Application::doTrueVoxelColors() { _voxels.trueColorize(); } @@ -1316,7 +1321,9 @@ void Application::initMenu() { renderDebugMenu->addAction("FALSE Color Voxel Every Other Randomly", this, SLOT(doFalseRandomizeEveryOtherVoxelColors())); renderDebugMenu->addAction("FALSE Color Voxels by Distance", this, SLOT(doFalseColorizeByDistance())); renderDebugMenu->addAction("FALSE Color Voxel Out of View", this, SLOT(doFalseColorizeInView())); - renderDebugMenu->addAction("Show TRUE Colors", this, SLOT(doTrueVoxelColors())); + renderDebugMenu->addAction("FALSE Color Occluded Voxels", this, SLOT(doFalseColorizeOccluded()), Qt::CTRL | Qt::Key_O); + renderDebugMenu->addAction("Show TRUE Colors", this, SLOT(doTrueVoxelColors()), Qt::CTRL | Qt::Key_T); + (_debugShowVirtualOccluders = renderDebugMenu->addAction("Show Virtual Occluders"))->setCheckable(true); debugMenu->addAction("Wants Res-In", this, SLOT(setWantsResIn(bool)))->setCheckable(true); debugMenu->addAction("Wants Monochrome", this, SLOT(setWantsMonochrome(bool)))->setCheckable(true); @@ -1902,59 +1909,62 @@ glm::vec2 Application::getScreenPoint(glm::vec3 voxelPoint) { return getScaledScreenPoint(projectedPoint); } -void Application::render2DTests() { - glLineWidth(2.0); - glBegin(GL_LINES); - glColor3f(1,0,0); +void Application::renderVirtualOccluders() { - AABox boxA(glm::vec3(0,0,0), 0.0125); - boxA.scale(TREE_SCALE); - VoxelProjectedShadow shadowA = _viewFrustum.getProjectedShadow(boxA); + if (_debugShowVirtualOccluders->isChecked()) { + glLineWidth(2.0); + glBegin(GL_LINES); + glColor3f(0,0,1); - AABox boxB(glm::vec3(0.0125,0,0.025), 0.0125); - boxB.scale(TREE_SCALE); - VoxelProjectedShadow shadowB = _viewFrustum.getProjectedShadow(boxB); + AABox boxA(glm::vec3(0,0,0), 0.0125); + boxA.scale(TREE_SCALE); + VoxelProjectedShadow shadowA = _viewFrustum.getProjectedShadow(boxA); - bool shadowAoccludesB = shadowA.occludes(shadowB); - bool shadowBoccludesA = shadowB.occludes(shadowA); + AABox boxB(glm::vec3(0.0125,0,0.025), 0.0125); + boxB.scale(TREE_SCALE); + VoxelProjectedShadow shadowB = _viewFrustum.getProjectedShadow(boxB); + + bool shadowAoccludesB = shadowA.occludes(shadowB); + bool shadowBoccludesA = shadowB.occludes(shadowA); - if (shadowA.getVertexCount()) { - if (shadowBoccludesA) { - glColor3f(0,1,1); - } else { - glColor3f(1,0,0); - } - glm::vec2 firstPoint = getScaledScreenPoint(shadowA.getVertex(0)); - glm::vec2 lastPoint(firstPoint); - for (int i = 1; i < shadowA.getVertexCount(); i++) { - glm::vec2 thisPoint = getScaledScreenPoint(shadowA.getVertex(i)); + if (shadowA.getVertexCount()) { + if (shadowBoccludesA) { + glColor3f(1,0,0); + } else { + glColor3f(0,0,1); + } + glm::vec2 firstPoint = getScaledScreenPoint(shadowA.getVertex(0)); + glm::vec2 lastPoint(firstPoint); + for (int i = 1; i < shadowA.getVertexCount(); i++) { + glm::vec2 thisPoint = getScaledScreenPoint(shadowA.getVertex(i)); + glVertex2f(lastPoint.x, lastPoint.y); + glVertex2f(thisPoint.x, thisPoint.y); + lastPoint = thisPoint; + } glVertex2f(lastPoint.x, lastPoint.y); - glVertex2f(thisPoint.x, thisPoint.y); - lastPoint = thisPoint; + glVertex2f(firstPoint.x, firstPoint.y); } - glVertex2f(lastPoint.x, lastPoint.y); - glVertex2f(firstPoint.x, firstPoint.y); - } - if (shadowB.getVertexCount()) { - if (shadowAoccludesB) { - glColor3f(0,1,0); - } else { - glColor3f(1,0,0); - } - glm::vec2 firstPoint = getScaledScreenPoint(shadowB.getVertex(0)); - glm::vec2 lastPoint(firstPoint); - for (int i = 1; i < shadowB.getVertexCount(); i++) { - glm::vec2 thisPoint = getScaledScreenPoint(shadowB.getVertex(i)); + if (shadowB.getVertexCount()) { + if (shadowAoccludesB) { + glColor3f(0,1,0); + } else { + glColor3f(1,0,0); + } + glm::vec2 firstPoint = getScaledScreenPoint(shadowB.getVertex(0)); + glm::vec2 lastPoint(firstPoint); + for (int i = 1; i < shadowB.getVertexCount(); i++) { + glm::vec2 thisPoint = getScaledScreenPoint(shadowB.getVertex(i)); + glVertex2f(lastPoint.x, lastPoint.y); + glVertex2f(thisPoint.x, thisPoint.y); + lastPoint = thisPoint; + } glVertex2f(lastPoint.x, lastPoint.y); - glVertex2f(thisPoint.x, thisPoint.y); - lastPoint = thisPoint; + glVertex2f(firstPoint.x, firstPoint.y); } - glVertex2f(lastPoint.x, lastPoint.y); - glVertex2f(firstPoint.x, firstPoint.y); - } - glEnd(); + glEnd(); + } } void Application::displaySide(Camera& whichCamera) { @@ -2240,7 +2250,7 @@ void Application::displayStats() { } // testing.... - render2DTests(); + renderVirtualOccluders(); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 44ef76b801..276c913fb8 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -102,6 +102,7 @@ private slots: void doFalseRandomizeVoxelColors(); void doFalseRandomizeEveryOtherVoxelColors(); void doFalseColorizeByDistance(); + void doFalseColorizeOccluded(); void doFalseColorizeInView(); void doTrueVoxelColors(); void doTreeStats(); @@ -141,7 +142,7 @@ private: void displayStats(); // Couple of debug routines for use in debuggin/developing Occlusion Culling. Will be removed eventually - void render2DTests(); + void renderVirtualOccluders(); glm::vec2 getScreenPoint(glm::vec3 voxelPoint); glm::vec2 getScaledScreenPoint(glm::vec2 projectedPoint); @@ -206,6 +207,7 @@ private: QAction* _fullScreenMode; // whether we are in full screen mode QAction* _frustumRenderModeAction; QAction* _settingsAutosave; // Whether settings are saved automatically + QAction* _debugShowVirtualOccluders; SerialInterface _serialHeadSensor; QNetworkAccessManager* _networkAccessManager; diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 9cde8906be..cd6a4436ab 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -1156,3 +1156,33 @@ void VoxelSystem::copyFromTreeIntoSubTree(VoxelTree* sourceTree, VoxelNode* dest _tree->copyFromTreeIntoSubTree(sourceTree, destinationNode); } +struct FalseColorizeOccludedArgs { + VoxelProjectedShadow occluder; + ViewFrustum* viewFrustum; +}; + +bool VoxelSystem::falseColorizeOccludedOperation(VoxelNode* node, void* extraData) { + FalseColorizeOccludedArgs* args = (FalseColorizeOccludedArgs*) extraData; + if (node->isColored()) { + AABox voxelBox = node->getAABox(); + voxelBox.scale(TREE_SCALE); + VoxelProjectedShadow voxelShadow = args->viewFrustum->getProjectedShadow(voxelBox); + if (args->occluder.occludes(voxelShadow)) { + node->setFalseColor(255, 0, 0); + } + } + return true; // keep going! +} + +void VoxelSystem::falseColorizeOccluded() { + FalseColorizeOccludedArgs args; + args.viewFrustum = Application::getInstance()->getViewFrustum(); + + AABox box(glm::vec3(0.0125,0,0.025), 0.0125); + box.scale(TREE_SCALE); + args.occluder = args.viewFrustum->getProjectedShadow(box); + + _tree->recurseTreeWithOperation(falseColorizeOccludedOperation,(void*)&args); + setupNewVoxelsForDrawing(); +} + diff --git a/interface/src/VoxelSystem.h b/interface/src/VoxelSystem.h index c4aa33adfc..6a07249454 100644 --- a/interface/src/VoxelSystem.h +++ b/interface/src/VoxelSystem.h @@ -56,6 +56,7 @@ public: void falseColorizeInView(ViewFrustum* viewFrustum); void falseColorizeDistanceFromView(ViewFrustum* viewFrustum); void falseColorizeRandomEveryOther(); + void falseColorizeOccluded(); void killLocalVoxels(); void setRenderPipelineWarnings(bool on) { _renderWarningsOn = on; }; @@ -120,6 +121,7 @@ private: static bool removeOutOfViewOperation(VoxelNode* node, void* extraData); static bool falseColorizeRandomEveryOtherOperation(VoxelNode* node, void* extraData); static bool collectStatsForTreesAndVBOsOperation(VoxelNode* node, void* extraData); + static bool falseColorizeOccludedOperation(VoxelNode* node, void* extraData); int updateNodeInArraysAsFullVBO(VoxelNode* node); int updateNodeInArraysAsPartialVBO(VoxelNode* node);