From 81bf61221b3a0af1728065c9a90011ff772daf1c Mon Sep 17 00:00:00 2001 From: antopilo Date: Sat, 25 Jan 2025 17:10:20 -0500 Subject: [PATCH] Better asset baking + manifest scaning on project load --- Nuake/Engine.cpp | 6 +- Nuake/src/FileSystem/FileSystem.cpp | 4 +- Nuake/src/Resource/Bakers/GLTFBaker.cpp | 91 +++++++++++-------- Nuake/src/Resource/Serializable.h | 2 + .../Resource/Serializer/BinarySerializer.h | 2 +- 5 files changed, 61 insertions(+), 44 deletions(-) diff --git a/Nuake/Engine.cpp b/Nuake/Engine.cpp index 6bb83d44..29be51c1 100644 --- a/Nuake/Engine.cpp +++ b/Nuake/Engine.cpp @@ -384,8 +384,7 @@ namespace Nuake // TODO(antopilo) only generate manifest in editor context FileSystem::SetRootDirectory(FileSystem::GetParentPath(project->FullPath)); - - GenerateManifest(project); + GenerateManifest(); if (!Engine::SetCurrentScene(currentProject->DefaultScene)) { @@ -405,6 +404,7 @@ namespace Nuake void Engine::GenerateManifest() { + Logger::Log("Generating project manifest", "manifest", VERBOSE); // This will auto generate a manifest entry for all assets in the project ResourceManifest& manifest = ResourceManager::Manifest; ResourceResolverManager& resolverManager = ResourceResolverManager::Get(); @@ -415,6 +415,8 @@ namespace Nuake return; // We don't care about this file type, we dont support it. } + Logger::Log("Adding " + file->GetName() + " to manifest", "manifest", VERBOSE); + // Register the resource in the manifest const std::string& path = file->GetRelativePath(); const UUID uuid = resolverManager.ResolveUUID(file); diff --git a/Nuake/src/FileSystem/FileSystem.cpp b/Nuake/src/FileSystem/FileSystem.cpp index 1e63c947..02025c88 100644 --- a/Nuake/src/FileSystem/FileSystem.cpp +++ b/Nuake/src/FileSystem/FileSystem.cpp @@ -25,12 +25,12 @@ void FileSystem::ForeachFile(OnFileFunc func) void FileSystem::ForeachFile(OnFileFunc func, Ref dir) { - for(auto& file : RootDirectory->Files) + for(auto& file : dir->Files) { func(file); } - for(auto& dir : RootDirectory->Directories) + for(auto& dir : dir->Directories) { ForeachFile(func, dir); } diff --git a/Nuake/src/Resource/Bakers/GLTFBaker.cpp b/Nuake/src/Resource/Bakers/GLTFBaker.cpp index b82a4710..c361102e 100644 --- a/Nuake/src/Resource/Bakers/GLTFBaker.cpp +++ b/Nuake/src/Resource/Bakers/GLTFBaker.cpp @@ -2,7 +2,7 @@ #include "src/Core/Logger.h" #include "src/Core/String.h" - +#include "src/FileSystem/Directory.h" #include "src/Rendering/Textures/Material.h" #include "src/Rendering/Mesh/Mesh.h" #include "src/Resource/Model.h" @@ -46,9 +46,10 @@ Ref GLTFBaker::Bake(const Ref& file) importer.FreeScene(); - // Write those meshes to disk! + // Write to disk std::vector meshes; + std::map> materialCache; Ref model = CreateRef(); for(auto& meshData : meshesData) { @@ -56,46 +57,58 @@ Ref GLTFBaker::Bake(const Ref& file) mesh->SetData(meshData.vertices, meshData.indices); const BakerMaterialData materialData = meshData.material; - Ref material = CreateRef(); - - if(!materialData.albedo.empty()) - { - material->SetAlbedo(absolutePath + "/../" + materialData.albedo); - } - - if(!materialData.normal.empty()) - { - material->SetNormal(absolutePath + "/../" + materialData.normal); - } - - if(!materialData.ao.empty()) - { - material->SetAO(absolutePath + "/../" + materialData.ao); - } - - if(!materialData.metallic.empty()) - { - material->SetMetalness(absolutePath + "/../" + materialData.metallic); - } - - if(!materialData.roughness.empty()) - { - material->SetRoughness(absolutePath + "/../" + materialData.roughness); - } - + std::string materialPath; - if(!materialData.albedo.empty()) + Ref material; + if (!materialData.albedo.empty()) { - materialPath = file->GetRelativePath() + "." + materialData.albedo + ".material"; + materialPath = FileSystem::GetParentPath(file->GetRelativePath()) + FileSystem::GetFileNameFromPath(materialData.albedo) + ".material"; } - ResourceManager::RegisterResource(material); - ResourceManager::Manifest.RegisterResource(material->ID, materialPath); - - std::string materialJson = material->Serialize().dump(4); - FileSystem::BeginWriteFile(materialPath); - FileSystem::WriteLine(materialJson); - FileSystem::EndWriteFile(); - + + if (materialCache.find(materialPath) != materialCache.end()) + { + material = materialCache[materialPath]; + } + else + { + material = CreateRef(); + if (!materialData.albedo.empty()) + { + material->SetAlbedo(absolutePath + "/../" + materialData.albedo); + } + + if (!materialData.normal.empty()) + { + material->SetNormal(absolutePath + "/../" + materialData.normal); + } + + if (!materialData.ao.empty()) + { + material->SetAO(absolutePath + "/../" + materialData.ao); + } + + if (!materialData.metallic.empty()) + { + material->SetMetalness(absolutePath + "/../" + materialData.metallic); + } + + if (!materialData.roughness.empty()) + { + material->SetRoughness(absolutePath + "/../" + materialData.roughness); + } + + + ResourceManager::RegisterResource(material); + ResourceManager::Manifest.RegisterResource(material->ID, materialPath); + + std::string materialJson = material->Serialize().dump(4); + FileSystem::BeginWriteFile(materialPath); + FileSystem::WriteLine(materialJson); + FileSystem::EndWriteFile(); + + materialCache[materialPath] = material; + } + mesh->MaterialResource = RID(material->ID); model->AddMesh(std::move(mesh)); } diff --git a/Nuake/src/Resource/Serializable.h b/Nuake/src/Resource/Serializable.h index 2f767dce..45b852ff 100644 --- a/Nuake/src/Resource/Serializable.h +++ b/Nuake/src/Resource/Serializable.h @@ -3,6 +3,7 @@ #include #include "src/Core/Core.h" +#include "src/Resource/UUID.h" using json = nlohmann::json; @@ -103,6 +104,7 @@ namespace Nuake class ISerializer { public: + virtual UUID DeserializeUUID(const std::string& file) = 0; virtual Ref DeserializeMaterial(const std::string& path) = 0; virtual bool SerializeMaterial(const std::string& path, Ref material) = 0; diff --git a/Nuake/src/Resource/Serializer/BinarySerializer.h b/Nuake/src/Resource/Serializer/BinarySerializer.h index b8161a78..65357c75 100644 --- a/Nuake/src/Resource/Serializer/BinarySerializer.h +++ b/Nuake/src/Resource/Serializer/BinarySerializer.h @@ -15,7 +15,7 @@ namespace Nuake ~BinarySerializer() = default; public: - UUID DeserializeUUID(const std::string& path); + UUID DeserializeUUID(const std::string& path) override; Ref DeserializeMaterial(const std::string& path) override; bool SerializeMaterial(const std::string& path, Ref material) override;