@eva/spine-base 2.0.0 → 2.0.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -175,39 +175,6 @@ var _EVA_IIFE_spineBase = function (exports, eva_js, pluginRenderer, pixi_js) {
175
175
  __decorate([type('number')], Spine.prototype, "scale", void 0);
176
176
  __decorate([type('string')], Spine.prototype, "animationName", void 0);
177
177
  __decorate([type('boolean')], Spine.prototype, "autoPlay", void 0);
178
- let texCache = {};
179
- function cacheImage(data) {
180
- const oldImg = data.image;
181
- return {
182
- tex: oldImg instanceof pixi_js.Texture ? oldImg : pixi_js.Texture.from(oldImg),
183
- count: 0
184
- };
185
- }
186
- function retainTexture(name, data) {
187
- let cache = texCache[name];
188
- if (!cache) {
189
- cache = cacheImage(data);
190
- texCache[name] = cache;
191
- }
192
- cache.count++;
193
- return cache.tex;
194
- }
195
- function releaseTexture(imageSrc) {
196
- if (!imageSrc) return;
197
- setTimeout(() => {
198
- const cache = texCache[imageSrc];
199
- if (cache) {
200
- cache.count--;
201
- if (cache.count <= 0) {
202
- if (cache.tex) {
203
- cache.tex.destroy(true);
204
- cache.tex = null;
205
- }
206
- delete texCache[imageSrc];
207
- }
208
- }
209
- }, 100);
210
- }
211
178
  let dataMap = {};
212
179
  function createSpineData(name, data, scale, pixiSpine) {
213
180
  const skeletonAsset = data.ske;
@@ -234,21 +201,31 @@ var _EVA_IIFE_spineBase = function (exports, eva_js, pluginRenderer, pixi_js) {
234
201
  return;
235
202
  }
236
203
  }
237
- retainTexture(res.data.image.label, res.data);
238
204
  data.ref++;
239
205
  return data.spineData;
240
206
  });
241
207
  }
242
- function releaseSpineData(resourceName, imageSrc) {
208
+ function releaseSpineData(res, _imageSrc) {
209
+ const resourceName = res.name;
243
210
  const data = dataMap[resourceName];
244
211
  if (!data) {
245
212
  return;
246
213
  }
247
214
  data.ref--;
248
- if (data.ref <= 0) {
249
- releaseTexture(imageSrc);
250
- delete dataMap[resourceName];
251
- }
215
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
216
+ if (data.ref <= 0) {
217
+ yield pixi_js.Assets.unload([res.src.image.url, res.src.atlas.url, res.src.ske.url]);
218
+ const resolver = pixi_js.Assets.resolver;
219
+ delete resolver._assetMap[res.src.image.url];
220
+ delete resolver._assetMap[res.src.atlas.url];
221
+ delete resolver._assetMap[res.src.ske.url];
222
+ delete resolver._resolverHash[res.src.image.url];
223
+ delete resolver._resolverHash[res.src.atlas.url];
224
+ delete resolver._resolverHash[res.src.ske.url];
225
+ eva_js.resource.destroy(resourceName);
226
+ delete dataMap[resourceName];
227
+ }
228
+ }), 100);
252
229
  }
253
230
  const MaxRetryCount = 20;
254
231
  let SpineSystem = class SpineSystem extends pluginRenderer.Renderer {
@@ -419,7 +396,8 @@ var _EVA_IIFE_spineBase = function (exports, eva_js, pluginRenderer, pixi_js) {
419
396
  children: true
420
397
  });
421
398
  const res = yield eva_js.resource.getResource(component.lastResource);
422
- releaseSpineData(res.name, ((_d = (_c = res.data) === null || _c === void 0 ? void 0 : _c.image) === null || _d === void 0 ? void 0 : _d.src) || ((_f = (_e = res.data) === null || _e === void 0 ? void 0 : _e.image) === null || _f === void 0 ? void 0 : _f.label));
399
+ ((_d = (_c = res.data) === null || _c === void 0 ? void 0 : _c.image) === null || _d === void 0 ? void 0 : _d.src) || ((_f = (_e = res.data) === null || _e === void 0 ? void 0 : _e.image) === null || _f === void 0 ? void 0 : _f.label);
400
+ yield releaseSpineData(res);
423
401
  }
424
402
  component.armature = null;
425
403
  delete this.armatures[changed.gameObject.id];
