Work on mesh decimation.

This commit is contained in:
David Williams 2007-09-21 23:24:27 +00:00
parent b84f589bcd
commit bcb530942a
2 changed files with 23 additions and 28 deletions

View File

@ -48,6 +48,7 @@ namespace Ogre
bool canRemoveVertexFrom(SurfaceVertexIterator vertexIter, std::list<SurfaceVertexIterator> listConnectedIter, bool isEdge);
std::list<SurfaceVertexIterator> findConnectedVertices(SurfaceVertexIterator vertexIter, bool& isEdge);
bool decimateOneVertex(void);
void triangulate(std::list<SurfaceVertexIterator> listVertices);
UIntVector3 m_v3dOffset;

View File

@ -448,39 +448,12 @@ namespace Ogre
//Now triangulate...
LogManager::getSingleton().logMessage("Doing triangulation");
std::list<SurfaceVertexIterator>::iterator v0IterIter = listConnectedVertices.begin();
std::list<SurfaceVertexIterator>::iterator v1IterIter = listConnectedVertices.begin();
std::list<SurfaceVertexIterator>::iterator v2IterIter = listConnectedVertices.begin();
++v1IterIter;
++v2IterIter;
++v2IterIter;
while(v2IterIter != listConnectedVertices.end())
{
LogManager::getSingleton().logMessage("Dereferenceing");
SurfaceVertexIterator v0Iter = *v0IterIter;
SurfaceVertexIterator v1Iter = *v1IterIter;
SurfaceVertexIterator v2Iter = *v2IterIter;
LogManager::getSingleton().logMessage("Adding Triangle");
addTriangle(*v0Iter, *v1Iter, *v2Iter);
++v1IterIter;
++v2IterIter;
}
triangulate(listConnectedVertices);
didDecimation = true;
break;
}
for(SurfaceEdgeIterator edgeIter = m_listEdges.begin(); edgeIter != m_listEdges.end(); ++edgeIter)
{
if(edgeIter->isDegenerate())
{
LogManager::getSingleton().logMessage("Error - found degenerate edge");
}
}
//LogManager::getSingleton().logMessage("Fixed = " + StringConverter::toString(fixed) + " Movable = " + StringConverter::toString(movable));
LogManager::getSingleton().logMessage("Done decimation");
LogManager::getSingleton().logMessage("No of triangles at end = " + StringConverter::toString(m_listTriangles.size()));
@ -491,4 +464,25 @@ namespace Ogre
return didDecimation;
}
void SurfacePatch::triangulate(std::list<SurfaceVertexIterator> listVertices)
{
std::list<SurfaceVertexIterator>::iterator v0IterIter = listVertices.begin();
std::list<SurfaceVertexIterator>::iterator v1IterIter = listVertices.begin();
std::list<SurfaceVertexIterator>::iterator v2IterIter = listVertices.begin();
++v1IterIter;
++v2IterIter;
++v2IterIter;
while(v2IterIter != listVertices.end())
{
SurfaceVertexIterator v0Iter = *v0IterIter;
SurfaceVertexIterator v1Iter = *v1IterIter;
SurfaceVertexIterator v2Iter = *v2IterIter;
addTriangle(*v0Iter, *v1Iter, *v2Iter);
++v1IterIter;
++v2IterIter;
}
}
}