From 68148f5ec70f50b392524a3eccb85776fc360746 Mon Sep 17 00:00:00 2001 From: Petr Mikheev Date: Thu, 16 Jul 2020 22:21:50 +0200 Subject: [PATCH] 1. Skip smooth camera transition after changing cell; 2. Fix 'zoom out when move' for extremely high speed; --- apps/openmw/mwrender/camera.cpp | 10 ++++++++++ apps/openmw/mwrender/camera.hpp | 2 ++ apps/openmw/mwworld/worldimp.cpp | 2 ++ 3 files changed, 14 insertions(+) diff --git a/apps/openmw/mwrender/camera.cpp b/apps/openmw/mwrender/camera.cpp index 7531e712b..9e03ff908 100644 --- a/apps/openmw/mwrender/camera.cpp +++ b/apps/openmw/mwrender/camera.cpp @@ -65,6 +65,7 @@ namespace MWRender mFocalPointCurrentOffset(osg::Vec2d()), mFocalPointTargetOffset(osg::Vec2d()), mFocalPointTransitionSpeedCoef(1.f), + mSkipFocalPointTransition(true), mPreviousTransitionInfluence(0.f), mSmoothedSpeed(0.f), mZoomOutWhenMoveCoef(Settings::Manager::getFloat("zoom out when move coef", "Camera")), @@ -219,6 +220,7 @@ namespace MWRender updateFocalPointOffset(duration); float speed = mTrackingPtr.getClass().getSpeed(mTrackingPtr); + speed /= (1.f + speed / 500.f); float maxDelta = 300.f * duration; mSmoothedSpeed += osg::clampBetween(speed - mSmoothedSpeed, -maxDelta, maxDelta); } @@ -235,6 +237,14 @@ namespace MWRender if (duration <= 0) return; + if (mSkipFocalPointTransition) + { + mSkipFocalPointTransition = false; + mPreviousExtraOffset = osg::Vec2d(); + mPreviousTransitionInfluence = 0.f; + mFocalPointCurrentOffset = mFocalPointTargetOffset; + } + osg::Vec2d oldOffset = mFocalPointCurrentOffset; if (mPreviousTransitionInfluence > 0) diff --git a/apps/openmw/mwrender/camera.hpp b/apps/openmw/mwrender/camera.hpp index 59fa53047..7fa92b3f9 100644 --- a/apps/openmw/mwrender/camera.hpp +++ b/apps/openmw/mwrender/camera.hpp @@ -59,6 +59,7 @@ namespace MWRender osg::Vec2d mFocalPointCurrentOffset; osg::Vec2d mFocalPointTargetOffset; float mFocalPointTransitionSpeedCoef; + bool mSkipFocalPointTransition; // This fields are used to make focal point transition smooth if previous transition was not finished. float mPreviousTransitionInfluence; @@ -84,6 +85,7 @@ namespace MWRender void setFocalPointTransitionSpeed(float v) { mFocalPointTransitionSpeedCoef = v; } void setFocalPointTargetOffset(osg::Vec2d v); + void skipFocalPointTransition() { mSkipFocalPointTransition = true; } void enableDynamicCameraDistance(bool v) { mDynamicCameraDistanceEnabled = v; } void enableCrosshairInThirdPersonMode(bool v) { mShowCrosshairInThirdPersonMode = v; } diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 209ab538e..6e459d5e2 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -945,6 +945,7 @@ namespace MWWorld removeContainerScripts(getPlayerPtr()); mWorldScene->changeToInteriorCell(cellName, position, adjustPlayerPos, changeEvent); addContainerScripts(getPlayerPtr(), getPlayerPtr().getCell()); + mRendering->getCamera()->skipFocalPointTransition(); } void World::changeToExteriorCell (const ESM::Position& position, bool adjustPlayerPos, bool changeEvent) @@ -960,6 +961,7 @@ namespace MWWorld removeContainerScripts(getPlayerPtr()); mWorldScene->changeToExteriorCell(position, adjustPlayerPos, changeEvent); addContainerScripts(getPlayerPtr(), getPlayerPtr().getCell()); + mRendering->getCamera()->skipFocalPointTransition(); } void World::changeToCell (const ESM::CellId& cellId, const ESM::Position& position, bool adjustPlayerPos, bool changeEvent)