载入中...
搜索中...
未找到
AnimStateMachine.h
浏览该文件的文档.
1#pragma once
2
4#include "common/StateValue.h"
5
6#include <string>
7#include <unordered_map>
8#include <vector>
9
10namespace eve::animation {
11
12class AnimClip;
13class AnimSkeleton;
14
20public:
21 explicit AnimStateMachine(AnimSkeleton *skeleton);
23
26
27 AnimSkeleton *getSkeleton() const { return skeleton_; }
28
29 void addState(const std::string &name, AnimClip *clip);
30 void setEntry(const std::string &name);
31 bool hasState(const std::string &name) const;
32 std::string getCurrentState() const { return currentState_; }
33 int getStateCount() const { return static_cast<int>(states_.size()); }
34
39 int addTransition(const std::string &from, const std::string &to, float blendSeconds);
40
42 void addFloatCondition(int transitionId, const std::string &param, const std::string &op,
43 float threshold);
44 void addBoolCondition(int transitionId, const std::string &param, bool value);
45 void addTriggerCondition(int transitionId, const std::string &param);
47 void setExitTime(int transitionId, float normalizedTime);
48 void setHasExitTime(int transitionId, bool enabled);
49
50 void setFloat(const std::string &name, float value);
51 float getFloat(const std::string &name) const;
52 void setBool(const std::string &name, bool value);
53 bool getBool(const std::string &name) const;
54 void setTrigger(const std::string &name);
55 void resetTrigger(const std::string &name);
57 bool getTrigger(const std::string& name) const {
58 auto it = triggers_.find(name);
59 return it != triggers_.end() && it->second;
60 }
61
63 float getStateTime() const { return stateTime_; }
64 bool isBlending() const { return blending_; }
65
66 void update(float dt);
67
69 bool captureState(StateValue& out) const;
70
76 bool restoreState(const StateValue& in, std::string* err = nullptr);
77
79 bool resetToDefaults();
80
81private:
82 enum class CondKind { Float, Bool, Trigger };
83 enum class FloatOp { Gt, Ge, Lt, Le, Eq, Ne };
84
85 struct Condition {
86 CondKind kind = CondKind::Float;
87 std::string param;
88 FloatOp op = FloatOp::Gt;
89 float threshold = 0.f;
90 bool boolValue = true;
91 };
92
93 struct Transition {
94 std::string from;
95 std::string to;
96 float blendSeconds = 0.2f;
97 bool hasExitTime = false;
98 float exitTime = 0.f;
99 std::vector<Condition> conditions;
100 };
101
102 struct State {
103 std::string name;
104 AnimClip *clip = nullptr;
105 };
106
107 void requireState(const std::string &name) const;
108 Transition &requireTransition(int id);
109 static FloatOp parseFloatOp(const std::string &op);
110 bool conditionsMet(const Transition &tr) const;
111 bool tryTransition();
112
113 AnimSkeleton *skeleton_ = nullptr;
114 AnimPose pose_;
115 AnimPose fromPose_;
116 AnimPose toPose_;
117
118 std::unordered_map<std::string, State> states_;
119 std::vector<std::string> stateOrder_;
120 std::vector<Transition> transitions_;
121
122 std::unordered_map<std::string, float> floats_;
123 std::unordered_map<std::string, bool> bools_;
124 std::unordered_map<std::string, bool> triggers_;
125
126 std::string currentState_;
127 std::string nextState_;
128 float stateTime_ = 0.f;
129 float blendDuration_ = 0.f;
130 float blendElapsed_ = 0.f;
131 bool blending_ = false;
132 bool started_ = false;
133};
134
135} // namespace eve::animation
Tok kind
std::string value
float tr
const char * name
Definition RockMesh.cpp:21
bool enabled
JSON-compatible state value tree used by state hot reload.
Definition StateValue.h:20
Keyframed skeletal animation clip (local TRS tracks per bone). Script type: AnimClip.
Definition AnimClip.h:17
Evaluated local (and optional world) pose for an AnimSkeleton. Script type: AnimPose.
Definition AnimPose.h:15
3D bone hierarchy + bind-pose local TRS for skeletal animation. Independent of ik::Skeleton3D (FABRIK...
Clip-driven animation state machine with float/bool/trigger parameters and cross-fade transitions....
void setHasExitTime(int transitionId, bool enabled)
float getFloat(const std::string &name) const
int addTransition(const std::string &from, const std::string &to, float blendSeconds)
Add transition from → to with blend duration.
void addTriggerCondition(int transitionId, const std::string &param)
bool captureState(StateValue &out) const
Serialize runtime state (params, current/next state, blend).
bool getTrigger(const std::string &name) const
Query a trigger's current state.
bool hasState(const std::string &name) const
void resetTrigger(const std::string &name)
void addBoolCondition(int transitionId, const std::string &param, bool value)
void setTrigger(const std::string &name)
void addFloatCondition(int transitionId, const std::string &param, const std::string &op, float threshold)
Comparison op: ">", ">=", "<", "<=", "==", "!=".
void setBool(const std::string &name, bool value)
void setFloat(const std::string &name, float value)
bool restoreState(const StateValue &in, std::string *err=nullptr)
Restore runtime state captured by captureState().
void addState(const std::string &name, AnimClip *clip)
bool getBool(const std::string &name) const
AnimStateMachine(const AnimStateMachine &)=delete
AnimStateMachine & operator=(const AnimStateMachine &)=delete
void setEntry(const std::string &name)
AnimSkeleton * getSkeleton() const
void setExitTime(int transitionId, float normalizedTime)
Optional: require normalized local time in [0,1] >= exitTime before transition.
bool resetToDefaults()
Clear params and re-seat the entry state (restore fallback).