diff --git a/src/AnimGraph/AnimGraphData.h b/src/AnimGraph/AnimGraphData.h index 225e9df..805863a 100644 --- a/src/AnimGraph/AnimGraphData.h +++ b/src/AnimGraph/AnimGraphData.h @@ -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 AnimationFileMap; + typedef std::map 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++; } } diff --git a/src/AnimGraph/AnimGraphNodes.cc b/src/AnimGraph/AnimGraphNodes.cc index 1e63a2c..e12b0c5 100644 --- a/src/AnimGraph/AnimGraphNodes.cc +++ b/src/AnimGraph/AnimGraphNodes.cc @@ -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); diff --git a/tests/AnimGraphEvalTests.cc b/tests/AnimGraphEvalTests.cc index 7f0de0b..f9baf4f 100644 --- a/tests/AnimGraphEvalTests.cc +++ b/tests/AnimGraphEvalTests.cc @@ -18,10 +18,15 @@ struct SimpleAnimFixture { ozz::unique_ptr skeleton = nullptr; + ozz::animation::offline::RawAnimation raw_animation_translation_x; ozz::unique_ptr animation_translate_x = nullptr; + SyncTrack animation_translate_x_sync_track = {}; + ozz::animation::offline::RawAnimation raw_animation_translation_y; ozz::unique_ptr animation_translate_y = nullptr; + SyncTrack animation_translate_y_sync_track = {}; + ozz::vector 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;