Started working on AnimationLibrary.
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// Created by martin on 11.04.25.
|
||||
//
|
||||
|
||||
#include "3rdparty/json/json.hpp"
|
||||
#include "AnimGraph/AnimLibrary.h"
|
||||
#include "TestAnimData.h"
|
||||
#include "catch.hpp"
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
TEST_CASE("Serialize AnimLibrary", "[AnimLibrary]") {
|
||||
AnimLibrary library;
|
||||
|
||||
TestAnimData::SingleBoneSkeleton single_bone_testdata;
|
||||
|
||||
REQUIRE(library.AddAnimationFile(
|
||||
"translation_x",
|
||||
single_bone_testdata.animation_translate_x_resource.m_filename));
|
||||
REQUIRE(library.AddAnimationFile(
|
||||
"translation_y",
|
||||
single_bone_testdata.animation_translate_y_resource.m_filename));
|
||||
|
||||
// serialize
|
||||
json library_data;
|
||||
library_data = library;
|
||||
|
||||
// deserialize
|
||||
AnimLibrary library_deserialized;
|
||||
library_deserialized = library_data;
|
||||
|
||||
CHECK(library_deserialized.mAnimations.size() == library.mAnimations.size());
|
||||
for (AnimLibrary::AnimationResourceMap::const_iterator iter =
|
||||
library.mAnimations.cbegin();
|
||||
iter != library.mAnimations.cend();
|
||||
++iter) {
|
||||
CHECK(
|
||||
library_deserialized.mAnimations.find(iter->first)
|
||||
!= library_deserialized.mAnimations.end());
|
||||
}
|
||||
}
|
||||
@@ -200,10 +200,12 @@ TEST_CASE_METHOD(
|
||||
graph_context.m_skeleton = skeleton.get();
|
||||
graph_context.m_animation_map["trans_x"] = {
|
||||
"trans_x",
|
||||
"",
|
||||
animation_translate_x.get(),
|
||||
animation_translate_x_sync_track};
|
||||
graph_context.m_animation_map["trans_y"] = {
|
||||
"trans_y",
|
||||
"",
|
||||
animation_translate_y.get(),
|
||||
animation_translate_y_sync_track};
|
||||
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
//
|
||||
// Created by martin on 11.04.25.
|
||||
//
|
||||
|
||||
#include "TestAnimData.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "ozz/animation/offline/animation_builder.h"
|
||||
#include "ozz/animation/offline/raw_animation.h"
|
||||
#include "ozz/animation/offline/raw_skeleton.h"
|
||||
#include "ozz/base/io/archive.h"
|
||||
#include "ozz/base/log.h"
|
||||
|
||||
namespace TestAnimData {
|
||||
|
||||
SingleBoneSkeleton::SingleBoneSkeleton() {
|
||||
using namespace ozz::animation::offline;
|
||||
|
||||
RawSkeleton raw_skeleton;
|
||||
RawSkeleton::Joint raw_joint;
|
||||
|
||||
raw_joint.name = "Bone0";
|
||||
raw_joint.transform.translation.x = 1.f;
|
||||
raw_joint.transform.translation.y = 2.f;
|
||||
raw_joint.transform.translation.z = 3.f;
|
||||
|
||||
raw_skeleton.roots.push_back(raw_joint);
|
||||
|
||||
SkeletonBuilder skeleton_builder;
|
||||
skeleton = skeleton_builder(raw_skeleton);
|
||||
|
||||
// SingleBoneSkeleton Animations
|
||||
ozz::animation::offline::RawAnimation raw_animation_translation_x;
|
||||
raw_animation_translation_x.name = "TranslationX";
|
||||
RawAnimation::JointTrack bone0_track;
|
||||
RawAnimation::JointTrack::Translations bone0_translations;
|
||||
|
||||
// animation_translate_x
|
||||
RawAnimation::TranslationKey translation_key;
|
||||
translation_key.time = 0.f;
|
||||
translation_key.value = ozz::math::Float3(0.f, 0.f, 0.f);
|
||||
bone0_translations.push_back(translation_key);
|
||||
|
||||
translation_key.time = 1.f;
|
||||
translation_key.value = ozz::math::Float3(1.f, 0.f, 0.f);
|
||||
bone0_translations.push_back(translation_key);
|
||||
|
||||
bone0_track.translations = bone0_translations;
|
||||
raw_animation_translation_x.tracks.push_back(bone0_track);
|
||||
raw_animation_translation_x.duration = 1.f;
|
||||
if (!raw_animation_translation_x.Validate()) {
|
||||
std::cerr << "Error: could animation raw data invalid!" << std::endl;
|
||||
}
|
||||
|
||||
AnimationBuilder animation_builder;
|
||||
animation_translate_x = animation_builder(raw_animation_translation_x);
|
||||
|
||||
animation_translate_x_resource.m_animation = animation_translate_x.get();
|
||||
SaveAnimation("single_bone_translation_z.ozz", animation_translate_x.get());
|
||||
animation_translate_x_resource.m_name = "single_bone_translation_z";
|
||||
animation_translate_x_resource.m_filename = "single_bone_translation_z.ozz";
|
||||
|
||||
// animation_translate_y
|
||||
ozz::animation::offline::RawAnimation raw_animation_translation_y;
|
||||
raw_animation_translation_y.name = "TranslationY";
|
||||
bone0_translations.clear();
|
||||
|
||||
translation_key.time = 0.f;
|
||||
translation_key.value = ozz::math::Float3(0.f, 0.f, 0.f);
|
||||
bone0_translations.push_back(translation_key);
|
||||
|
||||
translation_key.time = 1.f;
|
||||
translation_key.value = ozz::math::Float3(0.f, 1.f, 0.f);
|
||||
bone0_translations.push_back(translation_key);
|
||||
|
||||
bone0_track.translations = bone0_translations;
|
||||
raw_animation_translation_y.tracks.push_back(bone0_track);
|
||||
raw_animation_translation_y.duration = 1.f;
|
||||
if (!raw_animation_translation_y.Validate()) {
|
||||
std::cerr << "Error: could animation raw data invalid!" << std::endl;
|
||||
}
|
||||
|
||||
animation_translate_y = animation_builder(raw_animation_translation_y);
|
||||
|
||||
animation_translate_y_resource.m_animation = animation_translate_y.get();
|
||||
SaveAnimation("single_bone_translation_y.ozz", animation_translate_y.get());
|
||||
animation_translate_y_resource.m_name = "single_bone_translation_y";
|
||||
animation_translate_y_resource.m_filename = "single_bone_translation_y.ozz";
|
||||
}
|
||||
|
||||
bool SingleBoneSkeleton::SaveSkeleton(
|
||||
const char* filename,
|
||||
ozz::animation::Skeleton* skeleton) {
|
||||
assert(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SingleBoneSkeleton::SaveAnimation(
|
||||
const char* filename,
|
||||
ozz::animation::Animation* animation) {
|
||||
ozz::io::File file(filename, "wb");
|
||||
if (!file.opened()) {
|
||||
ozz::log::Err() << "Failed to create animation file " << filename << "."
|
||||
<< std::endl;
|
||||
delete animation;
|
||||
return false;
|
||||
}
|
||||
|
||||
ozz::io::OArchive archive(&file);
|
||||
|
||||
archive << *animation;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace TestAnimData
|
||||
@@ -0,0 +1,37 @@
|
||||
//
|
||||
// Created by martin on 11.04.25.
|
||||
//
|
||||
|
||||
#ifndef TESTANIMDATA_H
|
||||
#define TESTANIMDATA_H
|
||||
|
||||
#include "AnimGraph/AnimGraphData.h"
|
||||
#include "AnimGraph/SyncTrack.h"
|
||||
#include "ozz/animation/offline/skeleton_builder.h"
|
||||
#include "ozz/animation/runtime/animation.h"
|
||||
#include "ozz/animation/runtime/skeleton.h"
|
||||
|
||||
namespace TestAnimData {
|
||||
|
||||
struct SingleBoneSkeleton {
|
||||
SingleBoneSkeleton();
|
||||
|
||||
ozz::unique_ptr<ozz::animation::Skeleton> skeleton = nullptr;
|
||||
|
||||
ozz::unique_ptr<ozz::animation::Animation> animation_translate_x = nullptr;
|
||||
AnimationResource animation_translate_x_resource;
|
||||
SyncTrack animation_translate_x_sync_track = {};
|
||||
|
||||
ozz::unique_ptr<ozz::animation::Animation> animation_translate_y = nullptr;
|
||||
AnimationResource animation_translate_y_resource;
|
||||
SyncTrack animation_translate_y_sync_track = {};
|
||||
|
||||
bool SaveSkeleton(const char* filename, ozz::animation::Skeleton* skeleton);
|
||||
bool SaveAnimation(
|
||||
const char* filename,
|
||||
ozz::animation::Animation* animation);
|
||||
};
|
||||
|
||||
} // namespace TestAnimData
|
||||
|
||||
#endif //TESTANIMDATA_H
|
||||
Reference in New Issue
Block a user