diff --git a/Core/Core/CoreInstance.h b/Core/Core/CoreInstance.h index c6add8e..8e13676 100644 --- a/Core/Core/CoreInstance.h +++ b/Core/Core/CoreInstance.h @@ -44,7 +44,6 @@ class CoreInstance { RenderEngine* render_engine_; GameInstance* game_; - bool is_ready = false; public: CoreInstance(); @@ -58,4 +57,5 @@ public: double getMemorySize() const { return memorySize_; } const std::string& getBaseWorldName() const { return main_config_.base_world; } const std::string& getGameName() const { return main_config_.game_name; } + GameInstance* GetGameInstance() const { return game_; } }; diff --git a/Core/Core/RenderEngine.cpp b/Core/Core/RenderEngine.cpp index 35cd6e9..753a3e1 100644 --- a/Core/Core/RenderEngine.cpp +++ b/Core/Core/RenderEngine.cpp @@ -8,6 +8,10 @@ #include "CoreInstance.h" #include "Log/Log.h" +#include "Game/GameInstance.h" +#include "Game/World/World.h" +#include "Game/Actors/Mesh/Mesh.hpp" + #include "GLFW/glfw3.h" const std::vector RenderEngine::deviceExtensions = { @@ -986,6 +990,11 @@ RenderEngine::~RenderEngine() void RenderEngine::start() { + World* world = core_.GetGameInstance()->GetWorld(); + std::vector meshes = world->GetActorsByClass(); + for (auto& i : meshes) + i->load_model(i->GetModelName()); + while (!glfwWindowShouldClose(window_)) { glfwPollEvents(); diff --git a/Core/Game/Actors/Actor.cpp b/Core/Game/Actors/Actor.cpp index 99d7f43..4781b32 100644 --- a/Core/Game/Actors/Actor.cpp +++ b/Core/Game/Actors/Actor.cpp @@ -8,17 +8,16 @@ Actor::Actor() SetType(Classes::Actor); } -std::shared_ptr Actor::save() noexcept +std::shared_ptr Actor::save() { - std::shared_ptr save = std::make_shared("Actor"); - save->SaveObject("loc", &loc) - ->SaveObject("rot", &rot) - ->SaveObject("scale", &scale) - ->SaveListStrings("tags", std::move(tags)); - return save; + return std::make_shared("Actor") + ->SaveObject("loc", &loc) + ->SaveObject("rot", &rot) + ->SaveObject("scale", &scale) + ->SaveListStrings("tags", std::move(tags)); } -void Actor::load(std::shared_ptr save) noexcept +void Actor::load(std::shared_ptr save) { loc = *reinterpret_cast(save->GetObject("loc")); rot = *reinterpret_cast(save->GetObject("rot")); diff --git a/Core/Game/Actors/Actor.h b/Core/Game/Actors/Actor.h index 6e5841b..0ab89e1 100644 --- a/Core/Game/Actors/Actor.h +++ b/Core/Game/Actors/Actor.h @@ -9,7 +9,6 @@ #include "Math/Vector.h" GENERATE_META(Actor) - class Actor : public ISave, public IRTTI { Vector3D loc; @@ -24,8 +23,8 @@ public: Delegate OnSetActorRotate; #pragma region ISave - virtual std::shared_ptr save() noexcept override; - virtual void load(std::shared_ptr save) noexcept override; + virtual std::shared_ptr save() override; + virtual void load(std::shared_ptr save) override; #pragma endregion virtual void BeginPlay(); diff --git a/Core/Game/Actors/Mesh/Mesh.cpp b/Core/Game/Actors/Mesh/Mesh.cpp new file mode 100644 index 0000000..4e007d9 --- /dev/null +++ b/Core/Game/Actors/Mesh/Mesh.cpp @@ -0,0 +1,21 @@ +#include "Mesh.hpp" + +#include "Game/SaveMap/SaveMap.h" + +Mesh::Mesh() +{ + SetType(Classes::Mesh); +} + +std::shared_ptr Mesh::save() +{ + return std::make_shared("Mesh") + ->SaveString("model_name_", model_name_) + ->connect_to(Actor::save()); +} + +void Mesh::load(std::shared_ptr save) +{ + Actor::load(save->getParent()); + model_name_ = save->GetString("model_name_"); +} \ No newline at end of file diff --git a/Core/Game/Actors/Mesh/Mesh.hpp b/Core/Game/Actors/Mesh/Mesh.hpp new file mode 100644 index 0000000..ffe9dac --- /dev/null +++ b/Core/Game/Actors/Mesh/Mesh.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include "../Actor.h" + +GENERATE_META(Mesh) +class Mesh : public Actor +{ + std::string model_name_; +protected: + void SetModelName(const std::string& new_model_name) { model_name_ = new_model_name; } + +public: + Mesh(); + +#pragma region ISave + virtual std::shared_ptr save() override; + virtual void load(std::shared_ptr save) override; +#pragma endregion + + virtual void load_model(const std::string& model_name) = 0; + const std::string& GetModelName() const { return model_name_; } +}; diff --git a/Core/Game/Actors/Mesh/StaticMesh.cpp b/Core/Game/Actors/Mesh/StaticMesh.cpp new file mode 100644 index 0000000..f1081fc --- /dev/null +++ b/Core/Game/Actors/Mesh/StaticMesh.cpp @@ -0,0 +1,26 @@ +#include "StaticMesh.hpp" + +#include "Log/Log.h" +#include "Game/SaveMap/SaveMap.h" + +StaticMesh::StaticMesh() +{ + SetType(Classes::StaticMesh); +} + +std::shared_ptr StaticMesh::save() +{ + return std::make_shared("StaticMesh")->connect_to(Mesh::save()); +} + +void StaticMesh::load(std::shared_ptr save) +{ + Mesh::load(save->getParent()); +} + +void StaticMesh::load_model(const std::string& model_name) +{ + SetModelName(model_name); + // TODO + Message("Load mesh: " + model_name); +} diff --git a/Core/Game/Actors/Mesh/StaticMesh.hpp b/Core/Game/Actors/Mesh/StaticMesh.hpp new file mode 100644 index 0000000..8d53982 --- /dev/null +++ b/Core/Game/Actors/Mesh/StaticMesh.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "Mesh.hpp" + +GENERATE_META(StaticMesh) +class StaticMesh : public Mesh +{ +public: + StaticMesh(); + +#pragma region ISave + virtual std::shared_ptr save() override; + virtual void load(std::shared_ptr save) override; +#pragma endregion + + void load_model(const std::string& model_name) override; +}; diff --git a/Core/Game/BaseObjectFactory.cpp b/Core/Game/BaseObjectFactory.cpp index 6edc75b..1991b16 100644 --- a/Core/Game/BaseObjectFactory.cpp +++ b/Core/Game/BaseObjectFactory.cpp @@ -1,10 +1,12 @@ #include "ObjectFactory.h" +#include "Actors/Mesh/StaticMesh.hpp" #include "Game/Actors/Actor.h" #include "Math/Vector.h" std::vector base_object_factories = { GENERATE_FACTORY_OBJECT(Actor) + GENERATE_FACTORY_OBJECT(StaticMesh) GENERATE_FACTORY_OBJECT(Vector2D) GENERATE_FACTORY_OBJECT(Vector3D) }; \ No newline at end of file diff --git a/Core/Game/SaveMap/SaveMap.cpp b/Core/Game/SaveMap/SaveMap.cpp index 93f1417..8b933cb 100644 --- a/Core/Game/SaveMap/SaveMap.cpp +++ b/Core/Game/SaveMap/SaveMap.cpp @@ -626,11 +626,11 @@ std::string SaveMap::serialize() noexcept return buffer; } -SaveMap* SaveMap::connect_to(const std::shared_ptr& parent) +std::shared_ptr 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 this; + return std::shared_ptr(this); } diff --git a/Core/Game/SaveMap/SaveMap.h b/Core/Game/SaveMap/SaveMap.h index 7e6de79..7115f64 100644 --- a/Core/Game/SaveMap/SaveMap.h +++ b/Core/Game/SaveMap/SaveMap.h @@ -77,5 +77,5 @@ public: // Собирает все токены в JSON объект std::string serialize() noexcept; - SaveMap* connect_to(const std::shared_ptr& parent); + std::shared_ptr connect_to(const std::shared_ptr& parent); }; diff --git a/Core/Game/World/World.h b/Core/Game/World/World.h index 1b5f402..87ea13e 100644 --- a/Core/Game/World/World.h +++ b/Core/Game/World/World.h @@ -6,6 +6,7 @@ #include "RTTI.h" #include "Game/Actors/Actor.h" +#include "Game/Actors/Mesh/Mesh.hpp" class GameInstance; @@ -36,8 +37,8 @@ public: Container list; for (auto i = actors.cbegin(); i != actors.cend(); ++i) { - if (RTTI::IsA(*i)) - list.push_back(*i); + if (T* cast_object = RTTI::dyn_cast(*i)) + list.push_back(cast_object); } return list; } @@ -52,7 +53,7 @@ public: return object; } - template> + template> Container GetActorsByTag(std::string tag) { Container container; diff --git a/FastRTTI/RTTI_Meta.h b/FastRTTI/RTTI_Meta.h index a222b70..ac33feb 100644 --- a/FastRTTI/RTTI_Meta.h +++ b/FastRTTI/RTTI_Meta.h @@ -13,5 +13,5 @@ template struct Meta; // Enum type classes enum class Classes { - IRTTI, IResource, Actor, TestActor + IRTTI, IResource, Actor, TestActor, Mesh, StaticMesh }; diff --git a/TestGame/Worlds/TestWorld.world b/TestGame/Worlds/TestWorld.world index 7bdcf01..9291601 100644 --- a/TestGame/Worlds/TestWorld.world +++ b/TestGame/Worlds/TestWorld.world @@ -1 +1 @@ -{"Class name":"TestWorld","dtime":5.000000,"Parent parameters":{"Class name":"World","loActors":[]}} \ No newline at end of file +{"Class name":"TestWorld","dtime":5.000000,"Parent parameters":{"Class name":"World","loActors":[{"Class name":"StaticMesh","Parent parameters":{"Class name":"Mesh","smodel_name_":"TestModel","Parent parameters":{"Class name":"Actor","oloc":{"Class name":"Vector3D","dx":"0.0","dy":"0.0","dz":"0.0"},"orot":{"Class name":"Vector3D","dx":"0.0","dy":"0.0","dz":"0.0"},"oscale":{"Class name":"Vector3D","dx":"0.0","dy":"0.0","dz":"0.0"},"tags":[]}}}]}} \ No newline at end of file