// Copyright (C) 2024 Jérôme "SirLynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include #include #include #include namespace Nz { namespace Detail { template struct ResourceParameterHasMerge : std::false_type {}; template struct ResourceParameterHasMerge().Merge(std::declval()))>> : std::true_type {}; } inline FilesystemAppComponent::FilesystemAppComponent(ApplicationBase& app) : ApplicationComponent(app) { } template const typename T::Params* FilesystemAppComponent::GetDefaultResourceParameters() const { constexpr UInt64 typeHash = FNV1a64(TypeName()); auto it = m_defaultParameters.find(typeHash); if (it == m_defaultParameters.end()) return nullptr; return static_cast(it->second.get()); } VirtualDirectoryPtr FilesystemAppComponent::GetDirectory(std::string_view assetPath) { VirtualDirectoryPtr dir; m_rootDirectory->GetDirectoryEntry(assetPath, [&](const Nz::VirtualDirectory::DirectoryEntry& dirEntry) { dir = dirEntry.directory; }); return dir; } template std::shared_ptr FilesystemAppComponent::Load(std::string_view assetPath, ExtraArgs&&... args) { return Load(assetPath, typename T::Params{}, std::forward(args)...); } template std::shared_ptr FilesystemAppComponent::Load(std::string_view assetPath, typename T::Params params, ExtraArgs&&... args) { if constexpr (Detail::ResourceParameterHasMerge::value) { if (const auto* defaultParams = GetDefaultResourceParameters()) params.Merge(*defaultParams); } return LoadImpl(assetPath, params, std::forward(args)...); } template std::shared_ptr FilesystemAppComponent::Open(std::string_view assetPath, ExtraArgs&&... args) { return Open(assetPath, typename T::Params{}, std::forward(args)...); } template std::shared_ptr FilesystemAppComponent::Open(std::string_view assetPath, typename T::Params params, ExtraArgs&&... args) { if constexpr (Detail::ResourceParameterHasMerge::value) { if (const auto* defaultParams = GetDefaultResourceParameters()) params.Merge(*defaultParams); } return OpenImpl(assetPath, params, std::forward(args)...); } template void FilesystemAppComponent::SetDefaultResourceParameters(typename T::Params params) { constexpr UInt64 typeHash = FNV1a64(TypeName()); m_defaultParameters[typeHash] = std::make_unique(std::move(params)); } template std::shared_ptr FilesystemAppComponent::LoadImpl(std::string_view assetPath, const typename T::Params& params, ExtraArgs&&... args) { 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) { NazaraErrorFmt("{} is a directory", assetPath); return false; } else if constexpr (std::is_same_v) { resource = T::LoadFromStream(*arg.stream, params, std::forward(args)...); return true; } else static_assert(AlwaysFalse(), "unhandled case"); }, entry); }; m_rootDirectory->GetEntry(assetPath, callback); return resource; } template std::shared_ptr FilesystemAppComponent::OpenImpl(std::string_view assetPath, const typename T::Params& params, ExtraArgs&&... args) { 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) { NazaraErrorFmt("{} is a directory", assetPath); return false; } else if constexpr (std::is_same_v) { // If stream has an associated filesystem path, use OpenFromFile instead to make sure the File stream is kept alive // (a temporary FileEntry may be created when resolving a filesystem folder) if (std::filesystem::path filePath = arg.stream->GetPath(); !filePath.empty()) resource = T::OpenFromFile(filePath, params, std::forward(args)...); else resource = T::OpenFromStream(*arg.stream, params, std::forward(args)...); return true; } else static_assert(AlwaysFalse(), "unhandled case"); }, entry); }; m_rootDirectory->GetEntry(assetPath, callback); return resource; } } #include