Cleaning up decimation.

This commit is contained in:
David Williams 2007-09-27 23:17:27 +00:00
parent f82aaad082
commit 780f52dd9e
4 changed files with 29 additions and 14 deletions

View File

@ -39,13 +39,6 @@ namespace Ogre
friend bool operator == (const SurfaceEdge& lhs, const SurfaceEdge& rhs); friend bool operator == (const SurfaceEdge& lhs, const SurfaceEdge& rhs);
friend bool operator < (const SurfaceEdge& lhs, const SurfaceEdge& rhs); friend bool operator < (const SurfaceEdge& lhs, const SurfaceEdge& rhs);
//int crud;
SurfaceTriangleIterator triangle;
//FIXME - could use boost::optional for this?
std::string toString(void); std::string toString(void);
@ -56,9 +49,11 @@ namespace Ogre
const SurfaceEdgeIterator& getOtherHalfEdge(void); const SurfaceEdgeIterator& getOtherHalfEdge(void);
const SurfaceEdgeIterator& getPreviousHalfEdge(void); const SurfaceEdgeIterator& getPreviousHalfEdge(void);
const SurfaceEdgeIterator& getNextHalfEdge(void); const SurfaceEdgeIterator& getNextHalfEdge(void);
const SurfaceTriangleIterator& getTriangle(void);
void setPreviousHalfEdge(const SurfaceEdgeIterator& previousHalfEdgeToSet); void setPreviousHalfEdge(const SurfaceEdgeIterator& previousHalfEdgeToSet);
void setNextHalfEdge(const SurfaceEdgeIterator& nextHalfEdgeToSet); void setNextHalfEdge(const SurfaceEdgeIterator& nextHalfEdgeToSet);
void setTriangle(const SurfaceTriangleIterator& triangleToSet);
void pairWithOtherHalfEdge(const SurfaceEdgeIterator& otherHalfEdgeToPair); void pairWithOtherHalfEdge(const SurfaceEdgeIterator& otherHalfEdgeToPair);
@ -69,6 +64,8 @@ namespace Ogre
SurfaceEdgeIterator previousHalfEdge; SurfaceEdgeIterator previousHalfEdge;
SurfaceEdgeIterator nextHalfEdge; SurfaceEdgeIterator nextHalfEdge;
SurfaceEdgeIterator otherHalfEdge; SurfaceEdgeIterator otherHalfEdge;
SurfaceTriangleIterator triangle;
}; };
} }

View File

@ -19,10 +19,12 @@ namespace Ogre
bool operator == (const SurfaceEdge& lhs, const SurfaceEdge& rhs) bool operator == (const SurfaceEdge& lhs, const SurfaceEdge& rhs)
{ {
//Vertices are unique in the set, so if the two positions are the same the
//two iterators must also be the same. So we just check the iterators.
return return
( (
((*lhs.target) == (*rhs.target)) && (lhs.target == rhs.target) &&
((*lhs.source) == (*rhs.source)) (lhs.source == rhs.source)
); );
} }
@ -33,6 +35,8 @@ namespace Ogre
bool operator < (const SurfaceEdge& lhs, const SurfaceEdge& rhs) bool operator < (const SurfaceEdge& lhs, const SurfaceEdge& rhs)
{ {
//Unlike the equality operator, we can't compare iterators.
//So dereference and compare the results.
if ((*lhs.target) < (*rhs.target)) if ((*lhs.target) < (*rhs.target))
return true; return true;
if ((*rhs.target) < (*lhs.target)) if ((*rhs.target) < (*lhs.target))
@ -78,6 +82,11 @@ namespace Ogre
return nextHalfEdge; return nextHalfEdge;
} }
const SurfaceTriangleIterator& SurfaceEdge::getTriangle(void)
{
return triangle;
}
void SurfaceEdge::setPreviousHalfEdge(const SurfaceEdgeIterator& previousHalfEdgeToSet) void SurfaceEdge::setPreviousHalfEdge(const SurfaceEdgeIterator& previousHalfEdgeToSet)
{ {
previousHalfEdge = previousHalfEdgeToSet; previousHalfEdge = previousHalfEdgeToSet;
@ -87,4 +96,9 @@ namespace Ogre
{ {
nextHalfEdge = nextHalfEdgeToSet; nextHalfEdge = nextHalfEdgeToSet;
} }
void SurfaceEdge::setTriangle(const SurfaceTriangleIterator& triangleToSet)
{
triangle = triangleToSet;
}
} }

View File

@ -95,9 +95,9 @@ namespace Ogre
SurfaceTriangleIterator iterTriangle = m_listTriangles.insert(triangle).first; SurfaceTriangleIterator iterTriangle = m_listTriangles.insert(triangle).first;
v0v1Iter->triangle = iterTriangle; v0v1Iter->setTriangle(iterTriangle);
v1v2Iter->triangle = iterTriangle; v1v2Iter->setTriangle(iterTriangle);
v2v0Iter->triangle = iterTriangle; v2v0Iter->setTriangle(iterTriangle);
} }
SurfaceVertexIterator SurfacePatch::findOrAddVertex(const SurfaceVertex& vertex) SurfaceVertexIterator SurfacePatch::findOrAddVertex(const SurfaceVertex& vertex)
@ -447,7 +447,7 @@ namespace Ogre
if(edgeToDelete->getNextHalfEdge() != edgeToDelete->getOtherHalfEdge()) if(edgeToDelete->getNextHalfEdge() != edgeToDelete->getOtherHalfEdge())
{ {
m_listTriangles.erase(edgeToDelete->triangle); m_listTriangles.erase(edgeToDelete->getTriangle());
} }
//LogManager::getSingleton().logMessage("Removing edge " + edgeToDelete->toString()); //LogManager::getSingleton().logMessage("Removing edge " + edgeToDelete->toString());

View File

@ -45,11 +45,15 @@ namespace Ogre
bool operator == (const SurfaceTriangle& lhs, const SurfaceTriangle& rhs) bool operator == (const SurfaceTriangle& lhs, const SurfaceTriangle& rhs)
{ {
return (*lhs.edge == *rhs.edge); //Edges are unique in the set, so if the two positions are the same the
//two iterators must also be the same. So we just check the iterators.
return (lhs.edge == rhs.edge);
} }
bool operator < (const SurfaceTriangle& lhs, const SurfaceTriangle& rhs) bool operator < (const SurfaceTriangle& lhs, const SurfaceTriangle& rhs)
{ {
//Unlike the equality operator, we can't compare iterators.
//So dereference and compare the results.
return (*lhs.edge < *rhs.edge); return (*lhs.edge < *rhs.edge);
} }
} }