Merge pull request #63 from tsoding/feel-improvements

Feel improvements
pull/70/head
Alexey Kutepov 5 years ago committed by GitHub
commit e631ef22d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -83,13 +83,13 @@ type Flashlight = object
deltaRadius: float32 deltaRadius: float32
const const
INITIAL_FL_DELTA_RADIUS = 100.0 INITIAL_FL_DELTA_RADIUS = 250.0
FL_DELTA_RADIUS_DECELERATION = 5.0 FL_DELTA_RADIUS_DECELERATION = 10.0
proc update(flashlight: var Flashlight, dt: float32) = proc update(flashlight: var Flashlight, dt: float32) =
flashlight.radius = max(0.0, flashlight.radius + flashlight.deltaRadius * dt) 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 flashlight.deltaRadius -= flashlight.deltaRadius * FL_DELTA_RADIUS_DECELERATION * dt
if flashlight.isEnabled: if flashlight.isEnabled:
@ -301,7 +301,10 @@ proc main() =
if mouse.drag: if mouse.drag:
let delta = world(camera, mouse.prev) - world(camera, mouse.curr) let delta = world(camera, mouse.prev) - world(camera, mouse.curr)
camera.position += delta 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 mouse.prev = mouse.curr
@ -355,12 +358,14 @@ proc main() =
flashlight.deltaRadius += INITIAL_FL_DELTA_RADIUS flashlight.deltaRadius += INITIAL_FL_DELTA_RADIUS
else: else:
camera.deltaScale += config.scrollSpeed camera.deltaScale += config.scrollSpeed
camera.scalePivot = mouse.curr
of Button5: # Scoll down of Button5: # Scoll down
if (xev.xkey.state and ControlMask) > 0.uint32 and flashlight.isEnabled: if (xev.xkey.state and ControlMask) > 0.uint32 and flashlight.isEnabled:
flashlight.deltaRadius -= INITIAL_FL_DELTA_RADIUS flashlight.deltaRadius -= INITIAL_FL_DELTA_RADIUS
else: else:
camera.deltaScale -= config.scrollSpeed camera.deltaScale -= config.scrollSpeed
camera.scalePivot = mouse.curr
else: else:
discard discard

@ -2,15 +2,13 @@ import macros, strutils
type Config* = object type Config* = object
scrollSpeed*: float scrollSpeed*: float
dragVelocityFactor*: float
dragFriction*: float dragFriction*: float
scaleFriction*: float scaleFriction*: float
fps*: int fps*: int
const defaultConfig* = Config( const defaultConfig* = Config(
scrollSpeed: 1.0, scrollSpeed: 1.5,
dragVelocityFactor: 10.0, dragFriction: 6.0,
dragFriction: 2.0,
scaleFriction: 4.0, scaleFriction: 4.0,
fps: 60 fps: 60
) )

@ -3,7 +3,7 @@ import config
import la import la
import image import image
const VELOCITY_THRESHOLD = 10.0 const VELOCITY_THRESHOLD = 15.0
type Mouse* = object type Mouse* = object
curr*: Vec2f curr*: Vec2f
@ -15,6 +15,7 @@ type Camera* = object
velocity*: Vec2f velocity*: Vec2f
scale*: float32 scale*: float32
deltaScale*: float deltaScale*: float
scalePivot*: Vec2f
proc world*(camera: Camera, v: Vec2f): Vec2f = proc world*(camera: Camera, v: Vec2f): Vec2f =
v / camera.scale 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, proc update*(camera: var Camera, config: Config, dt: float, mouse: Mouse, image: Image,
windowSize: Vec2f) = windowSize: Vec2f) =
if abs(camera.deltaScale) > 0.5: 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) 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.position += p0 - p1
camera.delta_scale -= camera.delta_scale * dt * config.scale_friction camera.delta_scale -= camera.delta_scale * dt * config.scale_friction

Loading…
Cancel
Save