SleakEngine
0.1.0
C++23 multi-backend game engine
Toggle main menu visibility
Loading...
Searching...
No Matches
AnimationStateMachine.hpp
Go to the documentation of this file.
1
#ifndef _ANIMATIONSTATEMACHINE_HPP_
2
#define _ANIMATIONSTATEMACHINE_HPP_
3
4
#include <
Core/OSDef.hpp
>
5
#include <string>
6
#include <vector>
7
#include <unordered_map>
8
#include <variant>
9
10
namespace
Sleak
{
11
12
class
AnimationClip
;
13
14
/// What the state machine returns each frame for the animator to sample.
15
/// @ingroup animation
16
struct
SampleRequest
{
17
AnimationClip
*
clipA
=
nullptr
;
18
float
timeA
= 0.0f;
19
AnimationClip
*
clipB
=
nullptr
;
// null if not blending
20
float
timeB
= 0.0f;
21
float
blendWeight
= 0.0f;
// 0 = pure A, 1 = pure B
22
};
23
24
/// One named clip binding within the graph, with its own loop/speed settings.
25
/// @ingroup animation
26
struct
AnimationState
{
27
std::string
name
;
28
AnimationClip
*
clip
=
nullptr
;
29
bool
loop
=
true
;
30
float
speed
= 1.0f;
31
};
32
33
/// Comparison used to evaluate a TransitionCondition against a live parameter.
34
/// @ingroup animation
35
enum class
CompareOp
{
36
Equal
,
37
NotEqual
,
38
Greater
,
39
GreaterEqual
,
40
Less
,
41
LessEqual
42
};
43
44
using
ParamValue
= std::variant<bool, float, int>;
45
46
/// One guard on a transition: param op threshold must hold for the transition to fire.
47
/// @ingroup animation
48
struct
TransitionCondition
{
49
std::string
paramName
;
50
CompareOp
op
;
51
ParamValue
threshold
;
52
};
53
54
/// An edge in the state graph, with its blend timing and guard conditions.
55
/// @ingroup animation
56
struct
AnimationTransition
{
57
int
fromState
= -1;
58
int
toState
= -1;
59
float
blendDuration
= 0.3f;
60
bool
waitForClipEnd
=
false
;
61
std::vector<TransitionCondition>
conditions
;
62
};
63
64
/// Graph of animation states and blended transitions, driven by named
65
/// bool/float/int parameters set from gameplay code.
66
/// @ingroup animation
67
class
ENGINE_API
AnimationStateMachine
{
68
public
:
69
AnimationStateMachine
() =
default
;
70
~AnimationStateMachine
() =
default
;
71
72
// Build the state graph
73
/// Adds a state bound to clip, returning its index for use in AddTransition.
74
int
AddState
(
const
std::string& name,
AnimationClip
* clip,
75
bool
loop =
true
,
float
speed = 1.0f);
76
/// Adds a transition edge from -> to, returning its index.
77
int
AddTransition
(
int
from,
int
to,
float
blendDuration = 0.3f,
78
bool
waitForClipEnd =
false
);
79
/// Appends a guard condition to the transition at transIndex.
80
void
AddTransitionCondition
(
int
transIndex,
const
std::string& paramName,
81
CompareOp
op,
ParamValue
threshold);
82
/// Sets the state the machine starts in, with no blend.
83
void
SetDefaultState
(
int
stateIndex);
84
85
// Parameters (set by gameplay code)
86
void
SetBool
(
const
std::string& name,
bool
value);
87
void
SetFloat
(
const
std::string& name,
float
value);
88
void
SetInt
(
const
std::string& name,
int
value);
89
90
// Called each frame by AnimatorComponent
91
/// Advances playback/blend time, evaluates transitions, and returns what to sample this frame.
92
SampleRequest
Update
(
float
deltaTime);
93
94
// Query
95
const
std::string&
GetCurrentStateName
()
const
;
96
bool
IsBlending
()
const
{
return
m_blending; }
97
98
private
:
99
/// True if every condition on trans currently holds (AND logic; vacuously true if empty).
100
bool
EvaluateConditions(
const
AnimationTransition
& trans)
const
;
101
/// Compares param against threshold using op, coercing both to float.
102
bool
CompareParam(
const
ParamValue
& param,
CompareOp
op,
103
const
ParamValue
& threshold)
const
;
104
/// Begins blending from the current state into the transition's target state.
105
void
StartTransition(
int
transIndex);
106
107
std::vector<AnimationState> m_states;
108
std::vector<AnimationTransition> m_transitions;
109
std::unordered_map<std::string, ParamValue> m_params;
110
111
int
m_currentState = -1;
112
float
m_currentTime = 0.0f;
// in ticks
113
114
// Blend state
115
bool
m_blending =
false
;
116
int
m_prevState = -1;
117
float
m_prevTime = 0.0f;
118
float
m_blendElapsed = 0.0f;
119
float
m_blendDuration = 0.0f;
120
};
121
122
}
// namespace Sleak
123
124
#endif
// _ANIMATIONSTATEMACHINE_HPP_
OSDef.hpp
Sleak::AnimationClip
Definition
AnimationClip.hpp:33
Sleak::AnimationStateMachine::IsBlending
bool IsBlending() const
Definition
AnimationStateMachine.hpp:96
Sleak::AnimationStateMachine::SetDefaultState
void SetDefaultState(int stateIndex)
Sets the state the machine starts in, with no blend.
Definition
AnimationStateMachine.cpp:37
Sleak::AnimationStateMachine::AnimationStateMachine
AnimationStateMachine()=default
Sleak::AnimationStateMachine::AddTransition
int AddTransition(int from, int to, float blendDuration=0.3f, bool waitForClipEnd=false)
Adds a transition edge from -> to, returning its index.
Definition
AnimationStateMachine.cpp:16
Sleak::AnimationStateMachine::Update
SampleRequest Update(float deltaTime)
Advances playback/blend time, evaluates transitions, and returns what to sample this frame.
Definition
AnimationStateMachine.cpp:62
Sleak::AnimationStateMachine::SetFloat
void SetFloat(const std::string &name, float value)
Definition
AnimationStateMachine.cpp:47
Sleak::AnimationStateMachine::SetBool
void SetBool(const std::string &name, bool value)
Definition
AnimationStateMachine.cpp:43
Sleak::AnimationStateMachine::~AnimationStateMachine
~AnimationStateMachine()=default
Sleak::AnimationStateMachine::AddTransitionCondition
void AddTransitionCondition(int transIndex, const std::string ¶mName, CompareOp op, ParamValue threshold)
Appends a guard condition to the transition at transIndex.
Definition
AnimationStateMachine.cpp:28
Sleak::AnimationStateMachine::AddState
int AddState(const std::string &name, AnimationClip *clip, bool loop=true, float speed=1.0f)
Adds a state bound to clip, returning its index for use in AddTransition.
Definition
AnimationStateMachine.cpp:9
Sleak::AnimationStateMachine::SetInt
void SetInt(const std::string &name, int value)
Definition
AnimationStateMachine.cpp:51
Sleak::AnimationStateMachine::GetCurrentStateName
const std::string & GetCurrentStateName() const
Definition
AnimationStateMachine.cpp:55
Sleak::CompareOp
CompareOp
Definition
AnimationStateMachine.hpp:35
Sleak::CompareOp::NotEqual
@ NotEqual
Definition
AnimationStateMachine.hpp:37
Sleak::CompareOp::Less
@ Less
Definition
AnimationStateMachine.hpp:40
Sleak::CompareOp::GreaterEqual
@ GreaterEqual
Definition
AnimationStateMachine.hpp:39
Sleak::CompareOp::Greater
@ Greater
Definition
AnimationStateMachine.hpp:38
Sleak::CompareOp::LessEqual
@ LessEqual
Definition
AnimationStateMachine.hpp:41
Sleak::CompareOp::Equal
@ Equal
Definition
AnimationStateMachine.hpp:36
Sleak
Root namespace for everything the engine exposes.
Definition
Camera.hpp:10
Sleak::ParamValue
std::variant< bool, float, int > ParamValue
Definition
AnimationStateMachine.hpp:44
Sleak::AnimationState
Definition
AnimationStateMachine.hpp:26
Sleak::AnimationState::loop
bool loop
Definition
AnimationStateMachine.hpp:29
Sleak::AnimationState::name
std::string name
Definition
AnimationStateMachine.hpp:27
Sleak::AnimationState::speed
float speed
Definition
AnimationStateMachine.hpp:30
Sleak::AnimationState::clip
AnimationClip * clip
Definition
AnimationStateMachine.hpp:28
Sleak::AnimationTransition
Definition
AnimationStateMachine.hpp:56
Sleak::AnimationTransition::toState
int toState
Definition
AnimationStateMachine.hpp:58
Sleak::AnimationTransition::conditions
std::vector< TransitionCondition > conditions
Definition
AnimationStateMachine.hpp:61
Sleak::AnimationTransition::blendDuration
float blendDuration
Definition
AnimationStateMachine.hpp:59
Sleak::AnimationTransition::waitForClipEnd
bool waitForClipEnd
Definition
AnimationStateMachine.hpp:60
Sleak::AnimationTransition::fromState
int fromState
Definition
AnimationStateMachine.hpp:57
Sleak::SampleRequest
Definition
AnimationStateMachine.hpp:16
Sleak::SampleRequest::blendWeight
float blendWeight
Definition
AnimationStateMachine.hpp:21
Sleak::SampleRequest::timeA
float timeA
Definition
AnimationStateMachine.hpp:18
Sleak::SampleRequest::timeB
float timeB
Definition
AnimationStateMachine.hpp:20
Sleak::SampleRequest::clipA
AnimationClip * clipA
Definition
AnimationStateMachine.hpp:17
Sleak::SampleRequest::clipB
AnimationClip * clipB
Definition
AnimationStateMachine.hpp:19
Sleak::TransitionCondition
Definition
AnimationStateMachine.hpp:48
Sleak::TransitionCondition::paramName
std::string paramName
Definition
AnimationStateMachine.hpp:49
Sleak::TransitionCondition::threshold
ParamValue threshold
Definition
AnimationStateMachine.hpp:51
Sleak::TransitionCondition::op
CompareOp op
Definition
AnimationStateMachine.hpp:50
include
public
Runtime
AnimationStateMachine.hpp
Generated on
for SleakEngine by
1.18.0