@@ -1 +1 @@
1
- function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)({}).hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},_extends.apply(null,arguments)}globalThis.EVA=globalThis.EVA||{},globalThis.EVA.plugin=globalThis.EVA.plugin||{};var _EVA_IIFE_spineBase=function(e,t,n,a){"use strict";function i(e,t,n,a){var i,r=arguments.length,o=r<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,n):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,a);else for(var s=e.length-1;s>=0;s--)(i=e[s])&&(o=(r<3?i(o):r>3?i(t,n,o):i(t,n))||o);return r>3&&o&&Object.defineProperty(t,n,o),o}function r(e,t,n,a){return new(n||(n=Promise))((function(i,r){function o(e){try{c(a.next(e))}catch(e){r(e)}}function s(e){try{c(a.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,s)}c((a=a.apply(e,t||[])).next())}))}function o(e){return function(t,n){var a=function(e,t){return e.constructor.IDEProps||(e.constructor.IDEProps={}),e.constructor.IDEProps[t]||(e.constructor.IDEProps[t]={}),e.constructor.IDEProps[t]}(t,n);a.key=n,a.type=e}}class s extends t.Component{constructor(){super(...arguments),this.resource="",this.scale=1,this.animationName="",this.autoPlay=!0,this.waitExecuteInfos=[]}set armature(e){if(this._armature=e,e){this.autoPlay&&this.play(this.animationName);for(const e of this.waitExecuteInfos)if(e.playType){const{name:t,loop:n,track:a}=e;this.play(t,n,a)}else this.stop(e.track);this.waitExecuteInfos=[]}}get armature(){return this._armature}init(e){e&&_extends(this,e)}onDestroy(){this.destroied=!0}play(e,t,n){try{e&&(this.animationName=e),this.armature?(void 0===n&&(n=0),this.armature.state.setAnimation(n,this.animationName,t)):this.waitExecuteInfos.push({playType:!0,name:e,loop:null!=t?t:this.autoPlay,track:n})}catch(e){console.log(e)}}stop(e){this.armature?(void 0===e&&(e=0),this.armature.state.setEmptyAnimation(e,0)):this.waitExecuteInfos.push({playType:!1,track:e})}addAnimation(e,t,n,a){try{this.armature&&(void 0===a&&(a=0),this.armature.state.addAnimation(a,e,n,t))}catch(e){console.log(e)}}setMix(e,t,n){this.armature&&this.armature.state.data.setMix(e,t,n)}getAnim(e=0){try{if(this.armature)return this.armature.state.tracks[e].animation.name}catch(e){console.log(e)}}setDefaultMix(e){this.armature&&(this.armature.state.data.defaultMix=e)}setAttachment(e,t){this.armature&&this.armature.skeleton.setAttachment(e,t)}getBone(e){if(this.armature)return this.armature.skeleton.findBone(e)}}s.componentName="Spine",i([o("string")],s.prototype,"resource",void 0),i([o("number")],s.prototype,"scale",void 0),i([o("string")],s.prototype,"animationName",void 0),i([o("boolean")],s.prototype,"autoPlay",void 0);let c={};function u(e,t){let n=c[e];return n||(n=function(e){const t=e.image;return{tex:t instanceof a.Texture?t:a.Texture.from(t),count:0}}(t),c[e]=n),n.count++,n.tex}let m={};function l(e,t,n){return r(this,void 0,void 0,(function*(){let a=m[e.name];if(!a)if(e.complete)a=function(e,t,n,a){const i=t.ske,r=t.atlas,o=new a.AtlasAttachmentLoader(r),s=i instanceof Uint8Array?new a.SkeletonBinary(o):new a.SkeletonJson(o);s.scale=n||1;const c={spineData:s.readSkeletonData(i),ref:0,imageSrc:t.image.label};return m[e]=c,c}(e.name,e.data,t,n);else if(!a)return;return u(e.data.image.label,e.data),a.ref++,a.spineData}))}function d(e,t){const n=m[e];n&&(n.ref--,n.ref<=0&&(!function(e){e&&setTimeout((()=>{const t=c[e];t&&(t.count--,t.count<=0&&(t.tex&&(t.tex.destroy(!0),t.tex=null),delete c[e]))}),100)}(t),delete m[e]))}let h=class extends n.Renderer{constructor(){super(...arguments),this.armatures={}}init({pixiSpine:e}){this.renderSystem=this.game.getSystem(n.RendererSystem),this.renderSystem.rendererManager.register(this),this.pixiSpine=e,this.game.canvas.addEventListener("webglcontextrestored",(()=>{const e=this.game.gameObjects;let n=[];for(let a in this.armatures){const i=+a;for(let a=0;a<e.length;++a){let r=e[a];if(r.id===i){let e=r.getComponent(s);e&&(this.remove({type:t.OBSERVER_TYPE.REMOVE,gameObject:r,component:e,componentName:s.componentName}),n.push({type:t.OBSERVER_TYPE.ADD,gameObject:r,component:e,componentName:s.componentName}));break}}}setTimeout((()=>{n.forEach((e=>{this.add(e)}))}),1e3)}),!1)}update(e){for(let t in this.armatures)this.armatures[t].update(.001*e.deltaTime);super.update()}componentChanged(e){return r(this,void 0,void 0,(function*(){if("Spine"===e.componentName)if(e.type===t.OBSERVER_TYPE.ADD)this.add(e);else if(e.type===t.OBSERVER_TYPE.CHANGE){if("resource"===e.prop.prop[0])this.change(e)}else e.type===t.OBSERVER_TYPE.REMOVE&&this.remove(e)}))}add(e,n){var a,i;return r(this,void 0,void 0,(function*(){const r=e.component;clearTimeout(r.addHandler);const o=e.gameObject.id,s=this.increaseAsyncId(o),c=yield t.resource.getResource(r.resource);if(!this.validateAsyncId(o,s))return;const u=yield l(c,r.scale,this.pixiSpine);if(!this.validateAsyncId(o,s))return;if(!u)return void(r.addHandler=setTimeout((()=>{r.destroied||(void 0===n&&(n=20),--n>0?this.add(e,n):console.log("retry exceed max times",r.resource))}),1e3));this.remove(e);const m=null===(i=null===(a=this.renderSystem)||void 0===a?void 0:a.containerManager)||void 0===i?void 0:i.getContainer(e.gameObject.id);if(!m)return;r.lastResource=r.resource;const d=new this.pixiSpine.Spine({skeletonData:u,autoUpdate:!1});if(this.armatures[e.gameObject.id]=d,e.gameObject&&e.gameObject.transform){const t=e.gameObject.transform;d.x=t.size.width*t.origin.x,d.y=t.size.height*t.origin.y}m.addChildAt(d,0),d.update(),r.armature=d,r.emit("loaded",{resource:r.resource}),d.state.addListener({start:(e,t)=>{r.emit("start",{track:e,name:e.animation.name})},complete:(e,t)=>{r.emit("complete",{track:e,name:e.animation.name})},interrupt:(e,t)=>{r.emit("interrupt",{track:e,name:e.animation.name})},end:(e,t)=>{r.emit("end",{track:e,name:e.animation.name})},event:(e,t)=>{r.emit("event",e,t)}})}))}change(e){this.remove(e),this.add(e)}remove(e){var n,a,i,o,s,c;return r(this,void 0,void 0,(function*(){this.increaseAsyncId(e.gameObject.id);const r=e.component;clearTimeout(r.addHandler);const u=this.armatures[e.gameObject.id],m=null===(a=null===(n=this.renderSystem)||void 0===n?void 0:n.containerManager)||void 0===a?void 0:a.getContainer(e.gameObject.id);if(m&&u&&m.removeChild(u),r.armature){r.armature.destroy({children:!0});const e=yield t.resource.getResource(r.lastResource);d(e.name,(null===(o=null===(i=e.data)||void 0===i?void 0:i.image)||void 0===o?void 0:o.src)||(null===(c=null===(s=e.data)||void 0===s?void 0:s.image)||void 0===c?void 0:c.label))}r.armature=null,delete this.armatures[e.gameObject.id],e.type,t.OBSERVER_TYPE.CHANGE}))}};h.systemName="SpineSystem",h=i([t.decorators.componentObserver({Spine:["resource"]})],h);var p=h;return t.resource.registerResourceType("SPINE"),e.Spine=s,e.SpineSystem=p,Object.defineProperty(e,"__esModule",{value:!0}),e}({},EVA,EVA.plugin.renderer,PIXI);globalThis.EVA.plugin.spineBase=globalThis.EVA.plugin.spineBase||_EVA_IIFE_spineBase;
1
+ function _extends(){return _extends=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)({}).hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},_extends.apply(null,arguments)}globalThis.EVA=globalThis.EVA||{},globalThis.EVA.plugin=globalThis.EVA.plugin||{};var _EVA_IIFE_spineBase=function(e,t,r,a){"use strict";function n(e,t,r,a){var n,i=arguments.length,s=i<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,r):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,a);else for(var o=e.length-1;o>=0;o--)(n=e[o])&&(s=(i<3?n(s):i>3?n(t,r,s):n(t,r))||s);return i>3&&s&&Object.defineProperty(t,r,s),s}function i(e,t,r,a){return new(r||(r=Promise))((function(n,i){function s(e){try{c(a.next(e))}catch(e){i(e)}}function o(e){try{c(a.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(s,o)}c((a=a.apply(e,t||[])).next())}))}function s(e){return function(t,r){var a=function(e,t){return e.constructor.IDEProps||(e.constructor.IDEProps={}),e.constructor.IDEProps[t]||(e.constructor.IDEProps[t]={}),e.constructor.IDEProps[t]}(t,r);a.key=r,a.type=e}}class o extends t.Component{constructor(){super(...arguments),this.resource="",this.scale=1,this.animationName="",this.autoPlay=!0,this.waitExecuteInfos=[]}set armature(e){if(this._armature=e,e){this.autoPlay&&this.play(this.animationName);for(const e of this.waitExecuteInfos)if(e.playType){const{name:t,loop:r,track:a}=e;this.play(t,r,a)}else this.stop(e.track);this.waitExecuteInfos=[]}}get armature(){return this._armature}init(e){e&&_extends(this,e)}onDestroy(){this.destroied=!0}play(e,t,r){try{e&&(this.animationName=e),this.armature?(void 0===r&&(r=0),this.armature.state.setAnimation(r,this.animationName,t)):this.waitExecuteInfos.push({playType:!0,name:e,loop:null!=t?t:this.autoPlay,track:r})}catch(e){console.log(e)}}stop(e){this.armature?(void 0===e&&(e=0),this.armature.state.setEmptyAnimation(e,0)):this.waitExecuteInfos.push({playType:!1,track:e})}addAnimation(e,t,r,a){try{this.armature&&(void 0===a&&(a=0),this.armature.state.addAnimation(a,e,r,t))}catch(e){console.log(e)}}setMix(e,t,r){this.armature&&this.armature.state.data.setMix(e,t,r)}getAnim(e=0){try{if(this.armature)return this.armature.state.tracks[e].animation.name}catch(e){console.log(e)}}setDefaultMix(e){this.armature&&(this.armature.state.data.defaultMix=e)}setAttachment(e,t){this.armature&&this.armature.skeleton.setAttachment(e,t)}getBone(e){if(this.armature)return this.armature.skeleton.findBone(e)}}o.componentName="Spine",n([s("string")],o.prototype,"resource",void 0),n([s("number")],o.prototype,"scale",void 0),n([s("string")],o.prototype,"animationName",void 0),n([s("boolean")],o.prototype,"autoPlay",void 0);let c={};function u(e,t,r){return i(this,void 0,void 0,(function*(){let a=c[e.name];if(!a)if(e.complete)a=function(e,t,r,a){const n=t.ske,i=t.atlas,s=new a.AtlasAttachmentLoader(i),o=n instanceof Uint8Array?new a.SkeletonBinary(s):new a.SkeletonJson(s);o.scale=r||1;const u={spineData:o.readSkeletonData(n),ref:0,imageSrc:t.image.label};return c[e]=u,u}(e.name,e.data,t,r);else if(!a)return;return a.ref++,a.spineData}))}let l=class extends r.Renderer{constructor(){super(...arguments),this.armatures={}}init({pixiSpine:e}){this.renderSystem=this.game.getSystem(r.RendererSystem),this.renderSystem.rendererManager.register(this),this.pixiSpine=e,this.game.canvas.addEventListener("webglcontextrestored",(()=>{const e=this.game.gameObjects;let r=[];for(let a in this.armatures){const n=+a;for(let a=0;a<e.length;++a){let i=e[a];if(i.id===n){let e=i.getComponent(o);e&&(this.remove({type:t.OBSERVER_TYPE.REMOVE,gameObject:i,component:e,componentName:o.componentName}),r.push({type:t.OBSERVER_TYPE.ADD,gameObject:i,component:e,componentName:o.componentName}));break}}}setTimeout((()=>{r.forEach((e=>{this.add(e)}))}),1e3)}),!1)}update(e){for(let t in this.armatures)this.armatures[t].update(.001*e.deltaTime);super.update()}componentChanged(e){return i(this,void 0,void 0,(function*(){if("Spine"===e.componentName)if(e.type===t.OBSERVER_TYPE.ADD)this.add(e);else if(e.type===t.OBSERVER_TYPE.CHANGE){if("resource"===e.prop.prop[0])this.change(e)}else e.type===t.OBSERVER_TYPE.REMOVE&&this.remove(e)}))}add(e,r){var a,n;return i(this,void 0,void 0,(function*(){const i=e.component;clearTimeout(i.addHandler);const s=e.gameObject.id,o=this.increaseAsyncId(s),c=yield t.resource.getResource(i.resource);if(!this.validateAsyncId(s,o))return;const l=yield u(c,i.scale,this.pixiSpine);if(!this.validateAsyncId(s,o))return;if(!l)return void(i.addHandler=setTimeout((()=>{i.destroied||(void 0===r&&(r=20),--r>0?this.add(e,r):console.log("retry exceed max times",i.resource))}),1e3));this.remove(e);const m=null===(n=null===(a=this.renderSystem)||void 0===a?void 0:a.containerManager)||void 0===n?void 0:n.getContainer(e.gameObject.id);if(!m)return;i.lastResource=i.resource;const d=new this.pixiSpine.Spine({skeletonData:l,autoUpdate:!1});if(this.armatures[e.gameObject.id]=d,e.gameObject&&e.gameObject.transform){const t=e.gameObject.transform;d.x=t.size.width*t.origin.x,d.y=t.size.height*t.origin.y}m.addChildAt(d,0),d.update(),i.armature=d,i.emit("loaded",{resource:i.resource}),d.state.addListener({start:(e,t)=>{i.emit("start",{track:e,name:e.animation.name})},complete:(e,t)=>{i.emit("complete",{track:e,name:e.animation.name})},interrupt:(e,t)=>{i.emit("interrupt",{track:e,name:e.animation.name})},end:(e,t)=>{i.emit("end",{track:e,name:e.animation.name})},event:(e,t)=>{i.emit("event",e,t)}})}))}change(e){this.remove(e),this.add(e)}remove(e){var r,n,s,o,u,l;return i(this,void 0,void 0,(function*(){this.increaseAsyncId(e.gameObject.id);const m=e.component;clearTimeout(m.addHandler);const d=this.armatures[e.gameObject.id],h=null===(n=null===(r=this.renderSystem)||void 0===r?void 0:r.containerManager)||void 0===n?void 0:n.getContainer(e.gameObject.id);if(h&&d&&h.removeChild(d),m.armature){m.armature.destroy({children:!0});const e=yield t.resource.getResource(m.lastResource);(null===(o=null===(s=e.data)||void 0===s?void 0:s.image)||void 0===o?void 0:o.src)||null===(l=null===(u=e.data)||void 0===u?void 0:u.image)||void 0===l||l.label,yield function(e){const r=e.name,n=c[r];n&&(n.ref--,setTimeout((()=>i(this,void 0,void 0,(function*(){if(n.ref<=0){yield a.Assets.unload([e.src.image.url,e.src.atlas.url,e.src.ske.url]);const n=a.Assets.resolver;delete n._assetMap[e.src.image.url],delete n._assetMap[e.src.atlas.url],delete n._assetMap[e.src.ske.url],delete n._resolverHash[e.src.image.url],delete n._resolverHash[e.src.atlas.url],delete n._resolverHash[e.src.ske.url],t.resource.destroy(r),delete c[r]}}))),100))}(e)}m.armature=null,delete this.armatures[e.gameObject.id],e.type,t.OBSERVER_TYPE.CHANGE}))}};l.systemName="SpineSystem",l=n([t.decorators.componentObserver({Spine:["resource"]})],l);var m=l;return t.resource.registerResourceType("SPINE"),e.Spine=o,e.SpineSystem=m,Object.defineProperty(e,"__esModule",{value:!0}),e}({},EVA,EVA.plugin.renderer,PIXI);globalThis.EVA.plugin.spineBase=globalThis.EVA.plugin.spineBase||_EVA_IIFE_spineBase;
@@ -178,41 +178,6 @@ __decorate([
178
178
  inspectorDecorator.type('boolean')
179
179
  ], Spine.prototype, "autoPlay", void 0);
180
180
 
181
- let texCache = {};
182
- function cacheImage(data) {
183
- const oldImg = data.image;
184
- return {
185
- tex: oldImg instanceof pixi_js.Texture ? oldImg : pixi_js.Texture.from(oldImg),
186
- count: 0,
187
- };
188
- }
189
- function retainTexture(name, data) {
190
- let cache = texCache[name];
191
- if (!cache) {
192
- cache = cacheImage(data);
193
- texCache[name] = cache;
194
- }
195
- cache.count++;
196
- return cache.tex;
197
- }
198
- function releaseTexture(imageSrc) {
199
- if (!imageSrc)
200
- return;
201
- setTimeout(() => {
202
- const cache = texCache[imageSrc];
203
- if (cache) {
204
- cache.count--;
205
- if (cache.count <= 0) {
206
- if (cache.tex) {
207
- cache.tex.destroy(true);
208
- cache.tex = null;
209
- }
210
- delete texCache[imageSrc];
211
- }
212
- }
213
- }, 100);
214
- }
215
-
216
181
  let dataMap = {};
217
182
  function createSpineData(name, data, scale, pixiSpine) {
218
183
  const skeletonAsset = data.ske;
@@ -238,21 +203,31 @@ function getSpineData(res, scale, pixiSpine) {
238
203
  return;
239
204
  }
240
205
  }
241
- retainTexture(res.data.image.label, res.data);
242
206
  data.ref++;
243
207
  return data.spineData;
244
208
  });
