Cleaning up decimation.

This commit is contained in:
David Williams 2007-09-26 23:35:44 +00:00
parent e129b0a12c
commit 4d7c83bbaf
3 changed files with 28 additions and 13 deletions

View File

@ -47,14 +47,14 @@ namespace Ogre
bool canRemoveVertexFrom(SurfaceVertexIterator vertexIter, std::list<SurfaceVertexIterator> listConnectedIter, bool isEdge); bool canRemoveVertexFrom(SurfaceVertexIterator vertexIter, std::list<SurfaceVertexIterator> listConnectedIter, bool isEdge);
std::list<SurfaceVertexIterator> findConnectedVertices(SurfaceVertexIterator vertexIter, bool& isEdge); std::list<SurfaceVertexIterator> findConnectedVertices(SurfaceVertexIterator vertexIter, bool& isEdge);
bool decimateOneVertex(void); uint decimate(void);
void triangulate(std::list<SurfaceVertexIterator> listVertices); void triangulate(std::list<SurfaceVertexIterator> listVertices);
bool isPolygonConvex(std::list<SurfaceVertexIterator> listVertices, Vector3 normal); bool isPolygonConvex(std::list<SurfaceVertexIterator> listVertices, Vector3 normal);
UIntVector3 m_v3dOffset; UIntVector3 m_v3dOffset;
private: public:
std::set<SurfaceVertex> m_listVertices; std::set<SurfaceVertex> m_listVertices;
std::set<SurfaceTriangle> m_listTriangles; std::set<SurfaceTriangle> m_listTriangles;
std::set<SurfaceEdge> m_listEdges; std::set<SurfaceEdge> m_listEdges;

View File

@ -320,14 +320,15 @@ namespace Ogre
}*/ }*/
} }
unsigned long triangleCounter = 0;
//Regenerate meshes. //Regenerate meshes.
for(uint regionZ = 0; regionZ < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionZ) for(uint regionZ = 0; regionZ < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionZ)
{ {
LogManager::getSingleton().logMessage("regionZ = " + StringConverter::toString(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)); //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)); //LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX));
if(surfaceUpToDate[regionX][regionY][regionZ] == false) if(surfaceUpToDate[regionX][regionY][regionZ] == false)
@ -358,6 +359,7 @@ namespace Ogre
std::vector<SurfaceVertex> vertexData; std::vector<SurfaceVertex> vertexData;
std::vector<uint> indexData; std::vector<uint> indexData;
iterSurfacePatch->second.getVertexAndIndexData(vertexData, indexData); iterSurfacePatch->second.getVertexAndIndexData(vertexData, indexData);
triangleCounter += iterSurfacePatch->second.m_listTriangles.size();
std::map<uchar,SurfacePatchRenderable*>::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(iterSurfacePatch->first); std::map<uchar,SurfacePatchRenderable*>::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(iterSurfacePatch->first);
if(iterSurface == m_mapSurfaces[regionX][regionY][regionZ].end()) 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); //showBoundingBoxes(true);
//Now call the base class to do the actual visibility determination... //Now call the base class to do the actual visibility determination...
@ -1009,13 +1012,13 @@ namespace Ogre
iterPatch->second.m_v3dOffset = offset; iterPatch->second.m_v3dOffset = offset;
iterPatch->second.computeNormalsFromVolume(volIter); iterPatch->second.computeNormalsFromVolume(volIter);
iterPatch->second.endDefinition(); iterPatch->second.endDefinition();
bool removedVertex = false; uint noOfRemovedVertices = 0;
//for(uint ct = 0; ct < 5; ct++) //for(uint ct = 0; ct < 5; ct++)
do do
{ {
removedVertex = iterPatch->second.decimateOneVertex(); noOfRemovedVertices = iterPatch->second.decimate();
} }
while(removedVertex); while(noOfRemovedVertices > 0);
} }
//LogManager::getSingleton().logMessage("Finished Generating Mesh Data"); //LogManager::getSingleton().logMessage("Finished Generating Mesh Data");

View File

@ -388,17 +388,29 @@ namespace Ogre
return result; 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("\n\nPerforming decimation");
//LogManager::getSingleton().logMessage("No of triangles at start = " + StringConverter::toString(m_listTriangles.size())); //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())); //LogManager::getSingleton().logMessage("No of edges at start = " + StringConverter::toString(m_listEdges.size()));
//int fixed = 0; //int fixed = 0;
//int movable = 0; //int movable = 0;
std::vector<SurfaceVertexIterator> listVertexIterators;
//listVertexIterators.resize(m_listVertices.size());
for(SurfaceVertexIterator vertexIter = m_listVertices.begin(); vertexIter != m_listVertices.end(); ++vertexIter) 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<SurfaceVertexIterator>::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; bool isEdge;
std::list<SurfaceVertexIterator> listConnectedVertices = findConnectedVertices(vertexIter,isEdge); std::list<SurfaceVertexIterator> listConnectedVertices = findConnectedVertices(vertexIter,isEdge);
@ -460,8 +472,8 @@ namespace Ogre
//LogManager::getSingleton().logMessage("Doing triangulation"); //LogManager::getSingleton().logMessage("Doing triangulation");
triangulate(listConnectedVertices); triangulate(listConnectedVertices);
didDecimation = true; ++uNoRemoved;
break; //break;
} }
//LogManager::getSingleton().logMessage("Fixed = " + StringConverter::toString(fixed) + " Movable = " + StringConverter::toString(movable)); //LogManager::getSingleton().logMessage("Fixed = " + StringConverter::toString(fixed) + " Movable = " + StringConverter::toString(movable));
@ -472,7 +484,7 @@ namespace Ogre
std::vector<uint> indexDataTemp; std::vector<uint> indexDataTemp;
getVertexAndIndexData(vertexDataTemp, indexDataTemp);*/ getVertexAndIndexData(vertexDataTemp, indexDataTemp);*/
return didDecimation; return uNoRemoved;
} }
void SurfacePatch::triangulate(std::list<SurfaceVertexIterator> listVertices) void SurfacePatch::triangulate(std::list<SurfaceVertexIterator> listVertices)