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 { Texture as PixiTexture } from 'pixi.js'; import { BlendMode, Texture, TextureFilter, TextureWrap } from '@esotericsoftware/spine-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); 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BpbmVUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NwaW5lVGV4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakQsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSTlGLE1BQU0sT0FBTyxZQUFhLFNBQVEsT0FBTztJQUNoQyxNQUFNLENBQVUsVUFBVSxHQUFxQyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztJQUV2RyxNQUFNLENBQUMsSUFBSSxDQUFFLE9BQXNCO1FBQ3pDLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBaUIsQ0FBQztRQUM3RCxDQUFDO1FBRUQsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRWUsT0FBTyxDQUFjO0lBRXJDLFlBQXFCLEtBQW9CO1FBQ3hDLHVFQUF1RTtRQUN2RSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sVUFBVSxDQUFFLFNBQXdCLEVBQUUsU0FBd0I7UUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRXhDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELEtBQUssQ0FBQyxT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O2dCQUNwQixPQUFPLFFBQVEsQ0FBQztZQUVqQjtnQkFDQyxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcbiAqIExhc3QgdXBkYXRlZCBBcHJpbCA1LCAyMDI1LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMjUsIEVzb3RlcmljIFNvZnR3YXJlIExMQ1xuICpcbiAqIEludGVncmF0aW9uIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yIG90aGVyd2lzZSBjcmVhdGluZ1xuICogZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgaXMgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XG4gKiBodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtZWRpdG9yLWxpY2Vuc2VcbiAqXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcbiAqIG9yIG90aGVyd2lzZSBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgU3BpbmUgUnVudGltZXMgKGNvbGxlY3RpdmVseSxcbiAqIFwiUHJvZHVjdHNcIiksIHByb3ZpZGVkIHRoYXQgZWFjaCB1c2VyIG9mIHRoZSBQcm9kdWN0cyBtdXN0IG9idGFpbiB0aGVpciBvd25cbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxuICogaW5jbHVkZSB0aGlzIGxpY2Vuc2UgYW5kIGNvcHlyaWdodCBub3RpY2UuXG4gKlxuICogVEhFIFNQSU5FIFJVTlRJTUVTIEFSRSBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTllcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWVxuICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUyxcbiAqIEJVU0lORVNTIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORFxuICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICogVEhFIFNQSU5FIFJVTlRJTUVTLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBUZXh0dXJlIGFzIFBpeGlUZXh0dXJlIH0gZnJvbSAncGl4aS5qcyc7XG5pbXBvcnQgeyBCbGVuZE1vZGUsIFRleHR1cmUsIFRleHR1cmVGaWx0ZXIsIFRleHR1cmVXcmFwIH0gZnJvbSAnQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgQkxFTkRfTU9ERVMsIFNDQUxFX01PREUsIFRleHR1cmVTb3VyY2UsIFdSQVBfTU9ERSB9IGZyb20gJ3BpeGkuanMnO1xuXG5leHBvcnQgY2xhc3MgU3BpbmVUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XG5cdHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHRleHR1cmVNYXA6IE1hcDxUZXh0dXJlU291cmNlLCBTcGluZVRleHR1cmU+ID0gbmV3IE1hcDxUZXh0dXJlU291cmNlLCBTcGluZVRleHR1cmU+KCk7XG5cblx0cHVibGljIHN0YXRpYyBmcm9tICh0ZXh0dXJlOiBUZXh0dXJlU291cmNlKTogU3BpbmVUZXh0dXJlIHtcblx0XHRpZiAoU3BpbmVUZXh0dXJlLnRleHR1cmVNYXAuaGFzKHRleHR1cmUpKSB7XG5cdFx0XHRyZXR1cm4gU3BpbmVUZXh0dXJlLnRleHR1cmVNYXAuZ2V0KHRleHR1cmUpIGFzIFNwaW5lVGV4dHVyZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFNwaW5lVGV4dHVyZSh0ZXh0dXJlKTtcblx0fVxuXG5cdHB1YmxpYyByZWFkb25seSB0ZXh0dXJlOiBQaXhpVGV4dHVyZTtcblxuXHRwcml2YXRlIGNvbnN0cnVjdG9yIChpbWFnZTogVGV4dHVyZVNvdXJjZSkge1xuXHRcdC8vIFRvZG86IG1heWJlIGFkZCBlcnJvciBoYW5kbGluZyBpZiB5b3UgZmVlZCBhIHZpZGVvIHRleHR1cmUgdG8gc3BpbmU/XG5cdFx0c3VwZXIoaW1hZ2UucmVzb3VyY2UpO1xuXHRcdHRoaXMudGV4dHVyZSA9IFBpeGlUZXh0dXJlLmZyb20oaW1hZ2UpO1xuXHR9XG5cblx0cHVibGljIHNldEZpbHRlcnMgKG1pbkZpbHRlcjogVGV4dHVyZUZpbHRlciwgbWFnRmlsdGVyOiBUZXh0dXJlRmlsdGVyKTogdm9pZCB7XG5cdFx0Y29uc3Qgc3R5bGUgPSB0aGlzLnRleHR1cmUuc291cmNlLnN0eWxlO1xuXG5cdFx0c3R5bGUubWluRmlsdGVyID0gU3BpbmVUZXh0dXJlLnRvUGl4aVRleHR1cmVGaWx0ZXIobWluRmlsdGVyKTtcblx0XHRzdHlsZS5tYWdGaWx0ZXIgPSBTcGluZVRleHR1cmUudG9QaXhpVGV4dHVyZUZpbHRlcihtYWdGaWx0ZXIpO1xuXHRcdHRoaXMudGV4dHVyZS5zb3VyY2UuYXV0b0dlbmVyYXRlTWlwbWFwcyA9IFNwaW5lVGV4dHVyZS50b1BpeGlNaXBNYXAobWluRmlsdGVyKTtcblx0XHR0aGlzLnRleHR1cmUuc291cmNlLnVwZGF0ZU1pcG1hcHMoKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRXcmFwcyAodVdyYXA6IFRleHR1cmVXcmFwLCB2V3JhcDogVGV4dHVyZVdyYXApOiB2b2lkIHtcblx0XHRjb25zdCBzdHlsZSA9IHRoaXMudGV4dHVyZS5zb3VyY2Uuc3R5bGU7XG5cblx0XHRzdHlsZS5hZGRyZXNzTW9kZVUgPSBTcGluZVRleHR1cmUudG9QaXhpVGV4dHVyZVdyYXAodVdyYXApO1xuXHRcdHN0eWxlLmFkZHJlc3NNb2RlViA9IFNwaW5lVGV4dHVyZS50b1BpeGlUZXh0dXJlV3JhcCh2V3JhcCk7XG5cdH1cblxuXHRwdWJsaWMgZGlzcG9zZSAoKTogdm9pZCB7XG5cdFx0Ly8gSSBhbSBub3QgZW50aXJlbHkgc3VyZSBhYm91dCB0aGlzLi4uXG5cdFx0dGhpcy50ZXh0dXJlLmRlc3Ryb3koKTtcblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIHRvUGl4aU1pcE1hcCAoZmlsdGVyOiBUZXh0dXJlRmlsdGVyKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChmaWx0ZXIpIHtcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5OZWFyZXN0OlxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLkxpbmVhcjpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTmVhcmVzdExpbmVhcjpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBOZWFyZXN0TmVhcmVzdDpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBMaW5lYXJMaW5lYXI6IC8vIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyID09IFRleHR1cmVGaWx0ZXIuTWlwTWFwXG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTmVhcmVzdDpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIGZpbHRlcjogJHtTdHJpbmcoZmlsdGVyKX1gKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyB0b1BpeGlUZXh0dXJlRmlsdGVyIChmaWx0ZXI6IFRleHR1cmVGaWx0ZXIpOiBTQ0FMRV9NT0RFIHtcblx0XHRzd2l0Y2ggKGZpbHRlcikge1xuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLk5lYXJlc3Q6XG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTmVhcmVzdExpbmVhcjpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBOZWFyZXN0TmVhcmVzdDpcblx0XHRcdFx0cmV0dXJuICduZWFyZXN0JztcblxuXHRcdFx0Y2FzZSBUZXh0dXJlRmlsdGVyLkxpbmVhcjpcblx0XHRcdGNhc2UgVGV4dHVyZUZpbHRlci5NaXBNYXBMaW5lYXJMaW5lYXI6IC8vIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTGluZWFyID09IFRleHR1cmVGaWx0ZXIuTWlwTWFwXG5cdFx0XHRjYXNlIFRleHR1cmVGaWx0ZXIuTWlwTWFwTGluZWFyTmVhcmVzdDpcblx0XHRcdFx0cmV0dXJuICdsaW5lYXInO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGV4dHVyZSBmaWx0ZXI6ICR7U3RyaW5nKGZpbHRlcil9YCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgdG9QaXhpVGV4dHVyZVdyYXAgKHdyYXA6IFRleHR1cmVXcmFwKTogV1JBUF9NT0RFIHtcblx0XHRzd2l0Y2ggKHdyYXApIHtcblx0XHRcdGNhc2UgVGV4dHVyZVdyYXAuQ2xhbXBUb0VkZ2U6XG5cdFx0XHRcdHJldHVybiAnY2xhbXAtdG8tZWRnZSc7XG5cblx0XHRcdGNhc2UgVGV4dHVyZVdyYXAuTWlycm9yZWRSZXBlYXQ6XG5cdFx0XHRcdHJldHVybiAnbWlycm9yLXJlcGVhdCc7XG5cblx0XHRcdGNhc2UgVGV4dHVyZVdyYXAuUmVwZWF0OlxuXHRcdFx0XHRyZXR1cm4gJ3JlcGVhdCc7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIHdyYXA6ICR7U3RyaW5nKHdyYXApfWApO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgdG9QaXhpQmxlbmRpbmcgKGJsZW5kOiBCbGVuZE1vZGUpOiBCTEVORF9NT0RFUyB7XG5cdFx0c3dpdGNoIChibGVuZCkge1xuXHRcdFx0Y2FzZSBCbGVuZE1vZGUuTm9ybWFsOlxuXHRcdFx0XHRyZXR1cm4gJ25vcm1hbCc7XG5cblx0XHRcdGNhc2UgQmxlbmRNb2RlLkFkZGl0aXZlOlxuXHRcdFx0XHRyZXR1cm4gJ2FkZCc7XG5cblx0XHRcdGNhc2UgQmxlbmRNb2RlLk11bHRpcGx5OlxuXHRcdFx0XHRyZXR1cm4gJ211bHRpcGx5JztcblxuXHRcdFx0Y2FzZSBCbGVuZE1vZGUuU2NyZWVuOlxuXHRcdFx0XHRyZXR1cm4gJ3NjcmVlbic7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biBibGVuZE1vZGU6ICR7U3RyaW5nKGJsZW5kKX1gKTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==