245
209
  }
246
- function releaseSpineData(resourceName, imageSrc) {
210
+ function releaseSpineData(res, _imageSrc) {
211
+ const resourceName = res.name;
247
212
  const data = dataMap[resourceName];
248
213
  if (!data) {
249
214
  return;
250
215
  }
251
216
  data.ref--;
252
- if (data.ref <= 0) {
253
- releaseTexture(imageSrc);
254
- delete dataMap[resourceName];
255
- }
217
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
218
+ if (data.ref <= 0) {
219
+ yield pixi_js.Assets.unload([res.src.image.url, res.src.atlas.url, res.src.ske.url]);
220
+ const resolver = pixi_js.Assets.resolver;
221
+ delete resolver._assetMap[res.src.image.url];
222
+ delete resolver._assetMap[res.src.atlas.url];
223
+ delete resolver._assetMap[res.src.ske.url];
224
+ delete resolver._resolverHash[res.src.image.url];
225
+ delete resolver._resolverHash[res.src.atlas.url];
226
+ delete resolver._resolverHash[res.src.ske.url];
227
+ eva_js.resource.destroy(resourceName);
228
+ delete dataMap[resourceName];
229
+ }
230
+ }), 100);
256
231
  }
257
232
 
258
233
  const MaxRetryCount = 20;
