From 76f2204074b97d5b70bf0398afc04b90ba166a26 Mon Sep 17 00:00:00 2001 From: Chewico Date: Mon, 9 Mar 2026 23:16:47 +0100 Subject: [PATCH] Transition --- .../DeerCore/Serialization/WorldSettings.h | 6 +- Deer/Include/DeerRender/Resource.h | 24 +++--- ...eGenerator.cpp => ResourceIdGenerator.cpp} | 4 +- .../Scripting/InternalAPI/Resources.cpp | 4 + .../Scripting/InternalAPI/Resources.h | 11 +-- .../Scripting/ResourcesRegistry.cpp | 8 +- .../Components/MeshComponentSerialization.h | 14 +--- DeerStudio/headers/DeerStudio/StudioAPI.h | 14 +--- .../headers/DeerStudio/StudioResources.h | 19 +++-- .../EditorDataImporter/MeshData.cpp | 4 +- .../EditorDataImporter/ShaderData.cpp | 2 +- .../EditorDataImporter/TextureData.cpp | 2 +- DeerStudio/src/DeerStudio/StudioAPI.cpp | 73 ++++--------------- DeerStudio/src/DeerStudio/StudioResources.cpp | 23 +++--- 14 files changed, 77 insertions(+), 131 deletions(-) rename Deer/src/DeerRender/Core/{StorageTypeGenerator.cpp => ResourceIdGenerator.cpp} (69%) diff --git a/Deer/Include/DeerCore/Serialization/WorldSettings.h b/Deer/Include/DeerCore/Serialization/WorldSettings.h index 8aa58c5..5321fdf 100644 --- a/Deer/Include/DeerCore/Serialization/WorldSettings.h +++ b/Deer/Include/DeerCore/Serialization/WorldSettings.h @@ -3,8 +3,8 @@ #ifdef DEER_RENDER #include "DeerRender/Mesh.h" -#include "DeerRender/Shader.h" #include "DeerRender/Resource.h" +#include "DeerRender/Shader.h" #include "DeerRender/Tools/Memory.h" #include @@ -16,8 +16,8 @@ namespace Deer { bool includeServer = false; bool includeClient = true; - std::function(StorageType)> meshLoadingFunction = nullptr; - std::function(StorageType)> shaderLoadingFunction = nullptr; + std::function(ResourceId)> meshLoadingFunction = nullptr; + std::function(ResourceId)> shaderLoadingFunction = nullptr; #else bool includeServer = true; bool includeClient = false; diff --git a/Deer/Include/DeerRender/Resource.h b/Deer/Include/DeerRender/Resource.h index 40bb6a6..6123396 100644 --- a/Deer/Include/DeerRender/Resource.h +++ b/Deer/Include/DeerRender/Resource.h @@ -11,23 +11,23 @@ namespace Deer { template class ResourceManager; - typedef uint32_t StorageType; + typedef uint32_t ResourceId; - StorageType generatePhyisicalStorageId(); - StorageType generateRuntimeStorageId(); + ResourceId generatePhyisicalStorageId(); + ResourceId generateRuntimeStorageId(); template class StorageBackend { public: template - static Scope load(StorageType storageId); + static Scope load(ResourceId storageId); }; template class Resource { public: int32_t getResourceId() const { return resourceId; } - StorageType getStorageId() const { return ResourceManager::getStorageId(*this); } + ResourceId getStorageId() const { return ResourceManager::getStorageId(*this); } bool isValid() const { return ResourceManager::isValid(*this); } T& getData() { return ResourceManager::getResourceData(*this); } @@ -61,15 +61,15 @@ namespace Deer { struct ResourceData { public: Scope data = nullptr; - StorageType storageId = 0; + ResourceId storageId = 0; }; static std::vector resources; - static std::unordered_map> resourceCache; + static std::unordered_map> resourceCache; public: template - static Resource loadResource(StorageType storageId) { + static Resource loadResource(ResourceId storageId) { if (resourceCache.contains(storageId)) return resourceCache[storageId]; @@ -91,14 +91,14 @@ namespace Deer { return resource; } - static Resource getResource(StorageType storageId) { + static Resource getResource(ResourceId storageId) { if (resourceCache.contains(storageId)) return resourceCache[storageId]; return Resource(); } - static Resource loadResourceFromData(const typename ResourceBuilder::BaseDataType& resourceData, StorageType storageId) { + static Resource loadResourceFromData(const typename ResourceBuilder::BaseDataType& resourceData, ResourceId storageId) { if (resourceCache.contains(storageId)) return resourceCache[storageId]; @@ -123,7 +123,7 @@ namespace Deer { return res.resourceId >= 0 && res.resourceId < static_cast(resources.size()); } - static inline StorageType getStorageId(Resource res) { + static inline ResourceId getStorageId(Resource res) { if (!isValid(res)) return 0; @@ -138,7 +138,7 @@ namespace Deer { template std::vector::ResourceData> ResourceManager::resources; template - std::unordered_map> ResourceManager::resourceCache; + std::unordered_map> ResourceManager::resourceCache; } // namespace Deer // BUILTIN RESOURCE IDS diff --git a/Deer/src/DeerRender/Core/StorageTypeGenerator.cpp b/Deer/src/DeerRender/Core/ResourceIdGenerator.cpp similarity index 69% rename from Deer/src/DeerRender/Core/StorageTypeGenerator.cpp rename to Deer/src/DeerRender/Core/ResourceIdGenerator.cpp index f3e7c63..3b2532a 100644 --- a/Deer/src/DeerRender/Core/StorageTypeGenerator.cpp +++ b/Deer/src/DeerRender/Core/ResourceIdGenerator.cpp @@ -3,11 +3,11 @@ #include namespace Deer { - StorageType generatePhyisicalStorageId() { + ResourceId generatePhyisicalStorageId() { return std::random_device{}() | 0x80000000; } - StorageType generateRuntimeStorageId() { + ResourceId generateRuntimeStorageId() { return std::random_device{}() & 0x7FFFFFF; } } // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp index d730717..e0c20f7 100644 --- a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp +++ b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp @@ -29,6 +29,10 @@ namespace Deer { return ResourceManager::loadResourceFromData(spec, generateRuntimeStorageId()); } + void resource_defaultConstructor(void* mem) { + new (mem) ResourceId(0); + } + int frameBuffer_getWidth(Resource& frameBuffer) { return frameBuffer.getData().getSpecification().width; } diff --git a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.h b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.h index d16678e..da05fe4 100644 --- a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.h +++ b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.h @@ -13,16 +13,6 @@ namespace Deer { class Shader; namespace Scripting { - template - std::string resource_getPath(Resource resource) { - return ResourceManager::getStorageId(resource); - } - - template - std::string resource_getName(Resource resource) { - return ResourceManager::getStorageId(resource).stem().string(); - } - enum ResourceType : uint32_t { NONE = 0, MESH = 1, @@ -33,6 +23,7 @@ namespace Deer { // GENERIC RESOURCE template bool resource_isValid(Resource& resource) { return resource.isValid(); } + void resource_defaultConstructor(void*); // Frame Buffer int frameBuffer_getWidth(Resource&); diff --git a/Deer/src/DeerRender/Scripting/ResourcesRegistry.cpp b/Deer/src/DeerRender/Scripting/ResourcesRegistry.cpp index 3b8caf0..7190968 100644 --- a/Deer/src/DeerRender/Scripting/ResourcesRegistry.cpp +++ b/Deer/src/DeerRender/Scripting/ResourcesRegistry.cpp @@ -25,8 +25,8 @@ namespace Deer { } // namespace Scripting void Scripting::registerResourceStructs() { - AS_CHECK(scriptEngine->RegisterObjectType("StorageId", sizeof(StorageType), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_ALLINTS | asGetTypeTraits())); - + AS_CHECK(scriptEngine->RegisterObjectType("StorageId", sizeof(ResourceId), asOBJ_VALUE | asOBJ_POD | asGetTypeTraits())); + AS_CHECK(scriptEngine->RegisterObjectType("GPUMesh", sizeof(Resource), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_ALLINTS | asGetTypeTraits>())); AS_CHECK(scriptEngine->RegisterObjectType("Shader", sizeof(Resource), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_ALLINTS | asGetTypeTraits>())); AS_CHECK(scriptEngine->RegisterObjectType("Texture", sizeof(Resource), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_ALLINTS | asGetTypeTraits>())); @@ -36,8 +36,10 @@ namespace Deer { Resource createFrameBuffer(const std::string name, int sixeX, int sizeY); void Scripting::registerResourceFunctions() { + REGISTER_EXT_OBJECT_CONSTRUCTOR(scriptEngine, "StorageId", "void f()", resource_defaultConstructor); + REGISTER_EXT_OBJECT_METHOD(scriptEngine, "FrameBuffer", "int get_width() const property", frameBuffer_getWidth); - REGISTER_EXT_OBJECT_METHOD(scriptEngine, "FrameBuffer", "int get_height() const property", frameBuffer_getHeight); + REGISTER_EXT_OBJECT_METHOD(scriptEngine, "FrameBuffer", "int get_heighqt() const property", frameBuffer_getHeight); REGISTER_EXT_OBJECT_METHOD(scriptEngine, "FrameBuffer", "bool isValid()", frameBuffer_isValid); REGISTER_EXT_OBJECT_METHOD(scriptEngine, "FrameBuffer", "void resize(int, int)", frameBuffer_resize); REGISTER_EXT_OBJECT_METHOD(scriptEngine, "FrameBuffer", "void clearRGBA(int, int, int, int)", frameBuffer_clearRGBA); diff --git a/Deer/src/DeerRender/Serialization/Components/MeshComponentSerialization.h b/Deer/src/DeerRender/Serialization/Components/MeshComponentSerialization.h index 26c5f5d..f0c6ec0 100644 --- a/Deer/src/DeerRender/Serialization/Components/MeshComponentSerialization.h +++ b/Deer/src/DeerRender/Serialization/Components/MeshComponentSerialization.h @@ -19,21 +19,15 @@ namespace Deer { template void load(Archive& archive) { - StorageType storageId_mesh; - StorageType storageId_shader; + ResourceId storageId_mesh; + ResourceId storageId_shader; archive(cereal::make_nvp("IsActive", component.active)); archive(cereal::make_nvp("Mesh", storageId_mesh)); archive(cereal::make_nvp("Shader", storageId_shader)); - Scope meshData = settings.meshLoadingFunction(storageId_mesh); - Scope shaderData = settings.shaderLoadingFunction(storageId_shader); - - Resource mesh = ResourceManager::loadResourceFromData(*meshData.get(), storageId_mesh); - component.mesh = mesh; - - Resource shader = ResourceManager::loadResourceFromData(*shaderData.get(), storageId_shader); - component.shader = shader; + component.mesh = settings.meshLoadingFunction(storageId_mesh); + component.shader = settings.shaderLoadingFunction(storageId_shader); } }; } // namespace Deer \ No newline at end of file diff --git a/DeerStudio/headers/DeerStudio/StudioAPI.h b/DeerStudio/headers/DeerStudio/StudioAPI.h index f5ae7ab..fa7483a 100644 --- a/DeerStudio/headers/DeerStudio/StudioAPI.h +++ b/DeerStudio/headers/DeerStudio/StudioAPI.h @@ -21,15 +21,9 @@ namespace Deer { int32_t resourceFolder_getResourceCount(int32_t&); int32_t resourceFolder_getResourceIdByIndex(int32_t&); - Resource - getIcon(std::string&); - - CScriptArray* getResourceFolders(std::string& path); - CScriptArray* getResourceFiles(std::string& path); - - CScriptDictionary* getResourceMetadata(std::string& resource); - CScriptDictionary* setResourceMetadata(std::string& resource); - - ResourceType getResourceType(std::string&); + std::string resourceId_getName(ResourceId&); + std::string resourceId_getPath(ResourceId&); + int32_t resourceId_getFolder(ResourceId&); + ResourceType resourceId_getType(ResourceId&); } // namespace StudioAPI } // namespace Deer \ No newline at end of file diff --git a/DeerStudio/headers/DeerStudio/StudioResources.h b/DeerStudio/headers/DeerStudio/StudioResources.h index 3f1ab41..d51d544 100644 --- a/DeerStudio/headers/DeerStudio/StudioResources.h +++ b/DeerStudio/headers/DeerStudio/StudioResources.h @@ -3,7 +3,6 @@ #include "DeerRender/Tools/Path.h" #include "cereal/cereal.hpp" - #include namespace Deer { @@ -41,25 +40,33 @@ namespace Deer { } }; + struct FolderInfo { + std::string name; + std::string parent; + std::string fullPath; + std::vector resources; + std::vector subfolders; + }; + namespace StudioResources { ResourceInformation* getResourceInfoFromPath(const std::string& path); ResourceInformation* getResourceInfoFromId(uint32_t resource); + FolderInfo* getFolderInfoFromPath(std::string folderStr); void scanResources(); } // namespace StudioResources - template <> class StorageBackend { public: template - static Scope load(StorageType storageId); + static Scope load(ResourceId storageId); template <> - Scope load(StorageType storageId); + Scope load(ResourceId storageId); template <> - Scope load(StorageType storageId); + Scope load(ResourceId storageId); template <> - Scope load(StorageType storageId); + Scope load(ResourceId storageId); }; } // namespace Deer diff --git a/DeerStudio/src/DeerStudio/EditorDataImporter/MeshData.cpp b/DeerStudio/src/DeerStudio/EditorDataImporter/MeshData.cpp index 3d55865..7f77466 100644 --- a/DeerStudio/src/DeerStudio/EditorDataImporter/MeshData.cpp +++ b/DeerStudio/src/DeerStudio/EditorDataImporter/MeshData.cpp @@ -15,14 +15,14 @@ namespace Deer { Scope convertAssimpMesh(const aiMesh* mesh); template <> - Scope StorageBackend::load(StorageType storageId) { + Scope StorageBackend::load(ResourceId storageId) { ResourceInformation* info = StudioResources::getResourceInfoFromId(storageId); if (!info) return Scope(); Assimp::Importer importer; const aiScene* scene = importer.ReadFile(info->fullPath, aiProcess_Triangulate); - + if (scene == nullptr) { DEER_CORE_ERROR("Error processing assimp"); return Scope(); diff --git a/DeerStudio/src/DeerStudio/EditorDataImporter/ShaderData.cpp b/DeerStudio/src/DeerStudio/EditorDataImporter/ShaderData.cpp index 405ba5e..235c63b 100644 --- a/DeerStudio/src/DeerStudio/EditorDataImporter/ShaderData.cpp +++ b/DeerStudio/src/DeerStudio/EditorDataImporter/ShaderData.cpp @@ -32,7 +32,7 @@ namespace Deer { } template <> - Scope StorageBackend::load(StorageType storageId) { + Scope StorageBackend::load(ResourceId storageId) { ResourceInformation* info = StudioResources::getResourceInfoFromId(storageId); if (!info) return Scope(); diff --git a/DeerStudio/src/DeerStudio/EditorDataImporter/TextureData.cpp b/DeerStudio/src/DeerStudio/EditorDataImporter/TextureData.cpp index 53dd080..224f539 100644 --- a/DeerStudio/src/DeerStudio/EditorDataImporter/TextureData.cpp +++ b/DeerStudio/src/DeerStudio/EditorDataImporter/TextureData.cpp @@ -8,7 +8,7 @@ namespace Deer { template <> - Scope StorageBackend::load(StorageType storageId) { + Scope StorageBackend::load(ResourceId storageId) { ResourceInformation* info = StudioResources::getResourceInfoFromId(storageId); if (!info) return Scope(); diff --git a/DeerStudio/src/DeerStudio/StudioAPI.cpp b/DeerStudio/src/DeerStudio/StudioAPI.cpp index 30aa0d6..4f5dfd0 100644 --- a/DeerStudio/src/DeerStudio/StudioAPI.cpp +++ b/DeerStudio/src/DeerStudio/StudioAPI.cpp @@ -10,65 +10,20 @@ #include "scriptdictionary.h" namespace Deer { - ResourceType StudioAPI::getResourceType(std::string& dir) { - Path path(dir); - std::string extension = path.extension().string(); - - if (extension == ".obj" || extension == ".fbx" || extension == ".dae" || - extension == ".3ds" || extension == ".ply" || extension == ".stl" || - extension == ".glb" || extension == ".gltf") { - return ResourceType::MESH; + int32_t StudioAPI::getResourceFolder(std::string& path) { } + bool StudioAPI::resourceFolder_isValid(int32_t&); + bool StudioAPI::resourceFolder_isRoot(int32_t&); + std::string StudioAPI::resourceFolder_getName(int32_t&); + std::string StudioAPI::resourceFolder_getFullPath(int32_t&); + int32_t StudioAPI::resourceFolder_getParentFolder(int32_t&); + int32_t StudioAPI::resourceFolder_getSubFolderCount(int32_t&); + int32_t StudioAPI::resourceFolder_getSubfolderByIndex(int32_t, int32_t&); + int32_t StudioAPI::resourceFolder_getResourceCount(int32_t&); + int32_t StudioAPI::resourceFolder_getResourceIdByIndex(int32_t&); - if (extension == ".glsl") - return ResourceType::SHADER; - - if (extension == ".png") - return ResourceType::TEXTURE; - - return ResourceType::NONE; - }; - - CScriptArray* StudioAPI::getResourceFolders(std::string& path_s) { - asITypeInfo* arrayString = Scripting::getScriptEngine()->GetTypeInfoByDecl("array"); - CScriptArray* array = CScriptArray::Create(arrayString); - - Path path_p = Path("Resources") / Path(path_s).lexically_normal(); - try { - for (const auto& entry : std::filesystem::directory_iterator(path_p)) { - if (entry.is_directory()) { - std::string s = entry.path().lexically_relative("Resources").string(); - - array->Resize(array->GetSize() + 1); - array->SetValue(array->GetSize() - 1, &s); - } - } - } catch (const std::exception& e) { - DEER_EDITOR_ENGINE_ERROR("Error in getResourceFolders(), {}", e.what()); - } - - return array; - } - - CScriptArray* StudioAPI::getResourceFiles(std::string& path_s) { - asITypeInfo* arrayString = Scripting::getScriptEngine()->GetTypeInfoByDecl("array"); - CScriptArray* array = CScriptArray::Create(arrayString); - - Path path_p = Path("Resources") / Path(path_s).lexically_normal(); - try { - for (const auto& entry : std::filesystem::directory_iterator(path_p)) { - if (entry.is_regular_file()) { - std::string s = entry.path().lexically_relative("Resources").string(); - - array->Resize(array->GetSize() + 1); - array->SetValue(array->GetSize() - 1, &s); - } - } - } catch (const std::exception& e) { - DEER_EDITOR_ENGINE_ERROR("Error in getResourceFiles(), {}", e.what()); - } - - return array; - } - + std::string StudioAPI::resourceId_getName(ResourceId&); + std::string StudioAPI::resourceId_getPath(ResourceId&); + int32_t StudioAPI::resourceId_getFolder(ResourceId&); + ResourceType StudioAPI::resourceId_getType(ResourceId&); } // namespace Deer \ No newline at end of file diff --git a/DeerStudio/src/DeerStudio/StudioResources.cpp b/DeerStudio/src/DeerStudio/StudioResources.cpp index e861379..9610d8d 100644 --- a/DeerStudio/src/DeerStudio/StudioResources.cpp +++ b/DeerStudio/src/DeerStudio/StudioResources.cpp @@ -45,14 +45,6 @@ namespace cereal { } // namespace cereal namespace Deer { - struct FolderInfo { - std::string name; - std::string parent; - std::string fullPath; - std::vector resources; - std::vector subfolders; - }; - namespace StudioResources { std::vector resources; std::unordered_map resourcePathToIndex; @@ -62,7 +54,7 @@ namespace Deer { std::unordered_map folderPathToFolderIndex; void registerResource(ResourceInformation& resource, size_t index); - FolderInfo& getFolderInfo(std::string folderStr); + FolderInfo& getCreateFolderInfo(std::string folderStr); ResourceType getResourceType(const std::string& dir) { Path path(dir); @@ -84,6 +76,13 @@ namespace Deer { }; } // namespace StudioResources + FolderInfo* StudioResources::getFolderInfoFromPath(std::string path) { + if (!folderPathToFolderIndex.contains(path)) + return nullptr; + + return &folders[folderPathToFolderIndex[path]]; + } + ResourceInformation* StudioResources::getResourceInfoFromPath(const std::string& path) { if (!resourcePathToIndex.contains(path)) return nullptr; @@ -98,7 +97,7 @@ namespace Deer { return &resources[resourceIdToIndex[resource]]; } - FolderInfo& StudioResources::getFolderInfo(std::string folderStr) { + FolderInfo& getCreateFolderInfo(std::string folderStr) { FolderInfo* folderInfo; if (folderPathToFolderIndex.contains(folderStr)) { size_t folderIndex = folderPathToFolderIndex[folderStr]; @@ -117,7 +116,7 @@ namespace Deer { folderPathToFolderIndex[folderStr] = folders.size() - 1; if (!folderStr.empty()) { - FolderInfo& parentPathInfo = getFolderInfo(folderInfo->parent); + FolderInfo& parentPathInfo = getCreateFolderInfo(folderInfo->parent); parentPathInfo.subfolders.push_back(folderStr); } } @@ -135,7 +134,7 @@ namespace Deer { resourceIdToIndex[resource.resourceId] = index; resourcePathToIndex[resource.resourcePath] = index; - FolderInfo& folderInfo = getFolderInfo(resource.folderPath); + FolderInfo& folderInfo = getCreateFolderInfo(resource.folderPath); folderInfo.resources.push_back(resource.resourceId); }