Resolve ID
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +85,8 @@ namespace Nuake
|
||||
static Timestep timeStep;
|
||||
static float timeScale;
|
||||
|
||||
private:
|
||||
static void GenerateManifest();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user