From 4643f72634a8cfc4e683b243633a08c11ef08572 Mon Sep 17 00:00:00 2001 From: rexim Date: Thu, 28 Nov 2019 21:08:51 +0700 Subject: [PATCH 1/3] Make dragging feel super good Kreygasm --- src/boomer.nim | 5 ++++- src/config.nim | 6 ++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/boomer.nim b/src/boomer.nim index 4c89573..ec01333 100644 --- a/src/boomer.nim +++ b/src/boomer.nim @@ -301,7 +301,10 @@ proc main() = if mouse.drag: let delta = world(camera, mouse.prev) - world(camera, mouse.curr) camera.position += delta - camera.velocity = delta * config.dragVelocityFactor + # delta is the distance the mouse traveled in a single + # frame. To turn the velocity into units/second we need to + # multiple it by FPS. + camera.velocity = delta * config.fps.float mouse.prev = mouse.curr diff --git a/src/config.nim b/src/config.nim index 1221923..4a5d1ed 100644 --- a/src/config.nim +++ b/src/config.nim @@ -2,15 +2,13 @@ import macros, strutils type Config* = object scrollSpeed*: float - dragVelocityFactor*: float dragFriction*: float scaleFriction*: float fps*: int const defaultConfig* = Config( - scrollSpeed: 1.0, - dragVelocityFactor: 10.0, - dragFriction: 2.0, + scrollSpeed: 1.5, + dragFriction: 6.0, scaleFriction: 4.0, fps: 60 ) From c3ab91f65888d2c5d81ae923f8699d121c97913b Mon Sep 17 00:00:00 2001 From: rexim Date: Thu, 28 Nov 2019 21:13:33 +0700 Subject: [PATCH 2/3] Fix scale pivot until scaling animation is finished --- src/boomer.nim | 2 ++ src/navigation.nim | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/boomer.nim b/src/boomer.nim index ec01333..beff16a 100644 --- a/src/boomer.nim +++ b/src/boomer.nim @@ -358,12 +358,14 @@ proc main() = flashlight.deltaRadius += INITIAL_FL_DELTA_RADIUS else: camera.deltaScale += config.scrollSpeed + camera.scalePivot = mouse.curr of Button5: # Scoll down if (xev.xkey.state and ControlMask) > 0.uint32 and flashlight.isEnabled: flashlight.deltaRadius -= INITIAL_FL_DELTA_RADIUS else: camera.deltaScale -= config.scrollSpeed + camera.scalePivot = mouse.curr else: discard diff --git a/src/navigation.nim b/src/navigation.nim index 0aafc5e..ef0d363 100644 --- a/src/navigation.nim +++ b/src/navigation.nim @@ -3,7 +3,7 @@ import config import la import image -const VELOCITY_THRESHOLD = 10.0 +const VELOCITY_THRESHOLD = 15.0 type Mouse* = object curr*: Vec2f @@ -15,6 +15,7 @@ type Camera* = object velocity*: Vec2f scale*: float32 deltaScale*: float + scalePivot*: Vec2f proc world*(camera: Camera, v: Vec2f): Vec2f = v / camera.scale @@ -22,9 +23,9 @@ proc world*(camera: Camera, v: Vec2f): Vec2f = proc update*(camera: var Camera, config: Config, dt: float, mouse: Mouse, image: Image, windowSize: Vec2f) = if abs(camera.deltaScale) > 0.5: - let p0 = (mouse.curr - (windowSize * 0.5)) / camera.scale + let p0 = (camera.scalePivot - (windowSize * 0.5)) / camera.scale camera.scale = max(camera.scale + camera.delta_scale * dt, 0.01) - let p1 = (mouse.curr - (windowSize * 0.5)) / camera.scale + let p1 = (camera.scalePivot - (windowSize * 0.5)) / camera.scale camera.position += p0 - p1 camera.delta_scale -= camera.delta_scale * dt * config.scale_friction From 88530c9eb8924f03431742aa9b7d494d30b5e499 Mon Sep 17 00:00:00 2001 From: rexim Date: Thu, 28 Nov 2019 21:17:25 +0700 Subject: [PATCH 3/3] Make radius animation sort of okay for now --- src/boomer.nim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/boomer.nim b/src/boomer.nim index beff16a..be74ffd 100644 --- a/src/boomer.nim +++ b/src/boomer.nim @@ -83,13 +83,13 @@ type Flashlight = object deltaRadius: float32 const - INITIAL_FL_DELTA_RADIUS = 100.0 - FL_DELTA_RADIUS_DECELERATION = 5.0 + INITIAL_FL_DELTA_RADIUS = 250.0 + FL_DELTA_RADIUS_DECELERATION = 10.0 proc update(flashlight: var Flashlight, dt: float32) = flashlight.radius = max(0.0, flashlight.radius + flashlight.deltaRadius * dt) - if abs(flashlight.deltaRadius) > 0.5: + if abs(flashlight.deltaRadius) > 1.0: flashlight.deltaRadius -= flashlight.deltaRadius * FL_DELTA_RADIUS_DECELERATION * dt if flashlight.isEnabled: