UNPKG

@esotericsoftware/spine-webgl

Version:
98 lines 14.5 kB
/****************************************************************************** * 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