From 0213c90bdc8e3c4c89dfc024c77eee0d016729c0 Mon Sep 17 00:00:00 2001 From: "Lin, Yong Xiang" Date: Sat, 21 Sep 2024 10:48:31 +0800 Subject: [PATCH] Add Viewport Smooth Focus Transition Animation config option --- source/creator/core/settings.d | 7 +++++++ source/creator/panels/viewport.d | 27 +++++++++++++++++------- source/creator/viewport/package.d | 34 +++++++++++++++++++++++++++++++ source/creator/windows/settings.d | 21 +++++++++++++++++++ 4 files changed, 82 insertions(+), 7 deletions(-) diff --git a/source/creator/core/settings.d b/source/creator/core/settings.d index cabb20be1..aa61711b5 100644 --- a/source/creator/core/settings.d +++ b/source/creator/core/settings.d @@ -80,6 +80,13 @@ void incSettingsSet(T)(string name, T value) if (!is(T == string[])) { settings[name] = value; } +/** + Removes a setting +*/ +void incSettingsRemove(string name) { + settings.object.remove(name); +} + /** Gets a value from the settings store */ diff --git a/source/creator/panels/viewport.d b/source/creator/panels/viewport.d index 765f4d5ff..870c6ebf0 100644 --- a/source/creator/panels/viewport.d +++ b/source/creator/panels/viewport.d @@ -308,10 +308,23 @@ protected: } igEndChild(); - // Handle smooth move - incViewportZoom = fdampen(incViewportZoom, incViewportTargetZoom, cast(float)deltaTime); + handleViewportSmoothMove(camera); + } + + /** + Handle smooth movement of the viewport + */ + void handleViewportSmoothMove(Camera camera) { + if (incIsEnabledSmoothFocus()) { + float maxSpeed = incGetViewportSmoothMaxSpeed(); + float speed = incGetViewportSmoothSpeed(); + incViewportZoom = fdampen(incViewportZoom, incViewportTargetZoom, cast(float)deltaTime, maxSpeed, speed); + camera.position = vec2(fdampen(camera.position, incViewportTargetPosition, cast(float)deltaTime, maxSpeed, speed)); + } else { + incViewportZoom = incViewportTargetZoom; + camera.position = incViewportTargetPosition; + } camera.scale = vec2(incViewportZoom, incViewportZoom); - camera.position = vec2(fdampen(camera.position, incViewportTargetPosition, cast(float)deltaTime)); } public: @@ -327,7 +340,7 @@ mixin incPanel!ViewportPanel; import inmath.util; import std.traits; -V fdampen(V, T)(V current, V target, T delta, T maxSpeed = 50) if(isVector!V && isFloatingPoint!T) { +V fdampen(V, T)(V current, V target, T delta, T maxSpeed = 50, T conifgSpeed = 5.0) if(isVector!V && isFloatingPoint!T) { V out_ = current; V diff = current - target; @@ -336,7 +349,7 @@ V fdampen(V, T)(V current, V target, T delta, T maxSpeed = 50) if(isVector!V && V direction = (diff).normalized; T speed = min( - max(0.001, 5.0*(target - current).length) * delta, + max(0.001, conifgSpeed*(target - current).length) * delta, maxSpeed ); V velocity = direction * speed; @@ -353,7 +366,7 @@ V fdampen(V, T)(V current, V target, T delta, T maxSpeed = 50) if(isVector!V && return out_; } -T fdampen(T)(T current, T target, T delta, T maxSpeed = 50) if(isFloatingPoint!T) { +T fdampen(T)(T current, T target, T delta, T maxSpeed = 50, T conifgSpeed = 5.0) if(isFloatingPoint!T) { T out_ = current; T diff = current - target; T diffLen = sqrt(diff^^2); @@ -363,7 +376,7 @@ T fdampen(T)(T current, T target, T delta, T maxSpeed = 50) if(isFloatingPoint!T if (diffLen > 0) { T speed = min( - max(0.001, 5.0*sqrt((target - current)^^2)) * delta, + max(0.001, conifgSpeed*sqrt((target - current)^^2)) * delta, maxSpeed ); T velocity = direction * speed; diff --git a/source/creator/viewport/package.d b/source/creator/viewport/package.d index f55e7d962..076a1e1d6 100644 --- a/source/creator/viewport/package.d +++ b/source/creator/viewport/package.d @@ -971,3 +971,37 @@ bool incSetViewportZoomSpeed(float speed) { incSettingsSet("ViewportZoomSpeed", speed); return true; } + +/** + Viewport smooth focus configuration + also see fdampen() function +*/ +bool incIsEnabledSmoothFocus() { + return incSettingsGet!bool("Viewport.EnabledSmoothFocus", true); +} + +void incSetEnabledSmoothFocus(bool enable) { + incSettingsSet("Viewport.EnabledSmoothFocus", enable); +} + +float incGetViewportSmoothSpeed() { + return incSettingsGet!float("Viewport.SmoothSpeed", 5); +} + +void incSetViewportSmoothSpeed(float speed) { + incSettingsSet("Viewport.SmoothSpeed", speed); +} + +float incGetViewportSmoothMaxSpeed() { + return incSettingsGet!float("Viewport.SmoothMaxSpeed", 50); +} + +void incSetViewportSmoothMaxSpeed(float speed) { + incSettingsSet("Viewport.SmoothMaxSpeed", speed); +} + +void incResetViewportSmoothSpeed() { + incSettingsRemove("Viewport.SmoothSpeed"); + incSettingsRemove("Viewport.SmoothMaxSpeed"); + incSettingsRemove("Viewport.EnabledSmoothFocus"); +} \ No newline at end of file diff --git a/source/creator/windows/settings.d b/source/creator/windows/settings.d index 77fab11c3..1c6227064 100644 --- a/source/creator/windows/settings.d +++ b/source/creator/windows/settings.d @@ -238,6 +238,27 @@ protected: incSetViewportZoomSpeed(zoomSpeed); } endSection(); + + beginSection(__("Smooth Focus Transition Animation")); + bool smoothFocus = incIsEnabledSmoothFocus(); + if (igCheckbox(__("Enable Smooth Focus Animation"), &smoothFocus)) + incSetEnabledSmoothFocus(smoothFocus); + + igBeginDisabled(!smoothFocus); + float focusSpeed = incGetViewportSmoothSpeed(); + if (igDragFloat(__("Focus Speed"), &focusSpeed, 0.01, 0, 100, "%0.2f")) + incSetViewportSmoothSpeed(focusSpeed); + + float maxSpeed = incGetViewportSmoothMaxSpeed(); + if (igDragFloat(__("Max Speed"), &maxSpeed, 0.01, 0, 1000, "%0.2f")) + incSetViewportSmoothMaxSpeed(maxSpeed); + + igEndDisabled(); + + if (igButton(__("Reset##Smooth Focus"), ImVec2(64, 24))) + incResetViewportSmoothSpeed(); + + endSection(); break; default: incLabelOver(_("No settings for this category."), ImVec2(0, 0), true);