From a013e7eefdd08fd01d4ab0950678f2e69c791e6c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 11 Jul 2024 22:45:57 +0300 Subject: [PATCH] feat: cameras saving/loading --- src/content/Content.cpp | 4 ++-- src/content/Content.hpp | 20 ++++++++++++------- src/content/ContentBuilder.cpp | 2 +- src/content/ContentLoader.cpp | 3 ++- src/logic/LevelController.cpp | 1 + src/window/Camera.hpp | 14 ++++++++------ src/world/Level.cpp | 35 ++++++++++++++++++++++++++++++++++ src/world/Level.hpp | 4 ++++ 8 files changed, 66 insertions(+), 17 deletions(-) diff --git a/src/content/Content.cpp b/src/content/Content.cpp index f0a7c718..07db6f5c 100644 --- a/src/content/Content.cpp +++ b/src/content/Content.cpp @@ -31,7 +31,7 @@ Content::Content( UptrsMap packs, UptrsMap blockMaterials, UptrsMap skeletons, - const ResourceIndicesSet& resourceIndices + ResourceIndicesSet resourceIndices ) : indices(std::move(indices)), packs(std::move(packs)), blockMaterials(std::move(blockMaterials)), @@ -42,7 +42,7 @@ Content::Content( drawGroups(std::move(drawGroups)) { for (size_t i = 0; i < RESOURCE_TYPES_COUNT; i++) { - this->resourceIndices[i] = resourceIndices[i]; + this->resourceIndices[i] = std::move(resourceIndices[i]); } } diff --git a/src/content/Content.hpp b/src/content/Content.hpp index 87a3255c..da8ea4ed 100644 --- a/src/content/Content.hpp +++ b/src/content/Content.hpp @@ -111,16 +111,18 @@ public: class ResourceIndices { std::vector names; std::unordered_map indices; - std::vector savedData; + std::unique_ptr> savedData; public: - ResourceIndices() {} + ResourceIndices() + : savedData(std::make_unique>()){ + } static constexpr size_t MISSING = -1; void add(std::string name, dynamic::Map_sptr map) { indices[name] = names.size(); names.push_back(name); - savedData.push_back(map); + savedData->push_back(map); } const std::string& getName(size_t index) const { @@ -136,11 +138,11 @@ public: } dynamic::Map_sptr getSavedData(size_t index) const { - return savedData.at(index); + return savedData->at(index); } - void saveData(size_t index, dynamic::Map_sptr map) { - savedData.at(index) = map; + void saveData(size_t index, dynamic::Map_sptr map) const { + savedData->at(index) = map; } size_t size() const { @@ -186,7 +188,7 @@ public: UptrsMap packs, UptrsMap blockMaterials, UptrsMap skeletons, - const ResourceIndicesSet& resourceIndices + ResourceIndicesSet resourceIndices ); ~Content(); @@ -194,6 +196,10 @@ public: return indices.get(); } + inline const ResourceIndices& getIndices(ResourceType type) const { + return resourceIndices[static_cast(type)]; + } + const rigging::SkeletonConfig* getRig(const std::string& id) const; const BlockMaterial* findBlockMaterial(const std::string& id) const; const ContentPackRuntime* getPackRuntime(const std::string& id) const; diff --git a/src/content/ContentBuilder.cpp b/src/content/ContentBuilder.cpp index 6e55151d..6f7b730b 100644 --- a/src/content/ContentBuilder.cpp +++ b/src/content/ContentBuilder.cpp @@ -76,7 +76,7 @@ std::unique_ptr ContentBuilder::build() { std::move(packs), std::move(blockMaterials), std::move(skeletons), - resourceIndices + std::move(resourceIndices) ); // Now, it's time to resolve foreign keys diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 72592c1c..5f690f3d 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -500,6 +500,7 @@ void ContentLoader::load() { void ContentLoader::loadResources(ResourceType type, dynamic::List* list) { for (size_t i = 0; i < list->size(); i++) { - builder.resourceIndices[static_cast(type)].add(list->str(i), nullptr); + builder.resourceIndices[static_cast(type)].add( + pack->id+":"+list->str(i), nullptr); } } diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index 1f3f12e8..a69d7e70 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -59,6 +59,7 @@ void LevelController::saveWorld() { level->getWorld()->wfile->createDirectories(); logger.info() << "writing world"; scripting::on_world_save(); + level->onSave(); level->getWorld()->write(level.get()); } diff --git a/src/window/Camera.hpp b/src/window/Camera.hpp index 593f473e..9f7d4bbe 100644 --- a/src/window/Camera.hpp +++ b/src/window/Camera.hpp @@ -5,20 +5,22 @@ class Camera { void updateVectors(); - float fov; + float fov = 1.0f; public: - glm::vec3 front; - glm::vec3 up; - glm::vec3 right; - glm::vec3 dir; + glm::vec3 front {}; + glm::vec3 up {}; + glm::vec3 right {}; + glm::vec3 dir {}; - glm::vec3 position; + glm::vec3 position {}; float zoom = 1.0f; glm::mat4 rotation {1.0f}; bool perspective = true; bool flipped = false; float aspect = 0.0f; + + Camera() {} Camera(glm::vec3 position, float fov); void rotate(float x, float y, float z); diff --git a/src/world/Level.cpp b/src/world/Level.cpp index 781d244a..d8269742 100644 --- a/src/world/Level.cpp +++ b/src/world/Level.cpp @@ -13,6 +13,8 @@ #include "../objects/Entities.hpp" #include "../items/Inventory.hpp" #include "../items/Inventories.hpp" +#include "../window/Camera.hpp" +#include "../data/dynamic_util.hpp" Level::Level( std::unique_ptr worldPtr, @@ -51,6 +53,23 @@ Level::Level( inventories = std::make_unique(*this); inventories->store(player->getInventory()); + + auto& cameraIndices = content->getIndices(ResourceType::CAMERA); + for (size_t i = 0; i < cameraIndices.size(); i++) { + auto camera = std::make_shared(); + if (auto map = cameraIndices.getSavedData(i)) { + dynamic::get_vec(map, "pos", camera->position); + dynamic::get_vec(map, "front", camera->front); + dynamic::get_vec(map, "up", camera->up); + map->flag("perspective", camera->perspective); + map->flag("flipped", camera->flipped); + map->num("zoom", camera->zoom); + float fov = camera->getFov(); + map->num("fov", fov); + camera->setFov(fov); + } + cameras.push_back(std::move(camera)); + } } Level::~Level(){ @@ -73,3 +92,19 @@ void Level::loadMatrix(int32_t x, int32_t z, uint32_t radius) { World* Level::getWorld() { return world.get(); } + +void Level::onSave() { + auto& cameraIndices = content->getIndices(ResourceType::CAMERA); + for (size_t i = 0; i < cameraIndices.size(); i++) { + auto& camera = *cameras.at(i); + auto map = dynamic::create_map(); + map->put("pos", dynamic::to_value(camera.position)); + map->put("front", dynamic::to_value(camera.front)); + map->put("up", dynamic::to_value(camera.up)); + map->put("perspective", camera.perspective); + map->put("flipped", camera.flipped); + map->put("zoom", camera.zoom); + map->put("fov", camera.getFov()); + cameraIndices.saveData(i, std::move(map)); + } +} diff --git a/src/world/Level.hpp b/src/world/Level.hpp index 4b5a1f53..00c45d9c 100644 --- a/src/world/Level.hpp +++ b/src/world/Level.hpp @@ -19,6 +19,7 @@ class LevelEvents; class Lighting; class PhysicsSolver; class ChunksStorage; +class Camera; struct EngineSettings; /// @brief A level, contains chunks and objects @@ -35,6 +36,7 @@ public: std::unique_ptr lighting; std::unique_ptr events; std::unique_ptr entities; + std::vector> cameras; // move somewhere? const EngineSettings& settings; @@ -71,6 +73,8 @@ public: std::shared_ptr object = std::dynamic_pointer_cast(objects[id]); return object; } + + void onSave(); }; #endif /* WORLD_LEVEL_HPP_ */