From 9bf977b70440e856f60470625e59eb58ad395592 Mon Sep 17 00:00:00 2001 From: David Williams Date: Sun, 2 Sep 2007 12:08:37 +0000 Subject: [PATCH] Work on mesh decimation. --- source/PolyVoxSceneManager.cpp | 6 ++-- source/SurfacePatch.cpp | 58 +++++++++++++++++++++++++--------- source/VolumeSerializer.cpp | 10 +++--- 3 files changed, 51 insertions(+), 23 deletions(-) diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index cbef386c..b6dce681 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -323,10 +323,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 = 0; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionY) + for(uint regionY = OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++regionY) { //LogManager::getSingleton().logMessage("regionY = " + StringConverter::toString(regionY)); - for(uint regionX = 0; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionX) + for(uint regionX = OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++regionX) { //LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX)); if(surfaceUpToDate[regionX][regionY][regionZ] == false) @@ -1008,7 +1008,7 @@ namespace Ogre iterPatch->second.m_v3dOffset = offset; iterPatch->second.computeNormalsFromVolume(volIter); iterPatch->second.endDefinition(); - //iterPatch->second.decimate(); + iterPatch->second.decimate(); } //LogManager::getSingleton().logMessage("Finished Generating Mesh Data"); diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp index 3bdbac67..9fd191be 100644 --- a/source/SurfacePatch.cpp +++ b/source/SurfacePatch.cpp @@ -172,47 +172,75 @@ namespace Ogre void SurfacePatch::decimate(void) { + LogManager::getSingleton().logMessage("Vertices before decimation = " + StringConverter::toString(m_setVertices.size())); + LogManager::getSingleton().logMessage("Triangles before decimation = " + StringConverter::toString(m_setTriangles.size())); + //Build the lists of connected vertices for(SurfaceVertexIterator vertexIter = m_setVertices.begin(); vertexIter != m_setVertices.end(); ++vertexIter) { + vertexIter->listConnectedVertices.clear(); + for(std::list::iterator triangleIter = vertexIter->listTrianglesUsingThisVertex.begin(); triangleIter != vertexIter->listTrianglesUsingThisVertex.end(); ++triangleIter) { - if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),(*triangleIter)->v0) == vertexIter->listConnectedVertices.end()) - vertexIter->listConnectedVertices.push_back((*triangleIter)->v0); - if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),(*triangleIter)->v1) == vertexIter->listConnectedVertices.end()) - vertexIter->listConnectedVertices.push_back((*triangleIter)->v1); - if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),(*triangleIter)->v2) == vertexIter->listConnectedVertices.end()) - vertexIter->listConnectedVertices.push_back((*triangleIter)->v2); + SurfaceVertexIterator connectedVertex; + + connectedVertex = (*triangleIter)->v0; + if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),connectedVertex) == vertexIter->listConnectedVertices.end()) + vertexIter->listConnectedVertices.push_back(connectedVertex); + + connectedVertex = (*triangleIter)->v1; + if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),connectedVertex) == vertexIter->listConnectedVertices.end()) + vertexIter->listConnectedVertices.push_back(connectedVertex); + + connectedVertex = (*triangleIter)->v2; + if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),connectedVertex) == vertexIter->listConnectedVertices.end()) + vertexIter->listConnectedVertices.push_back(connectedVertex); } + + //Remove self from own connected vertex list + vertexIter->listConnectedVertices.remove(vertexIter); } //do the vertex merging for(SurfaceVertexIterator vertexIter = m_setVertices.begin(); vertexIter != m_setVertices.end(); ++vertexIter) { - if(vertexIter->alpha < 0.9) + //LogManager::getSingleton().logMessage("Vertex Pos = " + StringConverter::toString(vertexIter->position.x) + "," + StringConverter::toString(vertexIter->position.y) + "," + StringConverter::toString(vertexIter->position.z) + " No of connected vertices = " + StringConverter::toString(vertexIter->listConnectedVertices.size())); + /*if(vertexIter->alpha < 0.9) + continue;*/ + if(vertexIter->listConnectedVertices.size() != 6) + { + //LogManager::getSingleton().logMessage("Skipping edge/corner vertex"); continue; + } if(true/*verticesArePlanar(vertexIter)*/) { //Find a vertex to merge with - SurfaceVertexIterator vertexToMergeWith = (*(vertexIter->listTrianglesUsingThisVertex.begin()))->v0; - if(vertexIter == vertexToMergeWith) - { - vertexToMergeWith = (*(vertexIter->listTrianglesUsingThisVertex.begin()))->v1; - } + std::list::iterator vertexToMergeWith = vertexIter->listConnectedVertices.begin(); //Change triangles to use new vertex for(SurfaceTriangleIterator iterTriangles = m_setTriangles.begin(); iterTriangles != m_setTriangles.end(); ++iterTriangles) { if(iterTriangles->v0 == vertexIter) - iterTriangles->v0 = vertexToMergeWith; + iterTriangles->v0 = *vertexToMergeWith; if(iterTriangles->v1 == vertexIter) - iterTriangles->v1 = vertexToMergeWith; + iterTriangles->v1 = *vertexToMergeWith; if(iterTriangles->v2 == vertexIter) - iterTriangles->v2 = vertexToMergeWith; + iterTriangles->v2 = *vertexToMergeWith; } //Change connected vertices to use new vertex + for(std::list::iterator connectedVertex = vertexIter->listConnectedVertices.begin(); connectedVertex != vertexIter->listConnectedVertices.end(); ++connectedVertex) + { + for(std::list::iterator secondLevelConnected = (*connectedVertex)->listConnectedVertices.begin(); secondLevelConnected != (*connectedVertex)->listConnectedVertices.end(); ++secondLevelConnected) + { + if((*secondLevelConnected) == vertexIter) + (*secondLevelConnected) = *vertexToMergeWith; + } + } + + //Now remove the vertex as nothing should point to it. + //m_setVertices.erase(vertexIter); } } } diff --git a/source/VolumeSerializer.cpp b/source/VolumeSerializer.cpp index 0a2d82a5..893f13dc 100644 --- a/source/VolumeSerializer.cpp +++ b/source/VolumeSerializer.cpp @@ -59,15 +59,15 @@ namespace Ogre LogManager::getSingleton().logMessage("Value is " + StringConverter::toString(int(value))); }*/ volIter.setVoxelAt(x,y,z,value); - /*if(z < 24) + if(z < 24) { - if(x % 32 < 16) + //if(x % 32 < 16) volIter.setVoxelAt(x,y,z,4); - else - volIter.setVoxelAt(x,y,z,5); + /*else + volIter.setVoxelAt(x,y,z,5);*/ } else - volIter.setVoxelAt(x,y,z,0);*/ + volIter.setVoxelAt(x,y,z,0); } }