From e129b0a12c5093bfa83ec899129b2553ced39da9 Mon Sep 17 00:00:00 2001 From: David Williams Date: Tue, 25 Sep 2007 00:09:03 +0000 Subject: [PATCH] Cleaning up decimation. --- include/SurfaceEdge.h | 27 ++++++------- source/PolyVoxSceneManager.cpp | 4 +- source/SurfaceEdge.cpp | 42 ++++++++++++++++++++ source/SurfacePatch.cpp | 70 +++++++++++----------------------- 4 files changed, 81 insertions(+), 62 deletions(-) diff --git a/include/SurfaceEdge.h b/include/SurfaceEdge.h index 39e6d473..5c235f1f 100644 --- a/include/SurfaceEdge.h +++ b/include/SurfaceEdge.h @@ -43,11 +43,7 @@ namespace Ogre SurfaceTriangleIterator triangle; - SurfaceEdgeIterator previousHalfEdge; - - SurfaceEdgeIterator nextHalfEdge; - - SurfaceEdgeIterator otherHalfEdge; + //FIXME - could use boost::optional for this? @@ -55,19 +51,24 @@ namespace Ogre bool isDegenerate(void); - const SurfaceVertexIterator& getTarget(void) - { - return target; - } + const SurfaceVertexIterator& getTarget(void); + const SurfaceVertexIterator& getSource(void); + const SurfaceEdgeIterator& getOtherHalfEdge(void); + const SurfaceEdgeIterator& getPreviousHalfEdge(void); + const SurfaceEdgeIterator& getNextHalfEdge(void); - const SurfaceVertexIterator& getSource(void) - { - return source; - } + void setPreviousHalfEdge(const SurfaceEdgeIterator& previousHalfEdgeToSet); + void setNextHalfEdge(const SurfaceEdgeIterator& nextHalfEdgeToSet); + + void pairWithOtherHalfEdge(const SurfaceEdgeIterator& otherHalfEdgeToPair); private: SurfaceVertexIterator target; SurfaceVertexIterator source; + + SurfaceEdgeIterator previousHalfEdge; + SurfaceEdgeIterator nextHalfEdge; + SurfaceEdgeIterator otherHalfEdge; }; } diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index b57e065f..c6918b0b 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -324,10 +324,10 @@ namespace Ogre for(uint regionZ = 0; regionZ < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionZ) { LogManager::getSingleton().logMessage("regionZ = " + StringConverter::toString(regionZ)); - for(uint regionY = OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2-2; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++regionY) + for(uint regionY = OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2-1; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++regionY) { //LogManager::getSingleton().logMessage("regionY = " + StringConverter::toString(regionY)); - for(uint regionX = OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2-2; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++regionX) + for(uint regionX = OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2-1; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++regionX) { //LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX)); if(surfaceUpToDate[regionX][regionY][regionZ] == false) diff --git a/source/SurfaceEdge.cpp b/source/SurfaceEdge.cpp index f7744323..c8e595ab 100644 --- a/source/SurfaceEdge.cpp +++ b/source/SurfaceEdge.cpp @@ -45,4 +45,46 @@ namespace Ogre return false; } + + const SurfaceVertexIterator& SurfaceEdge::getTarget(void) + { + return target; + } + + const SurfaceVertexIterator& SurfaceEdge::getSource(void) + { + return source; + } + + void SurfaceEdge::pairWithOtherHalfEdge(const SurfaceEdgeIterator& otherHalfEdgeToPair) + { + otherHalfEdge = otherHalfEdgeToPair; + previousHalfEdge = otherHalfEdgeToPair; + nextHalfEdge = otherHalfEdgeToPair; + } + + const SurfaceEdgeIterator& SurfaceEdge::getOtherHalfEdge(void) + { + return otherHalfEdge; + } + + const SurfaceEdgeIterator& SurfaceEdge::getPreviousHalfEdge(void) + { + return previousHalfEdge; + } + + const SurfaceEdgeIterator& SurfaceEdge::getNextHalfEdge(void) + { + return nextHalfEdge; + } + + void SurfaceEdge::setPreviousHalfEdge(const SurfaceEdgeIterator& previousHalfEdgeToSet) + { + previousHalfEdge = previousHalfEdgeToSet; + } + + void SurfaceEdge::setNextHalfEdge(const SurfaceEdgeIterator& nextHalfEdgeToSet) + { + nextHalfEdge = nextHalfEdgeToSet; + } } diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp index 10e833c0..f007af9d 100644 --- a/source/SurfacePatch.cpp +++ b/source/SurfacePatch.cpp @@ -77,13 +77,13 @@ namespace Ogre v1Iter->setEdge(v1v2Iter); v2Iter->setEdge(v2v0Iter); - v0v1Iter->nextHalfEdge = v1v2Iter; - v1v2Iter->nextHalfEdge = v2v0Iter; - v2v0Iter->nextHalfEdge = v0v1Iter; + v0v1Iter->setNextHalfEdge(v1v2Iter); + v1v2Iter->setNextHalfEdge(v2v0Iter); + v2v0Iter->setNextHalfEdge(v0v1Iter); - v0v1Iter->previousHalfEdge = v2v0Iter; - v1v2Iter->previousHalfEdge = v0v1Iter; - v2v0Iter->previousHalfEdge = v1v2Iter; + v0v1Iter->setPreviousHalfEdge(v2v0Iter); + v1v2Iter->setPreviousHalfEdge(v0v1Iter); + v2v0Iter->setPreviousHalfEdge(v1v2Iter); SurfaceTriangle triangle; @@ -137,45 +137,21 @@ namespace Ogre SurfaceEdgeIterator SurfacePatch::findOrAddEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target) { - /*for(SurfaceEdgeIterator edgeIter = m_listEdges.begin(); edgeIter != m_listEdges.end(); ++edgeIter) - { - if((edgeIter->target == target) && (edgeIter->source == source)) - { - return edgeIter; - } - }*/ - - SurfaceEdge edgeToFind(target, source); - SurfaceEdgeIterator foundEdgeIter = m_listEdges.find(edgeToFind); - if(foundEdgeIter != m_listEdges.end()) - { - return foundEdgeIter; - } - - //Not found - add it. SurfaceEdge edge(target,source); - SurfaceEdge otherEdge(source, target); + std::pair insertionResult = m_listEdges.insert(edge); - /*m_listEdges.push_back(edge); - SurfaceEdgeIterator edgeIter = m_listEdges.end(); - edgeIter--;*/ - SurfaceEdgeIterator edgeIter = m_listEdges.insert(edge).first; + if(insertionResult.second == false) + { + //Edge was already in there, so other edge is too. + return insertionResult.first; + } + SurfaceEdgeIterator edgeIter = insertionResult.first; - /*m_listEdges.push_back(otherEdge); - SurfaceEdgeIterator otherEdgeIter = m_listEdges.end(); - otherEdgeIter--;*/ + SurfaceEdge otherEdge(source, target); SurfaceEdgeIterator otherEdgeIter = m_listEdges.insert(otherEdge).first; - edgeIter->otherHalfEdge = otherEdgeIter; - edgeIter->nextHalfEdge = otherEdgeIter; - edgeIter->previousHalfEdge = otherEdgeIter; - - otherEdgeIter->otherHalfEdge = edgeIter; - otherEdgeIter->nextHalfEdge = edgeIter; - otherEdgeIter->previousHalfEdge = edgeIter; - - /*edgeIter->hasTriangle = false; - otherEdgeIter->hasTriangle = false;*/ + edgeIter->pairWithOtherHalfEdge(otherEdgeIter); + otherEdgeIter->pairWithOtherHalfEdge(edgeIter); return edgeIter; } @@ -291,12 +267,12 @@ namespace Ogre //LogManager::getSingleton().logMessage(" " + StringConverter::toString(iterVertex->getPosition().x) + "," + StringConverter::toString(iterVertex->getPosition().y) + "," + StringConverter::toString(iterVertex->getPosition().z)); indexData.push_back(iterVertex - vertexData.begin()); - edgeIter = edgeIter->nextHalfEdge; + edgeIter = edgeIter->getNextHalfEdge(); iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); //LogManager::getSingleton().logMessage(" " + StringConverter::toString(iterVertex->getPosition().x) + "," + StringConverter::toString(iterVertex->getPosition().y) + "," + StringConverter::toString(iterVertex->getPosition().z)); indexData.push_back(iterVertex - vertexData.begin()); - edgeIter = edgeIter->nextHalfEdge; + edgeIter = edgeIter->getNextHalfEdge(); iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); //LogManager::getSingleton().logMessage(" " + StringConverter::toString(iterVertex->getPosition().x) + "," + StringConverter::toString(iterVertex->getPosition().y) + "," + StringConverter::toString(iterVertex->getPosition().z)); indexData.push_back(iterVertex - vertexData.begin()); @@ -373,7 +349,7 @@ namespace Ogre result.push_back(nextEdge->getTarget()); previousEdge = nextEdge; - nextEdge = nextEdge->previousHalfEdge->otherHalfEdge; + nextEdge = nextEdge->getPreviousHalfEdge()->getOtherHalfEdge(); }while((nextEdge != firstEdge) && (nextEdge != previousEdge)); if(nextEdge == previousEdge) @@ -387,7 +363,7 @@ namespace Ogre previousEdge = firstEdge; previousEdge = nextEdge; - nextEdge = nextEdge->otherHalfEdge->nextHalfEdge; + nextEdge = nextEdge->getOtherHalfEdge()->getNextHalfEdge(); int ct2 = 0; do @@ -403,7 +379,7 @@ namespace Ogre result.push_front(nextEdge->getTarget()); previousEdge = nextEdge; - nextEdge = nextEdge->otherHalfEdge->nextHalfEdge; + nextEdge = nextEdge->getOtherHalfEdge()->getNextHalfEdge(); }while(nextEdge != previousEdge); } @@ -456,9 +432,9 @@ namespace Ogre { LogManager::getSingleton().logMessage("Error - Failed to find"); }*/ - SurfaceEdgeIterator otherEdgeToDelete = edgeToDelete->otherHalfEdge; + SurfaceEdgeIterator otherEdgeToDelete = edgeToDelete->getOtherHalfEdge(); - if(edgeToDelete->nextHalfEdge != edgeToDelete->otherHalfEdge) + if(edgeToDelete->getNextHalfEdge() != edgeToDelete->getOtherHalfEdge()) { m_listTriangles.erase(edgeToDelete->triangle); }