Moving from using ManualObject to using HardwareBuffers directly.
This commit is contained in:
parent
72bc4a03e3
commit
eeacb222e1
@ -12,8 +12,7 @@ namespace Ogre
|
|||||||
class Surface : public SimpleRenderable
|
class Surface : public SimpleRenderable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Surface();
|
Surface(const String& material = "BaseWhiteNoLighting");
|
||||||
Surface(const String& material);
|
|
||||||
~Surface(void);
|
~Surface(void);
|
||||||
|
|
||||||
void setGeometry(std::vector<Vertex> verticesToSet, std::vector<Triangle> indicesToSet);
|
void setGeometry(std::vector<Vertex> verticesToSet, std::vector<Triangle> indicesToSet);
|
||||||
|
@ -331,10 +331,12 @@ namespace Ogre
|
|||||||
//LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX));
|
//LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX));
|
||||||
if(surfaceUpToDate[regionX][regionY][regionZ] == false)
|
if(surfaceUpToDate[regionX][regionY][regionZ] == false)
|
||||||
{
|
{
|
||||||
|
//Generate the surface
|
||||||
std::vector<Vertex> vertexData;
|
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);
|
||||||
|
|
||||||
|
//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));
|
||||||
SceneNode* sceneNode;
|
SceneNode* sceneNode;
|
||||||
if(iterSceneNode == sceneNodes.end())
|
if(iterSceneNode == sceneNodes.end())
|
||||||
@ -348,6 +350,7 @@ namespace Ogre
|
|||||||
sceneNode->detachAllObjects();
|
sceneNode->detachAllObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//For each surface attach it to the scene node.
|
||||||
for(uint meshCt = 1; meshCt < 256; ++meshCt)
|
for(uint meshCt = 1; meshCt < 256; ++meshCt)
|
||||||
{
|
{
|
||||||
if(indexData[meshCt].size() == 0)
|
if(indexData[meshCt].size() == 0)
|
||||||
@ -359,40 +362,27 @@ 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]);
|
||||||
sceneNode->attachObject(surface);
|
|
||||||
|
|
||||||
m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(meshCt,surface));
|
m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(meshCt,surface));
|
||||||
|
|
||||||
surface->setGeometry(vertexData,indexData[meshCt]);
|
sceneNode->attachObject(surface);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//We just update the existing surface
|
//We just update the existing surface
|
||||||
iterSurface->second->setGeometry(vertexData,indexData[meshCt]);
|
iterSurface->second->setGeometry(vertexData,indexData[meshCt]);
|
||||||
sceneNode->attachObject(iterSurface->second);
|
sceneNode->attachObject(iterSurface->second);
|
||||||
|
|
||||||
//sceneNodes[regionX][regionY][regionZ]->detachObject(iterSurface->second);
|
|
||||||
/*delete iterSurface->second;
|
|
||||||
m_mapSurfaces[regionX][regionY][regionZ].erase(iterSurface);
|
|
||||||
|
|
||||||
//We have to create the surface
|
|
||||||
Surface* surface = new Surface(materialMap->getMaterialAtIndex(meshCt));
|
|
||||||
|
|
||||||
//sceneNodes[regionX][regionY][regionZ] = getRootSceneNode()->createChildSceneNode(Vector3(regionX*OGRE_REGION_SIDE_LENGTH,regionY*OGRE_REGION_SIDE_LENGTH,regionZ*OGRE_REGION_SIDE_LENGTH));
|
|
||||||
sceneNodes[regionX][regionY][regionZ]->attachObject(surface);
|
|
||||||
|
|
||||||
m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(meshCt,surface));
|
|
||||||
|
|
||||||
surface->setGeometry(vertexData,indexData[meshCt]);*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sceneNode->showBoundingBox(true);
|
||||||
surfaceUpToDate[regionX][regionY][regionZ] = true;
|
surfaceUpToDate[regionX][regionY][regionZ] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//showBoundingBoxes(true);
|
||||||
//Now call the base class to do the actual visibility determination...
|
//Now call the base class to do the actual visibility determination...
|
||||||
SceneManager::_findVisibleObjects(cam, visibleBounds, onlyShadowCasters);
|
SceneManager::_findVisibleObjects(cam, visibleBounds, onlyShadowCasters);
|
||||||
}
|
}
|
||||||
|
@ -4,19 +4,10 @@
|
|||||||
|
|
||||||
namespace Ogre
|
namespace Ogre
|
||||||
{
|
{
|
||||||
|
|
||||||
Surface::Surface()
|
|
||||||
{
|
|
||||||
mRenderOp.vertexData = NULL;
|
|
||||||
mRenderOp.indexData = NULL;
|
|
||||||
|
|
||||||
this->setMaterial("BaseWhiteNoLighting");
|
|
||||||
}
|
|
||||||
|
|
||||||
Surface::Surface(const String& material)
|
Surface::Surface(const String& material)
|
||||||
{
|
{
|
||||||
mRenderOp.vertexData = NULL;
|
mRenderOp.vertexData = new VertexData();
|
||||||
mRenderOp.indexData = NULL;
|
mRenderOp.indexData = new IndexData();
|
||||||
|
|
||||||
this->setMaterial(material);
|
this->setMaterial(material);
|
||||||
}
|
}
|
||||||
@ -29,20 +20,7 @@ namespace Ogre
|
|||||||
|
|
||||||
void Surface::setGeometry(std::vector<Vertex> verticesToSet, std::vector<Triangle> indicesToSet)
|
void Surface::setGeometry(std::vector<Vertex> verticesToSet, std::vector<Triangle> indicesToSet)
|
||||||
{
|
{
|
||||||
if(mRenderOp.vertexData)
|
|
||||||
{
|
|
||||||
delete mRenderOp.vertexData;
|
|
||||||
mRenderOp.vertexData = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mRenderOp.indexData)
|
|
||||||
{
|
|
||||||
delete mRenderOp.indexData;
|
|
||||||
mRenderOp.indexData = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mRenderOp.vertexData = new VertexData();
|
|
||||||
mRenderOp.indexData = new IndexData();
|
|
||||||
//LogManager::getSingleton().logMessage("In setGeometry()");
|
//LogManager::getSingleton().logMessage("In setGeometry()");
|
||||||
// Initialization stuff
|
// Initialization stuff
|
||||||
mRenderOp.vertexData->vertexCount = verticesToSet.size();
|
mRenderOp.vertexData->vertexCount = verticesToSet.size();
|
||||||
@ -121,8 +99,6 @@ namespace Ogre
|
|||||||
|
|
||||||
mBox.setExtents(vaabMin, vaabMax);
|
mBox.setExtents(vaabMin, vaabMax);
|
||||||
|
|
||||||
//LogManager::getSingleton().logMessage("Setting Index Data of size " + StringConverter::toString(indicesToSet.size()));
|
|
||||||
|
|
||||||
unsigned short* pIdx = static_cast<unsigned short*>(ibuf->lock(HardwareBuffer::HBL_DISCARD));
|
unsigned short* pIdx = static_cast<unsigned short*>(ibuf->lock(HardwareBuffer::HBL_DISCARD));
|
||||||
for(int i = 0; i < indicesToSet.size(); i++)
|
for(int i = 0; i < indicesToSet.size(); i++)
|
||||||
{
|
{
|
||||||
@ -134,8 +110,6 @@ namespace Ogre
|
|||||||
pIdx++;
|
pIdx++;
|
||||||
}
|
}
|
||||||
ibuf->unlock();
|
ibuf->unlock();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Real Surface::getSquaredViewDepth(const Camera *cam) const
|
Real Surface::getSquaredViewDepth(const Camera *cam) const
|
||||||
|
Loading…
x
Reference in New Issue
Block a user