Work on mesh decimation.

This commit is contained in:
David Williams 2007-09-02 12:08:37 +00:00
parent 80c6f149a5
commit 9bf977b704
3 changed files with 51 additions and 23 deletions

View File

@ -323,10 +323,10 @@ namespace Ogre
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)
@ -1008,7 +1008,7 @@ namespace Ogre
iterPatch->second.m_v3dOffset = offset; iterPatch->second.m_v3dOffset = offset;
iterPatch->second.computeNormalsFromVolume(volIter); iterPatch->second.computeNormalsFromVolume(volIter);
iterPatch->second.endDefinition(); iterPatch->second.endDefinition();
//iterPatch->second.decimate(); iterPatch->second.decimate();
} }
//LogManager::getSingleton().logMessage("Finished Generating Mesh Data"); //LogManager::getSingleton().logMessage("Finished Generating Mesh Data");

View File

@ -172,47 +172,75 @@ namespace Ogre
void SurfacePatch::decimate(void) void SurfacePatch::decimate(void)
{ {
LogManager::getSingleton().logMessage("Vertices before decimation = " + StringConverter::toString(m_setVertices.size()));
LogManager::getSingleton().logMessage("Triangles before decimation = " + StringConverter::toString(m_setTriangles.size()));
//Build the lists of connected vertices //Build the lists of connected vertices
for(SurfaceVertexIterator vertexIter = m_setVertices.begin(); vertexIter != m_setVertices.end(); ++vertexIter) for(SurfaceVertexIterator vertexIter = m_setVertices.begin(); vertexIter != m_setVertices.end(); ++vertexIter)
{ {
vertexIter->listConnectedVertices.clear();
for(std::list<SurfaceTriangleIterator>::iterator triangleIter = vertexIter->listTrianglesUsingThisVertex.begin(); triangleIter != vertexIter->listTrianglesUsingThisVertex.end(); ++triangleIter) for(std::list<SurfaceTriangleIterator>::iterator triangleIter = vertexIter->listTrianglesUsingThisVertex.begin(); triangleIter != vertexIter->listTrianglesUsingThisVertex.end(); ++triangleIter)
{ {
if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),(*triangleIter)->v0) == vertexIter->listConnectedVertices.end()) SurfaceVertexIterator connectedVertex;
vertexIter->listConnectedVertices.push_back((*triangleIter)->v0);
if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),(*triangleIter)->v1) == vertexIter->listConnectedVertices.end()) connectedVertex = (*triangleIter)->v0;
vertexIter->listConnectedVertices.push_back((*triangleIter)->v1); if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),connectedVertex) == vertexIter->listConnectedVertices.end())
if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),(*triangleIter)->v2) == vertexIter->listConnectedVertices.end()) vertexIter->listConnectedVertices.push_back(connectedVertex);
vertexIter->listConnectedVertices.push_back((*triangleIter)->v2);
connectedVertex = (*triangleIter)->v1;
if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),connectedVertex) == vertexIter->listConnectedVertices.end())
vertexIter->listConnectedVertices.push_back(connectedVertex);
connectedVertex = (*triangleIter)->v2;
if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),connectedVertex) == vertexIter->listConnectedVertices.end())
vertexIter->listConnectedVertices.push_back(connectedVertex);
} }
//Remove self from own connected vertex list
vertexIter->listConnectedVertices.remove(vertexIter);
} }
//do the vertex merging //do the vertex merging
for(SurfaceVertexIterator vertexIter = m_setVertices.begin(); vertexIter != m_setVertices.end(); ++vertexIter) for(SurfaceVertexIterator vertexIter = m_setVertices.begin(); vertexIter != m_setVertices.end(); ++vertexIter)
{ {
if(vertexIter->alpha < 0.9) //LogManager::getSingleton().logMessage("Vertex Pos = " + StringConverter::toString(vertexIter->position.x) + "," + StringConverter::toString(vertexIter->position.y) + "," + StringConverter::toString(vertexIter->position.z) + " No of connected vertices = " + StringConverter::toString(vertexIter->listConnectedVertices.size()));
/*if(vertexIter->alpha < 0.9)
continue;*/
if(vertexIter->listConnectedVertices.size() != 6)
{
//LogManager::getSingleton().logMessage("Skipping edge/corner vertex");
continue; continue;
}
if(true/*verticesArePlanar(vertexIter)*/) if(true/*verticesArePlanar(vertexIter)*/)
{ {
//Find a vertex to merge with //Find a vertex to merge with
SurfaceVertexIterator vertexToMergeWith = (*(vertexIter->listTrianglesUsingThisVertex.begin()))->v0; std::list<SurfaceVertexIterator>::iterator vertexToMergeWith = vertexIter->listConnectedVertices.begin();
if(vertexIter == vertexToMergeWith)
{
vertexToMergeWith = (*(vertexIter->listTrianglesUsingThisVertex.begin()))->v1;
}
//Change triangles to use new vertex //Change triangles to use new vertex
for(SurfaceTriangleIterator iterTriangles = m_setTriangles.begin(); iterTriangles != m_setTriangles.end(); ++iterTriangles) for(SurfaceTriangleIterator iterTriangles = m_setTriangles.begin(); iterTriangles != m_setTriangles.end(); ++iterTriangles)
{ {
if(iterTriangles->v0 == vertexIter) if(iterTriangles->v0 == vertexIter)
iterTriangles->v0 = vertexToMergeWith; iterTriangles->v0 = *vertexToMergeWith;
if(iterTriangles->v1 == vertexIter) if(iterTriangles->v1 == vertexIter)
iterTriangles->v1 = vertexToMergeWith; iterTriangles->v1 = *vertexToMergeWith;
if(iterTriangles->v2 == vertexIter) if(iterTriangles->v2 == vertexIter)
iterTriangles->v2 = vertexToMergeWith; iterTriangles->v2 = *vertexToMergeWith;
} }
//Change connected vertices to use new vertex //Change connected vertices to use new vertex
for(std::list<SurfaceVertexIterator>::iterator connectedVertex = vertexIter->listConnectedVertices.begin(); connectedVertex != vertexIter->listConnectedVertices.end(); ++connectedVertex)
{
for(std::list<SurfaceVertexIterator>::iterator secondLevelConnected = (*connectedVertex)->listConnectedVertices.begin(); secondLevelConnected != (*connectedVertex)->listConnectedVertices.end(); ++secondLevelConnected)
{
if((*secondLevelConnected) == vertexIter)
(*secondLevelConnected) = *vertexToMergeWith;
}
}
//Now remove the vertex as nothing should point to it.
//m_setVertices.erase(vertexIter);
} }
} }
} }

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);
} }
} }