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; 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) => { const deltaX = x - mouseX; const deltaY = y - mouseY; const originWorld = camera.screenToWorld(new Vector3(0, 0), canvas.clientWidth, canvas.clientHeight); const 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) => { const zoomAmount = delta / 200 * camera.zoom; const newZoom = camera.zoom + zoomAmount; if (newZoom > 0) { let x = 0, y = 0; if (delta < 0) { x = lastX; y = lastY; } else { const viewCenter = new Vector3(canvas.clientWidth / 2 + 15, canvas.clientHeight / 2); const mouseToCenterX = lastX - viewCenter.x; const mouseToCenterY = canvas.clientHeight - 1 - lastY - viewCenter.y; x = viewCenter.x - mouseToCenterX; y = canvas.clientHeight - 1 - viewCenter.y + mouseToCenterY; } const oldDistance = camera.screenToWorld(new Vector3(x, y), canvas.clientWidth, canvas.clientHeight); camera.zoom = newZoom; camera.update(); const newDistance = camera.screenToWorld(new Vector3(x, y), canvas.clientWidth, canvas.clientHeight); camera.position.add(oldDistance.sub(newDistance)); camera.update(); } }, zoom: (initialDistance, distance) => { const 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FtZXJhQ29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DYW1lcmFDb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUcvRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkMsTUFBTSxPQUFPLGdCQUFnQjtJQUNSO0lBQTRCO0lBQWhELFlBQW9CLE1BQW1CLEVBQVMsTUFBbUI7UUFBL0MsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbEUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUM3QixJQUFJLEVBQUUsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUU7Z0JBQzlCLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ25CLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzNCLENBQUM7WUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUU7Z0JBQ2pD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TUFBTSxPQUFPLEdBQUcsZUFBZSxHQUFHLFFBQVEsQ0FBQztnQkFDM0MsTUFBTSxDQUFDLElBQUksR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxFQUFFLEVBQUUsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUU7Z0JBQzVCLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ1YsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNYLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUU7Z0JBQy9CLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ1YsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNYLENBQUM7U0FDRCxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB0eXBlIHsgT3J0aG9DYW1lcmEgfSBmcm9tIFwiLi9DYW1lcmEuanNcIjtcbmltcG9ydCB7IElucHV0IH0gZnJvbSBcIi4vSW5wdXQuanNcIjtcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tIFwiLi9WZWN0b3IzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBDYW1lcmFDb250cm9sbGVyIHtcblx0Y29uc3RydWN0b3IgKHB1YmxpYyBjYW52YXM6IEhUTUxFbGVtZW50LCBwdWJsaWMgY2FtZXJhOiBPcnRob0NhbWVyYSkge1xuXHRcdGxldCBjYW1lcmFYID0gMCwgY2FtZXJhWSA9IDA7XG5cdFx0bGV0IG1vdXNlWCA9IDAsIG1vdXNlWSA9IDA7XG5cdFx0bGV0IGxhc3RYID0gMCwgbGFzdFkgPSAwO1xuXHRcdGxldCBpbml0aWFsWm9vbSA9IDA7XG5cblx0XHRuZXcgSW5wdXQoY2FudmFzKS5hZGRMaXN0ZW5lcih7XG5cdFx0XHRkb3duOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IHtcblx0XHRcdFx0Y2FtZXJhWCA9IGNhbWVyYS5wb3NpdGlvbi54O1xuXHRcdFx0XHRjYW1lcmFZID0gY2FtZXJhLnBvc2l0aW9uLnk7XG5cdFx0XHRcdG1vdXNlWCA9IGxhc3RYID0geDtcblx0XHRcdFx0bW91c2VZID0gbGFzdFkgPSB5O1xuXHRcdFx0XHRpbml0aWFsWm9vbSA9IGNhbWVyYS56b29tO1xuXHRcdFx0fSxcblx0XHRcdGRyYWdnZWQ6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRjb25zdCBkZWx0YVggPSB4IC0gbW91c2VYO1xuXHRcdFx0XHRjb25zdCBkZWx0YVkgPSB5IC0gbW91c2VZO1xuXHRcdFx0XHRjb25zdCBvcmlnaW5Xb3JsZCA9IGNhbWVyYS5zY3JlZW5Ub1dvcmxkKG5ldyBWZWN0b3IzKDAsIDApLCBjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpO1xuXHRcdFx0XHRjb25zdCBkZWx0YVdvcmxkID0gY2FtZXJhLnNjcmVlblRvV29ybGQobmV3IFZlY3RvcjMoZGVsdGFYLCBkZWx0YVkpLCBjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpLnN1YihvcmlnaW5Xb3JsZCk7XG5cdFx0XHRcdGNhbWVyYS5wb3NpdGlvbi5zZXQoY2FtZXJhWCAtIGRlbHRhV29ybGQueCwgY2FtZXJhWSAtIGRlbHRhV29ybGQueSwgMCk7XG5cdFx0XHRcdGNhbWVyYS51cGRhdGUoKTtcblx0XHRcdFx0bGFzdFggPSB4O1xuXHRcdFx0XHRsYXN0WSA9IHk7XG5cdFx0XHR9LFxuXHRcdFx0d2hlZWw6IChkZWx0YTogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHpvb21BbW91bnQgPSBkZWx0YSAvIDIwMCAqIGNhbWVyYS56b29tO1xuXHRcdFx0XHRjb25zdCBuZXdab29tID0gY2FtZXJhLnpvb20gKyB6b29tQW1vdW50O1xuXHRcdFx0XHRpZiAobmV3Wm9vbSA+IDApIHtcblx0XHRcdFx0XHRsZXQgeCA9IDAsIHkgPSAwO1xuXHRcdFx0XHRcdGlmIChkZWx0YSA8IDApIHtcblx0XHRcdFx0XHRcdHggPSBsYXN0WDsgeSA9IGxhc3RZO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCB2aWV3Q2VudGVyID0gbmV3IFZlY3RvcjMoY2FudmFzLmNsaWVudFdpZHRoIC8gMiArIDE1LCBjYW52YXMuY2xpZW50SGVpZ2h0IC8gMik7XG5cdFx0XHRcdFx0XHRjb25zdCBtb3VzZVRvQ2VudGVyWCA9IGxhc3RYIC0gdmlld0NlbnRlci54O1xuXHRcdFx0XHRcdFx0Y29uc3QgbW91c2VUb0NlbnRlclkgPSBjYW52YXMuY2xpZW50SGVpZ2h0IC0gMSAtIGxhc3RZIC0gdmlld0NlbnRlci55O1xuXHRcdFx0XHRcdFx0eCA9IHZpZXdDZW50ZXIueCAtIG1vdXNlVG9DZW50ZXJYO1xuXHRcdFx0XHRcdFx0eSA9IGNhbnZhcy5jbGllbnRIZWlnaHQgLSAxIC0gdmlld0NlbnRlci55ICsgbW91c2VUb0NlbnRlclk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG9sZERpc3RhbmNlID0gY2FtZXJhLnNjcmVlblRvV29ybGQobmV3IFZlY3RvcjMoeCwgeSksIGNhbnZhcy5jbGllbnRXaWR0aCwgY2FudmFzLmNsaWVudEhlaWdodCk7XG5cdFx0XHRcdFx0Y2FtZXJhLnpvb20gPSBuZXdab29tO1xuXHRcdFx0XHRcdGNhbWVyYS51cGRhdGUoKTtcblx0XHRcdFx0XHRjb25zdCBuZXdEaXN0YW5jZSA9IGNhbWVyYS5zY3JlZW5Ub1dvcmxkKG5ldyBWZWN0b3IzKHgsIHkpLCBjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpO1xuXHRcdFx0XHRcdGNhbWVyYS5wb3NpdGlvbi5hZGQob2xkRGlzdGFuY2Uuc3ViKG5ld0Rpc3RhbmNlKSk7XG5cdFx0XHRcdFx0Y2FtZXJhLnVwZGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0em9vbTogKGluaXRpYWxEaXN0YW5jZSwgZGlzdGFuY2UpID0+IHtcblx0XHRcdFx0Y29uc3QgbmV3Wm9vbSA9IGluaXRpYWxEaXN0YW5jZSAvIGRpc3RhbmNlO1xuXHRcdFx0XHRjYW1lcmEuem9vbSA9IGluaXRpYWxab29tICogbmV3Wm9vbTtcblx0XHRcdH0sXG5cdFx0XHR1cDogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdGxhc3RYID0geDtcblx0XHRcdFx0bGFzdFkgPSB5O1xuXHRcdFx0fSxcblx0XHRcdG1vdmVkOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IHtcblx0XHRcdFx0bGFzdFggPSB4O1xuXHRcdFx0XHRsYXN0WSA9IHk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG59XG4iXX0=