From 304bf35c08fb76dbb233cc335d0a16cfd5a2c836 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Thu, 2 Feb 2023 18:30:36 +0100 Subject: [PATCH] Core/AppFilesystemComponent: Add Open method --- .../Nazara/Core/AppFilesystemComponent.hpp | 4 ++ .../Nazara/Core/AppFilesystemComponent.inl | 59 +++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/include/Nazara/Core/AppFilesystemComponent.hpp b/include/Nazara/Core/AppFilesystemComponent.hpp index 89bb3ae81..dbffb7c86 100644 --- a/include/Nazara/Core/AppFilesystemComponent.hpp +++ b/include/Nazara/Core/AppFilesystemComponent.hpp @@ -43,6 +43,9 @@ namespace Nz inline const VirtualDirectoryPtr& Mount(std::string_view name, std::filesystem::path filepath); inline const VirtualDirectoryPtr& Mount(std::string_view name, VirtualDirectoryPtr directory); + template std::shared_ptr Open(std::string_view assetPath); + template std::shared_ptr Open(std::string_view assetPath, typename T::Params params); + template void SetDefaultResourceParameters(typename T::Params params); AppFilesystemComponent& operator=(const AppFilesystemComponent&) = delete; @@ -52,6 +55,7 @@ namespace Nz private: template std::shared_ptr LoadImpl(std::string_view assetPath, const typename T::Params& params); + template std::shared_ptr OpenImpl(std::string_view assetPath, const typename T::Params& params); std::vector> m_defaultParameters; VirtualDirectoryPtr m_rootDirectory; diff --git a/include/Nazara/Core/AppFilesystemComponent.inl b/include/Nazara/Core/AppFilesystemComponent.inl index 833e2d168..ae310025d 100644 --- a/include/Nazara/Core/AppFilesystemComponent.inl +++ b/include/Nazara/Core/AppFilesystemComponent.inl @@ -72,6 +72,24 @@ namespace Nz return m_rootDirectory->StoreDirectory(name, std::move(directory)).directory; } + template + std::shared_ptr AppFilesystemComponent::Open(std::string_view assetPath) + { + return Open(assetPath, typename T::Params{}); + } + + template + std::shared_ptr AppFilesystemComponent::Open(std::string_view assetPath, typename T::Params params) + { + if constexpr (Detail::ResourceParameterHasMerge::value) + { + if (const auto* defaultParams = GetDefaultResourceParameters()) + params.Merge(*defaultParams); + } + + return OpenImpl(assetPath, params); + } + template void AppFilesystemComponent::SetDefaultResourceParameters(typename T::Params params) { @@ -154,6 +172,47 @@ namespace Nz m_rootDirectory->GetEntry(assetPath, callback); return resource; } + + template + std::shared_ptr AppFilesystemComponent::OpenImpl(std::string_view assetPath, const typename T::Params& params) + { + std::shared_ptr resource; + if (!m_rootDirectory) + return resource; + + auto callback = [&](const VirtualDirectory::Entry& entry) + { + return std::visit([&](auto&& arg) + { + using Param = std::decay_t; + if constexpr (std::is_base_of_v) + { + NazaraError(std::string(assetPath) + " is a directory"); + return false; + } + else if constexpr (std::is_same_v) + { + resource = T::OpenFromMemory(arg.data, arg.size, params); + return true; + } + else if constexpr (std::is_same_v) + { + resource = T::OpenFromMemory(&arg.data[0], arg.data.size(), params); + return true; + } + else if constexpr (std::is_same_v) + { + resource = T::OpenFromFile(arg.filePath, params); + return true; + } + else + static_assert(AlwaysFalse(), "unhandled case"); + }, entry); + }; + + m_rootDirectory->GetEntry(assetPath, callback); + return resource; + } } #include