From 268a55b71b462f2fef0a6d08345a0a5f1dbcd18e Mon Sep 17 00:00:00 2001 From: Aleksey Olokhtonov Date: Mon, 5 Jan 2026 15:10:31 +0300 Subject: [PATCH] Use framerate-independent lerp. Very Freya-esque in that sense. --- client/webgl_draw.js | 11 +++++++---- client/webgl_listeners.js | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/client/webgl_draw.js b/client/webgl_draw.js index d4133b6..1b34d35 100644 --- a/client/webgl_draw.js +++ b/client/webgl_draw.js @@ -630,18 +630,21 @@ async function draw(state, context, animate, ts) { } if (state.canvas.target_zoom != state.canvas.zoom) { - update_canvas_zoom(state, state.canvas.zoom, state.canvas.target_zoom, animate ? dt : context.last_frame_dt); + update_canvas_zoom(state, state.canvas.zoom, state.canvas.target_zoom, animate ? dt : 0); schedule_draw(state, context, true); } +} - context.last_frame_dt = dt; +// https://www.youtube.com/watch?v=LSNQuFEDOyQ +function exp_decay(a, b, decay, dt) { + return b + (a - b) * Math.exp(-decay * dt); } function update_canvas_zoom(state, current, target, dt) { - const rate = Math.min(1.0, dt / 16.66 * 0.3); + const decay = 16; if (Math.abs(1.0 - current / target) > 0.01) { - state.canvas.zoom = current + (target - current) * rate; + state.canvas.zoom = exp_decay(state.canvas.zoom, target, decay, dt / 1000.0); } else { state.canvas.zoom = target; } diff --git a/client/webgl_listeners.js b/client/webgl_listeners.js index 8494b72..ccc5409 100644 --- a/client/webgl_listeners.js +++ b/client/webgl_listeners.js @@ -91,7 +91,7 @@ function zenmode() { } function enter_picker_mode(state, context) { - if (state.tools.active === 'pencil') { // or other drawing tools + if (['pencil', 'ruler'].includes(state.tools.active)) { // or other drawing tools document.querySelector('canvas').classList.add('picker'); document.querySelector('.picker-preview-outer').classList.remove('dhide'); document.querySelector('.brush-dom').classList.add('dhide');