UNPKG

@esotericsoftware/spine-pixi-v8

Version:
116 lines 16 kB
/****************************************************************************** * Spine Runtimes License Agreement * Last updated April 5, 2025. Replaces all prior versions. * * Copyright (c) 2013-2025, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software * or otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { BlendMode, Texture, TextureFilter, TextureWrap } from '@esotericsoftware/spine-core'; import { Texture as PixiTexture } from 'pixi.js'; 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); this.texture = PixiTexture.from(image); } setFilters(minFilter, magFilter) { const style = this.texture.source.style; style.minFilter = SpineTexture.toPixiTextureFilter(minFilter); style.magFilter = SpineTexture.toPixiTextureFilter(magFilter); this.texture.source.autoGenerateMipmaps = SpineTexture.toPixiMipMap(minFilter); this.texture.source.updateMipmaps(); } setWraps(uWrap, vWrap) { const style = this.texture.source.style; style.addressModeU = SpineTexture.toPixiTextureWrap(uWrap); style.addressModeV = SpineTexture.toPixiTextureWrap(vWrap); } dispose() { // I am not entirely sure about this... this.texture.destroy(); } static toPixiMipMap(filter) { switch (filter) { case TextureFilter.Nearest: case TextureFilter.Linear: return false; case TextureFilter.MipMapNearestLinear: case TextureFilter.MipMapNearestNearest: case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap case TextureFilter.MipMapLinearNearest: return true; default: throw new Error(`Unknown texture filter: ${String(filter)}`); } } static toPixiTextureFilter(filter) { switch (filter) { case TextureFilter.Nearest: case TextureFilter.MipMapNearestLinear: case TextureFilter.MipMapNearestNearest: return 'nearest'; case TextureFilter.Linear: case TextureFilter.MipMapLinearLinear: // TextureFilter.MipMapLinearLinear == TextureFilter.MipMap case TextureFilter.MipMapLinearNearest: return 'linear'; default: throw new Error(`Unknown texture filter: ${String(filter)}`); } } static toPixiTextureWrap(wrap) { switch (wrap) { case TextureWrap.ClampToEdge: return 'clamp-to-edge'; case TextureWrap.MirroredRepeat: return 'mirror-repeat'; case TextureWrap.Repeat: return 'repeat'; default: throw new Error(`Unknown texture wrap: ${String(wrap)}`); } } static toPixiBlending(blend) { switch (blend) { case BlendMode.Normal: return 'normal'; case BlendMode.Additive: return 'add'; case BlendMode.Multiply: return 'multiply'; case BlendMode.Screen: return 'screen'; default: throw new Error(`Unknown blendMode: ${String(blend)}`); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lVGV4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxPQUFPLElBQUksV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpELE1BQU0sT0FBTyxZQUFhLFNBQVEsT0FBTztJQUNoQyxNQUFNLENBQVUsVUFBVSxHQUFxQyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUV2RyxNQUFNLENBQUMsSUFBSSxDQUFFLE9BQXNCO1FBQ3pDLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBaUIsQ0FBQztRQUM3RCxDQUFDO1FBRUQsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRWUsT0FBTyxDQUFjO0lBRXJDLFlBQXFCLEtBQW9CO1FBQ3hDLHVFQUF1RTtRQUN2RSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sVUFBVSxDQUFFLFNBQXdCLEVBQUUsU0FBd0I7UUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRXhDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELEtBQUssQ0FBQyxT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O2dCQUNwQixPQUFPLFFBQVEsQ0FBQztZQUVqQjtnQkFDQyxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBCbGVuZE1vZGUsIFRleHR1cmUsIFRleHR1cmVGaWx0ZXIsIFRleHR1cmVXcmFwIH0gZnJvbSAnQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IEJMRU5EX01PREVTLCBTQ0FMRV9NT0RFLCBUZXh0dXJlU291cmNlLCBXUkFQX01PREUgfSBmcm9tICdwaXhpLmpzJztcbmltcG9ydCB7IFRleHR1cmUgYXMgUGl4aVRleHR1cmUgfSBmcm9tICdwaXhpLmpzJztcblxuZXhwb3J0IGNsYXNzIFNwaW5lVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXHRwcml2YXRlIHN0YXRpYyByZWFkb25seSB0ZXh0dXJlTWFwOiBNYXA8VGV4dHVyZVNvdXJjZSwgU3BpbmVUZXh0dXJlPiA9IG5ldyBNYXA8VGV4dHVyZVNvdXJjZSwgU3BpbmVUZXh0dXJlPigpO1xuXG5cdHB1YmxpYyBzdGF0aWMgZnJvbSAodGV4dHVyZTogVGV4dHVyZVNvdXJjZSk6IFNwaW5lVGV4dHVyZSB7XG5cdFx0aWYgKFNwaW5lVGV4dHVyZS50ZXh0dXJlTWFwLmhhcyh0ZXh0dXJlKSkge1xuXHRcdFx0cmV0dXJuIFNwaW5lVGV4dHVyZS50ZXh0dXJlTWFwLmdldCh0ZXh0dXJlKSBhcyBTcGluZVRleHR1cmU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBTcGluZVRleHR1cmUodGV4dHVyZSk7XG5cdH1cblxuXHRwdWJsaWMgcmVhZG9ubHkgdGV4dHVyZTogUGl4aVRleHR1cmU7XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RvciAoaW1hZ2U6IFRleHR1cmVTb3VyY2UpIHtcblx0XHQvLyBUb2RvOiBtYXliZSBhZGQgZXJyb3IgaGFuZGxpbmcgaWYgeW91IGZlZWQgYSB2aWRlbyB0ZXh0dXJlIHRvIHNwaW5lP1xuXHRcdHN1cGVyKGltYWdlLnJlc291cmNlKTtcblx0XHR0aGlzLnRleHR1cmUgPSBQaXhpVGV4dHVyZS5mcm9tKGltYWdlKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRGaWx0ZXJzIChtaW5GaWx0ZXI6IFRleHR1cmVGaWx0ZXIsIG1hZ0ZpbHRlcjogVGV4dHVyZUZpbHRlcik6IHZvaWQge1xuXHRcdGNvbnN0IHN0eWxlID0gdGhpcy50ZXh0dXJlLnNvdXJjZS5zdHlsZTtcblxuXHRcdHN0eWxlLm1pbkZpbHRlciA9IFNwaW5lVGV4dHVyZS50b1BpeGlUZXh0dXJlRmlsdGVyKG1pbkZpbHRlcik7XG5cdFx0c3R5bGUubWFnRmlsdGVyID0gU3BpbmVUZXh0dXJlLnRvUGl4aVRleHR1cmVGaWx0ZXIobWFnRmlsdGVyKTtcblx0XHR0aGlzLnRleHR1cmUuc291cmNlLmF1dG9HZW5lcmF0ZU1pcG1hcHMgPSBTcGluZVRleHR1cmUudG9QaXhpTWlwTWFwKG1pbkZpbHRlcik7XG5cdFx0dGhpcy50ZXh0dXJlLnNvdXJjZS51cGRhdGVNaXBtYXBzKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0V3JhcHMgKHVXcmFwOiBUZXh0dXJlV3JhcCwgdldyYXA6IFRleHR1cmVXcmFwKTogdm9pZCB7XG5cdFx0Y29uc3Qgc3R5bGUgPSB0aGlzLnRleHR1cmUuc291cmNlLnN0eWxlO1xuXG5cdFx0c3R5bGUuYWRkcmVzc01vZGVVID0gU3BpbmVUZXh0dXJlLnRvUGl4aVRleHR1cmVXcmFwKHVXcmFwKTtcblx0XHRzdHlsZS5hZGRyZXNzTW9kZVYgPSBTcGluZVRleHR1cmUudG9QaXhpVGV4dHVyZVdyYXAodldyYXApO1xuXHR9XG5cblx0cHVibGljIGRpc3Bvc2UgKCk6IHZvaWQge1xuXHRcdC8vIEkgYW0gbm90IGVudGlyZWx5IHN1cmUgYWJvdXQgdGhpcy4uLlxuXHRcdHRoaXMudGV4dHVyZS5kZXN0cm95KCk7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyB0b1BpeGlNaXBNYXAgKGZpbHRlcjogVGV4dHVyZUZpbHRlcik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoZmlsdGVyKSB7XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTmVhcmVzdDpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5MaW5lYXI6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcE5lYXJlc3RMaW5lYXI6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTmVhcmVzdE5lYXJlc3Q6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyOiAvLyBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhckxpbmVhciA9PSBUZXh0dXJlRmlsdGVyLk1pcE1hcFxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhck5lYXJlc3Q6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGV4dHVyZSBmaWx0ZXI6ICR7U3RyaW5nKGZpbHRlcil9YCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgdG9QaXhpVGV4dHVyZUZpbHRlciAoZmlsdGVyOiBUZXh0dXJlRmlsdGVyKTogU0NBTEVfTU9ERSB7XG5cdFx0c3dpdGNoIChmaWx0ZXIpIHtcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5OZWFyZXN0OlxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcE5lYXJlc3RMaW5lYXI6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTmVhcmVzdE5lYXJlc3Q6XG5cdFx0XHRcdHJldHVybiAnbmVhcmVzdCc7XG5cblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5MaW5lYXI6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyOiAvLyBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhckxpbmVhciA9PSBUZXh0dXJlRmlsdGVyLk1pcE1hcFxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk1pcE1hcExpbmVhck5lYXJlc3Q6XG5cdFx0XHRcdHJldHVybiAnbGluZWFyJztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRleHR1cmUgZmlsdGVyOiAke1N0cmluZyhmaWx0ZXIpfWApO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIHRvUGl4aVRleHR1cmVXcmFwICh3cmFwOiBUZXh0dXJlV3JhcCk6IFdSQVBfTU9ERSB7XG5cdFx0c3dpdGNoICh3cmFwKSB7XG5cdFx0XHRjYXNlIFRleHR1cmVXcmFwLkNsYW1wVG9FZGdlOlxuXHRcdFx0XHRyZXR1cm4gJ2NsYW1wLXRvLWVkZ2UnO1xuXG5cdFx0XHRjYXNlIFRleHR1cmVXcmFwLk1pcnJvcmVkUmVwZWF0OlxuXHRcdFx0XHRyZXR1cm4gJ21pcnJvci1yZXBlYXQnO1xuXG5cdFx0XHRjYXNlIFRleHR1cmVXcmFwLlJlcGVhdDpcblx0XHRcdFx0cmV0dXJuICdyZXBlYXQnO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGV4dHVyZSB3cmFwOiAke1N0cmluZyh3cmFwKX1gKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHRvUGl4aUJsZW5kaW5nIChibGVuZDogQmxlbmRNb2RlKTogQkxFTkRfTU9ERVMge1xuXHRcdHN3aXRjaCAoYmxlbmQpIHtcblx0XHRcdGNhc2UgQmxlbmRNb2RlLk5vcm1hbDpcblx0XHRcdFx0cmV0dXJuICdub3JtYWwnO1xuXG5cdFx0XHRjYXNlIEJsZW5kTW9kZS5BZGRpdGl2ZTpcblx0XHRcdFx0cmV0dXJuICdhZGQnO1xuXG5cdFx0XHRjYXNlIEJsZW5kTW9kZS5NdWx0aXBseTpcblx0XHRcdFx0cmV0dXJuICdtdWx0aXBseSc7XG5cblx0XHRcdGNhc2UgQmxlbmRNb2RlLlNjcmVlbjpcblx0XHRcdFx0cmV0dXJuICdzY3JlZW4nO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYmxlbmRNb2RlOiAke1N0cmluZyhibGVuZCl9YCk7XG5cdFx0fVxuXHR9XG59XG4iXX0=