Cleaning up decimation.

This commit is contained in:
David Williams 2007-09-28 23:40:33 +00:00
parent 52a1044703
commit 6f779427d8
9 changed files with 91 additions and 136 deletions

View File

@ -31,6 +31,7 @@ SET(INC_FILES
include/PolyVoxSceneManager.h include/PolyVoxSceneManager.h
include/SurfaceEdge.h include/SurfaceEdge.h
include/SurfacePatch.h include/SurfacePatch.h
include/SurfaceTypes.h
include/SurfacePatchRenderable.h include/SurfacePatchRenderable.h
include/SurfaceTriangle.h include/SurfaceTriangle.h
include/SurfaceVertex.h include/SurfaceVertex.h

View File

@ -35,6 +35,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
namespace Ogre namespace Ogre
{ {
enum NormalGenerationMethod
{
SIMPLE,
CENTRAL_DIFFERENCE,
SOBEL
};
/// Factory for default scene manager /// Factory for default scene manager
class VOXEL_SCENE_MANAGER_API PolyVoxSceneManagerFactory : public SceneManagerFactory class VOXEL_SCENE_MANAGER_API PolyVoxSceneManagerFactory : public SceneManagerFactory
{ {

View File

@ -21,16 +21,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define __SurfaceEdge_H__ #define __SurfaceEdge_H__
#include "OgrePrerequisites.h" #include "OgrePrerequisites.h"
#include "SurfaceTypes.h"
namespace Ogre namespace Ogre
{ {
class SurfaceVertex;
typedef std::set<SurfaceVertex>::iterator SurfaceVertexIterator;
class SurfaceTriangle;
typedef std::set<SurfaceTriangle>::iterator SurfaceTriangleIterator;
class SurfaceEdge;
typedef std::set<SurfaceEdge>::iterator SurfaceEdgeIterator;
class SurfaceEdge class SurfaceEdge
{ {
public: public:

View File

@ -5,40 +5,33 @@
#include <list> #include <list>
#include "IntegralVector3.h" #include "IntegralVector3.h"
#include "SurfaceTypes.h"
#include "VolumeIterator.h" #include "VolumeIterator.h"
namespace Ogre namespace Ogre
{ {
enum NormalGenerationMethod
{
SIMPLE,
CENTRAL_DIFFERENCE,
SOBEL
};
class SurfaceVertex;
typedef std::set<SurfaceVertex>::iterator SurfaceVertexIterator;
class SurfaceTriangle;
typedef std::set<SurfaceTriangle>::iterator SurfaceTriangleIterator;
class SurfaceEdge;
typedef std::set<SurfaceEdge>::iterator SurfaceEdgeIterator;
class SurfacePatch class SurfacePatch
{ {
public: public:
SurfacePatch(); SurfacePatch();
~SurfacePatch(); ~SurfacePatch();
void beginDefinition(void); //This allow users of the class to iterate over its contents.
void endDefinition(void); SurfaceEdgeIterator getEdgesBegin(void);
SurfaceEdgeIterator getEdgesEnd(void);
SurfaceTriangleIterator getTrianglesBegin(void);
SurfaceTriangleIterator getTrianglesEnd(void);
SurfaceVertexIterator getVerticesBegin(void);
SurfaceVertexIterator getVerticesEnd(void);
//Users of the class might want these for debugging or info purposes.
uint getNoOfEdges(void);
uint getNoOfTriangles(void);
uint getNoOfVertices(void);
void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2);
SurfaceVertexIterator findOrAddVertex(const SurfaceVertex& vertex);
SurfaceEdgeIterator findEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target);
SurfaceEdgeIterator findOrAddEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target);
//SurfaceVertexIterator findTriangle(const SurfaceTriangle& triangle);
void getVertexAndIndexData(std::vector<SurfaceVertex>& vertexData, std::vector<uint>& indexData); void getVertexAndIndexData(std::vector<SurfaceVertex>& vertexData, std::vector<uint>& indexData);
@ -48,11 +41,9 @@ namespace Ogre
uint decimate(void); uint decimate(void);
void triangulate(std::list<SurfaceVertexIterator> listVertices); void triangulate(std::list<SurfaceVertexIterator> listVertices);
bool isPolygonConvex(std::list<SurfaceVertexIterator> listVertices, Vector3 normal); bool isPolygonConvex(std::list<SurfaceVertexIterator> listVertices, Vector3 normal);
void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2);
SurfaceVertexIterator getVerticesBegin(void);
SurfaceVertexIterator getVerticesEnd(void);
uint getNoOfTriangles(void);
private: private:
@ -60,15 +51,9 @@ namespace Ogre
std::set<SurfaceTriangle> m_listTriangles; std::set<SurfaceTriangle> m_listTriangles;
std::set<SurfaceEdge> m_listEdges; std::set<SurfaceEdge> m_listEdges;
//std::vector<SurfaceVertex> m_vecVertexData; SurfaceEdgeIterator findEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target);
//std::vector<uint> m_vecIndexData; SurfaceEdgeIterator findOrAddEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target);
SurfaceVertexIterator findOrAddVertex(const SurfaceVertex& vertex);
uint m_uTrianglesAdded;
uint m_uVerticesAdded;
long int* vertexIndices;
//UIntVector3 m_v3dOffset;
}; };
} }

View File

@ -21,16 +21,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define __SurfaceTriangle_H__ #define __SurfaceTriangle_H__
#include "OgrePrerequisites.h" #include "OgrePrerequisites.h"
#include "SurfaceTypes.h"
namespace Ogre namespace Ogre
{ {
class SurfaceVertex;
typedef std::set<SurfaceVertex>::iterator SurfaceVertexIterator;
class SurfaceTriangle;
typedef std::set<SurfaceTriangle>::iterator SurfaceTriangleIterator;
class SurfaceEdge;
typedef std::set<SurfaceEdge>::iterator SurfaceEdgeIterator;
class SurfaceTriangle class SurfaceTriangle
{ {
public: public:

14
include/SurfaceTypes.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef __SurfaceTypes_H__
#define __SurfaceTypes_H__
namespace Ogre
{
class SurfaceVertex;
typedef std::set<SurfaceVertex>::iterator SurfaceVertexIterator;
class SurfaceTriangle;
typedef std::set<SurfaceTriangle>::iterator SurfaceTriangleIterator;
class SurfaceEdge;
typedef std::set<SurfaceEdge>::iterator SurfaceEdgeIterator;
}
#endif

View File

@ -24,16 +24,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "OgreVector3.h" #include "OgreVector3.h"
#include "IntegralVector3.h" #include "IntegralVector3.h"
#include "SurfaceTypes.h"
namespace Ogre namespace Ogre
{ {
class SurfaceVertex;
typedef std::set<SurfaceVertex>::iterator SurfaceVertexIterator;
class SurfaceTriangle;
typedef std::set<SurfaceTriangle>::iterator SurfaceTriangleIterator;
class SurfaceEdge;
typedef std::set<SurfaceEdge>::iterator SurfaceEdgeIterator;
class SurfaceVertex class SurfaceVertex
{ {
public: public:

View File

@ -743,6 +743,12 @@ namespace Ogre
const uchar material1 = vertMaterials[triTable[iCubeIndex][i+1]]; const uchar material1 = vertMaterials[triTable[iCubeIndex][i+1]];
const uchar material2 = vertMaterials[triTable[iCubeIndex][i+2]]; const uchar material2 = vertMaterials[triTable[iCubeIndex][i+2]];
/*const uchar uMaxMaterial = (std::max)(material0,(std::max)(material1,material2));
SurfaceVertex surfaceVertex0(vertex0);
SurfaceVertex surfaceVertex1(vertex1);
SurfaceVertex surfaceVertex2(vertex2);
result[uMaxMaterial].addTriangle(surfaceVertex0, surfaceVertex1, surfaceVertex2);*/
std::set<uchar> materials; //FIXME - set::set is pretty slow for this as it only holds up to 3 vertices. std::set<uchar> materials; //FIXME - set::set is pretty slow for this as it only holds up to 3 vertices.
materials.insert(material0); materials.insert(material0);
materials.insert(material1); materials.insert(material1);
@ -789,7 +795,6 @@ namespace Ogre
++iterSurfaceVertex; ++iterSurfaceVertex;
} }
iterPatch->second.endDefinition();
uint noOfRemovedVertices = 0; uint noOfRemovedVertices = 0;
do do
{ {

View File

@ -17,58 +17,63 @@ namespace Ogre
m_listVertices.clear(); m_listVertices.clear();
m_listTriangles.clear(); m_listTriangles.clear();
m_listEdges.clear(); m_listEdges.clear();
m_uTrianglesAdded = 0;
m_uVerticesAdded = 0;
vertexIndices = 0;
//beginDefinition(); //FIXME - we shouldn't really be calling this from the constructor.
} }
SurfacePatch::~SurfacePatch() SurfacePatch::~SurfacePatch()
{ {
} }
void SurfacePatch::beginDefinition(void) SurfaceEdgeIterator SurfacePatch::getEdgesBegin(void)
{ {
return m_listEdges.begin();
} }
void SurfacePatch::endDefinition(void) SurfaceEdgeIterator SurfacePatch::getEdgesEnd(void)
{ {
//LogManager::getSingleton().logMessage("No of triangles added = " + StringConverter::toString(m_uTrianglesAdded)); return m_listEdges.end();
//LogManager::getSingleton().logMessage("No of triangles present = " + StringConverter::toString(m_listTriangles.size())); }
//LogManager::getSingleton().logMessage("No of vertices added = " + StringConverter::toString(m_uVerticesAdded));
//LogManager::getSingleton().logMessage("No of vertices present = " + StringConverter::toString(m_setVertices.size()));
//computeOtherHalfEdges(); SurfaceTriangleIterator SurfacePatch::getTrianglesBegin(void)
{
return m_listTriangles.begin();
}
SurfaceTriangleIterator SurfacePatch::getTrianglesEnd(void)
{
return m_listTriangles.end();
}
SurfaceVertexIterator SurfacePatch::getVerticesBegin(void)
{
return m_listVertices.begin();
}
SurfaceVertexIterator SurfacePatch::getVerticesEnd(void)
{
return m_listVertices.end();
}
uint SurfacePatch::getNoOfEdges(void)
{
return m_listEdges.size();
}
uint SurfacePatch::getNoOfTriangles(void)
{
return m_listTriangles.size();
}
uint SurfacePatch::getNoOfVertices(void)
{
return m_listVertices.size();
} }
void SurfacePatch::addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2) void SurfacePatch::addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2)
{ {
/*if(v0.getPosition().x > 4)
return;
if(v0.getPosition().y > 4)
return;
if(v1.getPosition().x > 4)
return;
if(v1.getPosition().y > 4)
return;
if(v2.getPosition().x > 4)
return;
if(v2.getPosition().y > 4)
return;*/
m_uTrianglesAdded++;
m_uVerticesAdded += 3;
SurfaceVertexIterator v0Iter = findOrAddVertex(v0); SurfaceVertexIterator v0Iter = findOrAddVertex(v0);
SurfaceVertexIterator v1Iter = findOrAddVertex(v1); SurfaceVertexIterator v1Iter = findOrAddVertex(v1);
SurfaceVertexIterator v2Iter = findOrAddVertex(v2); SurfaceVertexIterator v2Iter = findOrAddVertex(v2);
SurfaceEdgeIterator v0v1Iter = findOrAddEdge(v0Iter,v1Iter); SurfaceEdgeIterator v0v1Iter = findOrAddEdge(v0Iter,v1Iter);
SurfaceEdgeIterator v1v2Iter = findOrAddEdge(v1Iter,v2Iter); SurfaceEdgeIterator v1v2Iter = findOrAddEdge(v1Iter,v2Iter);
SurfaceEdgeIterator v2v0Iter = findOrAddEdge(v2Iter,v0Iter); SurfaceEdgeIterator v2v0Iter = findOrAddEdge(v2Iter,v0Iter);
@ -89,10 +94,6 @@ namespace Ogre
triangle.setEdge(v0v1Iter); triangle.setEdge(v0v1Iter);
//m_listTriangles.push_back(triangle);
//SurfaceTriangleIterator iterTriangle = m_listTriangles.end();
//iterTriangle--;
SurfaceTriangleIterator iterTriangle = m_listTriangles.insert(triangle).first; SurfaceTriangleIterator iterTriangle = m_listTriangles.insert(triangle).first;
v0v1Iter->setTriangle(iterTriangle); v0v1Iter->setTriangle(iterTriangle);
@ -102,37 +103,12 @@ namespace Ogre
SurfaceVertexIterator SurfacePatch::findOrAddVertex(const SurfaceVertex& vertex) SurfaceVertexIterator SurfacePatch::findOrAddVertex(const SurfaceVertex& vertex)
{ {
/*SurfaceVertexIterator vertexIter = find(m_listVertices.begin(), m_listVertices.end(), vertex);
if(vertexIter == m_listVertices.end())
{
//LogManager::getSingleton().logMessage("Adding Vertex " + StringConverter::toString(v0.position.x) + "," + StringConverter::toString(v0.position.y) + "," + StringConverter::toString(v0.position.z));
m_listVertices.push_back(vertex);
vertexIter = m_listVertices.end();
vertexIter--;
}
return vertexIter;*/
return m_listVertices.insert(vertex).first; return m_listVertices.insert(vertex).first;
} }
SurfaceEdgeIterator SurfacePatch::findEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target) SurfaceEdgeIterator SurfacePatch::findEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target)
{ {
/*LogManager::getSingleton().logMessage("In findEdge()"); return m_listEdges.find(SurfaceEdge(target,source));
LogManager::getSingleton().logMessage("Input: source = " + source->toString() + " target = " + target->toString());
for(SurfaceEdgeIterator edgeIter = m_listEdges.begin(); edgeIter != m_listEdges.end(); ++edgeIter)
{
LogManager::getSingleton().logMessage("Current: source = " + edgeIter->getSource()->toString() + " target = " + edgeIter->getTarget()->toString());
if((edgeIter->getTarget() == target) && (edgeIter->getSource() == source))
{
return edgeIter;
}
}
//Not found - return end.
return m_listEdges.end();*/
SurfaceEdge edgeToFind(target,source);
return m_listEdges.find(edgeToFind);
} }
SurfaceEdgeIterator SurfacePatch::findOrAddEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target) SurfaceEdgeIterator SurfacePatch::findOrAddEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target)
@ -456,19 +432,4 @@ namespace Ogre
return true; 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();
}
} }