From d377e99d314f9cf943f16b903bfcee5fd4c25d3f Mon Sep 17 00:00:00 2001 From: Chewico Date: Sun, 8 Mar 2026 22:25:55 +0100 Subject: [PATCH] Please fix --- .../DeerCore/Serialization/WorldSettings.h | 4 +- Deer/Include/DeerCore/Universe.h | 2 - Deer/Include/DeerRender/Resource.h | 22 +++++-- .../DeerRender/Core/StorageTypeGenerator.cpp | 13 ++++ Deer/src/DeerRender/Mesh/BuiltinSphere.cpp | 1 + .../Scripting/InternalAPI/Resources.cpp | 65 +------------------ .../Scripting/InternalAPI/Resources.h | 9 +-- .../Scripting/ResourcesRegistry.cpp | 4 -- .../Components/MeshComponentSerialization.h | 4 +- .../DeerRender/Shader/BuiltinSimpleShader.cpp | 5 +- Deer/src/DeerRender/Voxel/VoxelBuilder.cpp | 2 +- .../DeerStudio/ResourceStorageBackend.h | 6 ++ DeerStudio/src/DeerStudio/DeerStudio.cpp | 4 +- .../src/DeerStudio/EditorDataSource.cpp | 59 ----------------- 14 files changed, 47 insertions(+), 153 deletions(-) create mode 100644 Deer/src/DeerRender/Core/StorageTypeGenerator.cpp delete mode 100644 DeerStudio/src/DeerStudio/EditorDataSource.cpp diff --git a/Deer/Include/DeerCore/Serialization/WorldSettings.h b/Deer/Include/DeerCore/Serialization/WorldSettings.h index 0b383a6..6401735 100644 --- a/Deer/Include/DeerCore/Serialization/WorldSettings.h +++ b/Deer/Include/DeerCore/Serialization/WorldSettings.h @@ -15,8 +15,8 @@ namespace Deer { bool includeServer = false; bool includeClient = true; - std::function(const Path&)> meshLoadingFunction = nullptr; - std::function(const Path&)> shaderLoadingFunction = nullptr; + std::function(StorageType)> meshLoadingFunction = nullptr; + std::function(StorageType)> shaderLoadingFunction = nullptr; #else bool includeServer = true; bool includeClient = false; diff --git a/Deer/Include/DeerCore/Universe.h b/Deer/Include/DeerCore/Universe.h index 1bd8722..a3c832d 100644 --- a/Deer/Include/DeerCore/Universe.h +++ b/Deer/Include/DeerCore/Universe.h @@ -2,8 +2,6 @@ #include "DeerCore/Serialization/WorldSettings.h" #include "DeerCore/Tools/Path.h" -#include - namespace Deer { class World; class WorldSettings; diff --git a/Deer/Include/DeerRender/Resource.h b/Deer/Include/DeerRender/Resource.h index 3d844b4..0a4bca3 100644 --- a/Deer/Include/DeerRender/Resource.h +++ b/Deer/Include/DeerRender/Resource.h @@ -13,6 +13,9 @@ namespace Deer { class ResourceManager; typedef uint32_t StorageType; + StorageType generatePhyisicalStorageId(); + StorageType generateRuntimeStorageId(); + template class StorageBackend { public: @@ -57,9 +60,8 @@ namespace Deer { private: struct ResourceData { public: - ResourceData(Scope _data, StorageType _storageId) : data(_data), storageId(_storageId) {} - Scope data; - StorageType storageId; + Scope data = nullptr; + StorageType storageId = 0; }; static std::vector resources; @@ -78,7 +80,12 @@ namespace Deer { data = ResourceBuilder::buildResource(*baseData.get()); Resource resource = Resource::unsafeFromId(resources.size()); - resources.push_back({storageId, std::move(data)}); + resources.push_back(); + + ResourceData& rd = resources.back(); + rd.data = std::move(data); + rd.storageId = storageId; + resourceCache[storageId] = resource; return resource; @@ -98,8 +105,11 @@ namespace Deer { Scope data = ResourceBuilder::buildResource(resourceData); Resource resource = Resource::unsafeFromId(resources.size()); - resources.push_back({std::move(data), storageId}); - resourceCache[storageId] = resource; + resources.push_back({}); + + ResourceData& rd = resources.back(); + rd.data = std::move(data); + rd.storageId = storageId; return resource; } diff --git a/Deer/src/DeerRender/Core/StorageTypeGenerator.cpp b/Deer/src/DeerRender/Core/StorageTypeGenerator.cpp new file mode 100644 index 0000000..f3e7c63 --- /dev/null +++ b/Deer/src/DeerRender/Core/StorageTypeGenerator.cpp @@ -0,0 +1,13 @@ +#pragma once +#include "DeerRender/Resource.h" +#include + +namespace Deer { + StorageType generatePhyisicalStorageId() { + return std::random_device{}() | 0x80000000; + } + + StorageType generateRuntimeStorageId() { + return std::random_device{}() & 0x7FFFFFF; + } +} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerRender/Mesh/BuiltinSphere.cpp b/Deer/src/DeerRender/Mesh/BuiltinSphere.cpp index 45c8abe..9f1a7c3 100644 --- a/Deer/src/DeerRender/Mesh/BuiltinSphere.cpp +++ b/Deer/src/DeerRender/Mesh/BuiltinSphere.cpp @@ -6,6 +6,7 @@ namespace Deer { // Sphere parameters constexpr int SPHERE_SEGMENTS = 32; // longitude constexpr int SPHERE_RINGS = 16; // latitude + } // namespace Builtin Resource Builtin::sphere() { diff --git a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp index 422fcea..d730717 100644 --- a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp +++ b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.cpp @@ -24,70 +24,9 @@ namespace Deer { namespace Scripting { extern asIScriptEngine* scriptEngine; - ResourceType 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" || extension == ".mtl") { - return ResourceType::MESH; - } - - if (extension == ".glsl") - return ResourceType::SHADER; - - if (extension == ".png") - return ResourceType::TEXTURE; - - return ResourceType::NONE; - }; - - CScriptArray* getResourceFolders(std::string& path_s) { - asITypeInfo* arrayString = scriptEngine->GetTypeInfoByName("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* getResourceFiles(std::string& path_s) { - asITypeInfo* arrayString = scriptEngine->GetTypeInfoByName("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; - } - - Resource createFrameBuffer(std::string& name, int width, int height) { + Resource createFrameBuffer(int width, int height) { FrameBufferData spec(width, height, 1, FrameBufferData::FrameBufferType::RGBA8); - return ResourceManager::loadResourceFromData(spec, name); + return ResourceManager::loadResourceFromData(spec, generateRuntimeStorageId()); } int frameBuffer_getWidth(Resource& frameBuffer) { diff --git a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.h b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.h index 2678483..d16678e 100644 --- a/Deer/src/DeerRender/Scripting/InternalAPI/Resources.h +++ b/Deer/src/DeerRender/Scripting/InternalAPI/Resources.h @@ -30,16 +30,9 @@ namespace Deer { TEXTURE = 3, }; - CScriptArray* getResourceFolders(std::string& path); - CScriptArray* getResourceFiles(std::string& path); - // GENERIC RESOURCE template bool resource_isValid(Resource& resource) { return resource.isValid(); } - template - std::string resource_getPath(Resource& resource) { return resource.getStorageId(); } - template - std::string resource_getName(Resource& resource) { return Path(resource.getStorageId()).stem().string(); } // Frame Buffer int frameBuffer_getWidth(Resource&); @@ -49,6 +42,6 @@ namespace Deer { void frameBuffer_resize(int, int, Resource&); void frameBuffer_drawMesh(Resource, Resource, TransformComponent, WorldCamera, Resource&); - Resource createFrameBuffer(std::string& name, int sixeX, int sizeY); + Resource createFrameBuffer(int sixeX, int sizeY); } // namespace Scripting } // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerRender/Scripting/ResourcesRegistry.cpp b/Deer/src/DeerRender/Scripting/ResourcesRegistry.cpp index 51ae80f..13c72dd 100644 --- a/Deer/src/DeerRender/Scripting/ResourcesRegistry.cpp +++ b/Deer/src/DeerRender/Scripting/ResourcesRegistry.cpp @@ -21,8 +21,6 @@ namespace Deer { template void registerResourceBasics(const char* objName) { REGISTER_EXT_OBJECT_METHOD(scriptEngine, objName, "bool isValid() const", static_cast&)>(&resource_isValid)); - REGISTER_EXT_OBJECT_METHOD(scriptEngine, objName, "string get_name() const property", static_cast&)>(&resource_getName)); - REGISTER_EXT_OBJECT_METHOD(scriptEngine, objName, "string get_path() const property", static_cast&)>(&resource_getPath)); } } // namespace Scripting @@ -32,9 +30,7 @@ namespace Deer { AS_CHECK(scriptEngine->RegisterObjectType("Texture", sizeof(Resource), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_ALLINTS | asGetTypeTraits>())); AS_CHECK(scriptEngine->RegisterObjectType("FrameBuffer", sizeof(Resource), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_ALLINTS | asGetTypeTraits>())); } - - Resource createFrameBuffer(const std::string name, int sixeX, int sizeY); void Scripting::registerResourceFunctions() { diff --git a/Deer/src/DeerRender/Serialization/Components/MeshComponentSerialization.h b/Deer/src/DeerRender/Serialization/Components/MeshComponentSerialization.h index 6351eef..26c5f5d 100644 --- a/Deer/src/DeerRender/Serialization/Components/MeshComponentSerialization.h +++ b/Deer/src/DeerRender/Serialization/Components/MeshComponentSerialization.h @@ -19,8 +19,8 @@ namespace Deer { template void load(Archive& archive) { - std::string storageId_mesh; - std::string storageId_shader; + StorageType storageId_mesh; + StorageType storageId_shader; archive(cereal::make_nvp("IsActive", component.active)); archive(cereal::make_nvp("Mesh", storageId_mesh)); diff --git a/Deer/src/DeerRender/Shader/BuiltinSimpleShader.cpp b/Deer/src/DeerRender/Shader/BuiltinSimpleShader.cpp index aa78e95..65fae03 100644 --- a/Deer/src/DeerRender/Shader/BuiltinSimpleShader.cpp +++ b/Deer/src/DeerRender/Shader/BuiltinSimpleShader.cpp @@ -91,8 +91,7 @@ void main() } // namespace Builtin Resource Builtin::simpleShader() { - Resource shader = ResourceManager::getResource("Builtin:SimpleShader"); - + Resource shader = ResourceManager::getResource(RESOURCE_BASIC_SHADER_ID); if (shader.isValid()) return shader; @@ -100,6 +99,6 @@ void main() shaderData.fragmentShader = fragmentSimpleShader; shaderData.vertexShader = vertexSimpleShader; - return ResourceManager::loadResourceFromData(shaderData, "Builtin:SimpleShader"); + return ResourceManager::loadResourceFromData(shaderData, RESOURCE_BASIC_SHADER_ID); } } // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerRender/Voxel/VoxelBuilder.cpp b/Deer/src/DeerRender/Voxel/VoxelBuilder.cpp index 55a4582..27b4b5f 100644 --- a/Deer/src/DeerRender/Voxel/VoxelBuilder.cpp +++ b/Deer/src/DeerRender/Voxel/VoxelBuilder.cpp @@ -93,7 +93,7 @@ namespace Deer { meshData.getIndexData()[i] = indices[i]; } - return ResourceManager::loadResourceFromData(meshData, "tmp&&"); + return ResourceManager::loadResourceFromData(meshData, generateRuntimeStorageId()); } VoxelBuilder::VoxelData& VoxelBuilder::getVoxelData(int x, int y, int z) { diff --git a/DeerStudio/headers/DeerStudio/ResourceStorageBackend.h b/DeerStudio/headers/DeerStudio/ResourceStorageBackend.h index 1930a40..43085e3 100644 --- a/DeerStudio/headers/DeerStudio/ResourceStorageBackend.h +++ b/DeerStudio/headers/DeerStudio/ResourceStorageBackend.h @@ -12,8 +12,14 @@ namespace Deer { template <> class StorageBackend { public: + template + static Scope load(StorageType storageId); + + template <> static Scope load(StorageType storageId); + template <> static Scope load(StorageType storageId); + template <> static Scope load(StorageType storageId); }; } // namespace Deer \ No newline at end of file diff --git a/DeerStudio/src/DeerStudio/DeerStudio.cpp b/DeerStudio/src/DeerStudio/DeerStudio.cpp index e96fdb3..53ee8fa 100644 --- a/DeerStudio/src/DeerStudio/DeerStudio.cpp +++ b/DeerStudio/src/DeerStudio/DeerStudio.cpp @@ -7,9 +7,7 @@ #include "DeerRender/Universe.h" #include "DeerRender/World.h" -#include "DeerStudio/EditorDataImporter.h" -#include "DeerStudio/EditorDataSource.h" -#include "DeerStudio/ResourceDataSource.h" +#include "DeerStudio/ResourceStorageBackend.h" #include "DeerStudio/StudioResources.h" // TMP diff --git a/DeerStudio/src/DeerStudio/EditorDataSource.cpp b/DeerStudio/src/DeerStudio/EditorDataSource.cpp deleted file mode 100644 index 4885c5d..0000000 --- a/DeerStudio/src/DeerStudio/EditorDataSource.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "DeerStudio/EditorDataSource.h" -#include "DeerRender/Log.h" - -#include -#include -#include - -namespace Deer { - StorageData StorageBackend::loadData(const std::string& location) { - Path path = Path("Editor") / location; - - if (!std::filesystem::exists(path)) { - return StorageData(); - } - - std::ifstream file(path, std::ios::binary | std::ios::ate); - if (!file.is_open()) { - DEER_CORE_ERROR("Failed to open file '{}'", location.c_str()); - return StorageData(); - } - - auto size = file.tellg(); - if (size <= 0) { - DEER_CORE_ERROR("File '{}' is empty or has invalid size", location.c_str()); - return StorageData(); - } - - StorageData data = StorageData(size); - uint8_t* data_raw = data.getData(); - file.seekg(0, std::ios::beg); - - if (!file.read(reinterpret_cast(data_raw), size)) { - DEER_CORE_ERROR("Failed to read full file '{}'", location.c_str()); - return StorageData(); - } - - return data; - } - - void StorageBackend::saveData(const std::string& location, const StorageData& data) { - Path path = Path("Editor") / location; - std::ofstream file(path, std::ios::binary); - if (!file.is_open()) { - DEER_CORE_ERROR("Failed to open file '{}' for writing", location.c_str()); - return; - } - - const uint8_t* data_raw = data.getData(); - size_t size = data.getSize(); - - if (!file.write(reinterpret_cast(data_raw), size)) { - DEER_CORE_ERROR("Failed to write full data to file '{}'", location.c_str()); - return; - } - - file.flush(); - } - -} // namespace Deer \ No newline at end of file