cables_dev/cables/src/core/anim_key.js
- import { CONSTANTS } from "./constants.js";
-
- const Key = function (obj)
- {
- this.time = 0.0;
- this.value = 0.0;
- // this.ui = null;
- this.onChange = null;
- this._easing = 0;
- // this.bezTangIn = 0;
- // this.bezTangOut = 0;
- // this.bezTime = 0.5;
- // this.bezValue = 0;
- // this.bezTimeIn = -0.5;
- // this.bezValueIn = 0;
-
- this.cb = null;
- this.cbTriggered = false;
-
- // const bezierAnim = null;
- // this._updateBezier = false;
-
- this.setEasing(CONSTANTS.ANIM.EASING_LINEAR);
- this.set(obj);
- };
-
- Key.cubicSpline = function (perc, key1, key2)
- {
- let
- previousPoint = key1.value,
- previousTangent = key1.bezTangOut,
- nextPoint = key2.value,
- nextTangent = key2.bezTangIn;
- let t = perc;
- let t2 = t * t;
- let t3 = t2 * t;
-
- return (2 * t3 - 3 * t2 + 1) * previousPoint + (t3 - 2 * t2 + t) * previousTangent + (-2 * t3 + 3 * t2) * nextPoint + (t3 - t2) * nextTangent;
- };
-
- Key.easeCubicSpline = function (perc, key2)
- {
- return Key.cubicSpline(perc, this, key2);
- };
-
-
- Key.linear = function (perc, key1, key2)
- {
- return parseFloat(key1.value) + parseFloat(key2.value - key1.value) * perc;
- };
-
- Key.easeLinear = function (perc, key2)
- {
- return Key.linear(perc, this, key2);
- };
-
- Key.easeAbsolute = function (perc, key2)
- {
- return this.value;
- };
-
- export const easeExpoIn = function (t)
- {
- return (t = 2 ** (10 * (t - 1)));
- };
-
- Key.easeExpoIn = function (t, key2)
- {
- t = easeExpoIn(t);
- return Key.linear(t, this, key2);
- };
-
- export const easeExpoOut = function (t)
- {
- t = -(2 ** (-10 * t)) + 1;
- return t;
- };
-
- Key.easeExpoOut = function (t, key2)
- {
- t = easeExpoOut(t);
- return Key.linear(t, this, key2);
- };
-
- export const easeExpoInOut = function (t)
- {
- t *= 2;
- if (t < 1)
- {
- t = 0.5 * 2 ** (10 * (t - 1));
- }
- else
- {
- t--;
- t = 0.5 * (-(2 ** (-10 * t)) + 2);
- }
- return t;
- };
-
- Key.easeExpoInOut = function (t, key2)
- {
- t = easeExpoInOut(t);
- return Key.linear(t, this, key2);
- };
-
- Key.easeSinIn = function (t, key2)
- {
- t = -1 * Math.cos((t * Math.PI) / 2) + 1;
- return Key.linear(t, this, key2);
- };
-
- Key.easeSinOut = function (t, key2)
- {
- t = Math.sin((t * Math.PI) / 2);
- return Key.linear(t, this, key2);
- };
-
- Key.easeSinInOut = function (t, key2)
- {
- t = -0.5 * (Math.cos(Math.PI * t) - 1.0);
- return Key.linear(t, this, key2);
- };
-
- export const easeCubicIn = function (t)
- {
- t = t * t * t;
- return t;
- };
-
- Key.easeCubicIn = function (t, key2)
- {
- t = easeCubicIn(t);
- return Key.linear(t, this, key2);
- };
-
-
- // b 0
- // c 1/2 or 1
- // d always 1
- // easeOutCubic: function (x, t, b, c, d) {
- // return c*((t=t/d-1)*t*t + 1) + b;
-
- Key.easeInQuint = function (t, key2)
- {
- t = t * t * t * t * t;
- return Key.linear(t, this, key2);
- };
- Key.easeOutQuint = function (t, key2)
- {
- t = (t -= 1) * t * t * t * t + 1;
- return Key.linear(t, this, key2);
- };
- Key.easeInOutQuint = function (t, key2)
- {
- if ((t /= 0.5) < 1) t = 0.5 * t * t * t * t * t;
- else t = 0.5 * ((t -= 2) * t * t * t * t + 2);
- return Key.linear(t, this, key2);
- };
-
- Key.easeInQuart = function (t, key2)
- {
- t = t * t * t * t;
- return Key.linear(t, this, key2);
- };
-
- Key.easeOutQuart = function (t, key2)
- {
- // return -c * ((t=t/d-1)*t*t*t - 1) + b;
- t = -1 * ((t -= 1) * t * t * t - 1);
- return Key.linear(t, this, key2);
- };
-
- Key.easeInOutQuart = function (t, key2)
- {
- if ((t /= 0.5) < 1) t = 0.5 * t * t * t * t;
- else t = -0.5 * ((t -= 2) * t * t * t - 2);
- return Key.linear(t, this, key2);
- };
-
- Key.bounce = function (t)
- {
- if ((t /= 1) < 1 / 2.75) t = 7.5625 * t * t;
- else if (t < 2 / 2.75) t = 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;
- else if (t < 2.5 / 2.75) t = 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;
- else t = 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;
- return t;
- };
-
- Key.easeInBounce = function (t, key2)
- {
- return Key.linear(Key.bounce(t), this, key2);
- // return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d);
- };
-
- Key.easeOutBounce = function (t, key2)
- {
- return Key.linear(Key.bounce(t), this, key2);
- };
-
- Key.easeInElastic = function (t, key2)
- {
- let s = 1.70158;
- let p = 0;
- let a = 1;
-
- const b = 0;
- const d = 1;
- const c = 1;
-
- if (t === 0) t = b;
- else if ((t /= d) == 1) t = b + c;
- else
- {
- if (!p) p = d * 0.3;
- if (a < Math.abs(c))
- {
- a = c;
- s = p / 4;
- }
- else s = (p / (2 * Math.PI)) * Math.asin(c / a);
- t = -(a * 2 ** (10 * (t -= 1)) * Math.sin(((t * d - s) * (2 * Math.PI)) / p)) + b;
- }
-
- return Key.linear(t, this, key2);
- };
-
-
- Key.easeOutElastic = function (t, key2)
- {
- let s = 1.70158;
- let p = 0;
- let a = 1;
-
- const b = 0;
- const d = 1;
- const c = 1;
-
- if (t === 0) t = b;
- else if ((t /= d) == 1) t = b + c;
- else
- {
- if (!p) p = d * 0.3;
- if (a < Math.abs(c))
- {
- a = c;
- s = p / 4;
- }
- else s = (p / (2 * Math.PI)) * Math.asin(c / a);
- t = a * 2 ** (-10 * t) * Math.sin(((t * d - s) * (2 * Math.PI)) / p) + c + b;
- }
-
- return Key.linear(t, this, key2);
- };
-
- Key.easeInBack = function (t, key2)
- {
- const s = 1.70158;
- t = t * t * ((s + 1) * t - s);
-
- return Key.linear(t, this, key2);
- };
-
- Key.easeOutBack = function (t, key2)
- {
- const s = 1.70158;
- t = (t = t / 1 - 1) * t * ((s + 1) * t + s) + 1;
-
- return Key.linear(t, this, key2);
- };
-
- Key.easeInOutBack = function (t, key2)
- {
- let s = 1.70158;
- const c = 1 / 2;
- if ((t /= 1 / 2) < 1) t = c * (t * t * (((s *= 1.525) + 1) * t - s));
- else t = c * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);
-
- return Key.linear(t, this, key2);
- };
-
- export const easeCubicOut = function (t)
- {
- t--;
- t = t * t * t + 1;
- return t;
- };
-
- Key.easeCubicOut = function (t, key2)
- {
- t = easeCubicOut(t);
- return Key.linear(t, this, key2);
- };
-
- export const easeCubicInOut = function (t)
- {
- t *= 2;
- if (t < 1) t = 0.5 * t * t * t;
- else
- {
- t -= 2;
- t = 0.5 * (t * t * t + 2);
- }
- return t;
- };
-
- Key.easeCubicInOut = function (t, key2)
- {
- t = easeCubicInOut(t);
- return Key.linear(t, this, key2);
- };
-
- Key.easeSmoothStep = function (perc, key2)
- {
- // var x = Math.max(0, Math.min(1, (perc-0)/(1-0)));
- const x = Math.max(0, Math.min(1, perc));
- perc = x * x * (3 - 2 * x); // smoothstep
- return Key.linear(perc, this, key2);
- };
-
- Key.easeSmootherStep = function (perc, key2)
- {
- const x = Math.max(0, Math.min(1, (perc - 0) / (1 - 0)));
- perc = x * x * x * (x * (x * 6 - 15) + 10); // smootherstep
- return Key.linear(perc, this, key2);
- };
-
- Key.prototype.setEasing = function (e)
- {
- this._easing = e;
-
- if (this._easing == CONSTANTS.ANIM.EASING_LINEAR) this.ease = Key.easeLinear;
- else if (this._easing == CONSTANTS.ANIM.EASING_ABSOLUTE) this.ease = Key.easeAbsolute;
- else if (this._easing == CONSTANTS.ANIM.EASING_SMOOTHSTEP) this.ease = Key.easeSmoothStep;
- else if (this._easing == CONSTANTS.ANIM.EASING_SMOOTHERSTEP) this.ease = Key.easeSmootherStep;
- else if (this._easing == CONSTANTS.ANIM.EASING_CUBIC_IN) this.ease = Key.easeCubicIn;
- else if (this._easing == CONSTANTS.ANIM.EASING_CUBIC_OUT) this.ease = Key.easeCubicOut;
- else if (this._easing == CONSTANTS.ANIM.EASING_CUBIC_INOUT) this.ease = Key.easeCubicInOut;
- else if (this._easing == CONSTANTS.ANIM.EASING_EXPO_IN) this.ease = Key.easeExpoIn;
- else if (this._easing == CONSTANTS.ANIM.EASING_EXPO_OUT) this.ease = Key.easeExpoOut;
- else if (this._easing == CONSTANTS.ANIM.EASING_EXPO_INOUT) this.ease = Key.easeExpoInOut;
- else if (this._easing == CONSTANTS.ANIM.EASING_SIN_IN) this.ease = Key.easeSinIn;
- else if (this._easing == CONSTANTS.ANIM.EASING_SIN_OUT) this.ease = Key.easeSinOut;
- else if (this._easing == CONSTANTS.ANIM.EASING_SIN_INOUT) this.ease = Key.easeSinInOut;
- else if (this._easing == CONSTANTS.ANIM.EASING_BACK_OUT) this.ease = Key.easeOutBack;
- else if (this._easing == CONSTANTS.ANIM.EASING_BACK_IN) this.ease = Key.easeInBack;
- else if (this._easing == CONSTANTS.ANIM.EASING_BACK_INOUT) this.ease = Key.easeInOutBack;
- else if (this._easing == CONSTANTS.ANIM.EASING_ELASTIC_IN) this.ease = Key.easeInElastic;
- else if (this._easing == CONSTANTS.ANIM.EASING_ELASTIC_OUT) this.ease = Key.easeOutElastic;
- else if (this._easing == CONSTANTS.ANIM.EASING_ELASTIC_INOUT) this.ease = Key.easeElasticInOut;
- else if (this._easing == CONSTANTS.ANIM.EASING_BOUNCE_IN) this.ease = Key.easeInBounce;
- else if (this._easing == CONSTANTS.ANIM.EASING_BOUNCE_OUT) this.ease = Key.easeOutBounce;
- else if (this._easing == CONSTANTS.ANIM.EASING_QUART_OUT) this.ease = Key.easeOutQuart;
- else if (this._easing == CONSTANTS.ANIM.EASING_QUART_IN) this.ease = Key.easeInQuart;
- else if (this._easing == CONSTANTS.ANIM.EASING_QUART_INOUT) this.ease = Key.easeInOutQuart;
- else if (this._easing == CONSTANTS.ANIM.EASING_QUINT_OUT) this.ease = Key.easeOutQuint;
- else if (this._easing == CONSTANTS.ANIM.EASING_QUINT_IN) this.ease = Key.easeInQuint;
- else if (this._easing == CONSTANTS.ANIM.EASING_QUINT_INOUT) this.ease = Key.easeInOutQuint;
- else if (this._easing == CONSTANTS.ANIM.EASING_CUBICSPLINE)
- {
- // this._updateBezier = true;
- this.ease = Key.easeCubicSpline;
- }
- else
- {
- this._easing = CONSTANTS.ANIM.EASING_LINEAR;
- this.ease = Key.easeLinear;
- }
- };
-
- Key.prototype.trigger = function ()
- {
- this.cb();
- this.cbTriggered = true;
- };
-
- Key.prototype.setValue = function (v)
- {
- this.value = v;
- // this._updateBezier = true;
- if (this.onChange !== null) this.onChange();
- };
-
- Key.prototype.set = function (obj)
- {
- if (obj)
- {
- if (obj.e) this.setEasing(obj.e);
- if (obj.cb)
- {
- this.cb = obj.cb;
- this.cbTriggered = false;
- }
-
- if (obj.b)
- {
- // this.bezTime = obj.b[0];
- // this.bezValue = obj.b[1];
- // this.bezTimeIn = obj.b[2];
- // this.bezValueIn = obj.b[3];
- // this._updateBezier = true;
- }
-
- if (obj.hasOwnProperty("t")) this.time = obj.t;
- if (obj.hasOwnProperty("time")) this.time = obj.time;
- if (obj.hasOwnProperty("v")) this.value = obj.v;
- else if (obj.hasOwnProperty("value")) this.value = obj.value;
- }
- if (this.onChange !== null) this.onChange();
- };
-
- Key.prototype.getSerialized = function ()
- {
- const obj = {};
- obj.t = this.time;
- obj.v = this.value;
- obj.e = this._easing;
- // if (this._easing == CONSTANTS.ANIM.EASING_CUBICSPLINE) obj.b = [this.bezTime, this.bezValue, this.bezTimeIn, this.bezValueIn];
-
- return obj;
- };
-
- Key.prototype.getEasing = function ()
- {
- return this._easing;
- };
-
- export { Key };