diff --git a/include/SurfacePatch.h b/include/SurfacePatch.h index 5ff1ad52..40dcd795 100644 --- a/include/SurfacePatch.h +++ b/include/SurfacePatch.h @@ -47,14 +47,14 @@ namespace Ogre bool canRemoveVertexFrom(SurfaceVertexIterator vertexIter, std::list listConnectedIter, bool isEdge); std::list findConnectedVertices(SurfaceVertexIterator vertexIter, bool& isEdge); - bool decimateOneVertex(void); + uint decimate(void); void triangulate(std::list listVertices); bool isPolygonConvex(std::list listVertices, Vector3 normal); UIntVector3 m_v3dOffset; - private: + public: std::set m_listVertices; std::set m_listTriangles; std::set m_listEdges; diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index c6918b0b..a1b31ea7 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -320,14 +320,15 @@ namespace Ogre }*/ } + unsigned long triangleCounter = 0; //Regenerate meshes. 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-1; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++regionY) + for(uint regionY = 0; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionY) { //LogManager::getSingleton().logMessage("regionY = " + StringConverter::toString(regionY)); - for(uint regionX = OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2-1; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++regionX) + for(uint regionX = 0; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionX) { //LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX)); if(surfaceUpToDate[regionX][regionY][regionZ] == false) @@ -358,6 +359,7 @@ namespace Ogre std::vector vertexData; std::vector indexData; iterSurfacePatch->second.getVertexAndIndexData(vertexData, indexData); + triangleCounter += iterSurfacePatch->second.m_listTriangles.size(); std::map::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(iterSurfacePatch->first); if(iterSurface == m_mapSurfaces[regionX][regionY][regionZ].end()) @@ -385,6 +387,7 @@ namespace Ogre } } } + LogManager::getSingleton().logMessage("No of tris = " + StringConverter::toString(triangleCounter)); } //showBoundingBoxes(true); //Now call the base class to do the actual visibility determination... @@ -1009,13 +1012,13 @@ namespace Ogre iterPatch->second.m_v3dOffset = offset; iterPatch->second.computeNormalsFromVolume(volIter); iterPatch->second.endDefinition(); - bool removedVertex = false; + uint noOfRemovedVertices = 0; //for(uint ct = 0; ct < 5; ct++) do { - removedVertex = iterPatch->second.decimateOneVertex(); + noOfRemovedVertices = iterPatch->second.decimate(); } - while(removedVertex); + while(noOfRemovedVertices > 0); } //LogManager::getSingleton().logMessage("Finished Generating Mesh Data"); diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp index f007af9d..e816626a 100644 --- a/source/SurfacePatch.cpp +++ b/source/SurfacePatch.cpp @@ -388,17 +388,29 @@ namespace Ogre return result; } - bool SurfacePatch::decimateOneVertex(void) + uint SurfacePatch::decimate(void) { - bool didDecimation = false; + uint uNoRemoved = 0; //LogManager::getSingleton().logMessage("\n\nPerforming decimation"); //LogManager::getSingleton().logMessage("No of triangles at start = " + StringConverter::toString(m_listTriangles.size())); //LogManager::getSingleton().logMessage("No of edges at start = " + StringConverter::toString(m_listEdges.size())); //int fixed = 0; //int movable = 0; + + std::vector listVertexIterators; + //listVertexIterators.resize(m_listVertices.size()); for(SurfaceVertexIterator vertexIter = m_listVertices.begin(); vertexIter != m_listVertices.end(); ++vertexIter) { - //LogManager::getSingleton().logMessage("Examining vertex " + vertexIter->toString()); + listVertexIterators.push_back(vertexIter); + } + //random_shuffle(listVertexIterators.begin(),listVertexIterators.end()); + + for(std::vector::iterator vertexIterIter = listVertexIterators.begin(); vertexIterIter != listVertexIterators.end(); ++vertexIterIter) + //for(SurfaceVertexIterator vertexIter = m_listVertices.begin(); vertexIter != m_listVertices.end(); ++vertexIter) + { + //LogManager::getSingleton().logMessage("Examining vertex " + vertexIter->toString()); + + SurfaceVertexIterator vertexIter = *vertexIterIter; bool isEdge; std::list listConnectedVertices = findConnectedVertices(vertexIter,isEdge); @@ -460,8 +472,8 @@ namespace Ogre //LogManager::getSingleton().logMessage("Doing triangulation"); triangulate(listConnectedVertices); - didDecimation = true; - break; + ++uNoRemoved; + //break; } //LogManager::getSingleton().logMessage("Fixed = " + StringConverter::toString(fixed) + " Movable = " + StringConverter::toString(movable)); @@ -472,7 +484,7 @@ namespace Ogre std::vector indexDataTemp; getVertexAndIndexData(vertexDataTemp, indexDataTemp);*/ - return didDecimation; + return uNoRemoved; } void SurfacePatch::triangulate(std::list listVertices)