forked from mirror/openmw-tes3mp
when the resolution changes, adjust camera aspect ratio and recreate compositors
This commit is contained in:
parent
10cfe0f5bc
commit
f6a6684685
10 changed files with 94 additions and 9 deletions
|
@ -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;
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue