1#include "scene/components/AnimationComponent.h"
2#include "scene/GameObject.h"
24 m_time = std::fmod(m_time, m_clip->
duration);
34 for (
auto& binding : m_bindings)
36 auto& obj = binding.first;
37 auto& trackIndices = binding.second->trackIndices;
38 for (
auto i : trackIndices)
40 auto& track = m_clip->
tracks[i];
41 if (!track.positions.empty())
43 auto pos = Interpolate(track.positions, m_time);
44 obj->SetPosition(pos);
46 if (!track.rotations.empty())
48 auto rot = Interpolate(track.rotations, m_time);
49 obj->SetRotation(rot);
51 if (!track.scales.empty())
53 auto scale = Interpolate(track.scales, m_time);
73 if (m_clip && m_clip->
name == name)
81 auto it = m_clips.find(name);
82 if (it != m_clips.end())
97 void AnimationComponent::BuildBindings()
105 for (
size_t i = 0; i < m_clip->
tracks.size(); ++i)
107 auto& track = m_clip->
tracks[i];
111 auto it = m_bindings.find(targetObject);
112 if (it != m_bindings.end())
114 it->second->trackIndices.push_back(i);
118 auto binding = std::make_unique<ObjectBinding>();
119 binding->object = targetObject;
120 binding->trackIndices.push_back(i);
121 m_bindings.emplace(targetObject, std::move(binding));
127 glm::vec3 AnimationComponent::Interpolate(
const std::vector<KeyFrameVec3>& keys,
float time)
131 return glm::vec3(0.0f);
134 if (keys.size() == 1)
136 return keys[0].value;
139 if (time <= keys.front().time)
141 return keys.front().value;
144 if (time >= keys.back().time)
146 return keys.back().value;
152 for (
size_t i = 1; i < keys.size(); ++i)
154 if (time <= keys[i].time)
161 i0 = i1 > 0 ? i1 - 1 : 0;
163 if (time >= keys[i0].time && time <= keys[i1].time)
165 float deltaTime = keys[i1].time - keys[i0].time;
166 float k = (time - keys[i0].time) / deltaTime;
168 return glm::mix(keys[i0].value, keys[i1].value, k);
171 return keys.back().value;
174 glm::quat AnimationComponent::Interpolate(
const std::vector<KeyFrameQuat>& keys,
float time)
178 return glm::vec3(0.0f);
181 if (keys.size() == 1)
183 return keys[0].value;
186 if (time <= keys.front().time)
188 return keys.front().value;
191 if (time >= keys.back().time)
193 return keys.back().value;
199 for (
size_t i = 1; i < keys.size(); ++i)
201 if (time <= keys[i].time)
208 i0 = i1 > 0 ? i1 - 1 : 0;
210 if (time >= keys[i0].time && time <= keys[i1].time)
212 float deltaTime = keys[i1].time - keys[i0].time;
213 float k = (time - keys[i0].time) / deltaTime;
215 return glm::slerp(keys[i0].value, keys[i1].value, k);
218 return keys.back().value;
void RegisterClip(const std::string &name, const std::shared_ptr< AnimationClip > &clip)
void SetClip(AnimationClip *clip)
void Play(const std::string &name, bool loop=true)
void Update(float deltaTime) override
GameObject * FindChildByName(const std::string &name)
std::vector< TransformTrack > tracks