Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Feb 26, 2011, 5:00:17 PM (14 years ago)
Author:
landauf
Message:

some changes related to camera switching:

  • added ViewportEventListener (currently only listens to camera changes in a viewport)
  • Shader now correctly updates its visibility if the camera changes the scene
  • (the same lines of code also fix the weird Ogre behavior which was originally fixed in CameraManager)
  • GraphicsManager also updates the GUIManager's camera
  • if all cameras are destroyed, CameraManager now officially switches to NULL camera
Location:
code/branches/usability/src/libraries
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • code/branches/usability/src/libraries/core/CMakeLists.txt

    r7284 r7966  
    3535  OrxonoxClass.cc
    3636  Resource.cc
    37   WindowEventListener.cc
    3837
    3938  # hierarchy
     
    4948  Template.cc
    5049  XMLPort.cc
     50
     51COMPILATION_BEGIN ListenerCompilation.cc
     52  ViewportEventListener.cc
     53  WindowEventListener.cc
    5154  XMLNameListener.cc
     55COMPILATION_END
    5256
    5357COMPILATION_BEGIN FilesystemCompilation.cc
  • code/branches/usability/src/libraries/core/CorePrereqs.h

    r7849 r7966  
    182182    class Thread;
    183183    class ThreadPool;
     184    class ViewportEventListener;
    184185    template <class T>
    185186    class WeakPtr;
  • code/branches/usability/src/libraries/core/GraphicsManager.cc

    r7874 r7966  
    5757#include "Game.h"
    5858#include "GameMode.h"
     59#include "GUIManager.h"
    5960#include "Loader.h"
    6061#include "MemoryArchive.h"
    6162#include "PathConfig.h"
     63#include "ViewportEventListener.h"
    6264#include "WindowEventListener.h"
    6365#include "XMLFile.h"
     
    381383    void GraphicsManager::setCamera(Ogre::Camera* camera)
    382384    {
     385        Ogre::Camera* oldCamera = this->viewport_->getCamera();
     386
    383387        this->viewport_->setCamera(camera);
     388        GUIManager::getInstance().setCamera(camera);
     389
     390        for (ObjectList<ViewportEventListener>::iterator it = ObjectList<ViewportEventListener>::begin(); it != ObjectList<ViewportEventListener>::end(); ++it)
     391            it->cameraChanged(this->viewport_, oldCamera);
    384392    }
    385393
  • code/branches/usability/src/libraries/tools/Shader.cc

    r6417 r7966  
    5656        this->bVisible_ = true;
    5757        this->bLoadCompositor_ = GameMode::showsGraphics();
    58         this->bViewportInitialized_ = false;
     58        this->bViewportInitialized_ = true;
    5959
    6060        if (this->bLoadCompositor_ && Ogre::Root::getSingletonPtr())
     
    8989    {
    9090        this->scenemanager_ = scenemanager;
    91         this->bViewportInitialized_ = false;
    92     }
    93 
     91//        this->bViewportInitialized_ = false;
     92    }
     93
     94    void Shader::cameraChanged(Ogre::Viewport* viewport, Ogre::Camera* oldCamera)
     95    {
     96        if (!this->scenemanager_ || (viewport != this->scenemanager_->getCurrentViewport() && this->scenemanager_->getCurrentViewport() != NULL))
     97            return;
     98
     99        // update compositor in viewport (shader should only be active if the current camera is in the same scene as the shader)
     100
     101        // Note:
     102        // The shader needs also to be switched off and on after changing the camera in the
     103        // same scene to avoid weird behaviour with active compositors while switching the
     104        // camera (like freezing the image)
     105        //
     106        // Last known Ogre version needing this workaround:
     107        // 1.4.8
     108        // 1.7.2
     109
     110
     111        if (oldCamera && this->scenemanager_ == oldCamera->getSceneManager())
     112            Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositor_, false);
     113
     114        if (viewport->getCamera() && this->scenemanager_ == viewport->getCamera()->getSceneManager())
     115            Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositor_, this->isVisible());
     116    }
     117/*
    94118    void Shader::tick(float dt)
    95119    {
     
    102126        }
    103127    }
    104 
     128*/
    105129    void Shader::changedCompositor()
    106130    {
     
    119143                if (!this->compositorInstance_)
    120144                    COUT(2) << "Warning: Couldn't load compositor with name \"" << this->compositor_ << "\"." << std::endl;
    121                 Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositor_, this->bViewportInitialized_ && this->isVisible());
     145                //Ogre::CompositorManager::getSingleton().setCompositorEnabled(viewport, this->compositor_, this->bViewportInitialized_ && this->isVisible());
    122146            }
    123147            this->oldcompositor_ = this->compositor_;
  • code/branches/usability/src/libraries/tools/Shader.h

    r5781 r7966  
    3737
    3838#include "util/OgreForwardRefs.h"
    39 #include "tools/interfaces/Tickable.h"
     39#include "core/ViewportEventListener.h"
    4040
    4141namespace orxonox
    4242{
    43     class _ToolsExport Shader : public Tickable
     43    class _ToolsExport Shader : public ViewportEventListener
    4444    {
    4545        typedef std::pair<bool, void*>                  ParameterPointer;
     
    5252            Shader(Ogre::SceneManager* scenemanager = 0);
    5353            virtual ~Shader();
    54 
    55             virtual void tick(float dt);
    5654
    5755            inline void setVisible(bool bVisible)
     
    8381                { return this->scenemanager_; }
    8482
     83            virtual void cameraChanged(Ogre::Viewport* viewport, Ogre::Camera* oldCamera);
     84
    8585            void setParameter(const std::string& material, size_t technique, size_t pass, const std::string& parameter, float value);
    8686            void setParameter(const std::string& material, size_t technique, size_t pass, const std::string& parameter, int value);
Note: See TracChangeset for help on using the changeset viewer.