From 2f6b3afbab3c799272700073d88ecd76bbd7f412 Mon Sep 17 00:00:00 2001 From: Dimava Date: Fri, 3 Jul 2020 23:02:27 +0300 Subject: [PATCH 1/4] Wheel zoom saves world mouse position --- src/js/game/camera.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/js/game/camera.js b/src/js/game/camera.js index 2caeb863..477bf5ec 100644 --- a/src/js/game/camera.js +++ b/src/js/game/camera.js @@ -509,6 +509,14 @@ export class Camera extends BasicSerializableObject { this.clampZoomLevel(); this.desiredZoom = null; + + const mousePosition = this.root.app.mousePosition; + if (mousePosition) { + const worldPos = this.root.camera.screenToWorld(mousePosition); + let de = worldPos.sub(this.center); + this.center = this.center.add(de.multiplyScalar(delta)); + } + return false; } From 785f20c35f855d250b1f5070724a15ff6a1e4a1c Mon Sep 17 00:00:00 2001 From: Dimava Date: Fri, 3 Jul 2020 23:27:26 +0300 Subject: [PATCH 2/4] fix jumps with desiredCenter --- src/js/game/camera.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/js/game/camera.js b/src/js/game/camera.js index 477bf5ec..5bfe7b51 100644 --- a/src/js/game/camera.js +++ b/src/js/game/camera.js @@ -514,6 +514,7 @@ export class Camera extends BasicSerializableObject { if (mousePosition) { const worldPos = this.root.camera.screenToWorld(mousePosition); let de = worldPos.sub(this.center); + this.desiredCenter = null; this.center = this.center.add(de.multiplyScalar(delta)); } From 35f427da82d50ef659e8b371af27daba6cd78dfc Mon Sep 17 00:00:00 2001 From: Dimava Date: Fri, 3 Jul 2020 23:27:44 +0300 Subject: [PATCH 3/4] remove moving on min/max zoom --- src/js/game/camera.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/js/game/camera.js b/src/js/game/camera.js index 5bfe7b51..ab5c68eb 100644 --- a/src/js/game/camera.js +++ b/src/js/game/camera.js @@ -500,6 +500,7 @@ export class Camera extends BasicSerializableObject { event.preventDefault(); // event.stopPropagation(); } + const prevZoom = this.zoomLevel; const delta = Math.sign(event.deltaY) * -0.15 * this.root.app.settings.getScrollWheelSensitivity(); assert(Number.isFinite(delta), "Got invalid delta in mouse wheel event: " + event.deltaY); @@ -515,7 +516,8 @@ export class Camera extends BasicSerializableObject { const worldPos = this.root.camera.screenToWorld(mousePosition); let de = worldPos.sub(this.center); this.desiredCenter = null; - this.center = this.center.add(de.multiplyScalar(delta)); + const actualDelta = this.zoomLevel / prevZoom - 1; + this.center = this.center.add(de.multiplyScalar(actualDelta)); } return false; From af1893ba086ea12adcff2cb4ec48d29885e366bd Mon Sep 17 00:00:00 2001 From: Dimava Date: Sat, 4 Jul 2020 17:50:49 +0300 Subject: [PATCH 4/4] find a more meaningful name and make it const --- src/js/game/camera.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js/game/camera.js b/src/js/game/camera.js index ab5c68eb..ab73fc83 100644 --- a/src/js/game/camera.js +++ b/src/js/game/camera.js @@ -514,10 +514,10 @@ export class Camera extends BasicSerializableObject { const mousePosition = this.root.app.mousePosition; if (mousePosition) { const worldPos = this.root.camera.screenToWorld(mousePosition); - let de = worldPos.sub(this.center); - this.desiredCenter = null; + const worldDelta = worldPos.sub(this.center); const actualDelta = this.zoomLevel / prevZoom - 1; - this.center = this.center.add(de.multiplyScalar(actualDelta)); + this.center = this.center.add(worldDelta.multiplyScalar(actualDelta)); + this.desiredCenter = null; } return false;