mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 13:26:44 +00:00 
			
		
		
		
	Avoid manually updating render targets from within frameRenderingQueued
This commit is contained in:
		
							parent
							
								
									2486ec6cb9
								
							
						
					
					
						commit
						fe7b2732d8
					
				
					 9 changed files with 34 additions and 3 deletions
				
			
		| 
						 | 
					@ -62,6 +62,13 @@ void OMW::Engine::setAnimationVerbose(bool animverbose)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool OMW::Engine::frameStarted (const Ogre::FrameEvent& evt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!MWBase::Environment::get().getWindowManager()->isGuiMode())
 | 
				
			||||||
 | 
					        MWBase::Environment::get().getWorld()->frameStarted(evt.timeSinceLastFrame);
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
 | 
					bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    try
 | 
					    try
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -105,6 +105,7 @@ namespace OMW
 | 
				
			||||||
            void executeLocalScripts();
 | 
					            void executeLocalScripts();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            virtual bool frameRenderingQueued (const Ogre::FrameEvent& evt);
 | 
					            virtual bool frameRenderingQueued (const Ogre::FrameEvent& evt);
 | 
				
			||||||
 | 
					            virtual bool frameStarted (const Ogre::FrameEvent& evt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /// Load settings from various files, returns the path to the user settings file
 | 
					            /// Load settings from various files, returns the path to the user settings file
 | 
				
			||||||
            std::string loadSettings (Settings::Manager & settings);
 | 
					            std::string loadSettings (Settings::Manager & settings);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -314,6 +314,7 @@ namespace MWBase
 | 
				
			||||||
            /// \todo this does not belong here
 | 
					            /// \todo this does not belong here
 | 
				
			||||||
            virtual void playVideo(const std::string& name, bool allowSkipping) = 0;
 | 
					            virtual void playVideo(const std::string& name, bool allowSkipping) = 0;
 | 
				
			||||||
            virtual void stopVideo() = 0;
 | 
					            virtual void stopVideo() = 0;
 | 
				
			||||||
 | 
					            virtual void frameStarted (float dt) = 0;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -939,4 +939,9 @@ void RenderingManager::updateWaterRippleEmitterPtr (const MWWorld::Ptr& old, con
 | 
				
			||||||
    mWater->updateEmitterPtr(old, ptr);
 | 
					    mWater->updateEmitterPtr(old, ptr);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void RenderingManager::frameStarted(float dt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    mWater->frameStarted(dt);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace
 | 
					} // namespace
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -196,6 +196,7 @@ class RenderingManager: private RenderingInterface, public Ogre::WindowEventList
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void playVideo(const std::string& name, bool allowSkipping);
 | 
					    void playVideo(const std::string& name, bool allowSkipping);
 | 
				
			||||||
    void stopVideo();
 | 
					    void stopVideo();
 | 
				
			||||||
 | 
					    void frameStarted(float dt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  protected:
 | 
					  protected:
 | 
				
			||||||
	virtual void windowResized(Ogre::RenderWindow* rw);
 | 
						virtual void windowResized(Ogre::RenderWindow* rw);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -191,7 +191,8 @@ Water::Water (Ogre::Camera *camera, RenderingManager* rend) :
 | 
				
			||||||
    mWaterTimer(0.f),
 | 
					    mWaterTimer(0.f),
 | 
				
			||||||
    mReflection(NULL),
 | 
					    mReflection(NULL),
 | 
				
			||||||
    mRefraction(NULL),
 | 
					    mRefraction(NULL),
 | 
				
			||||||
    mSimulation(NULL)
 | 
					    mSimulation(NULL),
 | 
				
			||||||
 | 
					    mPlayer(0,0)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    mSimulation = new RippleSimulation(mSceneMgr);
 | 
					    mSimulation = new RippleSimulation(mSceneMgr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -371,7 +372,12 @@ void Water::update(float dt, Ogre::Vector3 player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mRendering->getSkyManager ()->setGlareEnabled (!mIsUnderwater);
 | 
					    mRendering->getSkyManager ()->setGlareEnabled (!mIsUnderwater);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mSimulation->update(dt, Ogre::Vector2(player.x, player.y));
 | 
					    mPlayer = Ogre::Vector2(player.x, player.y);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Water::frameStarted(float dt)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    mSimulation->update(dt, mPlayer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (mReflection)
 | 
					    if (mReflection)
 | 
				
			||||||
        mReflection->update();
 | 
					        mReflection->update();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
#include <OgreRenderTargetListener.h>
 | 
					#include <OgreRenderTargetListener.h>
 | 
				
			||||||
#include <OgreMaterial.h>
 | 
					#include <OgreMaterial.h>
 | 
				
			||||||
#include <OgreTexture.h>
 | 
					#include <OgreTexture.h>
 | 
				
			||||||
 | 
					#include <OgreVector2.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <components/esm/loadcell.hpp>
 | 
					#include <components/esm/loadcell.hpp>
 | 
				
			||||||
#include <components/settings/settings.hpp>
 | 
					#include <components/settings/settings.hpp>
 | 
				
			||||||
| 
						 | 
					@ -98,7 +99,7 @@ namespace MWRender {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Water rendering
 | 
					    /// Water rendering
 | 
				
			||||||
    class Water : public Ogre::RenderTargetListener, public Ogre::RenderQueueListener, public sh::MaterialInstanceListener
 | 
					    class Water : public sh::MaterialInstanceListener
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        static const int CELL_SIZE = 8192;
 | 
					        static const int CELL_SIZE = 8192;
 | 
				
			||||||
        Ogre::Camera *mCamera;
 | 
					        Ogre::Camera *mCamera;
 | 
				
			||||||
| 
						 | 
					@ -139,6 +140,8 @@ namespace MWRender {
 | 
				
			||||||
        Refraction* mRefraction;
 | 
					        Refraction* mRefraction;
 | 
				
			||||||
        RippleSimulation* mSimulation;
 | 
					        RippleSimulation* mSimulation;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ogre::Vector2 mPlayer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
        Water (Ogre::Camera *camera, RenderingManager* rend);
 | 
					        Water (Ogre::Camera *camera, RenderingManager* rend);
 | 
				
			||||||
        ~Water();
 | 
					        ~Water();
 | 
				
			||||||
| 
						 | 
					@ -147,6 +150,7 @@ namespace MWRender {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void toggle();
 | 
					        void toggle();
 | 
				
			||||||
        void update(float dt, Ogre::Vector3 player);
 | 
					        void update(float dt, Ogre::Vector3 player);
 | 
				
			||||||
 | 
					        void frameStarted(float dt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// adds an emitter, position will be tracked automatically using its scene node
 | 
					        /// adds an emitter, position will be tracked automatically using its scene node
 | 
				
			||||||
        void addEmitter (const MWWorld::Ptr& ptr, float scale = 1.f, float force = 1.f);
 | 
					        void addEmitter (const MWWorld::Ptr& ptr, float scale = 1.f, float force = 1.f);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1469,4 +1469,9 @@ namespace MWWorld
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        mRendering->stopVideo();
 | 
					        mRendering->stopVideo();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void World::frameStarted (float dt)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        mRendering->frameStarted(dt);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -356,6 +356,7 @@ namespace MWWorld
 | 
				
			||||||
            /// \todo this does not belong here
 | 
					            /// \todo this does not belong here
 | 
				
			||||||
            virtual void playVideo(const std::string& name, bool allowSkipping);
 | 
					            virtual void playVideo(const std::string& name, bool allowSkipping);
 | 
				
			||||||
            virtual void stopVideo();
 | 
					            virtual void stopVideo();
 | 
				
			||||||
 | 
					            virtual void frameStarted (float dt);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue