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)
|
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");
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user