diff --git a/CMakeLists.txt b/CMakeLists.txt index 36411cfa..4319d131 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ SET(INC_FILES include/PolyVoxSceneManager.h include/SurfaceEdge.h include/SurfacePatch.h + include/SurfaceTypes.h include/SurfacePatchRenderable.h include/SurfaceTriangle.h include/SurfaceVertex.h diff --git a/include/PolyVoxSceneManager.h b/include/PolyVoxSceneManager.h index cc9dd914..215f324a 100644 --- a/include/PolyVoxSceneManager.h +++ b/include/PolyVoxSceneManager.h @@ -35,6 +35,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. namespace Ogre { + enum NormalGenerationMethod + { + SIMPLE, + CENTRAL_DIFFERENCE, + SOBEL + }; + /// Factory for default scene manager class VOXEL_SCENE_MANAGER_API PolyVoxSceneManagerFactory : public SceneManagerFactory { diff --git a/include/SurfaceEdge.h b/include/SurfaceEdge.h index 1f2a822e..3fbec2cd 100644 --- a/include/SurfaceEdge.h +++ b/include/SurfaceEdge.h @@ -21,16 +21,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define __SurfaceEdge_H__ #include "OgrePrerequisites.h" +#include "SurfaceTypes.h" namespace Ogre { - class SurfaceVertex; - typedef std::set::iterator SurfaceVertexIterator; - class SurfaceTriangle; - typedef std::set::iterator SurfaceTriangleIterator; - class SurfaceEdge; - typedef std::set::iterator SurfaceEdgeIterator; - class SurfaceEdge { public: diff --git a/include/SurfacePatch.h b/include/SurfacePatch.h index 1fddafbe..51d5b59b 100644 --- a/include/SurfacePatch.h +++ b/include/SurfacePatch.h @@ -5,40 +5,33 @@ #include #include "IntegralVector3.h" - +#include "SurfaceTypes.h" #include "VolumeIterator.h" namespace Ogre { - enum NormalGenerationMethod - { - SIMPLE, - CENTRAL_DIFFERENCE, - SOBEL - }; - - class SurfaceVertex; - typedef std::set::iterator SurfaceVertexIterator; - class SurfaceTriangle; - typedef std::set::iterator SurfaceTriangleIterator; - class SurfaceEdge; - typedef std::set::iterator SurfaceEdgeIterator; - class SurfacePatch { public: SurfacePatch(); ~SurfacePatch(); - void beginDefinition(void); - void endDefinition(void); + //This allow users of the class to iterate over its contents. + SurfaceEdgeIterator getEdgesBegin(void); + SurfaceEdgeIterator getEdgesEnd(void); + SurfaceTriangleIterator getTrianglesBegin(void); + SurfaceTriangleIterator getTrianglesEnd(void); + SurfaceVertexIterator getVerticesBegin(void); + SurfaceVertexIterator getVerticesEnd(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); + //Users of the class might want these for debugging or info purposes. + uint getNoOfEdges(void); + uint getNoOfTriangles(void); + uint getNoOfVertices(void); + + + void getVertexAndIndexData(std::vector& vertexData, std::vector& indexData); @@ -48,11 +41,9 @@ namespace Ogre uint decimate(void); void triangulate(std::list listVertices); bool isPolygonConvex(std::list listVertices, Vector3 normal); + void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2); - SurfaceVertexIterator getVerticesBegin(void); - SurfaceVertexIterator getVerticesEnd(void); - - uint getNoOfTriangles(void); + private: @@ -60,15 +51,9 @@ namespace Ogre std::set m_listTriangles; std::set m_listEdges; - //std::vector m_vecVertexData; - //std::vector m_vecIndexData; - - uint m_uTrianglesAdded; - uint m_uVerticesAdded; - - long int* vertexIndices; - - //UIntVector3 m_v3dOffset; + SurfaceEdgeIterator findEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target); + SurfaceEdgeIterator findOrAddEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target); + SurfaceVertexIterator findOrAddVertex(const SurfaceVertex& vertex); }; } diff --git a/include/SurfaceTriangle.h b/include/SurfaceTriangle.h index ee7a89e3..dffe89a1 100644 --- a/include/SurfaceTriangle.h +++ b/include/SurfaceTriangle.h @@ -21,16 +21,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define __SurfaceTriangle_H__ #include "OgrePrerequisites.h" +#include "SurfaceTypes.h" namespace Ogre { - class SurfaceVertex; - typedef std::set::iterator SurfaceVertexIterator; - class SurfaceTriangle; - typedef std::set::iterator SurfaceTriangleIterator; - class SurfaceEdge; - typedef std::set::iterator SurfaceEdgeIterator; - class SurfaceTriangle { public: diff --git a/include/SurfaceTypes.h b/include/SurfaceTypes.h new file mode 100644 index 00000000..66c71c44 --- /dev/null +++ b/include/SurfaceTypes.h @@ -0,0 +1,14 @@ +#ifndef __SurfaceTypes_H__ +#define __SurfaceTypes_H__ + +namespace Ogre +{ + class SurfaceVertex; + typedef std::set::iterator SurfaceVertexIterator; + class SurfaceTriangle; + typedef std::set::iterator SurfaceTriangleIterator; + class SurfaceEdge; + typedef std::set::iterator SurfaceEdgeIterator; +} + +#endif \ No newline at end of file diff --git a/include/SurfaceVertex.h b/include/SurfaceVertex.h index 5571023d..29335766 100644 --- a/include/SurfaceVertex.h +++ b/include/SurfaceVertex.h @@ -24,16 +24,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "OgreVector3.h" #include "IntegralVector3.h" +#include "SurfaceTypes.h" namespace Ogre { - class SurfaceVertex; - typedef std::set::iterator SurfaceVertexIterator; - class SurfaceTriangle; - typedef std::set::iterator SurfaceTriangleIterator; - class SurfaceEdge; - typedef std::set::iterator SurfaceEdgeIterator; - class SurfaceVertex { public: diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index e8a70bcb..72767a1b 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -743,6 +743,12 @@ namespace Ogre const uchar material1 = vertMaterials[triTable[iCubeIndex][i+1]]; 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 materials; //FIXME - set::set is pretty slow for this as it only holds up to 3 vertices. materials.insert(material0); materials.insert(material1); @@ -789,7 +795,6 @@ namespace Ogre ++iterSurfaceVertex; } - iterPatch->second.endDefinition(); uint noOfRemovedVertices = 0; do { diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp index 0b51f385..63afd481 100644 --- a/source/SurfacePatch.cpp +++ b/source/SurfacePatch.cpp @@ -17,57 +17,62 @@ namespace Ogre m_listVertices.clear(); m_listTriangles.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() { } - 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)); - //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())); + return m_listEdges.end(); + } - //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) - { - /*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 v1Iter = findOrAddVertex(v1); - SurfaceVertexIterator v2Iter = findOrAddVertex(v2); - + SurfaceVertexIterator v2Iter = findOrAddVertex(v2); SurfaceEdgeIterator v0v1Iter = findOrAddEdge(v0Iter,v1Iter); SurfaceEdgeIterator v1v2Iter = findOrAddEdge(v1Iter,v2Iter); @@ -89,10 +94,6 @@ namespace Ogre triangle.setEdge(v0v1Iter); - //m_listTriangles.push_back(triangle); - //SurfaceTriangleIterator iterTriangle = m_listTriangles.end(); - //iterTriangle--; - SurfaceTriangleIterator iterTriangle = m_listTriangles.insert(triangle).first; v0v1Iter->setTriangle(iterTriangle); @@ -102,37 +103,12 @@ namespace Ogre 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; } SurfaceEdgeIterator SurfacePatch::findEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target) { - /*LogManager::getSingleton().logMessage("In findEdge()"); - 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); + return m_listEdges.find(SurfaceEdge(target,source)); } SurfaceEdgeIterator SurfacePatch::findOrAddEdge(const SurfaceVertexIterator& source, const SurfaceVertexIterator& target) @@ -456,19 +432,4 @@ 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(); - } }