From eeacb222e1c21f254c1c53d550b7f12ec69732ed Mon Sep 17 00:00:00 2001 From: David Williams Date: Wed, 15 Aug 2007 09:35:21 +0000 Subject: [PATCH] Moving from using ManualObject to using HardwareBuffers directly. --- include/Surface.h | 3 +-- source/PolyVoxSceneManager.cpp | 24 +++++++----------------- source/Surface.cpp | 32 +++----------------------------- 3 files changed, 11 insertions(+), 48 deletions(-) diff --git a/include/Surface.h b/include/Surface.h index 7cb04f30..83997f5e 100644 --- a/include/Surface.h +++ b/include/Surface.h @@ -12,8 +12,7 @@ namespace Ogre class Surface : public SimpleRenderable { public: - Surface(); - Surface(const String& material); + Surface(const String& material = "BaseWhiteNoLighting"); ~Surface(void); void setGeometry(std::vector verticesToSet, std::vector indicesToSet); diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index 0b7b1e8d..214b0900 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -331,10 +331,12 @@ namespace Ogre //LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX)); if(surfaceUpToDate[regionX][regionY][regionZ] == false) { + //Generate the surface std::vector vertexData; std::vector< std::vector< Triangle> > indexData; generateMeshDataForRegion(regionX,regionY,regionZ,vertexData,indexData); + //If a SceneNode doesn't exist in this position then create one. std::map::iterator iterSceneNode = sceneNodes.find(UIntVector3(regionX,regionY,regionZ)); SceneNode* sceneNode; if(iterSceneNode == sceneNodes.end()) @@ -348,6 +350,7 @@ namespace Ogre sceneNode->detachAllObjects(); } + //For each surface attach it to the scene node. for(uint meshCt = 1; meshCt < 256; ++meshCt) { if(indexData[meshCt].size() == 0) @@ -359,40 +362,27 @@ namespace Ogre { //We have to create the surface Surface* surface = new Surface(materialMap->getMaterialAtIndex(meshCt)); - - sceneNode->attachObject(surface); + surface->setGeometry(vertexData,indexData[meshCt]); m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(meshCt,surface)); - surface->setGeometry(vertexData,indexData[meshCt]); + sceneNode->attachObject(surface); } else { //We just update the existing surface iterSurface->second->setGeometry(vertexData,indexData[meshCt]); 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; } } } } } + //showBoundingBoxes(true); //Now call the base class to do the actual visibility determination... SceneManager::_findVisibleObjects(cam, visibleBounds, onlyShadowCasters); } diff --git a/source/Surface.cpp b/source/Surface.cpp index 8ab2366f..604e1801 100644 --- a/source/Surface.cpp +++ b/source/Surface.cpp @@ -4,19 +4,10 @@ namespace Ogre { - - Surface::Surface() - { - mRenderOp.vertexData = NULL; - mRenderOp.indexData = NULL; - - this->setMaterial("BaseWhiteNoLighting"); - } - Surface::Surface(const String& material) { - mRenderOp.vertexData = NULL; - mRenderOp.indexData = NULL; + mRenderOp.vertexData = new VertexData(); + mRenderOp.indexData = new IndexData(); this->setMaterial(material); } @@ -29,20 +20,7 @@ namespace Ogre void Surface::setGeometry(std::vector verticesToSet, std::vector 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()"); // Initialization stuff mRenderOp.vertexData->vertexCount = verticesToSet.size(); @@ -121,8 +99,6 @@ namespace Ogre mBox.setExtents(vaabMin, vaabMax); - //LogManager::getSingleton().logMessage("Setting Index Data of size " + StringConverter::toString(indicesToSet.size())); - unsigned short* pIdx = static_cast(ibuf->lock(HardwareBuffer::HBL_DISCARD)); for(int i = 0; i < indicesToSet.size(); i++) { @@ -134,8 +110,6 @@ namespace Ogre pIdx++; } ibuf->unlock(); - - } Real Surface::getSquaredViewDepth(const Camera *cam) const