UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 8.04 kB
import{extends as t}from"../../../../_virtual/_rollupPluginBabelHelpers.js";import{Asset as e}from"../../asset/asset.js";import{AnimEvaluator as s}from"../../anim/evaluator/anim-evaluator.js";import{AnimController as a}from"../../anim/controller/anim-controller.js";import{Component as i}from"../component.js";import{ANIM_CONTROL_STATES as r,ANIM_PARAMETER_FLOAT as n,ANIM_PARAMETER_INTEGER as h,ANIM_PARAMETER_BOOLEAN as o,ANIM_PARAMETER_TRIGGER as l}from"../../anim/controller/constants.js";import{AnimComponentBinder as m}from"./component-binder.js";import{AnimComponentLayer as p}from"./component-layer.js";import{AnimStateGraph as g}from"../../anim/state-graph/anim-state-graph.js";import{Entity as _}from"../../entity.js";import{AnimTrack as d}from"../../anim/evaluator/anim-track.js";class u extends i{constructor(t,e){super(t,e),this.findParameter=t=>this._parameters[t],this.consumeTrigger=t=>{this._consumedTriggers.add(t)},this._stateGraphAsset=null,this._animationAssets={},this._speed=1,this._activate=!0,this._playing=!1,this._rootBone=null,this._stateGraph=null,this._layers=[],this._layerIndices={},this._parameters={},this._targets={},this._consumedTriggers=new Set,this._normalizeWeights=!1}set stateGraphAsset(t){if(null===t)return void this.removeStateGraph();if(this._stateGraphAsset){this.system.app.assets.get(this._stateGraphAsset).off("change",this._onStateGraphAssetChangeEvent,this)}let s,a;t instanceof e?(s=t.id,a=this.system.app.assets.get(s),a||(this.system.app.assets.add(t),a=this.system.app.assets.get(s))):(s=t,a=this.system.app.assets.get(s)),a&&this._stateGraphAsset!==s&&(a.resource?(this._stateGraph=a.resource,this.loadStateGraph(this._stateGraph),a.on("change",this._onStateGraphAssetChangeEvent,this)):(a.once("load",(t=>{this._stateGraph=t.resource,this.loadStateGraph(this._stateGraph)})),a.on("change",this._onStateGraphAssetChangeEvent,this),this.system.app.assets.load(a)),this._stateGraphAsset=s)}get stateGraphAsset(){return this._stateGraphAsset}set normalizeWeights(t){this._normalizeWeights=t,this.unbind()}get normalizeWeights(){return this._normalizeWeights}set animationAssets(t){this._animationAssets=t,this.loadAnimationAssets()}get animationAssets(){return this._animationAssets}set speed(t){this._speed=t}get speed(){return this._speed}set activate(t){this._activate=t}get activate(){return this._activate}set playing(t){this._playing=t}get playing(){return this._playing}set rootBone(t){if("string"==typeof t){const e=this.entity.root.findByGuid(t);this._rootBone=e}else this._rootBone=t instanceof _?t:null;this.rebind()}get rootBone(){return this._rootBone}set stateGraph(t){this._stateGraph=t}get stateGraph(){return this._stateGraph}get layers(){return this._layers}set layerIndices(t){this._layerIndices=t}get layerIndices(){return this._layerIndices}set parameters(t){this._parameters=t}get parameters(){return this._parameters}set targets(t){this._targets=t}get targets(){return this._targets}get playable(){for(let t=0;t<this._layers.length;t++)if(!this._layers[t].playable)return!1;return!0}get baseLayer(){return this._layers.length>0?this._layers[0]:null}_onStateGraphAssetChangeEvent(t){const e=this.animationAssets,s=this.layers.map((t=>t.mask));this.removeStateGraph(),this._stateGraph=new g(t._data),this.loadStateGraph(this._stateGraph),this.animationAssets=e,this.loadAnimationAssets(),this.layers.forEach(((t,e)=>{t.mask=s[e]})),this.rebind()}dirtifyTargets(){const t=Object.values(this._targets);for(let e=0;e<t.length;e++)t[e].dirty=!0}_addLayer({name:t,states:e,transitions:i,weight:r,mask:n,blendType:h}){let o;o=this.rootBone?this.rootBone:this.entity;const l=this._layers.length,g=new m(this,o,t,n,l),_=new s(g),d=new a(_,e,i,this._activate,this,this.findParameter,this.consumeTrigger);return this._layers.push(new p(t,d,this,r,h)),this._layerIndices[t]=l,this._layers[l]}addLayer(t,e,s,a){const i=this.findAnimationLayer(t);if(i)return i;return this._addLayer({name:t,states:[{name:"START",speed:1}],transitions:[],weight:e,mask:s,blendType:a})}_assignParameters(t){this._parameters={};const e=Object.keys(t.parameters);for(let s=0;s<e.length;s++){const a=e[s];this._parameters[a]={type:t.parameters[a].type,value:t.parameters[a].value}}}loadStateGraph(e){this._stateGraph=e,this._assignParameters(e),this._layers=[];let s=!1;for(let a=0;a<e.layers.length;a++){const i=e.layers[a];this._addLayer(t({},i)),i.states.some((t=>t.blendTree))&&(s=!0)}s||this.setupAnimationAssets()}setupAnimationAssets(){for(let t=0;t<this._layers.length;t++){const e=this._layers[t],s=e.name;for(let t=0;t<e.states.length;t++){const a=e.states[t];if(-1===r.indexOf(a)){const t=`${s}:${a}`;this._animationAssets[t]||(this._animationAssets[t]={asset:null})}}}this.loadAnimationAssets()}loadAnimationAssets(){for(let t=0;t<this._layers.length;t++){const e=this._layers[t];for(let t=0;t<e.states.length;t++){const s=e.states[t];if(-1!==r.indexOf(s))continue;const a=this._animationAssets[`${e.name}:${s}`];if(!a||!a.asset){this.findAnimationLayer(e.name).assignAnimation(s,d.EMPTY);continue}const i=a.asset,n=this.system.app.assets.get(i);n&&(n.resource?this.onAnimationAssetLoaded(e.name,s,n):(n.once("load",function(t,e){return function(s){this.onAnimationAssetLoaded(t,e,s)}.bind(this)}.bind(this)(e.name,s)),this.system.app.assets.load(n)))}}}onAnimationAssetLoaded(t,e,s){this.findAnimationLayer(t).assignAnimation(e,s.resource)}removeStateGraph(){this._stateGraph=null,this._stateGraphAsset=null,this._animationAssets={},this._layers=[],this._layerIndices={},this._parameters={},this._playing=!1,this.unbind(),this._targets={}}reset(){this._assignParameters(this._stateGraph);for(let t=0;t<this._layers.length;t++){const e=this._layers[t].playing;this._layers[t].reset(),this._layers[t].playing=e}}unbind(){this._normalizeWeights||Object.keys(this._targets).forEach((t=>{this._targets[t].unbind()}))}rebind(){this._targets={};for(let t=0;t<this._layers.length;t++)this._layers[t].rebind()}findAnimationLayer(t){const e=this._layerIndices[t];return this._layers[e]||null}addAnimationState(t,e,s=1,a=!0,i="Base"){this._stateGraph||this.loadStateGraph(new g({layers:[{name:i,states:[{name:"START",speed:1},{name:t,speed:s,loop:a,defaultState:!0}],transitions:[{from:"START",to:t}]}],parameters:{}}));const r=this.findAnimationLayer(i);var n;r?r.assignAnimation(t,e,s,a):null==(n=this.addLayer(i))||n.assignAnimation(t,e,s,a)}assignAnimation(t,e,s,a=1,i=!0){if(!this._stateGraph&&-1===t.indexOf("."))return this.loadStateGraph(new g({layers:[{name:"Base",states:[{name:"START",speed:1},{name:t,speed:a,loop:i,defaultState:!0}],transitions:[{from:"START",to:t}]}],parameters:{}})),void this.baseLayer.assignAnimation(t,e);const r=s?this.findAnimationLayer(s):this.baseLayer;r&&r.assignAnimation(t,e,a,i)}removeNodeAnimations(t,e){const s=e?this.findAnimationLayer(e):this.baseLayer;s&&s.removeNodeAnimations(t)}getParameterValue(t,e){const s=this._parameters[t];if(s&&s.type===e)return s.value}setParameterValue(t,e,s){const a=this._parameters[t];a&&a.type===e&&(a.value=s)}getFloat(t){return this.getParameterValue(t,n)}setFloat(t,e){this.setParameterValue(t,n,e)}getInteger(t){return this.getParameterValue(t,h)}setInteger(t,e){"number"==typeof e&&e%1==0&&this.setParameterValue(t,h,e)}getBoolean(t){return this.getParameterValue(t,o)}setBoolean(t,e){this.setParameterValue(t,o,!!e)}getTrigger(t){return this.getParameterValue(t,l)}setTrigger(t,e=!1){this.setParameterValue(t,l,!0),e&&this._consumedTriggers.add(t)}resetTrigger(t){this.setParameterValue(t,l,!1)}onBeforeRemove(){if(Number.isFinite(this._stateGraphAsset)){this.system.app.assets.get(this._stateGraphAsset).off("change",this._onStateGraphAssetChangeEvent,this)}}update(t){for(let e=0;e<this.layers.length;e++)this.layers[e].update(t*this.speed);this._consumedTriggers.forEach((t=>{this.parameters[t].value=!1})),this._consumedTriggers.clear()}resolveDuplicatedEntityReferenceProperties(t,e){t.rootBone&&e[t.rootBone.getGuid()]?this.rootBone=e[t.rootBone.getGuid()]:this.rebind()}}export{u as AnimComponent};