Refactoring work...
This commit is contained in:
parent
7bd433cbf3
commit
47bb4b016d
@ -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;
|
||||||
|
|
||||||
|
@ -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__ */
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user