Cleaning up decimation.
This commit is contained in:
parent
e129b0a12c
commit
4d7c83bbaf
@ -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;
|
||||||
|
@ -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");
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user