From a4c8f44ae3dd108f928e381ba8151a870a54d6f9 Mon Sep 17 00:00:00 2001 From: Chewico Date: Tue, 10 Mar 2026 21:04:04 +0100 Subject: [PATCH] To server --- DeerStudio/headers/DeerStudio/StudioAPI.h | 2 +- DeerStudio/src/DeerStudio/StudioAPI.cpp | 132 ++++++++++++++++-- DeerStudio/src/DeerStudio/StudioResources.cpp | 68 +++++---- DeerStudio/src/DeerStudio/StudioScripting.cpp | 5 +- 4 files changed, 163 insertions(+), 44 deletions(-) diff --git a/DeerStudio/headers/DeerStudio/StudioAPI.h b/DeerStudio/headers/DeerStudio/StudioAPI.h index fa7483a..58268c8 100644 --- a/DeerStudio/headers/DeerStudio/StudioAPI.h +++ b/DeerStudio/headers/DeerStudio/StudioAPI.h @@ -19,7 +19,7 @@ namespace Deer { int32_t resourceFolder_getSubFolderCount(int32_t&); int32_t resourceFolder_getSubfolderByIndex(int32_t, int32_t&); int32_t resourceFolder_getResourceCount(int32_t&); - int32_t resourceFolder_getResourceIdByIndex(int32_t&); + ResourceId resourceFolder_getResourceIdByIndex(int32_t, int32_t&); std::string resourceId_getName(ResourceId&); std::string resourceId_getPath(ResourceId&); diff --git a/DeerStudio/src/DeerStudio/StudioAPI.cpp b/DeerStudio/src/DeerStudio/StudioAPI.cpp index fadd2d9..188bbcc 100644 --- a/DeerStudio/src/DeerStudio/StudioAPI.cpp +++ b/DeerStudio/src/DeerStudio/StudioAPI.cpp @@ -10,20 +10,122 @@ #include "scriptdictionary.h" namespace Deer { - 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&); + namespace StudioResources { + extern std::vector resources; + extern std::unordered_map resourcePathToIndex; + extern std::unordered_map resourceIdToIndex; - std::string StudioAPI::resourceId_getName(ResourceId&); - std::string StudioAPI::resourceId_getPath(ResourceId&); - int32_t StudioAPI::resourceId_getFolder(ResourceId&); - ResourceType StudioAPI::resourceId_getType(ResourceId&); + extern std::vector folders; + extern std::unordered_map folderPathToFolderIndex; + } // namespace StudioResources + + int32_t StudioAPI::getResourceFolder(std::string& path) { + if (!StudioResources::folderPathToFolderIndex.contains(path)) + return -1; + return StudioResources::folderPathToFolderIndex[path]; + } + + bool StudioAPI::resourceFolder_isValid(int32_t& folderIndex) { + return folderIndex >= 0; + } + + bool StudioAPI::resourceFolder_isRoot(int32_t& folderIndex) { + return folderIndex == 0; + } + + std::string StudioAPI::resourceFolder_getName(int32_t& folderIndex) { + if (folderIndex < 0) { + return "NULL"; + } + + FolderInfo& folderInfo = StudioResources::folders[folderIndex]; + return folderInfo.name; + } + + std::string StudioAPI::resourceFolder_getFullPath(int32_t& folderIndex) { + if (folderIndex < 0) { + return "NULL"; + } + + FolderInfo& folderInfo = StudioResources::folders[folderIndex]; + return folderInfo.fullPath; + } + + int32_t StudioAPI::resourceFolder_getParentFolder(int32_t& folderIndex) { + if (folderIndex <= 0) { + return 0; + } + + FolderInfo& folderInfo = StudioResources::folders[folderIndex]; + + return getResourceFolder(folderInfo.fullPath); + } + + int32_t StudioAPI::resourceFolder_getSubFolderCount(int32_t& folderIndex) { + if (folderIndex < 0) { + return 0; + } + + FolderInfo& folderInfo = StudioResources::folders[folderIndex]; + return folderInfo.subfolders.size(); + } + + int32_t StudioAPI::resourceFolder_getSubfolderByIndex(int32_t subFolderIndex, int32_t& folderIndex) { + if (folderIndex < 0) { + return 0; + } + + FolderInfo& folderInfo = StudioResources::folders[folderIndex]; + return getResourceFolder(folderInfo.subfolders[subFolderIndex]); + } + + int32_t StudioAPI::resourceFolder_getResourceCount(int32_t& folderIndex) { + if (folderIndex < 0) { + return 0; + } + + FolderInfo& folderInfo = StudioResources::folders[folderIndex]; + return folderInfo.resources.size(); + } + + ResourceId StudioAPI::resourceFolder_getResourceIdByIndex(int32_t resourceIndex, int32_t& folderIndex) { + if (folderIndex < 0) { + return 0; + } + + FolderInfo& folderInfo = StudioResources::folders[folderIndex]; + return folderInfo.resources[resourceIndex]; + } + + std::string StudioAPI::resourceId_getName(ResourceId& resourceId) { + ResourceInformation* data = StudioResources::getResourceInfoFromId(resourceId); + if (!data) + return "NULL"; + + return data->resourceName; + } + + std::string StudioAPI::resourceId_getPath(ResourceId& resourceId) { + ResourceInformation* data = StudioResources::getResourceInfoFromId(resourceId); + if (!data) + return "NULL"; + + return data->resourcePath; + } + + int32_t StudioAPI::resourceId_getFolder(ResourceId& resourceId) { + ResourceInformation* data = StudioResources::getResourceInfoFromId(resourceId); + if (!data) + return -1; + + return getResourceFolder(data->folderPath); + } + + ResourceType StudioAPI::resourceId_getType(ResourceId& resourceId) { + ResourceInformation* data = StudioResources::getResourceInfoFromId(resourceId); + if (!data) + return ResourceType::NONE; + + return data->resourceType; + } } // namespace Deer \ No newline at end of file diff --git a/DeerStudio/src/DeerStudio/StudioResources.cpp b/DeerStudio/src/DeerStudio/StudioResources.cpp index 9610d8d..9b92762 100644 --- a/DeerStudio/src/DeerStudio/StudioResources.cpp +++ b/DeerStudio/src/DeerStudio/StudioResources.cpp @@ -56,26 +56,36 @@ namespace Deer { void registerResource(ResourceInformation& resource, size_t index); FolderInfo& getCreateFolderInfo(std::string folderStr); - ResourceType getResourceType(const std::string& dir) { - Path path(dir); - std::string extension = path.extension().string(); + void clearFolderContent(); - if (extension == ".obj" || extension == ".fbx" || extension == ".dae" || - extension == ".3ds" || extension == ".ply" || extension == ".stl" || - extension == ".glb" || extension == ".gltf") { - return ResourceType::MESH; - } - - if (extension == ".glsl") - return ResourceType::SHADER; - - if (extension == ".png") - return ResourceType::TEXTURE; - - return ResourceType::NONE; - }; + ResourceType getResourceType(const std::string& dir); } // namespace StudioResources + ResourceType StudioResources::getResourceType(const 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; + } + + if (extension == ".glsl") + return ResourceType::SHADER; + + if (extension == ".png") + return ResourceType::TEXTURE; + + return ResourceType::NONE; + }; + + void StudioResources::clearFolderContent() { + for (FolderInfo& folder : folders) { + folder.resources.clear(); + } + } + FolderInfo* StudioResources::getFolderInfoFromPath(std::string path) { if (!folderPathToFolderIndex.contains(path)) return nullptr; @@ -97,7 +107,21 @@ namespace Deer { return &resources[resourceIdToIndex[resource]]; } - FolderInfo& getCreateFolderInfo(std::string folderStr) { + FolderInfo& StudioResources::getCreateFolderInfo(std::string folderStr) { + // If size == 0, we create the root folder + if (folders.size() == 0) { + Path resourcePath("Resources"); + + FolderInfo rootFolder{ + .name = "Resources", + .parent = "", + .fullPath = "", + }; + + folders.push_back(rootFolder); + folderPathToFolderIndex[""] = 0; + } + FolderInfo* folderInfo; if (folderPathToFolderIndex.contains(folderStr)) { size_t folderIndex = folderPathToFolderIndex[folderStr]; @@ -114,11 +138,6 @@ namespace Deer { folders.push_back(newFolder); folderInfo = &folders.back(); folderPathToFolderIndex[folderStr] = folders.size() - 1; - - if (!folderStr.empty()) { - FolderInfo& parentPathInfo = getCreateFolderInfo(folderInfo->parent); - parentPathInfo.subfolders.push_back(folderStr); - } } return *folderInfo; @@ -143,8 +162,7 @@ namespace Deer { resourcePathToIndex.clear(); resourceIdToIndex.clear(); - folders.clear(); - folderPathToFolderIndex.clear(); + clearFolderContent(); Path resourcePath("Resources"); Path resourceJsonPath = resourcePath / "ResourceData.json"; diff --git a/DeerStudio/src/DeerStudio/StudioScripting.cpp b/DeerStudio/src/DeerStudio/StudioScripting.cpp index 2179521..f7042e1 100644 --- a/DeerStudio/src/DeerStudio/StudioScripting.cpp +++ b/DeerStudio/src/DeerStudio/StudioScripting.cpp @@ -14,14 +14,13 @@ namespace Deer { void StudioScripting::registerStudioScripting() { asIScriptEngine* scriptEngine = Scripting::getScriptEngine(); - scriptEngine->RegisterEnum("Resources"); + scriptEngine->RegisterEnum("ResourceType"); scriptEngine->RegisterEnumValue("ResourceType", "None", (int)ResourceType::NONE); scriptEngine->RegisterEnumValue("ResourceType", "Mesh", (int)ResourceType::MESH); scriptEngine->RegisterEnumValue("ResourceType", "Shader", (int)ResourceType::SHADER); scriptEngine->RegisterEnumValue("ResourceType", "Texture", (int)ResourceType::TEXTURE); - scriptEngine->SetDefaultNamespace(""); - scriptEngine->SetDefaultNamespace("StudioResources"); + scriptEngine->SetDefaultNamespace("Resources"); scriptEngine->RegisterGlobalFunction("GPUMesh loadGPUMesh(StorageId)", asFUNCTION(ResourceManager::loadResource), asCALL_CDECL); scriptEngine->RegisterGlobalFunction("Shader loadShader(StorageId)", asFUNCTION(ResourceManager::loadResource), asCALL_CDECL); scriptEngine->RegisterGlobalFunction("Texture loadTexture(StorageId)", asFUNCTION(ResourceManager::loadResource), asCALL_CDECL);