normalize dolly in/out across browsers

This commit is contained in:
Stewart Allen 2026-01-10 21:01:20 -05:00
commit 4c79aac48f
2 changed files with 30 additions and 13 deletions

10
app.js
View file

@ -581,17 +581,9 @@ function cookieValue(cookie,key) {
function addAppHeaders(req, res, next) {
if (req.app.path.indexOf("/lib") === 0) {
addCorsHeaders(req, res);
} else
if ([
} else if ([
"/kiri/",
"/mesh/",
// "/lib/gpu/raster.js",
// "/lib/gpu/raster-worker.js",
// "/lib/mesh/work.js",
// "/lib/kiri/run/worker.js",
// "/lib/kiri/run/minion.js",
// "/lib/kiri/run/engine.js",
// "/lib/kiri/run/frame.js"
].indexOf(req.app.path) >= 0) {
addCorsHeaders(req, res);
}

View file

@ -354,7 +354,7 @@ class Orbit extends EventDispatcher {
function getZoomScale(factor = 1) {
// Use slower zoom for orthographic mode
let base = mode === MODE.ORTHOGRAPHIC ? 0.98 : 0.95;
let base = mode === MODE.ORTHOGRAPHIC ? 0.98 : 0.97;
return Math.pow(base, factor);
}
@ -461,7 +461,31 @@ class Orbit extends EventDispatcher {
slider(null);
let delta = -(event.deltaY || event.wheelDelta || event.detail || 0);
// Normalize delta across browsers
let delta = 0;
if (event.wheelDelta !== undefined) {
// Chrome/Safari use wheelDelta (positive = scroll up, zoom out)
delta = -event.wheelDelta;
} else if (event.detail !== undefined) {
// Old Firefox DOMMouseScroll uses detail
delta = event.detail * 40; // Normalize to pixel values
} else if (event.deltaY !== undefined) {
// Modern browsers (including Firefox) use deltaY
// Firefox can send deltas in different units (pixels, lines, pages)
delta = event.deltaY;
// Firefox's deltaMode indicates the unit of deltaY
// DOM_DELTA_PIXEL (0x00) - pixels
// DOM_DELTA_LINE (0x01) - lines (default for Firefox, ~3 units per notch)
// DOM_DELTA_PAGE (0x02) - pages
if (event.deltaMode === 1) {
// LINE mode: Firefox typically sends values around 3 per scroll notch
// Multiply by a smaller factor to make it less sensitive
delta = delta * 10;
} else if (event.deltaMode === 2) {
// PAGE mode: very large deltas
delta = delta * 120;
}
}
if (delta === 0) return;
@ -657,8 +681,9 @@ class Orbit extends EventDispatcher {
domEl.addEventListener('contextmenu', function (event) { event.preventDefault() }, false);
domEl.addEventListener('mousedown', onMouseDown, false);
domEl.addEventListener('mousewheel', onMouseWheel, false);
domEl.addEventListener('DOMMouseScroll', onMouseWheel, false); // firefox
domEl.addEventListener('wheel', onMouseWheel, false); // Modern standard (Chrome, Safari, Firefox)
domEl.addEventListener('mousewheel', onMouseWheel, false); // Legacy Chrome/Safari
domEl.addEventListener('DOMMouseScroll', onMouseWheel, false); // Legacy Firefox
domEl.addEventListener('touchstart', touchstart, false);
domEl.addEventListener('touchend', touchend, false);
domEl.addEventListener('touchmove', touchmove, false);