mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-05-09 03:57:51 +03:00
Merge branch 'recalculate-projection-matrix-on-window-resize' into 'master'
Recalculate the Projection Matrix every time the window is resized. See merge request OpenMW/openmw!1382
This commit is contained in:
commit
e221013692
7 changed files with 72 additions and 33 deletions
|
@ -1098,12 +1098,21 @@ namespace MWGui
|
|||
|
||||
void WindowManager::windowResized(int x, int y)
|
||||
{
|
||||
// Note: this is a side effect of resolution change or window resize.
|
||||
// There is no need to track these changes.
|
||||
Settings::Manager::setInt("resolution x", "Video", x);
|
||||
Settings::Manager::setInt("resolution y", "Video", y);
|
||||
Settings::Manager::resetPendingChange("resolution x", "Video");
|
||||
Settings::Manager::resetPendingChange("resolution y", "Video");
|
||||
|
||||
// We only want to process changes to window-size related settings.
|
||||
Settings::CategorySettingVector filter = {{"Video", "resolution x"},
|
||||
{"Video", "resolution y"}};
|
||||
|
||||
// If the HUD has not been initialised, the World singleton will not be available.
|
||||
if (mHud)
|
||||
{
|
||||
MWBase::Environment::get().getWorld()->processChangedSettings(
|
||||
Settings::Manager::getPendingChanges(filter));
|
||||
}
|
||||
|
||||
Settings::Manager::resetPendingChanges(filter);
|
||||
|
||||
mGuiPlatform->getRenderManagerPtr()->setViewSize(x, y);
|
||||
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
#include <components/debug/debuglog.hpp>
|
||||
|
||||
#include "vismask.hpp"
|
||||
#include "renderingmanager.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
|
@ -132,11 +131,10 @@ namespace
|
|||
|
||||
namespace MWRender
|
||||
{
|
||||
PostProcessor::PostProcessor(RenderingManager& rendering, osgViewer::Viewer* viewer, osg::Group* rootNode)
|
||||
PostProcessor::PostProcessor(osgViewer::Viewer* viewer, osg::Group* rootNode)
|
||||
: mViewer(viewer)
|
||||
, mRootNode(new osg::Group)
|
||||
, mDepthFormat(GL_DEPTH_COMPONENT24)
|
||||
, mRendering(rendering)
|
||||
{
|
||||
bool softParticles = Settings::Manager::getBool("soft particles", "Shaders");
|
||||
|
||||
|
@ -239,7 +237,6 @@ namespace MWRender
|
|||
|
||||
mViewer->getCamera()->resize(width, height);
|
||||
mHUDCamera->resize(width, height);
|
||||
mRendering.updateProjectionMatrix();
|
||||
}
|
||||
|
||||
void PostProcessor::createTexturesAndCamera(int width, int height)
|
||||
|
|
|
@ -14,12 +14,10 @@ namespace osgViewer
|
|||
|
||||
namespace MWRender
|
||||
{
|
||||
class RenderingManager;
|
||||
|
||||
class PostProcessor : public osg::Referenced
|
||||
{
|
||||
public:
|
||||
PostProcessor(RenderingManager& rendering, osgViewer::Viewer* viewer, osg::Group* rootNode);
|
||||
PostProcessor(osgViewer::Viewer* viewer, osg::Group* rootNode);
|
||||
|
||||
auto getMsaaFbo() { return mMsaaFbo; }
|
||||
auto getFbo() { return mFbo; }
|
||||
|
@ -46,8 +44,6 @@ namespace MWRender
|
|||
osg::ref_ptr<osg::Texture2D> mOpaqueDepthTex;
|
||||
|
||||
int mDepthFormat;
|
||||
|
||||
RenderingManager& mRendering;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -455,7 +455,7 @@ namespace MWRender
|
|||
mSharedUniformStateUpdater = new SharedUniformStateUpdater(groundcover);
|
||||
rootNode->addUpdateCallback(mSharedUniformStateUpdater);
|
||||
|
||||
mPostProcessor = new PostProcessor(*this, viewer, mRootNode);
|
||||
mPostProcessor = new PostProcessor(viewer, mRootNode);
|
||||
resourceSystem->getSceneManager()->setDepthFormat(mPostProcessor->getDepthFormat());
|
||||
resourceSystem->getSceneManager()->setOpaqueDepthTex(mPostProcessor->getOpaqueDepthTex());
|
||||
|
||||
|
@ -1209,19 +1209,26 @@ namespace MWRender
|
|||
|
||||
void RenderingManager::processChangedSettings(const Settings::CategorySettingVector &changed)
|
||||
{
|
||||
// Only perform a projection matrix update once if a relevant setting is changed.
|
||||
bool updateProjection = false;
|
||||
|
||||
for (Settings::CategorySettingVector::const_iterator it = changed.begin(); it != changed.end(); ++it)
|
||||
{
|
||||
if (it->first == "Camera" && it->second == "field of view")
|
||||
{
|
||||
mFieldOfView = Settings::Manager::getFloat("field of view", "Camera");
|
||||
updateProjectionMatrix();
|
||||
updateProjection = true;
|
||||
}
|
||||
else if (it->first == "Video" && (it->second == "resolution x" || it->second == "resolution y"))
|
||||
{
|
||||
updateProjection = true;
|
||||
}
|
||||
else if (it->first == "Camera" && it->second == "viewing distance")
|
||||
{
|
||||
mViewDistance = Settings::Manager::getFloat("viewing distance", "Camera");
|
||||
if(!Settings::Manager::getBool("use distant fog", "Fog"))
|
||||
mStateUpdater->setFogEnd(mViewDistance);
|
||||
updateProjectionMatrix();
|
||||
updateProjection = true;
|
||||
}
|
||||
else if (it->first == "General" && (it->second == "texture filter" ||
|
||||
it->second == "texture mipmap" ||
|
||||
|
@ -1264,6 +1271,11 @@ namespace MWRender
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (updateProjection)
|
||||
{
|
||||
updateProjectionMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
float RenderingManager::getNearClipDistance() const
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue