From 8253b81ab11544f4dec6889a9e850af210c09f83 Mon Sep 17 00:00:00 2001 From: Jiga228 Date: Sun, 28 Jun 2026 14:16:58 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=82=D1=82=D0=B5=D1=80=D0=BD=20Builder=20=D0=B8=D0=B7=20SaveM?= =?UTF-8?q?ap=20=D0=B8=D0=B7-=D0=B7=D0=B0=20=D0=BD=D0=B5=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Game/Actors/Actor.cpp | 11 +- Core/Game/SaveMap/SaveMap.cpp | 41 ++-- Core/Game/SaveMap/SaveMap.hpp | 26 +-- Core/Game/World/World.cpp | 12 + Core/Game/World/World.hpp | 4 +- Core/Math/Vector.cpp | 9 +- TestGame/Worlds/TestWorld.world | 212 ++++++++++-------- TestGame/src/Actors/TestActor.cpp | 15 +- TestGame/src/Actors/TestActor.h | 3 + TestGame/src/Worlds/TestWorld.cpp | 7 +- UwURenderEngine/Game/Actors/Camera.cpp | 4 +- UwURenderEngine/Game/Actors/Mesh/Mesh.cpp | 7 +- .../Game/Actors/Mesh/StaticMesh.cpp | 4 +- 13 files changed, 207 insertions(+), 148 deletions(-) diff --git a/Core/Game/Actors/Actor.cpp b/Core/Game/Actors/Actor.cpp index 2ff3b3c..bae95cf 100644 --- a/Core/Game/Actors/Actor.cpp +++ b/Core/Game/Actors/Actor.cpp @@ -14,11 +14,12 @@ Actor::Actor() : loc_(new Vector3D), rot_(new Vector3D), scale_(new Vector3D) std::shared_ptr Actor::save() { - return std::make_shared("Actor") - ->SaveObject("loc", loc_) - ->SaveObject("rot", rot_) - ->SaveObject("scale", scale_) - ->SaveListStrings("tags", std::move(tags)); + std::shared_ptr save = std::make_shared("Actor"); + save->SaveObject("loc", loc_); + save->SaveObject("rot", rot_); + save->SaveObject("scale", scale_); + save->SaveListStrings("tags", std::move(tags)); + return save; } void Actor::load(std::shared_ptr save) diff --git a/Core/Game/SaveMap/SaveMap.cpp b/Core/Game/SaveMap/SaveMap.cpp index 6766567..9391337 100644 --- a/Core/Game/SaveMap/SaveMap.cpp +++ b/Core/Game/SaveMap/SaveMap.cpp @@ -371,76 +371,64 @@ save_list_objects(std::move(save_map.save_list_objects)) { } -std::shared_ptr SaveMap::SaveInteger(const char* name, int value) noexcept +void SaveMap::SaveInteger(const char* name, int value) noexcept { save_long[name] = value; - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveDouble(const char* name, double value) noexcept +void SaveMap::SaveDouble(const char* name, double value) noexcept { save_double[name] = value; - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveString(const char* name, const std::string& value) noexcept +void SaveMap::SaveString(const char* name, const std::string& value) noexcept { save_string[name] = value; - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveObject(const char* name, std::shared_ptr object) noexcept +void SaveMap::SaveObject(const char* name, std::shared_ptr object) noexcept { save_objects[name] = object; - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveVectorInteger(const char* name, std::vector&& value) noexcept +void SaveMap::SaveVectorInteger(const char* name, std::vector&& value) noexcept { save_vector_integer[name] = std::move(value); - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveVectorDouble(const char* name, std::vector&& value) noexcept +void SaveMap::SaveVectorDouble(const char* name, std::vector&& value) noexcept { save_vector_double[name] = std::move(value); - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveVectorStrings(const char* name, std::vector&& value) noexcept +void SaveMap::SaveVectorStrings(const char* name, std::vector&& value) noexcept { save_vector_strings[name] = std::move(value); - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveVectorObject(const char* name, std::vector>&& value) noexcept +void SaveMap::SaveVectorObject(const char* name, std::vector>&& value) noexcept { save_vector_objects[name] = std::move(value); - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveListInteger(const char* name, std::list&& value) noexcept +void SaveMap::SaveListInteger(const char* name, std::list&& value) noexcept { save_list_integer[name] = std::move(value); - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveListDouble(const char* name, std::list&& value) noexcept +void SaveMap::SaveListDouble(const char* name, std::list&& value) noexcept { save_list_double[name] = std::move(value); - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveListStrings(const char* name, std::list&& value) noexcept +void SaveMap::SaveListStrings(const char* name, std::list&& value) noexcept { save_list_strings[name] = std::move(value); - return std::shared_ptr(this); } -std::shared_ptr SaveMap::SaveListObject(const char* name, std::list>&& value) noexcept +void SaveMap::SaveListObject(const char* name, std::list>&& value) noexcept { save_list_objects[name] = std::move(value); - return std::shared_ptr(this); } long long SaveMap::GetInteger(const char* name) @@ -517,7 +505,7 @@ std::string SaveMap::serialize() noexcept buffer += ",\"s" + key + "\":\"" + value + '\"'; for (auto& [key, value] : save_objects) - buffer += ",\"o" + key + "\":\"" + value->save()->serialize(); + buffer += ",\"o" + key + "\":" + value->save()->serialize(); for (auto& [key, value] : save_vector_integer) { @@ -631,13 +619,12 @@ std::string SaveMap::serialize() noexcept return buffer; } -std::shared_ptr SaveMap::connect_to(const std::shared_ptr& parent) +void SaveMap::connect_to(const std::shared_ptr& parent) { if (this->parent_ != nullptr) throw std::runtime_error("Can't connect to second parent"); this->parent_ = parent; - return std::shared_ptr(this); } std::string SaveMap::CleaningJSON(const std::string& json_data) diff --git a/Core/Game/SaveMap/SaveMap.hpp b/Core/Game/SaveMap/SaveMap.hpp index 907686e..7aa1a36 100644 --- a/Core/Game/SaveMap/SaveMap.hpp +++ b/Core/Game/SaveMap/SaveMap.hpp @@ -44,18 +44,18 @@ public: SaveMap(SaveMap&& save_map) noexcept; // Методы созранения значений - 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, 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 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; + void SaveInteger(const char* name, int value) noexcept; + void SaveDouble(const char* name, double value) noexcept; + void SaveString(const char* name, const std::string& value) noexcept; + void SaveObject(const char* name, std::shared_ptr object) noexcept; + void SaveVectorInteger(const char* name, std::vector&& value) noexcept; + void SaveVectorDouble(const char* name, std::vector&& value) noexcept; + void SaveVectorStrings(const char* name, std::vector&& value) noexcept; + void SaveVectorObject(const char* name, std::vector>&& value) noexcept; + void SaveListInteger(const char* name, std::list&& value) noexcept; + void SaveListDouble(const char* name, std::list&& value) noexcept; + void SaveListStrings(const char* name, std::list&& value) noexcept; + void SaveListObject(const char* name, std::list>&& value) noexcept; // Методы получения значенй long long GetInteger(const char* name); @@ -77,7 +77,7 @@ public: // Собирает все токены в JSON объект std::string serialize() noexcept; - std::shared_ptr connect_to(const std::shared_ptr& parent); + void connect_to(const std::shared_ptr& parent); static std::string CleaningJSON(const std::string& json_data); }; diff --git a/Core/Game/World/World.cpp b/Core/Game/World/World.cpp index 4077346..4c1f0ce 100644 --- a/Core/Game/World/World.cpp +++ b/Core/Game/World/World.cpp @@ -28,6 +28,18 @@ void World::Tick(double delta_time) std::shared_ptr World::save() { std::shared_ptr save = std::make_shared("World"); + + std::vector ActorsIDs; + ActorsIDs.reserve(actors_map.size()); + std::list> actors; + for (auto[it, flag] : actors_map) + { + ActorsIDs.push_back(it); + actors.push_back(flag); + } + save->SaveVectorStrings("ActorsIDs", std::move(ActorsIDs)); + save->SaveListObject("Actors", std::move(actors)); + return save; } diff --git a/Core/Game/World/World.hpp b/Core/Game/World/World.hpp index 5a11917..1c50b17 100644 --- a/Core/Game/World/World.hpp +++ b/Core/Game/World/World.hpp @@ -49,8 +49,8 @@ public: std::shared_ptr object = std::make_shared(); object->SetActorLocate(loc); object->SetActorRotate(rot); - static_cast(object)->world_ = this; - static_cast(object)->name_ = name; + std::static_pointer_cast(object)->world_ = this; + std::static_pointer_cast(object)->name_ = name; actors_map.try_emplace(name, object); return object; } diff --git a/Core/Math/Vector.cpp b/Core/Math/Vector.cpp index c87dfee..18db09c 100644 --- a/Core/Math/Vector.cpp +++ b/Core/Math/Vector.cpp @@ -20,8 +20,9 @@ Vector2D Vector2D::operator-(const Vector2D& v) const std::shared_ptr Vector2D::save() { - std::unique_ptr save = std::make_unique("Vector2D"); - save->SaveDouble("x", x)->SaveDouble("y", y); + std::shared_ptr save = std::make_shared("Vector2D"); + save->SaveDouble("x", x); + save->SaveDouble("y", y); return save; } @@ -50,7 +51,9 @@ Vector3D Vector3D::operator-(const Vector3D& v) const std::shared_ptr Vector3D::save() { std::unique_ptr save = std::make_unique("Vector3D"); - save->SaveDouble("x", x)->SaveDouble("y", y)->SaveDouble("z", z); + save->SaveDouble("x", x); + save->SaveDouble("y", y); + save->SaveDouble("z", z); return save; } diff --git a/TestGame/Worlds/TestWorld.world b/TestGame/Worlds/TestWorld.world index c95ad06..f0f10c8 100644 --- a/TestGame/Worlds/TestWorld.world +++ b/TestGame/Worlds/TestWorld.world @@ -1,93 +1,123 @@ { - "Class name": "TestWorld", - "dtime": 5.000000, - "Parent parameters": { - "Class name":"World", - "vsActorsIDs": ["MainCamera", "TestMesh1","TestMesh2"], - "loActors": [ - { - "Class name": "Camera", - "Parent parameters": { - "Class name":"Actor", - "oloc": { - "Class name":"Vector3D", - "dx":2.0, - "dy":2.0, - "dz":2.0 - }, - "orot": { - "Class name":"Vector3D", - "dx":-2.335, - "dy":-0.785, - "dz":0.0 - }, - "oscale": { - "Class name": "Vector3D", - "dx": 1.0, - "dy": 1.0, - "dz": 1.0 - }, - "tags":[] - } - }, - { - "Class name": "StaticMesh", - "Parent parameters": { - "Class name": "Mesh", - "smodel_name_": "TestModel", - "Parent parameters": { - "Class name":"Actor", - "oloc": { - "Class name":"Vector3D", - "dx":1.0, - "dy":-1.0, - "dz":1.0 - }, - "orot": { - "Class name":"Vector3D", - "dx":0.0, - "dy":0.0, - "dz":0.0 - }, - "oscale": { - "Class name": "Vector3D", - "dx": 1.0, - "dy": 1.0, - "dz": 1.0 - }, - "tags":[] - } - } - }, - { - "Class name": "StaticMesh", - "Parent parameters": { - "Class name": "Mesh", - "smodel_name_": "TestModel", - "Parent parameters": { - "Class name":"Actor", - "oloc": { - "Class name":"Vector3D", - "dx":0.0, - "dy":-1.0, - "dz":1.0 - }, - "orot": { - "Class name":"Vector3D", - "dx":0.0, - "dy":0.0, - "dz":0.0 - }, - "oscale": { - "Class name": "Vector3D", - "dx": 1.0, - "dy": 1.0, - "dz": 1.0 - }, - "tags":[] - } - } - } - ] - } + "Class name": "TestWorld", + "dtime": 5, + "Parent parameters": { + "Class name": "World", + "vsActorsIDs": [ + "TestMesh1", + "MainCamera", + "TestMesh2", + "TestActor1" + ], + "loActors": [ + { + "Class name": "StaticMesh", + "Parent parameters": { + "Class name": "Mesh", + "smodel_name_": "TestModel", + "Parent parameters": { + "Class name": "Actor", + "oloc": { + "Class name": "Vector3D", + "dx": 1, + "dy": -1, + "dz": 1 + }, + "orot": { + "Class name": "Vector3D", + "dx": 0, + "dy": 0, + "dz": 0 + }, + "oscale": { + "Class name": "Vector3D", + "dx": 1, + "dy": 1, + "dz": 1 + }, + "lstags": [] + } + } + }, + { + "Class name": "Camera", + "Parent parameters": { + "Class name": "Actor", + "oloc": { + "Class name": "Vector3D", + "dx": 2, + "dy": 2, + "dz": 2 + }, + "orot": { + "Class name": "Vector3D", + "dx": -2.335, + "dy": -0.785, + "dz": 0 + }, + "oscale": { + "Class name": "Vector3D", + "dx": 1, + "dy": 1, + "dz": 1 + }, + "lstags": [] + } + }, + { + "Class name": "StaticMesh", + "Parent parameters": { + "Class name": "Mesh", + "smodel_name_": "TestModel", + "Parent parameters": { + "Class name": "Actor", + "oloc": { + "Class name": "Vector3D", + "dx": 0, + "dy": -1, + "dz": 1 + }, + "orot": { + "Class name": "Vector3D", + "dx": 0, + "dy": 0, + "dz": 0 + }, + "oscale": { + "Class name": "Vector3D", + "dx": 1, + "dy": 1, + "dz": 1 + }, + "lstags": [] + } + } + }, + { + "Class name": "TestActor", + "Parent parameters": { + "Class name": "Actor", + "oloc": { + "Class name": "Vector3D", + "dx": 0, + "dy": 0, + "dz": 0 + }, + "orot": { + "Class name": "Vector3D", + "dx": 0, + "dy": 0, + "dz": 0 + }, + "oscale": { + "Class name": "Vector3D", + "dx": 0, + "dy": 0, + "dz": 0 + }, + "lstags": [] + } + } + ] + } } \ No newline at end of file diff --git a/TestGame/src/Actors/TestActor.cpp b/TestGame/src/Actors/TestActor.cpp index c5fe540..c6b7afc 100644 --- a/TestGame/src/Actors/TestActor.cpp +++ b/TestGame/src/Actors/TestActor.cpp @@ -1,9 +1,22 @@ #include "TestActor.h" +#include "Game/SaveMap/SaveMap.hpp" #include "Log/Log.hpp" void TestActor::BeginPlay() { Actor::BeginPlay(); Loging::Log("TestActor::BeginPlay"); -} \ No newline at end of file +} + +std::shared_ptr TestActor::save() +{ + std::shared_ptr save = std::make_shared("TestActor"); + save->connect_to(Actor::save()); + return save; +} + +void TestActor::load(std::shared_ptr save) +{ + Actor::load(save->getParent()); +} diff --git a/TestGame/src/Actors/TestActor.h b/TestGame/src/Actors/TestActor.h index b27b1b0..b36870b 100644 --- a/TestGame/src/Actors/TestActor.h +++ b/TestGame/src/Actors/TestActor.h @@ -7,4 +7,7 @@ class TestActor final : public Actor { public: void BeginPlay() override; + + std::shared_ptr save() override; + void load(std::shared_ptr save) override; }; \ No newline at end of file diff --git a/TestGame/src/Worlds/TestWorld.cpp b/TestGame/src/Worlds/TestWorld.cpp index 6788a84..d6059e8 100644 --- a/TestGame/src/Worlds/TestWorld.cpp +++ b/TestGame/src/Worlds/TestWorld.cpp @@ -3,6 +3,7 @@ #include #include +#include "../Actors/TestActor.h" #include "Game/GameInstance.hpp" #include "Game/Actors/Camera.hpp" #include "Game/SaveMap/SaveMap.hpp" @@ -22,6 +23,9 @@ void TestWorld::BeginPlay() } GetActorsByClass()[0].lock()->SetActive(); + //SpawnActorFormClass("TestActor1"); + //std::shared_ptr save_world = save(); + //Loging::Log(save_world->serialize()); } void TestWorld::Tick(double delta_time) @@ -56,7 +60,8 @@ std::shared_ptr TestWorld::save() { std::shared_ptr save = World::save(); std::shared_ptr my_save = std::make_shared("TestWorld"); - my_save->SaveDouble("time", time)->connect_to(save); + my_save->SaveDouble("time", time); + my_save->connect_to(save); return my_save; } diff --git a/UwURenderEngine/Game/Actors/Camera.cpp b/UwURenderEngine/Game/Actors/Camera.cpp index 6187c01..3cfa837 100644 --- a/UwURenderEngine/Game/Actors/Camera.cpp +++ b/UwURenderEngine/Game/Actors/Camera.cpp @@ -13,7 +13,9 @@ Camera::Camera() std::shared_ptr Camera::save() { - return std::make_shared("Camera")->connect_to(Actor::save()); + std::shared_ptr save = std::make_shared("Camera"); + save->connect_to(Actor::save()); + return save; } void Camera::load(std::shared_ptr save) diff --git a/UwURenderEngine/Game/Actors/Mesh/Mesh.cpp b/UwURenderEngine/Game/Actors/Mesh/Mesh.cpp index 52c0f14..82e7a5d 100644 --- a/UwURenderEngine/Game/Actors/Mesh/Mesh.cpp +++ b/UwURenderEngine/Game/Actors/Mesh/Mesh.cpp @@ -9,9 +9,10 @@ Mesh::Mesh() std::shared_ptr Mesh::save() { - return std::make_shared("Mesh") - ->SaveString("model_name_", model_name_) - ->connect_to(Actor::save()); + std::shared_ptr save = std::make_shared("Mesh"); + save->SaveString("model_name_", model_name_); + save->connect_to(Actor::save()); + return save; } void Mesh::load(std::shared_ptr save) diff --git a/UwURenderEngine/Game/Actors/Mesh/StaticMesh.cpp b/UwURenderEngine/Game/Actors/Mesh/StaticMesh.cpp index 8acc43f..55b8af9 100644 --- a/UwURenderEngine/Game/Actors/Mesh/StaticMesh.cpp +++ b/UwURenderEngine/Game/Actors/Mesh/StaticMesh.cpp @@ -13,7 +13,9 @@ StaticMesh::StaticMesh() std::shared_ptr StaticMesh::save() { - return std::make_shared("StaticMesh")->connect_to(Mesh::save()); + std::shared_ptr save = std::make_shared("StaticMesh"); + save->connect_to(Mesh::save()); + return save; } void StaticMesh::load(std::shared_ptr save)