@esotericsoftware/spine-webgl
Version:
The official Spine Runtimes for the web.
98 lines • 14.5 kB
JavaScript
/******************************************************************************
* Spine Runtimes License Agreement
* Last updated April 5, 2025. Replaces all prior versions.
*
* Copyright (c) 2013-2025, Esoteric Software LLC
*
* Integration of the Spine Runtimes into software or otherwise creating
* derivative works of the Spine Runtimes is permitted under the terms and
* conditions of Section 2 of the Spine Editor License Agreement:
* http://esotericsoftware.com/spine-editor-license
*
* Otherwise, it is permitted to integrate the Spine Runtimes into software
* or otherwise create derivative works of the Spine Runtimes (collectively,
* "Products"), provided that each user of the Products must obtain their own
* Spine Editor license and redistribution of the Products in any form must
* include this license and copyright notice.
*
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import { Input } from "./Input.js";
import { Vector3 } from "./Vector3.js";
export class CameraController {
canvas;
camera;
constructor(canvas, camera) {
this.canvas = canvas;
this.camera = camera;
let cameraX = 0, cameraY = 0, cameraZoom = 0;
let mouseX = 0, mouseY = 0;
let lastX = 0, lastY = 0;
let initialZoom = 0;
new Input(canvas).addListener({
down: (x, y) => {
cameraX = camera.position.x;
cameraY = camera.position.y;
mouseX = lastX = x;
mouseY = lastY = y;
initialZoom = camera.zoom;
},
dragged: (x, y) => {
let deltaX = x - mouseX;
let deltaY = y - mouseY;
let originWorld = camera.screenToWorld(new Vector3(0, 0), canvas.clientWidth, canvas.clientHeight);
let deltaWorld = camera.screenToWorld(new Vector3(deltaX, deltaY), canvas.clientWidth, canvas.clientHeight).sub(originWorld);
camera.position.set(cameraX - deltaWorld.x, cameraY - deltaWorld.y, 0);
camera.update();
lastX = x;
lastY = y;
},
wheel: (delta) => {
let zoomAmount = delta / 200 * camera.zoom;
let newZoom = camera.zoom + zoomAmount;
if (newZoom > 0) {
let x = 0, y = 0;
if (delta < 0) {
x = lastX;
y = lastY;
}
else {
let viewCenter = new Vector3(canvas.clientWidth / 2 + 15, canvas.clientHeight / 2);
let mouseToCenterX = lastX - viewCenter.x;
let mouseToCenterY = canvas.clientHeight - 1 - lastY - viewCenter.y;
x = viewCenter.x - mouseToCenterX;
y = canvas.clientHeight - 1 - viewCenter.y + mouseToCenterY;
}
let oldDistance = camera.screenToWorld(new Vector3(x, y), canvas.clientWidth, canvas.clientHeight);
camera.zoom = newZoom;
camera.update();
let newDistance = camera.screenToWorld(new Vector3(x, y), canvas.clientWidth, canvas.clientHeight);
camera.position.add(oldDistance.sub(newDistance));
camera.update();
}
},
zoom: (initialDistance, distance) => {
let newZoom = initialDistance / distance;
camera.zoom = initialZoom * newZoom;
},
up: (x, y) => {
lastX = x;
lastY = y;
},
moved: (x, y) => {
lastX = x;
lastY = y;
},
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FtZXJhQ29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DYW1lcmFDb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkMsTUFBTSxPQUFPLGdCQUFnQjtJQUNSO0lBQTRCO0lBQWhELFlBQW9CLE1BQW1CLEVBQVMsTUFBbUI7UUFBL0MsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbEUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUM3QyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN6QixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFFcEIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQzdCLElBQUksRUFBRSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRTtnQkFDOUIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLE1BQU0sR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDM0IsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDLENBQVMsRUFBRSxD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QVEsRUFBRSxFQUFFO2dCQUNuQyxJQUFJLE9BQU8sR0FBRyxlQUFlLEdBQUcsUUFBUSxDQUFDO2dCQUN6QyxNQUFNLENBQUMsSUFBSSxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUM7WUFDckMsQ0FBQztZQUNELEVBQUUsRUFBRSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRTtnQkFDNUIsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDVixLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ1gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRTtnQkFDL0IsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDVixLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ1gsQ0FBQztTQUNELENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSW5wdXQgfSBmcm9tIFwiLi9JbnB1dC5qc1wiO1xuaW1wb3J0IHsgT3J0aG9DYW1lcmEgfSBmcm9tIFwiLi9DYW1lcmEuanNcIjtcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tIFwiLi9WZWN0b3IzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBDYW1lcmFDb250cm9sbGVyIHtcblx0Y29uc3RydWN0b3IgKHB1YmxpYyBjYW52YXM6IEhUTUxFbGVtZW50LCBwdWJsaWMgY2FtZXJhOiBPcnRob0NhbWVyYSkge1xuXHRcdGxldCBjYW1lcmFYID0gMCwgY2FtZXJhWSA9IDAsIGNhbWVyYVpvb20gPSAwO1xuXHRcdGxldCBtb3VzZVggPSAwLCBtb3VzZVkgPSAwO1xuXHRcdGxldCBsYXN0WCA9IDAsIGxhc3RZID0gMDtcblx0XHRsZXQgaW5pdGlhbFpvb20gPSAwO1xuXG5cdFx0bmV3IElucHV0KGNhbnZhcykuYWRkTGlzdGVuZXIoe1xuXHRcdFx0ZG93bjogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdGNhbWVyYVggPSBjYW1lcmEucG9zaXRpb24ueDtcblx0XHRcdFx0Y2FtZXJhWSA9IGNhbWVyYS5wb3NpdGlvbi55O1xuXHRcdFx0XHRtb3VzZVggPSBsYXN0WCA9IHg7XG5cdFx0XHRcdG1vdXNlWSA9IGxhc3RZID0geTtcblx0XHRcdFx0aW5pdGlhbFpvb20gPSBjYW1lcmEuem9vbTtcblx0XHRcdH0sXG5cdFx0XHRkcmFnZ2VkOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IHtcblx0XHRcdFx0bGV0IGRlbHRhWCA9IHggLSBtb3VzZVg7XG5cdFx0XHRcdGxldCBkZWx0YVkgPSB5IC0gbW91c2VZO1xuXHRcdFx0XHRsZXQgb3JpZ2luV29ybGQgPSBjYW1lcmEuc2NyZWVuVG9Xb3JsZChuZXcgVmVjdG9yMygwLCAwKSwgY2FudmFzLmNsaWVudFdpZHRoLCBjYW52YXMuY2xpZW50SGVpZ2h0KTtcblx0XHRcdFx0bGV0IGRlbHRhV29ybGQgPSBjYW1lcmEuc2NyZWVuVG9Xb3JsZChuZXcgVmVjdG9yMyhkZWx0YVgsIGRlbHRhWSksIGNhbnZhcy5jbGllbnRXaWR0aCwgY2FudmFzLmNsaWVudEhlaWdodCkuc3ViKG9yaWdpbldvcmxkKTtcblx0XHRcdFx0Y2FtZXJhLnBvc2l0aW9uLnNldChjYW1lcmFYIC0gZGVsdGFXb3JsZC54LCBjYW1lcmFZIC0gZGVsdGFXb3JsZC55LCAwKTtcblx0XHRcdFx0Y2FtZXJhLnVwZGF0ZSgpO1xuXHRcdFx0XHRsYXN0WCA9IHg7XG5cdFx0XHRcdGxhc3RZID0geTtcblx0XHRcdH0sXG5cdFx0XHR3aGVlbDogKGRlbHRhOiBudW1iZXIpID0+IHtcblx0XHRcdFx0bGV0IHpvb21BbW91bnQgPSBkZWx0YSAvIDIwMCAqIGNhbWVyYS56b29tO1xuXHRcdFx0XHRsZXQgbmV3Wm9vbSA9IGNhbWVyYS56b29tICsgem9vbUFtb3VudDtcblx0XHRcdFx0aWYgKG5ld1pvb20gPiAwKSB7XG5cdFx0XHRcdFx0bGV0IHggPSAwLCB5ID0gMDtcblx0XHRcdFx0XHRpZiAoZGVsdGEgPCAwKSB7XG5cdFx0XHRcdFx0XHR4ID0gbGFzdFg7IHkgPSBsYXN0WTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bGV0IHZpZXdDZW50ZXIgPSBuZXcgVmVjdG9yMyhjYW52YXMuY2xpZW50V2lkdGggLyAyICsgMTUsIGNhbnZhcy5jbGllbnRIZWlnaHQgLyAyKTtcblx0XHRcdFx0XHRcdGxldCBtb3VzZVRvQ2VudGVyWCA9IGxhc3RYIC0gdmlld0NlbnRlci54O1xuXHRcdFx0XHRcdFx0bGV0IG1vdXNlVG9DZW50ZXJZID0gY2FudmFzLmNsaWVudEhlaWdodCAtIDEgLSBsYXN0WSAtIHZpZXdDZW50ZXIueTtcblx0XHRcdFx0XHRcdHggPSB2aWV3Q2VudGVyLnggLSBtb3VzZVRvQ2VudGVyWDtcblx0XHRcdFx0XHRcdHkgPSBjYW52YXMuY2xpZW50SGVpZ2h0IC0gMSAtIHZpZXdDZW50ZXIueSArIG1vdXNlVG9DZW50ZXJZO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsZXQgb2xkRGlzdGFuY2UgPSBjYW1lcmEuc2NyZWVuVG9Xb3JsZChuZXcgVmVjdG9yMyh4LCB5KSwgY2FudmFzLmNsaWVudFdpZHRoLCBjYW52YXMuY2xpZW50SGVpZ2h0KTtcblx0XHRcdFx0XHRjYW1lcmEuem9vbSA9IG5ld1pvb207XG5cdFx0XHRcdFx0Y2FtZXJhLnVwZGF0ZSgpO1xuXHRcdFx0XHRcdGxldCBuZXdEaXN0YW5jZSA9IGNhbWVyYS5zY3JlZW5Ub1dvcmxkKG5ldyBWZWN0b3IzKHgsIHkpLCBjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpO1xuXHRcdFx0XHRcdGNhbWVyYS5wb3NpdGlvbi5hZGQob2xkRGlzdGFuY2Uuc3ViKG5ld0Rpc3RhbmNlKSk7XG5cdFx0XHRcdFx0Y2FtZXJhLnVwZGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0em9vbTogKGluaXRpYWxEaXN0YW5jZSwgZGlzdGFuY2UpID0+IHtcblx0XHRcdFx0bGV0IG5ld1pvb20gPSBpbml0aWFsRGlzdGFuY2UgLyBkaXN0YW5jZTtcblx0XHRcdFx0Y2FtZXJhLnpvb20gPSBpbml0aWFsWm9vbSAqIG5ld1pvb207XG5cdFx0XHR9LFxuXHRcdFx0dXA6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRsYXN0WCA9IHg7XG5cdFx0XHRcdGxhc3RZID0geTtcblx0XHRcdH0sXG5cdFx0XHRtb3ZlZDogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdGxhc3RYID0geDtcblx0XHRcdFx0bGFzdFkgPSB5O1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxufVxuIl19