Added AnimationFileResource that combine animations with sync tracks.

This commit is contained in:
Martin Felis 2025-03-20 16:16:16 +01:00
parent 86ea476881
commit 887131af37
3 changed files with 21 additions and 6 deletions

View File

@ -33,6 +33,11 @@ struct AnimDataRef {
Pose* ptr = nullptr;
};
struct AnimationFileResource {
ozz::animation::Animation* m_animation;
SyncTrack m_sync_track;
};
struct AnimDataAllocator {
struct PoseList {
Pose* m_anim_data = nullptr;
@ -102,14 +107,14 @@ struct AnimGraphContext {
AnimGraph* m_graph = nullptr;
ozz::animation::Skeleton* m_skeleton = nullptr;
typedef std::map<std::string, ozz::animation::Animation*> AnimationFileMap;
typedef std::map<std::string, AnimationFileResource> AnimationFileMap;
AnimationFileMap m_animation_map;
void freeAnimations() {
AnimationFileMap::iterator animation_map_iter = m_animation_map.begin();
while (animation_map_iter != m_animation_map.end()) {
delete animation_map_iter->second;
delete animation_map_iter->second.m_animation;
animation_map_iter++;
}
}

View File

@ -132,7 +132,8 @@ bool AnimSamplerNode::Init(AnimGraphContext& context) {
AnimGraphContext::AnimationFileMap::const_iterator animation_map_iter;
animation_map_iter = context.m_animation_map.find(m_filename);
if (animation_map_iter != context.m_animation_map.end()) {
m_animation = animation_map_iter->second;
m_animation = animation_map_iter->second.m_animation;
m_sync_track = animation_map_iter->second.m_sync_track;
} else {
m_animation = new ozz::animation::Animation();
ozz::io::File file(m_filename.c_str(), "rb");
@ -150,7 +151,7 @@ bool AnimSamplerNode::Init(AnimGraphContext& context) {
archive >> *m_animation;
context.m_animation_map[m_filename] = m_animation;
context.m_animation_map[m_filename] = {m_animation, SyncTrack()};
}
assert(context.m_skeleton != nullptr);

View File

@ -18,10 +18,15 @@
struct SimpleAnimFixture {
ozz::unique_ptr<ozz::animation::Skeleton> skeleton = nullptr;
ozz::animation::offline::RawAnimation raw_animation_translation_x;
ozz::unique_ptr<ozz::animation::Animation> animation_translate_x = nullptr;
SyncTrack animation_translate_x_sync_track = {};
ozz::animation::offline::RawAnimation raw_animation_translation_y;
ozz::unique_ptr<ozz::animation::Animation> animation_translate_y = nullptr;
SyncTrack animation_translate_y_sync_track = {};
ozz::vector<ozz::math::SoaTransform> animation_output;
ozz::animation::SamplingJob::Context sampling_context;
@ -197,8 +202,12 @@ TEST_CASE_METHOD(
// Prepare animation maps
AnimGraphContext graph_context;
graph_context.m_skeleton = skeleton.get();
graph_context.m_animation_map["trans_x"] = animation_translate_x.get();
graph_context.m_animation_map["trans_y"] = animation_translate_y.get();
graph_context.m_animation_map["trans_x"] = {
animation_translate_x.get(),
animation_translate_x_sync_track};
graph_context.m_animation_map["trans_y"] = {
animation_translate_y.get(),
animation_translate_y_sync_track};
// Instantiate graph
AnimGraphBlendTree blend_tree;