@@ -411,7 +386,8 @@ let SpineSystem = class SpineSystem extends pluginRenderer.Renderer {
411
386
  if (component.armature) {
412
387
  component.armature.destroy({ children: true });
413
388
  const res = yield eva_js.resource.getResource(component.lastResource);
414
- releaseSpineData(res.name, ((_d = (_c = res.data) === null || _c === void 0 ? void 0 : _c.image) === null || _d === void 0 ? void 0 : _d.src) || ((_f = (_e = res.data) === null || _e === void 0 ? void 0 : _e.image) === null || _f === void 0 ? void 0 : _f.label));
389
+ ((_d = (_c = res.data) === null || _c === void 0 ? void 0 : _c.image) === null || _d === void 0 ? void 0 : _d.src) || ((_f = (_e = res.data) === null || _e === void 0 ? void 0 : _e.image) === null || _f === void 0 ? void 0 : _f.label);
390
+ yield releaseSpineData(res);
415
391
  }
416
392
  component.armature = null;
417
393
  delete this.armatures[changed.gameObject.id];
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@eva/eva.js"),t=require("@eva/plugin-renderer"),a=require("@eva/inspector-decorator"),i=require("pixi.js");
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@eva/eva.js"),t=require("@eva/plugin-renderer"),a=require("@eva/inspector-decorator"),r=require("pixi.js");
2
2
  /*! *****************************************************************************
3
3
  Copyright (c) Microsoft Corporation. All rights reserved.
4
4
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use
@@ -13,4 +13,4 @@ MERCHANTABLITY OR NON-INFRINGEMENT.
13
13
  See the Apache Version 2.0 License for specific language governing permissions
14
14
  and limitations under the License.
15
15
  ***************************************************************************** */
16
- function r(e,t,a,i){var r,n=arguments.length,o=n<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,a,i);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(o=(n<3?r(o):n>3?r(t,a,o):r(t,a))||o);return n>3&&o&&Object.defineProperty(t,a,o),o}function n(e,t,a,i){return new(a||(a=Promise))((function(r,n){function o(e){try{c(i.next(e))}catch(e){n(e)}}function s(e){try{c(i.throw(e))}catch(e){n(e)}}function c(e){e.done?r(e.value):new a((function(t){t(e.value)})).then(o,s)}c((i=i.apply(e,t||[])).next())}))}class o extends e.Component{constructor(){super(...arguments),this.resource="",this.scale=1,this.animationName="",this.autoPlay=!0,this.waitExecuteInfos=[]}set armature(e){if(this._armature=e,e){this.autoPlay&&this.play(this.animationName);for(const e of this.waitExecuteInfos)if(e.playType){const{name:t,loop:a,track:i}=e;this.play(t,a,i)}else this.stop(e.track);this.waitExecuteInfos=[]}}get armature(){return this._armature}init(e){e&&Object.assign(this,e)}onDestroy(){this.destroied=!0}play(e,t,a){try{e&&(this.animationName=e),this.armature?(void 0===a&&(a=0),this.armature.state.setAnimation(a,this.animationName,t)):this.waitExecuteInfos.push({playType:!0,name:e,loop:null!=t?t:this.autoPlay,track:a})}catch(e){console.log(e)}}stop(e){this.armature?(void 0===e&&(e=0),this.armature.state.setEmptyAnimation(e,0)):this.waitExecuteInfos.push({playType:!1,track:e})}addAnimation(e,t,a,i){try{this.armature&&(void 0===i&&(i=0),this.armature.state.addAnimation(i,e,a,t))}catch(e){console.log(e)}}setMix(e,t,a){this.armature&&this.armature.state.data.setMix(e,t,a)}getAnim(e=0){try{if(this.armature)return this.armature.state.tracks[e].animation.name}catch(e){console.log(e)}}setDefaultMix(e){this.armature&&(this.armature.state.data.defaultMix=e)}setAttachment(e,t){this.armature&&this.armature.skeleton.setAttachment(e,t)}getBone(e){if(this.armature)return this.armature.skeleton.findBone(e)}}o.componentName="Spine",r([a.type("string")],o.prototype,"resource",void 0),r([a.type("number")],o.prototype,"scale",void 0),r([a.type("string")],o.prototype,"animationName",void 0),r([a.type("boolean")],o.prototype,"autoPlay",void 0);let s={};function c(e,t){let a=s[e];return a||(a=function(e){const t=e.image;return{tex:t instanceof i.Texture?t:i.Texture.from(t),count:0}}(t),s[e]=a),a.count++,a.tex}let m={};function u(e,t,a){return n(this,void 0,void 0,(function*(){let i=m[e.name];if(!i)if(e.complete)i=function(e,t,a,i){const r=t.ske,n=t.atlas,o=new i.AtlasAttachmentLoader(n),s=r instanceof Uint8Array?new i.SkeletonBinary(o):new i.SkeletonJson(o);s.scale=a||1;const c={spineData:s.readSkeletonData(r),ref:0,imageSrc:t.image.label};return m[e]=c,c}(e.name,e.data,t,a);else if(!i)return;return c(e.data.image.label,e.data),i.ref++,i.spineData}))}function d(e,t){const a=m[e];a&&(a.ref--,a.ref<=0&&(!function(e){e&&setTimeout((()=>{const t=s[e];t&&(t.count--,t.count<=0&&(t.tex&&(t.tex.destroy(!0),t.tex=null),delete s[e]))}),100)}(t),delete m[e]))}let l=class extends t.Renderer{constructor(){super(...arguments),this.armatures={}}init({pixiSpine:a}){this.renderSystem=this.game.getSystem(t.RendererSystem),this.renderSystem.rendererManager.register(this),this.pixiSpine=a,this.game.canvas.addEventListener("webglcontextrestored",(()=>{const t=this.game.gameObjects;let a=[];for(let i in this.armatures){const r=+i;for(let i=0;i<t.length;++i){let n=t[i];if(n.id===r){let t=n.getComponent(o);t&&(this.remove({type:e.OBSERVER_TYPE.REMOVE,gameObject:n,component:t,componentName:o.componentName}),a.push({type:e.OBSERVER_TYPE.ADD,gameObject:n,component:t,componentName:o.componentName}));break}}}setTimeout((()=>{a.forEach((e=>{this.add(e)}))}),1e3)}),!1)}update(e){for(let t in this.armatures)this.armatures[t].update(.001*e.deltaTime);super.update()}componentChanged(t){return n(this,void 0,void 0,(function*(){if("Spine"===t.componentName)if(t.type===e.OBSERVER_TYPE.ADD)this.add(t);else if(t.type===e.OBSERVER_TYPE.CHANGE){if("resource"===t.prop.prop[0])this.change(t)}else t.type===e.OBSERVER_TYPE.REMOVE&&this.remove(t)}))}add(t,a){var i,r;return n(this,void 0,void 0,(function*(){const n=t.component;clearTimeout(n.addHandler);const o=t.gameObject.id,s=this.increaseAsyncId(o),c=yield e.resource.getResource(n.resource);if(!this.validateAsyncId(o,s))return;const m=yield u(c,n.scale,this.pixiSpine);if(!this.validateAsyncId(o,s))return;if(!m)return void(n.addHandler=setTimeout((()=>{n.destroied||(void 0===a&&(a=20),--a>0?this.add(t,a):console.log("retry exceed max times",n.resource))}),1e3));this.remove(t);const d=null===(r=null===(i=this.renderSystem)||void 0===i?void 0:i.containerManager)||void 0===r?void 0:r.getContainer(t.gameObject.id);if(!d)return;n.lastResource=n.resource;const l=new this.pixiSpine.Spine({skeletonData:m,autoUpdate:!1});if(this.armatures[t.gameObject.id]=l,t.gameObject&&t.gameObject.transform){const e=t.gameObject.transform;l.x=e.size.width*e.origin.x,l.y=e.size.height*e.origin.y}d.addChildAt(l,0),l.update(),n.armature=l,n.emit("loaded",{resource:n.resource}),l.state.addListener({start:(e,t)=>{n.emit("start",{track:e,name:e.animation.name})},complete:(e,t)=>{n.emit("complete",{track:e,name:e.animation.name})},interrupt:(e,t)=>{n.emit("interrupt",{track:e,name:e.animation.name})},end:(e,t)=>{n.emit("end",{track:e,name:e.animation.name})},event:(e,t)=>{n.emit("event",e,t)}})}))}change(e){this.remove(e),this.add(e)}remove(t){var a,i,r,o,s,c;return n(this,void 0,void 0,(function*(){this.increaseAsyncId(t.gameObject.id);const n=t.component;clearTimeout(n.addHandler);const m=this.armatures[t.gameObject.id],u=null===(i=null===(a=this.renderSystem)||void 0===a?void 0:a.containerManager)||void 0===i?void 0:i.getContainer(t.gameObject.id);if(u&&m&&u.removeChild(m),n.armature){n.armature.destroy({children:!0});const t=yield e.resource.getResource(n.lastResource);d(t.name,(null===(o=null===(r=t.data)||void 0===r?void 0:r.image)||void 0===o?void 0:o.src)||(null===(c=null===(s=t.data)||void 0===s?void 0:s.image)||void 0===c?void 0:c.label))}n.armature=null,delete this.armatures[t.gameObject.id],t.type,e.OBSERVER_TYPE.CHANGE}))}};l.systemName="SpineSystem",l=r([e.decorators.componentObserver({Spine:["resource"]})],l);var h=l;e.resource.registerResourceType("SPINE"),exports.Spine=o,exports.SpineSystem=h;
16
+ function i(e,t,a,r){var i,s=arguments.length,n=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,a):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,a,r);else for(var o=e.length-1;o>=0;o--)(i=e[o])&&(n=(s<3?i(n):s>3?i(t,a,n):i(t,a))||n);return s>3&&n&&Object.defineProperty(t,a,n),n}function s(e,t,a,r){return new(a||(a=Promise))((function(i,s){function n(e){try{c(r.next(e))}catch(e){s(e)}}function o(e){try{c(r.throw(e))}catch(e){s(e)}}function c(e){e.done?i(e.value):new a((function(t){t(e.value)})).then(n,o)}c((r=r.apply(e,t||[])).next())}))}class n extends e.Component{constructor(){super(...arguments),this.resource="",this.scale=1,this.animationName="",this.autoPlay=!0,this.waitExecuteInfos=[]}set armature(e){if(this._armature=e,e){this.autoPlay&&this.play(this.animationName);for(const e of this.waitExecuteInfos)if(e.playType){const{name:t,loop:a,track:r}=e;this.play(t,a,r)}else this.stop(e.track);this.waitExecuteInfos=[]}}get armature(){return this._armature}init(e){e&&Object.assign(this,e)}onDestroy(){this.destroied=!0}play(e,t,a){try{e&&(this.animationName=e),this.armature?(void 0===a&&(a=0),this.armature.state.setAnimation(a,this.animationName,t)):this.waitExecuteInfos.push({playType:!0,name:e,loop:null!=t?t:this.autoPlay,track:a})}catch(e){console.log(e)}}stop(e){this.armature?(void 0===e&&(e=0),this.armature.state.setEmptyAnimation(e,0)):this.waitExecuteInfos.push({playType:!1,track:e})}addAnimation(e,t,a,r){try{this.armature&&(void 0===r&&(r=0),this.armature.state.addAnimation(r,e,a,t))}catch(e){console.log(e)}}setMix(e,t,a){this.armature&&this.armature.state.data.setMix(e,t,a)}getAnim(e=0){try{if(this.armature)return this.armature.state.tracks[e].animation.name}catch(e){console.log(e)}}setDefaultMix(e){this.armature&&(this.armature.state.data.defaultMix=e)}setAttachment(e,t){this.armature&&this.armature.skeleton.setAttachment(e,t)}getBone(e){if(this.armature)return this.armature.skeleton.findBone(e)}}n.componentName="Spine",i([a.type("string")],n.prototype,"resource",void 0),i([a.type("number")],n.prototype,"scale",void 0),i([a.type("string")],n.prototype,"animationName",void 0),i([a.type("boolean")],n.prototype,"autoPlay",void 0);let o={};function c(e,t,a){return s(this,void 0,void 0,(function*(){let r=o[e.name];if(!r)if(e.complete)r=function(e,t,a,r){const i=t.ske,s=t.atlas,n=new r.AtlasAttachmentLoader(s),c=i instanceof Uint8Array?new r.SkeletonBinary(n):new r.SkeletonJson(n);c.scale=a||1;const m={spineData:c.readSkeletonData(i),ref:0,imageSrc:t.image.label};return o[e]=m,m}(e.name,e.data,t,a);else if(!r)return;return r.ref++,r.spineData}))}let m=class extends t.Renderer{constructor(){super(...arguments),this.armatures={}}init({pixiSpine:a}){this.renderSystem=this.game.getSystem(t.RendererSystem),this.renderSystem.rendererManager.register(this),this.pixiSpine=a,this.game.canvas.addEventListener("webglcontextrestored",(()=>{const t=this.game.gameObjects;let a=[];for(let r in this.armatures){const i=+r;for(let r=0;r<t.length;++r){let s=t[r];if(s.id===i){let t=s.getComponent(n);t&&(this.remove({type:e.OBSERVER_TYPE.REMOVE,gameObject:s,component:t,componentName:n.componentName}),a.push({type:e.OBSERVER_TYPE.ADD,gameObject:s,component:t,componentName:n.componentName}));break}}}setTimeout((()=>{a.forEach((e=>{this.add(e)}))}),1e3)}),!1)}update(e){for(let t in this.armatures)this.armatures[t].update(.001*e.deltaTime);super.update()}componentChanged(t){return s(this,void 0,void 0,(function*(){if("Spine"===t.componentName)if(t.type===e.OBSERVER_TYPE.ADD)this.add(t);else if(t.type===e.OBSERVER_TYPE.CHANGE){if("resource"===t.prop.prop[0])this.change(t)}else t.type===e.OBSERVER_TYPE.REMOVE&&this.remove(t)}))}add(t,a){var r,i;return s(this,void 0,void 0,(function*(){const s=t.component;clearTimeout(s.addHandler);const n=t.gameObject.id,o=this.increaseAsyncId(n),m=yield e.resource.getResource(s.resource);if(!this.validateAsyncId(n,o))return;const u=yield c(m,s.scale,this.pixiSpine);if(!this.validateAsyncId(n,o))return;if(!u)return void(s.addHandler=setTimeout((()=>{s.destroied||(void 0===a&&(a=20),--a>0?this.add(t,a):console.log("retry exceed max times",s.resource))}),1e3));this.remove(t);const d=null===(i=null===(r=this.renderSystem)||void 0===r?void 0:r.containerManager)||void 0===i?void 0:i.getContainer(t.gameObject.id);if(!d)return;s.lastResource=s.resource;const l=new this.pixiSpine.Spine({skeletonData:u,autoUpdate:!1});if(this.armatures[t.gameObject.id]=l,t.gameObject&&t.gameObject.transform){const e=t.gameObject.transform;l.x=e.size.width*e.origin.x,l.y=e.size.height*e.origin.y}d.addChildAt(l,0),l.update(),s.armature=l,s.emit("loaded",{resource:s.resource}),l.state.addListener({start:(e,t)=>{s.emit("start",{track:e,name:e.animation.name})},complete:(e,t)=>{s.emit("complete",{track:e,name:e.animation.name})},interrupt:(e,t)=>{s.emit("interrupt",{track:e,name:e.animation.name})},end:(e,t)=>{s.emit("end",{track:e,name:e.animation.name})},event:(e,t)=>{s.emit("event",e,t)}})}))}change(e){this.remove(e),this.add(e)}remove(t){var a,i,n,c,m,u;return s(this,void 0,void 0,(function*(){this.increaseAsyncId(t.gameObject.id);const d=t.component;clearTimeout(d.addHandler);const l=this.armatures[t.gameObject.id],h=null===(i=null===(a=this.renderSystem)||void 0===a?void 0:a.containerManager)||void 0===i?void 0:i.getContainer(t.gameObject.id);if(h&&l&&h.removeChild(l),d.armature){d.armature.destroy({children:!0});const t=yield e.resource.getResource(d.lastResource);(null===(c=null===(n=t.data)||void 0===n?void 0:n.image)||void 0===c?void 0:c.src)||null===(u=null===(m=t.data)||void 0===m?void 0:m.image)||void 0===u||u.label,yield function(t){const a=t.name,i=o[a];i&&(i.ref--,setTimeout((()=>s(this,void 0,void 0,(function*(){if(i.ref<=0){yield r.Assets.unload([t.src.image.url,t.src.atlas.url,t.src.ske.url]);const i=r.Assets.resolver;delete i._assetMap[t.src.image.url],delete i._assetMap[t.src.atlas.url],delete i._assetMap[t.src.ske.url],delete i._resolverHash[t.src.image.url],delete i._resolverHash[t.src.atlas.url],delete i._resolverHash[t.src.ske.url],e.resource.destroy(a),delete o[a]}}))),100))}(t)}d.armature=null,delete this.armatures[t.gameObject.id],t.type,e.OBSERVER_TYPE.CHANGE}))}};m.systemName="SpineSystem",m=i([e.decorators.componentObserver({Spine:["resource"]})],m);var u=m;e.resource.registerResourceType("SPINE"),exports.Spine=n,exports.SpineSystem=u;
@@ -1,7 +1,7 @@
1
- import { Component, OBSERVER_TYPE, decorators, resource } from '@eva/eva.js';
1
+ import { Component, resource, OBSERVER_TYPE, decorators } from '@eva/eva.js';
2
2
  import { Renderer, RendererSystem } from '@eva/plugin-renderer';
