diff --git a/src/Common/Game/CommonAsset.cpp b/src/Common/Game/CommonAsset.cpp new file mode 100644 index 00000000..30bdfd7d --- /dev/null +++ b/src/Common/Game/CommonAsset.cpp @@ -0,0 +1,26 @@ +#include "CommonAsset.h" + +#include "IW3/CommonAssetIW3.h" +#include "IW4/CommonAssetIW4.h" +#include "IW5/CommonAssetIW5.h" +#include "T5/CommonAssetT5.h" +#include "T6/CommonAssetT6.h" + +#include + +ICommonAssetTypeMapper* ICommonAssetTypeMapper::GetCommonAssetMapperByGame(GameId gameId) +{ + static ICommonAssetTypeMapper* assetTypeMappers[static_cast(GameId::COUNT)]{ + new IW3::CommonAssetTypeMapper(), + new IW4::CommonAssetTypeMapper(), + new IW5::CommonAssetTypeMapper(), + new T5::CommonAssetTypeMapper(), + new T6::CommonAssetTypeMapper(), + }; + + assert(static_cast(gameId) < static_cast(GameId::COUNT)); + auto* result = assetTypeMappers[static_cast(gameId)]; + assert(result); + + return result; +} diff --git a/src/Common/Game/CommonAsset.h b/src/Common/Game/CommonAsset.h new file mode 100644 index 00000000..769e3618 --- /dev/null +++ b/src/Common/Game/CommonAsset.h @@ -0,0 +1,181 @@ +#pragma once + +#include "IGame.h" +#include "Zone/ZoneTypes.h" + +#include +#include + +enum class CommonAssetType : std::uint8_t +{ + // IW3, IW4, IW5, T5, T6 + PHYS_PRESET, + // IW3, IW4, IW5, T5, T6 + XANIM, + // IW3, IW4, IW5, T5, T6 + XMODEL, + // IW3, IW4, IW5, T5, T6 + MATERIAL, + // IW3, IW4, IW5, T5, T6 + TECHNIQUE_SET, + // IW3, IW4, IW5, T5, T6 + IMAGE, + // IW3, IW4, IW5, T5, T6 + SOUND, + // IW3, IW4, IW5 + SOUND_CURVE, + // IW3, IW4, IW5 + LOADED_SOUND, + // IW3, IW4, IW5, T5, T6 + CLIP_MAP, + // IW3, IW4, IW5, T5, T6 + COM_WORLD, + // IW3, IW4, T5, T6 + GAME_WORLD_SP, + // IW3, IW4, T5, T6 + GAME_WORLD_MP, + // IW3, IW4, IW5, T5, T6 + MAP_ENTS, + // IW3, IW4, IW5, T5, T6 + GFX_WORLD, + // IW3, IW4, IW5, T5, T6 + LIGHT_DEF, + // IW3, IW4, IW5, T5, T6 + UI_MAP, + // IW3, IW4, IW5, T5, T6 + FONT, + // IW3, IW4, IW5, T5, T6 + MENULIST, + // IW3, IW4, IW5, T5, T6 + MENU, + // IW3, IW4, IW5, T5, T6 + LOCALIZE_ENTRY, + // IW3, IW4, IW5, T5, T6 + WEAPON, + // IW3, IW4, IW5, T5, T6 + SOUND_DRIVER_GLOBALS, + // IW3, IW4, IW5, T5, T6 + FX, + // IW3, IW4, IW5, T5, T6 + IMPACT_FX, + // IW3, IW4, IW5, T5, T6 + AI_TYPE, + // IW3, IW4, IW5, T5, T6 + MP_TYPE, + // IW3, IW4, IW5, T5, T6 + CHARACTER, + // IW3, IW4, IW5, T5, T6 + XMODEL_ALIAS, + // IW3, IW4, IW5, T5, T6 + RAW_FILE, + // IW3, IW4, IW5, T5, T6 + STRING_TABLE, + + // IW3, T5, T6 + XMODEL_PIECES, + + // IW4, IW5 + PHYS_COLL_MAP, + // IW4, IW5 + XMODEL_SURFS, + // IW4, IW5 + PIXEL_SHADER, + // IW4, IW5 + VERTEX_SHADER, + // IW4, IW5 + VERTEX_DECL, + // IW4, IW5 + FX_WORLD, + // IW4, IW5, T6 + LEADERBOARD, + // IW4, IW5 + STRUCTURED_DATA_DEF, + // IW4, IW5, T6 + TRACER, + // IW4, IW5, T6 + VEHICLE, + // IW4, IW5, T6 + ADDON_MAP_ENTS, + + // IW5 + GLASS_WORLD, + // IW5 + PATH_DATA, + // IW5 + VEHICLE_TRACK, + // IW5, T6 + ATTACHMENT, + // IW5 + SURFACE_FX, + // IW5, T6 + SCRIPT, + + // T5, T6 + PHYS_CONSTRAINTS, + // T5, T6 + DESTRUCTIBLE_DEF, + // T5, T6 + SOUND_PATCH, + // T5, T6 + WEAPON_DEF, + // T5, T6 + WEAPON_VARIANT, + // T5, T6 + MP_BODY, + // T5, T6 + MP_HEAD, + // T5 + PACK_INDEX, + // T5, T6 + XGLOBALS, + // T5, T6 + DDL, + // T5, T6 + GLASSES, + // T5, T6 + EMBLEM_SET, + + // T6 + FONT_ICON, + // T6 + WEAPON_FULL, + // T6 + ATTACHMENT_UNIQUE, + // T6 + WEAPON_CAMO, + // T6 + KEY_VALUE_PAIRS, + // T6 + MEMORY_BLOCK, + // T6 + SKINNED_VERTS, + // T6 + QDB, + // T6 + SLUG, + // T6 + FOOTSTEP_TABLE, + // T6 + FOOTSTEP_FX_TABLE, + // T6 + ZBARRIER, + + COUNT, +}; + +class ICommonAssetTypeMapper +{ +public: + [[nodiscard]] virtual CommonAssetType GameToCommonAssetType(asset_type_t gameAssetType) const = 0; + [[nodiscard]] virtual std::optional CommonToGameAssetType(CommonAssetType commonAssetType) const = 0; + + static ICommonAssetTypeMapper* GetCommonAssetMapperByGame(GameId gameId); + +protected: + ICommonAssetTypeMapper() = default; + virtual ~ICommonAssetTypeMapper() = default; + ICommonAssetTypeMapper(const ICommonAssetTypeMapper& other) = default; + ICommonAssetTypeMapper(ICommonAssetTypeMapper&& other) noexcept = default; + ICommonAssetTypeMapper& operator=(const ICommonAssetTypeMapper& other) = default; + ICommonAssetTypeMapper& operator=(ICommonAssetTypeMapper&& other) noexcept = default; +}; diff --git a/src/Common/Game/IW3/CommonAssetIW3.cpp b/src/Common/Game/IW3/CommonAssetIW3.cpp new file mode 100644 index 00000000..1e9f372e --- /dev/null +++ b/src/Common/Game/IW3/CommonAssetIW3.cpp @@ -0,0 +1,100 @@ +#include "CommonAssetIW3.h" + +#include "IW3.h" + +#include + +namespace IW3 +{ + CommonAssetTypeMapper::CommonAssetTypeMapper() = default; + + CommonAssetType CommonAssetTypeMapper::GameToCommonAssetType(const asset_type_t gameAssetType) const + { + static CommonAssetType lookupTable[static_cast(ASSET_TYPE_COUNT)]{ + CommonAssetType::XMODEL_PIECES, // ASSET_TYPE_XMODELPIECES + CommonAssetType::PHYS_PRESET, // ASSET_TYPE_PHYSPRESET + CommonAssetType::XANIM, // ASSET_TYPE_XANIMPARTS + CommonAssetType::XMODEL, // ASSET_TYPE_XMODEL + CommonAssetType::MATERIAL, // ASSET_TYPE_MATERIAL + CommonAssetType::TECHNIQUE_SET, // ASSET_TYPE_TECHNIQUE_SET + CommonAssetType::IMAGE, // ASSET_TYPE_IMAGE + CommonAssetType::SOUND, // ASSET_TYPE_SOUND + CommonAssetType::SOUND_CURVE, // ASSET_TYPE_SOUND_CURVE + CommonAssetType::LOADED_SOUND, // ASSET_TYPE_LOADED_SOUND + CommonAssetType::CLIP_MAP, // ASSET_TYPE_CLIPMAP + CommonAssetType::CLIP_MAP, // ASSET_TYPE_CLIPMAP_PVS + CommonAssetType::COM_WORLD, // ASSET_TYPE_COMWORLD + CommonAssetType::GAME_WORLD_SP, // ASSET_TYPE_GAMEWORLD_SP + CommonAssetType::GAME_WORLD_MP, // ASSET_TYPE_GAMEWORLD_MP + CommonAssetType::MAP_ENTS, // ASSET_TYPE_MAP_ENTS + CommonAssetType::GFX_WORLD, // ASSET_TYPE_GFXWORLD + CommonAssetType::LIGHT_DEF, // ASSET_TYPE_LIGHT_DEF + CommonAssetType::UI_MAP, // ASSET_TYPE_UI_MAP + CommonAssetType::FONT, // ASSET_TYPE_FONT + CommonAssetType::MENULIST, // ASSET_TYPE_MENULIST + CommonAssetType::MENU, // ASSET_TYPE_MENU + CommonAssetType::LOCALIZE_ENTRY, // ASSET_TYPE_LOCALIZE_ENTRY + CommonAssetType::WEAPON, // ASSET_TYPE_WEAPON + CommonAssetType::SOUND_DRIVER_GLOBALS, // ASSET_TYPE_SNDDRIVER_GLOBALS + CommonAssetType::FX, // ASSET_TYPE_FX + CommonAssetType::IMPACT_FX, // ASSET_TYPE_IMPACT_FX + CommonAssetType::AI_TYPE, // ASSET_TYPE_AITYPE + CommonAssetType::MP_TYPE, // ASSET_TYPE_MPTYPE + CommonAssetType::CHARACTER, // ASSET_TYPE_CHARACTER + CommonAssetType::XMODEL_ALIAS, // ASSET_TYPE_XMODELALIAS + CommonAssetType::RAW_FILE, // ASSET_TYPE_RAWFILE + CommonAssetType::STRING_TABLE, // ASSET_TYPE_STRINGTABLE + }; + + assert(gameAssetType < ASSET_TYPE_COUNT); + return lookupTable[gameAssetType]; + } + + std::optional CommonAssetTypeMapper::CommonToGameAssetType(const CommonAssetType commonAssetType) const + { +#define MAP_COMMON(common, game) \ + case common: \ + return game; + + switch (commonAssetType) + { + MAP_COMMON(CommonAssetType::XMODEL_PIECES, ASSET_TYPE_XMODELPIECES) + MAP_COMMON(CommonAssetType::PHYS_PRESET, ASSET_TYPE_PHYSPRESET) + MAP_COMMON(CommonAssetType::XANIM, ASSET_TYPE_XANIMPARTS) + MAP_COMMON(CommonAssetType::XMODEL, ASSET_TYPE_XMODEL) + MAP_COMMON(CommonAssetType::MATERIAL, ASSET_TYPE_MATERIAL) + MAP_COMMON(CommonAssetType::TECHNIQUE_SET, ASSET_TYPE_TECHNIQUE_SET) + MAP_COMMON(CommonAssetType::IMAGE, ASSET_TYPE_IMAGE) + MAP_COMMON(CommonAssetType::SOUND, ASSET_TYPE_SOUND) + MAP_COMMON(CommonAssetType::SOUND_CURVE, ASSET_TYPE_SOUND_CURVE) + MAP_COMMON(CommonAssetType::LOADED_SOUND, ASSET_TYPE_LOADED_SOUND) + MAP_COMMON(CommonAssetType::CLIP_MAP, ASSET_TYPE_CLIPMAP_PVS) + MAP_COMMON(CommonAssetType::COM_WORLD, ASSET_TYPE_COMWORLD) + MAP_COMMON(CommonAssetType::GAME_WORLD_SP, ASSET_TYPE_GAMEWORLD_SP) + MAP_COMMON(CommonAssetType::GAME_WORLD_MP, ASSET_TYPE_GAMEWORLD_MP) + MAP_COMMON(CommonAssetType::MAP_ENTS, ASSET_TYPE_MAP_ENTS) + MAP_COMMON(CommonAssetType::GFX_WORLD, ASSET_TYPE_GFXWORLD) + MAP_COMMON(CommonAssetType::LIGHT_DEF, ASSET_TYPE_LIGHT_DEF) + MAP_COMMON(CommonAssetType::UI_MAP, ASSET_TYPE_UI_MAP) + MAP_COMMON(CommonAssetType::FONT, ASSET_TYPE_FONT) + MAP_COMMON(CommonAssetType::MENULIST, ASSET_TYPE_MENULIST) + MAP_COMMON(CommonAssetType::MENU, ASSET_TYPE_MENU) + MAP_COMMON(CommonAssetType::LOCALIZE_ENTRY, ASSET_TYPE_LOCALIZE_ENTRY) + MAP_COMMON(CommonAssetType::WEAPON, ASSET_TYPE_WEAPON) + MAP_COMMON(CommonAssetType::SOUND_DRIVER_GLOBALS, ASSET_TYPE_SNDDRIVER_GLOBALS) + MAP_COMMON(CommonAssetType::FX, ASSET_TYPE_FX) + MAP_COMMON(CommonAssetType::IMPACT_FX, ASSET_TYPE_IMPACT_FX) + MAP_COMMON(CommonAssetType::AI_TYPE, ASSET_TYPE_AITYPE) + MAP_COMMON(CommonAssetType::MP_TYPE, ASSET_TYPE_MPTYPE) + MAP_COMMON(CommonAssetType::CHARACTER, ASSET_TYPE_CHARACTER) + MAP_COMMON(CommonAssetType::XMODEL_ALIAS, ASSET_TYPE_XMODELALIAS) + MAP_COMMON(CommonAssetType::RAW_FILE, ASSET_TYPE_RAWFILE) + MAP_COMMON(CommonAssetType::STRING_TABLE, ASSET_TYPE_STRINGTABLE) + + default: + return std::nullopt; + } + +#undef MAP_COMMON + } +} // namespace IW3 diff --git a/src/Common/Game/IW3/CommonAssetIW3.h b/src/Common/Game/IW3/CommonAssetIW3.h new file mode 100644 index 00000000..bc19e468 --- /dev/null +++ b/src/Common/Game/IW3/CommonAssetIW3.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Game/CommonAsset.h" + +namespace IW3 +{ + class CommonAssetTypeMapper final : public ICommonAssetTypeMapper + { + public: + CommonAssetTypeMapper(); + + [[nodiscard]] CommonAssetType GameToCommonAssetType(asset_type_t gameAssetType) const override; + [[nodiscard]] std::optional CommonToGameAssetType(CommonAssetType commonAssetType) const override; + }; +} // namespace IW3 diff --git a/src/Common/Game/IW4/CommonAssetIW4.cpp b/src/Common/Game/IW4/CommonAssetIW4.cpp new file mode 100644 index 00000000..e89cb13e --- /dev/null +++ b/src/Common/Game/IW4/CommonAssetIW4.cpp @@ -0,0 +1,120 @@ +#include "CommonAssetIW4.h" + +#include "IW4.h" + +#include + +namespace IW4 +{ + CommonAssetTypeMapper::CommonAssetTypeMapper() = default; + + CommonAssetType CommonAssetTypeMapper::GameToCommonAssetType(const asset_type_t gameAssetType) const + { + static CommonAssetType lookupTable[static_cast(ASSET_TYPE_COUNT)]{ + CommonAssetType::PHYS_PRESET, // ASSET_TYPE_PHYSPRESET + CommonAssetType::PHYS_COLL_MAP, // ASSET_TYPE_PHYSCOLLMAP + CommonAssetType::XANIM, // ASSET_TYPE_XANIMPARTS + CommonAssetType::XMODEL_SURFS, // ASSET_TYPE_XMODEL_SURFS + CommonAssetType::XMODEL, // ASSET_TYPE_XMODEL + CommonAssetType::MATERIAL, // ASSET_TYPE_MATERIAL + CommonAssetType::PIXEL_SHADER, // ASSET_TYPE_PIXELSHADER + CommonAssetType::VERTEX_SHADER, // ASSET_TYPE_VERTEXSHADER + CommonAssetType::VERTEX_DECL, // ASSET_TYPE_VERTEXDECL + CommonAssetType::TECHNIQUE_SET, // ASSET_TYPE_TECHNIQUE_SET + CommonAssetType::IMAGE, // ASSET_TYPE_IMAGE + CommonAssetType::SOUND, // ASSET_TYPE_SOUND + CommonAssetType::SOUND_CURVE, // ASSET_TYPE_SOUND_CURVE + CommonAssetType::LOADED_SOUND, // ASSET_TYPE_LOADED_SOUND + CommonAssetType::CLIP_MAP, // ASSET_TYPE_CLIPMAP_SP + CommonAssetType::CLIP_MAP, // ASSET_TYPE_CLIPMAP_MP + CommonAssetType::COM_WORLD, // ASSET_TYPE_COMWORLD + CommonAssetType::GAME_WORLD_SP, // ASSET_TYPE_GAMEWORLD_SP + CommonAssetType::GAME_WORLD_MP, // ASSET_TYPE_GAMEWORLD_MP + CommonAssetType::MAP_ENTS, // ASSET_TYPE_MAP_ENTS + CommonAssetType::FX_WORLD, // ASSET_TYPE_FXWORLD + CommonAssetType::GFX_WORLD, // ASSET_TYPE_GFXWORLD + CommonAssetType::LIGHT_DEF, // ASSET_TYPE_LIGHT_DEF + CommonAssetType::UI_MAP, // ASSET_TYPE_UI_MAP + CommonAssetType::FONT, // ASSET_TYPE_FONT + CommonAssetType::MENULIST, // ASSET_TYPE_MENULIST + CommonAssetType::MENU, // ASSET_TYPE_MENU + CommonAssetType::LOCALIZE_ENTRY, // ASSET_TYPE_LOCALIZE_ENTRY + CommonAssetType::WEAPON, // ASSET_TYPE_WEAPON + CommonAssetType::SOUND_DRIVER_GLOBALS, // ASSET_TYPE_SNDDRIVER_GLOBALS + CommonAssetType::FX, // ASSET_TYPE_FX + CommonAssetType::IMPACT_FX, // ASSET_TYPE_IMPACT_FX + CommonAssetType::AI_TYPE, // ASSET_TYPE_AITYPE + CommonAssetType::MP_TYPE, // ASSET_TYPE_MPTYPE + CommonAssetType::CHARACTER, // ASSET_TYPE_CHARACTER + CommonAssetType::XMODEL_ALIAS, // ASSET_TYPE_XMODELALIAS + CommonAssetType::RAW_FILE, // ASSET_TYPE_RAWFILE + CommonAssetType::STRING_TABLE, // ASSET_TYPE_STRINGTABLE + CommonAssetType::LEADERBOARD, // ASSET_TYPE_LEADERBOARD + CommonAssetType::STRUCTURED_DATA_DEF, // ASSET_TYPE_STRUCTURED_DATA_DEF + CommonAssetType::TRACER, // ASSET_TYPE_TRACER + CommonAssetType::VEHICLE, // ASSET_TYPE_VEHICLE + CommonAssetType::ADDON_MAP_ENTS, // ASSET_TYPE_ADDON_MAP_ENTS + }; + + assert(gameAssetType < ASSET_TYPE_COUNT); + return lookupTable[gameAssetType]; + } + + std::optional CommonAssetTypeMapper::CommonToGameAssetType(const CommonAssetType commonAssetType) const + { +#define MAP_COMMON(common, game) \ + case common: \ + return game; + + switch (commonAssetType) + { + MAP_COMMON(CommonAssetType::PHYS_PRESET, ASSET_TYPE_PHYSPRESET) + MAP_COMMON(CommonAssetType::PHYS_COLL_MAP, ASSET_TYPE_PHYSCOLLMAP) + MAP_COMMON(CommonAssetType::XANIM, ASSET_TYPE_XANIMPARTS) + MAP_COMMON(CommonAssetType::XMODEL_SURFS, ASSET_TYPE_XMODEL_SURFS) + MAP_COMMON(CommonAssetType::XMODEL, ASSET_TYPE_XMODEL) + MAP_COMMON(CommonAssetType::MATERIAL, ASSET_TYPE_MATERIAL) + MAP_COMMON(CommonAssetType::PIXEL_SHADER, ASSET_TYPE_PIXELSHADER) + MAP_COMMON(CommonAssetType::VERTEX_SHADER, ASSET_TYPE_VERTEXSHADER) + MAP_COMMON(CommonAssetType::VERTEX_DECL, ASSET_TYPE_VERTEXDECL) + MAP_COMMON(CommonAssetType::TECHNIQUE_SET, ASSET_TYPE_TECHNIQUE_SET) + MAP_COMMON(CommonAssetType::IMAGE, ASSET_TYPE_IMAGE) + MAP_COMMON(CommonAssetType::SOUND, ASSET_TYPE_SOUND) + MAP_COMMON(CommonAssetType::SOUND_CURVE, ASSET_TYPE_SOUND_CURVE) + MAP_COMMON(CommonAssetType::LOADED_SOUND, ASSET_TYPE_LOADED_SOUND) + MAP_COMMON(CommonAssetType::CLIP_MAP, ASSET_TYPE_CLIPMAP_MP) + MAP_COMMON(CommonAssetType::COM_WORLD, ASSET_TYPE_COMWORLD) + MAP_COMMON(CommonAssetType::GAME_WORLD_SP, ASSET_TYPE_GAMEWORLD_SP) + MAP_COMMON(CommonAssetType::GAME_WORLD_MP, ASSET_TYPE_GAMEWORLD_MP) + MAP_COMMON(CommonAssetType::MAP_ENTS, ASSET_TYPE_MAP_ENTS) + MAP_COMMON(CommonAssetType::FX_WORLD, ASSET_TYPE_FXWORLD) + MAP_COMMON(CommonAssetType::GFX_WORLD, ASSET_TYPE_GFXWORLD) + MAP_COMMON(CommonAssetType::LIGHT_DEF, ASSET_TYPE_LIGHT_DEF) + MAP_COMMON(CommonAssetType::UI_MAP, ASSET_TYPE_UI_MAP) + MAP_COMMON(CommonAssetType::FONT, ASSET_TYPE_FONT) + MAP_COMMON(CommonAssetType::MENULIST, ASSET_TYPE_MENULIST) + MAP_COMMON(CommonAssetType::MENU, ASSET_TYPE_MENU) + MAP_COMMON(CommonAssetType::LOCALIZE_ENTRY, ASSET_TYPE_LOCALIZE_ENTRY) + MAP_COMMON(CommonAssetType::WEAPON, ASSET_TYPE_WEAPON) + MAP_COMMON(CommonAssetType::SOUND_DRIVER_GLOBALS, ASSET_TYPE_SNDDRIVER_GLOBALS) + MAP_COMMON(CommonAssetType::FX, ASSET_TYPE_FX) + MAP_COMMON(CommonAssetType::IMPACT_FX, ASSET_TYPE_IMPACT_FX) + MAP_COMMON(CommonAssetType::AI_TYPE, ASSET_TYPE_AITYPE) + MAP_COMMON(CommonAssetType::MP_TYPE, ASSET_TYPE_MPTYPE) + MAP_COMMON(CommonAssetType::CHARACTER, ASSET_TYPE_CHARACTER) + MAP_COMMON(CommonAssetType::XMODEL_ALIAS, ASSET_TYPE_XMODELALIAS) + MAP_COMMON(CommonAssetType::RAW_FILE, ASSET_TYPE_RAWFILE) + MAP_COMMON(CommonAssetType::STRING_TABLE, ASSET_TYPE_STRINGTABLE) + MAP_COMMON(CommonAssetType::LEADERBOARD, ASSET_TYPE_LEADERBOARD) + MAP_COMMON(CommonAssetType::STRUCTURED_DATA_DEF, ASSET_TYPE_STRUCTURED_DATA_DEF) + MAP_COMMON(CommonAssetType::TRACER, ASSET_TYPE_TRACER) + MAP_COMMON(CommonAssetType::VEHICLE, ASSET_TYPE_VEHICLE) + MAP_COMMON(CommonAssetType::ADDON_MAP_ENTS, ASSET_TYPE_ADDON_MAP_ENTS) + + default: + return std::nullopt; + } + +#undef MAP_COMMON + } +} // namespace IW4 diff --git a/src/Common/Game/IW4/CommonAssetIW4.h b/src/Common/Game/IW4/CommonAssetIW4.h new file mode 100644 index 00000000..e4d84543 --- /dev/null +++ b/src/Common/Game/IW4/CommonAssetIW4.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Game/CommonAsset.h" + +namespace IW4 +{ + class CommonAssetTypeMapper final : public ICommonAssetTypeMapper + { + public: + CommonAssetTypeMapper(); + + [[nodiscard]] CommonAssetType GameToCommonAssetType(asset_type_t gameAssetType) const override; + [[nodiscard]] std::optional CommonToGameAssetType(CommonAssetType commonAssetType) const override; + }; +} // namespace IW4 diff --git a/src/Common/Game/IW5/CommonAssetIW5.cpp b/src/Common/Game/IW5/CommonAssetIW5.cpp new file mode 100644 index 00000000..63dfa363 --- /dev/null +++ b/src/Common/Game/IW5/CommonAssetIW5.cpp @@ -0,0 +1,127 @@ +#include "CommonAssetIW5.h" + +#include "IW5.h" + +#include + +namespace IW5 +{ + CommonAssetTypeMapper::CommonAssetTypeMapper() = default; + + CommonAssetType CommonAssetTypeMapper::GameToCommonAssetType(const asset_type_t gameAssetType) const + { + static CommonAssetType lookupTable[static_cast(ASSET_TYPE_COUNT)]{ + CommonAssetType::PHYS_PRESET, // ASSET_TYPE_PHYSPRESET + CommonAssetType::PHYS_COLL_MAP, // ASSET_TYPE_PHYSCOLLMAP + CommonAssetType::XANIM, // ASSET_TYPE_XANIMPARTS + CommonAssetType::XMODEL_SURFS, // ASSET_TYPE_XMODEL_SURFS + CommonAssetType::XMODEL, // ASSET_TYPE_XMODEL + CommonAssetType::MATERIAL, // ASSET_TYPE_MATERIAL + CommonAssetType::PIXEL_SHADER, // ASSET_TYPE_PIXELSHADER + CommonAssetType::VERTEX_SHADER, // ASSET_TYPE_VERTEXSHADER + CommonAssetType::VERTEX_DECL, // ASSET_TYPE_VERTEXDECL + CommonAssetType::TECHNIQUE_SET, // ASSET_TYPE_TECHNIQUE_SET + CommonAssetType::IMAGE, // ASSET_TYPE_IMAGE + CommonAssetType::SOUND, // ASSET_TYPE_SOUND + CommonAssetType::SOUND_CURVE, // ASSET_TYPE_SOUND_CURVE + CommonAssetType::LOADED_SOUND, // ASSET_TYPE_LOADED_SOUND + CommonAssetType::CLIP_MAP, // ASSET_TYPE_CLIPMAP + CommonAssetType::COM_WORLD, // ASSET_TYPE_COMWORLD + CommonAssetType::GLASS_WORLD, // ASSET_TYPE_GLASSWORLD + CommonAssetType::PATH_DATA, // ASSET_TYPE_PATHDATA + CommonAssetType::VEHICLE_TRACK, // ASSET_TYPE_VEHICLE_TRACK + CommonAssetType::MAP_ENTS, // ASSET_TYPE_MAP_ENTS + CommonAssetType::FX_WORLD, // ASSET_TYPE_FXWORLD + CommonAssetType::GFX_WORLD, // ASSET_TYPE_GFXWORLD + CommonAssetType::LIGHT_DEF, // ASSET_TYPE_LIGHT_DEF + CommonAssetType::UI_MAP, // ASSET_TYPE_UI_MAP + CommonAssetType::FONT, // ASSET_TYPE_FONT + CommonAssetType::MENULIST, // ASSET_TYPE_MENULIST + CommonAssetType::MENU, // ASSET_TYPE_MENU + CommonAssetType::LOCALIZE_ENTRY, // ASSET_TYPE_LOCALIZE_ENTRY + CommonAssetType::ATTACHMENT, // ASSET_TYPE_ATTACHMENT + CommonAssetType::WEAPON, // ASSET_TYPE_WEAPON + CommonAssetType::SOUND_DRIVER_GLOBALS, // ASSET_TYPE_SNDDRIVER_GLOBALS + CommonAssetType::FX, // ASSET_TYPE_FX + CommonAssetType::IMPACT_FX, // ASSET_TYPE_IMPACT_FX + CommonAssetType::SURFACE_FX, // ASSET_TYPE_SURFACE_FX + CommonAssetType::AI_TYPE, // ASSET_TYPE_AITYPE + CommonAssetType::MP_TYPE, // ASSET_TYPE_MPTYPE + CommonAssetType::CHARACTER, // ASSET_TYPE_CHARACTER + CommonAssetType::XMODEL_ALIAS, // ASSET_TYPE_XMODELALIAS + CommonAssetType::RAW_FILE, // ASSET_TYPE_RAWFILE + CommonAssetType::SCRIPT, // ASSET_TYPE_SCRIPTFILE + CommonAssetType::STRING_TABLE, // ASSET_TYPE_STRINGTABLE + CommonAssetType::LEADERBOARD, // ASSET_TYPE_LEADERBOARD + CommonAssetType::STRUCTURED_DATA_DEF, // ASSET_TYPE_STRUCTURED_DATA_DEF + CommonAssetType::TRACER, // ASSET_TYPE_TRACER + CommonAssetType::VEHICLE, // ASSET_TYPE_VEHICLE + CommonAssetType::ADDON_MAP_ENTS, // ASSET_TYPE_ADDON_MAP_ENTS + }; + + assert(gameAssetType < ASSET_TYPE_COUNT); + return lookupTable[gameAssetType]; + } + + std::optional CommonAssetTypeMapper::CommonToGameAssetType(const CommonAssetType commonAssetType) const + { +#define MAP_COMMON(common, game) \ + case common: \ + return game; + + switch (commonAssetType) + { + MAP_COMMON(CommonAssetType::PHYS_PRESET, ASSET_TYPE_PHYSPRESET) + MAP_COMMON(CommonAssetType::PHYS_COLL_MAP, ASSET_TYPE_PHYSCOLLMAP) + MAP_COMMON(CommonAssetType::XANIM, ASSET_TYPE_XANIMPARTS) + MAP_COMMON(CommonAssetType::XMODEL_SURFS, ASSET_TYPE_XMODEL_SURFS) + MAP_COMMON(CommonAssetType::XMODEL, ASSET_TYPE_XMODEL) + MAP_COMMON(CommonAssetType::MATERIAL, ASSET_TYPE_MATERIAL) + MAP_COMMON(CommonAssetType::PIXEL_SHADER, ASSET_TYPE_PIXELSHADER) + MAP_COMMON(CommonAssetType::VERTEX_SHADER, ASSET_TYPE_VERTEXSHADER) + MAP_COMMON(CommonAssetType::VERTEX_DECL, ASSET_TYPE_VERTEXDECL) + MAP_COMMON(CommonAssetType::TECHNIQUE_SET, ASSET_TYPE_TECHNIQUE_SET) + MAP_COMMON(CommonAssetType::IMAGE, ASSET_TYPE_IMAGE) + MAP_COMMON(CommonAssetType::SOUND, ASSET_TYPE_SOUND) + MAP_COMMON(CommonAssetType::SOUND_CURVE, ASSET_TYPE_SOUND_CURVE) + MAP_COMMON(CommonAssetType::LOADED_SOUND, ASSET_TYPE_LOADED_SOUND) + MAP_COMMON(CommonAssetType::CLIP_MAP, ASSET_TYPE_CLIPMAP) + MAP_COMMON(CommonAssetType::COM_WORLD, ASSET_TYPE_COMWORLD) + MAP_COMMON(CommonAssetType::GLASS_WORLD, ASSET_TYPE_GLASSWORLD) + MAP_COMMON(CommonAssetType::PATH_DATA, ASSET_TYPE_PATHDATA) + MAP_COMMON(CommonAssetType::VEHICLE_TRACK, ASSET_TYPE_VEHICLE_TRACK) + MAP_COMMON(CommonAssetType::MAP_ENTS, ASSET_TYPE_MAP_ENTS) + MAP_COMMON(CommonAssetType::FX_WORLD, ASSET_TYPE_FXWORLD) + MAP_COMMON(CommonAssetType::GFX_WORLD, ASSET_TYPE_GFXWORLD) + MAP_COMMON(CommonAssetType::LIGHT_DEF, ASSET_TYPE_LIGHT_DEF) + MAP_COMMON(CommonAssetType::UI_MAP, ASSET_TYPE_UI_MAP) + MAP_COMMON(CommonAssetType::FONT, ASSET_TYPE_FONT) + MAP_COMMON(CommonAssetType::MENULIST, ASSET_TYPE_MENULIST) + MAP_COMMON(CommonAssetType::MENU, ASSET_TYPE_MENU) + MAP_COMMON(CommonAssetType::LOCALIZE_ENTRY, ASSET_TYPE_LOCALIZE_ENTRY) + MAP_COMMON(CommonAssetType::ATTACHMENT, ASSET_TYPE_ATTACHMENT) + MAP_COMMON(CommonAssetType::WEAPON, ASSET_TYPE_WEAPON) + MAP_COMMON(CommonAssetType::SOUND_DRIVER_GLOBALS, ASSET_TYPE_SNDDRIVER_GLOBALS) + MAP_COMMON(CommonAssetType::FX, ASSET_TYPE_FX) + MAP_COMMON(CommonAssetType::IMPACT_FX, ASSET_TYPE_IMPACT_FX) + MAP_COMMON(CommonAssetType::SURFACE_FX, ASSET_TYPE_SURFACE_FX) + MAP_COMMON(CommonAssetType::AI_TYPE, ASSET_TYPE_AITYPE) + MAP_COMMON(CommonAssetType::MP_TYPE, ASSET_TYPE_MPTYPE) + MAP_COMMON(CommonAssetType::CHARACTER, ASSET_TYPE_CHARACTER) + MAP_COMMON(CommonAssetType::XMODEL_ALIAS, ASSET_TYPE_XMODELALIAS) + MAP_COMMON(CommonAssetType::RAW_FILE, ASSET_TYPE_RAWFILE) + MAP_COMMON(CommonAssetType::SCRIPT, ASSET_TYPE_SCRIPTFILE) + MAP_COMMON(CommonAssetType::STRING_TABLE, ASSET_TYPE_STRINGTABLE) + MAP_COMMON(CommonAssetType::LEADERBOARD, ASSET_TYPE_LEADERBOARD) + MAP_COMMON(CommonAssetType::STRUCTURED_DATA_DEF, ASSET_TYPE_STRUCTURED_DATA_DEF) + MAP_COMMON(CommonAssetType::TRACER, ASSET_TYPE_TRACER) + MAP_COMMON(CommonAssetType::VEHICLE, ASSET_TYPE_VEHICLE) + MAP_COMMON(CommonAssetType::ADDON_MAP_ENTS, ASSET_TYPE_ADDON_MAP_ENTS) + + default: + return std::nullopt; + } + +#undef MAP_COMMON + } +} // namespace IW5 diff --git a/src/Common/Game/IW5/CommonAssetIW5.h b/src/Common/Game/IW5/CommonAssetIW5.h new file mode 100644 index 00000000..2dbf5c1f --- /dev/null +++ b/src/Common/Game/IW5/CommonAssetIW5.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Game/CommonAsset.h" + +namespace IW5 +{ + class CommonAssetTypeMapper final : public ICommonAssetTypeMapper + { + public: + CommonAssetTypeMapper(); + + [[nodiscard]] CommonAssetType GameToCommonAssetType(asset_type_t gameAssetType) const override; + [[nodiscard]] std::optional CommonToGameAssetType(CommonAssetType commonAssetType) const override; + }; +} // namespace IW5 diff --git a/src/Common/Game/T5/CommonAssetT5.cpp b/src/Common/Game/T5/CommonAssetT5.cpp new file mode 100644 index 00000000..322c4635 --- /dev/null +++ b/src/Common/Game/T5/CommonAssetT5.cpp @@ -0,0 +1,120 @@ +#include "CommonAssetT5.h" + +#include "T5.h" + +#include + +namespace T5 +{ + CommonAssetTypeMapper::CommonAssetTypeMapper() = default; + + CommonAssetType CommonAssetTypeMapper::GameToCommonAssetType(const asset_type_t gameAssetType) const + { + static CommonAssetType lookupTable[static_cast(ASSET_TYPE_COUNT)]{ + CommonAssetType::XMODEL_PIECES, // ASSET_TYPE_XMODELPIECES + CommonAssetType::PHYS_PRESET, // ASSET_TYPE_PHYSPRESET + CommonAssetType::PHYS_CONSTRAINTS, // ASSET_TYPE_PHYSCONSTRAINTS + CommonAssetType::DESTRUCTIBLE_DEF, // ASSET_TYPE_DESTRUCTIBLEDEF + CommonAssetType::XANIM, // ASSET_TYPE_XANIMPARTS + CommonAssetType::XMODEL, // ASSET_TYPE_XMODEL + CommonAssetType::MATERIAL, // ASSET_TYPE_MATERIAL + CommonAssetType::TECHNIQUE_SET, // ASSET_TYPE_TECHNIQUE_SET + CommonAssetType::IMAGE, // ASSET_TYPE_IMAGE + CommonAssetType::SOUND, // ASSET_TYPE_SOUND + CommonAssetType::SOUND_PATCH, // ASSET_TYPE_SOUND_PATCH + CommonAssetType::CLIP_MAP, // ASSET_TYPE_CLIPMAP + CommonAssetType::CLIP_MAP, // ASSET_TYPE_CLIPMAP_PVS + CommonAssetType::COM_WORLD, // ASSET_TYPE_COMWORLD + CommonAssetType::GAME_WORLD_SP, // ASSET_TYPE_GAMEWORLD_SP + CommonAssetType::GAME_WORLD_MP, // ASSET_TYPE_GAMEWORLD_MP + CommonAssetType::MAP_ENTS, // ASSET_TYPE_MAP_ENTS + CommonAssetType::GFX_WORLD, // ASSET_TYPE_GFXWORLD + CommonAssetType::LIGHT_DEF, // ASSET_TYPE_LIGHT_DEF + CommonAssetType::UI_MAP, // ASSET_TYPE_UI_MAP + CommonAssetType::FONT, // ASSET_TYPE_FONT + CommonAssetType::MENULIST, // ASSET_TYPE_MENULIST + CommonAssetType::MENU, // ASSET_TYPE_MENU + CommonAssetType::LOCALIZE_ENTRY, // ASSET_TYPE_LOCALIZE_ENTRY + CommonAssetType::WEAPON, // ASSET_TYPE_WEAPON + CommonAssetType::WEAPON_DEF, // ASSET_TYPE_WEAPONDEF + CommonAssetType::WEAPON_VARIANT, // ASSET_TYPE_WEAPON_VARIANT + CommonAssetType::SOUND_DRIVER_GLOBALS, // ASSET_TYPE_SNDDRIVER_GLOBALS + CommonAssetType::FX, // ASSET_TYPE_FX + CommonAssetType::IMPACT_FX, // ASSET_TYPE_IMPACT_FX + CommonAssetType::AI_TYPE, // ASSET_TYPE_AITYPE + CommonAssetType::MP_TYPE, // ASSET_TYPE_MPTYPE + CommonAssetType::MP_BODY, // ASSET_TYPE_MPBODY + CommonAssetType::MP_HEAD, // ASSET_TYPE_MPHEAD + CommonAssetType::CHARACTER, // ASSET_TYPE_CHARACTER + CommonAssetType::XMODEL_ALIAS, // ASSET_TYPE_XMODELALIAS + CommonAssetType::RAW_FILE, // ASSET_TYPE_RAWFILE + CommonAssetType::STRING_TABLE, // ASSET_TYPE_STRINGTABLE + CommonAssetType::PACK_INDEX, // ASSET_TYPE_PACK_INDEX + CommonAssetType::XGLOBALS, // ASSET_TYPE_XGLOBALS + CommonAssetType::DDL, // ASSET_TYPE_DDL + CommonAssetType::GLASSES, // ASSET_TYPE_GLASSES + CommonAssetType::EMBLEM_SET, // ASSET_TYPE_EMBLEMSET + }; + + assert(gameAssetType < ASSET_TYPE_COUNT); + return lookupTable[gameAssetType]; + } + + std::optional CommonAssetTypeMapper::CommonToGameAssetType(const CommonAssetType commonAssetType) const + { +#define MAP_COMMON(common, game) \ + case common: \ + return game; + + switch (commonAssetType) + { + MAP_COMMON(CommonAssetType::XMODEL_PIECES, ASSET_TYPE_XMODELPIECES) + MAP_COMMON(CommonAssetType::PHYS_PRESET, ASSET_TYPE_PHYSPRESET) + MAP_COMMON(CommonAssetType::PHYS_CONSTRAINTS, ASSET_TYPE_PHYSCONSTRAINTS) + MAP_COMMON(CommonAssetType::DESTRUCTIBLE_DEF, ASSET_TYPE_DESTRUCTIBLEDEF) + MAP_COMMON(CommonAssetType::XANIM, ASSET_TYPE_XANIMPARTS) + MAP_COMMON(CommonAssetType::XMODEL, ASSET_TYPE_XMODEL) + MAP_COMMON(CommonAssetType::MATERIAL, ASSET_TYPE_MATERIAL) + MAP_COMMON(CommonAssetType::TECHNIQUE_SET, ASSET_TYPE_TECHNIQUE_SET) + MAP_COMMON(CommonAssetType::IMAGE, ASSET_TYPE_IMAGE) + MAP_COMMON(CommonAssetType::SOUND, ASSET_TYPE_SOUND) + MAP_COMMON(CommonAssetType::SOUND_PATCH, ASSET_TYPE_SOUND_PATCH) + MAP_COMMON(CommonAssetType::CLIP_MAP, ASSET_TYPE_CLIPMAP_PVS) + MAP_COMMON(CommonAssetType::COM_WORLD, ASSET_TYPE_COMWORLD) + MAP_COMMON(CommonAssetType::GAME_WORLD_SP, ASSET_TYPE_GAMEWORLD_SP) + MAP_COMMON(CommonAssetType::GAME_WORLD_MP, ASSET_TYPE_GAMEWORLD_MP) + MAP_COMMON(CommonAssetType::MAP_ENTS, ASSET_TYPE_MAP_ENTS) + MAP_COMMON(CommonAssetType::GFX_WORLD, ASSET_TYPE_GFXWORLD) + MAP_COMMON(CommonAssetType::LIGHT_DEF, ASSET_TYPE_LIGHT_DEF) + MAP_COMMON(CommonAssetType::UI_MAP, ASSET_TYPE_UI_MAP) + MAP_COMMON(CommonAssetType::FONT, ASSET_TYPE_FONT) + MAP_COMMON(CommonAssetType::MENULIST, ASSET_TYPE_MENULIST) + MAP_COMMON(CommonAssetType::MENU, ASSET_TYPE_MENU) + MAP_COMMON(CommonAssetType::LOCALIZE_ENTRY, ASSET_TYPE_LOCALIZE_ENTRY) + MAP_COMMON(CommonAssetType::WEAPON, ASSET_TYPE_WEAPON) + MAP_COMMON(CommonAssetType::WEAPON_DEF, ASSET_TYPE_WEAPONDEF) + MAP_COMMON(CommonAssetType::WEAPON_VARIANT, ASSET_TYPE_WEAPON_VARIANT) + MAP_COMMON(CommonAssetType::SOUND_DRIVER_GLOBALS, ASSET_TYPE_SNDDRIVER_GLOBALS) + MAP_COMMON(CommonAssetType::FX, ASSET_TYPE_FX) + MAP_COMMON(CommonAssetType::IMPACT_FX, ASSET_TYPE_IMPACT_FX) + MAP_COMMON(CommonAssetType::AI_TYPE, ASSET_TYPE_AITYPE) + MAP_COMMON(CommonAssetType::MP_TYPE, ASSET_TYPE_MPTYPE) + MAP_COMMON(CommonAssetType::MP_BODY, ASSET_TYPE_MPBODY) + MAP_COMMON(CommonAssetType::MP_HEAD, ASSET_TYPE_MPHEAD) + MAP_COMMON(CommonAssetType::CHARACTER, ASSET_TYPE_CHARACTER) + MAP_COMMON(CommonAssetType::XMODEL_ALIAS, ASSET_TYPE_XMODELALIAS) + MAP_COMMON(CommonAssetType::RAW_FILE, ASSET_TYPE_RAWFILE) + MAP_COMMON(CommonAssetType::STRING_TABLE, ASSET_TYPE_STRINGTABLE) + MAP_COMMON(CommonAssetType::PACK_INDEX, ASSET_TYPE_PACK_INDEX) + MAP_COMMON(CommonAssetType::XGLOBALS, ASSET_TYPE_XGLOBALS) + MAP_COMMON(CommonAssetType::DDL, ASSET_TYPE_DDL) + MAP_COMMON(CommonAssetType::GLASSES, ASSET_TYPE_GLASSES) + MAP_COMMON(CommonAssetType::EMBLEM_SET, ASSET_TYPE_EMBLEMSET) + + default: + return std::nullopt; + } + +#undef MAP_COMMON + } +} // namespace T5 diff --git a/src/Common/Game/T5/CommonAssetT5.h b/src/Common/Game/T5/CommonAssetT5.h new file mode 100644 index 00000000..551f8255 --- /dev/null +++ b/src/Common/Game/T5/CommonAssetT5.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Game/CommonAsset.h" + +namespace T5 +{ + class CommonAssetTypeMapper final : public ICommonAssetTypeMapper + { + public: + CommonAssetTypeMapper(); + + [[nodiscard]] CommonAssetType GameToCommonAssetType(asset_type_t gameAssetType) const override; + [[nodiscard]] std::optional CommonToGameAssetType(CommonAssetType commonAssetType) const override; + }; +} // namespace T5 diff --git a/src/Common/Game/T6/CommonAssetT6.cpp b/src/Common/Game/T6/CommonAssetT6.cpp new file mode 100644 index 00000000..c344a55d --- /dev/null +++ b/src/Common/Game/T6/CommonAssetT6.cpp @@ -0,0 +1,154 @@ +#include "CommonAssetT6.h" + +#include "T6.h" + +#include + +namespace T6 +{ + CommonAssetTypeMapper::CommonAssetTypeMapper() = default; + + CommonAssetType CommonAssetTypeMapper::GameToCommonAssetType(const asset_type_t gameAssetType) const + { + static CommonAssetType lookupTable[static_cast(ASSET_TYPE_COUNT)]{ + CommonAssetType::XMODEL_PIECES, // ASSET_TYPE_XMODELPIECES + CommonAssetType::PHYS_PRESET, // ASSET_TYPE_PHYSPRESET + CommonAssetType::PHYS_CONSTRAINTS, // ASSET_TYPE_PHYSCONSTRAINTS + CommonAssetType::DESTRUCTIBLE_DEF, // ASSET_TYPE_DESTRUCTIBLEDEF + CommonAssetType::XANIM, // ASSET_TYPE_XANIMPARTS + CommonAssetType::XMODEL, // ASSET_TYPE_XMODEL + CommonAssetType::MATERIAL, // ASSET_TYPE_MATERIAL + CommonAssetType::TECHNIQUE_SET, // ASSET_TYPE_TECHNIQUE_SET + CommonAssetType::IMAGE, // ASSET_TYPE_IMAGE + CommonAssetType::SOUND, // ASSET_TYPE_SOUND + CommonAssetType::SOUND_PATCH, // ASSET_TYPE_SOUND_PATCH + CommonAssetType::CLIP_MAP, // ASSET_TYPE_CLIPMAP + CommonAssetType::CLIP_MAP, // ASSET_TYPE_CLIPMAP_PVS + CommonAssetType::COM_WORLD, // ASSET_TYPE_COMWORLD + CommonAssetType::GAME_WORLD_SP, // ASSET_TYPE_GAMEWORLD_SP + CommonAssetType::GAME_WORLD_MP, // ASSET_TYPE_GAMEWORLD_MP + CommonAssetType::MAP_ENTS, // ASSET_TYPE_MAP_ENTS + CommonAssetType::GFX_WORLD, // ASSET_TYPE_GFXWORLD + CommonAssetType::LIGHT_DEF, // ASSET_TYPE_LIGHT_DEF + CommonAssetType::UI_MAP, // ASSET_TYPE_UI_MAP + CommonAssetType::FONT, // ASSET_TYPE_FONT + CommonAssetType::FONT_ICON, // ASSET_TYPE_FONTICON + CommonAssetType::MENULIST, // ASSET_TYPE_MENULIST + CommonAssetType::MENU, // ASSET_TYPE_MENU + CommonAssetType::LOCALIZE_ENTRY, // ASSET_TYPE_LOCALIZE_ENTRY + CommonAssetType::WEAPON, // ASSET_TYPE_WEAPON + CommonAssetType::WEAPON_DEF, // ASSET_TYPE_WEAPONDEF + CommonAssetType::WEAPON_VARIANT, // ASSET_TYPE_WEAPON_VARIANT + CommonAssetType::WEAPON_FULL, // ASSET_TYPE_WEAPON_FULL + CommonAssetType::ATTACHMENT, // ASSET_TYPE_ATTACHMENT + CommonAssetType::ATTACHMENT_UNIQUE, // ASSET_TYPE_ATTACHMENT_UNIQUE + CommonAssetType::WEAPON_CAMO, // ASSET_TYPE_WEAPON_CAMO + CommonAssetType::SOUND_DRIVER_GLOBALS, // ASSET_TYPE_SNDDRIVER_GLOBALS + CommonAssetType::FX, // ASSET_TYPE_FX + CommonAssetType::IMPACT_FX, // ASSET_TYPE_IMPACT_FX + CommonAssetType::AI_TYPE, // ASSET_TYPE_AITYPE + CommonAssetType::MP_TYPE, // ASSET_TYPE_MPTYPE + CommonAssetType::MP_BODY, // ASSET_TYPE_MPBODY + CommonAssetType::MP_HEAD, // ASSET_TYPE_MPHEAD + CommonAssetType::CHARACTER, // ASSET_TYPE_CHARACTER + CommonAssetType::XMODEL_ALIAS, // ASSET_TYPE_XMODELALIAS + CommonAssetType::RAW_FILE, // ASSET_TYPE_RAWFILE + CommonAssetType::STRING_TABLE, // ASSET_TYPE_STRINGTABLE + CommonAssetType::LEADERBOARD, // ASSET_TYPE_LEADERBOARD + CommonAssetType::XGLOBALS, // ASSET_TYPE_XGLOBALS + CommonAssetType::DDL, // ASSET_TYPE_DDL + CommonAssetType::GLASSES, // ASSET_TYPE_GLASSES + CommonAssetType::EMBLEM_SET, // ASSET_TYPE_EMBLEMSET + CommonAssetType::SCRIPT, // ASSET_TYPE_SCRIPTPARSETREE + CommonAssetType::KEY_VALUE_PAIRS, // ASSET_TYPE_KEYVALUEPAIRS + CommonAssetType::VEHICLE, // ASSET_TYPE_VEHICLEDEF + CommonAssetType::MEMORY_BLOCK, // ASSET_TYPE_MEMORYBLOCK + CommonAssetType::ADDON_MAP_ENTS, // ASSET_TYPE_ADDON_MAP_ENTS + CommonAssetType::TRACER, // ASSET_TYPE_TRACER + CommonAssetType::SKINNED_VERTS, // ASSET_TYPE_SKINNEDVERTS + CommonAssetType::QDB, // ASSET_TYPE_QDB + CommonAssetType::SLUG, // ASSET_TYPE_SLUG + CommonAssetType::FOOTSTEP_TABLE, // ASSET_TYPE_FOOTSTEP_TABLE + CommonAssetType::FOOTSTEP_FX_TABLE, // ASSET_TYPE_FOOTSTEPFX_TABLE + CommonAssetType::ZBARRIER, // ASSET_TYPE_ZBARRIER + }; + + assert(gameAssetType < ASSET_TYPE_COUNT); + return lookupTable[gameAssetType]; + } + + std::optional CommonAssetTypeMapper::CommonToGameAssetType(const CommonAssetType commonAssetType) const + { +#define MAP_COMMON(common, game) \ + case common: \ + return game; + + switch (commonAssetType) + { + MAP_COMMON(CommonAssetType::XMODEL_PIECES, ASSET_TYPE_XMODELPIECES) + MAP_COMMON(CommonAssetType::PHYS_PRESET, ASSET_TYPE_PHYSPRESET) + MAP_COMMON(CommonAssetType::PHYS_CONSTRAINTS, ASSET_TYPE_PHYSCONSTRAINTS) + MAP_COMMON(CommonAssetType::DESTRUCTIBLE_DEF, ASSET_TYPE_DESTRUCTIBLEDEF) + MAP_COMMON(CommonAssetType::XANIM, ASSET_TYPE_XANIMPARTS) + MAP_COMMON(CommonAssetType::XMODEL, ASSET_TYPE_XMODEL) + MAP_COMMON(CommonAssetType::MATERIAL, ASSET_TYPE_MATERIAL) + MAP_COMMON(CommonAssetType::TECHNIQUE_SET, ASSET_TYPE_TECHNIQUE_SET) + MAP_COMMON(CommonAssetType::IMAGE, ASSET_TYPE_IMAGE) + MAP_COMMON(CommonAssetType::SOUND, ASSET_TYPE_SOUND) + MAP_COMMON(CommonAssetType::SOUND_PATCH, ASSET_TYPE_SOUND_PATCH) + MAP_COMMON(CommonAssetType::CLIP_MAP, ASSET_TYPE_CLIPMAP_PVS) + MAP_COMMON(CommonAssetType::COM_WORLD, ASSET_TYPE_COMWORLD) + MAP_COMMON(CommonAssetType::GAME_WORLD_SP, ASSET_TYPE_GAMEWORLD_SP) + MAP_COMMON(CommonAssetType::GAME_WORLD_MP, ASSET_TYPE_GAMEWORLD_MP) + MAP_COMMON(CommonAssetType::MAP_ENTS, ASSET_TYPE_MAP_ENTS) + MAP_COMMON(CommonAssetType::GFX_WORLD, ASSET_TYPE_GFXWORLD) + MAP_COMMON(CommonAssetType::LIGHT_DEF, ASSET_TYPE_LIGHT_DEF) + MAP_COMMON(CommonAssetType::UI_MAP, ASSET_TYPE_UI_MAP) + MAP_COMMON(CommonAssetType::FONT, ASSET_TYPE_FONT) + MAP_COMMON(CommonAssetType::FONT_ICON, ASSET_TYPE_FONTICON) + MAP_COMMON(CommonAssetType::MENULIST, ASSET_TYPE_MENULIST) + MAP_COMMON(CommonAssetType::MENU, ASSET_TYPE_MENU) + MAP_COMMON(CommonAssetType::LOCALIZE_ENTRY, ASSET_TYPE_LOCALIZE_ENTRY) + MAP_COMMON(CommonAssetType::WEAPON, ASSET_TYPE_WEAPON) + MAP_COMMON(CommonAssetType::WEAPON_DEF, ASSET_TYPE_WEAPONDEF) + MAP_COMMON(CommonAssetType::WEAPON_VARIANT, ASSET_TYPE_WEAPON_VARIANT) + MAP_COMMON(CommonAssetType::WEAPON_FULL, ASSET_TYPE_WEAPON_FULL) + MAP_COMMON(CommonAssetType::ATTACHMENT, ASSET_TYPE_ATTACHMENT) + MAP_COMMON(CommonAssetType::ATTACHMENT_UNIQUE, ASSET_TYPE_ATTACHMENT_UNIQUE) + MAP_COMMON(CommonAssetType::WEAPON_CAMO, ASSET_TYPE_WEAPON_CAMO) + MAP_COMMON(CommonAssetType::SOUND_DRIVER_GLOBALS, ASSET_TYPE_SNDDRIVER_GLOBALS) + MAP_COMMON(CommonAssetType::FX, ASSET_TYPE_FX) + MAP_COMMON(CommonAssetType::IMPACT_FX, ASSET_TYPE_IMPACT_FX) + MAP_COMMON(CommonAssetType::AI_TYPE, ASSET_TYPE_AITYPE) + MAP_COMMON(CommonAssetType::MP_TYPE, ASSET_TYPE_MPTYPE) + MAP_COMMON(CommonAssetType::MP_BODY, ASSET_TYPE_MPBODY) + MAP_COMMON(CommonAssetType::MP_HEAD, ASSET_TYPE_MPHEAD) + MAP_COMMON(CommonAssetType::CHARACTER, ASSET_TYPE_CHARACTER) + MAP_COMMON(CommonAssetType::XMODEL_ALIAS, ASSET_TYPE_XMODELALIAS) + MAP_COMMON(CommonAssetType::RAW_FILE, ASSET_TYPE_RAWFILE) + MAP_COMMON(CommonAssetType::STRING_TABLE, ASSET_TYPE_STRINGTABLE) + MAP_COMMON(CommonAssetType::LEADERBOARD, ASSET_TYPE_LEADERBOARD) + MAP_COMMON(CommonAssetType::XGLOBALS, ASSET_TYPE_XGLOBALS) + MAP_COMMON(CommonAssetType::DDL, ASSET_TYPE_DDL) + MAP_COMMON(CommonAssetType::GLASSES, ASSET_TYPE_GLASSES) + MAP_COMMON(CommonAssetType::EMBLEM_SET, ASSET_TYPE_EMBLEMSET) + MAP_COMMON(CommonAssetType::SCRIPT, ASSET_TYPE_SCRIPTPARSETREE) + MAP_COMMON(CommonAssetType::KEY_VALUE_PAIRS, ASSET_TYPE_KEYVALUEPAIRS) + MAP_COMMON(CommonAssetType::VEHICLE, ASSET_TYPE_VEHICLEDEF) + MAP_COMMON(CommonAssetType::MEMORY_BLOCK, ASSET_TYPE_MEMORYBLOCK) + MAP_COMMON(CommonAssetType::ADDON_MAP_ENTS, ASSET_TYPE_ADDON_MAP_ENTS) + MAP_COMMON(CommonAssetType::TRACER, ASSET_TYPE_TRACER) + MAP_COMMON(CommonAssetType::SKINNED_VERTS, ASSET_TYPE_SKINNEDVERTS) + MAP_COMMON(CommonAssetType::QDB, ASSET_TYPE_QDB) + MAP_COMMON(CommonAssetType::SLUG, ASSET_TYPE_SLUG) + MAP_COMMON(CommonAssetType::FOOTSTEP_TABLE, ASSET_TYPE_FOOTSTEP_TABLE) + MAP_COMMON(CommonAssetType::FOOTSTEP_FX_TABLE, ASSET_TYPE_FOOTSTEPFX_TABLE) + MAP_COMMON(CommonAssetType::ZBARRIER, ASSET_TYPE_ZBARRIER) + + default: + return std::nullopt; + } + +#undef MAP_COMMON + } +} // namespace T6 diff --git a/src/Common/Game/T6/CommonAssetT6.h b/src/Common/Game/T6/CommonAssetT6.h new file mode 100644 index 00000000..a6b5d242 --- /dev/null +++ b/src/Common/Game/T6/CommonAssetT6.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Game/CommonAsset.h" + +namespace T6 +{ + class CommonAssetTypeMapper final : public ICommonAssetTypeMapper + { + public: + CommonAssetTypeMapper(); + + [[nodiscard]] CommonAssetType GameToCommonAssetType(asset_type_t gameAssetType) const override; + [[nodiscard]] std::optional CommonToGameAssetType(CommonAssetType commonAssetType) const override; + }; +} // namespace T6 diff --git a/src/ModMan/Web/Binds/AssetBinds.cpp b/src/ModMan/Web/Binds/AssetBinds.cpp new file mode 100644 index 00000000..707482c5 --- /dev/null +++ b/src/ModMan/Web/Binds/AssetBinds.cpp @@ -0,0 +1,156 @@ +#include "AssetBinds.h" + +#include "Context/ModManContext.h" +#include "Game/CommonAsset.h" +#include "Web/UiCommunication.h" + +#include "Json/JsonExtension.h" +#include + +NLOHMANN_JSON_SERIALIZE_ENUM(CommonAssetType, + { + {CommonAssetType::PHYS_PRESET, "PHYS_PRESET" }, + {CommonAssetType::XANIM, "XANIM" }, + {CommonAssetType::XMODEL, "XMODEL" }, + {CommonAssetType::MATERIAL, "MATERIAL" }, + {CommonAssetType::TECHNIQUE_SET, "TECHNIQUE_SET" }, + {CommonAssetType::IMAGE, "IMAGE" }, + {CommonAssetType::SOUND, "SOUND" }, + {CommonAssetType::SOUND_CURVE, "SOUND_CURVE" }, + {CommonAssetType::LOADED_SOUND, "LOADED_SOUND" }, + {CommonAssetType::CLIP_MAP, "CLIP_MAP" }, + {CommonAssetType::COM_WORLD, "COM_WORLD" }, + {CommonAssetType::GAME_WORLD_SP, "GAME_WORLD_SP" }, + {CommonAssetType::GAME_WORLD_MP, "GAME_WORLD_MP" }, + {CommonAssetType::MAP_ENTS, "MAP_ENTS" }, + {CommonAssetType::GFX_WORLD, "GFX_WORLD" }, + {CommonAssetType::LIGHT_DEF, "LIGHT_DEF" }, + {CommonAssetType::UI_MAP, "UI_MAP" }, + {CommonAssetType::FONT, "FONT" }, + {CommonAssetType::MENULIST, "MENULIST" }, + {CommonAssetType::MENU, "MENU" }, + {CommonAssetType::LOCALIZE_ENTRY, "LOCALIZE_ENTRY" }, + {CommonAssetType::WEAPON, "WEAPON" }, + {CommonAssetType::SOUND_DRIVER_GLOBALS, "SOUND_DRIVER_GLOBALS"}, + {CommonAssetType::FX, "FX" }, + {CommonAssetType::IMPACT_FX, "IMPACT_FX" }, + {CommonAssetType::AI_TYPE, "AI_TYPE" }, + {CommonAssetType::MP_TYPE, "MP_TYPE" }, + {CommonAssetType::CHARACTER, "CHARACTER" }, + {CommonAssetType::XMODEL_ALIAS, "XMODEL_ALIAS" }, + {CommonAssetType::RAW_FILE, "RAW_FILE" }, + {CommonAssetType::STRING_TABLE, "STRING_TABLE" }, + {CommonAssetType::XMODEL_PIECES, "XMODEL_PIECES" }, + {CommonAssetType::PHYS_COLL_MAP, "PHYS_COLL_MAP" }, + {CommonAssetType::XMODEL_SURFS, "XMODEL_SURFS" }, + {CommonAssetType::PIXEL_SHADER, "PIXEL_SHADER" }, + {CommonAssetType::VERTEX_SHADER, "VERTEX_SHADER" }, + {CommonAssetType::VERTEX_DECL, "VERTEX_DECL" }, + {CommonAssetType::FX_WORLD, "FX_WORLD" }, + {CommonAssetType::LEADERBOARD, "LEADERBOARD" }, + {CommonAssetType::STRUCTURED_DATA_DEF, "STRUCTURED_DATA_DEF" }, + {CommonAssetType::TRACER, "TRACER" }, + {CommonAssetType::VEHICLE, "VEHICLE" }, + {CommonAssetType::ADDON_MAP_ENTS, "ADDON_MAP_ENTS" }, + {CommonAssetType::GLASS_WORLD, "GLASS_WORLD" }, + {CommonAssetType::PATH_DATA, "PATH_DATA" }, + {CommonAssetType::VEHICLE_TRACK, "VEHICLE_TRACK" }, + {CommonAssetType::ATTACHMENT, "ATTACHMENT" }, + {CommonAssetType::SURFACE_FX, "SURFACE_FX" }, + {CommonAssetType::SCRIPT, "SCRIPT" }, + {CommonAssetType::PHYS_CONSTRAINTS, "PHYS_CONSTRAINTS" }, + {CommonAssetType::DESTRUCTIBLE_DEF, "DESTRUCTIBLE_DEF" }, + {CommonAssetType::SOUND_PATCH, "SOUND_PATCH" }, + {CommonAssetType::WEAPON_DEF, "WEAPON_DEF" }, + {CommonAssetType::WEAPON_VARIANT, "WEAPON_VARIANT" }, + {CommonAssetType::MP_BODY, "MP_BODY" }, + {CommonAssetType::MP_HEAD, "MP_HEAD" }, + {CommonAssetType::PACK_INDEX, "PACK_INDEX" }, + {CommonAssetType::XGLOBALS, "XGLOBALS" }, + {CommonAssetType::DDL, "DDL" }, + {CommonAssetType::GLASSES, "GLASSES" }, + {CommonAssetType::EMBLEM_SET, "EMBLEM_SET" }, + {CommonAssetType::FONT_ICON, "FONT_ICON" }, + {CommonAssetType::WEAPON_FULL, "WEAPON_FULL" }, + {CommonAssetType::ATTACHMENT_UNIQUE, "ATTACHMENT_UNIQUE" }, + {CommonAssetType::WEAPON_CAMO, "WEAPON_CAMO" }, + {CommonAssetType::KEY_VALUE_PAIRS, "KEY_VALUE_PAIRS" }, + {CommonAssetType::MEMORY_BLOCK, "MEMORY_BLOCK" }, + {CommonAssetType::SKINNED_VERTS, "SKINNED_VERTS" }, + {CommonAssetType::QDB, "QDB" }, + {CommonAssetType::SLUG, "SLUG" }, + {CommonAssetType::FOOTSTEP_TABLE, "FOOTSTEP_TABLE" }, + {CommonAssetType::FOOTSTEP_FX_TABLE, "FOOTSTEP_FX_TABLE" }, + {CommonAssetType::ZBARRIER, "ZBARRIER" }, +}); + +namespace +{ + class AssetDto + { + public: + CommonAssetType type; + std::string name; + }; + + NLOHMANN_DEFINE_TYPE_EXTENSION(AssetDto, type, name); + + class ZoneAssetsDto + { + public: + std::vector assets; + }; + + NLOHMANN_DEFINE_TYPE_EXTENSION(ZoneAssetsDto, assets); + + ZoneAssetsDto CreateZoneAssetsDto(const Zone& zone) + { + std::vector assets; + + const auto& assetTypeMapper = *ICommonAssetTypeMapper::GetCommonAssetMapperByGame(zone.m_game_id); + for (const auto& asset : *zone.m_pools) + { + assets.emplace_back(AssetDto{ + .type = assetTypeMapper.GameToCommonAssetType(asset->m_type), + .name = asset->m_name, + }); + } + + return ZoneAssetsDto{ + .assets = std::move(assets), + }; + } + + ZoneAssetsDto GetZonesForZone(const std::string& zoneName) + { + auto& context = ModManContext::Get().m_fast_file; + + ZoneAssetsDto result; + + { + std::shared_lock lock(context.m_zone_lock); + + for (const auto& loadedZone : context.m_loaded_zones) + { + const auto& zone = *loadedZone->m_zone; + if (zone.m_name == zoneName) + return CreateZoneAssetsDto(zone); + } + } + + return ZoneAssetsDto{.assets = std::vector()}; + } +} // namespace + +namespace ui +{ + void RegisterAssetBinds(webview::webview& wv) + { + Bind(wv, + "getAssetsForZone", + [](const std::string& zoneName) + { + return GetZonesForZone(zoneName); + }); + } +} // namespace ui diff --git a/src/ModMan/Web/Binds/AssetBinds.h b/src/ModMan/Web/Binds/AssetBinds.h new file mode 100644 index 00000000..282e2a5d --- /dev/null +++ b/src/ModMan/Web/Binds/AssetBinds.h @@ -0,0 +1,8 @@ +#pragma once + +#include "Web/WebViewLib.h" + +namespace ui +{ + void RegisterAssetBinds(webview::webview& wv); +} // namespace ui diff --git a/src/ModMan/Web/Binds/Binds.cpp b/src/ModMan/Web/Binds/Binds.cpp index 7ae5ab9c..e1a13a8c 100644 --- a/src/ModMan/Web/Binds/Binds.cpp +++ b/src/ModMan/Web/Binds/Binds.cpp @@ -1,13 +1,15 @@ #include "Binds.h" +#include "AssetBinds.h" +#include "DialogBinds.h" #include "UnlinkingBinds.h" -#include "Web/Binds/DialogBinds.h" #include "ZoneBinds.h" namespace ui { void RegisterAllBinds(webview::webview& wv) { + RegisterAssetBinds(wv); RegisterDialogHandlerBinds(wv); RegisterUnlinkingBinds(wv); RegisterZoneBinds(wv);