Refactoring work...

This commit is contained in:
David Williams 2007-08-19 17:09:20 +00:00
parent 7bd433cbf3
commit 47bb4b016d
4 changed files with 108 additions and 13 deletions

View File

@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "MaterialMap.h" #include "MaterialMap.h"
#include "SurfacePatchRenderable.h" #include "SurfacePatchRenderable.h"
#include "SurfaceTriangle.h" #include "SurfaceTriangle.h"
#include "SurfacePatch.h"
#include "TypeDef.h" #include "TypeDef.h"
#include "Volume.h" #include "Volume.h"
#include "SurfaceVertex.h" #include "SurfaceVertex.h"
@ -80,7 +81,7 @@ namespace Ogre
void generateLevelVolume(void); void generateLevelVolume(void);
void generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ, std::vector< std::vector<SurfaceVertex> >& vertexData, std::vector< std::vector<SurfaceTriangle> >& indexData) const; std::map<uchar, SurfacePatch> generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ) const;
void mergeVertices6(std::vector< std::vector<SurfaceVertex> >& vertexData, std::vector< std::vector<SurfaceTriangle> >& indexData) const; void mergeVertices6(std::vector< std::vector<SurfaceVertex> >& vertexData, std::vector< std::vector<SurfaceTriangle> >& indexData) const;
bool verticesArePlanar3(uint uCurrentVertex, std::set<uint> setConnectedVertices, std::vector<SurfaceVertex>& vertexData) const; bool verticesArePlanar3(uint uCurrentVertex, std::set<uint> setConnectedVertices, std::vector<SurfaceVertex>& vertexData) const;

View File

@ -0,0 +1,28 @@
#ifndef __SurfacePatch_H__
#define __SurfacePatch_H__
#include <vector>
#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<SurfaceVertex>& getVertexArray();
const std::vector<SurfaceTriangle>& getTriangleArray();
private:
std::vector<SurfaceVertex> m_vecVertices;
std::vector<SurfaceTriangle> m_vecTriangles;
};
}
#endif /* __SurfacePatch_H__ */

View File

@ -332,9 +332,9 @@ namespace Ogre
if(surfaceUpToDate[regionX][regionY][regionZ] == false) if(surfaceUpToDate[regionX][regionY][regionZ] == false)
{ {
//Generate the surface //Generate the surface
std::vector< std::vector<SurfaceVertex> > vertexData; //std::vector< std::vector<SurfaceVertex> > vertexData;
std::vector< std::vector<SurfaceTriangle> > indexData; //std::vector< std::vector<SurfaceTriangle> > indexData;
generateMeshDataForRegion(regionX,regionY,regionZ,vertexData,indexData); std::map<uchar, SurfacePatch> mapSurfacePatch = generateMeshDataForRegion(regionX,regionY,regionZ);
//If a SceneNode doesn't exist in this position then create one. //If a SceneNode doesn't exist in this position then create one.
std::map<UIntVector3, SceneNode*>::iterator iterSceneNode = sceneNodes.find(UIntVector3(regionX,regionY,regionZ)); std::map<UIntVector3, SceneNode*>::iterator iterSceneNode = sceneNodes.find(UIntVector3(regionX,regionY,regionZ));
@ -351,27 +351,30 @@ namespace Ogre
} }
//For each surface attach it to the scene node. //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<uchar, SurfacePatch>::iterator iterSurfacePatch = mapSurfacePatch.begin(); iterSurfacePatch != mapSurfacePatch.end(); ++iterSurfacePatch)
{ {
if(indexData[meshCt].size() == 0) /*if(indexData[meshCt].size() == 0)
{ {
continue; continue;
} }*/
std::map<uchar,SurfacePatchRenderable*>::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(meshCt); std::map<uchar,SurfacePatchRenderable*>::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(iterSurfacePatch->first);
if(iterSurface == m_mapSurfaces[regionX][regionY][regionZ].end()) if(iterSurface == m_mapSurfaces[regionX][regionY][regionZ].end())
{ {
//We have to create the surface //We have to create the surface
SurfacePatchRenderable* surface = new SurfacePatchRenderable(materialMap->getMaterialAtIndex(meshCt)); SurfacePatchRenderable* surface = new SurfacePatchRenderable(materialMap->getMaterialAtIndex(iterSurfacePatch->first));
surface->setGeometry(vertexData[meshCt],indexData[meshCt]); //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); sceneNode->attachObject(surface);
} }
else else
{ {
//We just update the existing surface //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); 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<SurfaceVertex> >& vertexData, std::vector< std::vector<SurfaceTriangle> >& indexData) const std::map<uchar, SurfacePatch> PolyVoxSceneManager::generateMeshDataForRegion(const uint regionX, const uint regionY, const uint regionZ) const
{ {
//LogManager::getSingleton().logMessage("Generating Mesh Data"); //LogManager::getSingleton().logMessage("Generating Mesh Data");
/*LogManager::getSingleton().logMessage("HERE"); /*LogManager::getSingleton().logMessage("HERE");
@ -551,6 +554,9 @@ namespace Ogre
} }
LogManager::getSingleton().logMessage("DONE");*/ LogManager::getSingleton().logMessage("DONE");*/
//The vertex and index data //The vertex and index data
std::vector< std::vector<SurfaceVertex> > vertexData;
std::vector< std::vector<SurfaceTriangle> > indexData;
vertexData.resize(256); vertexData.resize(256);
indexData.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)); //Ogre::LogManager::getSingleton().logMessage("Before merge: vertices = " + Ogre::StringConverter::toString(vertexData[4].size()) + ", triangles = " + Ogre::StringConverter::toString(indexData[4].size()/3));
//mergeVertices6(vertexData, indexData); //mergeVertices6(vertexData, indexData);
//Ogre::LogManager::getSingleton().logMessage("After merge: vertices = " + Ogre::StringConverter::toString(vertexData[4].size()) + ", triangles = " + Ogre::StringConverter::toString(indexData[4].size()/3)); //Ogre::LogManager::getSingleton().logMessage("After merge: vertices = " + Ogre::StringConverter::toString(vertexData[4].size()) + ", triangles = " + Ogre::StringConverter::toString(indexData[4].size()/3));
std::map<uchar, SurfacePatch> 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<SurfaceVertex> >& vertexData, std::vector< std::vector<SurfaceTriangle> >& indexData) const void PolyVoxSceneManager::mergeVertices6(std::vector< std::vector<SurfaceVertex> >& vertexData, std::vector< std::vector<SurfaceTriangle> >& indexData) const

View File

@ -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<SurfaceVertex>& SurfacePatch::getVertexArray()
{
return m_vecVertices;
}
const std::vector<SurfaceTriangle>& SurfacePatch::getTriangleArray()
{
return m_vecTriangles;
}
}