diff --git a/vlib/math/easing.v b/vlib/math/easing.v new file mode 100644 index 0000000000..1f7b1dd993 --- /dev/null +++ b/vlib/math/easing.v @@ -0,0 +1,100 @@ +// Copyright (c) 2020-2022 Leah Lundqvist. All rights reserved. +// Use of this source code is governed by a GPL license +// that can be found in the LICENSE file. +module math + +pub type EasingFunction = fn (arg_1 f64) f64 + +pub enum EasingType { + linear + ease_in_quad + ease_out_quad + ease_in_out_quad + ease_in_cubic + ease_out_cubic + ease_in_out_cubic + ease_in_quart + ease_out_quart + ease_in_out_quart + ease_in_quint + ease_out_quint + ease_in_out_quint +} + +fn linear(x f64) f64 { + return x +} + +fn ease_in_quad(x f64) f64 { + return x * x +} + +fn ease_out_quad(x f64) f64 { + return x * (2.0 - x) +} + +fn ease_in_out_quad(x f64) f64 { + return if x < .5 { 2.0 * x * x } else { -1.0 + (4.0 - 2.0 * x) * x } +} + +fn ease_in_cubic(x f64) f64 { + return x * x * x +} + +fn ease_out_cubic(x f64) f64 { + return (x - 1.0) * (x - 1.0) * (x - 1.0) + 1 +} + +fn ease_in_out_cubic(x f64) f64 { + return if x < .5 { 4.0 * x * x * x } else { (x - 1.0) * (2.0 * x - 2.0) * (2.0 * x - 2.0) + 1.0 } +} + +fn ease_in_quart(x f64) f64 { + return x * x * x * x +} + +fn ease_out_quart(x f64) f64 { + return 1.0 - (x - 1.0) * (x - 1.0) * (x - 1.0) * (x - 1.0) +} + +fn ease_in_out_quart(x f64) f64 { + return if x < 0.5 { + 8.0 * x * x * x * x + } else { + 1.0 - 8.0 * (x - 1.0) * (x - 1.0) * (x - 1.0) * (x - 1.0) + } +} + +fn ease_in_quint(x f64) f64 { + return x * x * x * x * x +} + +fn ease_out_quint(x f64) f64 { + return 1.0 + (x - 1.0) * (x - 1.0) * (x - 1.0) * (x - 1.0) * (x - 1.0) +} + +fn ease_in_out_quint(x f64) f64 { + return if x < 0.5 { + 16.0 * x * x * x * x * x + } else { + 1.0 + 16.0 * (x - 1.0) * (x - 1.0) * (x - 1.0) * (x - 1.0) * (x - 1.0) + } +} + +pub fn easing(easingtype EasingType) EasingFunction { + match easingtype { + .linear { return linear } + .ease_in_quad { return ease_in_quad } + .ease_out_quad { return ease_out_quad } + .ease_in_out_quad { return ease_in_out_quad } + .ease_in_cubic { return ease_in_cubic } + .ease_out_cubic { return ease_out_cubic } + .ease_in_out_cubic { return ease_in_out_cubic } + .ease_in_quart { return ease_in_quart } + .ease_out_quart { return ease_out_quart } + .ease_in_out_quart { return ease_in_out_quart } + .ease_in_quint { return ease_in_quint } + .ease_out_quint { return ease_out_quint } + .ease_in_out_quint { return ease_in_out_quint } + } +}