- TEST_SPEC.md: Updated test directory structure to reflect Core/Asset, Core/IO, and Resources/<Type> subdirectories - TEST_SPEC.md: Updated module names and test counts (852 total) - TEST_SPEC.md: Updated build commands for new Resources subdirectories - README.md: Updated engine structure with Core/Asset/ and Core/IO/ - README.md: Updated Resources section with layered architecture - README.md: Updated test coverage table with accurate counts
76 lines
2.6 KiB
C++
76 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include <XCEngine/Core/Asset/ResourceTypes.h>
|
|
#include <XCEngine/Core/Containers/String.h>
|
|
#include <XCEngine/Core/Containers/Array.h>
|
|
#include <XCEngine/Core/Containers/HashMap.h>
|
|
#include <XCEngine/Core/SmartPtr.h>
|
|
#include <XCEngine/Threading/Mutex.h>
|
|
|
|
namespace XCEngine {
|
|
namespace Resources {
|
|
|
|
class IArchive {
|
|
public:
|
|
virtual ~IArchive() = default;
|
|
|
|
virtual bool Open(const Containers::String& path) = 0;
|
|
virtual void Close() = 0;
|
|
|
|
virtual bool Read(const Containers::String& fileName, void* buffer, size_t size, size_t offset) const = 0;
|
|
virtual size_t GetSize(const Containers::String& fileName) const = 0;
|
|
virtual bool Exists(const Containers::String& fileName) const = 0;
|
|
virtual void Enumerate(const Containers::String& pattern, Containers::Array<Containers::String>& outFiles) const = 0;
|
|
|
|
virtual bool IsValid() const = 0;
|
|
};
|
|
|
|
struct ResourceInfo {
|
|
Containers::String path;
|
|
size_t size = 0;
|
|
Core::uint64 modifiedTime = 0;
|
|
bool inArchive = false;
|
|
Containers::String archivePath;
|
|
};
|
|
|
|
class ResourceFileSystem {
|
|
public:
|
|
ResourceFileSystem();
|
|
~ResourceFileSystem();
|
|
|
|
void Initialize(const Containers::String& rootPath);
|
|
void Shutdown();
|
|
|
|
bool AddArchive(const Containers::String& archivePath);
|
|
bool AddDirectory(const Containers::String& directoryPath);
|
|
|
|
void RemoveArchive(const Containers::String& archivePath);
|
|
|
|
bool FindResource(const Containers::String& relativePath, Containers::String& outAbsolutePath) const;
|
|
|
|
Containers::Array<Core::uint8> ReadResource(const Containers::String& relativePath) const;
|
|
|
|
bool Exists(const Containers::String& relativePath) const;
|
|
|
|
bool GetResourceInfo(const Containers::String& relativePath, ResourceInfo& outInfo) const;
|
|
|
|
void EnumerateResources(const Containers::String& pattern, Containers::Array<ResourceInfo>& outResources) const;
|
|
|
|
static ResourceFileSystem& Get();
|
|
|
|
private:
|
|
IArchive* FindArchive(const Containers::String& relativePath) const;
|
|
bool FindInDirectories(const Containers::String& relativePath, Containers::String& outAbsolutePath) const;
|
|
bool FindInArchives(const Containers::String& relativePath, Containers::String& outArchivePath) const;
|
|
|
|
Containers::String m_rootPath;
|
|
Containers::Array<Core::UniqueRef<IArchive>> m_archives;
|
|
Containers::Array<Containers::String> m_directories;
|
|
|
|
mutable Containers::HashMap<Containers::String, ResourceInfo> m_infoCache;
|
|
mutable Threading::Mutex m_mutex;
|
|
};
|
|
|
|
} // namespace Resources
|
|
} // namespace XCEngine
|