diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index 39dc2627..2f59ffd2 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -121,11 +121,7 @@ namespace Ogre std::string location(""); location = location + "(" + iterRegionGeometry->m_v3dRegionPosition.x + "," + iterRegionGeometry->m_v3dRegionPosition.y + "," + iterRegionGeometry->m_v3dRegionPosition.z + ")"; - //Get the surface - IndexedSurfacePatch* singleMaterialPatch = iterRegionGeometry->m_patchSingleMaterial; - IndexedSurfacePatch* multiMaterialPatch = iterRegionGeometry->m_patchMultiMaterial; - - if((singleMaterialPatch->m_vecVertices.size() == 0) && (singleMaterialPatch->m_vecTriangleIndices.size() == 0)) + if(iterRegionGeometry->m_bIsEmpty) { try { @@ -134,43 +130,45 @@ namespace Ogre catch(...) { } - continue; - } - - //If a SceneNode doesn't exist in this position then create one. - SceneNode* sceneNode; - try - { - sceneNode = dynamic_cast(getRootSceneNode()->getChild(location)); - } - catch(...) - { - sceneNode = 0; - } - - if(sceneNode == 0) - { - sceneNode = getRootSceneNode()->createChildSceneNode(location, Vector3(iterRegionGeometry->m_v3dRegionPosition.x*OGRE_REGION_SIDE_LENGTH,iterRegionGeometry->m_v3dRegionPosition.y*OGRE_REGION_SIDE_LENGTH,iterRegionGeometry->m_v3dRegionPosition.z*OGRE_REGION_SIDE_LENGTH)); - - SurfacePatchRenderable*singleMaterialSurfacePatchRenderable = new SurfacePatchRenderable(singleMaterialPatch,materialMap->getMaterialAtIndex(1)); - SurfacePatchRenderable*multiMaterialSurfacePatchRenderable = new SurfacePatchRenderable(multiMaterialPatch,materialMap->getMaterialAtIndex(2)); - - multiMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_3); - singleMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_4); - - sceneNode->attachObject(singleMaterialSurfacePatchRenderable); - - sceneNode->attachObject(multiMaterialSurfacePatchRenderable); } else { - SurfacePatchRenderable* singleMaterialSurfacePatchRenderable = dynamic_cast(sceneNode->getAttachedObject(0)); - SurfacePatchRenderable* multiMaterialSurfacePatchRenderable = dynamic_cast(sceneNode->getAttachedObject(1)); + //If a SceneNode doesn't exist in this position then create one. + SceneNode* sceneNode; + try + { + sceneNode = dynamic_cast(getRootSceneNode()->getChild(location)); + } + catch(...) + { + sceneNode = 0; + } - singleMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(singleMaterialPatch); + if(sceneNode == 0) + { + sceneNode = getRootSceneNode()->createChildSceneNode(location, Vector3(iterRegionGeometry->m_v3dRegionPosition.x*OGRE_REGION_SIDE_LENGTH,iterRegionGeometry->m_v3dRegionPosition.y*OGRE_REGION_SIDE_LENGTH,iterRegionGeometry->m_v3dRegionPosition.z*OGRE_REGION_SIDE_LENGTH)); - multiMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(multiMaterialPatch); + SurfacePatchRenderable*singleMaterialSurfacePatchRenderable = new SurfacePatchRenderable(iterRegionGeometry->m_patchSingleMaterial,materialMap->getMaterialAtIndex(1)); + SurfacePatchRenderable*multiMaterialSurfacePatchRenderable = new SurfacePatchRenderable(iterRegionGeometry->m_patchMultiMaterial,materialMap->getMaterialAtIndex(2)); + + multiMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_3); + singleMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_4); + + sceneNode->attachObject(singleMaterialSurfacePatchRenderable); + + sceneNode->attachObject(multiMaterialSurfacePatchRenderable); + } + else + { + + SurfacePatchRenderable* singleMaterialSurfacePatchRenderable = dynamic_cast(sceneNode->getAttachedObject(0)); + SurfacePatchRenderable* multiMaterialSurfacePatchRenderable = dynamic_cast(sceneNode->getAttachedObject(1)); + + singleMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(iterRegionGeometry->m_patchSingleMaterial); + + multiMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(iterRegionGeometry->m_patchMultiMaterial); + } } } @@ -212,6 +210,8 @@ namespace Ogre generateMeshDataForRegion(regionX,regionY,regionZ, regionGeometry.m_patchSingleMaterial, regionGeometry.m_patchMultiMaterial); + regionGeometry.m_bIsEmpty = ((regionGeometry.m_patchSingleMaterial->m_vecVertices.size() == 0) && (regionGeometry.m_patchMultiMaterial->m_vecTriangleIndices.size() == 0)); + listChangedRegionGeometry.push_back(regionGeometry); } }