diff --git a/CMakeLists.txt b/CMakeLists.txt index 774030e7..a3ad9dc6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,8 @@ SET(SRC_FILES source/MaterialMapManager.cpp source/MaterialMapSerializer.cpp source/PolyVoxSceneManager.cpp - source/Surface.cpp + source/SurfacePatch.cpp + source/SurfacePatchRenderable.cpp source/Volume.cpp source/VolumeIterator.cpp source/VolumeManager.cpp @@ -25,10 +26,12 @@ SET(INC_FILES include/MaterialMapManager.h include/MaterialMapSerializer.h include/PolyVoxSceneManager.h - include/Surface.h - include/Triangle.h + include/SurfaceEdge.h + include/SurfacePatch.h + include/SurfacePatchRenderable.h + include/SurfaceTriangle.h + include/SurfaceVertex.h include/TypeDef.h - include/Vertex.h include/Volume.h include/VolumeIterator.h include/VolumeManager.h diff --git a/include/PolyVoxSceneManager.h b/include/PolyVoxSceneManager.h index 287c7300..68501f84 100644 --- a/include/PolyVoxSceneManager.h +++ b/include/PolyVoxSceneManager.h @@ -24,11 +24,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "Constants.h" #include "MaterialMap.h" -#include "Surface.h" -#include "Triangle.h" +#include "SurfacePatchRenderable.h" +#include "SurfaceTriangle.h" #include "TypeDef.h" #include "Volume.h" -#include "Vertex.h" +#include "SurfaceVertex.h" #include @@ -80,9 +80,9 @@ namespace Ogre void generateLevelVolume(void); - void generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ, std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const; - void mergeVertices6(std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const; - bool verticesArePlanar3(uint uCurrentVertex, std::set setConnectedVertices, std::vector& vertexData) const; + void generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ, std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const; + void mergeVertices6(std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const; + bool verticesArePlanar3(uint uCurrentVertex, std::set setConnectedVertices, std::vector& vertexData) const; void doRegionGrowing(uint xStart, uint yStart, uint zStart, uchar value); @@ -96,7 +96,7 @@ namespace Ogre bool surfaceUpToDate[OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS][OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS][OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS]; bool regionIsHomogenous[OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS][OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS][OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS]; - std::map m_mapSurfaces[OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS][OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS][OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS]; + std::map m_mapSurfaces[OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS][OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS][OGRE_VOLUME_SIDE_LENGTH_IN_REGIONS]; void igniteVoxel(UIntVector3 voxelToIgnite); diff --git a/include/Surface.h b/include/Surface.h deleted file mode 100644 index 83997f5e..00000000 --- a/include/Surface.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __SURFACE_H__ -#define __SURFACE_H__ - -#include "Ogre.h" -#include - -#include "Triangle.h" -#include "Vertex.h" - -namespace Ogre -{ - class Surface : public SimpleRenderable - { - public: - Surface(const String& material = "BaseWhiteNoLighting"); - ~Surface(void); - - void setGeometry(std::vector verticesToSet, std::vector indicesToSet); - - Real getSquaredViewDepth(const Camera *cam) const; - Real getBoundingRadius(void) const; - protected: - //void getWorldTransforms(Matrix4 *xform) const; - const Quaternion &getWorldOrientation(void) const; - const Vector3 &getWorldPosition(void) const; - }; -} - -#endif /* __SURFACE_H__ */ \ No newline at end of file diff --git a/include/SurfaceEdge.h b/include/SurfaceEdge.h new file mode 100644 index 00000000..e69de29b diff --git a/include/SurfacePatch.h b/include/SurfacePatch.h new file mode 100644 index 00000000..e69de29b diff --git a/include/SurfacePatchRenderable.h b/include/SurfacePatchRenderable.h new file mode 100644 index 00000000..9bbc39a6 --- /dev/null +++ b/include/SurfacePatchRenderable.h @@ -0,0 +1,29 @@ +#ifndef __SurfacePatchRenderable_H__ +#define __SurfacePatchRenderable_H__ + +#include "Ogre.h" +#include + +#include "SurfaceTriangle.h" +#include "SurfaceVertex.h" + +namespace Ogre +{ + class SurfacePatchRenderable : public SimpleRenderable + { + public: + SurfacePatchRenderable(const String& material = "BaseWhiteNoLighting"); + ~SurfacePatchRenderable(void); + + void setGeometry(std::vector verticesToSet, std::vector indicesToSet); + + Real getSquaredViewDepth(const Camera *cam) const; + Real getBoundingRadius(void) const; + protected: + //void getWorldTransforms(Matrix4 *xform) const; + const Quaternion &getWorldOrientation(void) const; + const Vector3 &getWorldPosition(void) const; + }; +} + +#endif /* __SurfacePatchRenderable_H__ */ \ No newline at end of file diff --git a/include/Triangle.h b/include/SurfaceTriangle.h similarity index 84% rename from include/Triangle.h rename to include/SurfaceTriangle.h index 9a95dff5..ae40b0a1 100644 --- a/include/Triangle.h +++ b/include/SurfaceTriangle.h @@ -17,8 +17,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ******************************************************************************/ -#ifndef __Triangle_H__ -#define __Triangle_H__ +#ifndef __SurfaceTriangle_H__ +#define __SurfaceTriangle_H__ #include "OgrePrerequisites.h" @@ -26,7 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. namespace Ogre { - class Triangle + class SurfaceTriangle { public: @@ -35,14 +35,14 @@ namespace Ogre ulong v1; ulong v2; - Triangle() + SurfaceTriangle() :v0(0) ,v1(0) ,v2(0) { } - Triangle(uint v0ToSet, uint v1ToSet, uint v2ToSet) + SurfaceTriangle(uint v0ToSet, uint v1ToSet, uint v2ToSet) :v0(v0ToSet) ,v1(v1ToSet) ,v2(v2ToSet) diff --git a/include/Vertex.h b/include/SurfaceVertex.h similarity index 86% rename from include/Vertex.h rename to include/SurfaceVertex.h index 7f60ca61..034d4da1 100644 --- a/include/Vertex.h +++ b/include/SurfaceVertex.h @@ -17,8 +17,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ******************************************************************************/ -#ifndef __Vertex_H__ -#define __Vertex_H__ +#ifndef __SurfaceVertex_H__ +#define __SurfaceVertex_H__ #include "OgrePrerequisites.h" @@ -26,19 +26,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. namespace Ogre { - class Vertex + class SurfaceVertex { public: Vector3 position; Vector3 normal; float alpha; - Vertex(Vector3 positionToSet) + SurfaceVertex(Vector3 positionToSet) :position(positionToSet) { } - Vertex(Vector3 positionToSet, Vector3 normalToSet) + SurfaceVertex(Vector3 positionToSet, Vector3 normalToSet) :position(positionToSet) ,normal(normalToSet) { diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index b8109990..8d45f2d0 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -19,7 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "MarchingCubesTables.h" #include "MaterialMapManager.h" -#include "Vertex.h" +#include "SurfaceVertex.h" #include "PolyVoxSceneManager.h" #include "VolumeIterator.h" #include "VolumeManager.h" @@ -143,7 +143,7 @@ namespace Ogre { surfaceUpToDate[blockX][blockY][blockZ] = false; - for(std::map::iterator iterSurfaces = m_mapSurfaces[blockX][blockY][blockZ].begin(); iterSurfaces != m_mapSurfaces[blockX][blockY][blockZ].end(); ++iterSurfaces) + for(std::map::iterator iterSurfaces = m_mapSurfaces[blockX][blockY][blockZ].begin(); iterSurfaces != m_mapSurfaces[blockX][blockY][blockZ].end(); ++iterSurfaces) { delete iterSurfaces->second; } @@ -332,8 +332,8 @@ namespace Ogre if(surfaceUpToDate[regionX][regionY][regionZ] == false) { //Generate the surface - std::vector< std::vector > vertexData; - std::vector< std::vector< Triangle> > indexData; + std::vector< std::vector > vertexData; + std::vector< std::vector > indexData; generateMeshDataForRegion(regionX,regionY,regionZ,vertexData,indexData); //If a SceneNode doesn't exist in this position then create one. @@ -357,11 +357,11 @@ namespace Ogre { continue; } - std::map::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(meshCt); + std::map::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(meshCt); if(iterSurface == m_mapSurfaces[regionX][regionY][regionZ].end()) { //We have to create the surface - Surface* surface = new Surface(materialMap->getMaterialAtIndex(meshCt)); + SurfacePatchRenderable* surface = new SurfacePatchRenderable(materialMap->getMaterialAtIndex(meshCt)); surface->setGeometry(vertexData[meshCt],indexData[meshCt]); m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(meshCt,surface)); @@ -532,7 +532,7 @@ namespace Ogre } } - void PolyVoxSceneManager::generateMeshDataForRegion(const uint regionX, const uint regionY, const uint regionZ, std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const + void PolyVoxSceneManager::generateMeshDataForRegion(const uint regionX, const uint regionY, const uint regionZ, std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const { //LogManager::getSingleton().logMessage("Generating Mesh Data"); /*LogManager::getSingleton().logMessage("HERE"); @@ -753,7 +753,7 @@ namespace Ogre unsigned int vertexScaledY; unsigned int vertexScaledZ; - Triangle triangle; //Triangle to be created... + SurfaceTriangle triangle; //Triangle to be created... for(std::set::iterator materialsIter = materials.begin(); materialsIter != materials.end(); ++materialsIter) { @@ -771,12 +771,12 @@ namespace Ogre if((index == -1)) { //Add the vertex - Vertex vertex(vertex0); + SurfaceVertex vertex(vertex0); if(material0 == material) vertex.alpha = 1.0; else vertex.alpha = 0.0; - vertexData[material].push_back(Vertex(vertex)); + vertexData[material].push_back(vertex); triangle.v0 = vertexData[material].size()-1; vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ][material] = vertexData[material].size()-1; } @@ -798,12 +798,12 @@ namespace Ogre if((index == -1)) { //Add the vertex - Vertex vertex(vertex1); + SurfaceVertex vertex(vertex1); if(material1 == material) vertex.alpha = 1.0; else vertex.alpha = 0.0; - vertexData[material].push_back(Vertex(vertex)); + vertexData[material].push_back(vertex); triangle.v1 = vertexData[material].size()-1; vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ][material] = vertexData[material].size()-1; } @@ -825,12 +825,12 @@ namespace Ogre if((index == -1)) { //Add the vertex - Vertex vertex(vertex2); + SurfaceVertex vertex(vertex2); if(material2 == material) vertex.alpha = 1.0; else vertex.alpha = 0.0; - vertexData[material].push_back(Vertex(vertex)); + vertexData[material].push_back(vertex); triangle.v2 = vertexData[material].size()-1; vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ][material] = vertexData[material].size()-1; } @@ -948,7 +948,7 @@ namespace Ogre //Ogre::LogManager::getSingleton().logMessage("After merge: vertices = " + Ogre::StringConverter::toString(vertexData[4].size()) + ", triangles = " + Ogre::StringConverter::toString(indexData[4].size()/3)); } - void PolyVoxSceneManager::mergeVertices6(std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const + void PolyVoxSceneManager::mergeVertices6(std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const { for(uint material = 1; material < 256; ++material) { @@ -1041,8 +1041,8 @@ namespace Ogre } //Delete degenerate triangles - std::vector resultingVertexData; - std::vector resultingIndexData; + std::vector resultingVertexData; + std::vector resultingIndexData; for(uint triCt = 0; triCt < indexData[material].size(); triCt++) { if((indexData[material][triCt].v0 != indexData[material][triCt].v1) || (indexData[material][triCt].v1 != indexData[material][triCt].v2)) @@ -1053,7 +1053,7 @@ namespace Ogre resultingVertexData.push_back(vertexData[material][indexData[material][triCt].v1]); resultingVertexData.push_back(vertexData[material][indexData[material][triCt].v2]); - Triangle triangle(pos, pos+1, pos+2); + SurfaceTriangle triangle(pos, pos+1, pos+2); resultingIndexData.push_back(triangle); } } @@ -1062,7 +1062,7 @@ namespace Ogre } } - bool PolyVoxSceneManager::verticesArePlanar3(uint uCurrentVertex, std::set setConnectedVertices, std::vector& vertexData) const + bool PolyVoxSceneManager::verticesArePlanar3(uint uCurrentVertex, std::set setConnectedVertices, std::vector& vertexData) const { //FIXME - specially handle the case where they are all the same. //This is happening a lot after many vertices have been moved round? diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp new file mode 100644 index 00000000..e69de29b diff --git a/source/Surface.cpp b/source/SurfacePatchRenderable.cpp similarity index 85% rename from source/Surface.cpp rename to source/SurfacePatchRenderable.cpp index 01d6026a..0c997142 100644 --- a/source/Surface.cpp +++ b/source/SurfacePatchRenderable.cpp @@ -1,10 +1,10 @@ -#include "Surface.h" +#include "SurfacePatchRenderable.h" #include "OgreVertexIndexData.h" namespace Ogre { - Surface::Surface(const String& material) + SurfacePatchRenderable::SurfacePatchRenderable(const String& material) { mRenderOp.vertexData = new VertexData(); mRenderOp.indexData = new IndexData(); @@ -12,13 +12,13 @@ namespace Ogre this->setMaterial(material); } - Surface::~Surface(void) + SurfacePatchRenderable::~SurfacePatchRenderable(void) { delete mRenderOp.vertexData; delete mRenderOp.indexData; } - void Surface::setGeometry(std::vector verticesToSet, std::vector indicesToSet) + void SurfacePatchRenderable::setGeometry(std::vector verticesToSet, std::vector indicesToSet) { //LogManager::getSingleton().logMessage("In setGeometry()"); @@ -115,7 +115,7 @@ namespace Ogre ibuf->unlock(); } - Real Surface::getSquaredViewDepth(const Camera *cam) const + Real SurfacePatchRenderable::getSquaredViewDepth(const Camera *cam) const { Vector3 vMin, vMax, vMid, vDist; vMin = mBox.getMinimum(); @@ -126,7 +126,7 @@ namespace Ogre return vDist.squaredLength(); } - Real Surface::getBoundingRadius(void) const + Real SurfacePatchRenderable::getBoundingRadius(void) const { return Math::Sqrt((std::max)(mBox.getMaximum().squaredLength(), mBox.getMinimum().squaredLength())); //return mRadius; @@ -138,12 +138,12 @@ namespace Ogre *xform = Matrix4::IDENTITY; } */ - const Quaternion &Surface::getWorldOrientation(void) const + const Quaternion &SurfacePatchRenderable::getWorldOrientation(void) const { return Quaternion::IDENTITY; } - const Vector3 &Surface::getWorldPosition(void) const + const Vector3 &SurfacePatchRenderable::getWorldPosition(void) const { return Vector3::ZERO; }