Work on mesh decimation.

This commit is contained in:
David Williams
2007-09-18 14:23:39 +00:00
parent 8d514a2bb9
commit 377b7a5cdd
5 changed files with 140 additions and 34 deletions

View File

@ -55,9 +55,7 @@ namespace Ogre
bool matchesAll(uchar target, uchar other); bool matchesAll(uchar target, uchar other);
#endif #endif
#ifdef BLAH3
bool decimate3(void); bool decimate3(void);
#endif
//bool verticesArePlanar(SurfaceVertexIterator iterCurrentVertex); //bool verticesArePlanar(SurfaceVertexIterator iterCurrentVertex);

View File

@ -323,11 +323,11 @@ namespace Ogre
//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 = 0; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionY) for(uint regionY = OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2; regionY < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++regionY)
{ {
//LogManager::getSingleton().logMessage("regionY = " + StringConverter::toString(regionY)); //LogManager::getSingleton().logMessage("regionY = " + StringConverter::toString(regionY));
for(uint regionX = 0; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionX) for(uint regionX = OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2; regionX < OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS/2+1; ++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)
@ -1010,9 +1010,10 @@ namespace Ogre
iterPatch->second.computeNormalsFromVolume(volIter); iterPatch->second.computeNormalsFromVolume(volIter);
iterPatch->second.endDefinition(); iterPatch->second.endDefinition();
bool removedVertex = false; bool removedVertex = false;
for(uint ct = 0; ct < 2; ct++)
//do //do
{ {
//removedVertex = iterPatch->second.decimate3(); removedVertex = iterPatch->second.decimate3();
} }
//while(removedVertex); //while(removedVertex);
} }

View File

@ -41,24 +41,24 @@ 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;
if(v2.position.y > 8)
return; return;
if(v2.position.y > 16)
return;*/
//if(m_uTrianglesAdded > 1) return; //if(m_uTrianglesAdded > 1) return;
@ -305,14 +305,16 @@ namespace Ogre
} }
} }
#ifdef BLAH3
bool SurfacePatch::decimate3(void) bool SurfacePatch::decimate3(void)
{ {
int fixed = 0; bool didDecimation = false;
int movable = 0; LogManager::getSingleton().logMessage("Performing decimation");
LogManager::getSingleton().logMessage("No of triangles = " + StringConverter::toString(m_listTriangles.size()));
//int fixed = 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");
std::list<SurfaceVertexIterator> listConnectedVertices; std::list<SurfaceVertexIterator> listConnectedVertices;
//listConnectedVertices.push_back(vertexIter); //listConnectedVertices.push_back(vertexIter);
@ -329,14 +331,13 @@ namespace Ogre
if(nextEdge == m_listEdges.end()) if(nextEdge == m_listEdges.end())
{ {
fixed++;
continue; continue;
} }
movable++;
bool allXMatch = true; bool allXMatch = true;
bool allYMatch = true; bool allYMatch = true;
bool allZMatch = true; bool allZMatch = true;
LogManager::getSingleton().logMessage("Checking connected vertices");
for(std::list<SurfaceVertexIterator>::iterator connectedVertexIter = listConnectedVertices.begin(); connectedVertexIter != listConnectedVertices.end(); ++connectedVertexIter) for(std::list<SurfaceVertexIterator>::iterator connectedVertexIter = listConnectedVertices.begin(); connectedVertexIter != listConnectedVertices.end(); ++connectedVertexIter)
{ {
if((*connectedVertexIter)->position.x != vertexIter->position.x) if((*connectedVertexIter)->position.x != vertexIter->position.x)
@ -355,22 +356,128 @@ namespace Ogre
if((allXMatch) || (allYMatch) || (allZMatch)) if((allXMatch) || (allYMatch) || (allZMatch))
{ {
for(SurfaceVertexIterator innerVertexIter = m_listVertices.begin(); innerVertexIter != m_listVertices.end(); ++innerVertexIter) LogManager::getSingleton().logMessage(" All flat");
/*for(SurfaceVertexIterator innerVertexIter = m_listVertices.begin(); innerVertexIter != m_listVertices.end(); ++innerVertexIter)
{ {
if(innerVertexIter->position == vertexIter->position) if(innerVertexIter->position == vertexIter->position)
{ {
innerVertexIter->position = (*listConnectedVertices.begin())->position; innerVertexIter->position = (*listConnectedVertices.begin())->position;
} }
}*/
nextEdge = firstEdge;
//std::list<SurfaceVertexIterator> verticesFormingPolygon;
do
{
//verticesFormingPolygon.push_back(nextEdge->target);
LogManager::getSingleton().logMessage("Removing triangle");
m_listTriangles.erase(nextEdge->triangle);
nextEdge = nextEdge->nextHalfEdge->nextHalfEdge->otherHalfEdge;
}while(nextEdge != firstEdge);
//nextEdge = firstEdge;
std::list<SurfaceEdgeIterator> edgesToRemove;
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)
{
m_listEdges.erase(*edgesToRemoveIter);
} }
m_listVertices.erase(vertexIter);
//Now triangulate...
LogManager::getSingleton().logMessage("Doing triangulation");
//std::list<SurfaceEdgeIterator>::iterator firstEdgeIter = edgesFormingPolygon.begin();
std::list<SurfaceEdgeIterator>::iterator secondEdgeIter = edgesFormingPolygon.begin();
SurfaceEdgeIterator lastAddedEdge = (*edgesFormingPolygon.begin());
//++firstEdgeIter;
//++secondEdgeIter;
++secondEdgeIter;
std::list<SurfaceEdgeIterator>::iterator endEdgeIter = edgesFormingPolygon.end();
--endEdgeIter;
--endEdgeIter;
while(secondEdgeIter != endEdgeIter)
{
SurfaceEdge newEdge;
newEdge.target = (lastAddedEdge)->otherHalfEdge->target;
newEdge.nextHalfEdge = (lastAddedEdge);
newEdge.previousHalfEdge = (*secondEdgeIter);
m_listEdges.push_back(newEdge);
SurfaceEdgeIterator newEdgeIter = m_listEdges.end();
--newEdgeIter;
(lastAddedEdge)->nextHalfEdge = (*secondEdgeIter);
(lastAddedEdge)->previousHalfEdge = (newEdgeIter);
(*secondEdgeIter)->nextHalfEdge = (newEdgeIter);
(*secondEdgeIter)->previousHalfEdge = (lastAddedEdge);
SurfaceEdge otherNewEdge;
m_listEdges.push_back(otherNewEdge);
SurfaceEdgeIterator otherNewEdgeIter = m_listEdges.end();
--otherNewEdgeIter;
otherNewEdgeIter->target = (*secondEdgeIter)->target;
otherNewEdgeIter->otherHalfEdge = newEdgeIter;
newEdgeIter->otherHalfEdge = otherNewEdgeIter;
SurfaceTriangle triangle;
m_listTriangles.push_back(triangle);
SurfaceTriangleIterator iterTriangle = m_listTriangles.end();
iterTriangle--;
iterTriangle->edge = lastAddedEdge;
lastAddedEdge->triangle = iterTriangle;
(*secondEdgeIter)->triangle = iterTriangle;
newEdgeIter->triangle = iterTriangle;
//++firstEdgeIter;
++secondEdgeIter;
lastAddedEdge = otherNewEdgeIter;
}
++endEdgeIter;
lastAddedEdge->nextHalfEdge = (*secondEdgeIter);
(*secondEdgeIter)->nextHalfEdge = (*endEdgeIter);
(*endEdgeIter)->nextHalfEdge = lastAddedEdge;
lastAddedEdge->previousHalfEdge = (*endEdgeIter);
(*endEdgeIter)->previousHalfEdge = (*secondEdgeIter);
(*secondEdgeIter)->previousHalfEdge = lastAddedEdge;
SurfaceTriangle triangle;
m_listTriangles.push_back(triangle);
SurfaceTriangleIterator iterTriangle = m_listTriangles.end();
iterTriangle--;
iterTriangle->edge = lastAddedEdge;
lastAddedEdge->triangle = iterTriangle;
(*secondEdgeIter)->triangle = iterTriangle;
(*endEdgeIter)->triangle = iterTriangle;
} }
didDecimation = true;
break;
} }
//LogManager::getSingleton().logMessage("Fixed = " + StringConverter::toString(fixed) + " Movable = " + StringConverter::toString(movable)); //LogManager::getSingleton().logMessage("Fixed = " + StringConverter::toString(fixed) + " Movable = " + StringConverter::toString(movable));
LogManager::getSingleton().logMessage("Done decimation");
LogManager::getSingleton().logMessage("No of triangles = " + StringConverter::toString(m_listTriangles.size()));
return false; return didDecimation;
} }
#endif
#ifdef BLAH #ifdef BLAH
bool SurfacePatch::decimate(void) bool SurfacePatch::decimate(void)

