Work on reducing batch count.

This commit is contained in:
David Williams 2008-01-19 21:04:55 +00:00
parent a0bcd6b214
commit b41793b520

View File

@ -143,28 +143,34 @@ 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)
{ {
std::stringstream locationStream;
locationStream << "(" << regionX << "," << regionY << "," << regionZ << ")";
std::string location = locationStream.str();
//Generate the surface //Generate the surface
IndexedSurfacePatch* singleMaterialPatch = new IndexedSurfacePatch(false); IndexedSurfacePatch* singleMaterialPatch = new IndexedSurfacePatch(false);
IndexedSurfacePatch* multiMaterialPatch = new IndexedSurfacePatch(true); IndexedSurfacePatch* multiMaterialPatch = new IndexedSurfacePatch(true);
generateMeshDataForRegion(regionX,regionY,regionZ, singleMaterialPatch, multiMaterialPatch); 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<UIntVector3, SceneNode*>::iterator iterSceneNode = sceneNodes.find(UIntVector3(regionX,regionY,regionZ)); std::map<UIntVector3, SceneNode*>::iterator iterSceneNode = sceneNodes.find(UIntVector3(regionX,regionY,regionZ));
if(iterSceneNode != sceneNodes.end()) 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. //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())
{ {
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)); sceneNodes.insert(std::make_pair(UIntVector3(regionX,regionY,regionZ),sceneNode));
} }
else else
@ -183,21 +189,21 @@ namespace Ogre
triangleCounter += iterSurfacePatch->second.getNoOfTriangles();*/ triangleCounter += iterSurfacePatch->second.getNoOfTriangles();*/
SurfacePatchRenderable* singleMaterialSurfacePatchRenderable = m_singleMaterialSurfaces[regionX][regionY][regionZ]; 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 if(singleMaterialSurfacePatchRenderable == 0) //if single is null then multi should also be null
{ {
//We have to create the surfaces //We have to create the surfaces
singleMaterialSurfacePatchRenderable = new SurfacePatchRenderable(singleMaterialPatch,materialMap->getMaterialAtIndex(1)); 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); singleMaterialSurfacePatchRenderable->setRenderQueueGroup(RENDER_QUEUE_4);
m_singleMaterialSurfaces[regionX][regionY][regionZ] = singleMaterialSurfacePatchRenderable; m_singleMaterialSurfaces[regionX][regionY][regionZ] = singleMaterialSurfacePatchRenderable;
sceneNode->attachObject(singleMaterialSurfacePatchRenderable); sceneNode->attachObject(singleMaterialSurfacePatchRenderable);
//m_multiMaterialSurfaces[regionX][regionY][regionZ] = multiMaterialSurfacePatchRenderable; m_multiMaterialSurfaces[regionX][regionY][regionZ] = multiMaterialSurfacePatchRenderable;
//sceneNode->attachObject(multiMaterialSurfacePatchRenderable); sceneNode->attachObject(multiMaterialSurfacePatchRenderable);
} }
else else
{ {
@ -205,8 +211,8 @@ namespace Ogre
singleMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(singleMaterialPatch); singleMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(singleMaterialPatch);
sceneNode->attachObject(singleMaterialSurfacePatchRenderable); sceneNode->attachObject(singleMaterialSurfacePatchRenderable);
//multiMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(multiMaterialPatch); multiMaterialSurfacePatchRenderable->updateWithNewSurfacePatch(multiMaterialPatch);
//sceneNode->attachObject(multiMaterialSurfacePatchRenderable); sceneNode->attachObject(multiMaterialSurfacePatchRenderable);
} }
} }
//sceneNode->showBoundingBox(true); //sceneNode->showBoundingBox(true);
@ -222,9 +228,9 @@ namespace Ogre
//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);
LogManager::getSingleton().logMessage("\nNo of triangles = " + StringConverter::toString(IndexedSurfacePatch::noOfTrianglesSubmitted)); //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 submitted = " + StringConverter::toString(IndexedSurfacePatch::noOfVerticesSubmitted));
LogManager::getSingleton().logMessage("No of vertices accepted = " + StringConverter::toString(IndexedSurfacePatch::noOfVerticesAccepted)); //LogManager::getSingleton().logMessage("No of vertices accepted = " + StringConverter::toString(IndexedSurfacePatch::noOfVerticesAccepted));
} }
void PolyVoxSceneManager::setAllUpToDateFalse(void) void PolyVoxSceneManager::setAllUpToDateFalse(void)