UNPKG

tslerp

Version:

Typescript library for lerping single and multi-sample data sets over time

212 lines 11.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var interval_1 = require("./interval"); var interval_2 = require("./interval"); var Transition; (function (Transition) { Transition[Transition["EaseOut"] = 0] = "EaseOut"; Transition[Transition["EaseIn"] = 1] = "EaseIn"; Transition[Transition["EaseInOut"] = 2] = "EaseInOut"; })(Transition = exports.Transition || (exports.Transition = {})); var Style; (function (Style) { Style[Style["Linear"] = 0] = "Linear"; Style[Style["Quadratic"] = 1] = "Quadratic"; Style[Style["Sine"] = 2] = "Sine"; Style[Style["Exponential"] = 3] = "Exponential"; Style[Style["Cubic"] = 4] = "Cubic"; })(Style = exports.Style || (exports.Style = {})); var Lerp = (function () { function Lerp() { this.currentTime = 0; this.lerpValues = [[0, 0]]; this.duration = 0; this.lerpFunctions = {}; this.lerpIntervals = new interval_1.Intervals(); this.clientCallback = null; this.transition = Transition.EaseOut; this.style = Style.Quadratic; this.constructLerpFunctions(); } Lerp.prototype.define = function (lerpValues, duration, transition, style) { if (transition === void 0) { transition = Transition.EaseOut; } if (style === void 0) { style = Style.Quadratic; } this.lerpValues = lerpValues; this.duration = duration; this.currentTime = 0; this.transition = transition; this.style = style; this.clientCallback = null; }; Lerp.prototype.lerp = function (clientCallback) { var _this = this; if (this.duration === 0) { return; } if (this.clientCallback !== null) { return; } this.clientCallback = clientCallback; this.lerpIntervals.start(function (timeDelta) { return _this.intervalCallback(timeDelta); }); }; Lerp.prototype.pause = function (paused) { this.lerpIntervals.pause(paused); }; Lerp.prototype.stop = function (paused) { this.lerpIntervals.stop(); this.clientCallback = null; }; Lerp.prototype.intervalCallback = function (timeDelta) { if (this.clientCallback === null) { return interval_2.Continuation.Cancel; } this.currentTime += timeDelta; this.currentTime = Math.min(this.currentTime, this.duration); var lerpResults = []; for (var index = 0; index < this.lerpValues.length; ++index) { var currentLerpValues = this.lerpValues[index]; var functionToCall = this.calculateLerpFunction(); var lerpDistance = currentLerpValues[1] - currentLerpValues[0]; var lerpedValue = functionToCall(currentLerpValues[0], lerpDistance, this.duration, this.currentTime); lerpResults.push(lerpedValue); } var currentTime = this.currentTime / this.duration; this.clientCallback(lerpResults, currentTime); var finished = (currentTime === 1); return finished === true ? interval_2.Continuation.Cancel : interval_2.Continuation.Continue; }; Lerp.prototype.calculateLerpFunction = function () { var transition = Transition[this.transition]; var style = Style[this.style]; var functionName = 'lerpStyle' + transition + style; var functionToCall = this.lerpFunctions[functionName]; return functionToCall; }; Lerp.prototype.constructLerpFunctions = function () { var _this = this; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseOut] + Style[Style.Quadratic]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseOutQuadratic(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseIn] + Style[Style.Quadratic]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseInQuadratic(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseInOut] + Style[Style.Quadratic]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseInOutQuadratic(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseOut] + Style[Style.Linear]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleLinear(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseIn] + Style[Style.Linear]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleLinear(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseInOut] + Style[Style.Linear]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleLinear(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseOut] + Style[Style.Sine]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseOutSine(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseIn] + Style[Style.Sine]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseInSine(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseInOut] + Style[Style.Sine]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseInOutSine(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseOut] + Style[Style.Exponential]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseOutExponential(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseIn] + Style[Style.Exponential]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseInExponential(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseInOut] + Style[Style.Exponential]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseInOutExponential(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseOut] + Style[Style.Cubic]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseOutCubic(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseIn] + Style[Style.Cubic]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseInCubic(initial, lerpDistance, duration, currentTime); }; this.lerpFunctions['lerpStyle' + Transition[Transition.EaseInOut] + Style[Style.Cubic]] = function (initial, lerpDistance, duration, currentTime) { return _this.lerpStyleEaseInOutCubic(initial, lerpDistance, duration, currentTime); }; }; Lerp.prototype.lerpStyleLinear = function (initial, lerpDistance, duration, currentTime) { return ((lerpDistance * currentTime) / duration) + initial; }; Lerp.prototype.lerpStyleEaseOutQuadratic = function (initial, lerpDistance, duration, currentTime) { currentTime /= duration; return -lerpDistance * currentTime * (currentTime - 2) + initial; }; Lerp.prototype.lerpStyleEaseInQuadratic = function (initial, lerpDistance, duration, currentTime) { currentTime /= duration; return lerpDistance * currentTime * currentTime + initial; }; Lerp.prototype.lerpStyleEaseInOutQuadratic = function (initial, lerpDistance, duration, currentTime) { currentTime /= duration / 2; if (currentTime < 1) { return (lerpDistance / 2) * currentTime * currentTime + initial; } currentTime--; return -lerpDistance / 2 * (currentTime * (currentTime - 2) - 1) + initial; }; Lerp.prototype.lerpStyleEaseOutSine = function (initial, lerpDistance, duration, currentTime) { return lerpDistance * Math.sin(currentTime / duration * (Math.PI / 2)) + initial; }; Lerp.prototype.lerpStyleEaseInSine = function (initial, lerpDistance, duration, currentTime) { return -lerpDistance * Math.cos(currentTime / duration * (Math.PI / 2)) + lerpDistance + initial; }; Lerp.prototype.lerpStyleEaseInOutSine = function (initial, lerpDistance, duration, currentTime) { return -lerpDistance / 2 * (Math.cos(Math.PI * currentTime / duration) - 1) + initial; }; Lerp.prototype.lerpStyleEaseOutExponential = function (initial, lerpDistance, duration, currentTime) { return lerpDistance * (-Math.pow(2, -10 * currentTime / duration) + 1) + initial; }; Lerp.prototype.lerpStyleEaseInExponential = function (initial, lerpDistance, duration, currentTime) { return lerpDistance * Math.pow(2, 10 * (currentTime / duration - 1)) + initial; }; Lerp.prototype.lerpStyleEaseInOutExponential = function (initial, lerpDistance, duration, currentTime) { currentTime /= duration / 2; if (currentTime < 1) { return lerpDistance / 2 * Math.pow(2, 10 * (currentTime - 1)) + initial; } currentTime--; return lerpDistance / 2 * (-Math.pow(2, -10 * currentTime) + 2) + initial; }; Lerp.prototype.lerpStyleEaseOutCubic = function (initial, lerpDistance, duration, currentTime) { currentTime /= duration; currentTime--; return lerpDistance * (currentTime * currentTime * currentTime + 1) + initial; }; Lerp.prototype.lerpStyleEaseInCubic = function (initial, lerpDistance, duration, currentTime) { currentTime /= duration; return lerpDistance * currentTime * currentTime * currentTime + initial; }; Lerp.prototype.lerpStyleEaseInOutCubic = function (initial, lerpDistance, duration, currentTime) { currentTime /= duration / 2; if (currentTime < 1) { return lerpDistance / 2 * currentTime * currentTime * currentTime + initial; } currentTime -= 2; return lerpDistance / 2 * (currentTime * currentTime * currentTime + 2) + initial; }; return Lerp; }()); exports.Lerp = Lerp; //# sourceMappingURL=lerp.js.map