diff options
Diffstat (limited to 'src/main/java/com/anthonyhilyard/iceberg/util/Easing.java')
-rw-r--r-- | src/main/java/com/anthonyhilyard/iceberg/util/Easing.java | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/main/java/com/anthonyhilyard/iceberg/util/Easing.java b/src/main/java/com/anthonyhilyard/iceberg/util/Easing.java new file mode 100644 index 0000000..da41927 --- /dev/null +++ b/src/main/java/com/anthonyhilyard/iceberg/util/Easing.java @@ -0,0 +1,107 @@ +package com.anthonyhilyard.iceberg.util; + +/** + * Helper functions for smooth easing/interpolation. If you need linear, use net.minecraft.util.math.MathHelper.lerp instead. + */ +public final class Easing +{ + public static enum EasingType + { + None, // Produces step-wise interpolation. + Quad, + Cubic + } + + public static enum EasingDirection + { + In, + Out, + InOut + } + + public static float Ease(float a, float b, float t) + { + return Ease(a, b, t, EasingType.Quad); + } + + public static float Ease(float a, float b, float t, EasingType type) + { + return Ease(a, b, t, type, EasingDirection.InOut); + } + + public static float Ease(float a, float b, float t, EasingType type, EasingDirection direction) + { + switch (type) + { + case None: + default: + return None(a, b, t); + case Quad: + return Quad(a, b, t, direction); + case Cubic: + return Cubic(a, b, t, direction); + } + } + + private static float None(float a, float b, float t) + { + if (t < 0.5f) + { + return a; + } + else + { + return b; + } + } + + private static float Quad(float a, float b, float t, EasingDirection direction) + { + switch (direction) + { + case In: + return a + (b - a) * t * t; + case Out: + return a + (b - a) * (1.0f - (1.0f - t) * (1.0f - t)); + case InOut: + default: + { + t *= 2.0f; + if (t < 1.0f) + { + return a + (b - a) * 0.5f * t * t; + } + else + { + t -= 2.0f; + return a + (a - b) * 0.5f * (t * t - 2.0f); + } + } + } + } + + private static float Cubic(float a, float b, float t, EasingDirection direction) + { + switch (direction) + { + case In: + return a + (b - a) * t * t * t; + case Out: + return a + (b - a) * (1.0f - (1.0f - t) * (1.0f - t) * (1.0f - t)); + case InOut: + default: + { + t *= 2.0f; + if (t < 1.0f) + { + return a + (b - a) * 0.5f * t * t * t; + } + else + { + t -= 2.0f; + return a + (b - a) * 0.5f * (t * t * t + 2.0f); + } + } + } + } +}
\ No newline at end of file |