81 using VobTree = std::vector<std::shared_ptr<zenkit::VirtualObject>>;
83 static Tempest::Device&
device() {
return inst->dev; }
85 static void mountWork(
const std::filesystem::path& path);
86 static void loadVdfs(
const std::vector<std::u16string> &modvdfs,
bool modFilter);
98 static Tempest::Texture2d
loadTextureUncached(std::string_view name,
bool forceMips =
false);
99 static const Tempest::Texture2d*
loadTexture(std::string_view name,
bool forceMips =
false);
100 static const Tempest::Texture2d*
loadTexture(Tempest::Color color);
101 static const Tempest::Texture2d*
loadTexture(std::string_view name, int32_t v, int32_t c);
102 static Tempest::Texture2d
loadTexturePm(
const Tempest::Pixmap& pm);
103 static auto loadTextureAnim(std::string_view name) -> std::vector<const Tempest::Texture2d*>;
120 static Tempest::VertexBuffer<V>
vbo(
const V* data,
size_t sz){
return inst->dev.vbo(data,sz); }
123 static Tempest::IndexBuffer<I>
ibo(
const I* data,
size_t sz){
return inst->dev.ibo(data,sz); }
125 static Tempest::StorageBuffer
ssbo(
const void* data,
size_t size) {
return inst->dev.ssbo(data,size); }
126 static Tempest::StorageBuffer
ssbo(Tempest::Uninitialized_t,
size_t size) {
return inst->dev.ssbo(Tempest::Uninitialized,size); }
128 template<
class V,
class I>
129 static Tempest::AccelerationStructure
130 blas(
const Tempest::VertexBuffer<V>& b,
131 const Tempest::IndexBuffer<I>& i,
132 size_t offset,
size_t size){
133 if(!inst->dev.properties().raytracing.rayQuery)
134 return Tempest::AccelerationStructure();
135 return inst->dev.blas(b,i,offset,size);
139 static void recycle(Tempest::DescriptorArray&& arr);
140 static void recycle(Tempest::StorageBuffer&&
ssbo);
141 static void recycle(Tempest::StorageImage&& img);
142 static void recycle(Tempest::Attachment&& img);
143 static void recycle(Tempest::ZBuffer&& img);
144 static void recycle(Tempest::AccelerationStructure&& rtas);
146 static std::vector<uint8_t>
getFileData(std::string_view name);
147 static bool getFileData(std::string_view name, std::vector<uint8_t>& dat);
148 static std::unique_ptr<zenkit::Read>
getFileBuffer(std::string_view name);
149 static auto openReader(std::string_view name, std::unique_ptr<zenkit::Read>& read) -> std::unique_ptr<zenkit::ReadArchive>;
150 static bool hasFile (std::string_view fname);
154 static const Tempest::IndexBuffer<uint16_t>&
cubeIbo();
170 bool decal2Sided =
false;
171 bool operator == (
const DecalK& other)
const {
172 return mat ==other.mat &&
175 decal2Sided==other.decal2Sided;
179 using TextureCache = std::unordered_map<std::string,std::unique_ptr<Tempest::Texture2d>>;
181 int64_t vdfTimestamp(
const std::u16string& name);
182 void detectVdf(std::vector<Archive>& ret,
const std::u16string& root);
184 Tempest::Texture2d* implLoadTexture(std::string_view cname,
bool forceMips);
185 Tempest::Texture2d implLoadTextureUncached(std::string_view name,
bool forceMips);
186 Tempest::Texture2d implLoadTextureUncached(std::string_view name, zenkit::Read& data,
bool forceMips);
187 ProtoMesh* implLoadMesh(std::string_view name);
188 std::unique_ptr<ProtoMesh> implLoadMeshMain(std::string name);
189 std::unique_ptr<Animation> implLoadAnimation(std::string name);
190 ProtoMesh* implDecalMesh(
const zenkit::VisualDecal& decal);
191 Tempest::Sound implLoadSoundBuffer(std::string_view name);
193 DmSegment* implLoadMusicSegment(
char const* name);
194 GthFont& implLoadFont(std::string_view fname,
FontType type,
const float scale);
196 const VobTree* implLoadVobBundle(std::string_view name);
198 Tempest::VertexBuffer<Vertex> sphere(
int passCount,
float R);
200 Tempest::Texture2d fallback, fbZero;
201 Tempest::StorageImage fbImg;
203 using BindK = std::tuple<const Skeleton*,const ProtoMesh*>;
204 using FontK = std::tuple<const std::string,FontType,float>;
207 size_t operator()(
const BindK& b)
const {
208 return std::uintptr_t(std::get<0>(b));
210 size_t operator()(
const DecalK& b)
const {
211 return std::uintptr_t(b.mat.tex);
213 size_t operator()(
const FontK& b)
const {
214 std::hash<std::string> h;
215 return h(std::get<0>(b));
220 size_t operator()(
const Tempest::Color& a,
const Tempest::Color& b)
const {
221 auto ta = std::make_tuple(a.r(),a.g(),a.b(),a.a());
222 auto tb = std::make_tuple(b.r(),b.g(),b.b(),b.a());
227 Tempest::Device& dev;
228 Tempest::SoundDevice sound;
230 std::recursive_mutex sync;
231 std::unique_ptr<Dx8::DirectMusic> dxMusic;
232 DmLoader* dmLoader =
nullptr;
233 zenkit::Vfs gothicAssets;
235 std::vector<uint8_t> fBuff, ddsBuf;
236 Tempest::IndexBuffer<uint16_t> cube;
239 std::vector<Tempest::StorageBuffer> ssbo;
240 std::vector<Tempest::StorageImage> img;
241 std::vector<Tempest::Attachment> att;
242 std::vector<Tempest::ZBuffer> zb;
243 std::vector<Tempest::DescriptorArray> arr;
244 std::vector<Tempest::AccelerationStructure> rtas;
247 uint8_t recycledId = 0;
249 TextureCache texCache;
250 std::map<Tempest::Color,std::unique_ptr<Tempest::Texture2d>,Less> pixCache;
251 std::unordered_map<std::string,std::unique_ptr<ProtoMesh>> aniMeshCache;
252 std::unordered_map<DecalK,std::unique_ptr<ProtoMesh>,Hash> decalMeshCache;
253 std::unordered_map<std::string,std::unique_ptr<Skeleton>> skeletonCache;
254 std::unordered_map<std::string,std::unique_ptr<Animation>> animCache;
255 std::unordered_map<BindK,std::unique_ptr<AttachBinder>,Hash> bindCache;
256 std::unordered_map<std::string,std::unique_ptr<PfxEmitterMesh>> emiMeshCache;
257 std::unordered_map<std::string,std::unique_ptr<VobTree>> zenCache;
259 std::recursive_mutex syncFont;
260 std::unordered_map<FontK,std::unique_ptr<GthFont>,Hash> gothicFnt;