//----------------------------------------------------------------------------- void SceneManagerPortals::extractVisibleActors(ActorCollection& list, const Camera* camera) { if (cullingEnabled()) { Sector* start = computeStartingSector(camera); if (!start) extractActors(list); else { ++mVisitTick; mTempActors.clear(); mFrustumStack.clear(); mFrustumStack.push_back(camera->frustum()); start->executeCallbacks(camera,this,NULL); visitSector(NULL, start, camera->modelingMatrix().getT(), camera); // remove duplicates std::sort(mTempActors.begin(), mTempActors.end()); std::vector< ref<Actor> >::iterator new_end = std::unique(mTempActors.begin(), mTempActors.end()); for(std::vector< ref<Actor> >::iterator it = mTempActors.begin(); it != new_end; ++it) list.push_back(it->get()); } } else extractActors(list); }
//----------------------------------------------------------------------------- void SceneManagerPortals::extractVisibleActors(ActorCollection& list, const Camera* camera) { if (cullingEnabled()) { Sector* start = computeStartingSector(camera); if (!start) extractActors(list); else { ++mVisitTick; mTempActors.clear(); mFrustumStack.clear(); mFrustumStack.push_back(camera->frustum()); start->executeCallbacks(camera,this,NULL); visitSector(NULL, start, camera->modelingMatrix().getT(), camera); // insert portal actors if (showPortals()) { for(std::map<Portal*, ref<Actor> >::const_iterator it = mPortalActorMap.begin(); it != mPortalActorMap.end(); ++it) mTempActors.push_back(it->second); } // mic fixme: isn't quicker to use sets instead of sort()+unique()? // avoid reporting duplicates std::sort(mTempActors.begin(), mTempActors.end()); std::vector< ref<Actor> >::iterator new_end = std::unique(mTempActors.begin(), mTempActors.end()); for(std::vector< ref<Actor> >::iterator it = mTempActors.begin(); it != new_end; ++it) list.push_back(it->get()); } } else extractActors(list); }