diff --git a/examples/17_generate_pow.html b/examples/17_generate_pow.html new file mode 100644 index 00000000..42bd01ae --- /dev/null +++ b/examples/17_generate_pow.html @@ -0,0 +1,71 @@ + + + + Tween.js / easing with a power of number + + + + + +
+

tween.js

+

17 _ Easing with Pow

+

TWEEN.Easing.generatePow() provides easing with a power of number.

+
+ +
+ + + + + + + diff --git a/src/Easing.ts b/src/Easing.ts index b2edbf58..9639783d 100644 --- a/src/Easing.ts +++ b/src/Easing.ts @@ -195,6 +195,30 @@ const Easing = { return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5 }, }, + generatePow: function ( + power = 4, + ): { + In(amount: number): number + Out(amount: number): number + InOut(amount: number): number + } { + power = power < Number.EPSILON ? Number.EPSILON : power + power = power > 10000 ? 10000 : power + return { + In: function (amount: number): number { + return amount ** power + }, + Out: function (amount: number): number { + return 1 - (1 - amount) ** power + }, + InOut: function (amount: number): number { + if (amount < 0.5) { + return (amount * 2) ** power / 2 + } + return (1 - (2 - amount * 2) ** power) / 2 + 0.5 + }, + } + }, } export default Easing diff --git a/src/tests.ts b/src/tests.ts index 7162e471..74258b0e 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2019,6 +2019,50 @@ export const tests = { test.done() }, + 'Test TWEEN.Easing.generatePow(1) equals Linear'(test: Test): void { + const ease1 = TWEEN.Easing.generatePow(1) + + const compareWithLinear = (ease: EasingFunctionGroup, amount: number) => { + const linearResult = TWEEN.Easing.Linear.None(amount) + test.equal(linearResult, ease.In(amount)) + test.equal(linearResult, ease.Out(amount)) + test.equal(linearResult, ease.InOut(amount)) + } + compareWithLinear(ease1, 0) + compareWithLinear(ease1, 0.25) + compareWithLinear(ease1, 0.5) + compareWithLinear(ease1, 0.75) + compareWithLinear(ease1, 1) + compareWithLinear(ease1, -1) + compareWithLinear(ease1, Infinity) + + test.done() + }, + + 'Test TWEEN.Easing.generatePow(n) should pass 0.0, 0.5, 1.0'(test: Test): void { + const checkEdgeValue = (ease: EasingFunctionGroup) => { + test.equal(ease.InOut(0.0), 0.0) + test.equal(ease.In(0.0), 0.0) + test.equal(ease.Out(0.0), 0.0) + + test.equal(ease.InOut(0.5), 0.5) + + test.equal(ease.InOut(1.0), 1.0) + test.equal(ease.In(1.0), 1.0) + test.equal(ease.Out(1.0), 1.0) + } + checkEdgeValue(TWEEN.Easing.generatePow(Number.NEGATIVE_INFINITY)) + checkEdgeValue(TWEEN.Easing.generatePow(-1.0)) + checkEdgeValue(TWEEN.Easing.generatePow(1)) + checkEdgeValue(TWEEN.Easing.generatePow(Math.LOG2E)) + checkEdgeValue(TWEEN.Easing.generatePow(Math.PI)) + checkEdgeValue(TWEEN.Easing.generatePow()) + checkEdgeValue(TWEEN.Easing.generatePow(6)) + checkEdgeValue(TWEEN.Easing.generatePow(Number.POSITIVE_INFINITY)) + + test.done() + }, + 'Test TWEEN.Tween.update() with no arguments'(test: Test): void { const clock = FakeTimers.install() const targetNow = {x: 0.0}