@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 2.39 kB
JavaScript
import{AnimTrack as a}from"../../anim/evaluator/anim-track.js";import{Component as s}from"../component.js";import{ComponentSystem as t}from"../system.js";import{AnimComponent as e}from"./component.js";import{AnimComponentData as n}from"./data.js";const o=["enabled"];class i extends t{constructor(a){super(a),this.id="anim",this.ComponentType=e,this.DataType=n,this.schema=o,this.on("beforeremove",this.onBeforeRemove,this),this.app.systems.on("animationUpdate",this.onAnimationUpdate,this)}initializeComponentData(s,t,e){super.initializeComponentData(s,t,o);const n=["animationAssets","stateGraph","layers","masks"];Object.keys(t).forEach((a=>{n.includes(a)||(s[a]=t[a])})),t.stateGraph&&(s.stateGraph=t.stateGraph,s.loadStateGraph(s.stateGraph)),t.layers&&t.layers.forEach(((t,e)=>{t._controller.states.forEach((n=>{t._controller._states[n]._animationList.forEach((n=>{if(n.animTrack&&n.animTrack!==a.EMPTY)s.layers[e].assignAnimation(n.name,n.animTrack);else{const a=this.app.assets.get(t._component._animationAssets[`${t.name}:${n.name}`].asset);a&&!a.loaded&&a.once("load",(()=>{s.layers[e].assignAnimation(n.name,a.resource)}))}}))}))})),t.animationAssets&&(s.animationAssets=Object.assign(s.animationAssets,t.animationAssets)),t.masks&&Object.keys(t.masks).forEach((a=>{if(s.layers[a]){const e=t.masks[a].mask,n={};Object.keys(e).forEach((a=>{n[decodeURI(a)]=e[a]})),s.layers[a].mask=n}}))}onAnimationUpdate(a){const s=this.store;for(const t in s)if(s.hasOwnProperty(t)){const e=s[t].entity.anim;e.data.enabled&&e.entity.enabled&&e.playing&&e.update(a)}}cloneComponent(a,s){let t;a.anim.rootBone&&a.anim.rootBone!==a||(t={},a.anim.layers.forEach(((a,e)=>{if(a.mask){const n={};Object.keys(a.mask).forEach((t=>{const e=t.split("/");e.shift();const o=[s.name,...e].join("/");n[o]=a.mask[t]})),t[e]={mask:n}}})));const e={stateGraphAsset:a.anim.stateGraphAsset,animationAssets:a.anim.animationAssets,speed:a.anim.speed,activate:a.anim.activate,playing:a.anim.playing,rootBone:a.anim.rootBone,stateGraph:a.anim.stateGraph,layers:a.anim.layers,layerIndices:a.anim.layerIndices,parameters:a.anim.parameters,normalizeWeights:a.anim.normalizeWeights,masks:t};return this.addComponent(s,e)}onBeforeRemove(a,s){s.onBeforeRemove()}destroy(){super.destroy(),this.app.systems.off("animationUpdate",this.onAnimationUpdate,this)}}s._buildAccessors(e.prototype,o);export{i as AnimComponentSystem};