From 6389e6b25f81186a58471dda4ae01ac2c9dec1ce Mon Sep 17 00:00:00 2001 From: Jiga228 Date: Sun, 31 May 2026 20:38:30 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20UType::o?= =?UTF-8?q?bject=5Fptr=20=D0=B8=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B5=D0=B3=D0=BE=20=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=B1=D0=B8=D0=BD=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B8=D0=B7=20std?= =?UTF-8?q?::shared=5Fptr=20=D0=B8=20std::weak=5Fptr=20=D0=B8=D0=B7-=D0=B7?= =?UTF-8?q?=D0=B0=20=D1=83=D0=B6=D0=B0=D1=81=D0=BD=D0=BE=D0=B9=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Core/CoreInstance.cpp | 2 + Core/Game/Actors/Actor.cpp | 13 +- Core/Game/Actors/Actor.hpp | 7 +- Core/Game/SaveMap/SaveMap.cpp | 26 +-- Core/Game/SaveMap/SaveMap.hpp | 19 +- Core/Game/World/World.cpp | 14 +- Core/Game/World/World.hpp | 23 ++- Core/Types/object_ptr.cpp | 3 - Core/Types/object_ptr.hpp | 185 ------------------ TestGame/src/Worlds/TestWorld.cpp | 13 +- Tests/CMakeLists.txt | 1 - Tests/ObjectPtrTest.cpp | 59 ------ Tests/SaveMapTest.cpp | 6 +- .../RenderEngine/UwURenderEngine.cpp | 7 +- 14 files changed, 67 insertions(+), 311 deletions(-) delete mode 100644 Core/Types/object_ptr.cpp delete mode 100644 Core/Types/object_ptr.hpp delete mode 100644 Tests/ObjectPtrTest.cpp diff --git a/Core/Core/CoreInstance.cpp b/Core/Core/CoreInstance.cpp index d1ecdbc..46726dd 100644 --- a/Core/Core/CoreInstance.cpp +++ b/Core/Core/CoreInstance.cpp @@ -74,6 +74,7 @@ CoreInstance::CoreInstance() render_engine_ = RenderEngineFactory(*this); } catch (const std::exception& e) { + render_engine_ = nullptr; std::cerr << "[!] Init render engine: " << e.what() << '\n'; return; } @@ -83,6 +84,7 @@ CoreInstance::CoreInstance() game_ = GameFactory(*this); } catch (const std::exception& e) { + game_ = nullptr; std::cout << "[!] Init game instance: " << e.what() << '\n'; return; } diff --git a/Core/Game/Actors/Actor.cpp b/Core/Game/Actors/Actor.cpp index 14a7fe7..19f17cd 100644 --- a/Core/Game/Actors/Actor.cpp +++ b/Core/Game/Actors/Actor.cpp @@ -2,7 +2,6 @@ #include "Game/SaveMap/SaveMap.hpp" #include "Game/World/World.hpp" -#include "Log/Log.hpp" void Actor::OnDestroy() { @@ -16,17 +15,17 @@ Actor::Actor() : loc_(new Vector3D), rot_(new Vector3D), scale_(new Vector3D) std::shared_ptr Actor::save() { return std::make_shared("Actor") - ->SaveObject("loc", static_cast>(loc_)) - ->SaveObject("rot", static_cast>(rot_)) - ->SaveObject("scale", UType::object_ptr(scale_)) + ->SaveObject("loc", loc_) + ->SaveObject("rot", rot_) + ->SaveObject("scale", scale_) ->SaveListStrings("tags", std::move(tags)); } void Actor::load(std::shared_ptr save) { - loc_ = static_cast>(save->GetObject("loc")); - rot_ = static_cast>(save->GetObject("rot")); - scale_ = static_cast>(save->GetObject("scale")); + loc_ = std::static_pointer_cast(save->GetObject("loc")); + rot_ = std::static_pointer_cast(save->GetObject("rot")); + scale_ = std::static_pointer_cast(save->GetObject("scale")); tags = std::move(save->GetListString("tags")); } diff --git a/Core/Game/Actors/Actor.hpp b/Core/Game/Actors/Actor.hpp index 2a4787f..744c194 100644 --- a/Core/Game/Actors/Actor.hpp +++ b/Core/Game/Actors/Actor.hpp @@ -7,7 +7,6 @@ #include "Game/SaveMap/ISave.h" #include "Delegate/Delegate.h" #include "Math/Vector.hpp" -#include "Types/object_ptr.hpp" class World; GENERATE_META(Actor) @@ -17,7 +16,7 @@ class Actor : public ISave, public IRTTI World* world_; std::string name_; - UType::object_ptr loc_, rot_, scale_; + std::shared_ptr loc_, rot_, scale_; std::list tags; @@ -42,14 +41,14 @@ public: * Вызывает делегат OnSetActorLocate */ void SetActorLocate(const Vector3D& loc) noexcept; - inline const UType::object_ptr GetActorLocate() const { return loc_; } + inline Vector3D GetActorLocate() const { return *loc_; } /* * Изменяет ориентацию в пространстве * Вызывает делегат OnSetActorRotate */ void SetActorRotate(const Vector3D& rot) noexcept; - inline const UType::object_ptr GetActorRotate() const { return rot_; } + inline Vector3D GetActorRotate() const { return *rot_; } void AddTag(const std::string& tag) noexcept; void RemoveTag(const std::string& tag) noexcept; diff --git a/Core/Game/SaveMap/SaveMap.cpp b/Core/Game/SaveMap/SaveMap.cpp index ec18bf5..6766567 100644 --- a/Core/Game/SaveMap/SaveMap.cpp +++ b/Core/Game/SaveMap/SaveMap.cpp @@ -97,7 +97,7 @@ SaveMap::SaveMap(const std::string& json_data) end = object_json.find('\"', begin); std::string object_name = object_json.substr(begin, end - begin); - UType::object_ptr object_ptr(MakeObjectByName(object_name)); + std::shared_ptr object_ptr(MakeObjectByName(object_name)); object_ptr->load(std::make_shared(object_json)); save_objects[name.c_str() + 1] = object_ptr; @@ -171,10 +171,10 @@ SaveMap::SaveMap(const std::string& json_data) } } else if (name[1] == 'o') { - save_vector_objects[key] = std::vector>(); + save_vector_objects[key] = std::vector>(); if (arr_data.length() == 2) continue; - std::vector>& vector_object = save_vector_objects[key]; + std::vector>& vector_object = save_vector_objects[key]; size_t j = 1; while (j < arr_data.length()) @@ -198,7 +198,7 @@ SaveMap::SaveMap(const std::string& json_data) size_t end_name = object_json.find('\"', begin_name); std::string object_name = object_json.substr(begin_name, end_name - begin_name); - UType::object_ptr object_ptr(MakeObjectByName(object_name)); + std::shared_ptr object_ptr(MakeObjectByName(object_name)); object_ptr->load(std::make_shared(object_json)); vector_object.push_back(object_ptr); @@ -272,10 +272,10 @@ SaveMap::SaveMap(const std::string& json_data) } } else if (name[1] == 'o') { - save_list_objects[key] = std::list>(); + save_list_objects[key] = std::list>(); if (arr_data.length() == 2) continue; - std::list>& list_object = save_list_objects[key]; + std::list>& list_object = save_list_objects[key]; size_t j = 1; while (j < arr_data.length()) @@ -299,7 +299,7 @@ SaveMap::SaveMap(const std::string& json_data) size_t end_name = object_json.find('\"', begin_name); std::string object_name = object_json.substr(begin_name, end_name - begin_name); - UType::object_ptr object_ptr(MakeObjectByName(object_name)); + std::shared_ptr object_ptr(MakeObjectByName(object_name)); object_ptr->load(std::make_shared(object_json)); list_object.push_back(object_ptr); @@ -389,7 +389,7 @@ std::shared_ptr SaveMap::SaveString(const char* name, const std::string return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveObject(const char* name, UType::object_ptr object) noexcept +std::shared_ptr SaveMap::SaveObject(const char* name, std::shared_ptr object) noexcept { save_objects[name] = object; return std::shared_ptr(this); @@ -413,7 +413,7 @@ std::shared_ptr SaveMap::SaveVectorStrings(const char* name, std::vecto return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveVectorObject(const char* name, std::vector>&& value) noexcept +std::shared_ptr SaveMap::SaveVectorObject(const char* name, std::vector>&& value) noexcept { save_vector_objects[name] = std::move(value); return std::shared_ptr(this); @@ -437,7 +437,7 @@ std::shared_ptr SaveMap::SaveListStrings(const char* name, std::list(this); } -std::shared_ptr SaveMap::SaveListObject(const char* name, std::list>&& value) noexcept +std::shared_ptr SaveMap::SaveListObject(const char* name, std::list>&& value) noexcept { save_list_objects[name] = std::move(value); return std::shared_ptr(this); @@ -458,7 +458,7 @@ std::string SaveMap::GetString(const char* name) return save_string[name]; } -UType::object_ptr SaveMap::GetObject(const char* name) +std::shared_ptr SaveMap::GetObject(const char* name) { return save_objects[name]; } @@ -478,7 +478,7 @@ std::vector SaveMap::GetVectorString(const char* name) return save_vector_strings[name]; } -std::vector>& SaveMap::GetVectorObject(const char* name) +std::vector>& SaveMap::GetVectorObject(const char* name) { return save_vector_objects[name]; } @@ -498,7 +498,7 @@ std::list& SaveMap::GetListString(const char* name) return save_list_strings[name]; } -std::list>& SaveMap::GetListObject(const char* name) +std::list>& SaveMap::GetListObject(const char* name) { return save_list_objects[name]; } diff --git a/Core/Game/SaveMap/SaveMap.hpp b/Core/Game/SaveMap/SaveMap.hpp index d3d2549..907686e 100644 --- a/Core/Game/SaveMap/SaveMap.hpp +++ b/Core/Game/SaveMap/SaveMap.hpp @@ -1,7 +1,6 @@ #pragma once #include "ISave.h" -#include "Types/object_ptr.hpp" #include #include @@ -18,18 +17,18 @@ class SaveMap final std::unordered_map save_long; std::unordered_map save_double; std::unordered_map save_string; - std::unordered_map> save_objects; + std::unordered_map> save_objects; // Массивы std::unordered_map> save_vector_integer; std::unordered_map> save_vector_double; - std::unordered_map>> save_vector_objects; + std::unordered_map>> save_vector_objects; std::unordered_map> save_vector_strings; // Связаные списки std::unordered_map> save_list_integer; std::unordered_map> save_list_double; - std::unordered_map>> save_list_objects; + std::unordered_map>> save_list_objects; std::unordered_map> save_list_strings; static ISave* MakeObjectByName(const std::string& name); @@ -48,29 +47,29 @@ public: std::shared_ptr SaveInteger(const char* name, int value) noexcept; std::shared_ptr SaveDouble(const char* name, double value) noexcept; std::shared_ptr SaveString(const char* name, const std::string& value) noexcept; - std::shared_ptr SaveObject(const char* name, UType::object_ptr object) noexcept; + std::shared_ptr SaveObject(const char* name, std::shared_ptr object) noexcept; std::shared_ptr SaveVectorInteger(const char* name, std::vector&& value) noexcept; std::shared_ptr SaveVectorDouble(const char* name, std::vector&& value) noexcept; std::shared_ptr SaveVectorStrings(const char* name, std::vector&& value) noexcept; - std::shared_ptr SaveVectorObject(const char* name, std::vector>&& value) noexcept; + std::shared_ptr SaveVectorObject(const char* name, std::vector>&& value) noexcept; std::shared_ptr SaveListInteger(const char* name, std::list&& value) noexcept; std::shared_ptr SaveListDouble(const char* name, std::list&& value) noexcept; std::shared_ptr SaveListStrings(const char* name, std::list&& value) noexcept; - std::shared_ptr SaveListObject(const char* name, std::list>&& value) noexcept; + std::shared_ptr SaveListObject(const char* name, std::list>&& value) noexcept; // Методы получения значенй long long GetInteger(const char* name); double GetDouble(const char* name); std::string GetString(const char* name); - UType::object_ptr GetObject(const char* name); + std::shared_ptr GetObject(const char* name); std::vector& GetVectorInteger(const char* name); std::vector& GetVectorDouble(const char* name); std::vector GetVectorString(const char* name); - std::vector>& GetVectorObject(const char* name); + std::vector>& GetVectorObject(const char* name); std::list& GetListInteger(const char* name); std::list& GetListDouble(const char* name); std::list& GetListString(const char* name); - std::list>& GetListObject(const char* name); + std::list>& GetListObject(const char* name); std::shared_ptr getParent() const { return parent_; } const std::string& getClassName() const { return class_name; } diff --git a/Core/Game/World/World.cpp b/Core/Game/World/World.cpp index 694d925..4077346 100644 --- a/Core/Game/World/World.cpp +++ b/Core/Game/World/World.cpp @@ -2,7 +2,7 @@ #include "Game/SaveMap/SaveMap.hpp" -World::World(GameInstance& game_instance) : game_instance(game_instance) +World::World(GameInstance& game_instance) : game_instance_(game_instance) { } @@ -34,7 +34,7 @@ std::shared_ptr World::save() void World::load(std::shared_ptr save) { std::vector actors_IDs = save->GetVectorString("ActorsIDs"); - std::list> act = std::move(reinterpret_cast>&>(save->GetListObject("Actors"))); + std::list> act = std::move(reinterpret_cast>&>(save->GetListObject("Actors"))); size_t i_id = 0; for (auto& i : act) @@ -46,13 +46,13 @@ void World::load(std::shared_ptr save) } } -void World::DestroyActor(UType::object_ptr ptr) +void World::DestroyActor(std::weak_ptr ptr) { - if (ptr.get() == nullptr) + std::shared_ptr actor = ptr.lock(); + if (actor.get() == nullptr) return; - std::string name = ptr->GetName(); + std::string name = actor->GetName(); + actor->OnDestroy(); actors_map.erase(name); - ptr->OnDestroy(); - ptr.destroy(); } diff --git a/Core/Game/World/World.hpp b/Core/Game/World/World.hpp index f409299..e5b5f03 100644 --- a/Core/Game/World/World.hpp +++ b/Core/Game/World/World.hpp @@ -7,16 +7,15 @@ #include "RTTI.h" #include "Game/Actors/Actor.hpp" -#include "Types/object_ptr.hpp" class GameInstance; GENERATE_META(World); class World : public ISave { - GameInstance& game_instance; + GameInstance& game_instance_; - std::unordered_map> actors_map; + std::unordered_map> actors_map; public: World(GameInstance& game_instance); @@ -25,7 +24,7 @@ public: virtual void BeginPlay(); virtual void Tick(double delta_time); - GameInstance& GetGameInstance() const { return game_instance; } + GameInstance& GetGameInstance() const { return game_instance_; } #pragma region ISave std::shared_ptr save() override; @@ -33,21 +32,21 @@ public: #pragma endregion template - std::vector> GetActorsByClass() + std::vector> GetActorsByClass() { - std::vector> list; + std::vector> list; for (auto i = actors_map.cbegin(); i != actors_map.cend(); ++i) { - if (T* cast_object = RTTI::dyn_cast(i->second.get())) - list.push_back(UType::object_ptr(cast_object)); + if (RTTI::dyn_cast(i->second.get())) + list.push_back(std::static_pointer_cast(i->second)); } return list; } template - UType::object_ptr SpawnActorFormClass(std::string name, const Vector3D& loc = { 0, 0, 0 }, const Vector3D& rot = { 0, 0, 0 }) + std::weak_ptr SpawnActorFormClass(std::string name, const Vector3D& loc = { 0, 0, 0 }, const Vector3D& rot = { 0, 0, 0 }) { - UType::object_ptr object(new T()); + std::shared_ptr object = std::make_shared(); object->SetActorLocate(loc); object->SetActorRotate(rot); static_cast(object)->world_ = this; @@ -55,7 +54,7 @@ public: return object; } - void DestroyActor(UType::object_ptr ptr); + void DestroyActor(std::weak_ptr ptr); template> Container GetActorsByTag(std::string tag) @@ -76,7 +75,7 @@ public: } template - UType::object_ptr GetActorByID(const std::string& id) + std::weak_ptr GetActorByID(const std::string& id) { return actors_map[id]; } diff --git a/Core/Types/object_ptr.cpp b/Core/Types/object_ptr.cpp deleted file mode 100644 index eb83a39..0000000 --- a/Core/Types/object_ptr.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "object_ptr.hpp" - -std::unordered_map UType::counter::owners_map; \ No newline at end of file diff --git a/Core/Types/object_ptr.hpp b/Core/Types/object_ptr.hpp deleted file mode 100644 index aa1146f..0000000 --- a/Core/Types/object_ptr.hpp +++ /dev/null @@ -1,185 +0,0 @@ - -#pragma once - -#include -#include -#include - -namespace UType -{ - template - class object_ptr; - - class counter - { - struct counter_owners - { - std::atomic_bool is_destroyed; - std::mutex mutex; - std::list owners; - - counter_owners() - : is_destroyed(false) - { - } - - counter_owners(const counter_owners&) = delete; - counter_owners& operator=(const counter_owners&) = delete; - - counter_owners(counter_owners&& other) noexcept - : is_destroyed(other.is_destroyed.load()) - , owners(std::move(other.owners)) - { - } - - counter_owners& operator=(counter_owners&& other) noexcept - { - if (this != &other) - { - is_destroyed.store(other.is_destroyed.load()); - owners = std::move(other.owners); - } - return *this; - } - }; - static std::unordered_map owners_map; - - public: - template -static void add_owner(object_ptr& ptr) - { - auto counter = owners_map.find(ptr.ptr_.load()); - if (counter == owners_map.end()) - { - counter_owners owners; - owners.owners.push_back(&ptr); - auto [it, inserted] = owners_map.try_emplace(ptr.ptr_.load(), std::move(owners)); - if (!inserted) - { - ptr.ptr_.store(nullptr); - } - } - else if (!counter->second.is_destroyed) - { - std::lock_guard lock(counter->second.mutex); - counter->second.owners.push_back(&ptr); - } - else - ptr.ptr_.store(nullptr); - } - - template - static void remove_owner(object_ptr& ptr) - { - auto counter = owners_map.find(ptr.ptr_); - if (counter != owners_map.end()) - { - counter->second.owners.remove(&ptr); - - if (counter->second.is_destroyed) - { - ptr.ptr_.store(nullptr); - } - else if (counter->second.owners.empty()) - { - counter->second.is_destroyed.store(true); - for (auto& owner : counter->second.owners) - static_cast*>(owner)->ptr_.store(nullptr); - delete static_cast(counter->first); - owners_map.erase(counter); - } - } - } - - template - static void remove_object(Ty* ptr) - { - auto counter = owners_map.find(ptr); - if (counter != owners_map.end()) - { - counter->second.is_destroyed.store(true); - for (auto& owner : counter->second.owners) - static_cast*>(owner)->ptr_.store(nullptr); - delete ptr; - owners_map.erase(counter); - } - } - }; - - template - class object_ptr - { - std::atomic ptr_; - public: - explicit object_ptr(Ty* ptr = nullptr) - { - ptr_.store(ptr); - if (ptr) counter::add_owner(*this); - } - - object_ptr(const object_ptr& ptr) - { - ptr_.store(ptr.ptr_); - if (ptr.ptr_) counter::add_owner(*this); - } - - object_ptr(object_ptr&& ptr) noexcept - { - ptr_.store(ptr.ptr_); - if (ptr.ptr_) counter::add_owner(*this); - ptr.ptr_.store(nullptr); - } - - ~object_ptr() - { - if (ptr_) counter::remove_owner(*this); - } - - void reset(Ty* new_ptr = nullptr) - { - if (ptr_) counter::remove_owner(*this); - ptr_.store(new_ptr); - if (new_ptr) counter::add_owner(*this); - } - - void reset(const object_ptr& ptr) - { - if (ptr_) counter::remove_owner(*this); - ptr_.store(ptr.ptr_); - if (ptr.ptr_) counter::add_owner(*this); - } - - void destroy() - { - if (ptr_) counter::remove_object(ptr_); - } - - Ty* get() const { return ptr_.load(); } - Ty& operator*() const - { - if (!ptr_.load()) - throw std::runtime_error("Null pointer"); - return *ptr_; - } - Ty* operator->() const - { - if (!ptr_.load()) - throw std::runtime_error("Null pointer"); - return ptr_.load(); - } - operator bool() const noexcept { return ptr_.load() != nullptr; } - object_ptr& operator=(const object_ptr& ptr) - { - reset(ptr); - return *this; - } - - template - explicit operator object_ptr() const noexcept - { - return object_ptr(reinterpret_cast(ptr_.load())); - } - - friend class counter; - }; -} \ No newline at end of file diff --git a/TestGame/src/Worlds/TestWorld.cpp b/TestGame/src/Worlds/TestWorld.cpp index 4ec1cb8..f15442a 100644 --- a/TestGame/src/Worlds/TestWorld.cpp +++ b/TestGame/src/Worlds/TestWorld.cpp @@ -11,9 +11,11 @@ TestWorld::TestWorld(GameInstance& game_instance) : World(game_instance) void TestWorld::BeginPlay() { World::BeginPlay(); - std::vector> meshes = GetActorsByClass(); + std::vector> meshes = GetActorsByClass(); for (const auto& i : meshes) - Loging::Log("Load actor: " + i->GetName()); + { + Loging::Log("Load actor: " + i.lock()->GetName()); + } } void TestWorld::Tick(double delta_time) @@ -23,11 +25,12 @@ void TestWorld::Tick(double delta_time) time += delta_time; if (time >= 10.0) { - std::vector> meshes = GetActorsByClass(); + std::vector> meshes = GetActorsByClass(); if (!meshes.empty()) { - Loging::Message("TestWorld destroy: " + meshes[0]->GetName()); - DestroyActor(static_cast>(meshes[0])); + std::shared_ptr mesh = meshes[0].lock(); + Loging::Message("TestWorld destroy: " + mesh->GetName()); + DestroyActor(meshes[0]); time = 7.0; return; } diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 696181f..6582a9c 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -15,7 +15,6 @@ file(GLOB SRC "ObjectPtrTest.cpp" "${PROJECT_SOURCE_DIR}/Core/Game/SaveMap/SaveMap.cpp" - "${PROJECT_SOURCE_DIR}/Core/Types/object_ptr.cpp" ) add_executable(Tests ${SRC}) diff --git a/Tests/ObjectPtrTest.cpp b/Tests/ObjectPtrTest.cpp deleted file mode 100644 index d6704fc..0000000 --- a/Tests/ObjectPtrTest.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include "Types/object_ptr.hpp" - -class TestClass -{ - int* test_ptr_; -public: - TestClass(int* test_ptr) : test_ptr_(test_ptr) - { - *test_ptr_ = 1; - } - - ~TestClass() - { - *test_ptr_ = 2; - } -}; - -TEST(object_ptr_test, base_test) -{ - int* test = new int(123); - UType::object_ptr ptr(test); - EXPECT_EQ(*ptr.get(), 123); - - UType::object_ptr ptr2(ptr); - EXPECT_EQ(*ptr2.get(), 123); - EXPECT_EQ(ptr2.get(), ptr.get()); - - ptr.destroy(); - EXPECT_EQ(ptr.get(), nullptr); - EXPECT_EQ(ptr2.get(), nullptr); -} - -TEST(object_ptr_test, check_destry) -{ - UType::object_ptr ptr(new int(123)), ptr2(ptr); - - ptr.destroy(); - EXPECT_EQ(ptr.get(), nullptr); - EXPECT_EQ(ptr2.get(), nullptr); -} - -TEST(object_ptr_test, check_destroy) -{ - int* test = new int(0); - { - UType::object_ptr ptr(new TestClass(test)); - EXPECT_EQ(*test, 1); - } - EXPECT_EQ(*test, 2); - - *test = 0; - { - UType::object_ptr ptr(new TestClass(test)); - UType::object_ptr ptr2(ptr); - EXPECT_EQ(*test, 1); - } - EXPECT_EQ(*test, 2); -} \ No newline at end of file diff --git a/Tests/SaveMapTest.cpp b/Tests/SaveMapTest.cpp index a69874b..3fd8b6b 100644 --- a/Tests/SaveMapTest.cpp +++ b/Tests/SaveMapTest.cpp @@ -158,14 +158,15 @@ TEST(SaveMapTest, check_load_with_custom_type) EXPECT_EQ(test_vector_string[i], save_map.GetVectorString("TestVectorString")[i]); } - UType::object_ptr obj = static_cast>(save_map.GetObject("CustomObject")); + std::shared_ptr obj = std::static_pointer_cast(save_map.GetObject("CustomObject")); + CustomObject test_obj; test_obj.num = 123; test_obj.str = "str123"; test_obj.dbl = 123.45; EXPECT_EQ(*obj.get(), test_obj); - std::vector> vec_obj = reinterpret_cast>&>(save_map.GetVectorObject("CustomObjects")); + std::vector> vec_obj = reinterpret_cast>&>(save_map.GetVectorObject("CustomObjects")); std::vector vec_obj_test = { new CustomObject, new CustomObject, @@ -179,7 +180,6 @@ TEST(SaveMapTest, check_load_with_custom_type) for (auto i = 0; i < 2; i++) { EXPECT_EQ(*vec_obj[i].get(), *vec_obj_test[i]); - vec_obj[i].destroy(); delete vec_obj_test[i]; } } \ No newline at end of file diff --git a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp index 4a23135..cf00c64 100644 --- a/UwURenderEngine/RenderEngine/UwURenderEngine.cpp +++ b/UwURenderEngine/RenderEngine/UwURenderEngine.cpp @@ -1043,9 +1043,12 @@ UwURenderEngine::~UwURenderEngine() void UwURenderEngine::start() { World* world = core_.GetGameInstance()->GetWorld(); - std::vector> meshes = world->GetActorsByClass(); + std::vector> meshes = world->GetActorsByClass(); for (auto& i : meshes) - i->load_model(i->GetModelName()); + { + std::shared_ptr mesh = i.lock(); + mesh->load_model(mesh->GetModelName()); + } while (!glfwWindowShouldClose(get_window())) {