3#include "pixelbullet/scene/components/animation_state_component.h"
4#include "pixelbullet/scene/components/transform.h"
10#include <unordered_map>
17 float time_seconds = 0.0f;
23 return lhs.time_seconds == rhs.time_seconds && lhs.transform.position == rhs.transform.position &&
24 lhs.transform.rotation == rhs.transform.rotation && lhs.transform.scale == rhs.transform.scale;
27inline bool operator!=(
const TransformKeyframe& lhs,
const TransformKeyframe& rhs)
32inline void NormalizeTransformAnimationKeys(std::vector<TransformKeyframe>& keys)
34 for (
auto& key : keys)
36 key.time_seconds = std::max(key.time_seconds, 0.0f);
39 std::stable_sort(keys.begin(), keys.end(),
42 std::vector<TransformKeyframe> normalized;
43 normalized.reserve(keys.size());
46 if (!normalized.empty() && std::abs(normalized.back().time_seconds - key.time_seconds) <= 0.0001f)
48 normalized.back() = key;
52 normalized.push_back(key);
56 keys = std::move(normalized);
59inline float ResolveTransformAnimationClipLength(
const std::vector<TransformKeyframe>& keys)
noexcept
61 return keys.empty() ? 0.0f : std::max(keys.back().time_seconds, 0.0f);
66 std::string name =
"Default";
67 std::vector<TransformKeyframe> keys;
72 return lhs.name == rhs.name && lhs.keys == rhs.keys;
75inline bool operator!=(
const TransformAnimationClip& lhs,
const TransformAnimationClip& rhs)
82 NormalizeTransformAnimationKeys(clip.keys);
87 return ResolveTransformAnimationClipLength(clip.keys);
92 std::vector<TransformAnimationClip> clips;
97 return lhs.clips == rhs.clips;
100inline bool operator!=(
const TransformAnimationComponent& lhs,
const TransformAnimationComponent& rhs)
102 return !(lhs == rhs);
105inline std::string NormalizeAnimationClipName(std::string_view name, std::string_view fallback)
107 std::string normalized = name.empty() ? std::string(fallback) : std::string(name);
108 if (normalized.empty())
110 normalized = std::string(fallback);
117 std::unordered_map<std::string, std::size_t> counts;
120 NormalizeTransformAnimationClip(clip);
121 std::string normalized_name = NormalizeAnimationClipName(clip.name,
"Default");
122 const auto [it, inserted] = counts.emplace(normalized_name, 0u);
126 normalized_name +=
" " + std::to_string(it->second + 1u);
128 clip.name = std::move(normalized_name);
136 if (clip.name == name)
148 if (clip.name == name)
159 if (component.clips.empty())
164 if (state !=
nullptr && !state->active_clip.empty())
172 return &component.clips.front();
180 return ResolveTransformAnimationClipLength(*clip);
188 return ResolveTransformAnimationClipLength(component,
nullptr);
193 node[
"timeSeconds"] << keyframe.time_seconds;
194 node[
"position"] << keyframe.transform.position;
195 node[
"rotation"] << keyframe.transform.rotation;
196 node[
"scale"] << keyframe.transform.scale;
202 node[
"timeSeconds"] >> keyframe.time_seconds;
203 node[
"position"] >> keyframe.transform.position;
204 node[
"rotation"] >> keyframe.transform.rotation;
205 node[
"scale"] >> keyframe.transform.scale;
206 keyframe.time_seconds = std::max(keyframe.time_seconds, 0.0f);
212 node[
"name"] << clip.name;
213 node[
"keys"] << clip.keys;
219 if (node.HasProperty(
"name"))
221 node[
"name"] >> clip.name;
225 clip.name =
"Default";
228 if (node.HasProperty(
"keys"))
230 node[
"keys"] >> clip.keys;
237 NormalizeTransformAnimationClip(clip);
243 node[
"clips"] << component.clips;
249 component.clips.clear();
250 if (node.HasProperty(
"clips"))
252 node[
"clips"] >> component.clips;
257 clip.name =
"Default";
258 if (node.HasProperty(
"keys"))
260 node[
"keys"] >> clip.keys;
262 NormalizeTransformAnimationClip(clip);
263 if (!clip.keys.empty() || node.HasProperty(
"enabled"))
265 component.clips.push_back(std::move(clip));
269 NormalizeTransformAnimationComponent(component);
Represents a hierarchical node capable of storing various data types and supporting YAML serializatio...
Definition node.h:45
Definition animation_state_component.h:10