Work on mesh decimation.
This commit is contained in:
parent
80c6f149a5
commit
9bf977b704
@ -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");
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user