2#include <ozz/animation/runtime/animation.h>
3#include <ozz/base/maths/soa_transform.h>
4#include "AnimationAsset.hpp"
5#include "DataStructures.hpp"
10#include "Function.hpp"
11#include "Queryable.hpp"
30 constexpr inline decltype(x) get_x()
const{
33 constexpr inline decltype(y) get_y()
const{
43 struct Node :
public IAnimGraphable{
47 float max_influence = 1;
52 Node(
Ref<T> s,
const clamped_vec2& pos,
float i = 1) : state(std::static_pointer_cast<IAnimGraphable>(s)), graph_pos(pos), max_influence(i){}
60 bool Sample(
float t,
float start,
float speed,
bool looping, ozz::vector<ozz::math::SoaTransform>&, ozz::animation::SamplingJob::Context& cache,
const ozz::animation::Skeleton* skeleton)
const override;
63 static constexpr uint16_t kmax_nodes = 64;
71 states[id].node = node;
89 return states.at(
id).node;
96 return states.empty();
112 bool Sample(
float t,
float start,
float speed,
bool looping, ozz::vector<ozz::math::SoaTransform>&, ozz::animation::SamplingJob::Context& cache,
const ozz::animation::Skeleton* skeleton)
const override;
124 ozz::vector<ozz::math::SoaTransform> locals;
127 locked_node_hashmap<anim_id_t,Sampler,SpinLock> states;
128 clamped_vec2 blend_pos;
141 static constexpr uint16_t kmax_layers = 32;
148 bool isLooping =
true;
151 double lastPlayTime = 0;
157 } type = TimeMode::Blended;
158 tweeny::tween<float> transition;
164 template<
typename T,
typename decimal>
165 constexpr inline State& SetTransition(
decltype(ID)
id, T interpolation,
decimal duration, Transition::TimeMode mode = Transition::TimeMode::Blended){
166 auto tween = tweeny::from(0.0f).to(1.0f).during(
static_cast<float>(duration * GetApp()->evalNormal)).via(interpolation);
167 exitTransitions[id].transition = tween;
168 exitTransitions[id].type = mode;
175 State(
decltype(ID) ID,
decltype(clip) clip,
decltype(isLooping)
il =
true,
decltype(speed) speed = 1) : ID(ID), clip(clip), isLooping(
il), speed(speed) {}
178 bool hasAutoTransition =
false;
179 decltype(ID) autoTransitionID = 0;
180 Function<void(
decltype(State::ID))> beginCallback, endCallback;
182 inline void DoBegin(
decltype(ID)
prevState) {
188 inline void DoEnd(
decltype(ID) nextState) {
190 endCallback(nextState);
201 hasAutoTransition =
true;
202 autoTransitionID = id;
209 hasAutoTransition =
false;
228 constexpr inline bool HasAutoTransition()
const{
229 return hasAutoTransition;
232 constexpr inline decltype(autoTransitionID) GetAutoTransitionID()
const {
233 return autoTransitionID;
262 states.insert(std::make_pair(state.ID,state));
286 auto& GetSkeletonMask()
const{
290 void SetWeight(
float w){
293 float GetWeight()
const{
297 bool SetAdditive(
bool additive){
298 isAdditive = additive;
302 std::optional<Ref<SkeletonMask>> skeletonMask;
303 double lastPlayTime = 0;
305 bool isAdditive =
false;
306 State& GetStateForID(anim_id_t
id);
307 locked_node_hashmap<anim_id_t,State,SpinLock> states;
310 anim_id_t from = 0, to = 0;
311 decltype(State::Transition::transition) currentTween;
314 anim_id_t currentState = 0;
316 bool isPlaying =
false;
317 bool isBlending =
false;
318 float currentBlendingValue = 0;
320 inline void EndState(State& state,
decltype(State::ID) nextState) {
321 state.DoEnd(nextState);
322 if (state.HasAutoTransition()) {
323 Goto(state.GetAutoTransitionID());
327 void Tick(
const Ref<SkeletonAsset>& skeleton);
329 ozz::vector<ozz::math::SoaTransform> transforms, transformsSecondaryBlending;
330 std::shared_ptr<ozz::animation::SamplingJob::Context> cache = std::make_shared<ozz::animation::SamplingJob::Context>();
338 void Tick(
const Transform& t);
340 inline decltype(skeleton) GetSkeleton()
const{
348 void UpdateSocket(
const std::string&, Transform&)
const;
353 mutable ozz::vector<matrix4> glm_pose;
354 ozz::vector<matrix4> local_pose;
355 ozz::vector<matrix4> skinningmats;
356 ozz::vector<ozz::math::Float4x4> models;
357 ozz::vector<ozz::math::SoaTransform> all_transforms;
359 Vector<std::unique_ptr<Layer>> layers;
375 Layer* GetLayerAtIndex(uint16_t index){
376 return layers.at(index).get();
383 const decltype(glm_pose)&
GetPose(
const Transform& t)
const;
385 const decltype(local_pose)& GetLocalPose();
387 inline const decltype(skinningmats)& GetSkinningMats(){
Definition AnimatorComponent.hpp:136
void UpdateSkeletonData(Ref< SkeletonAsset > sk)
Definition AnimatorComponent.cpp:258
const decltype(glm_pose) & GetPose(const Transform &t) const
Definition AnimatorComponent.cpp:303
AnimatorComponent(Ref< SkeletonAsset > sk)
Definition AnimatorComponent.cpp:33
virtual void DebugDraw(RavEngine::DebugDrawer &dbg, const Transform &) const override
Definition AnimatorComponent.cpp:385
void Tick(const Transform &t)
Definition AnimatorComponent.cpp:108
Layer * AddLayer()
Definition AnimatorComponent.cpp:287
Definition DebugDrawer.hpp:11
Definition AnimatorComponent.hpp:24
Definition concurrentqueue.h:747
uint16 uint16_t
Definition fwd.hpp:117
Definition Animation.hpp:6
Definition AnimatorComponent.hpp:43
bool Sample(float t, float start, float speed, bool looping, ozz::vector< ozz::math::SoaTransform > &, ozz::animation::SamplingJob::Context &cache, const ozz::animation::Skeleton *skeleton) const override
Definition AnimatorComponent.cpp:342
Definition AnimatorComponent.hpp:42
bool Sample(float t, float start, float speed, bool looping, ozz::vector< ozz::math::SoaTransform > &, ozz::animation::SamplingJob::Context &cache, const ozz::animation::Skeleton *skeleton) const override
Definition AnimatorComponent.cpp:346
Node & GetNode(const anim_id_t id)
Definition AnimatorComponent.hpp:88
void DeleteNode(anim_id_t id)
Definition AnimatorComponent.hpp:78
constexpr void SetBlendPos(const clamped_vec2 &newPos)
Definition AnimatorComponent.hpp:118
bool IsEmpty() const
Definition AnimatorComponent.hpp:95
void Clear()
Definition AnimatorComponent.hpp:102
void InsertNode(anim_id_t id, const Node &node)
Definition AnimatorComponent.hpp:70
Definition AnimatorComponent.hpp:243
void InsertState(const State &state)
Definition AnimatorComponent.hpp:261
void Play(float resetPlayhead=false)
Definition AnimatorComponent.cpp:87
void Goto(anim_id_t newState, bool skipTransition=false)
Definition AnimatorComponent.cpp:46
auto GetCurrentState() const
Definition AnimatorComponent.hpp:278
Definition AnimatorComponent.hpp:153
Definition AnimatorComponent.hpp:144
void SetEndCallback(const decltype(endCallback)&ec)
Definition AnimatorComponent.hpp:224
State(decltype(ID) ID, decltype(clip) clip, decltype(isLooping) il=true, decltype(speed) speed=1)
Definition AnimatorComponent.hpp:175
constexpr void SetAutoTransition(decltype(ID) id)
Definition AnimatorComponent.hpp:200
constexpr void ClearAutoTransition()
Definition AnimatorComponent.hpp:208
void SetBeginCallback(const decltype(beginCallback)&bc)
Definition AnimatorComponent.hpp:216
Definition IDebugRenderable.hpp:8
Definition Queryable.hpp:21