diff --git a/include/PolyVoxSceneManager.h b/include/PolyVoxSceneManager.h index 68501f84..20e58433 100644 --- a/include/PolyVoxSceneManager.h +++ b/include/PolyVoxSceneManager.h @@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "MaterialMap.h" #include "SurfacePatchRenderable.h" #include "SurfaceTriangle.h" +#include "SurfacePatch.h" #include "TypeDef.h" #include "Volume.h" #include "SurfaceVertex.h" @@ -80,7 +81,7 @@ namespace Ogre void generateLevelVolume(void); - void generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ, std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const; + std::map generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ) 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; diff --git a/include/SurfacePatch.h b/include/SurfacePatch.h index e69de29b..71946eb8 100644 --- a/include/SurfacePatch.h +++ b/include/SurfacePatch.h @@ -0,0 +1,28 @@ +#ifndef __SurfacePatch_H__ +#define __SurfacePatch_H__ + +#include + +#include "SurfaceVertex.h" +#include "SurfaceTriangle.h" + +namespace Ogre +{ + class SurfacePatch + { + public: + SurfacePatch(); + ~SurfacePatch(); + + void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2); + + const std::vector& getVertexArray(); + const std::vector& getTriangleArray(); + + private: + std::vector m_vecVertices; + std::vector m_vecTriangles; + }; +} + +#endif /* __SurfacePatch_H__ */ \ No newline at end of file diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index 8d45f2d0..ea1c0a32 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -332,9 +332,9 @@ namespace Ogre if(surfaceUpToDate[regionX][regionY][regionZ] == false) { //Generate the surface - std::vector< std::vector > vertexData; - std::vector< std::vector > indexData; - generateMeshDataForRegion(regionX,regionY,regionZ,vertexData,indexData); + //std::vector< std::vector > vertexData; + //std::vector< std::vector > indexData; + std::map mapSurfacePatch = generateMeshDataForRegion(regionX,regionY,regionZ); //If a SceneNode doesn't exist in this position then create one. std::map::iterator iterSceneNode = sceneNodes.find(UIntVector3(regionX,regionY,regionZ)); @@ -351,27 +351,30 @@ namespace Ogre } //For each surface attach it to the scene node. - for(uint meshCt = 1; meshCt < 256; ++meshCt) + //for(uint meshCt = 1; meshCt < 256; ++meshCt) + for(std::map::iterator iterSurfacePatch = mapSurfacePatch.begin(); iterSurfacePatch != mapSurfacePatch.end(); ++iterSurfacePatch) { - if(indexData[meshCt].size() == 0) + /*if(indexData[meshCt].size() == 0) { continue; - } - std::map::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(meshCt); + }*/ + std::map::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(iterSurfacePatch->first); if(iterSurface == m_mapSurfaces[regionX][regionY][regionZ].end()) { //We have to create the surface - SurfacePatchRenderable* surface = new SurfacePatchRenderable(materialMap->getMaterialAtIndex(meshCt)); - surface->setGeometry(vertexData[meshCt],indexData[meshCt]); + SurfacePatchRenderable* surface = new SurfacePatchRenderable(materialMap->getMaterialAtIndex(iterSurfacePatch->first)); + //surface->setGeometry(vertexData[meshCt],indexData[meshCt]); + surface->setGeometry(iterSurfacePatch->second.getVertexArray(),iterSurfacePatch->second.getTriangleArray()); - m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(meshCt,surface)); + m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(iterSurfacePatch->first,surface)); sceneNode->attachObject(surface); } else { //We just update the existing surface - iterSurface->second->setGeometry(vertexData[meshCt],indexData[meshCt]); + //iterSurface->second->setGeometry(vertexData[meshCt],indexData[meshCt]); + iterSurface->second->setGeometry(iterSurfacePatch->second.getVertexArray(),iterSurfacePatch->second.getTriangleArray()); sceneNode->attachObject(iterSurface->second); } } @@ -532,7 +535,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 + std::map PolyVoxSceneManager::generateMeshDataForRegion(const uint regionX, const uint regionY, const uint regionZ) const { //LogManager::getSingleton().logMessage("Generating Mesh Data"); /*LogManager::getSingleton().logMessage("HERE"); @@ -551,6 +554,9 @@ namespace Ogre } LogManager::getSingleton().logMessage("DONE");*/ //The vertex and index data + std::vector< std::vector > vertexData; + std::vector< std::vector > indexData; + vertexData.resize(256); indexData.resize(256); @@ -946,6 +952,30 @@ namespace Ogre //Ogre::LogManager::getSingleton().logMessage("Before merge: vertices = " + Ogre::StringConverter::toString(vertexData[4].size()) + ", triangles = " + Ogre::StringConverter::toString(indexData[4].size()/3)); //mergeVertices6(vertexData, indexData); //Ogre::LogManager::getSingleton().logMessage("After merge: vertices = " + Ogre::StringConverter::toString(vertexData[4].size()) + ", triangles = " + Ogre::StringConverter::toString(indexData[4].size()/3)); + + std::map result; + for(uint materialCt = 1; materialCt < 256; materialCt++) + { + if(indexData[materialCt].size() == 0) + { + continue; + } + + SurfacePatch surfacePatch; + for(uint indexCt = 0; indexCt < indexData[materialCt].size(); indexCt++) + { + surfacePatch.addTriangle + ( + vertexData[materialCt][indexData[materialCt][indexCt].v0], + vertexData[materialCt][indexData[materialCt][indexCt].v1], + vertexData[materialCt][indexData[materialCt][indexCt].v2] + ); + } + + result.insert(std::make_pair(materialCt, surfacePatch)); + } + + return result; } void PolyVoxSceneManager::mergeVertices6(std::vector< std::vector >& vertexData, std::vector< std::vector >& indexData) const diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp index e69de29b..bbff6d3c 100644 --- a/source/SurfacePatch.cpp +++ b/source/SurfacePatch.cpp @@ -0,0 +1,36 @@ +#include "SurfacePatch.h" + +namespace Ogre +{ + SurfacePatch::SurfacePatch() + { + } + + SurfacePatch::~SurfacePatch() + { + } + + void SurfacePatch::addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2) + { + SurfaceTriangle triangle; + + m_vecVertices.push_back(v0); + triangle.v0 = m_vecVertices.size()-1; + m_vecVertices.push_back(v1); + triangle.v1 = m_vecVertices.size()-1; + m_vecVertices.push_back(v2); + triangle.v2 = m_vecVertices.size()-1; + + m_vecTriangles.push_back(triangle); + } + + const std::vector& SurfacePatch::getVertexArray() + { + return m_vecVertices; + } + + const std::vector& SurfacePatch::getTriangleArray() + { + return m_vecTriangles; + } +} \ No newline at end of file