From ded41e7c3ebae08b5fd000f3775da1f8ce2882b8 Mon Sep 17 00:00:00 2001 From: Chewico Date: Thu, 4 Dec 2025 23:41:43 +0100 Subject: [PATCH] Created Environment as a Resource --- Deer/Include/Deer/Enviroment.h | 16 +++ Deer/Include/Deer/Resource.h | 130 ++++++++++++++++++ Deer/Include/DeerRender/DataManager.h | 2 - Deer/Include/DeerRender/Resource.h | 120 +--------------- Deer/src/Deer/Scene/EnvironmentBuilder.cpp | 8 ++ .../DeerStudio/StudioAPI/Environment.h | 3 +- .../Registers/Environment.cpp | 2 +- .../src/DeerStudio/StudioAPI/Environment.cpp | 10 +- .../Viewport.disabled/dockPanelModule.json | 8 -- .../Viewport.as | 0 .../as.predefined | 0 11 files changed, 164 insertions(+), 135 deletions(-) create mode 100644 Deer/Include/Deer/Resource.h delete mode 100644 Deer/Include/DeerRender/DataManager.h create mode 100644 Deer/src/Deer/Scene/EnvironmentBuilder.cpp delete mode 100644 Editor/Modules/Viewport.disabled/dockPanelModule.json rename Editor/Modules/{Viewport.disabled => Viewport}/Viewport.as (100%) rename Editor/Modules/{Viewport.disabled => Viewport}/as.predefined (100%) diff --git a/Deer/Include/Deer/Enviroment.h b/Deer/Include/Deer/Enviroment.h index 5210d5e..f781d2e 100755 --- a/Deer/Include/Deer/Enviroment.h +++ b/Deer/Include/Deer/Enviroment.h @@ -2,6 +2,7 @@ #include "Deer/Components.h" #include "Deer/Log.h" #include "Deer/Tools/Memory.h" +#include "Deer/Resource.h" #include "entt/entt.hpp" @@ -75,6 +76,21 @@ namespace Deer { friend class Entity; }; + struct EntityData { + int toDo; + }; + + struct EnvironmentData { + std::vector entities; + }; + + template <> + class ResourceBuilder { + public: + using BaseDataType = EnvironmentData; + static Scope buildResource(const BaseDataType& baseData); + }; + // Warning: This calss does not initialize for performance class Entity { public: diff --git a/Deer/Include/Deer/Resource.h b/Deer/Include/Deer/Resource.h new file mode 100644 index 0000000..550637d --- /dev/null +++ b/Deer/Include/Deer/Resource.h @@ -0,0 +1,130 @@ +#pragma once +#include "Deer/DataManagment.h" +#include "Deer/Log.h" +#include "Deer/Tools/Memory.h" +#include "Deer/Tools/Path.h" +#include "Deer/Tools/TypeDefs.h" + +#include +#include +#include + +namespace Deer { + template + class ResourceManager; + + template + class Resource { + public: + int32_t getResourceId() const { return resourceId; } + + bool isValid() const { return ResourceManager::isValid(*this); } + T& getData() { return ResourceManager::getResourceData(*this); } + + const std::string& getStorageId() const { return ResourceManager::getStorageId(); } + + inline explicit operator bool() const { return resourceId >= 0; } + + static Resource unsafeFromId(int32_t id) { + Resource res; + res.resourceId = id; + return res; + } + + private: + // -1 = no resource loaded + int32_t resourceId = -1; + friend ResourceManager; + }; + + template + class ResourceBuilder { + public: + using BaseDataType = char; + static Scope buildResource(const BaseDataType& baseData) { + static_assert(sizeof(T) == 0, "ResourceBuilder must be specialized for this type T"); + return nullptr; + } + }; + + template + class ResourceManager { + private: + struct ResourceData { + public: + ResourceData(const std::string& _resourceId, Scope&& _data) + : storageId(_resourceId), data(std::move(_data)) {} + + Scope data; + const std::string storageId; + }; + + static std::vector resources; + static std::unordered_map> resourceCache; + + public: + template + static Resource loadResource(const std::string& storageId) { + if (resourceCache.contains(storageId)) + return resourceCache[storageId]; + + using ResourceBuilderBaseDataType = typename ResourceBuilder::BaseDataType; + Scope data; + + if constexpr (!std::is_void_v) { + Scope baseData = DataManager::template load(storageId); + if (!baseData) { + const char* baseDataType = abi::__cxa_demangle(typeid(ResourceBuilderBaseDataType).name(), 0, 0, nullptr); + const char* dataType = abi::__cxa_demangle(typeid(T).name(), 0, 0, nullptr); + DEER_CORE_ERROR("Error loading base resource {} for resource {} with id {}", baseDataType, dataType, storageId.c_str()); + return Resource(); + } + data = ResourceBuilder::buildResource(*baseData.get()); + } else { + data = ResourceBuilder::buildResource(); // No base data + } + + Resource resource = Resource::unsafeFromId(resources.size()); + resources.push_back({storageId, std::move(data)}); + resourceCache[storageId] = resource; + + return resource; + } + + static Resource loadResourceFromData(const typename ResourceBuilder::BaseDataType& resourceData, const std::string& storageId) { + Scope data = ResourceBuilder::buildResource(resourceData); + + Resource resource = Resource::unsafeFromId(resources.size()); + resources.push_back({storageId, std::move(data)}); + resourceCache[storageId] = resource; + + return resource; + } + + static void unloadResources() { + resourceCache.clear(); + resources.clear(); + } + + static inline bool isValid(Resource res) { + return res.resourceId >= 0 && res.resourceId < static_cast(resources.size()); + } + + static inline const std::string& getStorageId(Resource res) { + const static std::string invalid("NULL"); + if (!isValid(res)) + return invalid; + + return resources[res.resourceId].storageId; + } + + static T& getResourceData(Resource res) { + return *resources[res.resourceId].data; + } + }; + + template + std::vector::ResourceData> ResourceManager::resources; + template + std::unordered_map> ResourceManager::resourceCache; +} // namespace Deer diff --git a/Deer/Include/DeerRender/DataManager.h b/Deer/Include/DeerRender/DataManager.h deleted file mode 100644 index 34cab1c..0000000 --- a/Deer/Include/DeerRender/DataManager.h +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once -#include "Deer/DataManager.h" \ No newline at end of file diff --git a/Deer/Include/DeerRender/Resource.h b/Deer/Include/DeerRender/Resource.h index a890cc6..c2be576 100644 --- a/Deer/Include/DeerRender/Resource.h +++ b/Deer/Include/DeerRender/Resource.h @@ -1,120 +1,2 @@ #pragma once -#include "DeerRender/DataManagment.h" -#include "DeerRender/Log.h" -#include "DeerRender/Tools/Memory.h" -#include "DeerRender/Tools/Path.h" -#include "DeerRender/Tools/TypeDefs.h" - -#include -#include -#include - -namespace Deer { - template - class ResourceManager; - - template - class Resource { - public: - int32_t getResourceId() const { return resourceId; } - - bool isValid() const { return ResourceManager::isValid(*this); } - T& getData() { return ResourceManager::getResourceData(*this); } - - const std::string& getStorageId() const { return ResourceManager::getStorageId(); } - - inline explicit operator bool() const { return resourceId >= 0; } - - static Resource unsafeFromId(int32_t id) { - Resource res; - res.resourceId = id; - return res; - } - - private: - // -1 = no resource loaded - int32_t resourceId = -1; - friend ResourceManager; - }; - - template - class ResourceBuilder { - public: - using BaseDataType = char; - static Scope buildResource(const BaseDataType& baseData) { - static_assert(sizeof(T) == 0, "ResourceBuilder must be specialized for this type T"); - return nullptr; - } - }; - - template - class ResourceManager { - private: - struct ResourceData { - public: - ResourceData(const std::string& _resourceId, Scope&& _data) - : storageId(_resourceId), data(std::move(_data)) {} - - Scope data; - const std::string storageId; - }; - - static std::vector resources; - static std::unordered_map> resourceCache; - - public: - template - static Resource loadResource(const std::string& storageId) { - if (resourceCache.contains(storageId)) - return resourceCache[storageId]; - - using ResourceBuilderBaseDataType = typename ResourceBuilder::BaseDataType; - Scope data; - - if constexpr (!std::is_void_v) { - Scope baseData = DataManager::template load(storageId); - if (!baseData) { - const char* baseDataType = abi::__cxa_demangle(typeid(ResourceBuilderBaseDataType).name(), 0, 0, nullptr); - const char* dataType = abi::__cxa_demangle(typeid(T).name(), 0, 0, nullptr); - DEER_CORE_ERROR("Error loading base resource {} for resource {} with id {}", baseDataType, dataType, storageId.c_str()); - return Resource(); - } - data = ResourceBuilder::buildResource(*baseData.get()); - } else { - data = ResourceBuilder::buildResource(); // No base data - } - - Resource resource = Resource::unsafeFromId(resources.size()); - resources.push_back({storageId, std::move(data)}); - resourceCache[storageId] = resource; - - return resource; - } - - static void unloadResources() { - resourceCache.clear(); - resources.clear(); - } - - static inline bool isValid(Resource res) { - return res.resourceId >= 0 && res.resourceId < static_cast(resources.size()); - } - - static inline const std::string& getStorageId(Resource res) { - const static std::string invalid("NULL"); - if (!isValid(res)) - return invalid; - - return resources[res.resourceId].storageId; - } - - static T& getResourceData(Resource res) { - return *resources[res.resourceId].data; - } - }; - - template - std::vector::ResourceData> ResourceManager::resources; - template - std::unordered_map> ResourceManager::resourceCache; -} // namespace Deer +#include "Deer/Resource.h" \ No newline at end of file diff --git a/Deer/src/Deer/Scene/EnvironmentBuilder.cpp b/Deer/src/Deer/Scene/EnvironmentBuilder.cpp new file mode 100644 index 0000000..e70261a --- /dev/null +++ b/Deer/src/Deer/Scene/EnvironmentBuilder.cpp @@ -0,0 +1,8 @@ +#include "Deer/Enviroment.h" + +namespace Deer { + Scope ResourceBuilder::buildResource(const BaseDataType& baseData) { + Scope env = MakeScope(); + return env; + } +} \ No newline at end of file diff --git a/DeerStudio/headers/DeerStudio/StudioAPI/Environment.h b/DeerStudio/headers/DeerStudio/StudioAPI/Environment.h index 30b219c..a8a9686 100644 --- a/DeerStudio/headers/DeerStudio/StudioAPI/Environment.h +++ b/DeerStudio/headers/DeerStudio/StudioAPI/Environment.h @@ -1,5 +1,6 @@ #pragma once #include "GenericRefStructs.h" +#include // #include "DeerRender/Scene.h" namespace Deer { @@ -14,6 +15,6 @@ namespace Deer { }; EnvironmentHandleStruct getMainEnvironment(); - EnvironmentHandleStruct createEnvironment(); + EnvironmentHandleStruct createLoadEnvironment(std::string& envId); } // namespace StudioAPI } // namespace Deer \ No newline at end of file diff --git a/DeerStudio/src/DeerStudio/AngelScriptEngine/Registers/Environment.cpp b/DeerStudio/src/DeerStudio/AngelScriptEngine/Registers/Environment.cpp index c52c3ad..0d0609f 100644 --- a/DeerStudio/src/DeerStudio/AngelScriptEngine/Registers/Environment.cpp +++ b/DeerStudio/src/DeerStudio/AngelScriptEngine/Registers/Environment.cpp @@ -12,7 +12,7 @@ namespace Deer { void AngelScriptEngine::registerEnvironmentFunctions() { scriptEngine->SetDefaultNamespace("Engine"); REGISTER_GLOBAL_FUNC("Environment getMainEnvironment()", StudioAPI::getMainEnvironment); - REGISTER_GLOBAL_FUNC("Environment createEnvironment()", StudioAPI::createEnvironment); + REGISTER_GLOBAL_FUNC("Environment createLoadEnvironment(const string&in envId)", StudioAPI::createLoadEnvironment); scriptEngine->SetDefaultNamespace(""); REGISTER_OBJECT_METHOD("Environment", "void render(FrameBuffer, SceneCamera&in)", StudioAPI::EnvironmentStruct, render); diff --git a/DeerStudio/src/DeerStudio/StudioAPI/Environment.cpp b/DeerStudio/src/DeerStudio/StudioAPI/Environment.cpp index 4b3e67b..3f84a10 100644 --- a/DeerStudio/src/DeerStudio/StudioAPI/Environment.cpp +++ b/DeerStudio/src/DeerStudio/StudioAPI/Environment.cpp @@ -1,6 +1,7 @@ #include "DeerRender/Enviroment.h" #include "DeerRender/Scene.h" #include "DeerRender/Tools/Memory.h" +#include "DeerRender/Resource.h" #include "DeerStudio/StudioAPI/Environment.h" @@ -38,11 +39,12 @@ namespace Deer { return EnvironmentHandleStruct(-1); } - EnvironmentHandleStruct createEnvironment() { - uint16_t envId = environments.size(); - environments.push_back({}); + EnvironmentHandleStruct createLoadEnvironment(std::string& envId) { + EnvironmentData envData; + Resource environmentResource = ResourceManager::loadResourceFromData(envData, envId); + + return EnvironmentHandleStruct(environmentResource.getResourceId()); - return EnvironmentHandleStruct(envId); } } // namespace StudioAPI } // namespace Deer \ No newline at end of file diff --git a/Editor/Modules/Viewport.disabled/dockPanelModule.json b/Editor/Modules/Viewport.disabled/dockPanelModule.json deleted file mode 100644 index 493987a..0000000 --- a/Editor/Modules/Viewport.disabled/dockPanelModule.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "dockPanelModule" : { - "name" : "Viewport", - "author" : "Chewico", - "version" : "1.0.0", - "services" : [] - } -} \ No newline at end of file diff --git a/Editor/Modules/Viewport.disabled/Viewport.as b/Editor/Modules/Viewport/Viewport.as similarity index 100% rename from Editor/Modules/Viewport.disabled/Viewport.as rename to Editor/Modules/Viewport/Viewport.as diff --git a/Editor/Modules/Viewport.disabled/as.predefined b/Editor/Modules/Viewport/as.predefined similarity index 100% rename from Editor/Modules/Viewport.disabled/as.predefined rename to Editor/Modules/Viewport/as.predefined