3
3
  import { type } from '@eva/inspector-decorator';
4
- import { Texture } from 'pixi.js';
4
+ import { Assets } from 'pixi.js';
5
5
 
6
6
  /*! *****************************************************************************
7
7
  Copyright (c) Microsoft Corporation. All rights reserved.
@@ -174,41 +174,6 @@ __decorate([
174
174
  type('boolean')
175
175
  ], Spine.prototype, "autoPlay", void 0);
176
176
 
177
- let texCache = {};
178
- function cacheImage(data) {
179
- const oldImg = data.image;
180
- return {
181
- tex: oldImg instanceof Texture ? oldImg : Texture.from(oldImg),
182
- count: 0,
183
- };
184
- }
185
- function retainTexture(name, data) {
186
- let cache = texCache[name];
187
- if (!cache) {
188
- cache = cacheImage(data);
189
- texCache[name] = cache;
190
- }
191
- cache.count++;
192
- return cache.tex;
193
- }
194
- function releaseTexture(imageSrc) {
195
- if (!imageSrc)
196
- return;
197
- setTimeout(() => {
198
- const cache = texCache[imageSrc];
199
- if (cache) {
200
- cache.count--;
201
- if (cache.count <= 0) {
202
- if (cache.tex) {
203
- cache.tex.destroy(true);
204
- cache.tex = null;
205
- }
206
- delete texCache[imageSrc];
207
- }
208
- }
209
- }, 100);
210
- }
211
-
212
177
  let dataMap = {};
213
178
  function createSpineData(name, data, scale, pixiSpine) {
214
179
  const skeletonAsset = data.ske;
@@ -234,21 +199,31 @@ function getSpineData(res, scale, pixiSpine) {
234
199
  return;
235
200
  }
236
201
  }
237
- retainTexture(res.data.image.label, res.data);
238
202
  data.ref++;
239
203
  return data.spineData;
240
204
  });
241
205
  }
242
- function releaseSpineData(resourceName, imageSrc) {
206
+ function releaseSpineData(res, _imageSrc) {
207
+ const resourceName = res.name;
243
208
  const data = dataMap[resourceName];
244
209
  if (!data) {
245
210
  return;
246
211
  }
247
212
  data.ref--;
248
- if (data.ref <= 0) {
249
- releaseTexture(imageSrc);
250
- delete dataMap[resourceName];
251
- }
213
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
214
+ if (data.ref <= 0) {
215
+ yield Assets.unload([res.src.image.url, res.src.atlas.url, res.src.ske.url]);
216
+ const resolver = Assets.resolver;
217
+ delete resolver._assetMap[res.src.image.url];
218
+ delete resolver._assetMap[res.src.atlas.url];
219
+ delete resolver._assetMap[res.src.ske.url];
220
+ delete resolver._resolverHash[res.src.image.url];
221
+ delete resolver._resolverHash[res.src.atlas.url];
222
+ delete resolver._resolverHash[res.src.ske.url];
223
+ resource.destroy(resourceName);
224
+ delete dataMap[resourceName];
225
+ }
226
+ }), 100);
252
227
  }
253
228
 
254
229
  const MaxRetryCount = 20;
@@ -407,7 +382,8 @@ let SpineSystem = class SpineSystem extends Renderer {
407
382
  if (component.armature) {
408
383
  component.armature.destroy({ children: true });
409
384
  const res = yield resource.getResource(component.lastResource);
410
- releaseSpineData(res.name, ((_d = (_c = res.data) === null || _c === void 0 ? void 0 : _c.image) === null || _d === void 0 ? void 0 : _d.src) || ((_f = (_e = res.data) === null || _e === void 0 ? void 0 : _e.image) === null || _f === void 0 ? void 0 : _f.label));
385
+ ((_d = (_c = res.data) === null || _c === void 0 ? void 0 : _c.image) === null || _d === void 0 ? void 0 : _d.src) || ((_f = (_e = res.data) === null || _e === void 0 ? void 0 : _e.image) === null || _f === void 0 ? void 0 : _f.label);
386
+ yield releaseSpineData(res);
411
387
  }
412
388
  component.armature = null;
413
389
  delete this.armatures[changed.gameObject.id];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eva/spine-base",
3
- "version": "2.0.0",
3
+ "version": "2.0.1-beta.1",
4
4
  "description": "@eva/spine-base",
5
5
  "main": "index.js",
6
6
  "module": "dist/spine-base.esm.js",
@@ -18,8 +18,8 @@
18
18
  "license": "MIT",
19
19
  "homepage": "https://eva.js.org",
20
20
  "dependencies": {
21
- "@eva/eva.js": "2.0.0",
22
- "@eva/plugin-renderer": "2.0.0",
21
+ "@eva/eva.js": "2.0.1-beta.1",
22
+ "@eva/plugin-renderer": "2.0.1-beta.1",
23
23
  "@eva/inspector-decorator": "^0.0.5",
24
24
  "pixi.js": "^8.8.1"
25
25
  }