UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 2.35 kB
import{Quat as t}from"../../../core/math/quat.js";import{ANIM_LAYER_OVERWRITE as e,ANIM_LAYER_ADDITIVE as s}from"../controller/constants.js";import{AnimBlend as i}from"./anim-blend.js";import{math as h}from"../../../core/math/math.js";class a{constructor(t,e){this._component=t,this.mask=new Int8Array(t.layers.length),this.weights=new Float32Array(t.layers.length),this.totalWeight=0,this.counter=0,this.layerCounter=0,this.valueType=e,this.dirty=!0,this.value=e===a.TYPE_QUAT?[0,0,0,1]:[0,0,0],this.baseValue=null,this.setter=null}get _normalizeWeights(){return this._component.normalizeWeights}getWeight(t){return this.dirty&&this.updateWeights(),this._normalizeWeights&&0===this.totalWeight||!this.mask[t]?0:this._normalizeWeights?this.weights[t]/this.totalWeight:h.clamp(this.weights[t],0,1)}_layerBlendType(t){return this._component.layers[t].blendType}setMask(t,s){this.mask[t]=s,this._normalizeWeights&&(this._component.layers[t].blendType===e&&(this.mask=this.mask.fill(0,0,t)),this.dirty=!0)}updateWeights(){this.totalWeight=0;for(let t=0;t<this.weights.length;t++)this.weights[t]=this._component.layers[t].weight,this.totalWeight+=this.mask[t]*this.weights[t];this.dirty=!1}updateValue(e,h){if(0===this.counter&&(i.set(this.value,a.IDENTITY_QUAT_ARR,this.valueType),this._normalizeWeights||i.blend(this.value,this.baseValue,1,this.valueType)),this.mask[e]&&0!==this.getWeight(e)){if(this._layerBlendType(e)!==s||this._normalizeWeights)i.blend(this.value,h,this.getWeight(e),this.valueType);else if(this.valueType===a.TYPE_QUAT){const s=a.q1.set(this.value[0],this.value[1],this.value[2],this.value[3]),r=a.q2.set(this.baseValue[0],this.baseValue[1],this.baseValue[2],this.baseValue[3]),l=a.q3.set(h[0],h[1],h[2],h[3]),n=r.invert().mul(l);n.slerp(t.IDENTITY,n,this.getWeight(e)),s.mul(n),a.quatArr[0]=s.x,a.quatArr[1]=s.y,a.quatArr[2]=s.z,a.quatArr[3]=s.w,i.set(this.value,a.quatArr,this.valueType)}else a.vecArr[0]=h[0]-this.baseValue[0],a.vecArr[1]=h[1]-this.baseValue[1],a.vecArr[2]=h[2]-this.baseValue[2],i.blend(this.value,a.vecArr,this.getWeight(e),this.valueType,!0);this.setter&&this.setter(this.value)}}unbind(){this.setter&&this.setter(this.baseValue)}}a.TYPE_QUAT="quaternion",a.TYPE_VEC3="vector3",a.q1=new t,a.q2=new t,a.q3=new t,a.quatArr=[0,0,0,1],a.vecArr=[0,0,0],a.IDENTITY_QUAT_ARR=[0,0,0,1];export{a as AnimTargetValue};