#include #include #include #include #include "OgreVisibilitySceneManager.h" #include "OgreSceneNodeHierarchyInterface.h" #include "OgreVisibilityOptionsManager.h" //#include namespace Ogre { //namespace GtpVisibility { //----------------------------------------------------------------------- VisibilitySceneManager::VisibilitySceneManager(GtpVisibility::VisibilityManager *visManager) :mVisibilityManager(visManager) { mHierarchyInterface = new SceneNodeHierarchyInterface(this, mDestRenderSystem); } //----------------------------------------------------------------------- VisibilitySceneManager::~VisibilitySceneManager() { delete mHierarchyInterface; } //----------------------------------------------------------------------- void VisibilitySceneManager::_findVisibleObjects(Camera* cam, bool onlyShadowCasters) { // empty because we have to find objects in _renderVisibleObjects } //----------------------------------------------------------------------- void VisibilitySceneManager::_renderVisibleObjects() { //-- render background clearSpecialCaseRenderQueues(); addSpecialCaseRenderQueue(RENDER_QUEUE_BACKGROUND); addSpecialCaseRenderQueue(RENDER_QUEUE_SKIES_EARLY); setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE); SceneManager::_renderVisibleObjects( ); #ifdef GTP_VISIBILITY_MODIFIED_OGRE _deleteRenderedQueueGroups(); #endif //-- render visible objects (i.e., all but overlay) clearSpecialCaseRenderQueues(); addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY); setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE); mHierarchyInterface->InitFrame(mSceneRoot, mCameraInProgress); mVisibilityManager->ApplyVisibilityCulling(); #ifdef GTP_VISIBILITY_MODIFIED_OGRE _deleteRenderedQueueGroups(); #endif //-- render overlay clearSpecialCaseRenderQueues(); SceneManager::_renderVisibleObjects( ); clearSpecialCaseRenderQueues(); } //----------------------------------------------------------------------- void VisibilitySceneManager::_updateSceneGraph(Camera* cam) { mVisibilityManager->GetCullingManager()->SetHierarchyInterface(mHierarchyInterface); mHierarchyInterface->SetRenderSystem(mDestRenderSystem); SceneManager::_updateSceneGraph(cam); } //----------------------------------------------------------------------- bool VisibilitySceneManager::setOption(const String & key, const void * val) { return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface). setOption(key, val) || SceneManager::setOption(key, val); } //----------------------------------------------------------------------- bool VisibilitySceneManager::getOption(const String & key, void *val) { if (key == "NumHierarchyNodes") { * static_cast(val) = (unsigned int)mSceneNodes.size(); return true; } return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface). getOption(key, val) && SceneManager::getOption(key, val); } //----------------------------------------------------------------------- bool VisibilitySceneManager::getOptionValues(const String & key, StringVector &refValueList) { return SceneManager::getOptionValues(key, refValueList); } //----------------------------------------------------------------------- bool VisibilitySceneManager::getOptionKeys(StringVector & refKeys) { return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface). getOptionKeys(refKeys) || SceneManager::getOptionKeys(refKeys); } //----------------------------------------------------------------------- void VisibilitySceneManager::setVisibilityManager(GtpVisibility::VisibilityManager *visManager) { mVisibilityManager = visManager; } //----------------------------------------------------------------------- GtpVisibility::VisibilityManager *VisibilitySceneManager::getVisibilityManager( void ) { return mVisibilityManager; } //} // namespace GtpVisibility } // namespace Ogre