diff --git a/src/boomer.nim b/src/boomer.nim index 4c89573..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: @@ -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 @@ -355,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/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 ) 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