From a813837040f507b7057485b6a54dc8bdcc3a1ef5 Mon Sep 17 00:00:00 2001 From: Filip Gawin Date: Sun, 2 Sep 2018 23:08:29 +0200 Subject: [PATCH] Convert AnimationBone and Animatior to unique ptr --- rwengine/src/ai/CharacterController.cpp | 2 +- rwengine/src/engine/Animator.cpp | 2 +- rwengine/src/loaders/LoaderIFP.cpp | 6 +++--- rwengine/src/loaders/LoaderIFP.hpp | 23 +++++++++++++++++------ rwengine/src/objects/CharacterObject.cpp | 10 +++------- rwengine/src/objects/CutsceneObject.cpp | 2 +- rwengine/src/objects/GameObject.cpp | 4 ---- rwengine/src/objects/GameObject.hpp | 4 ++-- tests/test_Animation.cpp | 20 +++++++++----------- 9 files changed, 37 insertions(+), 36 deletions(-) diff --git a/rwengine/src/ai/CharacterController.cpp b/rwengine/src/ai/CharacterController.cpp index 4af7785c..4f70ce97 100644 --- a/rwengine/src/ai/CharacterController.cpp +++ b/rwengine/src/ai/CharacterController.cpp @@ -676,7 +676,7 @@ bool Activities::UseItem::update(CharacterObject *character, auto world = character->engine; const auto &weapon = world->data->weaponData.at(itemslot); auto &state = character->getCurrentState().weapons[itemslot]; - auto animator = character->animator; + auto &animator = character->animator; auto shootcycle = find_cycle(weapon->animation1); auto throwcycle = find_cycle(weapon->animation2); diff --git a/rwengine/src/engine/Animator.cpp b/rwengine/src/engine/Animator.cpp index 5749839c..2c4ee627 100644 --- a/rwengine/src/engine/Animator.cpp +++ b/rwengine/src/engine/Animator.cpp @@ -38,7 +38,7 @@ void Animator::tick(float dt) { if (!frame) { continue; } - state.boneInstances.insert({bone.second, frame}); + state.boneInstances.emplace(bone.second.get(), frame); } } diff --git a/rwengine/src/loaders/LoaderIFP.cpp b/rwengine/src/loaders/LoaderIFP.cpp index c2c2a6ab..8da70800 100644 --- a/rwengine/src/loaders/LoaderIFP.cpp +++ b/rwengine/src/loaders/LoaderIFP.cpp @@ -81,7 +81,7 @@ bool LoaderIFP::loadFromMemory(char* data) { CPAN* cpan = read(data, dataI); ANIM* frames = read(data, dataI); - auto bonedata = new AnimationBone; + auto bonedata = std::make_unique(); bonedata->name = frames->name; bonedata->frames.reserve(frames->frames); @@ -131,14 +131,14 @@ bool LoaderIFP::loadFromMemory(char* data) { std::transform(framename.begin(), framename.end(), framename.begin(), ::tolower); - animation->bones.insert({framename, bonedata}); + animation->bones.emplace(framename, std::move(bonedata)); } data_offs = animstart + animroot->base.size; std::transform(animname.begin(), animname.end(), animname.begin(), ::tolower); - animations.insert({animname, animation}); + animations.emplace(animname, animation); } return true; diff --git a/rwengine/src/loaders/LoaderIFP.hpp b/rwengine/src/loaders/LoaderIFP.hpp index cb7a7d6a..c3ebbe0b 100644 --- a/rwengine/src/loaders/LoaderIFP.hpp +++ b/rwengine/src/loaders/LoaderIFP.hpp @@ -41,6 +41,21 @@ struct AnimationBone { Data type; std::vector frames; + AnimationBone() = default; + + AnimationBone(const std::string& p_name, int32_t p_previous, int32_t p_next, + float p_duration, Data p_type, + const std::vector& p_frames) + : name(p_name) + , previous(p_previous) + , next(p_next) + , duration(p_duration) + , type(p_type) + , frames(p_frames) { + } + + ~AnimationBone() = default; + AnimationKeyframe getInterpolatedKeyframe(float time); AnimationKeyframe getKeyframe(float time); }; @@ -52,13 +67,9 @@ struct AnimationBone { */ struct Animation { std::string name; - std::map bones; + std::map> bones; - ~Animation() { - for (auto &bone_pair : bones) { - delete bone_pair.second; - } - } + ~Animation() = default; float duration; }; diff --git a/rwengine/src/objects/CharacterObject.cpp b/rwengine/src/objects/CharacterObject.cpp index 6ef2192e..3122d425 100644 --- a/rwengine/src/objects/CharacterObject.cpp +++ b/rwengine/src/objects/CharacterObject.cpp @@ -41,7 +41,7 @@ CharacterObject::CharacterObject(GameWorld* engine, const glm::vec3& pos, setClump(info->getModel()->clone()); if (info->getModel()) { setModel(info->getModel()); - animator = new Animator(getClump()); + animator = std::make_unique(getClump()); createActor(); } @@ -240,7 +240,7 @@ glm::vec3 CharacterObject::updateMovementAnimation(float dt) { const auto& root = modelroot->getChildren()[0]; auto it = movementAnimation->bones.find(root->getName()); if (it != movementAnimation->bones.end()) { - auto rootBone = it->second; + auto& rootBone = it->second; float step = dt; RW_CHECK( animator->getAnimation(AnimIndexMovement), @@ -321,13 +321,9 @@ void CharacterObject::changeCharacterModel(const std::string& name) { engine->data->loadTXD(modelName + ".txd"); auto newmodel = engine->data->loadClump(modelName + ".dff"); - if (animator) { - delete animator; - } - setModel(newmodel); - animator = new Animator(getClump()); + animator = std::make_unique(getClump()); } void CharacterObject::updateCharacter(float dt) { diff --git a/rwengine/src/objects/CutsceneObject.cpp b/rwengine/src/objects/CutsceneObject.cpp index 6f87f154..27e37cdc 100644 --- a/rwengine/src/objects/CutsceneObject.cpp +++ b/rwengine/src/objects/CutsceneObject.cpp @@ -16,7 +16,7 @@ CutsceneObject::CutsceneObject(GameWorld *engine, const glm::vec3 &pos, setModel(getModelInfo()->getModel()); } setClump(getModel()->clone()); - animator = new Animator(getClump()); + animator = std::make_unique(getClump()); } void CutsceneObject::tick(float dt) { diff --git a/rwengine/src/objects/GameObject.cpp b/rwengine/src/objects/GameObject.cpp index 05544503..4512e008 100644 --- a/rwengine/src/objects/GameObject.cpp +++ b/rwengine/src/objects/GameObject.cpp @@ -5,10 +5,6 @@ #include "engine/Animator.hpp" GameObject::~GameObject() { - if (animator) { - delete animator; - } - if (modelinfo_) { modelinfo_->removeReference(); } diff --git a/rwengine/src/objects/GameObject.hpp b/rwengine/src/objects/GameObject.hpp index 60c07482..83022832 100644 --- a/rwengine/src/objects/GameObject.hpp +++ b/rwengine/src/objects/GameObject.hpp @@ -11,9 +11,9 @@ #include #include +#include #include -class Animator; class GameWorld; /** @@ -45,7 +45,7 @@ public: GameWorld* engine = nullptr; - Animator* animator = nullptr; /// Object's animator. + std::unique_ptr animator; /// Object's animator. bool inWater = false; diff --git a/tests/test_Animation.cpp b/tests/test_Animation.cpp index d1f1bb3e..e251c992 100644 --- a/tests/test_Animation.cpp +++ b/tests/test_Animation.cpp @@ -19,17 +19,15 @@ BOOST_AUTO_TEST_CASE(test_matrix) { Animator animator(test_model); animation->duration = 1.f; - animation->bones["player"] = new AnimationBone{ - "player", - 0, - 0, - 1.0f, - AnimationBone::RT0, - { - {glm::quat{1.0f,0.0f,0.0f,0.0f}, glm::vec3(0.f, 0.f, 0.f), glm::vec3(), 0.f, 0}, - {glm::quat{1.0f,0.0f,0.0f,0.0f}, glm::vec3(0.f, 1.f, 0.f), glm::vec3(), 1.0f, 1}, - } - }; + animation->bones.emplace( + "player", std::make_unique( + "player", 0, 0, 1.0f, AnimationBone::RT0, + std::vector{ + {glm::quat{1.0f, 0.0f, 0.0f, 0.0f}, + glm::vec3(0.f, 0.f, 0.f), glm::vec3(), 0.f, 0}, + {glm::quat{1.0f, 0.0f, 0.0f, 0.0f}, + glm::vec3(0.f, 1.f, 0.f), glm::vec3(), 1.0f, 1}, + })); animator.playAnimation(0, animation, 1.f, false);