Cleaning up decimation.
This commit is contained in:
parent
52a1044703
commit
6f779427d8
@ -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
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
14
include/SurfaceTypes.h
Normal 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
|
@ -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:
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user