From 8d06c07de804c2a40ecf009eab2957922e8f0952 Mon Sep 17 00:00:00 2001 From: Nathan Date: Tue, 12 Nov 2024 16:53:16 -0800 Subject: [PATCH] interpolate fov in easeTo and flyTo, and limit FOV --- src/mbgl/map/transform.cpp | 14 ++++++++++++-- src/mbgl/map/transform_state.cpp | 8 ++++++++ src/mbgl/map/transform_state.hpp | 4 ++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index 3cbbff923e9..c8e124e11eb 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -124,6 +124,7 @@ void Transform::easeTo(const CameraOptions& camera, const AnimationOptions& anim startLatLng.unwrapForShortestPath(latLng); } } + const double startCenterAlt = state.getCenterAltitude(); const Point startPoint = Projection::project(startLatLng, state.getScale()); const Point endPoint = Projection::project(latLng, state.getScale()); @@ -131,6 +132,7 @@ void Transform::easeTo(const CameraOptions& camera, const AnimationOptions& anim // Constrain camera options. zoom = util::clamp(zoom, state.getMinZoom(), state.getMaxZoom()); pitch = util::clamp(pitch, state.getMinPitch(), state.getMaxPitch()); + fov = util::clamp(fov, state.getMinFieldOfView(), state.getMaxFieldOfView()); // Minimize rotation by taking the shorter path around the circle. bearing = _normalizeAngle(bearing, state.getBearing()); @@ -139,7 +141,7 @@ void Transform::easeTo(const CameraOptions& camera, const AnimationOptions& anim const double startZoom = state.getZoom(); const double startBearing = state.getBearing(); const double startPitch = state.getPitch(); - const double startCenterAlt = state.getCenterAltitude(); + const double startFov = state.getFieldOfView(); state.setProperties(TransformStateProperties() .withPanningInProgress(unwrappedLatLng != startLatLng) .withScalingInProgress(zoom != startZoom) @@ -169,7 +171,9 @@ void Transform::easeTo(const CameraOptions& camera, const AnimationOptions& anim if (pitch != startPitch) { state.setPitch(util::interpolate(startPitch, pitch, t)); } - state.setFieldOfView(fov); + if (fov != startFov) { + state.setFieldOfView(util::interpolate(startFov, fov, t)); + } state.setRoll(roll); }, duration); @@ -190,6 +194,7 @@ void Transform::flyTo(const CameraOptions& camera, const AnimationOptions& anima double zoom = camera.zoom.value_or(getZoom()); double bearing = camera.bearing ? util::deg2rad(-*camera.bearing) : getBearing(); double pitch = camera.pitch ? util::deg2rad(*camera.pitch) : getPitch(); + double fov = camera.fov ? util::deg2rad(*camera.fov) : getFieldOfView(); if (std::isnan(zoom) || std::isnan(bearing) || std::isnan(pitch) || state.getSize().isEmpty()) { if (animation.transitionFinishFn) { @@ -209,6 +214,7 @@ void Transform::flyTo(const CameraOptions& camera, const AnimationOptions& anima // Constrain camera options. zoom = util::clamp(zoom, state.getMinZoom(), state.getMaxZoom()); pitch = util::clamp(pitch, state.getMinPitch(), state.getMaxPitch()); + fov = util::clamp(fov, state.getMinFieldOfView(), state.getMaxFieldOfView()); // Minimize rotation by taking the shorter path around the circle. bearing = _normalizeAngle(bearing, state.getBearing()); @@ -216,6 +222,7 @@ void Transform::flyTo(const CameraOptions& camera, const AnimationOptions& anima const double startZoom = state.scaleZoom(state.getScale()); const double startBearing = state.getBearing(); const double startPitch = state.getPitch(); + const double startFov = state.getFieldOfView(); /// w₀: Initial visible span, measured in pixels at the initial scale. /// Known henceforth as a screenful. @@ -345,6 +352,9 @@ void Transform::flyTo(const CameraOptions& camera, const AnimationOptions& anima if (pitch != startPitch) { state.setPitch(util::interpolate(startPitch, pitch, k)); } + if (fov != startFov) { + state.setFieldOfView(util::interpolate(startFov, fov, k)); + } }, duration); } diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp index 8ecdf0623db..a0ad723d5e1 100644 --- a/src/mbgl/map/transform_state.cpp +++ b/src/mbgl/map/transform_state.cpp @@ -558,6 +558,14 @@ double TransformState::getMaxPitch() const { return maxPitch; } +double TransformState::getMinFieldOfView() const { + return minFov; +} + +double TransformState::getMaxFieldOfView() const { + return maxFov; +} + // MARK: - Scale double TransformState::getScale() const { return scale; diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp index 41a05ab9035..be81f13e7ac 100644 --- a/src/mbgl/map/transform_state.hpp +++ b/src/mbgl/map/transform_state.hpp @@ -186,6 +186,8 @@ class TransformState { double getMinPitch() const; void setMaxPitch(double); double getMaxPitch() const; + double getMinFieldOfView() const; + double getMaxFieldOfView() const; // Rotation double getBearing() const; @@ -260,6 +262,8 @@ class TransformState { // Limit the amount of pitch double minPitch = util::PITCH_MIN; double maxPitch = util::PITCH_MAX; + double minFov = util::deg2rad(0.1); + double maxFov = util::deg2rad(150.0); NorthOrientation orientation = NorthOrientation::Upwards;