Resolve ID

This commit is contained in:
Antoine Pilote
2025-01-23 16:13:45 -05:00
parent ec9cbcf18b
commit 8831407da0
11 changed files with 107 additions and 11 deletions

View File

@@ -21,6 +21,8 @@
#include <imgui/imgui_impl_opengl3.h>
#include <Tracy.hpp>
#include <functional>
#ifdef NK_VK
#include "src/Rendering/Vulkan/VulkanRenderer.h"
#endif
@@ -371,12 +373,17 @@ namespace Nuake
{
currentProject = project;
// TODO(antopilo) only generate manifest in editor context
FileSystem::SetRootDirectory(FileSystem::GetParentPath(project->FullPath));
GenerateManifest(project);
if (!Engine::SetCurrentScene(currentProject->DefaultScene))
{
return false;
}
FileSystem::SetRootDirectory(FileSystem::GetParentPath(project->FullPath));
ScriptingEngineNet::Get().Initialize();
ScriptingEngineNet::Get().LoadProjectAssembly(project);
@@ -387,4 +394,25 @@ namespace Nuake
{
return currentWindow;
}
void Engine::GenerateManifest()
{
// This will auto generate a manifest entry for all assets in the project
ResourceManifest& manifest = ResourceManager::Manifest;
ResourceResolverManager& resolverManager = ResourceResolverManager::Get();
OnFileFunc onFileScanFunc = [&resolverManager, &manifest](Ref<File> file)
{
if (!resolverManager.IsFileTypeResolvable(file->GetExtension()))
{
return; // We don't care about this file type, we dont support it.
}
// Register the resource in the manifest
const std::string& path = file->GetRelativePath();
const UUID uuid = resolverManager.ResolveUUID(file);
manifest.RegisterResource(uuid, path);
};
FileSystem::ForeachFile(onFileScanFunc);
}
}

View File

@@ -85,6 +85,8 @@ namespace Nuake
static Timestep timeStep;
static float timeScale;
private:
static void GenerateManifest();
};
}

View File

@@ -18,12 +18,12 @@ std::string FileSystem::Root = "";
Ref<Directory> FileSystem::RootDirectory;
Ref<filewatch::FileWatch<std::string>> FileSystem::RootFileWatch;
void FileSystem::ForeachFile(std::function<void(Ref<File>)> func)
void FileSystem::ForeachFile(OnFileFunc func)
{
ForeachFile(func, RootDirectory);
}
void FileSystem::ForeachFile(std::function<void(Ref<File>)> func, Ref<Directory> dir)
void FileSystem::ForeachFile(OnFileFunc func, Ref<Directory> dir)
{
for(auto& file : RootDirectory->Files)
{

View File

@@ -15,6 +15,8 @@ namespace Nuake
class Directory;
class File;
using OnFileFunc = std::function<void(Ref<File>)>;
class FileSystem
{
public:
@@ -25,10 +27,10 @@ namespace Nuake
static void SetRootDirectory(const std::string path);
// Starts from root
static void ForeachFile(std::function<void(Ref<File>)> func);
static void ForeachFile(OnFileFunc func);
// Strats from specified folder
static void ForeachFile(std::function<void(Ref<File>)> func, Ref<Directory> dir);
static void ForeachFile(OnFileFunc func, Ref<Directory> dir);
static void Scan();
static std::string AbsoluteToRelative(const std::string& path);

View File

@@ -20,6 +20,7 @@ namespace Nuake
virtual ~IResourceResolver() = default;
// Converts a file to a resource UUID
virtual UUID ResolveUUID(const Ref<File>& file) = 0;
virtual Ref<Resource> Resolve(const Ref<File>& file) = 0;
std::string GetExtension() const { return Extension; }

View File

@@ -8,12 +8,30 @@
using namespace Nuake;
UUID MeshResolver::ResolveUUID(const Ref<File>& file)
{
BinarySerializer deserializer = BinarySerializer();
return deserializer.DeserializeUUID(file->GetRelativePath());
}
Ref<Resource> MeshResolver::Resolve(const Ref<File>& file)
{
BinarySerializer deserializer = BinarySerializer();
return deserializer.DeserializeModel(file->GetRelativePath());
}
UUID MaterialResolver::ResolveUUID(const Ref<File>& file)
{
std::string fileContent = FileSystem::ReadFile(file->GetRelativePath());
json jsonData = json::parse(fileContent);
if (jsonData.contains("UUID"))
{
return static_cast<uint64_t>(jsonData["UUID"]);
}
return UUID();
}
Ref<Resource> MaterialResolver::Resolve(const Ref<File>& file)
{
// Read json content

View File

@@ -9,6 +9,7 @@ namespace Nuake
{
public:
MeshResolver() : IResourceResolver(".nkmesh") {}
UUID ResolveUUID(const Ref<File>& file) override;
Ref<Resource> Resolve(const Ref<File>& file) override;
};
@@ -16,6 +17,7 @@ namespace Nuake
{
public:
MaterialResolver() : IResourceResolver(".material") {}
UUID ResolveUUID(const Ref<File>& file) override;
Ref<Resource> Resolve(const Ref<File>& file) override;
};
}

View File

@@ -27,16 +27,45 @@ namespace Nuake
Resolvers[resolver->GetExtension()] = resolver;
}
Ref<Resource> Resolve(const Ref<File> file)
bool IsFileTypeResolvable(const std::string& extension)
{
std::string extension = file->GetExtension();
if (Resolvers.find(extension) != Resolvers.end())
return Resolvers.find(extension) != Resolvers.end();
}
Ref<IResourceResolver> GetResolverForFile(const Ref<File>& file)
{
const std::string extension = file->GetExtension();
if (IsFileTypeResolvable(extension))
{
return Resolvers[extension]->Resolve(file);
return Resolvers[extension];
}
Logger::Log("Failed to find resolver for file type: " + extension, "resolver", CRITICAL);
return nullptr;
}
// This will only read the UUID of a resource file
UUID ResolveUUID(const Ref<File> file)
{
Ref<IResourceResolver> resolver = GetResolverForFile(file);
if (resolver)
{
return resolver->ResolveUUID(file);
}
return UUID(0);
}
Ref<Resource> Resolve(const Ref<File> file)
{
Ref<IResourceResolver> resolver = GetResolverForFile(file);
if (resolver)
{
return resolver->Resolve(file);
}
Logger::Log("Failed to resolve file: " + file->GetRelativePath(), "resolver", CRITICAL);
return nullptr;
}
};
}

View File

@@ -77,6 +77,19 @@ public:
}
};
UUID BinarySerializer::DeserializeUUID(const std::string& path)
{
BinaryReader reader = BinaryReader(FileSystem::RelativeToAbsolute(path));
if (!reader.IsOpen())
{
return UUID(0);
}
uint64_t rid;
reader.Read<uint64_t>(&rid);
return rid;
}
Ref<Material> BinarySerializer::DeserializeMaterial(const std::string& path)
{
BinaryReader reader = BinaryReader(path);

View File

@@ -15,6 +15,8 @@ namespace Nuake
~BinarySerializer() = default;
public:
UUID DeserializeUUID(const std::string& path);
Ref<Material> DeserializeMaterial(const std::string& path) override;
bool SerializeMaterial(const std::string& path, Ref<Material> material) override;

View File

@@ -57,8 +57,7 @@ namespace Nuake {
if (scriptingEngine.HasEntityScriptInstance(entity))
{
auto instance = scriptingEngine.GetEntityScript(entity);
outInstance->m_Handle = instance->m_Handle;
outInstance->m_Type = instance->m_Type;
*outInstance= *instance;
}
}