Refactoring mesh generation code.

This commit is contained in:
David Williams 2007-10-06 18:31:37 +00:00
parent e276ada7ce
commit 8137b1eb46
8 changed files with 58 additions and 51 deletions

View File

@ -2,14 +2,15 @@ PROJECT(PolyVoxSceneManager)
#Projects source files #Projects source files
SET(SRC_FILES SET(SRC_FILES
source/AbstractSurfacePatch.cpp
source/Block.cpp source/Block.cpp
source/HalfEdgeSurfacePatch.cpp
source/MarchingCubesTables.cpp source/MarchingCubesTables.cpp
source/MaterialMap.cpp source/MaterialMap.cpp
source/MaterialMapManager.cpp source/MaterialMapManager.cpp
source/MaterialMapSerializer.cpp source/MaterialMapSerializer.cpp
source/PolyVoxSceneManager.cpp source/PolyVoxSceneManager.cpp
source/SurfaceEdge.cpp source/SurfaceEdge.cpp
source/SurfacePatch.cpp
source/SurfacePatchRenderable.cpp source/SurfacePatchRenderable.cpp
source/SurfaceTriangle.cpp source/SurfaceTriangle.cpp
source/SurfaceVertex.cpp source/SurfaceVertex.cpp
@ -21,8 +22,10 @@ SET(SRC_FILES
#Projects headers files #Projects headers files
SET(INC_FILES SET(INC_FILES
include/AbstractSurfacePatch.h
include/Block.h include/Block.h
include/Constants.h include/Constants.h
include/HalfEdgeSurfacePatch.h
include/IntegralVector3.h include/IntegralVector3.h
include/MarchingCubesTables.h include/MarchingCubesTables.h
include/MaterialMap.h include/MaterialMap.h
@ -30,7 +33,6 @@ SET(INC_FILES
include/MaterialMapSerializer.h include/MaterialMapSerializer.h
include/PolyVoxSceneManager.h include/PolyVoxSceneManager.h
include/SurfaceEdge.h include/SurfaceEdge.h
include/SurfacePatch.h
include/SurfaceTypes.h include/SurfaceTypes.h
include/SurfacePatchRenderable.h include/SurfacePatchRenderable.h
include/SurfaceTriangle.h include/SurfaceTriangle.h

View File

@ -4,6 +4,7 @@
#include <set> #include <set>
#include <list> #include <list>
#include "AbstractSurfacePatch.h"
#include "IntegralVector3.h" #include "IntegralVector3.h"
#include "SurfaceTypes.h" #include "SurfaceTypes.h"
#include "VolumeIterator.h" #include "VolumeIterator.h"
@ -11,7 +12,7 @@
namespace Ogre namespace Ogre
{ {
class SurfacePatch class SurfacePatch : public AbstractSurfacePatch
{ {
public: public:
SurfacePatch(); SurfacePatch();
@ -21,9 +22,7 @@ namespace Ogre
SurfaceEdgeIterator getEdgesBegin(void); SurfaceEdgeIterator getEdgesBegin(void);
SurfaceEdgeIterator getEdgesEnd(void); SurfaceEdgeIterator getEdgesEnd(void);
SurfaceTriangleIterator getTrianglesBegin(void); SurfaceTriangleIterator getTrianglesBegin(void);
SurfaceTriangleIterator getTrianglesEnd(void); SurfaceTriangleIterator getTrianglesEnd(void);
SurfaceVertexIterator getVerticesBegin(void);
SurfaceVertexIterator getVerticesEnd(void);
//Users of the class might want these for debugging or info purposes. //Users of the class might want these for debugging or info purposes.
uint getNoOfEdges(void) const; uint getNoOfEdges(void) const;
@ -42,8 +41,7 @@ namespace Ogre
private: private:
std::set<SurfaceVertex> m_listVertices;
std::set<SurfaceTriangle> m_listTriangles; std::set<SurfaceTriangle> m_listTriangles;
std::set<SurfaceEdge> m_listEdges; std::set<SurfaceEdge> m_listEdges;

View File

@ -26,7 +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 "AbstractSurfacePatch.h"
#include "TypeDef.h" #include "TypeDef.h"
#include "Volume.h" #include "Volume.h"
#include "SurfaceVertex.h" #include "SurfaceVertex.h"
@ -81,7 +81,7 @@ namespace Ogre
void generateLevelVolume(void); void generateLevelVolume(void);
void generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ, std::map<uchar, SurfacePatch>& result) const; std::map<uchar, AbstractSurfacePatch*> generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ) const;
void doRegionGrowing(uint xStart, uint yStart, uint zStart, uchar value); void doRegionGrowing(uint xStart, uint yStart, uint zStart, uchar value);

View File

@ -4,9 +4,9 @@
#include "Ogre.h" #include "Ogre.h"
#include <vector> #include <vector>
#include "SurfacePatch.h" #include "AbstractSurfacePatch.h"
#include "SurfaceTriangle.h" //#include "SurfaceTriangle.h"
#include "SurfaceVertex.h" //#include "SurfaceVertex.h"
namespace Ogre namespace Ogre
{ {
@ -16,11 +16,11 @@ namespace Ogre
class SurfacePatchRenderable : public SimpleRenderable class SurfacePatchRenderable : public SimpleRenderable
{ {
public: public:
SurfacePatchRenderable(SurfacePatch& patchToRender, const String& material = "BaseWhiteNoLighting"); SurfacePatchRenderable(AbstractSurfacePatch* patchToRender, const String& material = "BaseWhiteNoLighting");
~SurfacePatchRenderable(void); ~SurfacePatchRenderable(void);
void updateWithNewSurfacePatch(SurfacePatch& patchToRender); void updateWithNewSurfacePatch(AbstractSurfacePatch* patchToRender);
void setGeometry(SurfacePatch& patchToRender); void setGeometry(AbstractSurfacePatch* patchToRender);
Real getSquaredViewDepth(const Camera *cam) const; Real getSquaredViewDepth(const Camera *cam) const;
Real getBoundingRadius(void) const; Real getBoundingRadius(void) const;

View File

@ -1,6 +1,8 @@
#ifndef __SurfaceTypes_H__ #ifndef __SurfaceTypes_H__
#define __SurfaceTypes_H__ #define __SurfaceTypes_H__
#include <set>
namespace Ogre namespace Ogre
{ {
class SurfaceVertex; class SurfaceVertex;

View File

@ -1,4 +1,4 @@
#include "SurfacePatch.h" #include "HalfEdgeSurfacePatch.h"
#include "Constants.h" #include "Constants.h"
#include "SurfaceVertex.h" #include "SurfaceVertex.h"
@ -41,17 +41,7 @@ namespace Ogre
SurfaceTriangleIterator SurfacePatch::getTrianglesEnd(void) SurfaceTriangleIterator SurfacePatch::getTrianglesEnd(void)
{ {
return m_listTriangles.end(); return m_listTriangles.end();
} }
SurfaceVertexIterator SurfacePatch::getVerticesBegin(void)
{
return m_listVertices.begin();
}
SurfaceVertexIterator SurfacePatch::getVerticesEnd(void)
{
return m_listVertices.end();
}
uint SurfacePatch::getNoOfEdges(void) const uint SurfacePatch::getNoOfEdges(void) const
{ {

View File

@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "MaterialMapManager.h" #include "MaterialMapManager.h"
#include "SurfaceVertex.h" #include "SurfaceVertex.h"
#include "SurfaceEdge.h" #include "SurfaceEdge.h"
#include "HalfEdgeSurfacePatch.h"
#include "PolyVoxSceneManager.h" #include "PolyVoxSceneManager.h"
#include "VolumeIterator.h" #include "VolumeIterator.h"
#include "VolumeManager.h" #include "VolumeManager.h"
@ -254,8 +255,7 @@ namespace Ogre
//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;
std::map<uchar, SurfacePatch> mapSurfacePatch; std::map<uchar, AbstractSurfacePatch*> mapSurfacePatch = generateMeshDataForRegion(regionX,regionY,regionZ);
generateMeshDataForRegion(regionX,regionY,regionZ, mapSurfacePatch);
//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));
@ -273,7 +273,7 @@ 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) for(std::map<uchar, AbstractSurfacePatch*>::iterator iterSurfacePatch = mapSurfacePatch.begin(); iterSurfacePatch != mapSurfacePatch.end(); ++iterSurfacePatch)
{ {
/*std::vector<SurfaceVertex> vertexData; /*std::vector<SurfaceVertex> vertexData;
std::vector<uint> indexData; std::vector<uint> indexData;
@ -460,8 +460,10 @@ namespace Ogre
} }
} }
void PolyVoxSceneManager::generateMeshDataForRegion(const uint regionX, const uint regionY, const uint regionZ, std::map<uchar, SurfacePatch>& result) const std::map<uchar, AbstractSurfacePatch*> PolyVoxSceneManager::generateMeshDataForRegion(const uint regionX, const uint regionY, const uint regionZ) const
{ {
std::map<uchar, AbstractSurfacePatch*> surfacePatchMapResult;
//LogManager::getSingleton().logMessage("Generating Mesh Data"); //LogManager::getSingleton().logMessage("Generating Mesh Data");
//First and last voxels in the region //First and last voxels in the region
const uint firstX = regionX * OGRE_REGION_SIDE_LENGTH; const uint firstX = regionX * OGRE_REGION_SIDE_LENGTH;
@ -618,6 +620,19 @@ 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]];
if(surfacePatchMapResult.find(material0) == surfacePatchMapResult.end())
{
surfacePatchMapResult.insert(std::make_pair(material0,new SurfacePatch));
}
if(surfacePatchMapResult.find(material1) == surfacePatchMapResult.end())
{
surfacePatchMapResult.insert(std::make_pair(material1,new SurfacePatch));
}
if(surfacePatchMapResult.find(material2) == surfacePatchMapResult.end())
{
surfacePatchMapResult.insert(std::make_pair(material2,new SurfacePatch));
}
SurfaceVertex surfaceVertex0Alpha1(vertex0,1.0); SurfaceVertex surfaceVertex0Alpha1(vertex0,1.0);
SurfaceVertex surfaceVertex1Alpha1(vertex1,1.0); SurfaceVertex surfaceVertex1Alpha1(vertex1,1.0);
SurfaceVertex surfaceVertex2Alpha1(vertex2,1.0); SurfaceVertex surfaceVertex2Alpha1(vertex2,1.0);
@ -625,7 +640,7 @@ namespace Ogre
//If all the materials are the same, we just need one triangle for that material with all the alphas set high. //If all the materials are the same, we just need one triangle for that material with all the alphas set high.
if((material0 == material1) && (material1 == material2)) if((material0 == material1) && (material1 == material2))
{ {
result[material0].addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1); surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha1);
} }
//If there not all the same, we need one triangle for each unique material. //If there not all the same, we need one triangle for each unique material.
//We'll also need some vertices with low alphas for blending. //We'll also need some vertices with low alphas for blending.
@ -637,24 +652,24 @@ namespace Ogre
if(material0 == material1) if(material0 == material1)
{ {
result[material0].addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha0); surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha1, surfaceVertex2Alpha0);
result[material2].addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha0, surfaceVertex2Alpha1); surfacePatchMapResult[material2]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha0, surfaceVertex2Alpha1);
} }
else if(material1 == material2) else if(material1 == material2)
{ {
result[material1].addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha1); surfacePatchMapResult[material1]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha1);
result[material0].addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha0); surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha0);
} }
else if(material2 == material0) else if(material2 == material0)
{ {
result[material0].addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha1); surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha1);
result[material1].addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha0); surfacePatchMapResult[material1]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha0);
} }
else else
{ {
result[material0].addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha0); surfacePatchMapResult[material0]->addTriangle(surfaceVertex0Alpha1, surfaceVertex1Alpha0, surfaceVertex2Alpha0);
result[material1].addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha0); surfacePatchMapResult[material1]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha1, surfaceVertex2Alpha0);
result[material2].addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha0, surfaceVertex2Alpha1); surfacePatchMapResult[material2]->addTriangle(surfaceVertex0Alpha0, surfaceVertex1Alpha0, surfaceVertex2Alpha1);
} }
} }
}//For each triangle }//For each triangle
@ -663,11 +678,11 @@ namespace Ogre
//FIXME - can it happen that we have no vertices or triangles? Should exit early? //FIXME - can it happen that we have no vertices or triangles? Should exit early?
for(std::map<uchar, SurfacePatch>::iterator iterPatch = result.begin(); iterPatch != result.end(); ++iterPatch) for(std::map<uchar, AbstractSurfacePatch*>::iterator iterPatch = surfacePatchMapResult.begin(); iterPatch != surfacePatchMapResult.end(); ++iterPatch)
{ {
SurfaceVertexIterator iterSurfaceVertex = iterPatch->second.getVerticesBegin(); SurfaceVertexIterator iterSurfaceVertex = iterPatch->second->getVerticesBegin();
while(iterSurfaceVertex != iterPatch->second.getVerticesEnd()) while(iterSurfaceVertex != iterPatch->second->getVerticesEnd())
{ {
Vector3 tempNormal = computeNormal((iterSurfaceVertex->getPosition() + offset).toOgreVector3()/2.0f, CENTRAL_DIFFERENCE); Vector3 tempNormal = computeNormal((iterSurfaceVertex->getPosition() + offset).toOgreVector3()/2.0f, CENTRAL_DIFFERENCE);
const_cast<SurfaceVertex&>(*iterSurfaceVertex).setNormal(tempNormal); const_cast<SurfaceVertex&>(*iterSurfaceVertex).setNormal(tempNormal);
@ -684,7 +699,7 @@ namespace Ogre
//LogManager::getSingleton().logMessage("Finished Generating Mesh Data"); //LogManager::getSingleton().logMessage("Finished Generating Mesh Data");
//return result; return surfacePatchMapResult;
} }
Vector3 PolyVoxSceneManager::computeNormal(const Vector3& position, NormalGenerationMethod normalGenerationMethod) const Vector3 PolyVoxSceneManager::computeNormal(const Vector3& position, NormalGenerationMethod normalGenerationMethod) const

View File

@ -7,7 +7,7 @@
namespace Ogre namespace Ogre
{ {
SurfacePatchRenderable::SurfacePatchRenderable(SurfacePatch& patchToRender, const String& material) SurfacePatchRenderable::SurfacePatchRenderable(AbstractSurfacePatch* patchToRender, const String& material)
{ {
//Set up what we can of the vertex data //Set up what we can of the vertex data
mRenderOp.vertexData = new VertexData(); mRenderOp.vertexData = new VertexData();
@ -40,16 +40,16 @@ namespace Ogre
delete mRenderOp.indexData; delete mRenderOp.indexData;
} }
void SurfacePatchRenderable::updateWithNewSurfacePatch(SurfacePatch& patchToRender) void SurfacePatchRenderable::updateWithNewSurfacePatch(AbstractSurfacePatch* patchToRender)
{ {
setGeometry(patchToRender); setGeometry(patchToRender);
} }
void SurfacePatchRenderable::setGeometry(SurfacePatch& patchToRender) void SurfacePatchRenderable::setGeometry(AbstractSurfacePatch* patchToRender)
{ {
std::vector<SurfaceVertex> vecVertices; std::vector<SurfaceVertex> vecVertices;
std::vector<ushort> vecIndices; std::vector<ushort> vecIndices;
patchToRender.fillVertexAndIndexData(vecVertices,vecIndices); patchToRender->fillVertexAndIndexData(vecVertices,vecIndices);
//Initialization stuff //Initialization stuff
mRenderOp.vertexData->vertexCount = vecVertices.size(); mRenderOp.vertexData->vertexCount = vecVertices.size();