Now have seperate vertex buffers per surface.
This commit is contained in:
parent
eeacb222e1
commit
6e21e971fc
@ -80,7 +80,7 @@ namespace Ogre
|
|||||||
|
|
||||||
void generateLevelVolume(void);
|
void generateLevelVolume(void);
|
||||||
|
|
||||||
void generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ, std::vector<Vertex>& vertexData, std::vector< std::vector<Triangle> >& indexData) const;
|
void generateMeshDataForRegion(uint regionX, uint regionY, uint regionZ, std::vector< std::vector<Vertex> >& vertexData, std::vector< std::vector<Triangle> >& indexData) const;
|
||||||
void mergeVertices5(std::vector<Vertex>& vertexData, std::vector< std::vector<Triangle> >& indexData) const;
|
void mergeVertices5(std::vector<Vertex>& vertexData, std::vector< std::vector<Triangle> >& indexData) const;
|
||||||
bool verticesArePlanar3(uint uCurrentVertex, std::set<uint> setConnectedVertices, std::vector<Vertex>& vertexData) const;
|
bool verticesArePlanar3(uint uCurrentVertex, std::set<uint> setConnectedVertices, std::vector<Vertex>& vertexData) const;
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ namespace Ogre
|
|||||||
if(surfaceUpToDate[regionX][regionY][regionZ] == false)
|
if(surfaceUpToDate[regionX][regionY][regionZ] == false)
|
||||||
{
|
{
|
||||||
//Generate the surface
|
//Generate the surface
|
||||||
std::vector<Vertex> vertexData;
|
std::vector< std::vector<Vertex> > vertexData;
|
||||||
std::vector< std::vector< Triangle> > indexData;
|
std::vector< std::vector< Triangle> > indexData;
|
||||||
generateMeshDataForRegion(regionX,regionY,regionZ,vertexData,indexData);
|
generateMeshDataForRegion(regionX,regionY,regionZ,vertexData,indexData);
|
||||||
|
|
||||||
@ -362,7 +362,7 @@ namespace Ogre
|
|||||||
{
|
{
|
||||||
//We have to create the surface
|
//We have to create the surface
|
||||||
Surface* surface = new Surface(materialMap->getMaterialAtIndex(meshCt));
|
Surface* surface = new Surface(materialMap->getMaterialAtIndex(meshCt));
|
||||||
surface->setGeometry(vertexData,indexData[meshCt]);
|
surface->setGeometry(vertexData[meshCt],indexData[meshCt]);
|
||||||
|
|
||||||
m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(meshCt,surface));
|
m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(meshCt,surface));
|
||||||
|
|
||||||
@ -371,11 +371,11 @@ namespace Ogre
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//We just update the existing surface
|
//We just update the existing surface
|
||||||
iterSurface->second->setGeometry(vertexData,indexData[meshCt]);
|
iterSurface->second->setGeometry(vertexData[meshCt],indexData[meshCt]);
|
||||||
sceneNode->attachObject(iterSurface->second);
|
sceneNode->attachObject(iterSurface->second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sceneNode->showBoundingBox(true);
|
//sceneNode->showBoundingBox(true);
|
||||||
surfaceUpToDate[regionX][regionY][regionZ] = true;
|
surfaceUpToDate[regionX][regionY][regionZ] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -532,7 +532,7 @@ namespace Ogre
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolyVoxSceneManager::generateMeshDataForRegion(const uint regionX, const uint regionY, const uint regionZ, std::vector<Vertex>& vertexData, std::vector< std::vector<Triangle> >& indexData) const
|
void PolyVoxSceneManager::generateMeshDataForRegion(const uint regionX, const uint regionY, const uint regionZ, std::vector< std::vector<Vertex> >& vertexData, std::vector< std::vector<Triangle> >& indexData) const
|
||||||
{
|
{
|
||||||
//LogManager::getSingleton().logMessage("Generating Mesh Data");
|
//LogManager::getSingleton().logMessage("Generating Mesh Data");
|
||||||
/*LogManager::getSingleton().logMessage("HERE");
|
/*LogManager::getSingleton().logMessage("HERE");
|
||||||
@ -551,11 +551,11 @@ namespace Ogre
|
|||||||
}
|
}
|
||||||
LogManager::getSingleton().logMessage("DONE");*/
|
LogManager::getSingleton().logMessage("DONE");*/
|
||||||
//The vertex and index data
|
//The vertex and index data
|
||||||
//vertexData.resize(256);
|
vertexData.resize(256);
|
||||||
indexData.resize(256);
|
indexData.resize(256);
|
||||||
|
|
||||||
//Used later to check if vertex has already been added
|
//Used later to check if vertex has already been added
|
||||||
long int vertexIndices[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1];
|
long int vertexIndices[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][10];
|
||||||
//uchar materialAtPosition[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1]; //FIXME - do we really need this? Can't we just get it from the volume...
|
//uchar materialAtPosition[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1]; //FIXME - do we really need this? Can't we just get it from the volume...
|
||||||
//bool isVertexSharedBetweenMaterials[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1];
|
//bool isVertexSharedBetweenMaterials[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1];
|
||||||
memset(vertexIndices,0xFF,sizeof(vertexIndices)); //0xFF is -1 as two's complement - this may not be portable...
|
memset(vertexIndices,0xFF,sizeof(vertexIndices)); //0xFF is -1 as two's complement - this may not be portable...
|
||||||
@ -741,13 +741,13 @@ namespace Ogre
|
|||||||
vertexScaledY %= OGRE_REGION_SIDE_LENGTH*2+1;
|
vertexScaledY %= OGRE_REGION_SIDE_LENGTH*2+1;
|
||||||
vertexScaledZ %= OGRE_REGION_SIDE_LENGTH*2+1;
|
vertexScaledZ %= OGRE_REGION_SIDE_LENGTH*2+1;
|
||||||
//If a vertex has not yet been added, it's index is -1
|
//If a vertex has not yet been added, it's index is -1
|
||||||
index = vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ];
|
index = vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ][material];
|
||||||
if((index == -1))
|
if((index == -1))
|
||||||
{
|
{
|
||||||
//Add the vertex
|
//Add the vertex
|
||||||
vertexData.push_back(Vertex(vertex0));
|
vertexData[material].push_back(Vertex(vertex0));
|
||||||
triangle.v0 = vertexData.size()-1;
|
triangle.v0 = vertexData[material].size()-1;
|
||||||
vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ] = vertexData.size()-1;
|
vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ][material] = vertexData[material].size()-1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -763,13 +763,13 @@ namespace Ogre
|
|||||||
vertexScaledY %= OGRE_REGION_SIDE_LENGTH*2+1;
|
vertexScaledY %= OGRE_REGION_SIDE_LENGTH*2+1;
|
||||||
vertexScaledZ %= OGRE_REGION_SIDE_LENGTH*2+1;
|
vertexScaledZ %= OGRE_REGION_SIDE_LENGTH*2+1;
|
||||||
//If a vertex has not yet been added, it's index is -1
|
//If a vertex has not yet been added, it's index is -1
|
||||||
index = vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ];
|
index = vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ][material];
|
||||||
if((index == -1))
|
if((index == -1))
|
||||||
{
|
{
|
||||||
//Add the vertex
|
//Add the vertex
|
||||||
vertexData.push_back(Vertex(vertex1));
|
vertexData[material].push_back(Vertex(vertex1));
|
||||||
triangle.v1 = vertexData.size()-1;
|
triangle.v1 = vertexData[material].size()-1;
|
||||||
vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ] = vertexData.size()-1;
|
vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ][material] = vertexData[material].size()-1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -785,13 +785,13 @@ namespace Ogre
|
|||||||
vertexScaledY %= OGRE_REGION_SIDE_LENGTH*2+1;
|
vertexScaledY %= OGRE_REGION_SIDE_LENGTH*2+1;
|
||||||
vertexScaledZ %= OGRE_REGION_SIDE_LENGTH*2+1;
|
vertexScaledZ %= OGRE_REGION_SIDE_LENGTH*2+1;
|
||||||
//If a vertex has not yet been added, it's index is -1
|
//If a vertex has not yet been added, it's index is -1
|
||||||
index = vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ];
|
index = vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ][material];
|
||||||
if((index == -1))
|
if((index == -1))
|
||||||
{
|
{
|
||||||
//Add the vertex
|
//Add the vertex
|
||||||
vertexData.push_back(Vertex(vertex2));
|
vertexData[material].push_back(Vertex(vertex2));
|
||||||
triangle.v2 = vertexData.size()-1;
|
triangle.v2 = vertexData[material].size()-1;
|
||||||
vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ] = vertexData.size()-1;
|
vertexIndices[vertexScaledX][vertexScaledY][vertexScaledZ][material] = vertexData[material].size()-1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -811,11 +811,11 @@ namespace Ogre
|
|||||||
//Compute normals
|
//Compute normals
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
//for(uint materialCt = 0; materialCt < 256; materialCt++)
|
for(uint materialCt = 0; materialCt < 256; materialCt++)
|
||||||
{
|
{
|
||||||
for(uint vertexCt = 0; vertexCt < vertexData/*[materialCt]*/.size(); ++vertexCt)
|
for(uint vertexCt = 0; vertexCt < vertexData[materialCt].size(); ++vertexCt)
|
||||||
{
|
{
|
||||||
const Vector3 vertexPosition = vertexData/*[materialCt]*/[vertexCt].position;
|
const Vector3 vertexPosition = vertexData[materialCt][vertexCt].position;
|
||||||
|
|
||||||
const float posX = vertexPosition.x + static_cast<float>(regionX * OGRE_REGION_SIDE_LENGTH);
|
const float posX = vertexPosition.x + static_cast<float>(regionX * OGRE_REGION_SIDE_LENGTH);
|
||||||
const float posY = vertexPosition.y + static_cast<float>(regionY * OGRE_REGION_SIDE_LENGTH);
|
const float posY = vertexPosition.y + static_cast<float>(regionY * OGRE_REGION_SIDE_LENGTH);
|
||||||
@ -834,19 +834,19 @@ namespace Ogre
|
|||||||
if((posX - floorX) > 0.25) //The result should be 0.0 or 0.5
|
if((posX - floorX) > 0.25) //The result should be 0.0 or 0.5
|
||||||
{
|
{
|
||||||
uchar uCeil = volIter.peekVoxel1px0py0pz() > 0 ? 1 : 0;
|
uchar uCeil = volIter.peekVoxel1px0py0pz() > 0 ? 1 : 0;
|
||||||
vertexData/*[materialCt]*/[vertexCt].normal = Vector3(uFloor - uCeil,0.0,0.0);
|
vertexData[materialCt][vertexCt].normal = Vector3(uFloor - uCeil,0.0,0.0);
|
||||||
}
|
}
|
||||||
else if((posY - floorY) > 0.25) //The result should be 0.0 or 0.5
|
else if((posY - floorY) > 0.25) //The result should be 0.0 or 0.5
|
||||||
{
|
{
|
||||||
uchar uCeil = volIter.peekVoxel0px1py0pz() > 0 ? 1 : 0;
|
uchar uCeil = volIter.peekVoxel0px1py0pz() > 0 ? 1 : 0;
|
||||||
vertexData/*[materialCt]*/[vertexCt].normal = Vector3(0.0,uFloor - uCeil,0.0);
|
vertexData[materialCt][vertexCt].normal = Vector3(0.0,uFloor - uCeil,0.0);
|
||||||
}
|
}
|
||||||
else if((posZ - floorZ) > 0.25) //The result should be 0.0 or 0.5
|
else if((posZ - floorZ) > 0.25) //The result should be 0.0 or 0.5
|
||||||
{
|
{
|
||||||
uchar uCeil = volIter.peekVoxel0px0py1pz() > 0 ? 1 : 0;
|
uchar uCeil = volIter.peekVoxel0px0py1pz() > 0 ? 1 : 0;
|
||||||
vertexData/*[materialCt]*/[vertexCt].normal = Vector3(0.0, 0.0,uFloor - uCeil);
|
vertexData[materialCt][vertexCt].normal = Vector3(0.0, 0.0,uFloor - uCeil);
|
||||||
}
|
}
|
||||||
vertexData/*[materialCt]*/[vertexCt].normal.normalise();
|
vertexData[materialCt][vertexCt].normal.normalise();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CENTRAL_DIFFERENCE:
|
case CENTRAL_DIFFERENCE:
|
||||||
@ -866,9 +866,9 @@ namespace Ogre
|
|||||||
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY),static_cast<uint>(posZ+1.0));
|
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY),static_cast<uint>(posZ+1.0));
|
||||||
}
|
}
|
||||||
const Vector3 gradCeil = volIter.getCentralDifferenceGradient();
|
const Vector3 gradCeil = volIter.getCentralDifferenceGradient();
|
||||||
vertexData[vertexCt].normal = gradFloor + gradCeil;
|
vertexData[materialCt][vertexCt].normal = gradFloor + gradCeil;
|
||||||
vertexData[vertexCt].normal *= -1;
|
vertexData[materialCt][vertexCt].normal *= -1;
|
||||||
vertexData[vertexCt].normal.normalise();
|
vertexData[materialCt][vertexCt].normal.normalise();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SOBEL:
|
case SOBEL:
|
||||||
@ -888,9 +888,9 @@ namespace Ogre
|
|||||||
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY),static_cast<uint>(posZ+1.0));
|
volIter.setPosition(static_cast<uint>(posX),static_cast<uint>(posY),static_cast<uint>(posZ+1.0));
|
||||||
}
|
}
|
||||||
const Vector3 gradCeil = volIter.getSobelGradient();
|
const Vector3 gradCeil = volIter.getSobelGradient();
|
||||||
vertexData[vertexCt].normal = gradFloor + gradCeil;
|
vertexData[materialCt][vertexCt].normal = gradFloor + gradCeil;
|
||||||
vertexData[vertexCt].normal *= -1;
|
vertexData[materialCt][vertexCt].normal *= -1;
|
||||||
vertexData[vertexCt].normal.normalise();
|
vertexData[materialCt][vertexCt].normal.normalise();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user