支持spine4.3

This commit is contained in:
tianmo committed 2026-09-02 13:53:12 +08:00
1 parent 63e4f61631
commit 0656684a92
206 files changed
+100597 -1320

No files matched your search

+113
View File
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lVGV4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV4RyxNQUFNLE9BQU8sWUFBYSxTQUFRLE9BQU87SUFDaEMsTUFBTSxDQUFDLFVBQVUsR0FBdUMsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFbEcsTUFBTSxDQUFDLElBQUksQ0FBRSxPQUF3QjtRQUMzQyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDMUMsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQWlCLENBQUM7UUFDN0QsQ0FBQztRQUNELE9BQU8sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVlLE9BQU8sQ0FBYztJQUVyQyxZQUFxQixLQUFzQjtRQUMxQyx1RUFBdUU7UUFDdkUsS0FBSyxDQUFFLEtBQUssQ0FBQyxRQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sVUFBVSxDQUFFLFNBQXdCLEVBQUUsVUFBeUI7UUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV2RSx5REFBeUQ7SUFDMUQsQ0FBQztJQUVNLFFBQVEsQ0FBRSxLQUFrQixFQUFFLE1BQW1CO1FBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUUsNEJBQTRCO0lBQzdCLENBQUM7SUFFTSxPQUFPO1FBQ2IsdUNBQXVDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBRSxNQUFxQjtRQUN4RCxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLEtBQUssYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUMzQixLQUFLLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxLQUFLLGFBQWEsQ0FBQyxvQkFBb0I7Z0JBQ3RDLE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQztZQUU1QixLQUFLLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDMUIsS0FBSyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQywyREFBMkQ7WUFDbEcsS0FBSyxhQUFhLENBQUMsbUJBQW1CO2dCQUNyQyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFFM0I7Z0JBQ0MsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0YsQ0FBQztJQUVPLE1BQU0sQ0FBQyxZQUFZLENBQUUsTUFBcUI7UUFDakQsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNoQixLQUFLLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDM0IsS0FBSyxhQUFhLENBQUMsTUFBTTtnQkFDeEIsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDO1lBRXpCLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZDLEtBQUssYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3hDLEtBQUssYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUMsMkRBQTJEO1lBQ2xHLEtBQUssYUFBYSxDQUFDLG1CQUFtQjtnQkFDckMsT0FBTyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBRXhCO2dCQUNDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNGLENBQUM7SUFFTyxNQUFNLENBQUMsaUJBQWlCLENBQUUsSUFBaUI7UUFDbEQsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNkLEtBQUssV0FBVyxDQUFDLFdBQVc7Z0JBQzNCLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztZQUV6QixLQUFLLFdBQVcsQ0FBQyxjQUFjO2dCQUM5QixPQUFPLFVBQVUsQ0FBQyxlQUFlLENBQUM7WUFFbkMsS0FBSyxXQUFXLENBQUMsTUFBTTtnQkFDdEIsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBRTFCO2dCQUNDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNGLENBQUM7SUFFTSxNQUFNLENBQUMsY0FBYyxDQUFFLEtBQWdCO1FBQzdDLFFBQVEsS0FBSyxFQUFFLENBQUM7WUFDZixLQUFLLFNBQVMsQ0FBQyxNQUFNO2dCQUNwQixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFFM0IsS0FBSyxTQUFTLENBQUMsUUFBUTtnQkFDdEIsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBRXhCLEtBQUssU0FBUyxDQUFDLFFBQVE7Z0JBQ3RCLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUU3QixLQUFLLFNBQVMsQ0FBQyxNQUFNO2dCQUNwQixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFFM0I7Z0JBQ0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcI Line truncated