// Copyright (C) 2023 Jérôme "Lynix" 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 namespace Nz { template std::shared_ptr AppFilesystemComponent::GetOrLoad(std::string_view assetPath, Args&&... args) { std::shared_ptr resource; for (const VirtualDirectoryPtr& virtualDir : m_virtualDirectories) { 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::LoadFromMemory(arg.data, arg.size, std::forward(args)...); return true; } else if constexpr (std::is_same_v) { resource = T::LoadFromMemory(&arg.data[0], arg.data.size(), std::forward(args)...); return true; } else if constexpr (std::is_same_v) { resource = T::LoadFromFile(arg.filePath, std::forward(args)...); return true; } else static_assert(AlwaysFalse(), "unhandled case"); }, entry); }; if (virtualDir->GetEntry(assetPath, callback) && resource) return resource; } return resource; } inline const VirtualDirectoryPtr& AppFilesystemComponent::RegisterPath(std::filesystem::path filepath) { return RegisterVirtualDirectory(std::make_shared(std::move(filepath))); } inline const VirtualDirectoryPtr& AppFilesystemComponent::RegisterVirtualDirectory(VirtualDirectoryPtr directory) { return m_virtualDirectories.emplace_back(std::move(directory)); } inline void AppFilesystemComponent::UnregisterVirtualDirectory(const VirtualDirectoryPtr& directory) { auto it = std::find(m_virtualDirectories.begin(), m_virtualDirectories.end(), directory); if (it == m_virtualDirectories.end()) m_virtualDirectories.erase(it); } } #include