diff --git a/src/touch/CameraInput.hx b/src/touch/CameraInput.hx index 5dd238cd..f9e30a24 100644 --- a/src/touch/CameraInput.hx +++ b/src/touch/CameraInput.hx @@ -90,8 +90,8 @@ class CameraInput { scaleFactor /= Settings.touchSettings.buttonJoystickMultiplier; } - var inpX = delta.x / scaleFactor; - var inpY = delta.y / scaleFactor; + var inpX = clampInputs(delta.x / scaleFactor); + var inpY = clampInputs(delta.y / scaleFactor); if (jumpcam) { if (Math.abs(inpX) < 1.3) @@ -99,9 +99,19 @@ class CameraInput { if (Math.abs(inpY) < 1.3) inpY = 0; } - var dt = MarbleGame.instance.world.timeState.dt; - MarbleGame.instance.world.marble.camera.orbit(applyNonlinearScale(inpX) * dt * 25, applyNonlinearScale(inpY) * dt * 25, true); + // Calculate velocity (per second) instead of per-frame delta + var dt = MarbleGame.instance.world.timeState.dt; // Delta time in seconds + var velocityX = inpX / dt; + var velocityY = inpY / dt; + var velocity = Math.sqrt(velocityX * velocityX + velocityY * velocityY) / 10.0; + + // Apply non-linear scaling based on velocity + var scaledVelocity = applyNonlinearScale(velocity); + var velocityMultiplier = velocity > 0 ? scaledVelocity / velocity : 1.0; + + MarbleGame.instance.world.marble.camera.orbit((inpX * velocityMultiplier) / 3, (inpY * velocityMultiplier) / 3, true); + if (inpX != 0) prevMouse.x = e.relX; if (inpY != 0) @@ -122,8 +132,12 @@ class CameraInput { } } + function clampInputs(value:Float) { + return Util.clamp(value, -Settings.touchSettings.cameraSwipeExtent, Settings.touchSettings.cameraSwipeExtent); + } + function applyNonlinearScale(value:Float) { - var clamped = Util.clamp(value, -Settings.touchSettings.cameraSwipeExtent, Settings.touchSettings.cameraSwipeExtent); + var clamped = value; return Math.abs(clamped) < 3 ? Math.pow(Math.abs(clamped / 2), 2.7) * (clamped >= 0 ? 1 : -1) : clamped; }