void ObjectHandler::updateCulling() { mCulledObjects.clear(); if(mpCamera!=NULL) { D3DXMATRIX view; D3DXMATRIX projection; mpCamera->GetVPMatrices(view,projection); mpFrustum->update(view,projection); //Always add all instance bases as they don't have any bounding volumes. for(vector<InstanceObject *>::iterator baseIter = mObjectInstanceList.begin(); baseIter != mObjectInstanceList.end(); ++baseIter) { mCulledObjects.push_back((*baseIter)); } for(vector<InstanceMesh *>::iterator baseIter = mMeshInstanceList.begin(); baseIter != mMeshInstanceList.end(); ++baseIter) { mCulledObjects.push_back((*baseIter)); } //Add all objects' bounding volumes to BVs. vector<CollisionObject *> BVs; //Standard objects. for(vector<RenderObject *>::iterator n = mObjectList.begin(); n != mObjectList.end(); ++n) { if((*n)->getBoundingVolume()) { (*n)->setFlagRender(false); BVs.push_back((*n)->getBoundingVolume()); } } //Object instances. for(vector<InstanceObject *>::iterator baseIter = mObjectInstanceList.begin(); baseIter != mObjectInstanceList.end(); ++baseIter) { for(vector<InstanceObject *>::const_iterator instanceIter = (*baseIter)->getInstanceList().begin(); instanceIter != (*baseIter)->getInstanceList().end(); ++instanceIter) { if((*instanceIter)->getBoundingVolume()) { (*instanceIter)->setFlagRender(false); BVs.push_back((*instanceIter)->getBoundingVolume()); } } } //Mesh instances. for(vector<InstanceMesh *>::iterator baseIter = mMeshInstanceList.begin(); baseIter != mMeshInstanceList.end(); ++baseIter) { for(vector<InstanceObject *>::const_iterator instanceIter = (*baseIter)->getInstanceList().begin(); instanceIter != (*baseIter)->getInstanceList().end(); ++instanceIter) { InstanceMesh *meshInstance = (InstanceMesh *)(*instanceIter); for(vector<InstanceSubset *>::const_iterator subsetIter = meshInstance->getSubsetList().begin(); subsetIter != meshInstance->getSubsetList().end(); ++subsetIter) { if((*subsetIter)->getBoundingVolume()) { (*subsetIter)->setFlagRender(false); BVs.push_back((*subsetIter)->getBoundingVolume()); } } } } //Add all bounding volumes in BVs to the quad-tree. mpQuadTree->update(&BVs); //Cull BVs using the quad-tree. vector<CollisionObject *> collisionObjects; mpQuadTree->collisionCheck(mpFrustum, &collisionObjects); for(vector<CollisionObject *>::iterator BVIter = collisionObjects.begin(); BVIter != collisionObjects.end(); ++BVIter) { RenderObject *object = (RenderObject *)(*BVIter)->getParent(); if(object) { switch(object->getType()) { case RenderTypes::BUFFER_OBJECT: object->setFlagRender(true); mCulledObjects.push_back(object); break; case RenderTypes::INSTANCE_OBJECT: object->setFlagRender(true); break; default: break; } } } } }