when the resolution changes, adjust camera aspect ratio and recreate compositors

This commit is contained in:
scrawl 2012-05-27 21:39:18 +02:00
parent 10cfe0f5bc
commit f6a6684685
10 changed files with 94 additions and 9 deletions

View file

@ -26,6 +26,21 @@ void Compositors::setEnabled (const bool enabled)
mEnabled = enabled; mEnabled = enabled;
} }
void Compositors::recreate()
{
Ogre::CompositorManager::getSingleton().removeCompositorChain(mViewport);
CompositorMap temp = mCompositors;
mCompositors.clear();
for (CompositorMap::iterator it=temp.begin();
it != temp.end(); ++it)
{
addCompositor(it->first, it->second.second);
setCompositorEnabled(it->first, mEnabled && it->second.first);
}
}
void Compositors::addCompositor (const std::string& name, const int priority) void Compositors::addCompositor (const std::string& name, const int priority)
{ {
int id = 0; int id = 0;

View file

@ -25,6 +25,11 @@ namespace MWRender
*/ */
void setEnabled (const bool enabled); void setEnabled (const bool enabled);
void setViewport(Ogre::Viewport* vp) { mViewport = vp; }
/// recreate compositors (call this after viewport size changes)
void recreate();
bool toggle() { setEnabled(!mEnabled); return mEnabled; } bool toggle() { setEnabled(!mEnabled); return mEnabled; }
/** /**

View file

@ -11,6 +11,7 @@
#include "../mwworld/world.hpp" // these includes can be removed once the static-hack is gone #include "../mwworld/world.hpp" // these includes can be removed once the static-hack is gone
#include "../mwworld/ptr.hpp" #include "../mwworld/ptr.hpp"
#include "../mwworld/player.hpp"
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include <components/esm/loadstat.hpp> #include <components/esm/loadstat.hpp>
#include <components/settings/settings.hpp> #include <components/settings/settings.hpp>
@ -30,6 +31,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const
:mRendering(_rend), mObjects(mRendering), mActors(mRendering), mAmbientMode(0), mSunEnabled(0) :mRendering(_rend), mObjects(mRendering), mActors(mRendering), mAmbientMode(0), mSunEnabled(0)
{ {
mRendering.createScene("PlayerCam", Settings::Manager::getFloat("field of view", "General"), 5); mRendering.createScene("PlayerCam", Settings::Manager::getFloat("field of view", "General"), 5);
mRendering.setWindowEventListener(this);
mCompositors = new Compositors(mRendering.getViewport()); mCompositors = new Compositors(mRendering.getViewport());
@ -567,6 +569,7 @@ Compositors* RenderingManager::getCompositors()
void RenderingManager::processChangedSettings(const Settings::CategorySettingVector& settings) void RenderingManager::processChangedSettings(const Settings::CategorySettingVector& settings)
{ {
bool changeRes = false;
for (Settings::CategorySettingVector::const_iterator it=settings.begin(); for (Settings::CategorySettingVector::const_iterator it=settings.begin();
it != settings.end(); ++it) it != settings.end(); ++it)
{ {
@ -574,6 +577,24 @@ void RenderingManager::processChangedSettings(const Settings::CategorySettingVec
{ {
setMenuTransparency(Settings::Manager::getFloat("menu transparency", "GUI")); setMenuTransparency(Settings::Manager::getFloat("menu transparency", "GUI"));
} }
else if (it->second == "max viewing distance" && it->first == "Viewing distance")
{
if (!MWBase::Environment::get().getWorld()->isCellExterior() && !MWBase::Environment::get().getWorld()->isCellQuasiExterior())
configureFog(*MWBase::Environment::get().getWorld()->getPlayer().getPlayer().getCell());
}
else if (it->first == "Video" && (
it->second == "resolution x"
|| it->second == "resolution y"
|| it->second == "fullscreen"))
changeRes = true;
}
if (changeRes)
{
int x = Settings::Manager::getInt("resolution x", "Video");
int y = Settings::Manager::getInt("resolution y", "Video");
mRendering.getWindow()->resize(x, y);
mRendering.getWindow()->setFullscreen(Settings::Manager::getBool("fullscreen", "Video"), x, y);
} }
} }
@ -587,4 +608,15 @@ void RenderingManager::setMenuTransparency(float val)
tex->getBuffer()->unlock(); tex->getBuffer()->unlock();
} }
void RenderingManager::windowResized(Ogre::RenderWindow* rw)
{
mCompositors->setViewport(mRendering.recreateViewport());
mCompositors->recreate();
mWater->assignTextures();
}
void RenderingManager::windowClosed(Ogre::RenderWindow* rw)
{
}
} // namespace } // namespace

View file

@ -8,6 +8,8 @@
#include "../mwworld/class.hpp" #include "../mwworld/class.hpp"
#include <OgreWindowEventUtilities.h>
#include <utility> #include <utility>
#include <openengine/ogre/renderer.hpp> #include <openengine/ogre/renderer.hpp>
#include <openengine/ogre/fader.hpp> #include <openengine/ogre/fader.hpp>
@ -51,7 +53,7 @@ namespace MWRender
class Water; class Water;
class Compositors; class Compositors;
class RenderingManager: private RenderingInterface { class RenderingManager: private RenderingInterface, public Ogre::WindowEventListener {
private: private:
@ -161,6 +163,12 @@ class RenderingManager: private RenderingInterface {
void processChangedSettings(const Settings::CategorySettingVector& settings); void processChangedSettings(const Settings::CategorySettingVector& settings);
Ogre::Viewport* getViewport() { return mRendering.getViewport(); }
protected:
virtual void windowResized(Ogre::RenderWindow* rw);
virtual void windowClosed(Ogre::RenderWindow* rw);
private: private:
void setAmbientMode(); void setAmbientMode();

View file

@ -374,7 +374,7 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera)
, mSunGlare(NULL) , mSunGlare(NULL)
, mMasser(NULL) , mMasser(NULL)
, mSecunda(NULL) , mSecunda(NULL)
, mViewport(NULL) , mCamera(pCamera)
, mRootNode(NULL) , mRootNode(NULL)
, mSceneMgr(NULL) , mSceneMgr(NULL)
, mAtmosphereDay(NULL) , mAtmosphereDay(NULL)
@ -399,9 +399,8 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera)
, mSecundaEnabled(true) , mSecundaEnabled(true)
, mCreated(false) , mCreated(false)
{ {
mViewport = pCamera->getViewport();
mSceneMgr = pMwRoot->getCreator(); mSceneMgr = pMwRoot->getCreator();
mRootNode = pCamera->getParentSceneNode()->createChildSceneNode(); mRootNode = mCamera->getParentSceneNode()->createChildSceneNode();
mRootNode->pitch(Degree(-90)); // convert MW to ogre coordinates mRootNode->pitch(Degree(-90)); // convert MW to ogre coordinates
mRootNode->setInheritOrientation(false); mRootNode->setInheritOrientation(false);
} }
@ -741,7 +740,7 @@ void SkyManager::update(float duration)
// on how directly the player is looking at the sun // on how directly the player is looking at the sun
Vector3 sun = mSunGlare->getPosition(); Vector3 sun = mSunGlare->getPosition();
sun = Vector3(sun.x, sun.z, -sun.y); sun = Vector3(sun.x, sun.z, -sun.y);
Vector3 cam = mViewport->getCamera()->getRealDirection(); Vector3 cam = mCamera->getRealDirection();
const Degree angle = sun.angleBetween( cam ); const Degree angle = sun.angleBetween( cam );
float val = 1- (angle.valueDegrees() / 180.f); float val = 1- (angle.valueDegrees() / 180.f);
val = (val*val*val*val)*2; val = (val*val*val*val)*2;

View file

@ -185,7 +185,7 @@ namespace MWRender
Moon* mMasser; Moon* mMasser;
Moon* mSecunda; Moon* mSecunda;
Ogre::Viewport* mViewport; Ogre::Camera* mCamera;
Ogre::SceneNode* mRootNode; Ogre::SceneNode* mRootNode;
Ogre::SceneManager* mSceneMgr; Ogre::SceneManager* mSceneMgr;

View file

@ -10,7 +10,7 @@ namespace MWRender
{ {
Water::Water (Ogre::Camera *camera, RenderingManager* rend, const ESM::Cell* cell) : Water::Water (Ogre::Camera *camera, RenderingManager* rend, const ESM::Cell* cell) :
mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()), mCamera (camera), mSceneManager (camera->getSceneManager()),
mIsUnderwater(false), mVisibilityFlags(0), mIsUnderwater(false), mVisibilityFlags(0),
mReflectionTarget(0), mActive(1), mToggled(1), mReflectionTarget(0), mActive(1), mToggled(1),
mReflectionRenderActive(false), mRendering(rend) mReflectionRenderActive(false), mRendering(rend)
@ -80,6 +80,8 @@ Water::Water (Ogre::Camera *camera, RenderingManager* rend, const ESM::Cell* cel
mSceneManager->addRenderQueueListener(this); mSceneManager->addRenderQueueListener(this);
assignTextures();
// ---------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------
// ---------------------------------- reflection debug overlay ---------------------------------- // ---------------------------------- reflection debug overlay ----------------------------------
@ -262,10 +264,13 @@ void Water::createMaterial()
// use technique without shaders if reflection is disabled // use technique without shaders if reflection is disabled
if (mReflectionTarget == 0) if (mReflectionTarget == 0)
mMaterial->removeTechnique(0); mMaterial->removeTechnique(0);
}
void Water::assignTextures()
{
if (Settings::Manager::getBool("shader", "Water")) if (Settings::Manager::getBool("shader", "Water"))
{ {
CompositorInstance* compositor = CompositorManager::getSingleton().getCompositorChain(mViewport)->getCompositor("gbuffer"); CompositorInstance* compositor = CompositorManager::getSingleton().getCompositorChain(mRendering->getViewport())->getCompositor("gbuffer");
TexturePtr colorTexture = compositor->getTextureInstance("mrt_output", 0); TexturePtr colorTexture = compositor->getTextureInstance("mrt_output", 0);
TextureUnitState* tus = mMaterial->getTechnique(0)->getPass(0)->getTextureUnitState("refractionMap"); TextureUnitState* tus = mMaterial->getTechnique(0)->getPass(0)->getTextureUnitState("refractionMap");

View file

@ -17,7 +17,6 @@ namespace MWRender {
static const int CELL_SIZE = 8192; static const int CELL_SIZE = 8192;
Ogre::Camera *mCamera; Ogre::Camera *mCamera;
Ogre::SceneManager *mSceneManager; Ogre::SceneManager *mSceneManager;
Ogre::Viewport *mViewport;
Ogre::Plane mWaterPlane; Ogre::Plane mWaterPlane;
Ogre::SceneNode *mWaterNode; Ogre::SceneNode *mWaterNode;
@ -65,6 +64,8 @@ namespace MWRender {
void toggle(); void toggle();
void update(); void update();
void assignTextures();
void setViewportBackground(const Ogre::ColourValue& bg); void setViewportBackground(const Ogre::ColourValue& bg);
void checkUnderwater(float y); void checkUnderwater(float y);

View file

@ -144,3 +144,18 @@ void OgreRenderer::createScene(const std::string camName, float fov, float nearC
mFader = new Fader(); mFader = new Fader();
} }
Ogre::Viewport* OgreRenderer::recreateViewport()
{
mWindow->removeViewport(mView->getZOrder());
mView = mWindow->addViewport(mCamera);
// Alter the camera aspect ratio to match the viewport
mCamera->setAspectRatio(Real(mView->getActualWidth()) / Real(mView->getActualHeight()));
return mView;
}
void OgreRenderer::setWindowEventListener(Ogre::WindowEventListener* listener)
{
Ogre::WindowEventUtilities::addWindowEventListener(mWindow, listener);
}

View file

@ -25,6 +25,7 @@
#endif #endif
#include "OgreTexture.h" #include "OgreTexture.h"
#include <OgreWindowEventUtilities.h>
namespace Ogre namespace Ogre
{ {
@ -104,6 +105,8 @@ namespace OEngine
~OgreRenderer() { cleanup(); } ~OgreRenderer() { cleanup(); }
void setWindowEventListener(Ogre::WindowEventListener* listener);
/** Configure the renderer. This will load configuration files and /** Configure the renderer. This will load configuration files and
set up the Root and logging classes. */ set up the Root and logging classes. */
void configure( void configure(
@ -153,6 +156,8 @@ namespace OEngine
/// Viewport /// Viewport
Ogre::Viewport *getViewport() { return mView; } Ogre::Viewport *getViewport() { return mView; }
Ogre::Viewport* recreateViewport();
}; };
} }
} }