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