VEX Engine
Retro looking game engine made in vulkan mostly because i wanted to understand it better.
Loading...
Searching...
No Matches
VirtualFileSystem.hpp
Go to the documentation of this file.
1
6
8
9#pragma once
10
11#include <string>
12#include <vector>
13#include <memory>
14#include <unordered_map>
15#include <fstream>
16#include <filesystem>
17#include <iostream>
18#include <cstring>
19#include <mutex>
20
21namespace fs = std::filesystem;
22
23namespace vex {
24
27public:
29 struct FileData {
31 std::vector<uint8_t> data;
33 size_t size;
34 };
35
39
46 bool initialize(const std::string& base_path);
47
54 std::unique_ptr<FileData> load_file(const std::string& virtual_path);
55
62 std::unique_ptr<std::istream> open_file_stream(const std::string& virtual_path);
63
70 bool file_exists(const std::string& virtual_path);
71
76 size_t get_file_size(const std::string& virtual_path);
77
84 std::vector<std::string> list_files(const std::string& virtual_dir = "");
85
91 std::string resolve_relative_path(const std::string& base_path, const std::string& relative_path);
92
95 std::string get_base_path() const { return m_base_path; }
96
98 static void SetVpakKey(const std::string& key);
99
101 static std::string GetVpakKey();
102
103private:
104 static std::string s_vpak_key;
106 struct VPKHeader {
107 char magic[4];
108 uint32_t version;
109 uint32_t file_count;
110 uint32_t names_offset;
111 uint32_t data_offset;
112 uint32_t solid_compressed_size;
113 uint32_t solid_uncompressed_size;
114 };
115
118 uint32_t name_offset;
119 uint32_t data_offset;
120 uint32_t uncompressed_size;
121 };
122
124 struct LoadedVPK {
125 VPKHeader header;
126 std::vector<VPKFileEntry> entries;
127 std::vector<std::string> file_names;
128 std::vector<uint8_t> solid_data;
129 std::ifstream file_stream;
130 std::string file_path;
131 };
132
134 class VPKStream : public std::istream {
135 private:
136 class VPKStreamBuf : public std::streambuf {
137 private:
138 std::vector<char> buffer;
139
140 public:
142 VPKStreamBuf(const char* data, size_t size) {
143 buffer.resize(size);
144 std::memcpy(buffer.data(), data, size);
145 setg(buffer.data(), buffer.data(), buffer.data() + size);
146 }
147 };
148
149 VPKStreamBuf buf;
150
151 public:
153 VPKStream(const char* data, size_t size)
154 : std::istream(&buf), buf(data, size) {}
155 };
156
157 std::unique_ptr<LoadedVPK> m_loaded_vpk;
158 std::string m_base_path;
159 bool m_use_packed_assets;
160
161 std::mutex stream_mutex;
162
166 bool load_vpk_file(const std::string& vpk_path);
167
169 std::string clean_path(const std::string& path);
170
172 const VPKFileEntry* find_file_entry(const std::string& virtual_path);
173};
174
175}
VPKStreamBuf(const char *data, size_t size)
Method to initialize the buffer with data.
VPKStream(const char *data, size_t size)
Constructor to initialize the buffer with data.
std::vector< std::string > list_files(const std::string &virtual_dir="")
Lists all files contained within a specific directory.
std::string get_base_path() const
Gets the base path of the virtual file system.
std::unique_ptr< FileData > load_file(const std::string &virtual_path)
Loads a file into memory from the specified path.
VirtualFileSystem()
Constructor for VirtualFileSystem.
std::string clean_path(const std::string &path)
cleans path from unwanted string eg "Assets/"
size_t get_file_size(const std::string &virtual_path)
Gets the size of a file in bytes.
std::string resolve_relative_path(const std::string &base_path, const std::string &relative_path)
Resolves a relative path to a normalized, cleaner format.
const VPKFileEntry * find_file_entry(const std::string &virtual_path)
Method to find a file entry by its virtual path.
std::unique_ptr< std::istream > open_file_stream(const std::string &virtual_path)
Opens a file stream for reading from a specified path.
bool initialize(const std::string &base_path)
Initializes the virtual file system.
bool load_vpk_file(const std::string &vpk_path)
Method to load a VPK file.
static std::string GetVpakKey()
Gets the current VPAK decryption key.
static void SetVpakKey(const std::string &key)
Sets the VPAK decryption key.
bool file_exists(const std::string &virtual_path)
Checks if a file exists in the currently active file system mode.
Simple struct needed to represent loaded file with data and size.
std::vector< uint8_t > data
raw file data
size_t size
size of the file data in bytes.
struct holding data of loaded vpk file.
struct defining virtual file "header", used to identify files in the virtual file system.
struct defining vpak file header data, used to validate file integrity.