Cleaning up decimation.

This commit is contained in:
David Williams 2007-09-28 10:59:26 +00:00
parent 2f79e76ea5
commit 52a1044703
3 changed files with 23 additions and 90 deletions

View File

@ -42,8 +42,6 @@ namespace Ogre
void getVertexAndIndexData(std::vector<SurfaceVertex>& vertexData, std::vector<uint>& indexData);
void computeNormalsFromVolume(VolumeIterator volIter);
bool canRemoveVertexFrom(SurfaceVertexIterator vertexIter, std::list<SurfaceVertexIterator> listConnectedIter, bool isEdge);
std::list<SurfaceVertexIterator> findConnectedVertices(SurfaceVertexIterator vertexIter, bool& isEdge);
@ -51,10 +49,13 @@ namespace Ogre
void triangulate(std::list<SurfaceVertexIterator> listVertices);
bool isPolygonConvex(std::list<SurfaceVertexIterator> listVertices, Vector3 normal);
SurfaceVertexIterator getVerticesBegin(void);
SurfaceVertexIterator getVerticesEnd(void);
UIntVector3 m_v3dOffset;
uint getNoOfTriangles(void);
public:
private:
std::set<SurfaceVertex> m_listVertices;
std::set<SurfaceTriangle> m_listTriangles;
std::set<SurfaceEdge> m_listEdges;

View File

@ -359,7 +359,7 @@ namespace Ogre
std::vector<SurfaceVertex> vertexData;
std::vector<uint> indexData;
iterSurfacePatch->second.getVertexAndIndexData(vertexData, indexData);
triangleCounter += iterSurfacePatch->second.m_listTriangles.size();
triangleCounter += iterSurfacePatch->second.getNoOfTriangles();
std::map<uchar,SurfacePatchRenderable*>::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(iterSurfacePatch->first);
if(iterSurface == m_mapSurfaces[regionX][regionY][regionZ].end())
@ -781,8 +781,8 @@ namespace Ogre
for(std::map<uchar, SurfacePatch>::iterator iterPatch = result.begin(); iterPatch != result.end(); ++iterPatch)
{
SurfaceVertexIterator iterSurfaceVertex = iterPatch->second.m_listVertices.begin();
while(iterSurfaceVertex != iterPatch->second.m_listVertices.end())
SurfaceVertexIterator iterSurfaceVertex = iterPatch->second.getVerticesBegin();
while(iterSurfaceVertex != iterPatch->second.getVerticesEnd())
{
Vector3 tempNormal = computeNormal((iterSurfaceVertex->getPosition() + offset).toOgreVector3()/2.0f, CENTRAL_DIFFERENCE);
iterSurfaceVertex->setNormal(tempNormal);

View File

@ -156,89 +156,6 @@ namespace Ogre
return edgeIter;
}
void SurfacePatch::computeNormalsFromVolume(VolumeIterator volIter)
{
//LogManager::getSingleton().logMessage("In SurfacePatch::computeNormalsFromVolume");
for(SurfaceVertexIterator vertexIter = m_listVertices.begin(); vertexIter != m_listVertices.end(); ++vertexIter)
{
//LogManager::getSingleton().logMessage("In Loop");
const float posX = (vertexIter->getPosition().x + m_v3dOffset.x) / 2.0f;
const float posY = (vertexIter->getPosition().y + m_v3dOffset.y) / 2.0f;
const float posZ = (vertexIter->getPosition().z + m_v3dOffset.z) / 2.0f;
const uint floorX = static_cast<uint>(posX);
const uint floorY = static_cast<uint>(posY);
const uint floorZ = static_cast<uint>(posZ);
NormalGenerationMethod normalGenerationMethod = CENTRAL_DIFFERENCE;
switch(normalGenerationMethod)
{
case SIMPLE:
{
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY),static_cast<uint>(posZ));
const uchar uFloor = volIter.getVoxel() > 0 ? 1 : 0;
if((posX - floorX) > 0.25) //The result should be 0.0 or 0.5
{
uchar uCeil = volIter.peekVoxel1px0py0pz() > 0 ? 1 : 0;
vertexIter->setNormal(Vector3(uFloor - uCeil,0.0,0.0));
}
else if((posY - floorY) > 0.25) //The result should be 0.0 or 0.5
{
uchar uCeil = volIter.peekVoxel0px1py0pz() > 0 ? 1 : 0;
vertexIter->setNormal(Vector3(0.0,uFloor - uCeil,0.0));
}
else if((posZ - floorZ) > 0.25) //The result should be 0.0 or 0.5
{
uchar uCeil = volIter.peekVoxel0px0py1pz() > 0 ? 1 : 0;
vertexIter->setNormal(Vector3(0.0, 0.0,uFloor - uCeil));
}
break;
}
case CENTRAL_DIFFERENCE:
{
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY),static_cast<uint>(posZ));
const Vector3 gradFloor = volIter.getCentralDifferenceGradient();
if((posX - floorX) > 0.25) //The result should be 0.0 or 0.5
{
volIter.setPosition(static_cast<uint>(posX+1.0),static_cast<uint>(posY),static_cast<uint>(posZ));
}
if((posY - floorY) > 0.25) //The result should be 0.0 or 0.5
{
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY+1.0),static_cast<uint>(posZ));
}
if((posZ - floorZ) > 0.25) //The result should be 0.0 or 0.5
{
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY),static_cast<uint>(posZ+1.0));
}
const Vector3 gradCeil = volIter.getCentralDifferenceGradient();
vertexIter->setNormal((gradFloor + gradCeil) * -1.0);
break;
}
case SOBEL:
{
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY),static_cast<uint>(posZ));
const Vector3 gradFloor = volIter.getSobelGradient();
if((posX - floorX) > 0.25) //The result should be 0.0 or 0.5
{
volIter.setPosition(static_cast<uint>(posX+1.0),static_cast<uint>(posY),static_cast<uint>(posZ));
}
if((posY - floorY) > 0.25) //The result should be 0.0 or 0.5
{
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY+1.0),static_cast<uint>(posZ));
}
if((posZ - floorZ) > 0.25) //The result should be 0.0 or 0.5
{
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY),static_cast<uint>(posZ+1.0));
}
const Vector3 gradCeil = volIter.getSobelGradient();
vertexIter->setNormal((gradFloor + gradCeil) * -1.0);
break;
}
}
}
}
void SurfacePatch::getVertexAndIndexData(std::vector<SurfaceVertex>& vertexData, std::vector<uint>& indexData)
{
vertexData.clear();
@ -539,4 +456,19 @@ namespace Ogre
return true;
}
SurfaceVertexIterator SurfacePatch::getVerticesBegin(void)
{
return m_listVertices.begin();
}
SurfaceVertexIterator SurfacePatch::getVerticesEnd(void)
{
return m_listVertices.end();
}
uint SurfacePatch::getNoOfTriangles(void)
{
return m_listTriangles.size();
}
}