sandbox
Loading...
Searching...
No Matches
animator.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_ANIMATIONS_ANIMATOR_HPP_
3#define LIBSBX_ANIMATIONS_ANIMATOR_HPP_
4
5#include <algorithm>
6#include <cmath>
7#include <functional>
8#include <optional>
9#include <unordered_map>
10#include <utility>
11#include <vector>
12
13#include <libsbx/utility/hashed_string.hpp>
14#include <libsbx/utility/iterator.hpp>
15
16#include <libsbx/math/vector3.hpp>
17#include <libsbx/math/quaternion.hpp>
18#include <libsbx/math/matrix4x4.hpp>
20
21#include <libsbx/assets/assets_module.hpp>
22
23#include <libsbx/animations/skeleton.hpp>
24
25namespace sbx::animations {
26
27class animator {
28
29public:
30
31 struct state {
33 math::uuid animation_id{};
34 bool is_looping = true;
35 std::float_t speed = 1.0f;
36 }; // struct state
37
38 struct transition {
41 std::float_t duration = 0.25f;
42 std::function<bool(const animator&)> condition;
43 std::optional<std::float_t> exit_time = 0.0f;
44 }; // struct transition
45
46 struct parameters {
47 std::unordered_map<utility::hashed_string, bool> bool_values;
48 std::unordered_map<utility::hashed_string, std::float_t> float_values;
49 std::unordered_map<utility::hashed_string, bool> trigger_values;
50 }; // struct parameters
51
53 math::vector3 position{math::vector3::zero};
54 math::quaternion rotation{math::quaternion::identity};
55 math::vector3 scale{math::vector3::one};
56 }; // struct bone_transform
57
58 auto add_state(const state& new_state) -> void;
59
60 auto add_transition(transition&& transition) -> void;
61
62 auto set_bool(const utility::hashed_string& key, bool value) -> void;
63
64 auto set_float(const utility::hashed_string& key, std::float_t value) -> void;
65
66 auto set_trigger(const utility::hashed_string& key) -> void;
67
68 auto reset_trigger(const utility::hashed_string& key) -> void;
69
70 auto play(const utility::hashed_string& state_name, const bool instant = false, const std::float_t cross_fade = 0.0f) -> void;
71
72 auto update(const std::float_t delta_time) -> void;
73
74 auto evaluate_locals(const skeleton& skeleton) -> std::vector<bone_transform>;
75
76 auto evaluate_pose(const skeleton& skeleton, const std::vector<bone_transform>& locals) -> std::vector<math::matrix4x4>;
77
78 auto current_state_name() const -> const utility::hashed_string&;
79
80 auto is_in_transition() const -> bool;
81
82 auto bool_parameter(const utility::hashed_string& key) const -> std::optional<bool>;
83
84 auto float_parameter(const utility::hashed_string& key) const -> std::optional<std::float_t>;
85
86 auto trigger_parameter(const utility::hashed_string& key) const -> std::optional<bool>;
87
88private:
89
90 auto _start_playback(const state& target_state, const bool instant, const std::float_t cross_fade) -> void;
91
92 auto _wrap_state_time(const state& state, std::float_t time) const -> std::float_t;
93
94 auto _has_valid_clip(const state& state) const -> bool;
95
96private:
97
98 std::unordered_map<utility::hashed_string, state> _state_map;
99 std::vector<transition> _transitions;
100 parameters _parameters{};
101
102 state _current_state{};
103 state _next_state{};
104 std::float_t _current_state_time{0.0f};
105 std::float_t _next_state_time{0.0f};
106
107 bool _is_in_transition{false};
108 std::float_t _cross_fade_duration{0.0f};
109 std::float_t _cross_fade_elapsed{0.0f};
110
111}; // class animator
112
113} // namespace sbx::animations
114
115#endif // LIBSBX_ANIMATIONS_ANIMATOR_HPP_
Definition: animator.hpp:27
Definition: skeleton.hpp:21
Definition: quaternion.hpp:25
Definition: uuid.hpp:160
Definition: vector3.hpp:23
Definition: hashed_string.hpp:17
Matrix casting and decomposition utilities.
Definition: animator.hpp:46
Definition: animator.hpp:31
Definition: animator.hpp:38