UNPKG

starling-framework

Version:

A fast, productive library for 2D cross-platform development.

168 lines (151 loc) 5.33 kB
// Class: starling.animation.BezierEasing var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this $global.Object.defineProperty(exports, "__esModule", {value: true}); var __map_reserved = {}; // Imports var $hxClasses = require("./../../hxClasses_stub").default; var $hxEnums = require("./../../hxEnums_stub").default; var $import = require("./../../import_stub").default; function js__$Boot_HaxeError() {return require("./../../js/_Boot/HaxeError");} function openfl_errors_ArgumentError() {return $import(require("openfl/errors/ArgumentError"));} function _$UInt_UInt_$Impl_$() {return require("./../../_UInt/UInt_Impl_");} // Constructor var BezierEasing = function(){} // Meta BezierEasing.__name__ = "starling.animation.BezierEasing"; BezierEasing.__isInterface__ = false; BezierEasing.prototype = { }; BezierEasing.prototype.__class__ = BezierEasing.prototype.constructor = $hxClasses["starling.animation.BezierEasing"] = BezierEasing; // Init // Statics BezierEasing.create = function(x1,y1,x2,y2) { if(x1 < 0 || x1 > 1 || x2 < 0 || x2 > 1) { throw new (js__$Boot_HaxeError().default)(new (openfl_errors_ArgumentError().default)("x values must be in range [0, 1]")); } if(x1 == y1 && x2 == y2) { return BezierEasing.linearEasing; } var sampleValues = []; var tmp = BezierEasing.calcBezier(0 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[0] = tmp; var tmp1 = BezierEasing.calcBezier(BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[1] = tmp1; var tmp2 = BezierEasing.calcBezier(2 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[2] = tmp2; var tmp3 = BezierEasing.calcBezier(3 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[3] = tmp3; var tmp4 = BezierEasing.calcBezier(4 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[4] = tmp4; var tmp5 = BezierEasing.calcBezier(5 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[5] = tmp5; var tmp6 = BezierEasing.calcBezier(6 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[6] = tmp6; var tmp7 = BezierEasing.calcBezier(7 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[7] = tmp7; var tmp8 = BezierEasing.calcBezier(8 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[8] = tmp8; var tmp9 = BezierEasing.calcBezier(9 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[9] = tmp9; var tmp10 = BezierEasing.calcBezier(10 * BezierEasing.SAMPLE_STEP_SIZE,x1,x2); sampleValues[10] = tmp10; var getTForX = function(x) { var intervalStart = 0.0; var currentSample = 1; var lastSample = 10; while(currentSample != lastSample && sampleValues[currentSample] <= x) { intervalStart += BezierEasing.SAMPLE_STEP_SIZE; ++currentSample; } --currentSample; var dist = (x - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]); var guessForT = intervalStart + dist * BezierEasing.SAMPLE_STEP_SIZE; var initialSlope = BezierEasing.getSlope(guessForT,x1,x2); if(initialSlope >= 0.001) { return BezierEasing.newtonRaphsonIterate(x,guessForT,x1,x2); } else if(initialSlope == 0.0) { return guessForT; } else { return BezierEasing.binarySubdivide(x,intervalStart,intervalStart + BezierEasing.SAMPLE_STEP_SIZE,x1,x2); } }; var bezierEasing = function(ratio) { if(ratio == 0) { return 0; } else if(ratio == 1) { return 1; } else { return BezierEasing.calcBezier(getTForX(ratio),y1,y2); } }; return bezierEasing; } BezierEasing.calcBezier = function(t,a1,a2) { return (((1 - 3 * a2 + 3 * a1) * t + (3 * a2 - 6 * a1)) * t + 3 * a1) * t; } BezierEasing.getSlope = function(t,a1,a2) { return 3 * (1 - 3 * a2 + 3 * a1) * t * t + 2 * (3 * a2 - 6 * a1) * t + 3 * a1; } BezierEasing.binarySubdivide = function(ratio,a,b,x1,x2) { var currentX; var t; var i = 0; while(true) { t = a + (b - a) / 2; currentX = BezierEasing.calcBezier(t,x1,x2) - ratio; if(currentX > 0) { b = t; } else { a = t; } var tmp; if(Math.abs(currentX) > 0.0000001) { ++i; tmp = (_$UInt_UInt_$Impl_$().default).gt(10,i); } else { tmp = false; } if(!tmp) { break; } } return t; } BezierEasing.newtonRaphsonIterate = function(x,t,x1,x2) { var currentSlope = BezierEasing.getSlope(t,x1,x2); if(currentSlope == 0.0) { return t; } var currentX = BezierEasing.calcBezier(t,x1,x2) - x; t -= currentX / currentSlope; var currentSlope1 = BezierEasing.getSlope(t,x1,x2); if(currentSlope1 == 0.0) { return t; } var currentX1 = BezierEasing.calcBezier(t,x1,x2) - x; t -= currentX1 / currentSlope1; var currentSlope2 = BezierEasing.getSlope(t,x1,x2); if(currentSlope2 == 0.0) { return t; } var currentX2 = BezierEasing.calcBezier(t,x1,x2) - x; t -= currentX2 / currentSlope2; var currentSlope3 = BezierEasing.getSlope(t,x1,x2); if(currentSlope3 == 0.0) { return t; } var currentX3 = BezierEasing.calcBezier(t,x1,x2) - x; t -= currentX3 / currentSlope3; return t; } BezierEasing.linearEasing = function(ratio) { return ratio; } BezierEasing.NEWTON_ITERATIONS = 4 BezierEasing.NEWTON_MIN_SLOPE = 0.001 BezierEasing.SUBDIVISION_PRECISION = 0.0000001 BezierEasing.SUBDIVISION_MAX_ITERATIONS = 10 BezierEasing.SPLINE_TABLE_SIZE = 11 BezierEasing.SAMPLE_STEP_SIZE = 0.1 // Export exports.default = BezierEasing;