From 0ff06cad72362da8be89512e8e307e112fb95df5 Mon Sep 17 00:00:00 2001 From: Jan Date: Tue, 23 Mar 2021 01:28:33 +0100 Subject: [PATCH] Add AssetLoaders for Qdb, ScriptParseTree and Slug --- .../Game/T6/AssetLoaders/AssetLoaderQdb.cpp | 43 +++++++++++++++++++ .../Game/T6/AssetLoaders/AssetLoaderQdb.h | 16 +++++++ .../AssetLoaderScriptParseTree.cpp | 43 +++++++++++++++++++ .../AssetLoaders/AssetLoaderScriptParseTree.h | 16 +++++++ .../Game/T6/AssetLoaders/AssetLoaderSlug.cpp | 43 +++++++++++++++++++ .../Game/T6/AssetLoaders/AssetLoaderSlug.h | 16 +++++++ src/ObjLoading/Game/T6/ObjLoaderT6.cpp | 9 ++-- 7 files changed, 183 insertions(+), 3 deletions(-) create mode 100644 src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderQdb.cpp create mode 100644 src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderQdb.h create mode 100644 src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderScriptParseTree.cpp create mode 100644 src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderScriptParseTree.h create mode 100644 src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderSlug.cpp create mode 100644 src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderSlug.h diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderQdb.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderQdb.cpp new file mode 100644 index 00000000..3e5a4c17 --- /dev/null +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderQdb.cpp @@ -0,0 +1,43 @@ +#include "AssetLoaderQdb.h" + +#include + +#include "Game/T6/T6.h" +#include "Pool/GlobalAssetPool.h" + +using namespace T6; + +void* AssetLoaderQdb::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) +{ + auto* qdb = memory->Create(); + memset(qdb, 0, sizeof(Qdb)); + qdb->name = memory->Dup(assetName.c_str()); + return qdb; +} + +bool AssetLoaderQdb::CanLoadFromRaw() const +{ + return true; +} + +bool AssetLoaderQdb::LoadFromRaw(const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager) const +{ + const auto file = searchPath->Open(assetName); + if (!file.IsOpen()) + return false; + + auto* qdb = memory->Create(); + qdb->name = memory->Dup(assetName.c_str()); + qdb->len = static_cast(file.m_length); + + auto* fileBuffer = static_cast(memory->Alloc(static_cast(file.m_length + 1))); + file.m_stream->read(fileBuffer, file.m_length); + if (file.m_stream->gcount() != file.m_length) + return false; + fileBuffer[qdb->len] = '\0'; + + qdb->buffer = static_cast(fileBuffer); + manager->AddAsset(ASSET_TYPE_QDB, assetName, qdb); + + return true; +} diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderQdb.h b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderQdb.h new file mode 100644 index 00000000..f000d74c --- /dev/null +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderQdb.h @@ -0,0 +1,16 @@ +#pragma once +#include "Game/T6/T6.h" +#include "AssetLoading/BasicAssetLoader.h" +#include "AssetLoading/IAssetLoadingManager.h" +#include "SearchPath/ISearchPath.h" + +namespace T6 +{ + class AssetLoaderQdb final : public BasicAssetLoader + { + public: + _NODISCARD void* CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) override; + _NODISCARD bool CanLoadFromRaw() const override; + bool LoadFromRaw(const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager) const override; + }; +} diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderScriptParseTree.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderScriptParseTree.cpp new file mode 100644 index 00000000..491ab97d --- /dev/null +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderScriptParseTree.cpp @@ -0,0 +1,43 @@ +#include "AssetLoaderScriptParseTree.h" + +#include + +#include "Game/T6/T6.h" +#include "Pool/GlobalAssetPool.h" + +using namespace T6; + +void* AssetLoaderScriptParseTree::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) +{ + auto* scriptParseTree = memory->Create(); + memset(scriptParseTree, 0, sizeof(ScriptParseTree)); + scriptParseTree->name = memory->Dup(assetName.c_str()); + return scriptParseTree; +} + +bool AssetLoaderScriptParseTree::CanLoadFromRaw() const +{ + return true; +} + +bool AssetLoaderScriptParseTree::LoadFromRaw(const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager) const +{ + const auto file = searchPath->Open(assetName); + if (!file.IsOpen()) + return false; + + auto* scriptParseTree = memory->Create(); + scriptParseTree->name = memory->Dup(assetName.c_str()); + scriptParseTree->len = static_cast(file.m_length); + + auto* fileBuffer = static_cast(memory->Alloc(static_cast(file.m_length + 1))); + file.m_stream->read(fileBuffer, file.m_length); + if (file.m_stream->gcount() != file.m_length) + return false; + fileBuffer[scriptParseTree->len] = '\0'; + + scriptParseTree->buffer = static_cast(fileBuffer); + manager->AddAsset(ASSET_TYPE_SCRIPTPARSETREE, assetName, scriptParseTree); + + return true; +} diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderScriptParseTree.h b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderScriptParseTree.h new file mode 100644 index 00000000..f07ffae2 --- /dev/null +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderScriptParseTree.h @@ -0,0 +1,16 @@ +#pragma once +#include "Game/T6/T6.h" +#include "AssetLoading/BasicAssetLoader.h" +#include "AssetLoading/IAssetLoadingManager.h" +#include "SearchPath/ISearchPath.h" + +namespace T6 +{ + class AssetLoaderScriptParseTree final : public BasicAssetLoader + { + public: + _NODISCARD void* CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) override; + _NODISCARD bool CanLoadFromRaw() const override; + bool LoadFromRaw(const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager) const override; + }; +} diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderSlug.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderSlug.cpp new file mode 100644 index 00000000..38bae296 --- /dev/null +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderSlug.cpp @@ -0,0 +1,43 @@ +#include "AssetLoaderSlug.h" + +#include + +#include "Game/T6/T6.h" +#include "Pool/GlobalAssetPool.h" + +using namespace T6; + +void* AssetLoaderSlug::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) +{ + auto* slug = memory->Create(); + memset(slug, 0, sizeof(Slug)); + slug->name = memory->Dup(assetName.c_str()); + return slug; +} + +bool AssetLoaderSlug::CanLoadFromRaw() const +{ + return true; +} + +bool AssetLoaderSlug::LoadFromRaw(const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager) const +{ + const auto file = searchPath->Open(assetName); + if (!file.IsOpen()) + return false; + + auto* slug = memory->Create(); + slug->name = memory->Dup(assetName.c_str()); + slug->len = static_cast(file.m_length); + + auto* fileBuffer = static_cast(memory->Alloc(static_cast(file.m_length + 1))); + file.m_stream->read(fileBuffer, file.m_length); + if (file.m_stream->gcount() != file.m_length) + return false; + fileBuffer[slug->len] = '\0'; + + slug->buffer = static_cast(fileBuffer); + manager->AddAsset(ASSET_TYPE_SLUG, assetName, slug); + + return true; +} diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderSlug.h b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderSlug.h new file mode 100644 index 00000000..8c3586ad --- /dev/null +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderSlug.h @@ -0,0 +1,16 @@ +#pragma once +#include "Game/T6/T6.h" +#include "AssetLoading/BasicAssetLoader.h" +#include "AssetLoading/IAssetLoadingManager.h" +#include "SearchPath/ISearchPath.h" + +namespace T6 +{ + class AssetLoaderSlug final : public BasicAssetLoader + { + public: + _NODISCARD void* CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) override; + _NODISCARD bool CanLoadFromRaw() const override; + bool LoadFromRaw(const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager) const override; + }; +} diff --git a/src/ObjLoading/Game/T6/ObjLoaderT6.cpp b/src/ObjLoading/Game/T6/ObjLoaderT6.cpp index cde5f9ee..6f0b2461 100644 --- a/src/ObjLoading/Game/T6/ObjLoaderT6.cpp +++ b/src/ObjLoading/Game/T6/ObjLoaderT6.cpp @@ -4,7 +4,10 @@ #include "Game/T6/GameAssetPoolT6.h" #include "ObjContainer/IPak/IPak.h" #include "ObjLoading.h" +#include "AssetLoaders/AssetLoaderQdb.h" #include "AssetLoaders/AssetLoaderRawFile.h" +#include "AssetLoaders/AssetLoaderScriptParseTree.h" +#include "AssetLoaders/AssetLoaderSlug.h" #include "AssetLoading/AssetLoadingManager.h" #include "Image/Texture.h" #include "Image/IwiLoader.h" @@ -57,14 +60,14 @@ namespace T6 REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_DDL, ddlRoot_t)) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_GLASSES, Glasses)) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_EMBLEMSET, EmblemSet)) - REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_SCRIPTPARSETREE, ScriptParseTree)) + REGISTER_ASSET_LOADER(AssetLoaderScriptParseTree) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_VEHICLEDEF, VehicleDef)) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_MEMORYBLOCK, MemoryBlock)) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_ADDON_MAP_ENTS, AddonMapEnts)) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_TRACER, TracerDef)) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_SKINNEDVERTS, SkinnedVertsDef)) - REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_QDB, Qdb)) - REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_SLUG, Slug)) + REGISTER_ASSET_LOADER(AssetLoaderQdb) + REGISTER_ASSET_LOADER(AssetLoaderSlug) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_FOOTSTEP_TABLE, FootstepTableDef)) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_FOOTSTEPFX_TABLE, FootstepFXTableDef)) REGISTER_ASSET_LOADER(BASIC_LOADER(ASSET_TYPE_ZBARRIER, ZBarrierDef))