View File

@ -18,15 +18,15 @@ namespace Ogre
flags = 0; flags = 0;
if(position.x == 0) if(position.x == 0)
flags |= 1; flags |= 1;
if(position.x == 32) if(position.x == 8)
flags |= 2; flags |= 2;
if(position.y == 0) if(position.y == 0)
flags |= 4; flags |= 4;
if(position.y == 32) if(position.y == 8)
flags |= 8; flags |= 8;
if(position.z == 0) if(position.z == 0)
flags |= 16; flags |= 16;
if(position.z == 32) if(position.z == 8)
flags |= 32; flags |= 32;
} }
@ -38,15 +38,15 @@ namespace Ogre
flags = 0; flags = 0;
if(position.x == 0) if(position.x == 0)
flags |= 1; flags |= 1;
if(position.x == 32) if(position.x == 8)
flags |= 2; flags |= 2;
if(position.y == 0) if(position.y == 0)
flags |= 4; flags |= 4;
if(position.y == 32) if(position.y == 8)
flags |= 8; flags |= 8;
if(position.z == 0) if(position.z == 0)
flags |= 16; flags |= 16;
if(position.z == 32) if(position.z == 8)
flags |= 32; flags |= 32;
} }

View File

@ -59,15 +59,15 @@ namespace Ogre
LogManager::getSingleton().logMessage("Value is " + StringConverter::toString(int(value))); LogManager::getSingleton().logMessage("Value is " + StringConverter::toString(int(value)));
}*/ }*/
volIter.setVoxelAt(x,y,z,value); volIter.setVoxelAt(x,y,z,value);
/*if(z < 24) if(z < 24)
{ {
if(x % 32 < 16) //if(x % 32 < 16)
volIter.setVoxelAt(x,y,z,4); volIter.setVoxelAt(x,y,z,4);
else /*else
volIter.setVoxelAt(x,y,z,5); volIter.setVoxelAt(x,y,z,5);*/
} }
else else
volIter.setVoxelAt(x,y,z,0);*/ volIter.setVoxelAt(x,y,z,0);
} }
} }
//volIter.setVoxelAt(130,130,23,0); //volIter.setVoxelAt(130,130,23,0);