Work on mesh decimation.

This commit is contained in:
David Williams 2007-09-20 12:18:46 +00:00
parent 152a79eaa9
commit 9163cfda52
2 changed files with 74 additions and 72 deletions

View File

@ -35,6 +35,9 @@ namespace Ogre
void endDefinition(void); void endDefinition(void);
void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2); void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2);
SurfaceVertexIterator findVertex(const SurfaceVertex& vertex);
SurfaceEdgeIterator findEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target);
//SurfaceVertexIterator findTriangle(const SurfaceTriangle& triangle);
void getVertexAndIndexData(std::vector<SurfaceVertex>& vertexData, std::vector<uint>& indexData); void getVertexAndIndexData(std::vector<SurfaceVertex>& vertexData, std::vector<uint>& indexData);
@ -57,6 +60,8 @@ namespace Ogre
bool decimate3(void); bool decimate3(void);
//bool verticesArePlanar(SurfaceVertexIterator iterCurrentVertex); //bool verticesArePlanar(SurfaceVertexIterator iterCurrentVertex);
UIntVector3 m_v3dOffset; UIntVector3 m_v3dOffset;

View File

@ -41,96 +41,38 @@ namespace Ogre
//LogManager::getSingleton().logMessage("No of vertices added = " + StringConverter::toString(m_uVerticesAdded)); //LogManager::getSingleton().logMessage("No of vertices added = " + StringConverter::toString(m_uVerticesAdded));
//LogManager::getSingleton().logMessage("No of vertices present = " + StringConverter::toString(m_setVertices.size())); //LogManager::getSingleton().logMessage("No of vertices present = " + StringConverter::toString(m_setVertices.size()));
computeOtherHalfEdges(); //computeOtherHalfEdges();
} }
void SurfacePatch::addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2) void SurfacePatch::addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2)
{ {
if(v0.position.x > 16) if(v0.position.x > 8)
return; return;
if(v0.position.y > 16) if(v0.position.y > 8)
return; return;
if(v1.position.x > 16) if(v1.position.x > 8)
return; return;
if(v1.position.y > 16) if(v1.position.y > 8)
return; return;
if(v2.position.x > 16) if(v2.position.x > 8)
return; return;
if(v2.position.y > 16) if(v2.position.y > 8)
return; return;
//if(m_uTrianglesAdded > 1) return; //if(m_uTrianglesAdded > 1) return;
//LogManager::getSingleton().logMessage("Adding Triangle " + StringConverter::toString(m_uTrianglesAdded)); //LogManager::getSingleton().logMessage("Adding Triangle " + StringConverter::toString(m_uTrianglesAdded));
m_uTrianglesAdded++; m_uTrianglesAdded++;
m_uVerticesAdded += 3; m_uVerticesAdded += 3;
SurfaceVertexIterator v0Iter = findVertex(v0);
SurfaceVertexIterator v1Iter = findVertex(v1);
SurfaceVertexIterator v2Iter = findVertex(v2);
SurfaceVertexIterator v0Iter = find(m_listVertices.begin(), m_listVertices.end(), v0);
if(v0Iter == m_listVertices.end())
{
//LogManager::getSingleton().logMessage("Adding Vertex " + StringConverter::toString(v0.position.x) + "," + StringConverter::toString(v0.position.y) + "," + StringConverter::toString(v0.position.z));
m_listVertices.push_back(v0);
v0Iter = m_listVertices.end();
v0Iter--;
}
//else
//LogManager::getSingleton().logMessage("Already Exists " + StringConverter::toString(v0.position.x) + "," + StringConverter::toString(v0.position.y) + "," + StringConverter::toString(v0.position.z));
SurfaceVertexIterator v1Iter = find(m_listVertices.begin(), m_listVertices.end(), v1);
if(v1Iter == m_listVertices.end())
{
//LogManager::getSingleton().logMessage("Adding Vertex " + StringConverter::toString(v1.position.x) + "," + StringConverter::toString(v1.position.y) + "," + StringConverter::toString(v1.position.z));
m_listVertices.push_back(v1);
v1Iter = m_listVertices.end();
v1Iter--;
}
//else
//LogManager::getSingleton().logMessage("Already Exists " + StringConverter::toString(v1.position.x) + "," + StringConverter::toString(v1.position.y) + "," + StringConverter::toString(v1.position.z));
SurfaceVertexIterator v2Iter = find(m_listVertices.begin(), m_listVertices.end(), v2);
if(v2Iter == m_listVertices.end())
{
//LogManager::getSingleton().logMessage("Adding Vertex " + StringConverter::toString(v2.position.x) + "," + StringConverter::toString(v2.position.y) + "," + StringConverter::toString(v2.position.z));
m_listVertices.push_back(v2);
v2Iter = m_listVertices.end();
v2Iter--;
}
//else
//LogManager::getSingleton().logMessage("Already Exists " + StringConverter::toString(v2.position.x) + "," + StringConverter::toString(v2.position.y) + "," + StringConverter::toString(v2.position.z));
/*SurfaceEdgeIterator v0v1Iter = m_listEdges.end();
SurfaceEdgeIterator v1v2Iter = m_listEdges.end();
SurfaceEdgeIterator v2v0Iter = m_listEdges.end();
SurfaceEdgeIterator v1v0Iter = m_listEdges.end();
SurfaceEdgeIterator v2v1Iter = m_listEdges.end();
SurfaceEdgeIterator v0v2Iter = m_listEdges.end();
for(SurfaceEdgeIterator edgeIter = m_listEdges.begin(); edgeIter != m_listEdges.end(); ++edgeIter)
{
if((edgeIter->otherHalfEdge->target == v0) && (edgeIter->target == v1))
v0v1Iter = edgeIter;
if((edgeIter->otherHalfEdge->target == v1) && (edgeIter->target == v2))
v1v2Iter = edgeIter;
if((edgeIter->otherHalfEdge->target == v2) && (edgeIter->target == v0))
v2v0Iter = edgeIter;
if((edgeIter->otherHalfEdge->target == v1) && (edgeIter->target == v0))
v1v0Iter = edgeIter;
if((edgeIter->otherHalfEdge->target == v2) && (edgeIter->target == v1))
v2v1Iter = edgeIter;
if((edgeIter->otherHalfEdge->target == v0) && (edgeIter->target == v2))
v0v2Iter = edgeIter;
}
if(v0v1Iter == m_listEdges.end())
{
SurfaceEdge v0v1;
m_listEdges.push_back(v0v1);
SurfaceEdgeIterator v0v1ToAdd;
}*/
//LogManager::getSingleton().logMessage("Creating Edges"); //LogManager::getSingleton().logMessage("Creating Edges");
SurfaceEdge v0v1; /*SurfaceEdge v0v1;
v0v1.target = v1Iter; v0v1.target = v1Iter;
SurfaceEdge v1v2; SurfaceEdge v1v2;
v1v2.target = v2Iter; v1v2.target = v2Iter;
@ -145,7 +87,11 @@ namespace Ogre
v1v2Iter--; v1v2Iter--;
m_listEdges.push_back(v2v0); m_listEdges.push_back(v2v0);
SurfaceEdgeIterator v2v0Iter = m_listEdges.end(); SurfaceEdgeIterator v2v0Iter = m_listEdges.end();
v2v0Iter--; v2v0Iter--;*/
SurfaceEdgeIterator v0v1Iter = findEdge(v0Iter,v1Iter);
SurfaceEdgeIterator v1v2Iter = findEdge(v1Iter,v2Iter);
SurfaceEdgeIterator v2v0Iter = findEdge(v2Iter,v0Iter);
v0Iter->edge = v0v1Iter; v0Iter->edge = v0v1Iter;
v1Iter->edge = v1v2Iter; v1Iter->edge = v1v2Iter;
@ -176,6 +122,57 @@ namespace Ogre
v2v0Iter->hasTriangle = true; v2v0Iter->hasTriangle = true;
} }
SurfaceVertexIterator SurfacePatch::findVertex(const SurfaceVertex& vertex)
{
SurfaceVertexIterator vertexIter = find(m_listVertices.begin(), m_listVertices.end(), vertex);
if(vertexIter == m_listVertices.end())
{
//LogManager::getSingleton().logMessage("Adding Vertex " + StringConverter::toString(v0.position.x) + "," + StringConverter::toString(v0.position.y) + "," + StringConverter::toString(v0.position.z));
m_listVertices.push_back(vertex);
vertexIter = m_listVertices.end();
vertexIter--;
}
return vertexIter;
}
SurfaceEdgeIterator SurfacePatch::findEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target)
{
for(SurfaceEdgeIterator edgeIter = m_listEdges.begin(); edgeIter != m_listEdges.end(); ++edgeIter)
{
if((edgeIter->target == target) && (edgeIter->otherHalfEdge->target == source))
{
return edgeIter;
}
}
//Not found - add it.
SurfaceEdge edge;
edge.target = target;
SurfaceEdge otherEdge;
otherEdge.target = source;
m_listEdges.push_back(edge);
SurfaceEdgeIterator edgeIter = m_listEdges.end();
edgeIter--;
m_listEdges.push_back(otherEdge);
SurfaceEdgeIterator otherEdgeIter = m_listEdges.end();
otherEdgeIter--;
edgeIter->otherHalfEdge = otherEdgeIter;
edgeIter->nextHalfEdge = edgeIter;
edgeIter->previousHalfEdge = edgeIter;
otherEdgeIter->otherHalfEdge = edgeIter;
otherEdgeIter->nextHalfEdge = otherEdgeIter;
otherEdgeIter->previousHalfEdge = otherEdgeIter;
edgeIter->hasTriangle = false;
otherEdgeIter->hasTriangle = false;
return edgeIter;
}
void SurfacePatch::computeNormalsFromVolume(VolumeIterator volIter) void SurfacePatch::computeNormalsFromVolume(VolumeIterator volIter)
{ {
//LogManager::getSingleton().logMessage("In SurfacePatch::computeNormalsFromVolume"); //LogManager::getSingleton().logMessage("In SurfacePatch::computeNormalsFromVolume");