diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index 485a813f..5cc890c2 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -143,28 +143,34 @@ namespace Ogre //LogManager::getSingleton().logMessage("regionX = " + StringConverter::toString(regionX)); if(surfaceUpToDate[regionX][regionY][regionZ] == false) { + std::stringstream locationStream; + locationStream << "(" << regionX << "," << regionY << "," << regionZ << ")"; + std::string location = locationStream.str(); + //Generate the surface IndexedSurfacePatch* singleMaterialPatch = new IndexedSurfacePatch(false); IndexedSurfacePatch* multiMaterialPatch = new IndexedSurfacePatch(true); generateMeshDataForRegion(regionX,regionY,regionZ, singleMaterialPatch, multiMaterialPatch); - /*if((singleMaterialPatch->m_vecVertices.size == 0) && (singleMaterialPatch->m_vecTriangleIndices.size == 0)) + if((singleMaterialPatch->m_vecVertices.size() == 0) && (singleMaterialPatch->m_vecTriangleIndices.size() == 0)) { - //No geometry exists. We can delete the scene node if it exists (it might, if the region has only just become empty) + //No geometry exists. We can delete the scene node if it exists std::map::iterator iterSceneNode = sceneNodes.find(UIntVector3(regionX,regionY,regionZ)); if(iterSceneNode != sceneNodes.end()) { - getRootSceneNode()->removeChild + getRootSceneNode()->removeChild(location); } - }*/ + surfaceUpToDate[regionX][regionY][regionZ] = true; + continue; + } //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()) { - sceneNode = getRootSceneNode()->createChildSceneNode(Vector3(regionX*OGRE_REGION_SIDE_LENGTH,regionY*OGRE_REGION_SIDE_LENGTH,regionZ*OGRE_REGION_SIDE_LENGTH)); + sceneNode = getRootSceneNode()->createChildSceneNode(location, Vector3(regionX*OGRE_REGION_SIDE_LENGTH,regionY*OGRE_REGION_SIDE_LENGTH,regionZ*OGRE_REGION_SIDE_LENGTH)); sceneNodes.insert(std::make_pair(UIntVector3(regionX,regionY,regionZ),sceneNode)); } else @@ -183,21 +189,21 @@ namespace Ogre triangleCounter += iterSurfacePatch->second.getNoOfTriangles();*/ SurfacePatchRenderable* singleMaterialSurfacePatchRenderable = m_singleMaterialSurfaces[regionX][regionY][regionZ]; - //SurfacePatchRenderable* multiMaterialSurfacePatchRenderable = m_multiMaterialSurfaces[regionX][regionY][regionZ]; + SurfacePatchRenderable* multiMaterialSurfacePatchRenderable = m_multiMaterialSurfaces[regionX][regionY][regionZ]; if(singleMaterialSurfacePatchRenderable == 0) //if single is null then multi should also be null { //We have to create the surfaces singleMaterialSurfacePatchRenderable = new SurfacePatchRenderable(singleMaterialPatch,materialMap->getMaterialAtIndex(1)); - //multiMaterialSurfacePatchRenderable = new SurfacePatchRenderable(multiMaterialPatch,materialMap->getMaterialAtIndex(2)); + multiMaterialSurfacePatchRenderable = new SurfacePatchRenderable(multiMaterialPatch,materialMap->getMaterialAtIndex(2)); - //multiMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_3); + multiMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_3); singleMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_4); m_singleMaterialSurfaces[regionX][regionY][regionZ] = singleMaterialSurfacePatchRenderable; sceneNode->attachObject(singleMaterialSurfacePatchRenderable); - //m_multiMaterialSurfaces[regionX][regionY][regionZ] = multiMaterialSurfacePatchRenderable; - //sceneNode->attachObject(multiMaterialSurfacePatchRenderable); + m_multiMaterialSurfaces[regionX][regionY][regionZ] = multiMaterialSurfacePatchRenderable; + sceneNode->attachObject(multiMaterialSurfacePatchRenderable); } else { @@ -205,8 +211,8 @@ namespace Ogre singleMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(singleMaterialPatch); sceneNode->attachObject(singleMaterialSurfacePatchRenderable); - //multiMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(multiMaterialPatch); - //sceneNode->attachObject(multiMaterialSurfacePatchRenderable); + multiMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(multiMaterialPatch); + sceneNode->attachObject(multiMaterialSurfacePatchRenderable); } } //sceneNode->showBoundingBox(true); @@ -222,9 +228,9 @@ namespace Ogre //Now call the base class to do the actual visibility determination... SceneManager::_findVisibleObjects(cam, visibleBounds, onlyShadowCasters); - LogManager::getSingleton().logMessage("\nNo of triangles = " + StringConverter::toString(IndexedSurfacePatch::noOfTrianglesSubmitted)); - LogManager::getSingleton().logMessage("No of vertices submitted = " + StringConverter::toString(IndexedSurfacePatch::noOfVerticesSubmitted)); - LogManager::getSingleton().logMessage("No of vertices accepted = " + StringConverter::toString(IndexedSurfacePatch::noOfVerticesAccepted)); + //LogManager::getSingleton().logMessage("\nNo of triangles = " + StringConverter::toString(IndexedSurfacePatch::noOfTrianglesSubmitted)); + //LogManager::getSingleton().logMessage("No of vertices submitted = " + StringConverter::toString(IndexedSurfacePatch::noOfVerticesSubmitted)); + //LogManager::getSingleton().logMessage("No of vertices accepted = " + StringConverter::toString(IndexedSurfacePatch::noOfVerticesAccepted)); } void PolyVoxSceneManager::setAllUpToDateFalse(void)