UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 2.11 kB
import{CURVE_STEP as t,CURVE_LINEAR as i,CURVE_SMOOTHSTEP as s,CURVE_CATMULL as e,CURVE_CARDINAL as h,CURVE_SPLINE as _}from"./constants.js";import{math as r}from"./math.js";class c{constructor(t,i=0){this._curve=void 0,this._left=-1/0,this._right=1/0,this._recip=0,this._p0=0,this._p1=0,this._m0=0,this._m1=0,this._curve=t,this._reset(i)}evaluate(e,h=!1){let _;(h||e<this._left||e>=this._right)&&this._reset(e);const c=this._curve.type;if(c===t)_=this._p0;else{const t=0===this._recip?0:(e-this._left)*this._recip;_=c===i?r.lerp(this._p0,this._p1,t):c===s?r.lerp(this._p0,this._p1,t*t*(3-2*t)):this._evaluateHermite(this._p0,this._p1,this._m0,this._m1,t)}return _}_reset(t){const i=this._curve.keys,s=i.length;if(s)if(t<i[0][0])this._left=-1/0,this._right=i[0][0],this._recip=0,this._p0=this._p1=i[0][1],this._m0=this._m1=0;else if(t>=i[s-1][0])this._left=i[s-1][0],this._right=1/0,this._recip=0,this._p0=this._p1=i[s-1][1],this._m0=this._m1=0;else{let s=0;for(;t>=i[s+1][0];)s++;this._left=i[s][0],this._right=i[s+1][0];const e=1/(this._right-this._left);this._recip=isFinite(e)?e:0,this._p0=i[s][1],this._p1=i[s+1][1],this._isHermite()&&this._calcTangents(i,s)}else this._left=-1/0,this._right=1/0,this._recip=0,this._p0=this._p1=this._m0=this._m1=0}_isHermite(){return this._curve.type===e||this._curve.type===h||this._curve.type===_}_calcTangents(t,i){let s;const h=t[i],r=t[i+1];let c;if(s=0===i?[t[0][0]+(t[0][0]-t[1][0]),t[0][1]+(t[0][1]-t[1][1])]:t[i-1],c=i===t.length-2?[t[i+1][0]+(t[i+1][0]-t[i][0]),t[i+1][1]+(t[i+1][1]-t[i][1])]:t[i+2],this._curve.type===_){const t=2*(r[0]-h[0])/(r[0]-s[0]),i=2*(r[0]-h[0])/(c[0]-h[0]);this._m0=this._curve.tension*(isFinite(t)?t:0)*(r[1]-s[1]),this._m1=this._curve.tension*(isFinite(i)?i:0)*(c[1]-h[1])}else{const t=(r[0]-h[0])/(h[0]-s[0]),i=(r[0]-h[0])/(c[0]-r[0]),_=h[1]+(s[1]-h[1])*(isFinite(t)?t:0),p=r[1]+(c[1]-r[1])*(isFinite(i)?i:0),n=this._curve.type===e?.5:this._curve.tension;this._m0=n*(r[1]-_),this._m1=n*(p-h[1])}}_evaluateHermite(t,i,s,e,h){const _=h*h,r=h+h,c=1-h,p=c*c;return t*((1+r)*p)+s*(h*p)+i*(_*(3-r))+e*(_*(h-1))}}export{c as CurveEvaluator};