支持spine4.3
This commit is contained in:
1 parent
63e4f61631
commit
0656684a92
206 files changed
+100597
-1320
No files matched your search
+26
@@ -0,0 +1,26 @@
|
||||
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:
|
||||
https://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.
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
# spine-ts Pixi.js v7
|
||||
|
||||
Please see the top-level [README.md](../README.md) for more information.
|
||||
@@ -0,0 +1,38 @@
|
||||
/******************************************************************************
|
||||
* 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 type { BlendMode, NumberArrayLike } from "@spine-particle/spine-core-4.3";
|
||||
import { DarkTintMesh } from "./darkTintMesh/DarkTintMesh.js";
|
||||
import type { ISlotMesh } from "./Spine.js";
|
||||
import { SpineTexture } from "./SpineTexture.js";
|
||||
export declare class DarkSlotMesh extends DarkTintMesh implements ISlotMesh {
|
||||
name: string;
|
||||
private static auxColor;
|
||||
constructor();
|
||||
updateFromSpineData(slotTexture: SpineTexture, slotBlendMode: BlendMode, slotName: string, finalVertices: NumberArrayLike, finalVerticesLength: number, finalIndices: NumberArrayLike, finalIndicesLength: number, darkTint: boolean): void;
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
/******************************************************************************
|
||||
* 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 { DarkTintMesh } from "./darkTintMesh/DarkTintMesh.js";
|
||||
import { SpineTexture } from "./SpineTexture.js";
|
||||
export class DarkSlotMesh extends DarkTintMesh {
|
||||
name = "";
|
||||
static auxColor = [0, 0, 0, 0];
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
updateFromSpineData(slotTexture, slotBlendMode, slotName, finalVertices, finalVerticesLength, finalIndices, finalIndicesLength, darkTint) {
|
||||
this.texture = slotTexture.texture;
|
||||
const vertLenght = (finalVerticesLength / (darkTint ? 12 : 8)) * 2;
|
||||
const textureCoord = this.geometry.getBuffer("aTextureCoord");
|
||||
if (textureCoord.data?.length !== vertLenght) {
|
||||
textureCoord.data = new Float32Array(vertLenght);
|
||||
}
|
||||
const vertexCoord = this.geometry.getBuffer("aVertexPosition");
|
||||
if (vertexCoord.data?.length !== vertLenght) {
|
||||
vertexCoord.data = new Float32Array(vertLenght);
|
||||
}
|
||||
let vertIndex = 0;
|
||||
const textureCoordData = textureCoord.data;
|
||||
const vertexCoordData = vertexCoord.data;
|
||||
for (let i = 0; i < finalVerticesLength; i += darkTint ? 12 : 8) {
|
||||
let auxi = i;
|
||||
vertexCoordData[vertIndex] = finalVertices[auxi++];
|
||||
vertexCoordData[vertIndex + 1] = finalVertices[auxi++];
|
||||
auxi += 4; // color
|
||||
textureCoordData[vertIndex] = finalVertices[auxi++];
|
||||
textureCoordData[vertIndex + 1] = finalVertices[auxi++];
|
||||
vertIndex += 2;
|
||||
}
|
||||
if (darkTint) {
|
||||
DarkSlotMesh.auxColor[0] = finalVertices[8];
|
||||
DarkSlotMesh.auxColor[1] = finalVertices[9];
|
||||
DarkSlotMesh.auxColor[2] = finalVertices[10];
|
||||
DarkSlotMesh.auxColor[3] = finalVertices[11];
|
||||
this.darkTint = DarkSlotMesh.auxColor;
|
||||
DarkSlotMesh.auxColor[0] = finalVertices[2];
|
||||
DarkSlotMesh.auxColor[1] = finalVertices[3];
|
||||
DarkSlotMesh.auxColor[2] = finalVertices[4];
|
||||
DarkSlotMesh.auxColor[3] = finalVertices[5];
|
||||
this.tint = DarkSlotMesh.auxColor;
|
||||
}
|
||||
else {
|
||||
DarkSlotMesh.auxColor[0] = finalVertices[2];
|
||||
DarkSlotMesh.auxColor[1] = finalVertices[3];
|
||||
DarkSlotMesh.auxColor[2] = finalVertices[4];
|
||||
DarkSlotMesh.auxColor[3] = finalVertices[5];
|
||||
this.tint = DarkSlotMesh.auxColor;
|
||||
}
|
||||
this.blendMode = SpineTexture.toPixiBlending(slotBlendMode);
|
||||
this.alpha = DarkSlotMesh.auxColor[3];
|
||||
const indexBuffer = this.geometry.indexBuffer;
|
||||
if (indexBuffer.data.length !== finalIndices.length) {
|
||||
indexBuffer.data = new Uint32Array(finalIndices);
|
||||
}
|
||||
else {
|
||||
const indexBufferData = indexBuffer.data;
|
||||
for (let i = 0; i < finalIndicesLength; i++) {
|
||||
indexBufferData[i] = finalIndices[i];
|
||||
}
|
||||
}
|
||||
this.name = slotName;
|
||||
textureCoord.update();
|
||||
vertexCoord.update();
|
||||
indexBuffer.update();
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1Nsb3RNZXNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0RhcmtTbG90TWVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFJL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRCxNQUFNLE9BQU8sWUFBYSxTQUFRLFlBQVk7SUFDdEMsSUFBSSxHQUFXLEVBQUUsQ0FBQztJQUVqQixNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFdkM7UUFDQyxLQUFLLEVBQUUsQ0FBQztJQUNULENBQUM7SUFDTSxtQkFBbUIsQ0FDekIsV0FBeUIsRUFDekIsYUFBd0IsRUFDeEIsUUFBZ0IsRUFDaEIsYUFBOEIsRUFDOUIsbUJBQTJCLEVBQzNCLFlBQTZCLEVBQzdCLGtCQUEwQixFQUMxQixRQUFpQjtRQUVqQixJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFFbkMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RCxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzlDLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUEyQixDQUFDO1FBQzVFLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9ELElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDN0MsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQTJCLENBQUM7UUFDM0UsQ0FBQztRQUVELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUVsQixNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDM0MsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFFYixlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkQsZUFBZSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUV2RCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUVuQixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRCxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFFeEQsU0FBUyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNkLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztZQUV0QyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDUCxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1QyxJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDOUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQTJCLENBQUM7UUFDNUUsQ0FBQzthQUFNLENBQUM7WUFDUCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDRixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFFckIsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gK
Line truncated
|
||||
@@ -0,0 +1,39 @@
|
||||
/******************************************************************************
|
||||
* 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 type { BlendMode, NumberArrayLike } from "@spine-particle/spine-core-4.3";
|
||||
import { Mesh } from "@pixi/mesh";
|
||||
import type { ISlotMesh } from "./Spine.js";
|
||||
import { SpineTexture } from "./SpineTexture.js";
|
||||
export declare class SlotMesh extends Mesh implements ISlotMesh {
|
||||
name: string;
|
||||
private static readonly auxColor;
|
||||
private warnedTwoTint;
|
||||
constructor();
|
||||
updateFromSpineData(slotTexture: SpineTexture, slotBlendMode: BlendMode, slotName: string, finalVertices: NumberArrayLike, finalVerticesLength: number, finalIndices: NumberArrayLike, finalIndicesLength: number, darkTint: boolean): void;
|
||||
}
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
/******************************************************************************
|
||||
* 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 { Texture } from "@pixi/core";
|
||||
import { Mesh, MeshGeometry, MeshMaterial } from "@pixi/mesh";
|
||||
import { SpineTexture } from "./SpineTexture.js";
|
||||
export class SlotMesh extends Mesh {
|
||||
name = "";
|
||||
static auxColor = [0, 0, 0, 0];
|
||||
warnedTwoTint = false;
|
||||
constructor() {
|
||||
const geometry = new MeshGeometry();
|
||||
geometry.getBuffer("aVertexPosition").static = false;
|
||||
geometry.getBuffer("aTextureCoord").static = false;
|
||||
const meshMaterial = new MeshMaterial(Texture.EMPTY);
|
||||
super(geometry, meshMaterial);
|
||||
}
|
||||
updateFromSpineData(slotTexture, slotBlendMode, slotName, finalVertices, finalVerticesLength, finalIndices, finalIndicesLength, darkTint) {
|
||||
this.texture = slotTexture.texture;
|
||||
const vertLenght = (finalVerticesLength / (darkTint ? 12 : 8)) * 2;
|
||||
const textureCoord = this.geometry.getBuffer("aTextureCoord");
|
||||
if (textureCoord.data?.length !== vertLenght) {
|
||||
textureCoord.data = new Float32Array(vertLenght);
|
||||
}
|
||||
const vertexCoord = this.geometry.getBuffer("aVertexPosition");
|
||||
if (vertexCoord.data?.length !== vertLenght) {
|
||||
vertexCoord.data = new Float32Array(vertLenght);
|
||||
}
|
||||
let vertIndex = 0;
|
||||
const textureCoordData = textureCoord.data;
|
||||
const vertexCoordData = vertexCoord.data;
|
||||
for (let i = 0; i < finalVerticesLength; i += darkTint ? 12 : 8) {
|
||||
let auxi = i;
|
||||
vertexCoordData[vertIndex] = finalVertices[auxi++];
|
||||
vertexCoordData[vertIndex + 1] = finalVertices[auxi++];
|
||||
auxi += 4; // color
|
||||
textureCoordData[vertIndex] = finalVertices[auxi++];
|
||||
textureCoordData[vertIndex + 1] = finalVertices[auxi++];
|
||||
vertIndex += 2;
|
||||
}
|
||||
if (darkTint && !this.warnedTwoTint) {
|
||||
console.warn("DarkTint is not enabled by default. To enable use a DarkSlotMesh factory while creating the Spine object.");
|
||||
this.warnedTwoTint = true;
|
||||
}
|
||||
SlotMesh.auxColor[0] = finalVertices[2];
|
||||
SlotMesh.auxColor[1] = finalVertices[3];
|
||||
SlotMesh.auxColor[2] = finalVertices[4];
|
||||
SlotMesh.auxColor[3] = finalVertices[5];
|
||||
this.tint = SlotMesh.auxColor;
|
||||
this.alpha = SlotMesh.auxColor[3];
|
||||
this.blendMode = SpineTexture.toPixiBlending(slotBlendMode);
|
||||
const indexBuffer = this.geometry.indexBuffer;
|
||||
if (indexBuffer.data.length !== finalIndices.length) {
|
||||
indexBuffer.data = new Uint32Array(finalIndices);
|
||||
}
|
||||
else {
|
||||
const indexBufferData = indexBuffer.data;
|
||||
for (let i = 0; i < finalIndicesLength; i++) {
|
||||
indexBufferData[i] = finalIndices[i];
|
||||
}
|
||||
}
|
||||
this.name = slotName;
|
||||
textureCoord.update();
|
||||
vertexCoord.update();
|
||||
indexBuffer.update();
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xvdE1lc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU2xvdE1lc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRy9FLE9BQU8sRUFBRSxPQUFPLEVBQW9CLE1BQU0sWUFBWSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsTUFBTSxPQUFPLFFBQVMsU0FBUSxJQUFJO0lBQzFCLElBQUksR0FBVyxFQUFFLENBQUM7SUFFakIsTUFBTSxDQUFVLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLGFBQWEsR0FBWSxLQUFLLENBQUM7SUFFdkM7UUFDQyxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXBDLFFBQVEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3JELFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVuRCxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsS0FBSyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ00sbUJBQW1CLENBQ3pCLFdBQXlCLEVBQ3pCLGFBQXdCLEVBQ3hCLFFBQWdCLEVBQ2hCLGFBQThCLEVBQzlCLG1CQUEyQixFQUMzQixZQUE2QixFQUM3QixrQkFBMEIsRUFDMUIsUUFBaUI7UUFFakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBRW5DLE1BQU0s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R0FBRyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQTJCLENBQUM7UUFDNUUsQ0FBQzthQUFNLENBQUM7WUFDUCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDRixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFFckIsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlc
Line truncated
|
||||
+345
@@ -0,0 +1,345 @@
|
||||
/******************************************************************************
|
||||
* 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 type { BlendMode, Bone, Event, NumberArrayLike, Slot, TrackEntry } from "@spine-particle/spine-core-4.3";
|
||||
import { AnimationState, Skeleton, SkeletonData, SkeletonPhysicsMovement } from "@spine-particle/spine-core-4.3";
|
||||
import { type IPointData, Ticker } from "@pixi/core";
|
||||
import type { DisplayObject, IDestroyOptions } from "@pixi/display";
|
||||
import { Container } from "@pixi/display";
|
||||
import type { ISpineDebugRenderer } from "./SpineDebugRenderer.js";
|
||||
import type { SpineTexture } from "./SpineTexture.js";
|
||||
import "@pixi/events";
|
||||
/**
|
||||
* Options to create a {@link Spine} using {@link Spine.from}.
|
||||
*/
|
||||
export interface SpineFromOptions {
|
||||
/** the asset name for the skeleton `.skel` or `.json` file previously loaded into the Assets */
|
||||
skeleton: string;
|
||||
/** the asset name for the atlas file previously loaded into the Assets */
|
||||
atlas: string;
|
||||
/** The value passed to the skeleton reader. If omitted, 1 is passed. See {@link SkeletonBinary.scale} for details. */
|
||||
scale?: number;
|
||||
/** Set the {@link Spine.autoUpdate} value. If omitted, it is set to `true`. */
|
||||
autoUpdate?: boolean;
|
||||
/**
|
||||
* If `true`, use the dark tint renderer to render the skeleton
|
||||
* If `false`, use the default pixi renderer to render the skeleton
|
||||
* If `undefined`, use the dark tint renderer if at least one slot has tint black
|
||||
*/
|
||||
darkTint?: boolean;
|
||||
/** The bounds provider to use. If undefined the bounds will be dynamic, calculated when requested and based on the current frame. */
|
||||
boundsProvider?: SpineBoundsProvider;
|
||||
/** Set {@link AtlasAttachmentLoader.allowMissingRegions} property on the AtlasAttachmentLoader. */
|
||||
allowMissingRegions?: boolean;
|
||||
/** The ticker to use when {@link autoUpdate} is `true`. Defaults to {@link Ticker.shared}. */
|
||||
ticker?: Ticker;
|
||||
}
|
||||
export interface SpineOptions {
|
||||
/** the {@link SkeletonData} used to instantiate the skeleton */
|
||||
skeletonData: SkeletonData;
|
||||
/** See {@link SpineFromOptions.autoUpdate}. */
|
||||
autoUpdate?: boolean;
|
||||
/** See {@link SpineFromOptions.darkTint}. */
|
||||
darkTint?: boolean;
|
||||
/** See {@link SpineFromOptions.boundsProvider}. */
|
||||
boundsProvider?: SpineBoundsProvider;
|
||||
/** See {@link SpineFromOptions.ticker}. */
|
||||
ticker?: Ticker;
|
||||
}
|
||||
/**
|
||||
* AnimationStateListener {@link https://en.esotericsoftware.com/spine-api-reference#AnimationStateListener events} exposed for Pixi.
|
||||
*/
|
||||
export interface SpineEvents {
|
||||
complete: [trackEntry: TrackEntry];
|
||||
dispose: [trackEntry: TrackEntry];
|
||||
end: [trackEntry: TrackEntry];
|
||||
event: [trackEntry: TrackEntry, event: Event];
|
||||
interrupt: [trackEntry: TrackEntry];
|
||||
start: [trackEntry: TrackEntry];
|
||||
}
|
||||
/** A bounds provider calculates the bounding box for a skeleton, which is then assigned as the size of the SpineGameObject. */
|
||||
export interface SpineBoundsProvider {
|
||||
/** Returns the bounding box for the skeleton, in skeleton space. */
|
||||
calculateBounds(gameObject: Spine): {
|
||||
x: number;
|
||||
y: number;
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
}
|
||||
/** A bounds provider that provides a fixed size given by the user. */
|
||||
export declare class AABBRectangleBoundsProvider implements SpineBoundsProvider {
|
||||
private x;
|
||||
private y;
|
||||
private width;
|
||||
private height;
|
||||
constructor(x: number, y: number, width: number, height: number);
|
||||
calculateBounds(): {
|
||||
x: number;
|
||||
y: number;
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
}
|
||||
/** A bounds provider that calculates the bounding box from the setup pose. */
|
||||
export declare class SetupPoseBoundsProvider implements SpineBoundsProvider {
|
||||
private clipping;
|
||||
/**
|
||||
* @param clipping If true, clipping attachments are used to compute the bounds. False, by default.
|
||||
*/
|
||||
constructor(clipping?: boolean);
|
||||
calculateBounds(gameObject: Spine): {
|
||||
x: number;
|
||||
y: number;
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
}
|
||||
/** A bounds provider that calculates the bounding box by taking the maximumg bounding box for a combination of skins and specific animation. */
|
||||
export declare class SkinsAndAnimationBoundsProvider implements SpineBoundsProvider {
|
||||
private animation;
|
||||
private skins;
|
||||
private timeStep;
|
||||
private clipping;
|
||||
/**
|
||||
* @param animation The animation to use for calculating the bounds. If null, the setup pose is used.
|
||||
* @param skins The skins to use for calculating the bounds. If empty, the default skin is used.
|
||||
* @param timeStep The time step to use for calculating the bounds. A smaller time step means more precision, but slower calculation.
|
||||
* @param clipping If true, clipping attachments are used to compute the bounds. False, by default.
|
||||
*/
|
||||
constructor(animation: string | null, skins?: string[], timeStep?: number, clipping?: boolean);
|
||||
calculateBounds(gameObject: Spine): {
|
||||
x: number;
|
||||
y: number;
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
}
|
||||
/**
|
||||
* The class to instantiate a {@link Spine} game object in Pixi.
|
||||
* Create and customize the default configuration using the static method {@link Spine.createOptions},
|
||||
* then pass it to the constructor.
|
||||
*/
|
||||
export declare class Spine extends Container {
|
||||
/** The skeleton for this Spine game object. */
|
||||
skeleton: Skeleton;
|
||||
/** The animation state for this Spine game object. */
|
||||
state: AnimationState;
|
||||
/** Tracks this Pixi container's world movement and applies it to skeleton physics constraints. */
|
||||
readonly skeletonPhysics: SkeletonPhysicsMovement;
|
||||
private darkTint;
|
||||
private hasNeverUpdated;
|
||||
private _debug?;
|
||||
get debug(): ISpineDebugRenderer | undefined;
|
||||
/** Pass a {@link SpineDebugRenderer} or create your own {@link ISpineDebugRenderer} to render bones, meshes, ...
|
||||
* @example spineGO.debug = new SpineDebugRenderer();
|
||||
*/
|
||||
set debug(value: ISpineDebugRenderer | undefined);
|
||||
protected slotMeshFactory: () => ISlotMesh;
|
||||
beforeUpdateWorldTransforms: (object: Spine) => void;
|
||||
afterUpdateWorldTransforms: (object: Spine) => void;
|
||||
private _autoUpdate;
|
||||
private _ticker;
|
||||
get autoUpdate(): boolean;
|
||||
/** When `true`, the Spine AnimationState and the Skeleton will be automatically updated using the {@link ticker}. */
|
||||
set autoUpdate(value: boolean);
|
||||
/** The ticker to use when {@link autoUpdate} is `true`. Defaults to {@link Ticker.shared}. */
|
||||
get ticker(): Ticker;
|
||||
/** Sets the ticker to use when {@link autoUpdate} is `true`. If `autoUpdate` is already `true`, the update callback will be moved from the old ticker to the new one. */
|
||||
set ticker(value: Ticker);
|
||||
private meshesCache;
|
||||
private static vectorAux;
|
||||
private static clipper;
|
||||
private static QUAD_TRIANGLES;
|
||||
private static VERTEX_SIZE;
|
||||
private static DARK_VERTEX_SIZE;
|
||||
private lightColor;
|
||||
private darkColor;
|
||||
private clippingVertAux;
|
||||
private _boundsProvider?;
|
||||
/** The bounds provider to use. If undefined the bounds will be dynamic, calculated when requested and based on the current frame. */
|
||||
get boundsProvider(): SpineBoundsProvider | undefined;
|
||||
set boundsProvider(value: SpineBoundsProvider | undefined);
|
||||
private _boundsPoint;
|
||||
private _boundsSpineID;
|
||||
private _boundsSpineDirty;
|
||||
constructor(options: SkeletonData | SpineOptions | SpineFromOptions);
|
||||
/** If {@link Spine.autoUpdate} is `false`, this method allows to update the AnimationState and the Skeleton with the given delta. */
|
||||
update(deltaSeconds: number): void;
|
||||
protected internalUpdate(_deltaFrame: number, deltaSeconds?: number): void;
|
||||
private readPhysicsTransform;
|
||||
/** Render the meshes based on the current skeleton state, render debug information, then call {@link Container.updateTransform}. */
|
||||
updateTransform(): void;
|
||||
/** Destroy Spine game object elements, then call the {@link Container.destroy} with the given options */
|
||||
destroy(options?: boolean | IDestroyOptions | undefined): void;
|
||||
/**
|
||||
* Unloads this Spine object's cached {@link SkeletonData}.
|
||||
*
|
||||
* Existing Spine objects that use this SkeletonData continue to work. Future Spine objects created with the same
|
||||
* skeleton, atlas, and scale will parse a new SkeletonData.
|
||||
* @returns `true` if the cached SkeletonData was removed, otherwise `false`.
|
||||
*/
|
||||
unloadFromCache(): boolean;
|
||||
private resetMeshes;
|
||||
protected _calculateBounds(): void;
|
||||
/**
|
||||
* Check the existence of a mesh for the given slot.
|
||||
* If you want to manually handle which meshes go on which slot and how you cache, overwrite this method.
|
||||
*/
|
||||
protected hasMeshForSlot(slot: Slot): boolean;
|
||||
/**
|
||||
* Search the mesh corresponding to the given slot or create it, if it does not exists.
|
||||
* If you want to manually handle which meshes go on which slot and how you cache, overwrite this method.
|
||||
*/
|
||||
protected getMeshForSlot(slot: Slot): ISlotMesh;
|
||||
slotsObject: Map<Slot, {
|
||||
container: Container;
|
||||
followAttachmentTimeline: boolean;
|
||||
followSlotColor: boolean;
|
||||
}>;
|
||||
private getSlotFromRef;
|
||||
/**
|
||||
* Add a pixi Container as a child of the Spine object.
|
||||
* The Container will be rendered coherently with the draw order of the slot.
|
||||
* If an attachment is active on the slot, the pixi Container will be rendered on top of it.
|
||||
* If the Container is already attached to the given slot, nothing will happen.
|
||||
* If the Container is already attached to another slot, it will be removed from that slot
|
||||
* before adding it to the given one.
|
||||
* If another Container is already attached to this slot, the old one will be removed from this
|
||||
* slot before adding it to the current one.
|
||||
* @param slotRef - The slot index, or the slot name, or the Slot where the pixi object will be added to.
|
||||
* @param pixiObject - The pixi Container to add.
|
||||
* @param options - Optional settings for the attachment.
|
||||
* @param options.followAttachmentTimeline - If true, the attachment will follow the slot's attachment timeline.
|
||||
* @param options.followSlotColor - If true, the container tint will follow the skeleton and slot colors.
|
||||
*/
|
||||
addSlotObject(slotRef: number | string | Slot, pixiObject: Container, options?: {
|
||||
followAttachmentTimeline?: boolean;
|
||||
followSlotColor?: boolean;
|
||||
}): void;
|
||||
/**
|
||||
* Return the Container connected to the given slot, if any.
|
||||
* Otherwise return undefined
|
||||
* @param pixiObject - The slot index, or the slot name, or the Slot to get the Container from.
|
||||
* @returns a Container if any, undefined otherwise.
|
||||
*/
|
||||
getSlotObject(slotRef: number | string | Slot): Container | undefined;
|
||||
/**
|
||||
* Remove a slot object from the given slot.
|
||||
* If `pixiObject` is passed and attached to the given slot, remove it from the slot.
|
||||
* If `pixiObject` is not passed and the given slot has an attached Container, remove it from the slot.
|
||||
* @param slotRef - The slot index, or the slot name, or the Slot where the pixi object will be remove from.
|
||||
* @param pixiObject - Optional, The pixi Container to remove.
|
||||
*/
|
||||
removeSlotObject(slotRef: number | string | Slot, pixiObject?: Container): void;
|
||||
/**
|
||||
* Removes all PixiJS containers attached to any slot.
|
||||
*/
|
||||
removeSlotObjects(): void;
|
||||
private verticesCache;
|
||||
private clippingSlotToPixiMasks;
|
||||
private pixiMaskCleanup;
|
||||
private updateSlotObject;
|
||||
private setSlotObjectTint;
|
||||
private updateAndSetPixiMask;
|
||||
private renderMeshes;
|
||||
calculateBounds(): void;
|
||||
updateBounds(): void;
|
||||
/**
|
||||
* Set the position of the bone given in input through a {@link IPointData}.
|
||||
* @param bone: the bone name or the bone instance to set the position
|
||||
* @param outPos: the new position of the bone.
|
||||
* @throws {Error}: if the given bone is not found in the skeleton, an error is thrown
|
||||
*/
|
||||
setBonePosition(bone: string | Bone, position: IPointData): void;
|
||||
/**
|
||||
* Return the position of the bone given in input into an {@link IPointData}.
|
||||
* @param bone: the bone name or the bone instance to get the position from
|
||||
* @param outPos: an optional {@link IPointData} to use to return the bone position, rathern than instantiating a new object.
|
||||
* @returns {IPointData | undefined}: the position of the bone, or undefined if no matching bone is found in the skeleton
|
||||
*/
|
||||
getBonePosition(bone: string | Bone, outPos?: IPointData): IPointData | undefined;
|
||||
/** Converts a point from the skeleton coordinate system to the Pixi world coordinate system. */
|
||||
skeletonToPixiWorldCoordinates(point: {
|
||||
x: number;
|
||||
y: number;
|
||||
}): void;
|
||||
/** Converts a point from the Pixi world coordinate system to the skeleton coordinate system. */
|
||||
pixiWorldCoordinatesToSkeleton(point: {
|
||||
x: number;
|
||||
y: number;
|
||||
}): void;
|
||||
/** Converts a point from the Pixi world coordinate system to the bone's local coordinate system. */
|
||||
pixiWorldCoordinatesToBone(point: {
|
||||
x: number;
|
||||
y: number;
|
||||
}, bone: Bone): void;
|
||||
/** A cache containing skeleton data and atlases already loaded by {@link Spine.from}. */
|
||||
static readonly skeletonCache: Record<string, SkeletonData>;
|
||||
private static readonly skeletonDataCacheKeys;
|
||||
private static getSkeletonCacheKey;
|
||||
/**
|
||||
* Get a convenient initialization configuration for your Spine game object.
|
||||
* Before instantiating a Spine game object, the skeleton (`.skel` or `.json`) and the atlas text files must be loaded into the Assets. For example:
|
||||
* ```
|
||||
* PIXI.Assets.add("sackData", "/assets/sack-pro.skel");
|
||||
* PIXI.Assets.add("sackAtlas", "/assets/sack-pma.atlas");
|
||||
* await PIXI.Assets.load(["sackData", "sackAtlas"]);
|
||||
* ```
|
||||
* Once a Spine game object is created, its skeleton data is cached into {@link Spine.skeletonCache} using the key:
|
||||
* `${skeletonAssetName}-${atlasAssetName}-${options?.scale ?? 1}`
|
||||
*
|
||||
* @param options - Options to configure the Spine game object. See {@link SpineFromOptions}
|
||||
* @returns {SpineOptions} The configuration ready to be passed to the Spine constructor
|
||||
*/
|
||||
static createOptions({ skeleton, atlas, scale, darkTint, autoUpdate, boundsProvider, allowMissingRegions, ticker }: SpineFromOptions): SpineOptions;
|
||||
/**
|
||||
* @deprecated Use directly the Spine constructor or {@link createOptions} to make options and customize it to pass to the constructor
|
||||
* Before instantiating a Spine game object, the skeleton (`.skel` or `.json`) and the atlas text files must be loaded into the Assets. For example:
|
||||
* ```
|
||||
* PIXI.Assets.add("sackData", "/assets/sack-pro.skel");
|
||||
* PIXI.Assets.add("sackAtlas", "/assets/sack-pma.atlas");
|
||||
* await PIXI.Assets.load(["sackData", "sackAtlas"]);
|
||||
* ```
|
||||
* Once a Spine game object is created, its skeleton data is cached into {@link Spine.skeletonCache} using the key:
|
||||
* `${skeletonAssetName}-${atlasAssetName}-${options?.scale ?? 1}`
|
||||
*
|
||||
* @param options - Options to configure the Spine game object. See {@link SpineFromOptions}
|
||||
* @returns {Spine} The Spine game object instantiated
|
||||
*/
|
||||
static from(options: SpineFromOptions): Spine;
|
||||
get tint(): number;
|
||||
set tint(value: number);
|
||||
}
|
||||
/**
|
||||
* Represents the mesh type used in a Spine objects. Available implementations are {@link DarkSlotMesh} and {@link SlotMesh}.
|
||||
*/
|
||||
export interface ISlotMesh extends DisplayObject {
|
||||
name: string;
|
||||
updateFromSpineData(slotTexture: SpineTexture, slotBlendMode: BlendMode, slotName: string, finalVertices: NumberArrayLike, finalVerticesLength: number, finalIndices: NumberArrayLike, finalIndicesLength: number, darkTint: boolean): void;
|
||||
}
|
||||
+831
@@ -0,0 +1,831 @@
|
||||
/******************************************************************************
|
||||
* 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 { AnimationState, AnimationStateData, AtlasAttachmentLoader, ClippingAttachment, Color, MeshAttachment, Physics, RegionAttachment, Skeleton, SkeletonBinary, SkeletonClipping, SkeletonData, SkeletonJson, SkeletonPhysicsMovement, Skin, Utils, Vector2, } from "@spine-particle/spine-core-4.3";
|
||||
import { Assets } from "@pixi/assets";
|
||||
import { Point, Ticker } from "@pixi/core";
|
||||
import { Bounds, Container } from "@pixi/display";
|
||||
import { Graphics } from "@pixi/graphics";
|
||||
import { DarkSlotMesh } from "./DarkSlotMesh.js";
|
||||
import { SlotMesh } from "./SlotMesh.js";
|
||||
import "@pixi/events";
|
||||
;
|
||||
/** A bounds provider that provides a fixed size given by the user. */
|
||||
export class AABBRectangleBoundsProvider {
|
||||
x;
|
||||
y;
|
||||
width;
|
||||
height;
|
||||
constructor(x, y, width, height) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
}
|
||||
calculateBounds() {
|
||||
return { x: this.x, y: this.y, width: this.width, height: this.height };
|
||||
}
|
||||
}
|
||||
/** A bounds provider that calculates the bounding box from the setup pose. */
|
||||
export class SetupPoseBoundsProvider {
|
||||
clipping;
|
||||
/**
|
||||
* @param clipping If true, clipping attachments are used to compute the bounds. False, by default.
|
||||
*/
|
||||
constructor(clipping = false) {
|
||||
this.clipping = clipping;
|
||||
}
|
||||
calculateBounds(gameObject) {
|
||||
if (!gameObject.skeleton)
|
||||
return { x: 0, y: 0, width: 0, height: 0 };
|
||||
// Make a copy of animation state and skeleton as this might be called while
|
||||
// the skeleton in the GameObject has already been heavily modified. We can not
|
||||
// reconstruct that state.
|
||||
const skeleton = new Skeleton(gameObject.skeleton.data);
|
||||
skeleton.setupPose();
|
||||
skeleton.updateWorldTransform(Physics.update);
|
||||
const bounds = skeleton.getBoundsRect(this.clipping ? new SkeletonClipping() : undefined);
|
||||
return bounds.width === Number.NEGATIVE_INFINITY
|
||||
? { x: 0, y: 0, width: 0, height: 0 }
|
||||
: bounds;
|
||||
}
|
||||
}
|
||||
/** A bounds provider that calculates the bounding box by taking the maximumg bounding box for a combination of skins and specific animation. */
|
||||
export class SkinsAndAnimationBoundsProvider {
|
||||
animation;
|
||||
skins;
|
||||
timeStep;
|
||||
clipping;
|
||||
/**
|
||||
* @param animation The animation to use for calculating the bounds. If null, the setup pose is used.
|
||||
* @param skins The skins to use for calculating the bounds. If empty, the default skin is used.
|
||||
* @param timeStep The time step to use for calculating the bounds. A smaller time step means more precision, but slower calculation.
|
||||
* @param clipping If true, clipping attachments are used to compute the bounds. False, by default.
|
||||
*/
|
||||
constructor(animation, skins = [], timeStep = 0.05, clipping = false) {
|
||||
this.animation = animation;
|
||||
this.skins = skins;
|
||||
this.timeStep = timeStep;
|
||||
this.clipping = clipping;
|
||||
}
|
||||
calculateBounds(gameObject) {
|
||||
if (!gameObject.skeleton || !gameObject.state)
|
||||
return { x: 0, y: 0, width: 0, height: 0 };
|
||||
// Make a copy of animation state and skeleton as this might be called while
|
||||
// the skeleton in the GameObject has already been heavily modified. We can not
|
||||
// reconstruct that state.
|
||||
const animationState = new AnimationState(gameObject.state.data);
|
||||
const skeleton = new Skeleton(gameObject.skeleton.data);
|
||||
const clipper = this.clipping ? new SkeletonClipping() : undefined;
|
||||
const data = skeleton.data;
|
||||
if (this.skins.length > 0) {
|
||||
const customSkin = new Skin("custom-skin");
|
||||
for (const skinName of this.skins) {
|
||||
const skin = data.findSkin(skinName);
|
||||
if (skin == null)
|
||||
continue;
|
||||
customSkin.addSkin(skin);
|
||||
}
|
||||
skeleton.setSkin(customSkin);
|
||||
}
|
||||
skeleton.setupPose();
|
||||
const animation = this.animation != null ? data.findAnimation(this.animation) : null;
|
||||
if (animation == null) {
|
||||
skeleton.updateWorldTransform(Physics.update);
|
||||
const bounds = skeleton.getBoundsRect(clipper);
|
||||
return bounds.width === Number.NEGATIVE_INFINITY
|
||||
? { x: 0, y: 0, width: 0, height: 0 }
|
||||
: bounds;
|
||||
}
|
||||
else {
|
||||
let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;
|
||||
animationState.clearTracks();
|
||||
animationState.setAnimation(0, animation, false);
|
||||
const steps = Math.max(animation.duration / this.timeStep, 1.0);
|
||||
for (let i = 0; i < steps; i++) {
|
||||
const delta = i > 0 ? this.timeStep : 0;
|
||||
animationState.update(delta);
|
||||
animationState.apply(skeleton);
|
||||
skeleton.update(delta);
|
||||
skeleton.updateWorldTransform(Physics.update);
|
||||
const bounds = skeleton.getBoundsRect(clipper);
|
||||
minX = Math.min(minX, bounds.x);
|
||||
minY = Math.min(minY, bounds.y);
|
||||
maxX = Math.max(maxX, bounds.x + bounds.width);
|
||||
maxY = Math.max(maxY, bounds.y + bounds.height);
|
||||
}
|
||||
const bounds = {
|
||||
x: minX,
|
||||
y: minY,
|
||||
width: maxX - minX,
|
||||
height: maxY - minY,
|
||||
};
|
||||
return bounds.width === Number.NEGATIVE_INFINITY
|
||||
? { x: 0, y: 0, width: 0, height: 0 }
|
||||
: bounds;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* The class to instantiate a {@link Spine} game object in Pixi.
|
||||
* Create and customize the default configuration using the static method {@link Spine.createOptions},
|
||||
* then pass it to the constructor.
|
||||
*/
|
||||
export class Spine extends Container {
|
||||
/** The skeleton for this Spine game object. */
|
||||
skeleton;
|
||||
/** The animation state for this Spine game object. */
|
||||
state;
|
||||
/** Tracks this Pixi container's world movement and applies it to skeleton physics constraints. */
|
||||
skeletonPhysics;
|
||||
darkTint = false;
|
||||
hasNeverUpdated = true;
|
||||
_debug = undefined;
|
||||
get debug() {
|
||||
return this._debug;
|
||||
}
|
||||
/** Pass a {@link SpineDebugRenderer} or create your own {@link ISpineDebugRenderer} to render bones, meshes, ...
|
||||
* @example spineGO.debug = new SpineDebugRenderer();
|
||||
*/
|
||||
set debug(value) {
|
||||
if (this._debug) {
|
||||
this._debug.unregisterSpine(this);
|
||||
}
|
||||
if (value) {
|
||||
value.registerSpine(this);
|
||||
}
|
||||
this._debug = value;
|
||||
}
|
||||
slotMeshFactory = () => new SlotMesh();
|
||||
beforeUpdateWorldTransforms = () => { };
|
||||
afterUpdateWorldTransforms = () => { };
|
||||
_autoUpdate = false;
|
||||
_ticker = Ticker.shared;
|
||||
get autoUpdate() {
|
||||
return this._autoUpdate;
|
||||
}
|
||||
/** When `true`, the Spine AnimationState and the Skeleton will be automatically updated using the {@link ticker}. */
|
||||
set autoUpdate(value) {
|
||||
if (value && !this._autoUpdate) {
|
||||
this._ticker.add(this.internalUpdate, this);
|
||||
}
|
||||
else if (!value && this._autoUpdate) {
|
||||
this._ticker.remove(this.internalUpdate, this);
|
||||
}
|
||||
this._autoUpdate = value;
|
||||
}
|
||||
/** The ticker to use when {@link autoUpdate} is `true`. Defaults to {@link Ticker.shared}. */
|
||||
get ticker() {
|
||||
return this._ticker;
|
||||
}
|
||||
/** Sets the ticker to use when {@link autoUpdate} is `true`. If `autoUpdate` is already `true`, the update callback will be moved from the old ticker to the new one. */
|
||||
set ticker(value) {
|
||||
value = value ?? Ticker.shared;
|
||||
if (this._ticker === value)
|
||||
return;
|
||||
if (this._autoUpdate) {
|
||||
this._ticker.remove(this.internalUpdate, this);
|
||||
value.add(this.internalUpdate, this);
|
||||
}
|
||||
this._ticker = value;
|
||||
}
|
||||
meshesCache = new Map();
|
||||
static vectorAux = new Vector2();
|
||||
static clipper = new SkeletonClipping();
|
||||
static QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
|
||||
static VERTEX_SIZE = 2 + 2 + 4;
|
||||
static DARK_VERTEX_SIZE = 2 + 2 + 4 + 4;
|
||||
lightColor = new Color();
|
||||
darkColor = new Color();
|
||||
clippingVertAux = new Float32Array(6);
|
||||
_boundsProvider;
|
||||
/** The bounds provider to use. If undefined the bounds will be dynamic, calculated when requested and based on the current frame. */
|
||||
get boundsProvider() {
|
||||
return this._boundsProvider;
|
||||
}
|
||||
set boundsProvider(value) {
|
||||
this._boundsProvider = value;
|
||||
if (value) {
|
||||
this._boundsSpineID = -1;
|
||||
this._boundsSpineDirty = true;
|
||||
this.interactiveChildren = false;
|
||||
}
|
||||
else {
|
||||
this.interactiveChildren = true;
|
||||
this.hitArea = null;
|
||||
}
|
||||
if (!this.hasNeverUpdated) {
|
||||
this.calculateBounds();
|
||||
}
|
||||
}
|
||||
_boundsPoint = new Point();
|
||||
_boundsSpineID = -1;
|
||||
_boundsSpineDirty = true;
|
||||
constructor(options) {
|
||||
super();
|
||||
if (options instanceof SkeletonData)
|
||||
options = { skeletonData: options };
|
||||
else if ("skeleton" in options)
|
||||
options = new.target.createOptions(options);
|
||||
const { autoUpdate = true, boundsProvider, darkTint, skeletonData, ticker } = options;
|
||||
this.skeleton = new Skeleton(skeletonData);
|
||||
this.skeletonPhysics = new SkeletonPhysicsMovement(this.skeleton, {
|
||||
readTransform: (out, readRotation) => this.readPhysicsTransform(out, readRotation),
|
||||
worldToSkeleton: point => this.pixiWorldCoordinatesToSkeleton(point),
|
||||
});
|
||||
this.state = new AnimationState(new AnimationStateData(skeletonData));
|
||||
if (ticker)
|
||||
this._ticker = ticker;
|
||||
this.autoUpdate = autoUpdate;
|
||||
this.boundsProvider = boundsProvider;
|
||||
// dark tint can be enabled by options, otherwise is enable if at least one slot has tint black
|
||||
this.darkTint = darkTint === undefined
|
||||
? this.skeleton.slots.some(slot => !!slot.data.setupPose.darkColor)
|
||||
: darkTint;
|
||||
if (this.darkTint)
|
||||
this.slotMeshFactory = () => new DarkSlotMesh();
|
||||
}
|
||||
/** If {@link Spine.autoUpdate} is `false`, this method allows to update the AnimationState and the Skeleton with the given delta. */
|
||||
update(deltaSeconds) {
|
||||
this.internalUpdate(0, deltaSeconds);
|
||||
}
|
||||
internalUpdate(_deltaFrame, deltaSeconds) {
|
||||
this.hasNeverUpdated = false;
|
||||
const delta = deltaSeconds ?? this._ticker.deltaMS / 1000;
|
||||
this.state.update(delta);
|
||||
this.state.apply(this.skeleton);
|
||||
this.skeletonPhysics.applyTransformMovement();
|
||||
this.beforeUpdateWorldTransforms(this);
|
||||
this.skeleton.update(delta);
|
||||
this.skeleton.updateWorldTransform(Physics.update);
|
||||
this.afterUpdateWorldTransforms(this);
|
||||
}
|
||||
readPhysicsTransform(out, readRotation) {
|
||||
const transform = this.worldTransform;
|
||||
out.x = transform.tx;
|
||||
out.y = transform.ty;
|
||||
out.z = 0;
|
||||
if (!readRotation)
|
||||
return;
|
||||
// Compose local rotation components instead of extracting an angle from worldTransform,
|
||||
// which is sheared by rotated children of non-uniformly scaled parents.
|
||||
let rotation = 0;
|
||||
for (let object = this; object; object = object.parent) {
|
||||
rotation += object.rotation
|
||||
+ (object.skew.y - object.skew.x) / 2;
|
||||
}
|
||||
out.rotation = rotation * 180 / Math.PI;
|
||||
}
|
||||
/** Render the meshes based on the current skeleton state, render debug information, then call {@link Container.updateTransform}. */
|
||||
updateTransform() {
|
||||
this.renderMeshes();
|
||||
this.sortChildren();
|
||||
this.debug?.renderDebug(this);
|
||||
super.updateTransform();
|
||||
}
|
||||
/** Destroy Spine game object elements, then call the {@link Container.destroy} with the given options */
|
||||
destroy(options) {
|
||||
if (this.autoUpdate)
|
||||
this.autoUpdate = false;
|
||||
this._ticker = null;
|
||||
for (const [, mesh] of this.meshesCache) {
|
||||
mesh?.destroy();
|
||||
}
|
||||
this.state.clearListeners();
|
||||
this.debug = undefined;
|
||||
this.meshesCache.clear();
|
||||
this.slotsObject.clear();
|
||||
for (const maskKey in this.clippingSlotToPixiMasks) {
|
||||
const mask = this.clippingSlotToPixiMasks[maskKey];
|
||||
mask.destroy();
|
||||
delete this.clippingSlotToPixiMasks[maskKey];
|
||||
}
|
||||
super.destroy(options);
|
||||
}
|
||||
/**
|
||||
* Unloads this Spine object's cached {@link SkeletonData}.
|
||||
*
|
||||
* Existing Spine objects that use this SkeletonData continue to work. Future Spine objects created with the same
|
||||
* skeleton, atlas, and scale will parse a new SkeletonData.
|
||||
* @returns `true` if the cached SkeletonData was removed, otherwise `false`.
|
||||
*/
|
||||
unloadFromCache() {
|
||||
const skeletonData = this.skeleton?.data;
|
||||
if (!skeletonData)
|
||||
return false;
|
||||
const cacheKey = Spine.skeletonDataCacheKeys.get(skeletonData);
|
||||
if (!cacheKey || Spine.skeletonCache[cacheKey] !== skeletonData)
|
||||
return false;
|
||||
delete Spine.skeletonCache[cacheKey];
|
||||
Spine.skeletonDataCacheKeys.delete(skeletonData);
|
||||
return true;
|
||||
}
|
||||
resetMeshes() {
|
||||
for (const [, mesh] of this.meshesCache) {
|
||||
mesh.zIndex = -1;
|
||||
mesh.visible = false;
|
||||
}
|
||||
}
|
||||
_calculateBounds() {
|
||||
if (this.hasNeverUpdated) {
|
||||
this.internalUpdate(0, 0);
|
||||
this.renderMeshes();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Check the existence of a mesh for the given slot.
|
||||
* If you want to manually handle which meshes go on which slot and how you cache, overwrite this method.
|
||||
*/
|
||||
hasMeshForSlot(slot) {
|
||||
return this.meshesCache.has(slot);
|
||||
}
|
||||
/**
|
||||
* Search the mesh corresponding to the given slot or create it, if it does not exists.
|
||||
* If you want to manually handle which meshes go on which slot and how you cache, overwrite this method.
|
||||
*/
|
||||
getMeshForSlot(slot) {
|
||||
let mesh = this.hasMeshForSlot(slot) ? this.meshesCache.get(slot) : null;
|
||||
if (!mesh) {
|
||||
mesh = this.slotMeshFactory();
|
||||
this.addChild(mesh);
|
||||
this.meshesCache.set(slot, mesh);
|
||||
}
|
||||
else {
|
||||
mesh.visible = true;
|
||||
}
|
||||
return mesh;
|
||||
}
|
||||
slotsObject = new Map();
|
||||
getSlotFromRef(slotRef) {
|
||||
let slot;
|
||||
if (typeof slotRef === 'number')
|
||||
slot = this.skeleton.slots[slotRef];
|
||||
else if (typeof slotRef === 'string')
|
||||
slot = this.skeleton.findSlot(slotRef);
|
||||
else
|
||||
slot = slotRef;
|
||||
if (!slot)
|
||||
throw new Error(`No slot found with the given slot reference: ${slotRef}`);
|
||||
return slot;
|
||||
}
|
||||
/**
|
||||
* Add a pixi Container as a child of the Spine object.
|
||||
* The Container will be rendered coherently with the draw order of the slot.
|
||||
* If an attachment is active on the slot, the pixi Container will be rendered on top of it.
|
||||
* If the Container is already attached to the given slot, nothing will happen.
|
||||
* If the Container is already attached to another slot, it will be removed from that slot
|
||||
* before adding it to the given one.
|
||||
* If another Container is already attached to this slot, the old one will be removed from this
|
||||
* slot before adding it to the current one.
|
||||
* @param slotRef - The slot index, or the slot name, or the Slot where the pixi object will be added to.
|
||||
* @param pixiObject - The pixi Container to add.
|
||||
* @param options - Optional settings for the attachment.
|
||||
* @param options.followAttachmentTimeline - If true, the attachment will follow the slot's attachment timeline.
|
||||
* @param options.followSlotColor - If true, the container tint will follow the skeleton and slot colors.
|
||||
*/
|
||||
addSlotObject(slotRef, pixiObject, options) {
|
||||
const slot = this.getSlotFromRef(slotRef);
|
||||
const oldPixiObject = this.slotsObject.get(slot)?.container;
|
||||
if (oldPixiObject && oldPixiObject === pixiObject)
|
||||
return;
|
||||
// search if the pixiObject was already in another slotObject
|
||||
for (const [otherSlot, { container: oldPixiObjectAnotherSlot }] of this.slotsObject) {
|
||||
if (otherSlot !== slot && oldPixiObjectAnotherSlot === pixiObject) {
|
||||
this.removeSlotObject(otherSlot, pixiObject);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (oldPixiObject)
|
||||
this.removeChild(oldPixiObject);
|
||||
this.slotsObject.set(slot, {
|
||||
container: pixiObject,
|
||||
followAttachmentTimeline: options?.followAttachmentTimeline || false,
|
||||
followSlotColor: options?.followSlotColor || false,
|
||||
});
|
||||
this.addChild(pixiObject);
|
||||
}
|
||||
/**
|
||||
* Return the Container connected to the given slot, if any.
|
||||
* Otherwise return undefined
|
||||
* @param pixiObject - The slot index, or the slot name, or the Slot to get the Container from.
|
||||
* @returns a Container if any, undefined otherwise.
|
||||
*/
|
||||
getSlotObject(slotRef) {
|
||||
const element = this.slotsObject.get(this.getSlotFromRef(slotRef));
|
||||
return element ? element.container : undefined;
|
||||
}
|
||||
/**
|
||||
* Remove a slot object from the given slot.
|
||||
* If `pixiObject` is passed and attached to the given slot, remove it from the slot.
|
||||
* If `pixiObject` is not passed and the given slot has an attached Container, remove it from the slot.
|
||||
* @param slotRef - The slot index, or the slot name, or the Slot where the pixi object will be remove from.
|
||||
* @param pixiObject - Optional, The pixi Container to remove.
|
||||
*/
|
||||
removeSlotObject(slotRef, pixiObject) {
|
||||
const slot = this.getSlotFromRef(slotRef);
|
||||
const slotObject = this.slotsObject.get(slot)?.container;
|
||||
if (!slotObject)
|
||||
return;
|
||||
// if pixiObject is passed, remove only if it is equal to the given one
|
||||
if (pixiObject && pixiObject !== slotObject)
|
||||
return;
|
||||
this.removeChild(slotObject);
|
||||
this.slotsObject.delete(slot);
|
||||
}
|
||||
/**
|
||||
* Removes all PixiJS containers attached to any slot.
|
||||
*/
|
||||
removeSlotObjects() {
|
||||
for (const [, slotObject] of this.slotsObject) {
|
||||
slotObject.container.removeFromParent();
|
||||
}
|
||||
this.slotsObject.clear();
|
||||
}
|
||||
verticesCache = Utils.newFloatArray(1024);
|
||||
clippingSlotToPixiMasks = {};
|
||||
pixiMaskCleanup(slot) {
|
||||
const mask = this.clippingSlotToPixiMasks[slot.data.name];
|
||||
if (mask) {
|
||||
delete this.clippingSlotToPixiMasks[slot.data.name];
|
||||
mask.destroy();
|
||||
}
|
||||
}
|
||||
updateSlotObject(element, slot, zIndex) {
|
||||
const { container: slotObject, followAttachmentTimeline } = element;
|
||||
const pose = slot.appliedPose;
|
||||
const followAttachmentValue = followAttachmentTimeline ? Boolean(pose.attachment) : true;
|
||||
const drawOrder = this.skeleton.drawOrder.appliedPose;
|
||||
slotObject.visible = drawOrder.includes(slot) && followAttachmentValue;
|
||||
if (slotObject.visible) {
|
||||
const applied = slot.bone.appliedPose;
|
||||
const matrix = slotObject.localTransform;
|
||||
matrix.a = applied.a;
|
||||
matrix.b = applied.c;
|
||||
matrix.c = -applied.b;
|
||||
matrix.d = -applied.d;
|
||||
matrix.tx = applied.worldX;
|
||||
matrix.ty = applied.worldY;
|
||||
slotObject.transform.setFromMatrix(matrix);
|
||||
slotObject.zIndex = zIndex + 1;
|
||||
slotObject.alpha = this.skeleton.color.a * pose.color.a;
|
||||
if (element.followSlotColor) {
|
||||
this.setSlotObjectTint(slotObject, ((255 * this.skeleton.color.r * pose.color.r) << 16) |
|
||||
((255 * this.skeleton.color.g * pose.color.g) << 8) |
|
||||
(255 * this.skeleton.color.b * pose.color.b));
|
||||
}
|
||||
}
|
||||
}
|
||||
setSlotObjectTint(slotObject, tint) {
|
||||
const tintable = slotObject;
|
||||
if ("tint" in tintable)
|
||||
tintable.tint = tint;
|
||||
for (const child of tintable.children ?? []) {
|
||||
this.setSlotObjectTint(child, tint);
|
||||
}
|
||||
}
|
||||
updateAndSetPixiMask(pixiMaskSource, pixiObject) {
|
||||
if (Spine.clipper.isClipping() && pixiMaskSource) {
|
||||
let mask = this.clippingSlotToPixiMasks[pixiMaskSource.slot.data.name];
|
||||
if (!mask) {
|
||||
mask = new Graphics();
|
||||
this.clippingSlotToPixiMasks[pixiMaskSource.slot.data.name] = mask;
|
||||
this.addChild(mask);
|
||||
}
|
||||
if (!pixiMaskSource.computed) {
|
||||
pixiMaskSource.computed = true;
|
||||
const clippingAttachment = pixiMaskSource.slot.appliedPose.attachment;
|
||||
const worldVerticesLength = clippingAttachment.worldVerticesLength;
|
||||
if (this.clippingVertAux.length < worldVerticesLength)
|
||||
this.clippingVertAux = new Float32Array(worldVerticesLength);
|
||||
clippingAttachment.computeWorldVertices(this.skeleton, pixiMaskSource.slot, 0, worldVerticesLength, this.clippingVertAux, 0, 2);
|
||||
mask.clear().lineStyle(0).beginFill(0x000000);
|
||||
mask.moveTo(this.clippingVertAux[0], this.clippingVertAux[1]);
|
||||
for (let i = 2; i < worldVerticesLength; i += 2) {
|
||||
mask.lineTo(this.clippingVertAux[i], this.clippingVertAux[i + 1]);
|
||||
}
|
||||
mask.finishPoly();
|
||||
}
|
||||
pixiObject.mask = mask;
|
||||
}
|
||||
else if (pixiObject.mask) {
|
||||
pixiObject.mask = null;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Colors in pixi are premultiplied.
|
||||
* Pixi blending modes are modified to work with premultiplied colors. We cannot create custom blending modes.
|
||||
* Textures are loaded as premultiplied (see assers/atlasLoader.ts: alphaMode: `page.pma ? ALPHA_MODES.PMA : ALPHA_MODES.UNPACK`):
|
||||
* - textures non premultiplied are premultiplied on GPU on upload
|
||||
* - textures premultiplied are uploaded on GPU as is since they are already premultiplied
|
||||
*
|
||||
* We need to take this into consideration and calculates final colors for both light and dark color as if textures were always premultiplied.
|
||||
* This implies for example that alpha for dark tint is always 1. This is way in DarkTintRenderer we have only the alpha of the light color.
|
||||
* If we ever want to load texture as non premultiplied on GPU, we must add a new dark alpha parameter to the TintMaterial and set the alpha.
|
||||
*/
|
||||
renderMeshes() {
|
||||
this.resetMeshes();
|
||||
let triangles = null;
|
||||
let uvs = null;
|
||||
let pixiMaskSource = null;
|
||||
const drawOrder = this.skeleton.drawOrder.appliedPose;
|
||||
const slots = drawOrder;
|
||||
for (let i = 0, n = drawOrder.length, slotObjectsCounter = 0; i < n; i++) {
|
||||
const slot = slots[i];
|
||||
// render pixi object on the current slot on top of the slot attachment
|
||||
const pixiObject = this.slotsObject.get(slot);
|
||||
const zIndex = i + slotObjectsCounter;
|
||||
if (pixiObject) {
|
||||
this.updateSlotObject(pixiObject, slot, zIndex + 1);
|
||||
slotObjectsCounter++;
|
||||
this.updateAndSetPixiMask(pixiMaskSource, pixiObject.container);
|
||||
}
|
||||
const pose = slot.appliedPose;
|
||||
const useDarkColor = !!pose.darkColor;
|
||||
const vertexSize = useDarkColor ? Spine.DARK_VERTEX_SIZE : Spine.VERTEX_SIZE;
|
||||
if (!slot.bone.active) {
|
||||
Spine.clipper.clipEnd(slot);
|
||||
this.pixiMaskCleanup(slot);
|
||||
continue;
|
||||
}
|
||||
const attachment = pose.attachment;
|
||||
let attachmentColor;
|
||||
let texture;
|
||||
let numFloats = 0;
|
||||
const skeleton = this.skeleton;
|
||||
if (attachment instanceof RegionAttachment) {
|
||||
const region = attachment;
|
||||
attachmentColor = region.color;
|
||||
numFloats = vertexSize * 4;
|
||||
const sequence = attachment.sequence;
|
||||
const sequenceIndex = sequence.resolveIndex(pose);
|
||||
attachment.computeWorldVertices(slot, attachment.getOffsets(pose), this.verticesCache, 0, vertexSize);
|
||||
triangles = Spine.QUAD_TRIANGLES;
|
||||
uvs = sequence.getUVs(sequenceIndex);
|
||||
texture = sequence.regions[sequenceIndex]?.texture;
|
||||
}
|
||||
else if (attachment instanceof MeshAttachment) {
|
||||
const mesh = attachment;
|
||||
attachmentColor = mesh.color;
|
||||
numFloats = (mesh.worldVerticesLength >> 1) * vertexSize;
|
||||
if (numFloats > this.verticesCache.length) {
|
||||
this.verticesCache = Utils.newFloatArray(numFloats);
|
||||
}
|
||||
mesh.computeWorldVertices(skeleton, slot, 0, mesh.worldVerticesLength, this.verticesCache, 0, vertexSize);
|
||||
triangles = mesh.triangles;
|
||||
const sequence = attachment.sequence;
|
||||
const sequenceIndex = sequence.resolveIndex(pose);
|
||||
uvs = sequence.getUVs(sequenceIndex);
|
||||
texture = sequence.regions[sequenceIndex]?.texture;
|
||||
}
|
||||
else if (attachment instanceof ClippingAttachment) {
|
||||
Spine.clipper.clipStart(skeleton, slot, attachment);
|
||||
pixiMaskSource = { slot, computed: false };
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
if (this.hasMeshForSlot(slot)) {
|
||||
this.getMeshForSlot(slot).visible = false;
|
||||
}
|
||||
Spine.clipper.clipEnd(slot);
|
||||
this.pixiMaskCleanup(slot);
|
||||
continue;
|
||||
}
|
||||
if (texture != null) {
|
||||
const skeletonColor = skeleton.color;
|
||||
const slotColor = pose.color;
|
||||
const alpha = skeletonColor.a * slotColor.a * attachmentColor.a;
|
||||
this.lightColor.set(skeletonColor.r * slotColor.r * attachmentColor.r, skeletonColor.g * slotColor.g * attachmentColor.g, skeletonColor.b * slotColor.b * attachmentColor.b, alpha);
|
||||
if (pose.darkColor != null) {
|
||||
this.darkColor.set(pose.darkColor.r, pose.darkColor.g, pose.darkColor.b, 1);
|
||||
}
|
||||
else {
|
||||
this.darkColor.set(0, 0, 0, 1);
|
||||
}
|
||||
let finalVertices;
|
||||
let finalVerticesLength;
|
||||
let finalIndices;
|
||||
let finalIndicesLength;
|
||||
if (Spine.clipper.isClipping() && Spine.clipper.clipTriangles(this.verticesCache, triangles, triangles.length, uvs, this.lightColor, this.darkColor, useDarkColor, vertexSize)) {
|
||||
finalVertices = Spine.clipper.clippedVertices;
|
||||
finalVerticesLength = finalVertices.length;
|
||||
finalIndices = Spine.clipper.clippedTriangles;
|
||||
finalIndicesLength = finalIndices.length;
|
||||
}
|
||||
else {
|
||||
const verts = this.verticesCache;
|
||||
for (let v = 2, u = 0, n = numFloats; v < n; v += vertexSize, u += 2) {
|
||||
let tempV = v;
|
||||
verts[tempV++] = this.lightColor.r;
|
||||
verts[tempV++] = this.lightColor.g;
|
||||
verts[tempV++] = this.lightColor.b;
|
||||
verts[tempV++] = this.lightColor.a;
|
||||
verts[tempV++] = uvs[u];
|
||||
verts[tempV++] = uvs[u + 1];
|
||||
if (useDarkColor) {
|
||||
verts[tempV++] = this.darkColor.r;
|
||||
verts[tempV++] = this.darkColor.g;
|
||||
verts[tempV++] = this.darkColor.b;
|
||||
verts[tempV++] = this.darkColor.a;
|
||||
}
|
||||
}
|
||||
finalVertices = this.verticesCache;
|
||||
finalVerticesLength = numFloats;
|
||||
finalIndices = triangles;
|
||||
finalIndicesLength = triangles.length;
|
||||
}
|
||||
if (finalVerticesLength === 0 || finalIndicesLength === 0) {
|
||||
Spine.clipper.clipEnd(slot);
|
||||
continue;
|
||||
}
|
||||
const mesh = this.getMeshForSlot(slot);
|
||||
mesh.renderable = true;
|
||||
mesh.zIndex = zIndex;
|
||||
mesh.updateFromSpineData(texture, slot.data.blendMode, slot.data.name, finalVertices, finalVerticesLength, finalIndices, finalIndicesLength, useDarkColor);
|
||||
}
|
||||
Spine.clipper.clipEnd(slot);
|
||||
this.pixiMaskCleanup(slot);
|
||||
}
|
||||
Spine.clipper.clipEnd();
|
||||
}
|
||||
calculateBounds() {
|
||||
if (!this._boundsProvider) {
|
||||
super.calculateBounds();
|
||||
return;
|
||||
}
|
||||
const transform = this.transform;
|
||||
if (this._boundsSpineID === transform._worldID)
|
||||
return;
|
||||
this.updateBounds();
|
||||
const bounds = this._localBounds;
|
||||
const p = this._boundsPoint;
|
||||
p.set(bounds.minX, bounds.minY);
|
||||
transform.worldTransform.apply(p, p);
|
||||
this._bounds.minX = p.x;
|
||||
this._bounds.minY = p.y;
|
||||
p.set(bounds.maxX, bounds.maxY);
|
||||
transform.worldTransform.apply(p, p);
|
||||
this._bounds.maxX = p.x;
|
||||
this._bounds.maxY = p.y;
|
||||
}
|
||||
updateBounds() {
|
||||
if (!this._boundsProvider || !this._boundsSpineDirty)
|
||||
return;
|
||||
this._boundsSpineDirty = false;
|
||||
if (!this._localBounds) {
|
||||
this._localBounds = new Bounds();
|
||||
}
|
||||
const boundsSpine = this._boundsProvider.calculateBounds(this);
|
||||
const bounds = this._localBounds;
|
||||
bounds.clear();
|
||||
bounds.minX = boundsSpine.x;
|
||||
bounds.minY = boundsSpine.y;
|
||||
bounds.maxX = boundsSpine.x + boundsSpine.width;
|
||||
bounds.maxY = boundsSpine.y + boundsSpine.height;
|
||||
this.hitArea = this._localBounds.getRectangle();
|
||||
}
|
||||
/**
|
||||
* Set the position of the bone given in input through a {@link IPointData}.
|
||||
* @param bone: the bone name or the bone instance to set the position
|
||||
* @param outPos: the new position of the bone.
|
||||
* @throws {Error}: if the given bone is not found in the skeleton, an error is thrown
|
||||
*/
|
||||
setBonePosition(bone, position) {
|
||||
const actualBone = typeof bone === "string" ? this.skeleton.findBone(bone) : bone;
|
||||
if (!actualBone)
|
||||
throw Error(`Cannot set bone position, bone ${String(bone)} not found`);
|
||||
Spine.vectorAux.set(position.x, position.y);
|
||||
const applied = actualBone.appliedPose;
|
||||
if (actualBone.parent) {
|
||||
const aux = actualBone.parent.appliedPose.worldToLocal(Spine.vectorAux);
|
||||
applied.x = aux.x;
|
||||
applied.y = aux.y;
|
||||
}
|
||||
else {
|
||||
applied.x = Spine.vectorAux.x;
|
||||
applied.y = Spine.vectorAux.y;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Return the position of the bone given in input into an {@link IPointData}.
|
||||
* @param bone: the bone name or the bone instance to get the position from
|
||||
* @param outPos: an optional {@link IPointData} to use to return the bone position, rathern than instantiating a new object.
|
||||
* @returns {IPointData | undefined}: the position of the bone, or undefined if no matching bone is found in the skeleton
|
||||
*/
|
||||
getBonePosition(bone, outPos) {
|
||||
const actualBone = typeof bone === "string" ? this.skeleton.findBone(bone) : bone;
|
||||
if (!actualBone) {
|
||||
console.error(`Cannot get bone position! Bone ${String(bone)} not found`);
|
||||
return outPos;
|
||||
}
|
||||
if (!outPos) {
|
||||
outPos = { x: 0, y: 0 };
|
||||
}
|
||||
outPos.x = actualBone.appliedPose.worldX;
|
||||
outPos.y = actualBone.appliedPose.worldY;
|
||||
return outPos;
|
||||
}
|
||||
/** Converts a point from the skeleton coordinate system to the Pixi world coordinate system. */
|
||||
skeletonToPixiWorldCoordinates(point) {
|
||||
this.worldTransform.apply(point, point);
|
||||
}
|
||||
/** Converts a point from the Pixi world coordinate system to the skeleton coordinate system. */
|
||||
pixiWorldCoordinatesToSkeleton(point) {
|
||||
this.worldTransform.applyInverse(point, point);
|
||||
}
|
||||
/** Converts a point from the Pixi world coordinate system to the bone's local coordinate system. */
|
||||
pixiWorldCoordinatesToBone(point, bone) {
|
||||
this.pixiWorldCoordinatesToSkeleton(point);
|
||||
if (bone.parent) {
|
||||
bone.parent.appliedPose.worldToLocal(point);
|
||||
}
|
||||
else {
|
||||
bone.appliedPose.worldToLocal(point);
|
||||
}
|
||||
}
|
||||
/** A cache containing skeleton data and atlases already loaded by {@link Spine.from}. */
|
||||
static skeletonCache = Object.create(null);
|
||||
static skeletonDataCacheKeys = new WeakMap();
|
||||
static getSkeletonCacheKey({ skeleton, atlas, scale = 1 }) {
|
||||
return `${skeleton}-${atlas}-${scale}`;
|
||||
}
|
||||
/**
|
||||
* Get a convenient initialization configuration for your Spine game object.
|
||||
* Before instantiating a Spine game object, the skeleton (`.skel` or `.json`) and the atlas text files must be loaded into the Assets. For example:
|
||||
* ```
|
||||
* PIXI.Assets.add("sackData", "/assets/sack-pro.skel");
|
||||
* PIXI.Assets.add("sackAtlas", "/assets/sack-pma.atlas");
|
||||
* await PIXI.Assets.load(["sackData", "sackAtlas"]);
|
||||
* ```
|
||||
* Once a Spine game object is created, its skeleton data is cached into {@link Spine.skeletonCache} using the key:
|
||||
* `${skeletonAssetName}-${atlasAssetName}-${options?.scale ?? 1}`
|
||||
*
|
||||
* @param options - Options to configure the Spine game object. See {@link SpineFromOptions}
|
||||
* @returns {SpineOptions} The configuration ready to be passed to the Spine constructor
|
||||
*/
|
||||
static createOptions({ skeleton, atlas, scale = 1, darkTint, autoUpdate = true, boundsProvider, allowMissingRegions, ticker }) {
|
||||
const cacheKey = Spine.getSkeletonCacheKey({ skeleton, atlas, scale });
|
||||
let skeletonData = Spine.skeletonCache[cacheKey];
|
||||
if (!skeletonData) {
|
||||
// biome-ignore lint/suspicious/noExplicitAny: json skeleton is any
|
||||
const skeletonAsset = Assets.get(skeleton);
|
||||
const atlasAsset = Assets.get(atlas);
|
||||
const attachmentLoader = new AtlasAttachmentLoader(atlasAsset, allowMissingRegions);
|
||||
const parser = skeletonAsset instanceof Uint8Array ? new SkeletonBinary(attachmentLoader) : new SkeletonJson(attachmentLoader);
|
||||
parser.scale = scale;
|
||||
skeletonData = parser.readSkeletonData(skeletonAsset);
|
||||
Spine.skeletonCache[cacheKey] = skeletonData;
|
||||
}
|
||||
Spine.skeletonDataCacheKeys.set(skeletonData, cacheKey);
|
||||
return { skeletonData, darkTint, autoUpdate, boundsProvider, ticker };
|
||||
}
|
||||
/**
|
||||
* @deprecated Use directly the Spine constructor or {@link createOptions} to make options and customize it to pass to the constructor
|
||||
* Before instantiating a Spine game object, the skeleton (`.skel` or `.json`) and the atlas text files must be loaded into the Assets. For example:
|
||||
* ```
|
||||
* PIXI.Assets.add("sackData", "/assets/sack-pro.skel");
|
||||
* PIXI.Assets.add("sackAtlas", "/assets/sack-pma.atlas");
|
||||
* await PIXI.Assets.load(["sackData", "sackAtlas"]);
|
||||
* ```
|
||||
* Once a Spine game object is created, its skeleton data is cached into {@link Spine.skeletonCache} using the key:
|
||||
* `${skeletonAssetName}-${atlasAssetName}-${options?.scale ?? 1}`
|
||||
*
|
||||
* @param options - Options to configure the Spine game object. See {@link SpineFromOptions}
|
||||
* @returns {Spine} The Spine game object instantiated
|
||||
*/
|
||||
static from(options) {
|
||||
return new Spine(Spine.createOptions(options));
|
||||
}
|
||||
get tint() {
|
||||
return this.skeleton.color.toRgb888();
|
||||
}
|
||||
set tint(value) {
|
||||
Color.rgb888ToColor(this.skeleton.color, value);
|
||||
}
|
||||
}
|
||||
Skeleton.yDown = true;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU3BpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRy9FLE9BQU8sRUFDTixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsS0FBSyxFQUNMLGNBQWMsRUFDZCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLElBQUksRUFDSixLQUFLLEVBQ0wsT0FBTyxHQUNQLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQW1CLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3pDLE9BQU8sY0FBYyxDQUFDO0FBaUNyQixDQUFDO0FBMENGLHNFQUFzRTtBQUN0RSxNQUFNLE9BQU8sMkJBQTJCO0lBRTlCO0lBQ0E7SUFDQTtJQUNBO0lBSlQsWUFDUyxDQUFTLEVBQ1QsQ0FBUyxFQUNULEtBQWEsRUFDYixNQUFjO1FBSGQsTUFBQyxHQUFELENBQUMsQ0FBUTtRQUNULE1BQUMsR0FBRCxDQUFDLENBQVE7UUFDVCxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUNuQixDQUFDO0lBQ0wsZUFBZTtRQUNkLE9BQU8sRUFB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
Line truncated
|
||||
@@ -0,0 +1,88 @@
|
||||
/******************************************************************************
|
||||
* 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 type { Spine } from "./Spine.js";
|
||||
/**
|
||||
* Make a class that extends from this interface to create your own debug renderer.
|
||||
* @public
|
||||
*/
|
||||
export interface ISpineDebugRenderer {
|
||||
/**
|
||||
* This will be called every frame, after the spine has been updated.
|
||||
*/
|
||||
renderDebug(spine: Spine): void;
|
||||
/**
|
||||
* This is called when the `spine.debug` object is set to null or when the spine is destroyed.
|
||||
*/
|
||||
unregisterSpine(spine: Spine): void;
|
||||
/**
|
||||
* This is called when the `spine.debug` object is set to a new instance of a debug renderer.
|
||||
*/
|
||||
registerSpine(spine: Spine): void;
|
||||
}
|
||||
/**
|
||||
* This is a debug renderer that uses PixiJS Graphics under the hood.
|
||||
* @public
|
||||
*/
|
||||
export declare class SpineDebugRenderer implements ISpineDebugRenderer {
|
||||
private registeredSpines;
|
||||
drawMeshHull: boolean;
|
||||
drawMeshTriangles: boolean;
|
||||
drawBones: boolean;
|
||||
drawPaths: boolean;
|
||||
drawBoundingBoxes: boolean;
|
||||
drawClipping: boolean;
|
||||
drawRegionAttachments: boolean;
|
||||
drawEvents: boolean;
|
||||
lineWidth: number;
|
||||
regionAttachmentsColor: number;
|
||||
meshHullColor: number;
|
||||
meshTrianglesColor: number;
|
||||
clippingPolygonColor: number;
|
||||
boundingBoxesRectColor: number;
|
||||
boundingBoxesPolygonColor: number;
|
||||
boundingBoxesCircleColor: number;
|
||||
pathsCurveColor: number;
|
||||
pathsLineColor: number;
|
||||
skeletonXYColor: number;
|
||||
bonesColor: number;
|
||||
eventFontSize: number;
|
||||
eventFontColor: number;
|
||||
/**
|
||||
* The debug is attached by force to each spine object. So we need to create it inside the spine when we get the first update
|
||||
*/
|
||||
registerSpine(spine: Spine): void;
|
||||
renderDebug(spine: Spine): void;
|
||||
private drawBonesFunc;
|
||||
private drawRegionAttachmentsFunc;
|
||||
private drawMeshHullAndMeshTriangles;
|
||||
private drawClippingFunc;
|
||||
private drawBoundingBoxesFunc;
|
||||
private drawPathsFunc;
|
||||
unregisterSpine(spine: Spine): void;
|
||||
}
|
||||
@@ -0,0 +1,451 @@
|
||||
/******************************************************************************
|
||||
* 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 { ClippingAttachment, MeshAttachment, PathAttachment, RegionAttachment, SkeletonBounds } from "@spine-particle/spine-core-4.3";
|
||||
import { Container } from "@pixi/display";
|
||||
import { Graphics } from "@pixi/graphics";
|
||||
import { Text } from "@pixi/text";
|
||||
/**
|
||||
* This is a debug renderer that uses PixiJS Graphics under the hood.
|
||||
* @public
|
||||
*/
|
||||
export class SpineDebugRenderer {
|
||||
registeredSpines = new Map();
|
||||
drawMeshHull = true;
|
||||
drawMeshTriangles = true;
|
||||
drawBones = true;
|
||||
drawPaths = true;
|
||||
drawBoundingBoxes = true;
|
||||
drawClipping = true;
|
||||
drawRegionAttachments = true;
|
||||
drawEvents = true;
|
||||
lineWidth = 1;
|
||||
regionAttachmentsColor = 0x0078ff;
|
||||
meshHullColor = 0x0078ff;
|
||||
meshTrianglesColor = 0xffcc00;
|
||||
clippingPolygonColor = 0xff00ff;
|
||||
boundingBoxesRectColor = 0x00ff00;
|
||||
boundingBoxesPolygonColor = 0x00ff00;
|
||||
boundingBoxesCircleColor = 0x00ff00;
|
||||
pathsCurveColor = 0xff0000;
|
||||
pathsLineColor = 0xff00ff;
|
||||
skeletonXYColor = 0xff0000;
|
||||
bonesColor = 0x00eecc;
|
||||
eventFontSize = 24;
|
||||
eventFontColor = 0x0;
|
||||
/**
|
||||
* The debug is attached by force to each spine object. So we need to create it inside the spine when we get the first update
|
||||
*/
|
||||
registerSpine(spine) {
|
||||
if (this.registeredSpines.has(spine)) {
|
||||
console.warn("SpineDebugRenderer.registerSpine() - this spine is already registered!", spine);
|
||||
return;
|
||||
}
|
||||
const debugDisplayObjects = {
|
||||
parentDebugContainer: new Container(),
|
||||
bones: new Container(),
|
||||
skeletonXY: new Graphics(),
|
||||
regionAttachmentsShape: new Graphics(),
|
||||
meshTrianglesLine: new Graphics(),
|
||||
meshHullLine: new Graphics(),
|
||||
clippingPolygon: new Graphics(),
|
||||
boundingBoxesRect: new Graphics(),
|
||||
boundingBoxesCircle: new Graphics(),
|
||||
boundingBoxesPolygon: new Graphics(),
|
||||
pathsCurve: new Graphics(),
|
||||
pathsLine: new Graphics(),
|
||||
eventText: new Container(),
|
||||
eventCallback: {
|
||||
event: (_, event) => {
|
||||
if (this.drawEvents) {
|
||||
const scale = Math.abs(spine.scale.x || spine.scale.y || 1);
|
||||
const text = new Text(event.data.name, { fontSize: this.eventFontSize / scale, fill: this.eventFontColor, fontFamily: "monospace" });
|
||||
text.scale.x = Math.sign(spine.scale.x);
|
||||
text.anchor.set(0.5);
|
||||
debugDisplayObjects.eventText.addChild(text);
|
||||
setTimeout(() => {
|
||||
if (!text.destroyed) {
|
||||
text.destroy();
|
||||
}
|
||||
}, 250);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.bones);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.skeletonXY);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.regionAttachmentsShape);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.meshTrianglesLine);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.meshHullLine);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.clippingPolygon);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesRect);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesCircle);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.boundingBoxesPolygon);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.pathsCurve);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.pathsLine);
|
||||
debugDisplayObjects.parentDebugContainer.addChild(debugDisplayObjects.eventText);
|
||||
debugDisplayObjects.parentDebugContainer.zIndex = 9999999;
|
||||
// Disable screen reader and mouse input on debug objects.
|
||||
// biome-ignore lint/suspicious/noExplicitAny: this prop is available in later versions
|
||||
debugDisplayObjects.parentDebugContainer.accessibleChildren = false;
|
||||
(debugDisplayObjects.parentDebugContainer).eventMode = "none";
|
||||
(debugDisplayObjects.parentDebugContainer).interactiveChildren = false;
|
||||
spine.addChild(debugDisplayObjects.parentDebugContainer);
|
||||
spine.state.addListener(debugDisplayObjects.eventCallback);
|
||||
this.registeredSpines.set(spine, debugDisplayObjects);
|
||||
}
|
||||
renderDebug(spine) {
|
||||
if (!this.registeredSpines.has(spine)) {
|
||||
// This should never happen. Spines are registered when you assign spine.debug
|
||||
this.registerSpine(spine);
|
||||
}
|
||||
const debugDisplayObjects = this.registeredSpines.get(spine);
|
||||
if (!debugDisplayObjects) {
|
||||
return;
|
||||
}
|
||||
spine.addChild(debugDisplayObjects.parentDebugContainer);
|
||||
debugDisplayObjects.skeletonXY.clear();
|
||||
debugDisplayObjects.regionAttachmentsShape.clear();
|
||||
debugDisplayObjects.meshTrianglesLine.clear();
|
||||
debugDisplayObjects.meshHullLine.clear();
|
||||
debugDisplayObjects.clippingPolygon.clear();
|
||||
debugDisplayObjects.boundingBoxesRect.clear();
|
||||
debugDisplayObjects.boundingBoxesCircle.clear();
|
||||
debugDisplayObjects.boundingBoxesPolygon.clear();
|
||||
debugDisplayObjects.pathsCurve.clear();
|
||||
debugDisplayObjects.pathsLine.clear();
|
||||
for (let len = debugDisplayObjects.bones.children.length; len > 0; len--) {
|
||||
debugDisplayObjects.bones.children[len - 1].destroy({ children: true, texture: true, baseTexture: true });
|
||||
}
|
||||
const scale = Math.abs(spine.scale.x || spine.scale.y || 1);
|
||||
const lineWidth = this.lineWidth / scale;
|
||||
if (this.drawBones) {
|
||||
this.drawBonesFunc(spine, debugDisplayObjects, lineWidth, scale);
|
||||
}
|
||||
if (this.drawPaths) {
|
||||
this.drawPathsFunc(spine, debugDisplayObjects, lineWidth);
|
||||
}
|
||||
if (this.drawBoundingBoxes) {
|
||||
this.drawBoundingBoxesFunc(spine, debugDisplayObjects, lineWidth);
|
||||
}
|
||||
if (this.drawClipping) {
|
||||
this.drawClippingFunc(spine, debugDisplayObjects, lineWidth);
|
||||
}
|
||||
if (this.drawMeshHull || this.drawMeshTriangles) {
|
||||
this.drawMeshHullAndMeshTriangles(spine, debugDisplayObjects, lineWidth);
|
||||
}
|
||||
if (this.drawRegionAttachments) {
|
||||
this.drawRegionAttachmentsFunc(spine, debugDisplayObjects, lineWidth);
|
||||
}
|
||||
if (this.drawEvents) {
|
||||
for (const child of debugDisplayObjects.eventText.children) {
|
||||
child.alpha -= 0.05;
|
||||
child.y -= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
drawBonesFunc(spine, debugDisplayObjects, lineWidth, scale) {
|
||||
const skeleton = spine.skeleton;
|
||||
const skeletonX = skeleton.x;
|
||||
const skeletonY = skeleton.y;
|
||||
const bones = skeleton.bones;
|
||||
debugDisplayObjects.skeletonXY.lineStyle(lineWidth, this.skeletonXYColor, 1);
|
||||
for (let i = 0, len = bones.length; i < len; i++) {
|
||||
const bone = bones[i];
|
||||
const boneLen = bone.data.length;
|
||||
const applied = bone.appliedPose;
|
||||
const starX = skeletonX + applied.worldX;
|
||||
const starY = skeletonY + applied.worldY;
|
||||
const endX = skeletonX + boneLen * applied.a + applied.worldX;
|
||||
const endY = skeletonY + boneLen * applied.b + applied.worldY;
|
||||
if (bone.data.name === "root" || bone.data.parent === null) {
|
||||
continue;
|
||||
}
|
||||
const w = Math.abs(starX - endX);
|
||||
const h = Math.abs(starY - endY);
|
||||
// a = w, // side length a
|
||||
const a2 = Math.pow(w, 2); // square root of side length a
|
||||
const b = h; // side length b
|
||||
const b2 = Math.pow(h, 2); // square root of side length b
|
||||
const c = Math.sqrt(a2 + b2); // side length c
|
||||
const c2 = Math.pow(c, 2); // square root of side length c
|
||||
const rad = Math.PI / 180;
|
||||
// A = Math.acos([a2 + c2 - b2] / [2 * a * c]) || 0, // Angle A
|
||||
// C = Math.acos([a2 + b2 - c2] / [2 * a * b]) || 0, // C angle
|
||||
const B = Math.acos((c2 + b2 - a2) / (2 * b * c)) || 0; // angle of corner B
|
||||
if (c === 0) {
|
||||
continue;
|
||||
}
|
||||
const gp = new Graphics();
|
||||
debugDisplayObjects.bones.addChild(gp);
|
||||
// draw bone
|
||||
const refRation = c / 50 / scale;
|
||||
gp.beginFill(this.bonesColor, 1);
|
||||
gp.drawPolygon(0, 0, 0 - refRation, c - refRation * 3, 0, c - refRation, 0 + refRation, c - refRation * 3);
|
||||
gp.endFill();
|
||||
gp.x = starX;
|
||||
gp.y = starY;
|
||||
gp.pivot.y = c;
|
||||
// Calculate bone rotation angle
|
||||
let rotation = 0;
|
||||
if (starX < endX && starY < endY) {
|
||||
// bottom right
|
||||
rotation = -B + 180 * rad;
|
||||
}
|
||||
else if (starX > endX && starY < endY) {
|
||||
// bottom left
|
||||
rotation = 180 * rad + B;
|
||||
}
|
||||
else if (starX > endX && starY > endY) {
|
||||
// top left
|
||||
rotation = -B;
|
||||
}
|
||||
else if (starX < endX && starY > endY) {
|
||||
// bottom left
|
||||
rotation = B;
|
||||
}
|
||||
else if (starY === endY && starX < endX) {
|
||||
// To the right
|
||||
rotation = 90 * rad;
|
||||
}
|
||||
else if (starY === endY && starX > endX) {
|
||||
// go left
|
||||
rotation = -90 * rad;
|
||||
}
|
||||
else if (starX === endX && starY < endY) {
|
||||
// down
|
||||
rotation = 180 * rad;
|
||||
}
|
||||
else if (starX === endX && starY > endY) {
|
||||
// up
|
||||
rotation = 0;
|
||||
}
|
||||
gp.rotation = rotation;
|
||||
// Draw the starting rotation point of the bone
|
||||
gp.lineStyle(lineWidth + refRation / 2.4, this.bonesColor, 1);
|
||||
gp.beginFill(0x000000, 0.6);
|
||||
gp.drawCircle(0, c, refRation * 1.2);
|
||||
gp.endFill();
|
||||
}
|
||||
// Draw the skeleton starting point "X" form
|
||||
const startDotSize = lineWidth * 3;
|
||||
debugDisplayObjects.skeletonXY.moveTo(skeletonX - startDotSize, skeletonY - startDotSize);
|
||||
debugDisplayObjects.skeletonXY.lineTo(skeletonX + startDotSize, skeletonY + startDotSize);
|
||||
debugDisplayObjects.skeletonXY.moveTo(skeletonX + startDotSize, skeletonY - startDotSize);
|
||||
debugDisplayObjects.skeletonXY.lineTo(skeletonX - startDotSize, skeletonY + startDotSize);
|
||||
}
|
||||
drawRegionAttachmentsFunc(spine, debugDisplayObjects, lineWidth) {
|
||||
const skeleton = spine.skeleton;
|
||||
const slots = skeleton.slots;
|
||||
debugDisplayObjects.regionAttachmentsShape.lineStyle(lineWidth, this.regionAttachmentsColor, 1);
|
||||
for (let i = 0, len = slots.length; i < len; i++) {
|
||||
const slot = slots[i];
|
||||
const attachment = slot.appliedPose.attachment;
|
||||
if (attachment == null || !(attachment instanceof RegionAttachment)) {
|
||||
continue;
|
||||
}
|
||||
const vertices = new Float32Array(8);
|
||||
attachment.computeWorldVertices(slot, attachment.getOffsets(slot.appliedPose), vertices, 0, 2);
|
||||
debugDisplayObjects.regionAttachmentsShape.drawPolygon(Array.from(vertices.slice(0, 8)));
|
||||
}
|
||||
}
|
||||
drawMeshHullAndMeshTriangles(spine, debugDisplayObjects, lineWidth) {
|
||||
const skeleton = spine.skeleton;
|
||||
const slots = skeleton.slots;
|
||||
debugDisplayObjects.meshHullLine.lineStyle(lineWidth, this.meshHullColor, 1);
|
||||
debugDisplayObjects.meshTrianglesLine.lineStyle(lineWidth, this.meshTrianglesColor, 1);
|
||||
for (let i = 0, len = slots.length; i < len; i++) {
|
||||
const slot = slots[i];
|
||||
if (!slot.bone.active) {
|
||||
continue;
|
||||
}
|
||||
const attachment = slot.appliedPose.attachment;
|
||||
if (attachment == null || !(attachment instanceof MeshAttachment)) {
|
||||
continue;
|
||||
}
|
||||
const meshAttachment = attachment;
|
||||
const vertices = new Float32Array(meshAttachment.worldVerticesLength);
|
||||
const triangles = meshAttachment.triangles;
|
||||
let hullLength = meshAttachment.hullLength;
|
||||
meshAttachment.computeWorldVertices(skeleton, slot, 0, meshAttachment.worldVerticesLength, vertices, 0, 2);
|
||||
// draw the skinned mesh (triangle)
|
||||
if (this.drawMeshTriangles) {
|
||||
for (let i = 0, len = triangles.length; i < len; i += 3) {
|
||||
const v1 = triangles[i] * 2;
|
||||
const v2 = triangles[i + 1] * 2;
|
||||
const v3 = triangles[i + 2] * 2;
|
||||
debugDisplayObjects.meshTrianglesLine.moveTo(vertices[v1], vertices[v1 + 1]);
|
||||
debugDisplayObjects.meshTrianglesLine.lineTo(vertices[v2], vertices[v2 + 1]);
|
||||
debugDisplayObjects.meshTrianglesLine.lineTo(vertices[v3], vertices[v3 + 1]);
|
||||
}
|
||||
}
|
||||
// draw skin border
|
||||
if (this.drawMeshHull && hullLength > 0) {
|
||||
hullLength = (hullLength >> 1) * 2;
|
||||
let lastX = vertices[hullLength - 2];
|
||||
let lastY = vertices[hullLength - 1];
|
||||
for (let i = 0, len = hullLength; i < len; i += 2) {
|
||||
const x = vertices[i];
|
||||
const y = vertices[i + 1];
|
||||
debugDisplayObjects.meshHullLine.moveTo(x, y);
|
||||
debugDisplayObjects.meshHullLine.lineTo(lastX, lastY);
|
||||
lastX = x;
|
||||
lastY = y;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
drawClippingFunc(spine, debugDisplayObjects, lineWidth) {
|
||||
const skeleton = spine.skeleton;
|
||||
const slots = skeleton.slots;
|
||||
debugDisplayObjects.clippingPolygon.lineStyle(lineWidth, this.clippingPolygonColor, 1);
|
||||
for (let i = 0, len = slots.length; i < len; i++) {
|
||||
const slot = slots[i];
|
||||
if (!slot.bone.active) {
|
||||
continue;
|
||||
}
|
||||
const attachment = slot.appliedPose.attachment;
|
||||
if (attachment == null || !(attachment instanceof ClippingAttachment)) {
|
||||
continue;
|
||||
}
|
||||
const clippingAttachment = attachment;
|
||||
const nn = clippingAttachment.worldVerticesLength;
|
||||
const world = new Float32Array(nn);
|
||||
clippingAttachment.computeWorldVertices(skeleton, slot, 0, nn, world, 0, 2);
|
||||
debugDisplayObjects.clippingPolygon.drawPolygon(Array.from(world));
|
||||
}
|
||||
}
|
||||
drawBoundingBoxesFunc(spine, debugDisplayObjects, lineWidth) {
|
||||
// draw the total outline of the bounding box
|
||||
debugDisplayObjects.boundingBoxesRect.lineStyle(lineWidth, this.boundingBoxesRectColor, 5);
|
||||
const bounds = new SkeletonBounds();
|
||||
bounds.update(spine.skeleton, true);
|
||||
if (bounds.minX !== Infinity) {
|
||||
debugDisplayObjects.boundingBoxesRect.drawRect(bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight());
|
||||
}
|
||||
const polygons = bounds.polygons;
|
||||
const drawPolygon = (polygonVertices, _offset, count) => {
|
||||
debugDisplayObjects.boundingBoxesPolygon.lineStyle(lineWidth, this.boundingBoxesPolygonColor, 1);
|
||||
debugDisplayObjects.boundingBoxesPolygon.beginFill(this.boundingBoxesPolygonColor, 0.1);
|
||||
if (count < 3) {
|
||||
throw new Error("Polygon must contain at least 3 vertices");
|
||||
}
|
||||
const paths = [];
|
||||
const dotSize = lineWidth * 2;
|
||||
for (let i = 0, len = polygonVertices.length; i < len; i += 2) {
|
||||
const x1 = polygonVertices[i];
|
||||
const y1 = polygonVertices[i + 1];
|
||||
// draw the bounding box node
|
||||
debugDisplayObjects.boundingBoxesCircle.lineStyle(0);
|
||||
debugDisplayObjects.boundingBoxesCircle.beginFill(this.boundingBoxesCircleColor);
|
||||
debugDisplayObjects.boundingBoxesCircle.drawCircle(x1, y1, dotSize);
|
||||
debugDisplayObjects.boundingBoxesCircle.endFill();
|
||||
paths.push(x1, y1);
|
||||
}
|
||||
// draw the bounding box area
|
||||
debugDisplayObjects.boundingBoxesPolygon.drawPolygon(paths);
|
||||
debugDisplayObjects.boundingBoxesPolygon.endFill();
|
||||
};
|
||||
for (let i = 0, len = polygons.length; i < len; i++) {
|
||||
const polygon = polygons[i];
|
||||
drawPolygon(polygon, 0, polygon.length);
|
||||
}
|
||||
}
|
||||
drawPathsFunc(spine, debugDisplayObjects, lineWidth) {
|
||||
const skeleton = spine.skeleton;
|
||||
const slots = skeleton.slots;
|
||||
debugDisplayObjects.pathsCurve.lineStyle(lineWidth, this.pathsCurveColor, 1);
|
||||
debugDisplayObjects.pathsLine.lineStyle(lineWidth, this.pathsLineColor, 1);
|
||||
for (let i = 0, len = slots.length; i < len; i++) {
|
||||
const slot = slots[i];
|
||||
if (!slot.bone.active) {
|
||||
continue;
|
||||
}
|
||||
const attachment = slot.appliedPose.attachment;
|
||||
if (attachment == null || !(attachment instanceof PathAttachment)) {
|
||||
continue;
|
||||
}
|
||||
const pathAttachment = attachment;
|
||||
let nn = pathAttachment.worldVerticesLength;
|
||||
const world = new Float32Array(nn);
|
||||
pathAttachment.computeWorldVertices(skeleton, slot, 0, nn, world, 0, 2);
|
||||
let x1 = world[2];
|
||||
let y1 = world[3];
|
||||
let x2 = 0;
|
||||
let y2 = 0;
|
||||
if (pathAttachment.closed) {
|
||||
const cx1 = world[0];
|
||||
const cy1 = world[1];
|
||||
const cx2 = world[nn - 2];
|
||||
const cy2 = world[nn - 1];
|
||||
x2 = world[nn - 4];
|
||||
y2 = world[nn - 3];
|
||||
// curve
|
||||
debugDisplayObjects.pathsCurve.moveTo(x1, y1);
|
||||
debugDisplayObjects.pathsCurve.bezierCurveTo(cx1, cy1, cx2, cy2, x2, y2);
|
||||
// handle
|
||||
debugDisplayObjects.pathsLine.moveTo(x1, y1);
|
||||
debugDisplayObjects.pathsLine.lineTo(cx1, cy1);
|
||||
debugDisplayObjects.pathsLine.moveTo(x2, y2);
|
||||
debugDisplayObjects.pathsLine.lineTo(cx2, cy2);
|
||||
}
|
||||
nn -= 4;
|
||||
for (let ii = 4; ii < nn; ii += 6) {
|
||||
const cx1 = world[ii];
|
||||
const cy1 = world[ii + 1];
|
||||
const cx2 = world[ii + 2];
|
||||
const cy2 = world[ii + 3];
|
||||
x2 = world[ii + 4];
|
||||
y2 = world[ii + 5];
|
||||
// curve
|
||||
debugDisplayObjects.pathsCurve.moveTo(x1, y1);
|
||||
debugDisplayObjects.pathsCurve.bezierCurveTo(cx1, cy1, cx2, cy2, x2, y2);
|
||||
// handle
|
||||
debugDisplayObjects.pathsLine.moveTo(x1, y1);
|
||||
debugDisplayObjects.pathsLine.lineTo(cx1, cy1);
|
||||
debugDisplayObjects.pathsLine.moveTo(x2, y2);
|
||||
debugDisplayObjects.pathsLine.lineTo(cx2, cy2);
|
||||
x1 = x2;
|
||||
y1 = y2;
|
||||
}
|
||||
}
|
||||
}
|
||||
unregisterSpine(spine) {
|
||||
if (!this.registeredSpines.has(spine)) {
|
||||
console.warn("SpineDebugRenderer.unregisterSpine() - spine is not registered, can't unregister!", spine);
|
||||
}
|
||||
const debugDisplayObjects = this.registeredSpines.get(spine);
|
||||
if (!debugDisplayObjects) {
|
||||
return;
|
||||
}
|
||||
spine.state.removeListener(debugDisplayObjects.eventCallback);
|
||||
debugDisplayObjects.parentDebugContainer.destroy({ baseTexture: true, children: true, texture: true });
|
||||
this.registeredSpines.delete(spine);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVEZWJ1Z1JlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lRGVidWdSZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFHL0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEksT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFlBQVksQ0FBQztBQXlDbEM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQUN0QixnQkFBZ0IsR0FBb0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUvRCxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN6QixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDakIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDcEIscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBQzdCLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFFbEIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNkLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztJQUNsQyxhQUFhLEdBQUcsUUFBUSxDQUFDO0lBQ3pCLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztJQUM5QixvQkFBb0IsR0FBRyxRQUFRLENBQUM7SUFDaEMsc0JBQXNCLEdBQUcsUUFBUSxDQUFDO0lBQ2xDLHlCQUF5QixHQUFHLFFBQVEsQ0FBQztJQUNyQyx3QkFBd0IsR0FBRyxRQUFRLENBQUM7SUFDcEMsZUFBZSxHQUFH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
Line truncated
|
||||
@@ -0,0 +1,44 @@
|
||||
/******************************************************************************
|
||||
* 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 { BlendMode, Texture, TextureFilter, TextureWrap } from "@spine-particle/spine-core-4.3";
|
||||
import type { BaseTexture as PixiBaseTexture } from "@pixi/core";
|
||||
import { BLEND_MODES, Texture as PixiTexture } from "@pixi/core";
|
||||
export declare class SpineTexture extends Texture {
|
||||
private static textureMap;
|
||||
static from(texture: PixiBaseTexture): SpineTexture;
|
||||
readonly texture: PixiTexture;
|
||||
private constructor();
|
||||
setFilters(minFilter: TextureFilter, _magFilter: TextureFilter): void;
|
||||
setWraps(uWrap: TextureWrap, _vWrap: TextureWrap): void;
|
||||
dispose(): void;
|
||||
private static toPixiTextureFilter;
|
||||
private static toPixiMipMap;
|
||||
private static toPixiTextureWrap;
|
||||
static toPixiBlending(blend: BlendMode): BLEND_MODES;
|
||||
}
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
/******************************************************************************
|
||||
* 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 { BlendMode, Texture, TextureFilter, TextureWrap } from "@spine-particle/spine-core-4.3";
|
||||
import { BLEND_MODES, MIPMAP_MODES, Texture as PixiTexture, SCALE_MODES, WRAP_MODES } from "@pixi/core";
|
||||
export class SpineTexture extends Texture {
|
||||
static textureMap = new Map();
|
||||
static from(texture) {
|
||||
if (SpineTexture.textureMap.has(texture)) {
|
||||
return SpineTexture.textureMap.get(texture);
|
||||
}
|
||||
return new SpineTexture(texture);
|
||||
}
|
||||
texture;
|
||||
constructor(image) {
|
||||
// Todo: maybe add error handling if you feed a video texture to spine?
|
||||
super(image.resource.source);
|
||||
this.texture = PixiTexture.from(image);
|
||||
}
|
||||
setFilters(minFilter, _magFilter) {
|
||||
this.texture.baseTexture.scaleMode = SpineTexture.toPixiTextureFilter(minFilter);
|
||||
this.texture.baseTexture.mipmap = SpineTexture.toPixiMipMap(minFilter);
|
||||
// pixi only has one filter for both min and mag, too bad
|
||||
}
|
||||
setWraps(uWrap, _vWrap) {
|
||||
this.texture.baseTexture.wrapMode = SpineTexture.toPixiTextureWrap(uWrap);
|
||||
// Pixi only has one setting
|
||||
}
|
||||
dispose() {
|
||||
// I am not entirely sure about this...
|
||||
this.texture.destroy();
|
||||
}
|
||||
static toPixiTextureFilter(filter) {
|
||||
switch (filter) {
|
||||
case TextureFilter.Nearest:
|
||||
case TextureFilter.MipMapNearestLinear:
|
||||
case TextureFilter.MipMapNearestNearest:
|
||||
return SCALE_MODES.NEAREST;
|
||||
case TextureFilter.Linear:
|
||||
case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap
|
||||
case TextureFilter.MipMapLinearNearest:
|
||||
return SCALE_MODES.LINEAR;
|
||||
default:
|
||||
throw new Error(`Unknown texture filter: ${String(filter)}`);
|
||||
}
|
||||
}
|
||||
static toPixiMipMap(filter) {
|
||||
switch (filter) {
|
||||
case TextureFilter.Nearest:
|
||||
case TextureFilter.Linear:
|
||||
return MIPMAP_MODES.OFF;
|
||||
case TextureFilter.MipMapNearestLinear:
|
||||
case TextureFilter.MipMapNearestNearest:
|
||||
case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap
|
||||
case TextureFilter.MipMapLinearNearest:
|
||||
return MIPMAP_MODES.ON;
|
||||
default:
|
||||
throw new Error(`Unknown texture filter: ${String(filter)}`);
|
||||
}
|
||||
}
|
||||
static toPixiTextureWrap(wrap) {
|
||||
switch (wrap) {
|
||||
case TextureWrap.ClampToEdge:
|
||||
return WRAP_MODES.CLAMP;
|
||||
case TextureWrap.MirroredRepeat:
|
||||
return WRAP_MODES.MIRRORED_REPEAT;
|
||||
case TextureWrap.Repeat:
|
||||
return WRAP_MODES.REPEAT;
|
||||
default:
|
||||
throw new Error(`Unknown texture wrap: ${String(wrap)}`);
|
||||
}
|
||||
}
|
||||
static toPixiBlending(blend) {
|
||||
switch (blend) {
|
||||
case BlendMode.Normal:
|
||||
return BLEND_MODES.NORMAL;
|
||||
case BlendMode.Additive:
|
||||
return BLEND_MODES.ADD;
|
||||
case BlendMode.Multiply:
|
||||
return BLEND_MODES.MULTIPLY;
|
||||
case BlendMode.Screen:
|
||||
return BLEND_MODES.SCREEN;
|
||||
default:
|
||||
throw new Error(`Unknown blendMode: ${String(blend)}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lVGV4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4RyxNQUFNLE9BQU8sWUFBYSxTQUFRLE9BQU87SUFDaEMsTUFBTSxDQUFDLFVBQVUsR0FBdUMsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFbEcsTUFBTSxDQUFDLElBQUksQ0FBRSxPQUF3QjtRQUMzQyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDMUMsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQWlCLENBQUM7UUFDN0QsQ0FBQztRQUNELE9BQU8sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVlLE9BQU8sQ0FBYztJQUVyQyxZQUFxQixLQUFzQjtRQUMxQyx1RUFBdUU7UUFDdkUsS0FBSyxDQUFFLEtBQUssQ0FBQyxRQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sVUFBVSxDQUFFLFNBQXdCLEVBQUUsVUFBeUI7UUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRixJ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LEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcI
Line truncated
|
||||
@@ -0,0 +1,33 @@
|
||||
/******************************************************************************
|
||||
* 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 { BaseTexture } from "@pixi/core";
|
||||
export interface ISpineAtlasMetadata {
|
||||
imageMetadata?: any;
|
||||
images?: BaseTexture | string | Record<string, BaseTexture | string>;
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
/******************************************************************************
|
||||
* 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 { TextureAtlas } from "@spine-particle/spine-core-4.3";
|
||||
import { Assets, checkExtension, copySearchParams, LoaderParserPriority } from "@pixi/assets";
|
||||
import { ALPHA_MODES, BaseTexture, ExtensionType, extensions, settings, utils } from "@pixi/core";
|
||||
import { SpineTexture } from "../SpineTexture.js";
|
||||
const loaderName = "spineTextureAtlasLoader";
|
||||
const spineTextureAtlasLoader = {
|
||||
extension: ExtensionType.Asset,
|
||||
resolver: {
|
||||
test: (value) => checkExtension(value, ".atlas"),
|
||||
parse: (value) => {
|
||||
const split = value.split('.');
|
||||
return {
|
||||
resolution: parseFloat(settings.RETINA_PREFIX?.exec(value)?.[1] ?? '1'),
|
||||
format: split[split.length - 2],
|
||||
src: value,
|
||||
};
|
||||
},
|
||||
},
|
||||
loader: {
|
||||
name: loaderName,
|
||||
extension: {
|
||||
type: ExtensionType.LoadParser,
|
||||
priority: LoaderParserPriority.Normal,
|
||||
name: loaderName,
|
||||
},
|
||||
test(url) {
|
||||
return checkExtension(url, ".atlas");
|
||||
},
|
||||
async load(url) {
|
||||
const response = await settings.ADAPTER.fetch(url);
|
||||
if (!response.ok)
|
||||
throw new Error(`[${loaderName}] Failed to fetch ${url}: ${response.status} ${response.statusText}`);
|
||||
return await response.text();
|
||||
},
|
||||
testParse(asset, options) {
|
||||
const isExtensionRight = checkExtension(options.src, ".atlas");
|
||||
const isString = typeof asset === "string";
|
||||
const isExplicitLoadParserSet = options.loadParser === loaderName;
|
||||
return Promise.resolve((isExtensionRight || isExplicitLoadParserSet) && isString);
|
||||
},
|
||||
unload(atlas) {
|
||||
atlas.dispose();
|
||||
},
|
||||
async parse(asset, options, loader) {
|
||||
const metadata = options.data || {};
|
||||
let basePath = utils.path.dirname(options.src);
|
||||
if (basePath && basePath.lastIndexOf("/") !== basePath.length - 1) {
|
||||
basePath += "/";
|
||||
}
|
||||
// Retval is going to be a texture atlas. However, we need to wait for its callback to resolve this promise.
|
||||
const retval = new TextureAtlas(asset);
|
||||
// If the user gave me only one texture, that one is assumed to be the "first" texture in the atlas
|
||||
if (metadata.images instanceof BaseTexture || typeof metadata.images === "string") {
|
||||
const pixiTexture = metadata.images;
|
||||
metadata.images = {};
|
||||
metadata.images[retval.pages[0].name] = pixiTexture;
|
||||
}
|
||||
// we will wait for all promises for the textures at the same time at the end.
|
||||
const textureLoadingPromises = [];
|
||||
// setting preferCreateImageBitmap to false for loadTextures loader to allow loading PMA images
|
||||
let oldPreferCreateImageBitmap = true;
|
||||
for (const parser of loader.parsers) {
|
||||
if (parser.name === "loadTextures") {
|
||||
oldPreferCreateImageBitmap = parser.config?.preferCreateImageBitmap;
|
||||
break;
|
||||
}
|
||||
}
|
||||
Assets.setPreferences({ preferCreateImageBitmap: false });
|
||||
// fill the pages
|
||||
for (const page of retval.pages) {
|
||||
const pageName = page.name;
|
||||
const providedPage = metadata?.images ? metadata.images[pageName] : undefined;
|
||||
if (providedPage instanceof BaseTexture) {
|
||||
page.setTexture(SpineTexture.from(providedPage));
|
||||
}
|
||||
else {
|
||||
const url = providedPage ?? utils.path.normalize([...basePath.split(utils.path.sep), pageName].join(utils.path.sep));
|
||||
const assetsToLoadIn = { src: copySearchParams(url, options.src), data: { ...metadata.imageMetadata, ...{ alphaMode: page.pma ? ALPHA_MODES.PMA : ALPHA_MODES.UNPACK } } };
|
||||
const pixiPromise = loader.load(assetsToLoadIn)
|
||||
.then((texture) => {
|
||||
page.setTexture(SpineTexture.from(texture.baseTexture));
|
||||
});
|
||||
textureLoadingPromises.push(pixiPromise);
|
||||
}
|
||||
}
|
||||
await Promise.all(textureLoadingPromises);
|
||||
// restoring preferCreateImageBitmap old value for loadTextures loader
|
||||
Assets.setPreferences({ preferCreateImageBitmap: oldPreferCreateImageBitmap });
|
||||
return retval;
|
||||
},
|
||||
},
|
||||
};
|
||||
extensions.add(spineTextureAtlasLoader);
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRsYXNMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL0F0bGFzTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUYsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUlsRCxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQztBQUU3QyxNQUFNLHVCQUF1QixHQUFpRTtJQUM3RixTQUFTLEVBQUUsYUFBYSxDQUFDLEtBQUs7SUFFOUIsUUFBUSxFQUFFO1FBQ1QsSUFBSSxFQUFFLENBQUMsS0FBYSxFQUFXLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztRQUNqRSxLQUFLLEVBQUUsQ0FBQyxLQUFhLEVBQW1CLEVBQUU7WUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixPQUFPO2dCQUNOLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7Z0JBQ3ZFLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQy9CLEdBQUcsRUFBRSxLQUFLO2FBQ1YsQ0FBQztRQUNILENBQUM7S0FDRDtJQUVE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
Line truncated
|
||||
@@ -0,0 +1,29 @@
|
||||
/******************************************************************************
|
||||
* 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.
|
||||
*****************************************************************************/
|
||||
export {};
|
||||
@@ -0,0 +1,67 @@
|
||||
/******************************************************************************
|
||||
* 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 { checkExtension, LoaderParserPriority } from "@pixi/assets";
|
||||
import { ExtensionType, extensions, settings } from "@pixi/core";
|
||||
const loaderName = "spineSkeletonLoader";
|
||||
// biome-ignore lint/suspicious/noExplicitAny: can receive any
|
||||
function isJson(resource) {
|
||||
return resource.hasOwnProperty("bones");
|
||||
}
|
||||
// biome-ignore lint/suspicious/noExplicitAny: can receive any
|
||||
function isBuffer(resource) {
|
||||
return resource instanceof Uint8Array;
|
||||
}
|
||||
const spineLoaderExtension = {
|
||||
extension: ExtensionType.Asset,
|
||||
loader: {
|
||||
name: loaderName,
|
||||
extension: {
|
||||
type: ExtensionType.LoadParser,
|
||||
priority: LoaderParserPriority.Normal,
|
||||
name: loaderName,
|
||||
},
|
||||
test(url) {
|
||||
return checkExtension(url, ".skel");
|
||||
},
|
||||
async load(url) {
|
||||
const response = await settings.ADAPTER.fetch(url);
|
||||
if (!response.ok)
|
||||
throw new Error(`[${loaderName}] Failed to fetch ${url}: ${response.status} ${response.statusText}`);
|
||||
return new Uint8Array(await response.arrayBuffer());
|
||||
},
|
||||
testParse(asset, options) {
|
||||
const isJsonSpineModel = checkExtension(options.src, ".json") && isJson(asset);
|
||||
const isBinarySpineModel = checkExtension(options.src, ".skel") && isBuffer(asset);
|
||||
const isExplicitLoadParserSet = options.loadParser === loaderName;
|
||||
return Promise.resolve(isJsonSpineModel || isBinarySpineModel || isExplicitLoadParserSet);
|
||||
},
|
||||
},
|
||||
};
|
||||
extensions.add(spineLoaderExtension);
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25Mb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL1NrZWxldG9uTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUcvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQU1qRSxNQUFNLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQztBQUV6Qyw4REFBOEQ7QUFDOUQsU0FBUyxNQUFNLENBQUUsUUFBYTtJQUM3QixPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxTQUFTLFFBQVEsQ0FBRSxRQUFhO0lBQy9CLE9BQU8sUUFBUSxZQUFZLFVBQVUsQ0FBQztBQUN2QyxDQUFDO0FBRUQsTUFBTSxvQkFBb0IsR0FBNEQ7SUFDckYsU0FBUyxFQUFFLGFBQWEsQ0FBQyxLQUFLO0lBRTlCLE1BQU0sRUFBRTtRQUNQLElBQUksRUFBRSxVQUFVO1FBQ2hCLFNBQVMsRUFBRTtZQUNWLElBQUksRUFBRSxhQUFhLENBQUMsVUFBVTtZQUM5QixRQUFRLEVBQUUsb0JBQW9CLENBQUMsTUFBTTtZQUNyQyxJQUFJLEVBQUUsVUFBVTtTQUNoQjtRQUVELElBQUksQ0FBRSxHQUFHO1lBQ1IsT0FBTyxjQUFjLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFFLEdBQVc7WUFDdEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLFVBQVUscUJBQXFCLEdBQUcsS0FBSyxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBRXRHLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsU0FBUyxDQUFFLEtBQWMsRUFBRSxPQUFzQjtZQUNoRCxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBYSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RixNQUFNLGtCQUFrQixHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBYSxFQUFFLE9BQU8sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RixNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDO1lBRWxFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxrQkFBa0IsSUFBSSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNGLENBQUM7S0FDRDtDQUMwRCxDQUFDO0FBRTdELFVBQVUsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBBc3NldEV4dGVuc2lvbiwgUmVzb2x2ZWRBc3NldCB9IGZyb20gXCJAcGl4aS9hc3NldHNcIjtcbmltcG9ydCB7IGNoZWNrRXh0ZW5zaW9uLCBMb2FkZXJQYXJzZXJQcmlvcml0eSB9IGZyb20gXCJAcGl4aS9hc3NldHNcIjtcbmltcG9ydCB7IEV4dGVuc2lvblR5cGUsIGV4dGVuc2lvbnMsIHNldHRpbmdzIH0gZnJvbSBcIkBwaXhpL2NvcmVcIjtcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBhbnkgdW50aWwgd2UgaGF2ZSBhIHNjaGVtYVxudHlwZSBTa2VsZXRvbkpzb25Bc3NldCA9IGFueTtcbnR5cGUgU2tlbGV0b25CaW5hcnlBc3NldCA9IFVpbnQ4QXJyYXk7XG5cbmNvbnN0IGxvYWRlck5hbWUgPSBcInNwaW5lU2tlbGV0b25Mb2FkZXJcIjtcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBjYW4gcmVjZWl2ZSBhbnlcbmZ1b
Line truncated
|
||||
@@ -0,0 +1,42 @@
|
||||
/******************************************************************************
|
||||
* 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 { Buffer, Geometry } from "@pixi/core";
|
||||
/**
|
||||
* Geometry used to batch standard PIXI content (e.g. Mesh, Sprite, Graphics objects).
|
||||
* @memberof PIXI
|
||||
*/
|
||||
export declare class DarkTintBatchGeometry extends Geometry {
|
||||
_buffer: Buffer;
|
||||
_indexBuffer: Buffer;
|
||||
/**
|
||||
* @param {boolean} [_static=false] - Optimization flag, where `false`
|
||||
* is updated every frame, `true` doesn't change frame-to-frame.
|
||||
*/
|
||||
constructor(_static?: boolean);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
/******************************************************************************
|
||||
* 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 { Buffer, Geometry, TYPES } from "@pixi/core";
|
||||
/**
|
||||
* Geometry used to batch standard PIXI content (e.g. Mesh, Sprite, Graphics objects).
|
||||
* @memberof PIXI
|
||||
*/
|
||||
export class DarkTintBatchGeometry extends Geometry {
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
_buffer;
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
_indexBuffer;
|
||||
/**
|
||||
* @param {boolean} [_static=false] - Optimization flag, where `false`
|
||||
* is updated every frame, `true` doesn't change frame-to-frame.
|
||||
*/
|
||||
constructor(_static = false) {
|
||||
super();
|
||||
this._buffer = new Buffer(undefined, _static, false);
|
||||
this._indexBuffer = new Buffer(undefined, _static, true);
|
||||
this.addAttribute("aVertexPosition", this._buffer, 2, false, TYPES.FLOAT)
|
||||
.addAttribute("aTextureCoord", this._buffer, 2, false, TYPES.FLOAT)
|
||||
.addAttribute("aColor", this._buffer, 4, true, TYPES.UNSIGNED_BYTE)
|
||||
.addAttribute("aDarkColor", this._buffer, 4, true, TYPES.UNSIGNED_BYTE)
|
||||
.addAttribute("aTextureId", this._buffer, 1, true, TYPES.FLOAT)
|
||||
.addIndex(this._indexBuffer);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1RpbnRCYXRjaEdlb20uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGFya1RpbnRNZXNoL0RhcmtUaW50QmF0Y2hHZW9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFckQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFFBQVE7SUFDbEQsZ0VBQWdFO0lBQ3pELE9BQU8sQ0FBUztJQUV2QixnRUFBZ0U7SUFDekQsWUFBWSxDQUFTO0lBRTVCOzs7T0FHRztJQUNILFlBQWEsT0FBTyxHQUFHLEtBQUs7UUFDM0IsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7YUFDdkUsWUFBWSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUNsRSxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDO2FBQ2xFLFlBQVksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUM7YUFDdEUsWUFBWSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUM5RCxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9CLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQnVmZmVyLCBHZW9tZXRyeSwgVFlQRVMgfSBmcm9tIFwiQHBpeGkvY29yZVwiO1xuXG4vKipcbiAqIEdlb21ldHJ5IHVzZWQgdG8gYmF0Y2ggc3RhbmRhcmQgUElYSSBjb250ZW50IChlLmcuIE1lc2gsIFNwcml0ZSwgR3JhcGhpY3Mgb2JqZWN0cykuXG4gKiBAbWVtYmVyb2YgUElYSVxuICovXG5leHBvcnQgY2xhc3MgRGFya1RpbnRCYXRjaEdlb21ldHJ5IGV4dGVuZHMgR2VvbWV0cnkge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5cdHB1YmxpYyBfYnVmZmVyOiBCdWZmZXI7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXHRwdWJsaWMgX2luZGV4QnVmZmVyOiBCdWZmZXI7XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW19zdGF0aWM9ZmFsc2VdIC0gT3B0aW1pemF0aW9uIGZsYWcsIHdoZXJlIGBmYWxzZWBcblx0ICogICAgICAgIGlzIHVwZGF0ZWQgZXZlcnkgZnJhbWUsIGB0cnVlYCBkb2Vzbid0IGNoYW5nZSBmcmFtZS10by1mcmFtZS5cblx0ICovXG5cdGNvbnN0cnVjdG9yIChfc3RhdGljID0gZmFsc2UpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fYnVmZmVyID0gbmV3IEJ1ZmZlcih1bmRlZmluZWQsIF9zdGF0aWMsIGZhbHNlKTtcblxuXHRcdHRoaXMuX2luZGV4QnVmZmVyID0gbmV3IEJ1ZmZlcih1bmRlZmluZWQsIF9zdGF0aWMsIHRydWUpO1xuXG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoXCJhVmVydGV4UG9zaXRpb25cIiwgdGhpcy5fYnVmZmVyLCAyLCBmYWxzZSwgVFlQRVMuRkxPQVQpXG5cdFx0XHQuYWRkQXR0cmlidXRlKFwiYVRleHR1cmVDb29yZFwiLCB0aGlzLl9idWZmZXIsI
Line truncated
|
||||
@@ -0,0 +1,40 @@
|
||||
/******************************************************************************
|
||||
* 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 { Geometry } from "@pixi/core";
|
||||
/**
|
||||
* Geometry used to batch standard PIXI content (e.g. Mesh, Sprite, Graphics objects).
|
||||
* @memberof PIXI
|
||||
*/
|
||||
export declare class DarkTintGeometry extends Geometry {
|
||||
/**
|
||||
* @param {boolean} [_static=false] - Optimization flag, where `false`
|
||||
* is updated every frame, `true` doesn't change frame-to-frame.
|
||||
*/
|
||||
constructor(_static?: boolean);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/******************************************************************************
|
||||
* 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 { Buffer, Geometry, TYPES } from "@pixi/core";
|
||||
/**
|
||||
* Geometry used to batch standard PIXI content (e.g. Mesh, Sprite, Graphics objects).
|
||||
* @memberof PIXI
|
||||
*/
|
||||
export class DarkTintGeometry extends Geometry {
|
||||
/**
|
||||
* @param {boolean} [_static=false] - Optimization flag, where `false`
|
||||
* is updated every frame, `true` doesn't change frame-to-frame.
|
||||
*/
|
||||
constructor(_static = false) {
|
||||
super();
|
||||
const verticesBuffer = new Buffer(undefined);
|
||||
const uvsBuffer = new Buffer(undefined, true);
|
||||
const indexBuffer = new Buffer(undefined, true, true);
|
||||
this.addAttribute("aVertexPosition", verticesBuffer, 2, false, TYPES.FLOAT);
|
||||
this.addAttribute("aTextureCoord", uvsBuffer, 2, false, TYPES.FLOAT);
|
||||
this.addIndex(indexBuffer);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1RpbnRHZW9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhcmtUaW50TWVzaC9EYXJrVGludEdlb20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsUUFBUTtJQUM3Qzs7O09BR0c7SUFDSCxZQUFhLE9BQU8sR0FBRyxLQUFLO1FBQzNCLEtBQUssRUFBRSxDQUFDO1FBRVIsTUFBTSxjQUFjLEdBQUcsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBCdWZmZXIsIEdlb21ldHJ5LCBUWVBFUyB9IGZyb20gXCJAcGl4aS9jb3JlXCI7XG5cbi8qKlxuICogR2VvbWV0cnkgdXNlZCB0byBiYXRjaCBzdGFuZGFyZCBQSVhJIGNvbnRlbnQgKGUuZy4gTWVzaCwgU3ByaXRlLCBHcmFwaGljcyBvYmplY3RzKS5cbiAqIEBtZW1iZXJvZiBQSVhJXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXJrVGludEdlb21ldHJ5IGV4dGVuZHMgR2VvbWV0cnkge1xuXHQvKipcblx0ICogQHBhcmFtIHtib29sZWFufSBbX3N0YXRpYz1mYWxzZV0gLSBPcHRpbWl6YXRpb24gZmxhZywgd2hlcmUgYGZhbHNlYFxuXHQgKiAgICAgICAgaXMgdXBkYXRlZCBldmVyeSBmcmFtZSwgYHRydWVgIGRvZXNuJ3QgY2hhbmdlIGZyYW1lLXRvLWZyYW1lLlxuXHQgKi9cblx0Y29uc3RydWN0b3IgKF9zdGF0aWMgPSBmYWxzZSkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRjb25zdCB2ZXJ0aWNlc0J1ZmZlciA9IG5ldyBCdWZmZXIodW5kZWZpbmVkKTtcblx0XHRjb25zdCB1dnNCdWZmZXIgPSBuZXcgQnVmZmVyKHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0Y29uc3QgaW5kZXhCdWZmZXIgPSBuZXcgQnVmZmVyKHVuZGVmaW5lZCwgdHJ1ZSwgdHJ1ZSk7XG5cblx0XHR0aGlzLmFkZEF0dHJpYnV0ZShcImFWZXJ0ZXhQb3NpdGlvblwiLCB2ZXJ0aWNlc0J1ZmZlciwgMiwgZmFsc2UsIFRZUEVTLkZMT0FUKTtcblx0XHR0aGlzLmFkZEF0dHJpYnV0ZShcImFUZXh0dXJlQ29vcmRcIiwgdXZzQnVmZmVyLCAyLCBmYWxzZSwgVFlQRVMuRkxPQVQpO1xuXHRcdHRoaXMuYWRkSW5kZXgoaW5kZXhCdWZmZXIpO1xuXHR9XG59XG4iXX0=
|
||||
@@ -0,0 +1,66 @@
|
||||
/******************************************************************************
|
||||
* 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 type { ColorSource } from "@pixi/core";
|
||||
import { Shader, Texture, TextureMatrix } from "@pixi/core";
|
||||
export interface IDarkTintMaterialOptions {
|
||||
alpha?: number;
|
||||
tint?: ColorSource;
|
||||
darkTint?: ColorSource;
|
||||
pluginName?: string;
|
||||
uniforms?: Record<string, unknown>;
|
||||
}
|
||||
export declare class DarkTintMaterial extends Shader {
|
||||
readonly uvMatrix: TextureMatrix;
|
||||
batchable: boolean;
|
||||
pluginName: string;
|
||||
_tintRGB: number;
|
||||
_darkTintRGB: number;
|
||||
/**
|
||||
* Only do update if tint or alpha changes.
|
||||
* @private
|
||||
* @default false
|
||||
*/
|
||||
private _colorDirty;
|
||||
private _alpha;
|
||||
private _tintColor;
|
||||
private _darkTintColor;
|
||||
constructor(texture?: Texture);
|
||||
get texture(): Texture;
|
||||
set texture(value: Texture);
|
||||
set alpha(value: number);
|
||||
get alpha(): number;
|
||||
set tint(value: ColorSource);
|
||||
get tint(): ColorSource;
|
||||
set darkTint(value: ColorSource);
|
||||
get darkTint(): ColorSource;
|
||||
get tintValue(): number;
|
||||
get darkTintValue(): number;
|
||||
/** Gets called automatically by the Mesh. Intended to be overridden for custom {@link PIXI.MeshMaterial} objects. */
|
||||
update(): void;
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
/******************************************************************************
|
||||
* 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 { Color, Matrix, Program, Shader, Texture, TextureMatrix } from "@pixi/core";
|
||||
const vertex = `
|
||||
attribute vec2 aVertexPosition;
|
||||
attribute vec2 aTextureCoord;
|
||||
|
||||
uniform mat3 projectionMatrix;
|
||||
uniform mat3 translationMatrix;
|
||||
uniform mat3 uTextureMatrix;
|
||||
|
||||
varying vec2 vTextureCoord;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);
|
||||
|
||||
vTextureCoord = (uTextureMatrix * vec3(aTextureCoord, 1.0)).xy;
|
||||
}
|
||||
`;
|
||||
const fragment = `
|
||||
varying vec2 vTextureCoord;
|
||||
uniform vec4 uColor;
|
||||
uniform vec4 uDarkColor;
|
||||
|
||||
uniform sampler2D uSampler;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec4 texColor = texture2D(uSampler, vTextureCoord);
|
||||
gl_FragColor.a = texColor.a * uColor.a;
|
||||
gl_FragColor.rgb = ((texColor.a - 1.0) * uDarkColor.a + 1.0 - texColor.rgb) * uDarkColor.rgb + texColor.rgb * uColor.rgb;
|
||||
}
|
||||
`;
|
||||
export class DarkTintMaterial extends Shader {
|
||||
uvMatrix;
|
||||
batchable;
|
||||
pluginName;
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
_tintRGB;
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
_darkTintRGB;
|
||||
/**
|
||||
* Only do update if tint or alpha changes.
|
||||
* @private
|
||||
* @default false
|
||||
*/
|
||||
_colorDirty;
|
||||
_alpha;
|
||||
_tintColor;
|
||||
_darkTintColor;
|
||||
constructor(texture) {
|
||||
const uniforms = {
|
||||
uSampler: texture ?? Texture.EMPTY,
|
||||
alpha: 1,
|
||||
uTextureMatrix: Matrix.IDENTITY,
|
||||
uColor: new Float32Array([1, 1, 1, 1]),
|
||||
uDarkColor: new Float32Array([0, 0, 0, 0]),
|
||||
};
|
||||
// Set defaults
|
||||
const options = {
|
||||
tint: 0xffffff,
|
||||
darkTint: 0x0,
|
||||
alpha: 1,
|
||||
pluginName: "darkTintBatch",
|
||||
};
|
||||
super(Program.from(vertex, fragment), uniforms);
|
||||
this._colorDirty = false;
|
||||
this.uvMatrix = new TextureMatrix(uniforms.uSampler);
|
||||
this.batchable = true;
|
||||
this.pluginName = options.pluginName;
|
||||
this._tintColor = new Color(options.tint);
|
||||
this._darkTintColor = new Color(options.darkTint);
|
||||
this._tintRGB = this._tintColor.toLittleEndianNumber();
|
||||
this._darkTintRGB = this._darkTintColor.toLittleEndianNumber();
|
||||
this._alpha = options.alpha;
|
||||
this._colorDirty = true;
|
||||
}
|
||||
get texture() {
|
||||
return this.uniforms.uSampler;
|
||||
}
|
||||
set texture(value) {
|
||||
if (this.uniforms.uSampler !== value) {
|
||||
if (!this.uniforms.uSampler.baseTexture.alphaMode !== !value.baseTexture.alphaMode) {
|
||||
this._colorDirty = true;
|
||||
}
|
||||
this.uniforms.uSampler = value;
|
||||
this.uvMatrix.texture = value;
|
||||
}
|
||||
}
|
||||
set alpha(value) {
|
||||
if (value === this._alpha) {
|
||||
return;
|
||||
}
|
||||
this._alpha = value;
|
||||
this._colorDirty = true;
|
||||
}
|
||||
get alpha() {
|
||||
return this._alpha;
|
||||
}
|
||||
set tint(value) {
|
||||
if (value === this.tint) {
|
||||
return;
|
||||
}
|
||||
this._tintColor.setValue(value);
|
||||
this._tintRGB = this._tintColor.toLittleEndianNumber();
|
||||
this._colorDirty = true;
|
||||
}
|
||||
get tint() {
|
||||
return this._tintColor.value;
|
||||
}
|
||||
set darkTint(value) {
|
||||
if (value === this.darkTint) {
|
||||
return;
|
||||
}
|
||||
this._darkTintColor.setValue(value);
|
||||
this._darkTintRGB = this._darkTintColor.toLittleEndianNumber();
|
||||
this._colorDirty = true;
|
||||
}
|
||||
get darkTint() {
|
||||
return this._darkTintColor.value;
|
||||
}
|
||||
get tintValue() {
|
||||
return this._tintColor.toNumber();
|
||||
}
|
||||
get darkTintValue() {
|
||||
return this._darkTintColor.toNumber();
|
||||
}
|
||||
/** Gets called automatically by the Mesh. Intended to be overridden for custom {@link PIXI.MeshMaterial} objects. */
|
||||
update() {
|
||||
if (this._colorDirty) {
|
||||
this._colorDirty = false;
|
||||
Color.shared.setValue(this._tintColor).premultiply(this._alpha, true).toArray(this.uniforms.uColor);
|
||||
Color.shared.setValue(this._darkTintColor).premultiply(this._alpha, true).premultiply(1, false).toArray(this.uniforms.uDarkColor);
|
||||
}
|
||||
if (this.uvMatrix.update()) {
|
||||
this.uniforms.uTextureMatrix = this.uvMatrix.mapCoord;
|
||||
}
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1RpbnRNYXRlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXJrVGludE1lc2gvRGFya1RpbnRNYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFHL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXBGLE1BQU0sTUFBTSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7O0NBZ0JkLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRzs7Ozs7Ozs7Ozs7OztDQWFoQixDQUFDO0FBVUYsTUFBTSxPQUFPLGdCQUFpQixTQUFRLE1BQU07SUFDM0IsUUFBUSxDQUFnQjtJQUVqQyxTQUFTLENBQVU7SUFFbkIsVUFBVSxDQUFTO0lBRTFCLGdFQUFnRTtJQUN6RCxRQUFRLENBQVM7SUFDeEIsZ0VBQWdFO0lBQ3pELFlBQVksQ0FBUztJQUU1Qjs7OztPQUlHO0lBQ0ssV0FBVyxDQUFVO0lBQ3JCLE1BQU0sQ0FBUztJQUVmLFVBQVUsQ0FBUTtJQUNsQixjQUFjLENBQVE7SUFFOUIsWUFBYSxPQUFpQjtRQUM3QixNQUFNLFFBQVEsR0FBRztZQUNoQixRQUFRLEVBQUUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLO1lBQ2xDLEtBQUssRUFBRSxDQUFDO1lBQ1IsY0FBYyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQy9CLE1BQU0sRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLFVBQVUsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzFDLENBQUM7UUFFRixlQUFlO1FBQ2YsTUFBTSxPQUFP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
Line truncated
|
||||
@@ -0,0 +1,50 @@
|
||||
/******************************************************************************
|
||||
* 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 type { BLEND_MODES, ColorSource, Renderer, Texture } from "@pixi/core";
|
||||
import { Mesh } from "@pixi/mesh";
|
||||
import { DarkTintMaterial } from "./DarkTintMaterial.js";
|
||||
export interface IDarkTintElement {
|
||||
_texture: Texture;
|
||||
vertexData: Float32Array;
|
||||
indices: Uint16Array | Uint32Array | Array<number>;
|
||||
uvs: Float32Array;
|
||||
worldAlpha: number;
|
||||
_tintRGB: number;
|
||||
_darkTintRGB: number;
|
||||
alpha: number;
|
||||
blendMode: BLEND_MODES;
|
||||
}
|
||||
export declare class DarkTintMesh extends Mesh<DarkTintMaterial> {
|
||||
_darkTintRGB: number;
|
||||
constructor(texture?: Texture);
|
||||
get darkTint(): ColorSource | null;
|
||||
set darkTint(value: ColorSource | null);
|
||||
get darkTintValue(): number;
|
||||
protected _renderToBatch(renderer: Renderer): void;
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/******************************************************************************
|
||||
* 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 { Mesh } from "@pixi/mesh";
|
||||
import { DarkTintGeometry } from "./DarkTintGeom.js";
|
||||
import { DarkTintMaterial } from "./DarkTintMaterial.js";
|
||||
export class DarkTintMesh extends Mesh {
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
_darkTintRGB = 0;
|
||||
constructor(texture) {
|
||||
super(new DarkTintGeometry(), new DarkTintMaterial(texture), undefined, undefined);
|
||||
}
|
||||
get darkTint() {
|
||||
return "darkTint" in this.shader ? this.shader.darkTint : null;
|
||||
}
|
||||
set darkTint(value) {
|
||||
this.shader.darkTint = value;
|
||||
}
|
||||
get darkTintValue() {
|
||||
return this.shader.darkTintValue;
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
_renderToBatch(renderer) {
|
||||
const geometry = this.geometry;
|
||||
const shader = this.shader;
|
||||
if (shader.uvMatrix) {
|
||||
shader.uvMatrix.update();
|
||||
this.calculateUvs();
|
||||
}
|
||||
// set properties for batching..
|
||||
this.calculateVertices();
|
||||
this.indices = geometry.indexBuffer.data;
|
||||
this._tintRGB = shader._tintRGB;
|
||||
this._darkTintRGB = shader._darkTintRGB;
|
||||
this._texture = shader.texture;
|
||||
const pluginName = this.material.pluginName;
|
||||
renderer.batch.setObjectRenderer(renderer.plugins[pluginName]);
|
||||
renderer.plugins[pluginName].render(this);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1RpbnRNZXNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhcmtUaW50TWVzaC9EYXJrVGludE1lc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRy9FLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFpQnpELE1BQU0sT0FBTyxZQUFhLFNBQVEsSUFBc0I7SUFDdkQsZ0VBQWdFO0lBQ3pELFlBQVksR0FBVyxDQUFDLENBQUM7SUFFaEMsWUFBYSxPQUFpQjtRQUM3QixLQUFLLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDbEIsT0FBTyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLE1BQXNDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakcsQ0FBQztJQUVELElBQVcsUUFBUSxDQUFFLEtBQXlCO1FBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLEtBQW9CLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxnRUFBZ0U7SUFDN0MsY0FBYyxDQUFFLFFBQWtCO1FBQ3BELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUUzQixJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUE4QixDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBRS9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBRTVDLFFBQVEsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQy9ELFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBCTEVORF9NT0RFUywgQ29sb3JTb3VyY2UsIFJlbmRlcmVyLCBUZXh0dXJlIH0gZnJvbSBcIkBwaXhpL2NvcmVcIjtcbmltcG9ydCB7IE1lc2ggfSBmcm9tIFwiQHBpeGkvbWVzaFwiO1xuaW1wb3J0IHsgRGFya1RpbnRHZW9tZXRyeSB9IGZyb20gXCIuL0RhcmtUaW50R2VvbS5qc1wiO1xuaW1wb3J0IHsgRGFya1RpbnRNYXRlcmlhbCB9IGZyb20gXCIuL0RhcmtUaW50TWF0ZXJpYWwuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJRGFya1RpbnRFbGVtZW50IHtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXHRfdGV4dHVyZTogVGV4dHVyZTtcblx0dmVydGV4RGF0YTogRmxvYXQzMkFycmF5O1xuXHRpbmRpY2VzOiBVaW50MTZBcnJheSB8IFVpbnQzMkFycmF5IHwgQXJyYXk8bnVtYmVyPjtcblx0dXZzOiBGbG9hdDMyQXJyYXk7XG5cdHdvcmxkQWxwaGE6IG51bWJlcjtcb
Line truncated
|
||||
@@ -0,0 +1,36 @@
|
||||
/******************************************************************************
|
||||
* 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 type { ExtensionMetadata, Renderer, ViewableBuffer } from "@pixi/core";
|
||||
import { BatchRenderer } from "@pixi/core";
|
||||
import type { IDarkTintElement } from "./DarkTintMesh.js";
|
||||
export declare class DarkTintRenderer extends BatchRenderer {
|
||||
static extension: ExtensionMetadata;
|
||||
constructor(renderer: Renderer);
|
||||
packInterleavedGeometry(element: IDarkTintElement, attributeBuffer: ViewableBuffer, indexBuffer: Uint16Array, aIndex: number, iIndex: number): void;
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
/******************************************************************************
|
||||
* 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 { BatchRenderer, BatchShaderGenerator, Color, ExtensionType, extensions } from "@pixi/core";
|
||||
import { DarkTintBatchGeometry } from "./DarkTintBatchGeom.js";
|
||||
const vertex = `
|
||||
precision highp float;
|
||||
attribute vec2 aVertexPosition;
|
||||
attribute vec2 aTextureCoord;
|
||||
attribute vec4 aColor;
|
||||
attribute vec4 aDarkColor;
|
||||
attribute float aTextureId;
|
||||
|
||||
uniform mat3 projectionMatrix;
|
||||
uniform mat3 translationMatrix;
|
||||
uniform vec4 tint;
|
||||
|
||||
varying vec2 vTextureCoord;
|
||||
varying vec4 vColor;
|
||||
varying vec4 vDarkColor;
|
||||
varying float vTextureId;
|
||||
|
||||
void main(void){
|
||||
gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);
|
||||
|
||||
vTextureCoord = aTextureCoord;
|
||||
vTextureId = aTextureId;
|
||||
vColor = aColor * tint;
|
||||
vDarkColor = aDarkColor * tint;
|
||||
|
||||
}
|
||||
`;
|
||||
const fragment = `
|
||||
varying vec2 vTextureCoord;
|
||||
varying vec4 vColor;
|
||||
varying vec4 vDarkColor;
|
||||
varying float vTextureId;
|
||||
uniform sampler2D uSamplers[%count%];
|
||||
|
||||
void main(void){
|
||||
vec4 color;
|
||||
%forloop%
|
||||
|
||||
|
||||
gl_FragColor.a = color.a * vColor.a;
|
||||
gl_FragColor.rgb = ((color.a - 1.0) * vDarkColor.a + 1.0 - color.rgb) * vDarkColor.rgb + color.rgb * vColor.rgb;
|
||||
}
|
||||
`;
|
||||
export class DarkTintRenderer extends BatchRenderer {
|
||||
static extension = {
|
||||
name: "darkTintBatch",
|
||||
type: ExtensionType.RendererPlugin,
|
||||
};
|
||||
constructor(renderer) {
|
||||
super(renderer);
|
||||
this.shaderGenerator = new BatchShaderGenerator(vertex, fragment);
|
||||
this.geometryClass = DarkTintBatchGeometry;
|
||||
// Pixi's default 6 + 1 for uDarkTint. (this is size in _floats_. color is 4 bytes which roughly equals one float :P )
|
||||
this.vertexSize = 7;
|
||||
}
|
||||
packInterleavedGeometry(element, attributeBuffer, indexBuffer, aIndex, iIndex) {
|
||||
const { uint32View, float32View } = attributeBuffer;
|
||||
const packedVertices = aIndex / this.vertexSize;
|
||||
const uvs = element.uvs;
|
||||
const indicies = element.indices;
|
||||
const vertexData = element.vertexData;
|
||||
const textureId = element._texture.baseTexture._batchLocation;
|
||||
const worldAlpha = Math.min(element.worldAlpha, 1.0);
|
||||
const argb = Color.shared.setValue(element._tintRGB).toPremultiplied(worldAlpha, true);
|
||||
const darkargb = Color.shared.setValue(element._darkTintRGB).premultiply(worldAlpha, true).toPremultiplied(1, false);
|
||||
// lets not worry about tint! for now..
|
||||
for (let i = 0; i < vertexData.length; i += 2) {
|
||||
float32View[aIndex++] = vertexData[i];
|
||||
float32View[aIndex++] = vertexData[i + 1];
|
||||
float32View[aIndex++] = uvs[i];
|
||||
float32View[aIndex++] = uvs[i + 1];
|
||||
uint32View[aIndex++] = argb;
|
||||
uint32View[aIndex++] = darkargb;
|
||||
float32View[aIndex++] = textureId;
|
||||
}
|
||||
for (let i = 0; i < indicies.length; i++) {
|
||||
indexBuffer[iIndex++] = packedVertices + indicies[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
extensions.add(DarkTintRenderer);
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFya1RpbnRSZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXJrVGludE1lc2gvRGFya1RpbnRSZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFHL0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUcvRCxNQUFNLE1BQU0sR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EwQmQsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Q0FlaEIsQ0FBQztBQUVGLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxhQUFhO0lBQzNDLE1BQU0sQ0FBVSxTQUFTLEdBQXNCO1FBQ3JELElBQUksRUFBRSxlQUFlO1FBQ3JCLElBQUksRUFBRSxhQUFhLENBQUMsY0FBYztLQUNsQyxDQUFDO0lBRUYsWUFBYSxRQUFrQjtRQUM5QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsYUFBYSxHQUFHLHFCQUFxQixDQUFDO1FBQzNDLHNIQUFzSDtRQUN0SCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRWUsdUJBQXVCLENBQUUsT0FBeUIsRUFBRSxlQUErQixFQUFFLFdBQXdCLEVBQUUsTUFBYyxFQUFFLE1BQWM7UUFDNUosTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsR0FBRyxlQUFlLENBQUM7UUFDcEQsTUFBTSxjQUFjLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUN4QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDdEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDO1FBQzlELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2RixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXJILHVDQUF1QztRQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0MsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzVCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUNoQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDbkMsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsY0FBYyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0YsQ0FBQzs7QUFHRixVQUFVLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SI
Line truncated
|
||||
@@ -0,0 +1,72 @@
|
||||
"use strict";if(typeof window<"u"&&window.PIXI){const e=window.require;window.require=t=>{if(e)return e(t);if(t.startsWith("@pixi/"))return window.PIXI}}var vi=class{array=[];add(e){const t=this.contains(e);return this.array[e|0]=e|0,!t}contains(e){return this.array[e|0]!==void 0}remove(e){this.array[e|0]=void 0}clear(){this.array.length=0}},on=class{entries={};size=0;add(e){const t=this.entries[e];return this.entries[e]=!0,t?!1:(this.size++,!0)}addAll(e){const t=this.size;for(let s=0,n=e.length;s<n;s++)this.add(e[s]);return t!==this.size}contains(e){return this.entries[e]}clear(){this.entries={},this.size=0}},z=class Yt{constructor(t=0,s=0,n=0,i=0){this.r=t,this.g=s,this.b=n,this.a=i}static WHITE=new Yt(1,1,1,1);static RED=new Yt(1,0,0,1);static GREEN=new Yt(0,1,0,1);static BLUE=new Yt(0,0,1,1);static MAGENTA=new Yt(1,0,1,1);set(t,s,n,i){return this.r=t,this.g=s,this.b=n,this.a=i,this.clamp()}setFromColor(t){return this.r=t.r,this.g=t.g,this.b=t.b,this.a=t.a,this}setFromString(t){return t=t.charAt(0)==="#"?t.substr(1):t,this.r=parseInt(t.substr(0,2),16)/255,this.g=parseInt(t.substr(2,2),16)/255,this.b=parseInt(t.substr(4,2),16)/255,this.a=t.length!==8?1:parseInt(t.substr(6,2),16)/255,this}add(t,s,n,i){return this.r+=t,this.g+=s,this.b+=n,this.a+=i,this.clamp()}clamp(){return this.r<0?this.r=0:this.r>1&&(this.r=1),this.g<0?this.g=0:this.g>1&&(this.g=1),this.b<0?this.b=0:this.b>1&&(this.b=1),this.a<0?this.a=0:this.a>1&&(this.a=1),this}static rgba8888ToColor(t,s){t.r=((s&4278190080)>>>24)/255,t.g=((s&16711680)>>>16)/255,t.b=((s&65280)>>>8)/255,t.a=(s&255)/255}static rgb888ToColor(t,s){t.r=((s&16711680)>>>16)/255,t.g=((s&65280)>>>8)/255,t.b=(s&255)/255}toRgb888(){const t=s=>`0${(s*255).toString(16)}`.slice(-2);return+`0x${t(this.r)}${t(this.g)}${t(this.b)}`}static fromString(t,s=new Yt){return s.setFromString(t)}},L=class ht{static epsilon=1e-5;static epsilon2=ht.epsilon*ht.epsilon;static PI=3.1415927;static PI2=ht.PI*2;static invPI2=1/ht.PI2;static radiansToDegrees=180/ht.PI;static radDeg=ht.radiansToDegrees;static degreesToRadians=ht.PI/180;static degRad=ht.degreesToRadians;static clamp(t,s,n){return t<s?s:t>n?n:t}static cosDeg(t){return Math.cos(t*ht.degRad)}static sinDeg(t){return Math.sin(t*ht.degRad)}static atan2Deg(t,s){return Math.atan2(t,s)*ht.radDeg}static signum(t){return t>0?1:t<0?-1:0}static toInt(t){return t>0?Math.floor(t):Math.ceil(t)}static cbrt(t){const s=Math.pow(Math.abs(t),.3333333333333333);return t<0?-s:s}static randomTriangular(t,s){return ht.randomTriangularWith(t,s,(t+s)*.5)}static randomTriangularWith(t,s,n){const i=Math.random(),r=s-t;return i<=(n-t)/r?t+Math.sqrt(i*r*(n-t)):s-Math.sqrt((1-i)*r*(s-n))}static isPowerOfTwo(t){return t&&(t&t-1)===0}},qt=class _t{static linear=new class extends _t{applyInternal(t){return t}};static smooth=new class extends _t{applyInternal(t){return t*t*(3-2*t)}};static slowFast=new class extends _t{applyInternal(t){return t*t}};static fastSlow=new class extends _t{applyInternal(t){return(t-1)*(t-1)*-1+1}};static circle=new class extends _t{applyInternal(t){return t<=.5?(t*=2,(1-Math.sqrt(1-t*t))/2):(t--,t*=2,(Math.sqrt(1-t*t)+1)/2)}};apply(t,s,n){return s===void 0||n===void 0?this.applyInternal(t):t+(s-t)*this.applyInternal(n)}},an=class extends qt{power=2;constructor(e){super(),this.power=e}applyInternal(e){return e<=.5?Math.pow(e*2,this.power)/2:Math.pow((e-1)*2,this.power)/(this.power%2===0?-2:2)+1}},Ti=class extends an{constructor(e){super(e)}applyInternal(e){return Math.pow(e-1,this.power)*(this.power%2===0?-1:1)+1}},V=class Ut{static SUPPORTS_TYPED_ARRAYS=typeof Float32Array<"u";static arrayCopy(t,s,n,i,r){for(let a=s,c=i;a<s+r;a++,c++)n[c]=t[a]}static arrayFill(t,s,n,i){for(let r=s;r<n;r++)t[r]=i}static setArraySize(t,s,n=0){const i=t.length;if(i===s)return t;if(t.length=s,i<s)for(let r=i;r<s;r++)t[r]=n;return t}static ensureArrayCapacity(t,s,n=0){return t.length>=s?t:Ut.setArraySize(t,s,n)}static newArray(t,s){const n=[];for(let i=0;i<t;i++)n[i]=s;return n}static newFloatArray(t){if(Ut.SUPPORTS_TYPED_ARRAYS)return new Float32Array(t);{const s=[];for(let n=0;n<s.length;n++)s[n]=0;return s}}static newShortArray(t){if(Ut.SUPPORTS_TYPED_ARRAYS)return new Int16Array(t);{const s=[];for(let n=0;n<s.length;n++)s[n]=0;return s}}static toFloatArray(t){return Ut.SUPPORTS_TYPED_ARRAYS?new Float32Array(t):t}static toSinglePrecision(t){return Ut.SUPPORTS_TYPED_ARRAYS?Math.fround(t):t}static webkit602BugfixHelper(t){}static contains(t,s,n=!0){for(let i=0;i<t.length;i++)if(t[i]===s)return!0;return!1}static enumValue(t,s){return t[s[0].toUpperCase()+s.slice(1)]}},Ci=class{static logBones(e){for(let t=0;t<e.bones.length;t++){const s=e.bones[t].appliedPose;console.log(`${s.bone.data.name}, ${s.a}, ${s.b}, ${s.c}, ${s.d}, ${s.worldX}, ${s.worldY}`)}}},zt=class{items=[];instantiator;constructor(e){this.instantiator=e}obtain(){return this.items.length>0?this.items.pop():this.instantiator()}free(e){e.reset?.(),this.items.push(e)}freeAll(e){for(let t=0;t<e.length;t++Line truncated
|
||||
${s}`:""}`)}remove(e){e=this.pathPrefix+e;const t=this.cache.assets[e];return t.dispose&&t.dispose(),delete this.cache.assets[e],delete this.cache.assetsRefCount[e],delete this.cache.assetsLoaded[e],t}removeAll(){for(const e in this.cache.assets){const t=this.cache.assets[e];t.dispose&&t.dispose()}this.cache.assets={},this.cache.assetsLoaded={},this.cache.assetsRefCount={}}isLoadingComplete(){return this.toLoad===0}getToLoad(){return this.toLoad}getLoaded(){return this.loaded}dispose(){this.removeAll()}disposeAsset(e){const t=this.cache.assets[e];if(t instanceof he){t.dispose();return}this.disposeAssetInternal(e)}hasErrors(){return Object.keys(this.errors).length>0}getErrors(){return this.errors}disposeAssetInternal(e){if(this.cache.assetsRefCount[e]>0&&--this.cache.assetsRefCount[e]===0)return this.remove(e)}createTextureAtlas(e,t,s,n){const i=new he(e);i.dispose=()=>{if(!(this.cache.assetsRefCount[s]<=0)){this.disposeAssetInternal(s);for(const r of i.pages)r.texture?.dispose()}};for(const r of i.pages){const a=this.texturePath(t,r.name,n);this.texturePmaInfo[this.pathPrefix+a]=r.pma}return i}createTexture(e,t,s){const n=this.textureLoader(s,t),i=n.dispose.bind(n);return n.dispose=()=>{this.disposeAssetInternal(e)&&i()},n}texturePath(e,t,s){return s?s[t]:e+t}},vn=class De{assets={};assetsRefCount={};assetsLoaded={};static AVAILABLE_CACHES=new Map;static getCache(t){const s=De.AVAILABLE_CACHES.get(t);if(s)return s;const n=new De;return De.AVAILABLE_CACHES.set(t,n),n}async addAsset(t,s){return this.assetsLoaded[t]=Promise.resolve(s),this.assets[t]=s,s}getAsset(t){return this.assetsLoaded[t]}},Tn=class{callbacks={};rawDataUris={};dataUriToString(e){if(!e.startsWith("data:"))throw new Error("Not a data URI.");let t=e.indexOf("base64,");return t!==-1?(t+=7,atob(e.substr(t))):e.substr(e.indexOf(",")+1)}base64ToUint8Array(e){var t=window.atob(e),s=t.length,n=new Uint8Array(s);for(let i=0;i<s;i++)n[i]=t.charCodeAt(i);return n}dataUriToUint8Array(e){if(!e.startsWith("data:"))throw new Error("Not a data URI.");let t=e.indexOf("base64,");if(t===-1)throw new Error("Not a binary data URI.");return t+=7,this.base64ToUint8Array(e.substr(t))}downloadText(e,t,s){if(this.start(e,t,s))return;const n=this.rawDataUris[e];if(n&&!n.includes(".")){try{this.finish(e,200,this.dataUriToString(n))}catch(a){this.finish(e,400,JSON.stringify(a))}return}const i=new XMLHttpRequest;i.overrideMimeType("text/html"),i.open("GET",n||e,!0);const r=()=>{this.finish(e,i.status,i.responseText)};i.onload=r,i.onerror=r,i.send()}downloadJson(e,t,s){this.downloadText(e,n=>{t(JSON.parse(n))},s)}downloadBinary(e,t,s){if(this.start(e,t,s))return;const n=this.rawDataUris[e];if(n&&!n.includes(".")){try{this.finish(e,200,this.dataUriToUint8Array(n))}catch(a){this.finish(e,400,JSON.stringify(a))}return}const i=new XMLHttpRequest;i.open("GET",n||e,!0),i.responseType="arraybuffer";const r=()=>{this.finish(e,i.status,i.response)};i.onload=()=>{i.status===200||i.status===0?this.finish(e,200,new Uint8Array(i.response)):r()},i.onerror=r,i.send()}start(e,t,s){let n=this.callbacks[e];try{if(n)return!0;this.callbacks[e]=n=[]}finally{n.push(t,s)}}finish(e,t,s){const n=this.callbacks[e];if(delete this.callbacks[e],t===200||t===0)for(let i=0,r=n.length;i<r;i+=2)n[i](s);else for(let i=1,r=n.length;i<r;i+=2)n[i](t,s)}},Fs=class ui extends vt{color=new z(1,1,1,1);constructor(t){super(t)}copy(){const t=new ui(this.name);return this.copyTo(t),t.color.setFromColor(this.color),t}},Mt=class fi extends vt{endSlot=null;convex=!1;inverse=!1;color=new z(.2275,.2275,.8078,1);constructor(t){super(t)}copy(){const t=new fi(this.name);return this.copyTo(t),t.endSlot=this.endSlot,t.convex=this.convex,t.inverse=this.inverse,t.color.setFromColor(this.color),t}},jt=class mi extends vt{lengths=[];closed=!1;constantSpeed=!1;color=new z(1,1,1,1);constructor(t){super(t)}copy(){const t=new mi(this.name);return this.copyTo(t),t.lengths=[],V.arrayCopy(this.lengths,0,t.lengths,0,this.lengths.length),t.closed=this.closed,t.constantSpeed=this.constantSpeed,t.color.setFromColor(this.color),t}},Cn=class gi extends vt{x=0;y=0;rotation=0;color=new z(.38,.94,0,1);constructor(t){super(t)}computeWorldPosition(t,s){return s.x=this.x*t.a+this.y*t.b+t.worldX,s.y=this.x*t.c+this.y*t.d+t.worldY,s}computeWorldRotation(t){const s=this.rotation*L.degRad,n=Math.cos(s),i=Math.sin(s),r=n*t.a+i*t.b,a=n*t.c+i*t.d;return L.atan2Deg(a,r)}copy(){const t=new gi(this.name);return t.x=this.x,t.y=this.y,t.rotation=this.rotation,t.color.setFromColor(this.color),t}},Sn=class{atlas;allowMissingRegions;constructor(e,t=!1){this.atlas=e,this.allowMissingRegions=t}findRegions(e,t,s){const n=s.regions;for(let i=0,r=n.length;i<r;i++)n[i]=this.findRegion(e,s.getPath(t,i))}findRegion(e,t){const s=this.atlas.findRegion(t);if(!s&&!this.allowMissingRegions)throw new Error(`Region not found in atlas: ${t} (attachment: ${e})`);return s}newRegionAttachment(e,t,s,n,i){return this.findRegions(s,n,i),new Tt(s,i)}newMeshAttachment(e,t,s,n,i){retuLine truncated
|
||||
attribute vec2 aVertexPosition;
|
||||
attribute vec2 aTextureCoord;
|
||||
|
||||
uniform mat3 projectionMatrix;
|
||||
uniform mat3 translationMatrix;
|
||||
uniform mat3 uTextureMatrix;
|
||||
|
||||
varying vec2 vTextureCoord;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);
|
||||
|
||||
vTextureCoord = (uTextureMatrix * vec3(aTextureCoord, 1.0)).xy;
|
||||
}
|
||||
`,Nr=`
|
||||
varying vec2 vTextureCoord;
|
||||
uniform vec4 uColor;
|
||||
uniform vec4 uDarkColor;
|
||||
|
||||
uniform sampler2D uSampler;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec4 texColor = texture2D(uSampler, vTextureCoord);
|
||||
gl_FragColor.a = texColor.a * uColor.a;
|
||||
gl_FragColor.rgb = ((texColor.a - 1.0) * uDarkColor.a + 1.0 - texColor.rgb) * uDarkColor.rgb + texColor.rgb * uColor.rgb;
|
||||
}
|
||||
`,Zn=class extends Xr{uvMatrix;batchable;pluginName;_tintRGB;_darkTintRGB;_colorDirty;_alpha;_tintColor;_darkTintColor;constructor(e){const t={uSampler:e??Lr.EMPTY,alpha:1,uTextureMatrix:Er.IDENTITY,uColor:new Float32Array([1,1,1,1]),uDarkColor:new Float32Array([0,0,0,0])},s={tint:16777215,darkTint:0,alpha:1,pluginName:"darkTintBatch"};super(Br.from(Vr,Nr),t),this._colorDirty=!1,this.uvMatrix=new Rr(t.uSampler),this.batchable=!0,this.pluginName=s.pluginName,this._tintColor=new Ve(s.tint),this._darkTintColor=new Ve(s.darkTint),this._tintRGB=this._tintColor.toLittleEndianNumber(),this._darkTintRGB=this._darkTintColor.toLittleEndianNumber(),this._alpha=s.alpha,this._colorDirty=!0}get texture(){return this.uniforms.uSampler}set texture(e){this.uniforms.uSampler!==e&&(!this.uniforms.uSampler.baseTexture.alphaMode!=!e.baseTexture.alphaMode&&(this._colorDirty=!0),this.uniforms.uSampler=e,this.uvMatrix.texture=e)}set alpha(e){e!==this._alpha&&(this._alpha=e,this._colorDirty=!0)}get alpha(){return this._alpha}set tint(e){e!==this.tint&&(this._tintColor.setValue(e),this._tintRGB=this._tintColor.toLittleEndianNumber(),this._colorDirty=!0)}get tint(){return this._tintColor.value}set darkTint(e){e!==this.darkTint&&(this._darkTintColor.setValue(e),this._darkTintRGB=this._darkTintColor.toLittleEndianNumber(),this._colorDirty=!0)}get darkTint(){return this._darkTintColor.value}get tintValue(){return this._tintColor.toNumber()}get darkTintValue(){return this._darkTintColor.toNumber()}update(){this._colorDirty&&(this._colorDirty=!1,Ve.shared.setValue(this._tintColor).premultiply(this._alpha,!0).toArray(this.uniforms.uColor),Ve.shared.setValue(this._darkTintColor).premultiply(this._alpha,!0).premultiply(1,!1).toArray(this.uniforms.uDarkColor)),this.uvMatrix.update()&&(this.uniforms.uTextureMatrix=this.uvMatrix.mapCoord)}},jn=class extends Fr{_darkTintRGB=0;constructor(e){super(new Jn,new Zn(e),void 0,void 0)}get darkTint(){return"darkTint"in this.shader?this.shader.darkTint:null}set darkTint(e){this.shader.darkTint=e}get darkTintValue(){return this.shader.darkTintValue}_renderToBatch(e){const t=this.geometry,s=this.shader;s.uvMatrix&&(s.uvMatrix.update(),this.calculateUvs()),this.calculateVertices(),this.indices=t.indexBuffer.data,this._tintRGB=s._tintRGB,this._darkTintRGB=s._darkTintRGB,this._texture=s.texture;const n=this.material.pluginName;e.batch.setObjectRenderer(e.plugins[n]),e.plugins[n].render(this)}},Qn=class it extends jn{name="";static auxColor=[0,0,0,0];constructor(){super()}updateFromSpineData(t,s,n,i,r,a,c,l){this.texture=t.texture;const o=r/(l?12:8)*2,h=this.geometry.getBuffer("aTextureCoord");h.data?.length!==o&&(h.data=new Float32Array(o));const d=this.geometry.getBuffer("aVertexPosition");d.data?.length!==o&&(d.data=new Float32Array(o));let m=0;const f=h.data,u=d.data;for(let g=0;g<r;g+=l?12:8){let x=g;u[m]=i[x++],u[m+1]=i[x++],x+=4,f[m]=i[x++],f[m+1]=i[x++],m+=2}l?(it.auxColor[0]=i[8],it.auxColor[1]=i[9],it.auxColor[2]=i[10],it.auxColor[3]=i[11],this.darkTint=it.auxColor,it.auxColor[0]=i[2],it.auxColor[1]=i[3],it.auxColor[2]=i[4],it.auxColor[3]=i[5],this.tint=it.auxColor):(it.auxColor[0]=i[2],it.auxColor[1]=i[3],it.auxColor[2]=i[4],it.auxColor[3]=i[5],this.tint=it.auxColor),this.blendMode=ie.toPixiBlending(s),this.alpha=it.auxColor[3];const p=this.geometry.indexBuffer;if(p.data.length!==a.length)p.data=new Uint32Array(a);else{const g=p.data;for(let x=0;x<c;x++)g[x]=a[x]}this.name=n,h.update(),d.update(),p.update()}};import{Buffer as ti,Geometry as Dr,TYPES as re}from"@pixi/core";var ei=class extends Dr{_buffer;_indexBuffer;constructor(e=!1){super(),this._buffer=new ti(void 0,e,!1),this._indexBuffer=new ti(void 0,e,!0),this.addAttribute("aVertexPosition",this._buffer,2,!1,re.FLOAT).addAttribute("aTextureCoord",this._buffer,2,!1,re.FLOAT).addAttribute("aColor",this._buffer,4,!0,re.UNSIGNED_BYTE).addAttribute("aDarkColor",this._buffer,4,!0,re.UNSIGNED_BYTE).addAttribute("aTextureId",this._buffer,1,!0,re.FLOAT).addIndex(this._indexBuffer)}};import{BatchRenderer as Or,BatchShaderGenerator as _r,Color as si,ExtensionType as Ur,extensions as $r}from"@pixi/core";var qr=`
|
||||
precision highp float;
|
||||
attribute vec2 aVertexPosition;
|
||||
attribute vec2 aTextureCoord;
|
||||
attribute vec4 aColor;
|
||||
attribute vec4 aDarkColor;
|
||||
attribute float aTextureId;
|
||||
|
||||
uniform mat3 projectionMatrix;
|
||||
uniform mat3 translationMatrix;
|
||||
uniform vec4 tint;
|
||||
|
||||
varying vec2 vTextureCoord;
|
||||
varying vec4 vColor;
|
||||
varying vec4 vDarkColor;
|
||||
varying float vTextureId;
|
||||
|
||||
void main(void){
|
||||
gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);
|
||||
|
||||
vTextureCoord = aTextureCoord;
|
||||
vTextureId = aTextureId;
|
||||
vColor = aColor * tint;
|
||||
vDarkColor = aDarkColor * tint;
|
||||
|
||||
}
|
||||
`,zr=`
|
||||
varying vec2 vTextureCoord;
|
||||
varying vec4 vColor;
|
||||
varying vec4 vDarkColor;
|
||||
varying float vTextureId;
|
||||
uniform sampler2D uSamplers[%count%];
|
||||
|
||||
void main(void){
|
||||
vec4 color;
|
||||
%forloop%
|
||||
|
||||
|
||||
gl_FragColor.a = color.a * vColor.a;
|
||||
gl_FragColor.rgb = ((color.a - 1.0) * vDarkColor.a + 1.0 - color.rgb) * vDarkColor.rgb + color.rgb * vColor.rgb;
|
||||
}
|
||||
`,ni=class extends Or{static extension={name:"darkTintBatch",type:Ur.RendererPlugin};constructor(e){super(e),this.shaderGenerator=new _r(qr,zr),this.geometryClass=ei,this.vertexSize=7}packInterleavedGeometry(e,t,s,n,i){const{uint32View:r,float32View:a}=t,c=n/this.vertexSize,l=e.uvs,o=e.indices,h=e.vertexData,d=e._texture.baseTexture._batchLocation,m=Math.min(e.worldAlpha,1),f=si.shared.setValue(e._tintRGB).toPremultiplied(m,!0),u=si.shared.setValue(e._darkTintRGB).premultiply(m,!0).toPremultiplied(1,!1);for(let p=0;p<h.length;p+=2)a[n++]=h[p],a[n++]=h[p+1],a[n++]=l[p],a[n++]=l[p+1],r[n++]=f,r[n++]=u,a[n++]=d;for(let p=0;p<o.length;p++)s[i++]=c+o[p]}};$r.add(ni);import{Texture as Wr}from"@pixi/core";import{Mesh as Gr,MeshGeometry as Hr,MeshMaterial as Kr}from"@pixi/mesh";var ii=class Lt extends Gr{name="";static auxColor=[0,0,0,0];warnedTwoTint=!1;constructor(){const t=new Hr;t.getBuffer("aVertexPosition").static=!1,t.getBuffer("aTextureCoord").static=!1;const s=new Kr(Wr.EMPTY);super(t,s)}updateFromSpineData(t,s,n,i,r,a,c,l){this.texture=t.texture;const o=r/(l?12:8)*2,h=this.geometry.getBuffer("aTextureCoord");h.data?.length!==o&&(h.data=new Float32Array(o));const d=this.geometry.getBuffer("aVertexPosition");d.data?.length!==o&&(d.data=new Float32Array(o));let m=0;const f=h.data,u=d.data;for(let g=0;g<r;g+=l?12:8){let x=g;u[m]=i[x++],u[m+1]=i[x++],x+=4,f[m]=i[x++],f[m+1]=i[x++],m+=2}l&&!this.warnedTwoTint&&(console.warn("DarkTint is not enabled by default. To enable use a DarkSlotMesh factory while creating the Spine object."),this.warnedTwoTint=!0),Lt.auxColor[0]=i[2],Lt.auxColor[1]=i[3],Lt.auxColor[2]=i[4],Lt.auxColor[3]=i[5],this.tint=Lt.auxColor,this.alpha=Lt.auxColor[3],this.blendMode=ie.toPixiBlending(s);const p=this.geometry.indexBuffer;if(p.data.length!==a.length)p.data=new Uint32Array(a);else{const g=p.data;for(let x=0;x<c;x++)g[x]=a[x]}this.name=n,h.update(),d.update(),p.update()}};import{Assets as ri}from"@pixi/assets";import{Point as Jr,Ticker as oi}from"@pixi/core";import{Bounds as Zr,Container as jr}from"@pixi/display";import{Graphics as Qr}from"@pixi/graphics";import"@pixi/events";var to=class{constructor(e,t,s,n){this.x=e,this.y=t,this.width=s,this.height=n}calculateBounds(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},eo=class{constructor(e=!1){this.clipping=e}calculateBounds(e){if(!e.skeleton)return{x:0,y:0,width:0,height:0};const t=new Ot(e.skeleton.data);t.setupPose(),t.updateWorldTransform(2);const s=t.getBoundsRect(this.clipping?new ne:void 0);return s.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:s}},so=class{constructor(e,t=[],s=.05,n=!1){this.animation=e,this.skins=t,this.timeStep=s,this.clipping=n}calculateBounds(e){if(!e.skeleton||!e.state)return{x:0,y:0,width:0,height:0};const t=new Ss(e.state.data),s=new Ot(e.skeleton.data),n=this.clipping?new ne:void 0,i=s.data;if(this.skins.length>0){const a=new se("custom-skin");for(const c of this.skins){const l=i.findSkin(c);l!=null&&a.addSkin(l)}s.setSkin(a)}s.setupPose();const r=this.animation!=null?i.findAnimation(this.animation):null;if(r==null){s.updateWorldTransform(2);const a=s.getBoundsRect(n);return a.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:a}else{let a=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;t.clearTracks(),t.setAnimation(0,r,!1);const h=Math.max(r.duration/this.timeStep,1);for(let m=0;m<h;m++){const f=m>0?this.timeStep:0;t.update(f),t.apply(s),s.update(f),s.updateWorldTransform(2);const u=s.getBoundsRect(n);a=Math.min(a,u.x),c=Math.min(c,u.y),l=Math.max(l,u.x+u.width),o=Math.max(o,u.y+u.height)}const d={x:a,y:c,width:l-a,height:o-c};return d.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:d}}},no=class j extends jr{skeleton;state;skeletonPhysics;darkTint=!1;hasNeverUpdated=!0;_debug=void 0;get debug(){return this._debug}set debug(t){this._debug&&this._debug.unregisterSpine(this),t&&t.registerSpine(this),this._debug=t}slotMeshFactory=()=>new ii;beforeUpdateWorldTransforms=()=>{};afterUpdateWorldTransforms=()=>{};_autoUpdate=!1;_ticker=oi.shared;get autoUpdate(){return this._autoUpdate}set autoUpdate(t){t&&!this._autoUpdate?this._ticker.add(this.internalUpdate,this):!t&&this._autoUpdate&&this._ticker.remove(this.internalUpdate,this),this._autoUpdate=t}get ticker(){return this._ticker}set ticker(t){t=t??oi.shared,this._ticker!==t&&(this._autoUpdate&&(this._ticker.remove(this.internalUpdate,this),t.add(this.internalUpdate,this)),this._ticker=t)}meshesCache=new Map;static vectorAux=new le;static clipper=new ne;static QUAD_TRIANGLES=[0,1,2,2,3,0];static VERTEX_SIZE=8;static DARK_VERTEX_SIZE=12;lightColor=new z;darkColor=new z;clippingVertAux=new Float32Array(6);_boundsProvider;get boundsProvider(){return this._boundsProvider}set boundsProvider(t){this._boundsProvider=t,t?(this._boundsSpineID=-1,this._boundsSpineDirty=!0,this.interactiveChildren=!1):(this.interactiveChildren=!0,this.hitArea=null),this.hasNe
Line truncated
|
||||
+15214
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 3,
|
||||
"sources": ["../../src/require-shim.ts", "../../../spine-core/src/Utils.ts", "../../../spine-core/src/Texture.ts", "../../../spine-core/src/TextureAtlas.ts", "../../../spine-core/src/attachments/Attachment.ts", "../../../spine-core/src/attachments/MeshAttachment.ts", "../../../spine-core/src/attachments/RegionAttachment.ts", "../../../spine-core/src/attachments/Sequence.ts", "../../../spine-core/src/Animation.ts", "../../../spine-core/src/AnimationState.ts", "../../../spine-core/src/AnimationStateData.ts", "../../../spine-core/src/AssetManagerBase.ts", "../../../spine-core/src/attachments/BoundingBoxAttachment.ts", "../../../spine-core/src/attachments/ClippingAttachment.ts", "../../../spine-core/src/attachments/PathAttachment.ts", "../../../spine-core/src/attachments/PointAttachment.ts", "../../../spine-core/src/AtlasAttachmentLoader.ts", "../../../spine-core/src/PosedData.ts", "../../../spine-core/src/BoneData.ts", "../../../spine-core/src/BonePose.ts", "../../../spine-core/src/Posed.ts", "../../../spine-core/src/PosedActive.ts", "../../../spine-core/src/Bone.ts", "../../../spine-core/src/Constraint.ts", "../../../spine-core/src/DrawOrder.ts", "../../../spine-core/src/ConstraintData.ts", "../../../spine-core/src/Event.ts", "../../../spine-core/src/EventData.ts", "../../../spine-core/src/IkConstraintPose.ts", "../../../spine-core/src/IkConstraint.ts", "../../../spine-core/src/IkConstraintData.ts", "../../../spine-core/src/PathConstraintPose.ts", "../../../spine-core/src/PathConstraintData.ts", "../../../spine-core/src/PathConstraint.ts", "../../../spine-core/src/Physics.ts", "../../../spine-core/src/PhysicsConstraintPose.ts", "../../../spine-core/src/SlotPose.ts", "../../../spine-core/src/Slot.ts", "../../../spine-core/src/Skeleton.ts", "../../../spine-core/src/PhysicsConstraint.ts", "../../../spine-core/src/PhysicsConstraintData.ts", "../../../spine-core/src/polyfills.ts", "../../../spine-core/src/SliderPose.ts", "../../../spine-core/src/Slider.ts", "../../../spine-core/src/SliderData.ts", "../../../spine-core/src/SkeletonData.ts", "../../../spine-core/src/Skin.ts", "../../../spine-core/src/SlotData.ts", "../../../spine-core/src/TransformConstraintPose.ts", "../../../spine-core/src/TransformConstraint.ts", "../../../spine-core/src/TransformConstraintData.ts", "../../../spine-core/src/SkeletonBinary.ts", "../../../spine-core/src/SkeletonBounds.ts", "../../../spine-core/src/Triangulator.ts", "../../../spine-core/src/SkeletonClipping.ts", "../../../spine-core/src/SkeletonJson.ts", "../../../spine-core/src/SkeletonPhysicsMovement.ts", "../../../spine-core/src/SkeletonRendererCore.ts", "../../src/assets/AtlasLoader.ts", "../../src/SpineTexture.ts", "../../src/assets/SkeletonLoader.ts", "../../src/darkTintMesh/DarkTintMesh.ts", "../../src/darkTintMesh/DarkTintGeom.ts", "../../src/darkTintMesh/DarkTintMaterial.ts", "../../src/DarkSlotMesh.ts", "../../src/darkTintMesh/DarkTintBatchGeom.ts", "../../src/darkTintMesh/DarkTintRenderer.ts", "../../src/SlotMesh.ts", "../../src/Spine.ts", "../../src/SpineDebugRenderer.ts"],
|
||||
"sourcesContent": ["/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated April 5, 2025. Replaces all prior versions.\n *\n * Copyright (c) 2013-2025, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n// biome-ignore-all lint: ignore biome for this file\n\nif (typeof window !== 'undefined' && (window as any).PIXI) {\n\tconst prevRequire = (window as any).require;\n\t(window as any).require = (x: string) => {\n\t\tif (prevRequire) return prevRequire(x);\n\t\telse if (x.startsWith(\"@pixi/\")) return (window as any).PIXI;\n\t}\n}\n\nexport { }\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated April 5, 2025. Replaces all prior versions.\n *\n * Copyright (c) 2013-2025, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n/** biome-ignore-all lint/complexity/noStaticOnlyClass: too much things to update */\n\nimport type { Skeleton } from \"./Skeleton.js\";\n\nexport interface StringMap<T> {\n\t[key: string]: T;\n}\n\nexport class IntSet {\n\tarray = [] as (number | undefined)[];\n\n\tadd (value: number): boolean {\n\t\tconst contains = this.contains(value);\n\t\tthis.array[value | 0] = value | 0;\n\t\treturn !contains;\n\t}\n\n\tcontains (value: number) {\n\t\treturn this.array[value | 0] !== undefined;\n\t}\n\n\tremove (value: number) {\n\t\tthis.array[value | 0] = undefined;\n\t}\n\n\tclear () {\n\t\tthis.array.length = 0;\n\t}\n}\n\nexport class StringSet {\n\tentries: StringMap<boolean> = {};\n\tsize = 0;\n\n\tadd (value: string): boolean {\n\t\tconst contains = this.entries[value];\n\t\tthis.entries[value] = true;\n\t\tif (!contains) {\n\t\t\tthis.size++;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\taddAll (values: string[]): boolean {\n\t\tconst oldSize = this.size;\n\t\tfor (let i = 0, n = values.length; i < n; i++)\n\t\t\tthis.add(values[i]);\n\t\treturn oldSize !== this.size;\n\t}\n\n\tcontains (value: string) {\n\t\treturn this.entrLine truncated
|
||||
"mappings": "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 truncated
|
||||
"names": ["TextureFilter", "TextureWrap", "page", "v", "SequenceMode", "MixFrom", "Property", "x", "y", "constraint", "ii", "EventType", "Inherit", "ScaleYMode", "PositionMode", "SpacingMode", "RotateMode", "pathLength", "multiplier", "Physics", "n", "bone", "BlendMode", "iv", "cross", "name", "animationName", "LinkedMesh", "color", "readTimeline1", "color2", "readTimeline2", "readDrawOrder", "n", "checkExtension", "LoaderParserPriority", "ExtensionType", "extensions", "settings", "loaderName", "Color", "Texture", "Buffer", "Geometry", "TYPES", "Color", "ExtensionType", "extensions", "vertex", "fragment", "ExtensionType", "Color", "extensions", "Texture", "Mesh", "Mesh", "Texture", "Assets", "bounds", "n", "Assets", "Container", "Graphics", "i", "len"]
|
||||
}
|
||||
+15245
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"version": 3,
|
||||
"sources": ["../../src/index.ts", "../../src/require-shim.ts", "../../../spine-core/src/Utils.ts", "../../../spine-core/src/Texture.ts", "../../../spine-core/src/TextureAtlas.ts", "../../../spine-core/src/attachments/Attachment.ts", "../../../spine-core/src/attachments/MeshAttachment.ts", "../../../spine-core/src/attachments/RegionAttachment.ts", "../../../spine-core/src/attachments/Sequence.ts", "../../../spine-core/src/Animation.ts", "../../../spine-core/src/AnimationState.ts", "../../../spine-core/src/AnimationStateData.ts", "../../../spine-core/src/AssetManagerBase.ts", "../../../spine-core/src/attachments/BoundingBoxAttachment.ts", "../../../spine-core/src/attachments/ClippingAttachment.ts", "../../../spine-core/src/attachments/PathAttachment.ts", "../../../spine-core/src/attachments/PointAttachment.ts", "../../../spine-core/src/AtlasAttachmentLoader.ts", "../../../spine-core/src/PosedData.ts", "../../../spine-core/src/BoneData.ts", "../../../spine-core/src/BonePose.ts", "../../../spine-core/src/Posed.ts", "../../../spine-core/src/PosedActive.ts", "../../../spine-core/src/Bone.ts", "../../../spine-core/src/Constraint.ts", "../../../spine-core/src/DrawOrder.ts", "../../../spine-core/src/ConstraintData.ts", "../../../spine-core/src/Event.ts", "../../../spine-core/src/EventData.ts", "../../../spine-core/src/IkConstraintPose.ts", "../../../spine-core/src/IkConstraint.ts", "../../../spine-core/src/IkConstraintData.ts", "../../../spine-core/src/PathConstraintPose.ts", "../../../spine-core/src/PathConstraintData.ts", "../../../spine-core/src/PathConstraint.ts", "../../../spine-core/src/Physics.ts", "../../../spine-core/src/PhysicsConstraintPose.ts", "../../../spine-core/src/SlotPose.ts", "../../../spine-core/src/Slot.ts", "../../../spine-core/src/Skeleton.ts", "../../../spine-core/src/PhysicsConstraint.ts", "../../../spine-core/src/PhysicsConstraintData.ts", "../../../spine-core/src/polyfills.ts", "../../../spine-core/src/SliderPose.ts", "../../../spine-core/src/Slider.ts", "../../../spine-core/src/SliderData.ts", "../../../spine-core/src/SkeletonData.ts", "../../../spine-core/src/Skin.ts", "../../../spine-core/src/SlotData.ts", "../../../spine-core/src/TransformConstraintPose.ts", "../../../spine-core/src/TransformConstraint.ts", "../../../spine-core/src/TransformConstraintData.ts", "../../../spine-core/src/SkeletonBinary.ts", "../../../spine-core/src/SkeletonBounds.ts", "../../../spine-core/src/Triangulator.ts", "../../../spine-core/src/SkeletonClipping.ts", "../../../spine-core/src/SkeletonJson.ts", "../../../spine-core/src/SkeletonPhysicsMovement.ts", "../../../spine-core/src/SkeletonRendererCore.ts", "../../src/assets/AtlasLoader.ts", "../../src/SpineTexture.ts", "../../src/assets/SkeletonLoader.ts", "../../src/darkTintMesh/DarkTintMesh.ts", "../../src/darkTintMesh/DarkTintGeom.ts", "../../src/darkTintMesh/DarkTintMaterial.ts", "../../src/DarkSlotMesh.ts", "../../src/darkTintMesh/DarkTintBatchGeom.ts", "../../src/darkTintMesh/DarkTintRenderer.ts", "../../src/SlotMesh.ts", "../../src/Spine.ts", "../../src/SpineDebugRenderer.ts"],
|
||||
"sourcesContent": ["/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated September 24, 2021. Replaces all prior versions.\n *\n * Copyright (c) 2013-2021, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\nimport './require-shim.js';\nimport './assets/AtlasLoader.js'; // Side effects install the loaders into pixi\nimport './assets/SkeletonLoader.js'; // Side effects install the loaders into pixi\n\nexport * from \"@esotericsoftware/spine-core\";\nexport * from './assets/AtlasLoader.js';\nexport * from './assets/SkeletonLoader.js';\nexport * from './DarkSlotMesh.js';\nexport * from './darkTintMesh/DarkTintBatchGeom.js';\nexport * from './darkTintMesh/DarkTintGeom.js';\nexport * from './darkTintMesh/DarkTintMaterial.js';\nexport * from './darkTintMesh/DarkTintMesh.js';\nexport * from './darkTintMesh/DarkTintRenderer.js';\nexport * from './SlotMesh.js';\nexport * from './Spine.js';\nexport * from './SpineDebugRenderer.js';\nexport * from './SpineTexture.js';\n\n\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated April 5, 2025. Replaces all prior versions.\n *\n * Copyright (c) 2013-2025, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under the terms and\n * conditions of Section 2 of the Spine Editor License Agreement:\n * http://esotericsoftware.com/spine-editor-license\n *\n * Otherwise, it is permitted to integrate the Spine Runtimes into software\n * or otherwise create derivative works of the Spine Runtimes (collectively,\n * \"Products\"), provided that each user of the Products must obtain their own\n * Spine Editor license and redistribution of the Products in any form must\n * include this license and copyright notice.\n *\n * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,\n * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n// biome-ignore-all lint: ignore biome for this file\n\nif (typeof window !== 'undefined' && (window as any).PIXI) {\n\tconst prevRequire = (window as any).require;\n\t(window as any).require = (x: string) => {\n\t\tif (prevRequire) return prevRequire(x);\n\t\telse if (x.startsWith(\"@pixi/\")) return (window as any).PIXI;\n\t}\n}\n\nexport { }\n", "/******************************************************************************\n * Spine Runtimes License Agreement\n * Last updated April 5, 2025. Replaces all prior versions.\n *\n * Copyright (c) 2013-2025, Esoteric Software LLC\n *\n * Integration of the Spine Runtimes into software or otherwise creating\n * derivative works of the Spine Runtimes is permitted under thLine truncated
|
||||
"mappings": "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 truncated
|
||||
"names": ["TextureFilter", "TextureWrap", "page", "v", "SequenceMode", "MixFrom", "Property", "x", "y", "constraint", "ii", "EventType", "Inherit", "ScaleYMode", "PositionMode", "SpacingMode", "RotateMode", "pathLength", "multiplier", "Physics", "n", "bone", "BlendMode", "iv", "cross", "name", "animationName", "LinkedMesh", "color", "readTimeline1", "color2", "readTimeline2", "readDrawOrder", "n", "import_core", "PixiTexture", "import_assets", "import_core", "loaderName", "import_core", "import_core", "import_core", "import_core", "vertex", "fragment", "import_core", "import_mesh", "import_assets", "import_core", "bounds", "n", "import_display", "import_graphics", "i", "len"]
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
"use strict";var spine=(()=>{var We=Object.defineProperty,pi=Object.getOwnPropertyDescriptor,xi=Object.getOwnPropertyNames,wi=Object.prototype.hasOwnProperty,et=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,s)=>(typeof require<"u"?require:t)[s]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')}),bi=(e,t)=>{for(var s in t)We(e,s,{get:t[s],enumerable:!0})},yi=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of xi(t))!wi.call(e,i)&&i!==s&&We(e,i,{get:()=>t[i],enumerable:!(n=pi(t,i))||n.enumerable});return e},vi=e=>yi(We({},"__esModule",{value:!0}),e),dn={};if(bi(dn,{AABBRectangleBoundsProvider:()=>Yr,ATTACH_RETAIN:()=>Ls,ATTACH_SETUP:()=>Xs,AlphaTimeline:()=>ds,Animation:()=>xe,AnimationState:()=>Ys,AnimationStateAdapter:()=>Pi,AnimationStateData:()=>In,AssetCache:()=>kn,AssetManagerBase:()=>Fi,AtlasAttachmentLoader:()=>Fn,Attachment:()=>Je,AttachmentTimeline:()=>Ut,BinaryInput:()=>Nn,BlendMode:()=>Hs,Bone:()=>Se,BoneData:()=>Ds,BonePose:()=>Te,BoneTimeline1:()=>Mt,BoneTimeline2:()=>we,BoundingBoxAttachment:()=>Vs,CURRENT:()=>Es,ClippingAttachment:()=>Bt,Color:()=>z,Constraint:()=>qt,ConstraintData:()=>zt,ConstraintTimeline1:()=>$t,CurveTimeline:()=>kt,CurveTimeline1:()=>te,DarkSlotMesh:()=>Jn,DarkTintBatchGeometry:()=>jn,DarkTintGeometry:()=>Wn,DarkTintMaterial:()=>Hn,DarkTintMesh:()=>Kn,DarkTintRenderer:()=>Zn,DebugUtils:()=>Ci,DeformTimeline:()=>ms,Downloader:()=>Mn,DrawOrder:()=>Yn,DrawOrderFolderTimeline:()=>ne,DrawOrderTimeline:()=>Et,Event:()=>Ae,EventData:()=>Os,EventQueue:()=>Sn,EventTimeline:()=>be,EventType:()=>Cn,FIRST:()=>Bs,FakeTexture:()=>ki,FromProperty:()=>Rt,FromRotate:()=>Be,FromScaleX:()=>Le,FromScaleY:()=>Ve,FromShearY:()=>De,FromX:()=>Re,FromY:()=>Xe,HOLD:()=>ie,IkConstraint:()=>En,IkConstraintData:()=>oe,IkConstraintPose:()=>Ie,IkConstraintTimeline:()=>ps,Inherit:()=>ve,InheritTimeline:()=>ls,IntSet:()=>Ti,Interpolation:()=>jt,MODE:()=>Rs,MathUtils:()=>X,MeshAttachment:()=>vt,MixFrom:()=>xn,PathAttachment:()=>re,PathConstraint:()=>Bn,PathConstraintData:()=>ae,PathConstraintMixTimeline:()=>ys,PathConstraintPose:()=>ke,PathConstraintPositionTimeline:()=>ws,PathConstraintSpacingTimeline:()=>bs,Physics:()=>Rn,PhysicsConstraint:()=>zs,PhysicsConstraintDampingTimeline:()=>Ss,PhysicsConstraintData:()=>le,PhysicsConstraintGravityTimeline:()=>Is,PhysicsConstraintInertiaTimeline:()=>vs,PhysicsConstraintMassTimeline:()=>Cs,PhysicsConstraintMixTimeline:()=>ks,PhysicsConstraintPose:()=>Me,PhysicsConstraintResetTimeline:()=>Ms,PhysicsConstraintStrengthTimeline:()=>Ts,PhysicsConstraintTimeline:()=>Tt,PhysicsConstraintWindTimeline:()=>As,PointAttachment:()=>Pn,Pool:()=>Zt,Posed:()=>Ns,PosedActive:()=>_s,PosedData:()=>ye,PositionMode:()=>Us,Pow:()=>fn,PowOut:()=>Si,Property:()=>wn,RGB2Timeline:()=>fs,RGBA2Timeline:()=>us,RGBATimeline:()=>cs,RGBTimeline:()=>hs,RegionAttachment:()=>It,RotateMode:()=>qs,RotateTimeline:()=>ee,SETUP:()=>An,ScaleTimeline:()=>ss,ScaleXTimeline:()=>ns,ScaleYMode:()=>Ce,ScaleYTimeline:()=>is,Sequence:()=>Qt,SequenceMode:()=>je,SequenceModeValues:()=>Ze,SequenceTimeline:()=>gs,SetupPoseBoundsProvider:()=>Er,ShearTimeline:()=>rs,ShearXTimeline:()=>os,ShearYTimeline:()=>as,Skeleton:()=>Gt,SkeletonBinary:()=>Dn,SkeletonBounds:()=>Un,SkeletonClipping:()=>he,SkeletonData:()=>Ye,SkeletonJson:()=>qn,SkeletonPhysicsMovement:()=>Gn,SkeletonRendererCore:()=>wr,Skin:()=>ce,SkinEntry:()=>Gs,SkinsAndAnimationBoundsProvider:()=>Br,Slider:()=>Ln,SliderData:()=>Pt,SliderMixTimeline:()=>Fs,SliderPose:()=>Fe,SliderTimeline:()=>Ps,Slot:()=>Xn,SlotCurveTimeline:()=>se,SlotData:()=>Ws,SlotMesh:()=>Qn,SlotPose:()=>Pe,SpacingMode:()=>$s,Spine:()=>Rr,SpineDebugRenderer:()=>Lr,SpineTexture:()=>de,StringSet:()=>un,Texture:()=>He,TextureAtlas:()=>pe,TextureAtlasPage:()=>pn,TextureAtlasRegion:()=>Ke,TextureFilter:()=>ge,TextureRegion:()=>gn,TextureWrap:()=>mn,TimeKeeper:()=>Ai,Timeline:()=>Q,ToProperty:()=>Xt,ToRotate:()=>Ks,ToScaleX:()=>Zs,ToScaleY:()=>Qs,ToShearY:()=>tn,ToX:()=>Js,ToY:()=>js,TrackEntry:()=>Tn,TransformConstraint:()=>Vn,TransformConstraintData:()=>K,TransformConstraintPose:()=>Ee,TransformConstraintTimeline:()=>xs,TranslateTimeline:()=>Qe,TranslateXTimeline:()=>ts,TranslateYTimeline:()=>es,Triangulator:()=>$n,Utils:()=>V,Vector2:()=>me,VertexAttachment:()=>At,WindowedMean:()=>Ii,isBoneTimeline:()=>yn,isConstraintTimeline:()=>vn,isSlotTimeline:()=>bn}),typeof window<"u"&&window.PIXI){const e=window.require;window.require=t=>{if(e)return e(t);if(t.startsWith("@pixi/"))return window.PIXI}}var Ti=class{array=[];add(e){const t=this.contains(e);return this.array[e|0]=e|0,!t}contains(e){return this.array[e|0]!==void 0}remove(e){this.array[e|0]=void 0}clear(){this.array.length=0}},un=class{entries={};size=0;add(e){const t=this.entries[e];return this.entries[e]=!0,t?!1:(this.size++,!0)}addAll(e){const t=this.size;for(let s=0,n=e.length;s<n;s++)this.add(e[s]);return t!==thisLine truncated
|
||||
${s}`:""}`)}remove(e){e=this.pathPrefix+e;const t=this.cache.assets[e];return t.dispose&&t.dispose(),delete this.cache.assets[e],delete this.cache.assetsRefCount[e],delete this.cache.assetsLoaded[e],t}removeAll(){for(const e in this.cache.assets){const t=this.cache.assets[e];t.dispose&&t.dispose()}this.cache.assets={},this.cache.assetsLoaded={},this.cache.assetsRefCount={}}isLoadingComplete(){return this.toLoad===0}getToLoad(){return this.toLoad}getLoaded(){return this.loaded}dispose(){this.removeAll()}disposeAsset(e){const t=this.cache.assets[e];if(t instanceof pe){t.dispose();return}this.disposeAssetInternal(e)}hasErrors(){return Object.keys(this.errors).length>0}getErrors(){return this.errors}disposeAssetInternal(e){if(this.cache.assetsRefCount[e]>0&&--this.cache.assetsRefCount[e]===0)return this.remove(e)}createTextureAtlas(e,t,s,n){const i=new pe(e);i.dispose=()=>{if(!(this.cache.assetsRefCount[s]<=0)){this.disposeAssetInternal(s);for(const r of i.pages)r.texture?.dispose()}};for(const r of i.pages){const a=this.texturePath(t,r.name,n);this.texturePmaInfo[this.pathPrefix+a]=r.pma}return i}createTexture(e,t,s){const n=this.textureLoader(s,t),i=n.dispose.bind(n);return n.dispose=()=>{this.disposeAssetInternal(e)&&i()},n}texturePath(e,t,s){return s?s[t]:e+t}},kn=class ze{assets={};assetsRefCount={};assetsLoaded={};static AVAILABLE_CACHES=new Map;static getCache(t){const s=ze.AVAILABLE_CACHES.get(t);if(s)return s;const n=new ze;return ze.AVAILABLE_CACHES.set(t,n),n}async addAsset(t,s){return this.assetsLoaded[t]=Promise.resolve(s),this.assets[t]=s,s}getAsset(t){return this.assetsLoaded[t]}},Mn=class{callbacks={};rawDataUris={};dataUriToString(e){if(!e.startsWith("data:"))throw new Error("Not a data URI.");let t=e.indexOf("base64,");return t!==-1?(t+=7,atob(e.substr(t))):e.substr(e.indexOf(",")+1)}base64ToUint8Array(e){var t=window.atob(e),s=t.length,n=new Uint8Array(s);for(let i=0;i<s;i++)n[i]=t.charCodeAt(i);return n}dataUriToUint8Array(e){if(!e.startsWith("data:"))throw new Error("Not a data URI.");let t=e.indexOf("base64,");if(t===-1)throw new Error("Not a binary data URI.");return t+=7,this.base64ToUint8Array(e.substr(t))}downloadText(e,t,s){if(this.start(e,t,s))return;const n=this.rawDataUris[e];if(n&&!n.includes(".")){try{this.finish(e,200,this.dataUriToString(n))}catch(a){this.finish(e,400,JSON.stringify(a))}return}const i=new XMLHttpRequest;i.overrideMimeType("text/html"),i.open("GET",n||e,!0);const r=()=>{this.finish(e,i.status,i.responseText)};i.onload=r,i.onerror=r,i.send()}downloadJson(e,t,s){this.downloadText(e,n=>{t(JSON.parse(n))},s)}downloadBinary(e,t,s){if(this.start(e,t,s))return;const n=this.rawDataUris[e];if(n&&!n.includes(".")){try{this.finish(e,200,this.dataUriToUint8Array(n))}catch(a){this.finish(e,400,JSON.stringify(a))}return}const i=new XMLHttpRequest;i.open("GET",n||e,!0),i.responseType="arraybuffer";const r=()=>{this.finish(e,i.status,i.response)};i.onload=()=>{i.status===200||i.status===0?this.finish(e,200,new Uint8Array(i.response)):r()},i.onerror=r,i.send()}start(e,t,s){let n=this.callbacks[e];try{if(n)return!0;this.callbacks[e]=n=[]}finally{n.push(t,s)}}finish(e,t,s){const n=this.callbacks[e];if(delete this.callbacks[e],t===200||t===0)for(let i=0,r=n.length;i<r;i+=2)n[i](s);else for(let i=1,r=n.length;i<r;i+=2)n[i](t,s)}},Vs=class ai extends At{color=new z(1,1,1,1);constructor(t){super(t)}copy(){const t=new ai(this.name);return this.copyTo(t),t.color.setFromColor(this.color),t}},Bt=class li extends At{endSlot=null;convex=!1;inverse=!1;color=new z(.2275,.2275,.8078,1);constructor(t){super(t)}copy(){const t=new li(this.name);return this.copyTo(t),t.endSlot=this.endSlot,t.convex=this.convex,t.inverse=this.inverse,t.color.setFromColor(this.color),t}},re=class ci extends At{lengths=[];closed=!1;constantSpeed=!1;color=new z(1,1,1,1);constructor(t){super(t)}copy(){const t=new ci(this.name);return this.copyTo(t),t.lengths=[],V.arrayCopy(this.lengths,0,t.lengths,0,this.lengths.length),t.closed=this.closed,t.constantSpeed=this.constantSpeed,t.color.setFromColor(this.color),t}},Pn=class hi extends At{x=0;y=0;rotation=0;color=new z(.38,.94,0,1);constructor(t){super(t)}computeWorldPosition(t,s){return s.x=this.x*t.a+this.y*t.b+t.worldX,s.y=this.x*t.c+this.y*t.d+t.worldY,s}computeWorldRotation(t){const s=this.rotation*X.degRad,n=Math.cos(s),i=Math.sin(s),r=n*t.a+i*t.b,a=n*t.c+i*t.d;return X.atan2Deg(a,r)}copy(){const t=new hi(this.name);return t.x=this.x,t.y=this.y,t.rotation=this.rotation,t.color.setFromColor(this.color),t}},Fn=class{atlas;allowMissingRegions;constructor(e,t=!1){this.atlas=e,this.allowMissingRegions=t}findRegions(e,t,s){const n=s.regions;for(let i=0,r=n.length;i<r;i++)n[i]=this.findRegion(e,s.getPath(t,i))}findRegion(e,t){const s=this.atlas.findRegion(t);if(!s&&!this.allowMissingRegions)throw new Error(`Region not found in atlas: ${t} (attachment: ${e})`);return s}newRegionAttachment(e,t,s,n,i){return this.findRegions(s,n,i),new It(s,i)}newMeshAttachment(e,t,s,n,i){retuLine truncated
|
||||
attribute vec2 aVertexPosition;
|
||||
attribute vec2 aTextureCoord;
|
||||
|
||||
uniform mat3 projectionMatrix;
|
||||
uniform mat3 translationMatrix;
|
||||
uniform mat3 uTextureMatrix;
|
||||
|
||||
varying vec2 vTextureCoord;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);
|
||||
|
||||
vTextureCoord = (uTextureMatrix * vec3(aTextureCoord, 1.0)).xy;
|
||||
}
|
||||
`,Ir=`
|
||||
varying vec2 vTextureCoord;
|
||||
uniform vec4 uColor;
|
||||
uniform vec4 uDarkColor;
|
||||
|
||||
uniform sampler2D uSampler;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec4 texColor = texture2D(uSampler, vTextureCoord);
|
||||
gl_FragColor.a = texColor.a * uColor.a;
|
||||
gl_FragColor.rgb = ((texColor.a - 1.0) * uDarkColor.a + 1.0 - texColor.rgb) * uDarkColor.rgb + texColor.rgb * uColor.rgb;
|
||||
}
|
||||
`,Hn=class extends St.Shader{uvMatrix;batchable;pluginName;_tintRGB;_darkTintRGB;_colorDirty;_alpha;_tintColor;_darkTintColor;constructor(e){const t={uSampler:e??St.Texture.EMPTY,alpha:1,uTextureMatrix:St.Matrix.IDENTITY,uColor:new Float32Array([1,1,1,1]),uDarkColor:new Float32Array([0,0,0,0])},s={tint:16777215,darkTint:0,alpha:1,pluginName:"darkTintBatch"};super(St.Program.from(Ar,Ir),t),this._colorDirty=!1,this.uvMatrix=new St.TextureMatrix(t.uSampler),this.batchable=!0,this.pluginName=s.pluginName,this._tintColor=new St.Color(s.tint),this._darkTintColor=new St.Color(s.darkTint),this._tintRGB=this._tintColor.toLittleEndianNumber(),this._darkTintRGB=this._darkTintColor.toLittleEndianNumber(),this._alpha=s.alpha,this._colorDirty=!0}get texture(){return this.uniforms.uSampler}set texture(e){this.uniforms.uSampler!==e&&(!this.uniforms.uSampler.baseTexture.alphaMode!=!e.baseTexture.alphaMode&&(this._colorDirty=!0),this.uniforms.uSampler=e,this.uvMatrix.texture=e)}set alpha(e){e!==this._alpha&&(this._alpha=e,this._colorDirty=!0)}get alpha(){return this._alpha}set tint(e){e!==this.tint&&(this._tintColor.setValue(e),this._tintRGB=this._tintColor.toLittleEndianNumber(),this._colorDirty=!0)}get tint(){return this._tintColor.value}set darkTint(e){e!==this.darkTint&&(this._darkTintColor.setValue(e),this._darkTintRGB=this._darkTintColor.toLittleEndianNumber(),this._colorDirty=!0)}get darkTint(){return this._darkTintColor.value}get tintValue(){return this._tintColor.toNumber()}get darkTintValue(){return this._darkTintColor.toNumber()}update(){this._colorDirty&&(this._colorDirty=!1,St.Color.shared.setValue(this._tintColor).premultiply(this._alpha,!0).toArray(this.uniforms.uColor),St.Color.shared.setValue(this._darkTintColor).premultiply(this._alpha,!0).premultiply(1,!1).toArray(this.uniforms.uDarkColor)),this.uvMatrix.update()&&(this.uniforms.uTextureMatrix=this.uvMatrix.mapCoord)}},Kn=class extends Cr.Mesh{_darkTintRGB=0;constructor(e){super(new Wn,new Hn(e),void 0,void 0)}get darkTint(){return"darkTint"in this.shader?this.shader.darkTint:null}set darkTint(e){this.shader.darkTint=e}get darkTintValue(){return this.shader.darkTintValue}_renderToBatch(e){const t=this.geometry,s=this.shader;s.uvMatrix&&(s.uvMatrix.update(),this.calculateUvs()),this.calculateVertices(),this.indices=t.indexBuffer.data,this._tintRGB=s._tintRGB,this._darkTintRGB=s._darkTintRGB,this._texture=s.texture;const n=this.material.pluginName;e.batch.setObjectRenderer(e.plugins[n]),e.plugins[n].render(this)}},Jn=class rt extends Kn{name="";static auxColor=[0,0,0,0];constructor(){super()}updateFromSpineData(t,s,n,i,r,a,c,l){this.texture=t.texture;const o=r/(l?12:8)*2,h=this.geometry.getBuffer("aTextureCoord");h.data?.length!==o&&(h.data=new Float32Array(o));const d=this.geometry.getBuffer("aVertexPosition");d.data?.length!==o&&(d.data=new Float32Array(o));let m=0;const f=h.data,u=d.data;for(let g=0;g<r;g+=l?12:8){let x=g;u[m]=i[x++],u[m+1]=i[x++],x+=4,f[m]=i[x++],f[m+1]=i[x++],m+=2}l?(rt.auxColor[0]=i[8],rt.auxColor[1]=i[9],rt.auxColor[2]=i[10],rt.auxColor[3]=i[11],this.darkTint=rt.auxColor,rt.auxColor[0]=i[2],rt.auxColor[1]=i[3],rt.auxColor[2]=i[4],rt.auxColor[3]=i[5],this.tint=rt.auxColor):(rt.auxColor[0]=i[2],rt.auxColor[1]=i[3],rt.auxColor[2]=i[4],rt.auxColor[3]=i[5],this.tint=rt.auxColor),this.blendMode=de.toPixiBlending(s),this.alpha=rt.auxColor[3];const p=this.geometry.indexBuffer;if(p.data.length!==a.length)p.data=new Uint32Array(a);else{const g=p.data;for(let x=0;x<c;x++)g[x]=a[x]}this.name=n,h.update(),d.update(),p.update()}},Ft=et("@pixi/core"),jn=class extends Ft.Geometry{_buffer;_indexBuffer;constructor(e=!1){super(),this._buffer=new Ft.Buffer(void 0,e,!1),this._indexBuffer=new Ft.Buffer(void 0,e,!0),this.addAttribute("aVertexPosition",this._buffer,2,!1,Ft.TYPES.FLOAT).addAttribute("aTextureCoord",this._buffer,2,!1,Ft.TYPES.FLOAT).addAttribute("aColor",this._buffer,4,!0,Ft.TYPES.UNSIGNED_BYTE).addAttribute("aDarkColor",this._buffer,4,!0,Ft.TYPES.UNSIGNED_BYTE).addAttribute("aTextureId",this._buffer,1,!0,Ft.TYPES.FLOAT).addIndex(this._indexBuffer)}},Ht=et("@pixi/core"),kr=`
|
||||
precision highp float;
|
||||
attribute vec2 aVertexPosition;
|
||||
attribute vec2 aTextureCoord;
|
||||
attribute vec4 aColor;
|
||||
attribute vec4 aDarkColor;
|
||||
attribute float aTextureId;
|
||||
|
||||
uniform mat3 projectionMatrix;
|
||||
uniform mat3 translationMatrix;
|
||||
uniform vec4 tint;
|
||||
|
||||
varying vec2 vTextureCoord;
|
||||
varying vec4 vColor;
|
||||
varying vec4 vDarkColor;
|
||||
varying float vTextureId;
|
||||
|
||||
void main(void){
|
||||
gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);
|
||||
|
||||
vTextureCoord = aTextureCoord;
|
||||
vTextureId = aTextureId;
|
||||
vColor = aColor * tint;
|
||||
vDarkColor = aDarkColor * tint;
|
||||
|
||||
}
|
||||
`,Mr=`
|
||||
varying vec2 vTextureCoord;
|
||||
varying vec4 vColor;
|
||||
varying vec4 vDarkColor;
|
||||
varying float vTextureId;
|
||||
uniform sampler2D uSamplers[%count%];
|
||||
|
||||
void main(void){
|
||||
vec4 color;
|
||||
%forloop%
|
||||
|
||||
|
||||
gl_FragColor.a = color.a * vColor.a;
|
||||
gl_FragColor.rgb = ((color.a - 1.0) * vDarkColor.a + 1.0 - color.rgb) * vDarkColor.rgb + color.rgb * vColor.rgb;
|
||||
}
|
||||
`,Zn=class extends Ht.BatchRenderer{static extension={name:"darkTintBatch",type:Ht.ExtensionType.RendererPlugin};constructor(e){super(e),this.shaderGenerator=new Ht.BatchShaderGenerator(kr,Mr),this.geometryClass=jn,this.vertexSize=7}packInterleavedGeometry(e,t,s,n,i){const{uint32View:r,float32View:a}=t,c=n/this.vertexSize,l=e.uvs,o=e.indices,h=e.vertexData,d=e._texture.baseTexture._batchLocation,m=Math.min(e.worldAlpha,1),f=Ht.Color.shared.setValue(e._tintRGB).toPremultiplied(m,!0),u=Ht.Color.shared.setValue(e._darkTintRGB).premultiply(m,!0).toPremultiplied(1,!1);for(let p=0;p<h.length;p+=2)a[n++]=h[p],a[n++]=h[p+1],a[n++]=l[p],a[n++]=l[p+1],r[n++]=f,r[n++]=u,a[n++]=d;for(let p=0;p<o.length;p++)s[i++]=c+o[p]}};Ht.extensions.add(Zn);var Pr=et("@pixi/core"),sn=et("@pixi/mesh"),Qn=class Ot extends sn.Mesh{name="";static auxColor=[0,0,0,0];warnedTwoTint=!1;constructor(){const t=new sn.MeshGeometry;t.getBuffer("aVertexPosition").static=!1,t.getBuffer("aTextureCoord").static=!1;const s=new sn.MeshMaterial(Pr.Texture.EMPTY);super(t,s)}updateFromSpineData(t,s,n,i,r,a,c,l){this.texture=t.texture;const o=r/(l?12:8)*2,h=this.geometry.getBuffer("aTextureCoord");h.data?.length!==o&&(h.data=new Float32Array(o));const d=this.geometry.getBuffer("aVertexPosition");d.data?.length!==o&&(d.data=new Float32Array(o));let m=0;const f=h.data,u=d.data;for(let g=0;g<r;g+=l?12:8){let x=g;u[m]=i[x++],u[m+1]=i[x++],x+=4,f[m]=i[x++],f[m+1]=i[x++],m+=2}l&&!this.warnedTwoTint&&(console.warn("DarkTint is not enabled by default. To enable use a DarkSlotMesh factory while creating the Spine object."),this.warnedTwoTint=!0),Ot.auxColor[0]=i[2],Ot.auxColor[1]=i[3],Ot.auxColor[2]=i[4],Ot.auxColor[3]=i[5],this.tint=Ot.auxColor,this.alpha=Ot.auxColor[3],this.blendMode=de.toPixiBlending(s);const p=this.geometry.indexBuffer;if(p.data.length!==a.length)p.data=new Uint32Array(a);else{const g=p.data;for(let x=0;x<c;x++)g[x]=a[x]}this.name=n,h.update(),d.update(),p.update()}},ti=et("@pixi/assets"),nn=et("@pixi/core"),ei=et("@pixi/display"),Fr=et("@pixi/graphics"),Vr=et("@pixi/events"),Yr=class{constructor(e,t,s,n){this.x=e,this.y=t,this.width=s,this.height=n}calculateBounds(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},Er=class{constructor(e=!1){this.clipping=e}calculateBounds(e){if(!e.skeleton)return{x:0,y:0,width:0,height:0};const t=new Gt(e.skeleton.data);t.setupPose(),t.updateWorldTransform(2);const s=t.getBoundsRect(this.clipping?new he:void 0);return s.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:s}},Br=class{constructor(e,t=[],s=.05,n=!1){this.animation=e,this.skins=t,this.timeStep=s,this.clipping=n}calculateBounds(e){if(!e.skeleton||!e.state)return{x:0,y:0,width:0,height:0};const t=new Ys(e.state.data),s=new Gt(e.skeleton.data),n=this.clipping?new he:void 0,i=s.data;if(this.skins.length>0){const a=new ce("custom-skin");for(const c of this.skins){const l=i.findSkin(c);l!=null&&a.addSkin(l)}s.setSkin(a)}s.setupPose();const r=this.animation!=null?i.findAnimation(this.animation):null;if(r==null){s.updateWorldTransform(2);const a=s.getBoundsRect(n);return a.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:a}else{let a=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;t.clearTracks(),t.setAnimation(0,r,!1);const h=Math.max(r.duration/this.timeStep,1);for(let m=0;m<h;m++){const f=m>0?this.timeStep:0;t.update(f),t.apply(s),s.update(f),s.updateWorldTransform(2);const u=s.getBoundsRect(n);a=Math.min(a,u.x),c=Math.min(c,u.y),l=Math.max(l,u.x+u.width),o=Math.max(o,u.y+u.height)}const d={x:a,y:c,width:l-a,height:o-c};return d.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:d}}},Rr=class Z extends ei.Container{skeleton;state;skeletonPhysics;darkTint=!1;hasNeverUpdated=!0;_debug=void 0;get debug(){return this._debug}set debug(t){this._debug&&this._debug.unregisterSpine(this),t&&t.registerSpine(this),this._debug=t}slotMeshFactory=()=>new Qn;beforeUpdateWorldTransforms=()=>{};afterUpdateWorldTransforms=()=>{};_autoUpdate=!1;_ticker=nn.Ticker.shared;get autoUpdate(){return this._autoUpdate}set autoUpdate(t){t&&!this._autoUpdate?this._ticker.add(this.internalUpdate,this):!t&&this._autoUpdate&&this._ticker.remove(this.internalUpdate,this),this._autoUpdate=t}get ticker(){return this._ticker}set ticker(t){t=t??nn.Ticker.shared,this._ticker!==t&&(this._autoUpdate&&(this._ticker.remove(this.internalUpdate,this),t.add(this.internalUpdate,this)),this._ticker=t)}meshesCache=new Map;static vectorAux=new me;static clipper=new he;static QUAD_TRIANGLES=[0,1,2,2,3,0];static VERTEX_SIZE=8;static DARK_VERTEX_SIZE=12;lightColor=new z;darkColor=new z;clippingVertAux=new Float32Array(6);_boundsProvider;get boundsProvider(){return this._boundsProvider}set boundsProvider(t){this._boundsProvider=t,t?(this._boundsSpineID=-1,this._boundsSpineDirty=!0,this.interactiveChildren=!1):(this.interactiveChildren=!0,this.hitArea=null),this.hasNeverUpdated||this.calculateBounds()}_b
Line truncated
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes License Agreement
|
||||
* Last updated September 24, 2021. Replaces all prior versions.
|
||||
*
|
||||
* Copyright (c) 2013-2021, 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 './require-shim.js';
|
||||
import './assets/AtlasLoader.js';
|
||||
import './assets/SkeletonLoader.js';
|
||||
export * from "@spine-particle/spine-core-4.3";
|
||||
export * from './assets/AtlasLoader.js';
|
||||
export * from './assets/SkeletonLoader.js';
|
||||
export * from './DarkSlotMesh.js';
|
||||
export * from './darkTintMesh/DarkTintBatchGeom.js';
|
||||
export * from './darkTintMesh/DarkTintGeom.js';
|
||||
export * from './darkTintMesh/DarkTintMaterial.js';
|
||||
export * from './darkTintMesh/DarkTintMesh.js';
|
||||
export * from './darkTintMesh/DarkTintRenderer.js';
|
||||
export * from './SlotMesh.js';
|
||||
export * from './Spine.js';
|
||||
export * from './SpineDebugRenderer.js';
|
||||
export * from './SpineTexture.js';
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
/******************************************************************************
|
||||
* Spine Runtimes License Agreement
|
||||
* Last updated September 24, 2021. Replaces all prior versions.
|
||||
*
|
||||
* Copyright (c) 2013-2021, 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 './require-shim.js';
|
||||
import './assets/AtlasLoader.js'; // Side effects install the loaders into pixi
|
||||
import './assets/SkeletonLoader.js'; // Side effects install the loaders into pixi
|
||||
export * from "@spine-particle/spine-core-4.3";
|
||||
export * from './assets/AtlasLoader.js';
|
||||
export * from './assets/SkeletonLoader.js';
|
||||
export * from './DarkSlotMesh.js';
|
||||
export * from './darkTintMesh/DarkTintBatchGeom.js';
|
||||
export * from './darkTintMesh/DarkTintGeom.js';
|
||||
export * from './darkTintMesh/DarkTintMaterial.js';
|
||||
export * from './darkTintMesh/DarkTintMesh.js';
|
||||
export * from './darkTintMesh/DarkTintRenderer.js';
|
||||
export * from './SlotMesh.js';
|
||||
export * from './Spine.js';
|
||||
export * from './SpineDebugRenderer.js';
|
||||
export * from './SpineTexture.js';
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLE9BQU8sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyx5QkFBeUIsQ0FBQyxDQUFDLDZDQUE2QztBQUMvRSxPQUFPLDRCQUE0QixDQUFDLENBQUMsNkNBQTZDO0FBRWxGLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgU2VwdGVtYmVyIDI0LCAyMDIxLiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjEsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgJy4vcmVxdWlyZS1zaGltLmpzJztcbmltcG9ydCAnLi9hc3NldHMvQXRsYXNMb2FkZXIuanMnOyAvLyBTaWRlIGVmZmVjdHMgaW5zdGFsbCB0aGUgbG9hZGVycyBpbnRvIHBpeGlcbmltcG9ydCAnLi9hc3NldHMvU2tlbGV0b25Mb2FkZXIuanMnOyAvLyBTaWRlIGVmZmVjdHMgaW5zdGFsbCB0aGUgbG9hZGVycyBpbnRvIHBpeGlcblxuZXhwb3J0ICogZnJvbSBcIkBlc290ZXJpY3NvZnR3YXJlL3NwaW5lLWNvcmVcIjtcbmV4cG9ydCAqIGZyb20gJy4vYXNzZXRzL0F0bGFzTG9hZGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXNzZXRzL1NrZWxldG9uTG9hZGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRGFya1Nsb3RNZXNoLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGFya1RpbnRNZXNoL0RhcmtUaW50QmF0Y2hHZW9tLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGFya1RpbnRNZXNoL0RhcmtUaW50R2VvbS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2RhcmtUaW50TWVzaC9EYXJrVGludE1hdGVyaWFsLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGFya1RpbnRNZXNoL0RhcmtUaW50TWVzaC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2RhcmtUaW50TWVzaC9EYXJrVGludFJlbmRlcmVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vU2xvdE1lc2guanMnO1xuZXhwb3J0ICogZnJvbSAnLi9TcGluZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NwaW5lRGVidWdSZW5kZXJlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NwaW5lVGV4dHVyZS5qcyc7XG5cblxuIl19
|
||||
@@ -0,0 +1,29 @@
|
||||
/******************************************************************************
|
||||
* 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.
|
||||
*****************************************************************************/
|
||||
export {};
|
||||
@@ -0,0 +1,40 @@
|
||||
/******************************************************************************
|
||||
* 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.
|
||||
*****************************************************************************/
|
||||
// biome-ignore-all lint: ignore biome for this file
|
||||
if (typeof window !== 'undefined' && window.PIXI) {
|
||||
const prevRequire = window.require;
|
||||
window.require = (x) => {
|
||||
if (prevRequire)
|
||||
return prevRequire(x);
|
||||
else if (x.startsWith("@pixi/"))
|
||||
return window.PIXI;
|
||||
};
|
||||
}
|
||||
export {};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZS1zaGltLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlcXVpcmUtc2hpbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0Usb0RBQW9EO0FBRXBELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFLLE1BQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzRCxNQUFNLFdBQVcsR0FBSSxNQUFjLENBQUMsT0FBTyxDQUFDO0lBQzNDLE1BQWMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRTtRQUN2QyxJQUFJLFdBQVc7WUFBRSxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNsQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBUSxNQUFjLENBQUMsSUFBSSxDQUFDO0lBQzlELENBQUMsQ0FBQTtBQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogaWdub3JlIGJpb21lIGZvciB0aGlzIGZpbGVcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICh3aW5kb3cgYXMgYW55KS5QSVhJKSB7XG5cdGNvbnN0IHByZXZSZXF1aXJlID0gKHdpbmRvdyBhcyBhbnkpLnJlcXVpcmU7XG5cdCh3aW5kb3cgYXMgYW55KS5yZXF1aXJlID0gKHg6IHN0cmluZykgPT4ge1xuXHRcdGlmIChwcmV2UmVxdWlyZSkgcmV0dXJuIHByZXZSZXF1aXJlKHgpO1xuXHRcdGVsc2UgaWYgKHguc3RhcnRzV2l0aChcIkBwaXhpL1wiKSkgcmV0dXJuICh3aW5kb3cgYXMgYW55KS5QSVhJO1xuXHR9XG59XG5cbmV4cG9ydCB7IH1cbiJdfQ==
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"name": "@spine-particle/spine-pixi-v7-4.3",
|
||||
"version": "4.3.13",
|
||||
"description": "The official Spine Runtimes for the web PixiJS v7.",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"type": "module",
|
||||
"files": [
|
||||
"dist/**/*",
|
||||
"README.md",
|
||||
"LICENSE"
|
||||
],
|
||||
"scripts": {},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/EsotericSoftware/spine-runtimes.git"
|
||||
},
|
||||
"keywords": [
|
||||
"gamedev",
|
||||
"animations",
|
||||
"2d",
|
||||
"spine",
|
||||
"game-dev",
|
||||
"runtimes",
|
||||
"skeletal"
|
||||
],
|
||||
"author": "Esoteric Software LLC",
|
||||
"license": "LicenseRef-LICENSE",
|
||||
"bugs": {
|
||||
"url": "https://github.com/esotericsoftware/spine-runtimes/issues"
|
||||
},
|
||||
"homepage": "https://github.com/esotericsoftware/spine-runtimes#readme",
|
||||
"dependencies": {
|
||||
"@spine-particle/spine-core-4.3": "4.3.13"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@pixi/core": "^7.2.4",
|
||||
"@pixi/display": "^7.2.4",
|
||||
"@pixi/graphics": "^7.2.4",
|
||||
"@pixi/text": "^7.2.4",
|
||||
"@pixi/assets": "^7.2.4",
|
||||
"@pixi/mesh": "^7.2.4",
|
||||
"@pixi/events": "^7.2.4"
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user