From 8ac143c9831af86fe16b523f731858bbbecf25b3 Mon Sep 17 00:00:00 2001 From: Petr Mikheev Date: Thu, 16 Jul 2020 23:32:59 +0200 Subject: [PATCH] Camera can pull out after clearing obstruction instead of instant snapback. --- apps/openmw/mwrender/camera.cpp | 7 +++++++ apps/openmw/mwrender/camera.hpp | 1 + 2 files changed, 8 insertions(+) diff --git a/apps/openmw/mwrender/camera.cpp b/apps/openmw/mwrender/camera.cpp index 7531e712b5..d074471ada 100644 --- a/apps/openmw/mwrender/camera.cpp +++ b/apps/openmw/mwrender/camera.cpp @@ -62,6 +62,7 @@ namespace MWRender mVanityToggleQueuedValue(false), mViewModeToggleQueued(false), mCameraDistance(0.f), + mMaxNextCameraDistance(800.f), mFocalPointCurrentOffset(osg::Vec2d()), mFocalPointTargetOffset(osg::Vec2d()), mFocalPointTransitionSpeedCoef(1.f), @@ -221,6 +222,8 @@ namespace MWRender float speed = mTrackingPtr.getClass().getSpeed(mTrackingPtr); float maxDelta = 300.f * duration; mSmoothedSpeed += osg::clampBetween(speed - mSmoothedSpeed, -maxDelta, maxDelta); + + mMaxNextCameraDistance = mCameraDistance + duration * (100.f + mBaseCameraDistance); } void Camera::setFocalPointTargetOffset(osg::Vec2d v) @@ -472,7 +475,11 @@ namespace MWRender if (mVanity.enabled || mPreviewMode) mCameraDistance = mPreviewCam.offset; else if (!mFirstPersonView) + { mCameraDistance = mBaseCameraDistance + getCameraDistanceCorrection(); + if (mDynamicCameraDistanceEnabled) + mCameraDistance = std::min(mCameraDistance, mMaxNextCameraDistance); + } mFocalPointAdjustment = osg::Vec3d(); } diff --git a/apps/openmw/mwrender/camera.hpp b/apps/openmw/mwrender/camera.hpp index 59fa53047a..041df7afe7 100644 --- a/apps/openmw/mwrender/camera.hpp +++ b/apps/openmw/mwrender/camera.hpp @@ -54,6 +54,7 @@ namespace MWRender bool mViewModeToggleQueued; float mCameraDistance; + float mMaxNextCameraDistance; osg::Vec3d mFocalPointAdjustment; osg::Vec2d mFocalPointCurrentOffset;