From 835c0147feda2559f464175a5f547c558d3743fc Mon Sep 17 00:00:00 2001 From: Filip Gawin Date: Fri, 23 Nov 2018 21:38:00 +0100 Subject: [PATCH] Use static instance of AnimationBone --- rwengine/src/engine/Animator.cpp | 4 ++-- rwengine/src/loaders/LoaderIFP.cpp | 24 ++++++++++++------------ rwengine/src/loaders/LoaderIFP.hpp | 2 +- rwengine/src/objects/CharacterObject.cpp | 8 ++++---- tests/test_Animation.cpp | 2 +- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/rwengine/src/engine/Animator.cpp b/rwengine/src/engine/Animator.cpp index 7fda5c21..a2af6d90 100644 --- a/rwengine/src/engine/Animator.cpp +++ b/rwengine/src/engine/Animator.cpp @@ -28,12 +28,12 @@ void Animator::tick(float dt) { if (state.animation == nullptr) continue; if (state.boneInstances.empty()) { - for (const auto& [name, bonePtr] : state.animation->bones) { + for (auto& [name, bone] : state.animation->bones) { auto frame = model->findFrame(name); if (!frame) { continue; } - state.boneInstances.emplace(bonePtr.get(), frame); + state.boneInstances.emplace(&bone, frame); } } diff --git a/rwengine/src/loaders/LoaderIFP.cpp b/rwengine/src/loaders/LoaderIFP.cpp index 8da70800..8cc73052 100644 --- a/rwengine/src/loaders/LoaderIFP.cpp +++ b/rwengine/src/loaders/LoaderIFP.cpp @@ -81,9 +81,9 @@ bool LoaderIFP::loadFromMemory(char* data) { CPAN* cpan = read(data, dataI); ANIM* frames = read(data, dataI); - auto bonedata = std::make_unique(); - bonedata->name = frames->name; - bonedata->frames.reserve(frames->frames); + AnimationBone boneData{}; + boneData.name = frames->name; + boneData.frames.reserve(frames->frames); data_offs += ((8 + frames->base.size) - sizeof(ANIM)); @@ -93,37 +93,37 @@ bool LoaderIFP::loadFromMemory(char* data) { float time = 0.f; if (type == "KR00") { - bonedata->type = AnimationBone::R00; + boneData.type = AnimationBone::R00; for (int d = 0; d < frames->frames; ++d) { glm::quat q = glm::conjugate(*read(data, dataI)); time = *read(data, dataI); - bonedata->frames.emplace_back(q, glm::vec3(0.f, 0.f, 0.f), + boneData.frames.emplace_back(q, glm::vec3(0.f, 0.f, 0.f), glm::vec3(1.f, 1.f, 1.f), time, d); } } else if (type == "KRT0") { - bonedata->type = AnimationBone::RT0; + boneData.type = AnimationBone::RT0; for (int d = 0; d < frames->frames; ++d) { glm::quat q = glm::conjugate(*read(data, dataI)); glm::vec3 p = *read(data, dataI); time = *read(data, dataI); - bonedata->frames.emplace_back( + boneData.frames.emplace_back( q, p, glm::vec3(1.f, 1.f, 1.f), time, d); } } else if (type == "KRTS") { - bonedata->type = AnimationBone::RTS; + boneData.type = AnimationBone::RTS; for (int d = 0; d < frames->frames; ++d) { glm::quat q = glm::conjugate(*read(data, dataI)); glm::vec3 p = *read(data, dataI); glm::vec3 s = *read(data, dataI); time = *read(data, dataI); - bonedata->frames.emplace_back(q, p, s, time, d); + boneData.frames.emplace_back(q, p, s, time, d); } } - bonedata->duration = time; + boneData.duration = time; animation->duration = - std::max(bonedata->duration, animation->duration); + std::max(boneData.duration, animation->duration); data_offs = start + sizeof(CPAN) + cpan->base.size; @@ -131,7 +131,7 @@ bool LoaderIFP::loadFromMemory(char* data) { std::transform(framename.begin(), framename.end(), framename.begin(), ::tolower); - animation->bones.emplace(framename, std::move(bonedata)); + animation->bones.emplace(framename, std::move(boneData)); } data_offs = animstart + animroot->base.size; diff --git a/rwengine/src/loaders/LoaderIFP.hpp b/rwengine/src/loaders/LoaderIFP.hpp index c3ebbe0b..d4ce8534 100644 --- a/rwengine/src/loaders/LoaderIFP.hpp +++ b/rwengine/src/loaders/LoaderIFP.hpp @@ -67,7 +67,7 @@ struct AnimationBone { */ struct Animation { std::string name; - std::map> bones; + std::map bones; ~Animation() = default; diff --git a/rwengine/src/objects/CharacterObject.cpp b/rwengine/src/objects/CharacterObject.cpp index 267b044e..62f60871 100644 --- a/rwengine/src/objects/CharacterObject.cpp +++ b/rwengine/src/objects/CharacterObject.cpp @@ -254,18 +254,18 @@ glm::vec3 CharacterObject::updateMovementAnimation(float dt) { // keyframes if ((animTime + step) > duration) { glm::vec3 a = - rootBone->getInterpolatedKeyframe(animTime).position; + rootBone.getInterpolatedKeyframe(animTime).position; glm::vec3 b = - rootBone->getInterpolatedKeyframe(duration).position; + rootBone.getInterpolatedKeyframe(duration).position; glm::vec3 d = (b - a); animTranslate.y += d.y; step -= (duration - animTime); animTime = 0.f; } - glm::vec3 a = rootBone->getInterpolatedKeyframe(animTime).position; + glm::vec3 a = rootBone.getInterpolatedKeyframe(animTime).position; glm::vec3 b = - rootBone->getInterpolatedKeyframe(animTime + step).position; + rootBone.getInterpolatedKeyframe(animTime + step).position; glm::vec3 d = (b - a); animTranslate.y += d.y; diff --git a/tests/test_Animation.cpp b/tests/test_Animation.cpp index e251c992..41f346b4 100644 --- a/tests/test_Animation.cpp +++ b/tests/test_Animation.cpp @@ -20,7 +20,7 @@ BOOST_AUTO_TEST_CASE(test_matrix) { animation->duration = 1.f; animation->bones.emplace( - "player", std::make_unique( + "player", AnimationBone( "player", 0, 0, 1.0f, AnimationBone::RT0, std::vector{ {glm::quat{1.0f, 0.0f, 0.0f, 0.0f},