vkmEngine 1.0.0
A C++ game engine · vkmengine.com
Loading...
Searching...
No Matches
easing.h
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <iterator>
6
7#include <glm/gtx/easing.hpp>
8
9#include "core/reflect.h"
10
11namespace Vkm::Engine {
12
19using EasingFunction = float (*)(float);
20
26#define VKM_EASINGS(X) \
27 X(Linear, "linear", linearInterpolation) \
28 \
29 X(EaseInQuad, "easeInQuad", quadraticEaseIn) \
30 X(EaseOutQuad, "easeOutQuad", quadraticEaseOut) \
31 X(EaseInOutQuad, "easeInOutQuad", quadraticEaseInOut) \
32 \
33 X(EaseInCubic, "easeInCubic", cubicEaseIn) \
34 X(EaseOutCubic, "easeOutCubic", cubicEaseOut) \
35 X(EaseInOutCubic, "easeInOutCubic", cubicEaseInOut) \
36 \
37 X(EaseInQuart, "easeInQuart", quarticEaseIn) \
38 X(EaseOutQuart, "easeOutQuart", quarticEaseOut) \
39 X(EaseInOutQuart, "easeInOutQuart", quarticEaseInOut) \
40 \
41 X(EaseInQuint, "easeInQuint", quinticEaseIn) \
42 X(EaseOutQuint, "easeOutQuint", quinticEaseOut) \
43 X(EaseInOutQuint, "easeInOutQuint", quinticEaseInOut) \
44 \
45 X(EaseInSine, "easeInSine", sineEaseIn) \
46 X(EaseOutSine, "easeOutSine", sineEaseOut) \
47 X(EaseInOutSine, "easeInOutSine", sineEaseInOut) \
48 \
49 X(EaseInExpo, "easeInExpo", exponentialEaseIn) \
50 X(EaseOutExpo, "easeOutExpo", exponentialEaseOut) \
51 X(EaseInOutExpo, "easeInOutExpo", exponentialEaseInOut) \
52 \
53 X(EaseInCirc, "easeInCirc", circularEaseIn) \
54 X(EaseOutCirc, "easeOutCirc", circularEaseOut) \
55 X(EaseInOutCirc, "easeInOutCirc", circularEaseInOut) \
56 \
57 X(EaseInBack, "easeInBack", backEaseIn) \
58 X(EaseOutBack, "easeOutBack", backEaseOut) \
59 X(EaseInOutBack, "easeInOutBack", backEaseInOut) \
60 \
61 X(EaseInElastic, "easeInElastic", elasticEaseIn) \
62 X(EaseOutElastic, "easeOutElastic", elasticEaseOut) \
63 X(EaseInOutElastic, "easeInOutElastic", elasticEaseInOut) \
64 \
65 X(EaseInBounce, "easeInBounce", bounceEaseIn) \
66 X(EaseOutBounce, "easeOutBounce", bounceEaseOut) \
67 X(EaseInOutBounce, "easeInOutBounce", bounceEaseInOut)
68
76enum class Easing : uint8_t {
77#define VKM_EASING_ID(id, name, fn) id,
78 VKM_EASINGS(VKM_EASING_ID)
79#undef VKM_EASING_ID
80 Count
81};
82
91inline EasingFunction easingFunction(Easing easing) {
92 // glm's easings are templates; the unary + decays each wrapping lambda to a pointer.
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)
96#undef VKM_EASING_FN
97 };
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];
101}
102
103} // namespace Vkm::Engine
104
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
108
109#undef VKM_EASINGS