Listen to render window updates and properly activate/deactivate occlusion queries pre/post update.

actorid
scrawl 12 years ago
parent 15e51b76de
commit 5334934612

@ -31,9 +31,9 @@ namespace MWRender
Refraction::~Refraction()
{
mRenderTarget->removeListener(this);
Ogre::TextureManager::getSingleton().remove("WaterRefraction");
mParentCamera->getSceneManager()->destroyCamera(mCamera);
mRenderTarget->removeListener(this);
}
void Refraction::preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt)
@ -56,7 +56,8 @@ namespace MWRender
void Refraction::setWaterPlane(Ogre::Plane plane)
{
mNearClipPlane = Ogre::Plane(-plane.normal, - (plane.d + 5) );
/// \todo
mNearClipPlane = Ogre::Plane( -Ogre::Vector3(0,1,0), 0);
}
}

@ -62,6 +62,8 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const
mRendering.createScene("PlayerCam", Settings::Manager::getFloat("field of view", "General"), 5);
mRendering.setWindowEventListener(this);
mRendering.getWindow()->addListener(this);
mCompositors = new Compositors(mRendering.getViewport());
mWater = 0;
@ -174,6 +176,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const
RenderingManager::~RenderingManager ()
{
mRendering.getWindow()->removeListener(this);
mRendering.removeWindowEventListener(this);
delete mPlayer;
@ -337,10 +340,6 @@ void RenderingManager::update (float duration, bool paused)
mOcclusionQuery->update(duration);
// deactivate queries to make sure we aren't getting false results from several misc render targets
// (will be reactivated at the bottom of this method)
mOcclusionQuery->setActive(false);
mVideoPlayer->update ();
mRendering.update(duration);
@ -396,10 +395,20 @@ void RenderingManager::update (float duration, bool paused)
orig = Ogre::Vector3(orig.x, orig.z, -orig.y);
mWater->update(duration, orig);
}
}
void RenderingManager::preRenderTargetUpdate(const RenderTargetEvent &evt)
{
mOcclusionQuery->setActive(true);
}
void RenderingManager::postRenderTargetUpdate(const RenderTargetEvent &evt)
{
// deactivate queries to make sure we aren't getting false results from several misc render targets
// (will be reactivated at the bottom of this method)
mOcclusionQuery->setActive(false);
}
void RenderingManager::waterAdded (MWWorld::Ptr::CellStore *store)
{
const MWWorld::Store<ESM::Land> &lands =
@ -886,7 +895,7 @@ void RenderingManager::applyCompositors()
mCompositors->addCompositor("gbufferFinalizer", 2);
mCompositors->setCompositorEnabled("gbufferFinalizer", true);
*/
}
}
//if (mWater)
//mWater->assignTextures();

@ -11,6 +11,8 @@
#include <boost/filesystem.hpp>
#include <OgreRenderTargetListener.h>
#include "renderinginterface.hpp"
#include "objects.hpp"
@ -47,7 +49,7 @@ namespace MWRender
class GlobalMap;
class VideoPlayer;
class RenderingManager: private RenderingInterface, public Ogre::WindowEventListener {
class RenderingManager: private RenderingInterface, public Ogre::WindowEventListener, public Ogre::RenderTargetListener {
private:
@ -137,6 +139,10 @@ class RenderingManager: private RenderingInterface, public Ogre::WindowEventList
void disableLights(bool sun); ///< @param sun whether or not to really disable the sunlight (otherwise just set diffuse to 0)
void enableLights(bool sun);
void preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);
void postRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);
bool occlusionQuerySupported() { return mOcclusionQuery->supported(); }
OcclusionQuery* getOcclusionQuery() { return mOcclusionQuery; }

@ -185,6 +185,7 @@ Water::Water (Ogre::Camera *camera, RenderingManager* rend, const ESM::Cell* cel
mRendering(rend),
mWaterTimer(0.f),
mReflection(NULL),
mRefraction(NULL),
mSimulation(NULL)
{
mSimulation = new RippleSimulation(mSceneMgr);
@ -317,7 +318,7 @@ void Water::setHeight(const float height)
{
mTop = height;
mWaterPlane = Plane(Vector3::UNIT_Y, height);
mWaterPlane = Plane(Vector3::UNIT_Y, -height);
if (mReflection)
mReflection->setWaterPlane(mWaterPlane);

@ -211,7 +211,6 @@ void OgreRenderer::createWindow(const std::string &title, const WindowSettings&
mRoot->initialise(false);
// create a hidden 1x1 background window to keep resources when recreating the secondary (real) window
/// \todo Why does this break occlusion queries? :(
/*
NameValuePairList params_;
params_.insert(std::make_pair("title", title));

Loading…
Cancel
Save