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 };