mirror of
https://github.com/tobspr/shapez.io.git
synced 2025-12-15 03:01:52 +00:00
Make zoom levels power-of-2 with variable divider
This commit is contained in:
parent
47c4bbcd23
commit
a1148b254f
@ -51,6 +51,8 @@ export class Camera extends BasicSerializableObject {
|
||||
// Find optimal initial zoom
|
||||
|
||||
this.zoomLevel = this.findInitialZoom();
|
||||
this.doubleZoomCount = 4;
|
||||
this.kbDoubleZoomCount = 4;
|
||||
this.clampZoomLevel();
|
||||
|
||||
/** @type {Vector} */
|
||||
@ -343,9 +345,8 @@ export class Camera extends BasicSerializableObject {
|
||||
mapper.getBinding(KEYMAPPINGS.ingame.mapMoveRight).add(() => (this.keyboardForce.x = 1));
|
||||
mapper.getBinding(KEYMAPPINGS.ingame.mapMoveLeft).add(() => (this.keyboardForce.x = -1));
|
||||
|
||||
const roundToPow = (v, n)=> Math.pow(2, Math.round(Math.log2(v) * n) / n);
|
||||
mapper.getBinding(KEYMAPPINGS.ingame.mapZoomIn).add(() => (this.desiredZoom = roundToPow(this.zoomLevel * 1.2, 4)));
|
||||
mapper.getBinding(KEYMAPPINGS.ingame.mapZoomOut).add(() => (this.desiredZoom = roundToPow(this.zoomLevel * 0.8, 4)));
|
||||
mapper.getBinding(KEYMAPPINGS.ingame.mapZoomIn).add(() => this.changePowZoomLevel(+1, true, this.kbDoubleZoomCount));
|
||||
mapper.getBinding(KEYMAPPINGS.ingame.mapZoomOut).add(() => this.changePowZoomLevel(-1, true, this.kbDoubleZoomCount));
|
||||
|
||||
mapper.getBinding(KEYMAPPINGS.ingame.centerMap).add(() => this.centerOnMap());
|
||||
}
|
||||
@ -402,6 +403,34 @@ export class Camera extends BasicSerializableObject {
|
||||
return this.zoomLevel >= minLevel + 0.01;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes zoom level as a power of 2
|
||||
* @param {number} level
|
||||
* @param {boolean} asDesired
|
||||
* @param {number} divider
|
||||
*/
|
||||
setPowZoomLevel(level, asDesired = false, divider = this.doubleZoomCount) {
|
||||
const value = Math.pow(2, Math.round(level * divider) / divider);
|
||||
console.log({newZoomLevel:value, level, asDesired, divider})
|
||||
if (asDesired) {
|
||||
this.desiredZoom = value;
|
||||
} else {
|
||||
this.zoomLevel = value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes zoom level as a power of 2 relatively
|
||||
* @param {number} delta
|
||||
* @param {boolean} asDesired
|
||||
* @param {number} divider
|
||||
*/
|
||||
changePowZoomLevel(delta, asDesired = false, divider = this.doubleZoomCount) {
|
||||
const prevPow = Math.log2(asDesired && this.desiredZoom != null ? this.desiredZoom : this.zoomLevel);
|
||||
const nextPow = prevPow + delta / divider;
|
||||
this.setPowZoomLevel(nextPow, asDesired, divider);
|
||||
}
|
||||
|
||||
// EVENTS
|
||||
|
||||
/**
|
||||
@ -493,15 +522,13 @@ export class Camera extends BasicSerializableObject {
|
||||
// event.stopPropagation();
|
||||
}
|
||||
|
||||
const delta = Math.sign(event.deltaY) * -0.15;
|
||||
const delta = -Math.sign(event.deltaY);
|
||||
assert(Number.isFinite(delta), "Got invalid delta in mouse wheel event: " + event.deltaY);
|
||||
assert(Number.isFinite(this.zoomLevel), "Got invalid zoom level *before* wheel: " + this.zoomLevel);
|
||||
this.zoomLevel *= 1 + delta;
|
||||
this.changePowZoomLevel(delta);
|
||||
assert(Number.isFinite(this.zoomLevel), "Got invalid zoom level *after* wheel: " + this.zoomLevel);
|
||||
|
||||
this.clampZoomLevel();
|
||||
const roundToPow = (v, n)=> Math.pow(2, Math.round(Math.log2(v) * n) / n);
|
||||
this.desiredZoom = roundToPow(this.zoomLevel, 4);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user