7#include <glm/gtx/easing.hpp>
9#include "core/reflect.h"
11namespace Vkm::Engine {
19using EasingFunction = float (*)(float);
26#define VKM_EASINGS(X) \
27 X(Linear, "linear", linearInterpolation) \
29 X(EaseInQuad, "easeInQuad", quadraticEaseIn) \
30 X(EaseOutQuad, "easeOutQuad", quadraticEaseOut) \
31 X(EaseInOutQuad, "easeInOutQuad", quadraticEaseInOut) \
33 X(EaseInCubic, "easeInCubic", cubicEaseIn) \
34 X(EaseOutCubic, "easeOutCubic", cubicEaseOut) \
35 X(EaseInOutCubic, "easeInOutCubic", cubicEaseInOut) \
37 X(EaseInQuart, "easeInQuart", quarticEaseIn) \
38 X(EaseOutQuart, "easeOutQuart", quarticEaseOut) \
39 X(EaseInOutQuart, "easeInOutQuart", quarticEaseInOut) \
41 X(EaseInQuint, "easeInQuint", quinticEaseIn) \
42 X(EaseOutQuint, "easeOutQuint", quinticEaseOut) \
43 X(EaseInOutQuint, "easeInOutQuint", quinticEaseInOut) \
45 X(EaseInSine, "easeInSine", sineEaseIn) \
46 X(EaseOutSine, "easeOutSine", sineEaseOut) \
47 X(EaseInOutSine, "easeInOutSine", sineEaseInOut) \
49 X(EaseInExpo, "easeInExpo", exponentialEaseIn) \
50 X(EaseOutExpo, "easeOutExpo", exponentialEaseOut) \
51 X(EaseInOutExpo, "easeInOutExpo", exponentialEaseInOut) \
53 X(EaseInCirc, "easeInCirc", circularEaseIn) \
54 X(EaseOutCirc, "easeOutCirc", circularEaseOut) \
55 X(EaseInOutCirc, "easeInOutCirc", circularEaseInOut) \
57 X(EaseInBack, "easeInBack", backEaseIn) \
58 X(EaseOutBack, "easeOutBack", backEaseOut) \
59 X(EaseInOutBack, "easeInOutBack", backEaseInOut) \
61 X(EaseInElastic, "easeInElastic", elasticEaseIn) \
62 X(EaseOutElastic, "easeOutElastic", elasticEaseOut) \
63 X(EaseInOutElastic, "easeInOutElastic", elasticEaseInOut) \
65 X(EaseInBounce, "easeInBounce", bounceEaseIn) \
66 X(EaseOutBounce, "easeOutBounce", bounceEaseOut) \
67 X(EaseInOutBounce, "easeInOutBounce", bounceEaseInOut)
76enum class Easing : uint8_t {
77#define VKM_EASING_ID(id, name, fn) id,
78 VKM_EASINGS(VKM_EASING_ID)
91inline EasingFunction easingFunction(Easing easing) {
93 static constexpr EasingFunction FUNCTIONS[] = {
94#define VKM_EASING_FN(id, name, fn) +[](float t) { return glm::fn(t); },
95 VKM_EASINGS(VKM_EASING_FN)
98 static_assert(std::size(FUNCTIONS) ==
static_cast<std::size_t
>(Easing::Count));
99 const auto index =
static_cast<std::size_t
>(easing);
100 return index < std::size(FUNCTIONS) ? FUNCTIONS[index] : FUNCTIONS[0];
105#define VKM_EASING_NAME(id, name, fn) name,
106VKM_ENUM_NAMES(::Vkm::Engine::Easing, VKM_EASINGS(VKM_EASING_NAME))
107#undef VKM_EASING_NAME