Moving from using ManualObject to using HardwareBuffers directly.

This commit is contained in:
David Williams 2007-08-15 09:35:21 +00:00
parent 72bc4a03e3
commit eeacb222e1
3 changed files with 11 additions and 48 deletions

View File

@ -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);

View File

@ -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);
} }

View File

@ -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