Work on mesh decimation.

This commit is contained in:
David Williams 2007-09-20 19:38:31 +00:00
parent a5732d3221
commit 778ac2be9c
3 changed files with 32 additions and 32 deletions

View File

@ -35,6 +35,8 @@ namespace Ogre
{ {
public: public:
int crud;
SurfaceVertexIterator target; SurfaceVertexIterator target;
SurfaceTriangleIterator triangle; SurfaceTriangleIterator triangle;
@ -46,9 +48,6 @@ namespace Ogre
SurfaceEdgeIterator otherHalfEdge; SurfaceEdgeIterator otherHalfEdge;
//FIXME - could use boost::optional for this? //FIXME - could use boost::optional for this?
bool hasTriangle;
SurfaceEdge();
std::string toString(void); std::string toString(void);
}; };

View File

@ -4,11 +4,6 @@
namespace Ogre namespace Ogre
{ {
SurfaceEdge::SurfaceEdge()
:hasTriangle(false)
{
}
std::string SurfaceEdge::toString(void) std::string SurfaceEdge::toString(void)
{ {
std::stringstream ss; std::stringstream ss;

View File

@ -117,9 +117,9 @@ namespace Ogre
v1v2Iter->triangle = iterTriangle; v1v2Iter->triangle = iterTriangle;
v2v0Iter->triangle = iterTriangle; v2v0Iter->triangle = iterTriangle;
v0v1Iter->hasTriangle = true; /*v0v1Iter->hasTriangle = true;
v1v2Iter->hasTriangle = true; v1v2Iter->hasTriangle = true;
v2v0Iter->hasTriangle = true; v2v0Iter->hasTriangle = true;*/
} }
SurfaceVertexIterator SurfacePatch::findVertex(const SurfaceVertex& vertex) SurfaceVertexIterator SurfacePatch::findVertex(const SurfaceVertex& vertex)
@ -167,8 +167,8 @@ namespace Ogre
otherEdgeIter->nextHalfEdge = edgeIter; otherEdgeIter->nextHalfEdge = edgeIter;
otherEdgeIter->previousHalfEdge = edgeIter; otherEdgeIter->previousHalfEdge = edgeIter;
edgeIter->hasTriangle = false; /*edgeIter->hasTriangle = false;
otherEdgeIter->hasTriangle = false; otherEdgeIter->hasTriangle = false;*/
return edgeIter; return edgeIter;
} }
@ -365,7 +365,7 @@ namespace Ogre
//int movable = 0; //int movable = 0;
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"); LogManager::getSingleton().logMessage("Examining vertex " + vertexIter->toString());
std::list<SurfaceVertexIterator> listConnectedVertices; std::list<SurfaceVertexIterator> listConnectedVertices;
//listConnectedVertices.push_back(vertexIter); //listConnectedVertices.push_back(vertexIter);
@ -379,7 +379,7 @@ namespace Ogre
do do
{ {
ct++; ct++;
LogManager::getSingleton().logMessage("ct = " + StringConverter::toString(ct)); //LogManager::getSingleton().logMessage("ct = " + StringConverter::toString(ct));
if(ct > 100) if(ct > 100)
{ {
LogManager::getSingleton().logMessage("ct too big!!! Aborting decimation"); LogManager::getSingleton().logMessage("ct too big!!! Aborting decimation");
@ -422,34 +422,40 @@ namespace Ogre
LogManager::getSingleton().logMessage(" All flat"); LogManager::getSingleton().logMessage(" All flat");
nextEdge = firstEdge; nextEdge = firstEdge;
//std::list<SurfaceVertexIterator> verticesFormingPolygon;
do
{
//verticesFormingPolygon.push_back(nextEdge->target);
LogManager::getSingleton().logMessage("Removing triangle");
m_listTriangles.erase(nextEdge->triangle);
nextEdge = nextEdge->previousHalfEdge->otherHalfEdge;
}while(nextEdge != firstEdge);
//nextEdge = firstEdge;
std::list<SurfaceEdgeIterator> edgesToRemove; std::list<SurfaceEdgeIterator> edgesToRemove;
std::list<SurfaceEdgeIterator> edgesFormingPolygon; std::list<SurfaceEdgeIterator> edgesFormingPolygon;
do do
{ {
LogManager::getSingleton().logMessage("Adding Edges To Remove"); LogManager::getSingleton().logMessage("Removing triangle");
m_listTriangles.erase(nextEdge->triangle);
edgesToRemove.push_back(nextEdge); edgesToRemove.push_back(nextEdge);
nextEdge = nextEdge->nextHalfEdge; edgesFormingPolygon.push_back(nextEdge->nextHalfEdge);
edgesFormingPolygon.push_back(nextEdge); nextEdge = nextEdge->previousHalfEdge;
nextEdge = nextEdge->nextHalfEdge;
edgesToRemove.push_back(nextEdge); edgesToRemove.push_back(nextEdge);
nextEdge = nextEdge->otherHalfEdge; nextEdge = nextEdge->otherHalfEdge;
}while(nextEdge != firstEdge); }while(nextEdge != firstEdge);
//nextEdge = firstEdge;
//std::list<SurfaceEdgeIterator> edgesFormingPolygon;
/*do
{
LogManager::getSingleton().logMessage("Adding Edges To Remove");
edgesToRemove.push_back(nextEdge);
nextEdge = nextEdge->nextHalfEdge;
//edgesFormingPolygon.push_back(nextEdge);
nextEdge = nextEdge->nextHalfEdge;
edgesToRemove.push_back(nextEdge);
nextEdge = nextEdge->otherHalfEdge;
}while(nextEdge != firstEdge);*/
for(std::list<SurfaceEdgeIterator>::iterator edgesToRemoveIter = edgesToRemove.begin(); edgesToRemoveIter != edgesToRemove.end(); ++edgesToRemoveIter) for(std::list<SurfaceEdgeIterator>::iterator edgesToRemoveIter = edgesToRemove.begin(); edgesToRemoveIter != edgesToRemove.end(); ++edgesToRemoveIter)
{ {
m_listEdges.erase(*edgesToRemoveIter); m_listEdges.erase(*edgesToRemoveIter);
} }
LogManager::getSingleton().logMessage("Removing vertex " + vertexIter->toString());
m_listVertices.erase(vertexIter); m_listVertices.erase(vertexIter);
//Now triangulate... //Now triangulate...
@ -500,9 +506,9 @@ namespace Ogre
(*secondEdgeIter)->triangle = iterTriangle; (*secondEdgeIter)->triangle = iterTriangle;
newEdgeIter->triangle = iterTriangle; newEdgeIter->triangle = iterTriangle;
lastAddedEdge->hasTriangle = true; /*lastAddedEdge->hasTriangle = true;
(*secondEdgeIter)->hasTriangle = true; (*secondEdgeIter)->hasTriangle = true;
newEdgeIter->hasTriangle = true; newEdgeIter->hasTriangle = true;*/
//++firstEdgeIter; //++firstEdgeIter;
++secondEdgeIter; ++secondEdgeIter;
@ -528,9 +534,9 @@ namespace Ogre
(*secondEdgeIter)->triangle = iterTriangle; (*secondEdgeIter)->triangle = iterTriangle;
(*endEdgeIter)->triangle = iterTriangle; (*endEdgeIter)->triangle = iterTriangle;
lastAddedEdge->hasTriangle = true; /*lastAddedEdge->hasTriangle = true;
(*secondEdgeIter)->hasTriangle = true; (*secondEdgeIter)->hasTriangle = true;
(*endEdgeIter)->hasTriangle = true; (*endEdgeIter)->hasTriangle = true;*/
didDecimation = true; didDecimation = true;
break; break;