diff --git a/include/Nazara/Core/Asset.hpp b/include/Nazara/Core/Asset.hpp new file mode 100644 index 000000000..da34ff3fc --- /dev/null +++ b/include/Nazara/Core/Asset.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include + +namespace Nz +{ + template + class Asset final + { + public: + const std::shared_ptr& Get() const { return m_resource; } + explicit operator bool() const noexcept { return !!m_resource; } + + protected: + AssetDescriptor m_descriptor; + std::shared_ptr m_resource; + + friend class AssetCatalog; + }; +} diff --git a/include/Nazara/Core/Asset.inl b/include/Nazara/Core/Asset.inl new file mode 100644 index 000000000..e69de29bb diff --git a/include/Nazara/Core/AssetCatalog.hpp b/include/Nazara/Core/AssetCatalog.hpp new file mode 100644 index 000000000..6b595d390 --- /dev/null +++ b/include/Nazara/Core/AssetCatalog.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include +#include + +namespace Nz +{ + class NAZARA_CORE_API AssetCatalog + { + public: + template + static Asset LoadFromFile(const std::filesystem::path& path); + }; +} + +#include diff --git a/include/Nazara/Core/AssetCatalog.inl b/include/Nazara/Core/AssetCatalog.inl new file mode 100644 index 000000000..eb42851f6 --- /dev/null +++ b/include/Nazara/Core/AssetCatalog.inl @@ -0,0 +1,31 @@ +#include +#include +#include + +namespace Nz +{ + template + Asset AssetCatalog::LoadFromFile(const std::filesystem::path& path) + { + Asset asset; + + JsonSerializationContext json; + if (!json.Load(path)) + return {}; + + if (!Unserialize(json, "", &asset.m_descriptor)) + return {}; + + FilesystemAppComponent* fs = ApplicationBase::Instance()->TryGetComponent(); + if (fs) // first try using a FileSystem component to load the asset + { + std::string filepath = asset.m_descriptor.path.string(); + asset.m_resource = fs->Load(std::string_view(filepath), asset.m_descriptor.parameters); + } + + if (!asset) // if it fails, use the default loader + asset.m_resource = TResource::LoadFromFile(asset.m_descriptor.path, asset.m_descriptor.parameters); + + return asset; + } +} diff --git a/include/Nazara/Core/AssetDescriptor.hpp b/include/Nazara/Core/AssetDescriptor.hpp new file mode 100644 index 000000000..02246fda2 --- /dev/null +++ b/include/Nazara/Core/AssetDescriptor.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +namespace Nz +{ + template + struct AssetDescriptor + { + constexpr static std::string_view Type = TypeName(); + + int version; + std::string type; + std::string name; + std::filesystem::path path; + TResource::Params parameters; + }; + + template bool Serialize(SerializationContext& context, const AssetDescriptor& descriptor, TypeTag>); + template bool Unserialize(SerializationContext& context, AssetDescriptor* descriptor, TypeTag>); +} + +#include diff --git a/include/Nazara/Core/AssetDescriptor.inl b/include/Nazara/Core/AssetDescriptor.inl new file mode 100644 index 000000000..1784e97e7 --- /dev/null +++ b/include/Nazara/Core/AssetDescriptor.inl @@ -0,0 +1,37 @@ +namespace Nz +{ + template + bool Serialize(SerializationContext& context, const AssetDescriptor& descriptor, TypeTag>) + { + Serialize(context, "version", descriptor.version); + Serialize(context, "type", descriptor.type); + Serialize(context, "name", descriptor.name); + Serialize(context, "path", descriptor.path); + Serialize(context, "parameters", descriptor.parameters); + return true; + } + + template + bool Unserialize(SerializationContext& context, AssetDescriptor* descriptor, TypeTag>) + { + if (!Unserialize(context, "version", &descriptor->version)) + return false; + + if (!Unserialize(context, "type", &descriptor->type)) + return false; + + if (AssetDescriptor::Type != descriptor->type) + return false; + + if (!Unserialize(context, "name", &descriptor->name)) + return false; + + if (!Unserialize(context, "path", &descriptor->path)) + return false; + + if (!Unserialize(context, "parameters", &descriptor->parameters)) + return false; + + return true; + } +}