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)
{
//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));
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));
if(surfaceUpToDate[regionX][regionY][regionZ] == false)
@ -1008,7 +1008,7 @@ namespace Ogre
iterPatch->second.m_v3dOffset = offset;
iterPatch->second.computeNormalsFromVolume(volIter);
iterPatch->second.endDefinition();
//iterPatch->second.decimate();
iterPatch->second.decimate();
}
//LogManager::getSingleton().logMessage("Finished Generating Mesh Data");

View File

@ -172,47 +172,75 @@ namespace Ogre
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
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)
{
if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),(*triangleIter)->v0) == vertexIter->listConnectedVertices.end())
vertexIter->listConnectedVertices.push_back((*triangleIter)->v0);
if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),(*triangleIter)->v1) == vertexIter->listConnectedVertices.end())
vertexIter->listConnectedVertices.push_back((*triangleIter)->v1);
if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),(*triangleIter)->v2) == vertexIter->listConnectedVertices.end())
vertexIter->listConnectedVertices.push_back((*triangleIter)->v2);
SurfaceVertexIterator connectedVertex;
connectedVertex = (*triangleIter)->v0;
if(find(vertexIter->listConnectedVertices.begin(),vertexIter->listConnectedVertices.end(),connectedVertex) == vertexIter->listConnectedVertices.end())
vertexIter->listConnectedVertices.push_back(connectedVertex);
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
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;
}
if(true/*verticesArePlanar(vertexIter)*/)
{
//Find a vertex to merge with
SurfaceVertexIterator vertexToMergeWith = (*(vertexIter->listTrianglesUsingThisVertex.begin()))->v0;
if(vertexIter == vertexToMergeWith)
{
vertexToMergeWith = (*(vertexIter->listTrianglesUsingThisVertex.begin()))->v1;
}
std::list<SurfaceVertexIterator>::iterator vertexToMergeWith = vertexIter->listConnectedVertices.begin();
//Change triangles to use new vertex
for(SurfaceTriangleIterator iterTriangles = m_setTriangles.begin(); iterTriangles != m_setTriangles.end(); ++iterTriangles)
{
if(iterTriangles->v0 == vertexIter)
iterTriangles->v0 = vertexToMergeWith;
iterTriangles->v0 = *vertexToMergeWith;
if(iterTriangles->v1 == vertexIter)
iterTriangles->v1 = vertexToMergeWith;
iterTriangles->v1 = *vertexToMergeWith;
if(iterTriangles->v2 == vertexIter)
iterTriangles->v2 = vertexToMergeWith;
iterTriangles->v2 = *vertexToMergeWith;
}
//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)));
}*/
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);
else
volIter.setVoxelAt(x,y,z,5);
/*else
volIter.setVoxelAt(x,y,z,5);*/
}
else
volIter.setVoxelAt(x,y,z,0);*/
volIter.setVoxelAt(x,y,z,0);
}
}