#include "GameAssetPoolIW4.h" #include "Pool/AssetPoolDynamic.h" #include "Pool/AssetPoolStatic.h" #include #include using namespace IW4; const char* GameAssetPoolIW4::ASSET_TYPE_NAMES[]{ "physpreset", "physcollmap", "xanim", "xmodelsurfs", "xmodel", "material", "pixelshader", "vertexshader", "vertexdecl", "techniqueset", "image", "sound", "soundcurve", "loadedsound", "clipmap", "clipmap", "comworld", "gameworldsp", "gameworldmp", "mapents", "fxworld", "gfxworld", "lightdef", "uimap", "font", "menulist", "menu", "localize", "weapon", "snddriverglobals", "fx", "impactfx", "aitype", "mptype", "character", "xmodelalias", "rawfile", "stringtable", "leaderboard", "structureddatadef", "tracer", "vehicle", "addonmapents"}; /* Asset Pool Table Useful for macro generation via regex-replace for example #assetType, #typeName, #unionEntry, #poolName ASSET_TYPE_PHYSPRESET, PhysPreset, physPreset, m_phys_preset ASSET_TYPE_PHYSCOLLMAP, PhysCollmap, physCollmap, m_phys_collmap ASSET_TYPE_XANIMPARTS, XAnimParts, parts, m_xanim_parts ASSET_TYPE_XMODEL, XModel, model, m_xmodel ASSET_TYPE_MATERIAL, Material, material, m_material ASSET_TYPE_PIXELSHADER, MaterialPixelShader, pixelShader, m_material_pixel_shader ASSET_TYPE_VERTEXSHADER, MaterialVertexShader, vertexShader, m_material_vertex_shader ASSET_TYPE_VERTEXDECL, MaterialVertexDeclaration, vertexDecl, m_material_vertex_decl ASSET_TYPE_TECHNIQUE_SET, MaterialTechniqueSet, techniqueSet, m_technique_set ASSET_TYPE_IMAGE, GfxImage, image, m_image ASSET_TYPE_SOUND, snd_alias_list_t, sound, m_sound ASSET_TYPE_SOUND_CURVE, SndCurve, sndCurve, m_sound_curve ASSET_TYPE_LOADED_SOUND, LoadedSound, loadSnd, m_loaded_sound ASSET_TYPE_CLIPMAP_SP, clipMap_t, clipMap, m_clip_map ASSET_TYPE_CLIPMAP_MP, clipMap_t, clipMap, m_clip_map ASSET_TYPE_COMWORLD, ComWorld, comWorld, m_com_world ASSET_TYPE_GAMEWORLD_SP, GameWorldSp, gameWorldSp, m_game_world_sp ASSET_TYPE_GAMEWORLD_MP, GameWorldMp, gameWorldMp, m_game_world_mp ASSET_TYPE_MAP_ENTS, MapEnts, mapEnts, m_map_ents ASSET_TYPE_FXWORLD, FxWorld, fxWorld, m_fx_world ASSET_TYPE_GFXWORLD, GfxWorld, gfxWorld, m_gfx_world ASSET_TYPE_LIGHT_DEF, GfxLightDef, lightDef, m_gfx_light_def ASSET_TYPE_FONT, Font_s, font, m_font ASSET_TYPE_MENULIST, MenuList, menuList, m_menu_list ASSET_TYPE_MENU, menuDef_t, menu, m_menu_def ASSET_TYPE_LOCALIZE_ENTRY, LocalizeEntry, localize, m_localize ASSET_TYPE_WEAPON, WeaponCompleteDef, weapon, m_weapon ASSET_TYPE_SNDDRIVER_GLOBALS, SndDriverGlobals, sndDriverGlobals, m_snd_driver_globals ASSET_TYPE_FX, FxEffectDef, fx, m_fx ASSET_TYPE_IMPACT_FX, FxImpactTable, impactFx, m_fx_impact_table ASSET_TYPE_RAWFILE, RawFile, rawfile, m_raw_file ASSET_TYPE_STRINGTABLE, StringTable, stringTable, m_string_table ASSET_TYPE_LEADERBOARD, LeaderboardDef, leaderboardDef, m_leaderboard ASSET_TYPE_STRUCTURED_DATA_DEF, StructuredDataDefSet, structuredDataDefSet, m_structed_data_def_set ASSET_TYPE_TRACER, TracerDef, tracerDef, m_tracer ASSET_TYPE_VEHICLE, VehicleDef, vehDef, m_vehicle ASSET_TYPE_ADDON_MAP_ENTS, AddonMapEnts, addonMapEnts, m_addon_map_ents */ GameAssetPoolIW4::GameAssetPoolIW4(Zone* zone, const int priority) : ZoneAssetPools(zone), m_priority(priority) { assert(std::extent::value == ASSET_TYPE_COUNT); } void GameAssetPoolIW4::InitPoolStatic(const asset_type_t type, const size_t capacity) { #define CASE_INIT_POOL_STATIC(assetType, poolName, poolType) \ case assetType: \ { \ if ((poolName) == nullptr && capacity > 0) \ { \ (poolName) = std::make_unique>(capacity, m_priority, (assetType)); \ } \ break; \ } switch (type) { CASE_INIT_POOL_STATIC(ASSET_TYPE_PHYSPRESET, m_phys_preset, PhysPreset); CASE_INIT_POOL_STATIC(ASSET_TYPE_PHYSCOLLMAP, m_phys_collmap, PhysCollmap); CASE_INIT_POOL_STATIC(ASSET_TYPE_XANIMPARTS, m_xanim_parts, XAnimParts); CASE_INIT_POOL_STATIC(ASSET_TYPE_XMODEL, m_xmodel, XModel); CASE_INIT_POOL_STATIC(ASSET_TYPE_MATERIAL, m_material, Material); CASE_INIT_POOL_STATIC(ASSET_TYPE_PIXELSHADER, m_material_pixel_shader, MaterialPixelShader); CASE_INIT_POOL_STATIC(ASSET_TYPE_VERTEXSHADER, m_material_vertex_shader, MaterialVertexShader); CASE_INIT_POOL_STATIC(ASSET_TYPE_VERTEXDECL, m_material_vertex_decl, MaterialVertexDeclaration); CASE_INIT_POOL_STATIC(ASSET_TYPE_TECHNIQUE_SET, m_technique_set, MaterialTechniqueSet); CASE_INIT_POOL_STATIC(ASSET_TYPE_IMAGE, m_image, GfxImage); CASE_INIT_POOL_STATIC(ASSET_TYPE_SOUND, m_sound, snd_alias_list_t); CASE_INIT_POOL_STATIC(ASSET_TYPE_SOUND_CURVE, m_sound_curve, SndCurve); CASE_INIT_POOL_STATIC(ASSET_TYPE_LOADED_SOUND, m_loaded_sound, LoadedSound); CASE_INIT_POOL_STATIC(ASSET_TYPE_CLIPMAP_SP, m_clip_map, clipMap_t); CASE_INIT_POOL_STATIC(ASSET_TYPE_CLIPMAP_MP, m_clip_map, clipMap_t); CASE_INIT_POOL_STATIC(ASSET_TYPE_COMWORLD, m_com_world, ComWorld); CASE_INIT_POOL_STATIC(ASSET_TYPE_GAMEWORLD_SP, m_game_world_sp, GameWorldSp); CASE_INIT_POOL_STATIC(ASSET_TYPE_GAMEWORLD_MP, m_game_world_mp, GameWorldMp); CASE_INIT_POOL_STATIC(ASSET_TYPE_MAP_ENTS, m_map_ents, MapEnts); CASE_INIT_POOL_STATIC(ASSET_TYPE_FXWORLD, m_fx_world, FxWorld); CASE_INIT_POOL_STATIC(ASSET_TYPE_GFXWORLD, m_gfx_world, GfxWorld); CASE_INIT_POOL_STATIC(ASSET_TYPE_LIGHT_DEF, m_gfx_light_def, GfxLightDef); CASE_INIT_POOL_STATIC(ASSET_TYPE_FONT, m_font, Font_s); CASE_INIT_POOL_STATIC(ASSET_TYPE_MENULIST, m_menu_list, MenuList); CASE_INIT_POOL_STATIC(ASSET_TYPE_MENU, m_menu_def, menuDef_t); CASE_INIT_POOL_STATIC(ASSET_TYPE_LOCALIZE_ENTRY, m_localize, LocalizeEntry); CASE_INIT_POOL_STATIC(ASSET_TYPE_WEAPON, m_weapon, WeaponCompleteDef); CASE_INIT_POOL_STATIC(ASSET_TYPE_FX, m_fx, FxEffectDef); CASE_INIT_POOL_STATIC(ASSET_TYPE_IMPACT_FX, m_fx_impact_table, FxImpactTable); CASE_INIT_POOL_STATIC(ASSET_TYPE_RAWFILE, m_raw_file, RawFile); CASE_INIT_POOL_STATIC(ASSET_TYPE_STRINGTABLE, m_string_table, StringTable); CASE_INIT_POOL_STATIC(ASSET_TYPE_LEADERBOARD, m_leaderboard, LeaderboardDef); CASE_INIT_POOL_STATIC(ASSET_TYPE_STRUCTURED_DATA_DEF, m_structed_data_def_set, StructuredDataDefSet); CASE_INIT_POOL_STATIC(ASSET_TYPE_TRACER, m_tracer, TracerDef); CASE_INIT_POOL_STATIC(ASSET_TYPE_VEHICLE, m_vehicle, VehicleDef); CASE_INIT_POOL_STATIC(ASSET_TYPE_ADDON_MAP_ENTS, m_addon_map_ents, AddonMapEnts); default: assert(type >= 0 && type < ASSET_TYPE_COUNT); break; } #undef CASE_INIT_POOL_STATIC } void GameAssetPoolIW4::InitPoolDynamic(const asset_type_t type) { #define CASE_INIT_POOL_DYNAMIC(assetType, poolName, poolType) \ case assetType: \ { \ if ((poolName) == nullptr) \ { \ (poolName) = std::make_unique>(m_priority, (assetType)); \ } \ break; \ } switch (type) { CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_PHYSPRESET, m_phys_preset, PhysPreset); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_PHYSCOLLMAP, m_phys_collmap, PhysCollmap); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_XANIMPARTS, m_xanim_parts, XAnimParts); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_XMODEL, m_xmodel, XModel); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_MATERIAL, m_material, Material); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_PIXELSHADER, m_material_pixel_shader, MaterialPixelShader); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_VERTEXSHADER, m_material_vertex_shader, MaterialVertexShader); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_VERTEXDECL, m_material_vertex_decl, MaterialVertexDeclaration); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_TECHNIQUE_SET, m_technique_set, MaterialTechniqueSet); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_IMAGE, m_image, GfxImage); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_SOUND, m_sound, snd_alias_list_t); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_SOUND_CURVE, m_sound_curve, SndCurve); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_LOADED_SOUND, m_loaded_sound, LoadedSound); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_CLIPMAP_SP, m_clip_map, clipMap_t); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_CLIPMAP_MP, m_clip_map, clipMap_t); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_COMWORLD, m_com_world, ComWorld); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_GAMEWORLD_SP, m_game_world_sp, GameWorldSp); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_GAMEWORLD_MP, m_game_world_mp, GameWorldMp); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_MAP_ENTS, m_map_ents, MapEnts); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_FXWORLD, m_fx_world, FxWorld); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_GFXWORLD, m_gfx_world, GfxWorld); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_LIGHT_DEF, m_gfx_light_def, GfxLightDef); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_FONT, m_font, Font_s); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_MENULIST, m_menu_list, MenuList); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_MENU, m_menu_def, menuDef_t); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_LOCALIZE_ENTRY, m_localize, LocalizeEntry); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_WEAPON, m_weapon, WeaponCompleteDef); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_FX, m_fx, FxEffectDef); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_IMPACT_FX, m_fx_impact_table, FxImpactTable); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_RAWFILE, m_raw_file, RawFile); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_STRINGTABLE, m_string_table, StringTable); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_LEADERBOARD, m_leaderboard, LeaderboardDef); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_STRUCTURED_DATA_DEF, m_structed_data_def_set, StructuredDataDefSet); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_TRACER, m_tracer, TracerDef); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_VEHICLE, m_vehicle, VehicleDef); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_ADDON_MAP_ENTS, m_addon_map_ents, AddonMapEnts); default: assert(type >= 0 && type < ASSET_TYPE_COUNT); break; } #undef CASE_INIT_POOL_STATIC } XAssetInfoGeneric* GameAssetPoolIW4::AddAssetToPool( asset_type_t type, std::string name, void* asset, std::vector dependencies, std::vector usedScriptStrings, Zone* zone) { XAsset xAsset{}; xAsset.type = static_cast(type); xAsset.header.data = asset; #define CASE_ADD_TO_POOL(assetType, poolName, headerName) \ case assetType: \ { \ assert((poolName) != nullptr); \ return (poolName)->AddAsset(std::move(name), xAsset.header.headerName, zone, std::move(dependencies), std::move(usedScriptStrings)); \ } switch (xAsset.type) { CASE_ADD_TO_POOL(ASSET_TYPE_PHYSPRESET, m_phys_preset, physPreset); CASE_ADD_TO_POOL(ASSET_TYPE_PHYSCOLLMAP, m_phys_collmap, physCollmap); CASE_ADD_TO_POOL(ASSET_TYPE_XANIMPARTS, m_xanim_parts, parts); CASE_ADD_TO_POOL(ASSET_TYPE_XMODEL, m_xmodel, model); CASE_ADD_TO_POOL(ASSET_TYPE_MATERIAL, m_material, material); CASE_ADD_TO_POOL(ASSET_TYPE_PIXELSHADER, m_material_pixel_shader, pixelShader); CASE_ADD_TO_POOL(ASSET_TYPE_VERTEXSHADER, m_material_vertex_shader, vertexShader); CASE_ADD_TO_POOL(ASSET_TYPE_VERTEXDECL, m_material_vertex_decl, vertexDecl); CASE_ADD_TO_POOL(ASSET_TYPE_TECHNIQUE_SET, m_technique_set, techniqueSet); CASE_ADD_TO_POOL(ASSET_TYPE_IMAGE, m_image, image); CASE_ADD_TO_POOL(ASSET_TYPE_SOUND, m_sound, sound); CASE_ADD_TO_POOL(ASSET_TYPE_SOUND_CURVE, m_sound_curve, sndCurve); CASE_ADD_TO_POOL(ASSET_TYPE_LOADED_SOUND, m_loaded_sound, loadSnd); CASE_ADD_TO_POOL(ASSET_TYPE_CLIPMAP_SP, m_clip_map, clipMap); CASE_ADD_TO_POOL(ASSET_TYPE_CLIPMAP_MP, m_clip_map, clipMap); CASE_ADD_TO_POOL(ASSET_TYPE_COMWORLD, m_com_world, comWorld); CASE_ADD_TO_POOL(ASSET_TYPE_GAMEWORLD_SP, m_game_world_sp, gameWorldSp); CASE_ADD_TO_POOL(ASSET_TYPE_GAMEWORLD_MP, m_game_world_mp, gameWorldMp); CASE_ADD_TO_POOL(ASSET_TYPE_MAP_ENTS, m_map_ents, mapEnts); CASE_ADD_TO_POOL(ASSET_TYPE_FXWORLD, m_fx_world, fxWorld); CASE_ADD_TO_POOL(ASSET_TYPE_GFXWORLD, m_gfx_world, gfxWorld); CASE_ADD_TO_POOL(ASSET_TYPE_LIGHT_DEF, m_gfx_light_def, lightDef); CASE_ADD_TO_POOL(ASSET_TYPE_FONT, m_font, font); CASE_ADD_TO_POOL(ASSET_TYPE_MENULIST, m_menu_list, menuList); CASE_ADD_TO_POOL(ASSET_TYPE_MENU, m_menu_def, menu); CASE_ADD_TO_POOL(ASSET_TYPE_LOCALIZE_ENTRY, m_localize, localize); CASE_ADD_TO_POOL(ASSET_TYPE_WEAPON, m_weapon, weapon); CASE_ADD_TO_POOL(ASSET_TYPE_FX, m_fx, fx); CASE_ADD_TO_POOL(ASSET_TYPE_IMPACT_FX, m_fx_impact_table, impactFx); CASE_ADD_TO_POOL(ASSET_TYPE_RAWFILE, m_raw_file, rawfile); CASE_ADD_TO_POOL(ASSET_TYPE_STRINGTABLE, m_string_table, stringTable); CASE_ADD_TO_POOL(ASSET_TYPE_LEADERBOARD, m_leaderboard, leaderboardDef); CASE_ADD_TO_POOL(ASSET_TYPE_STRUCTURED_DATA_DEF, m_structed_data_def_set, structuredDataDefSet); CASE_ADD_TO_POOL(ASSET_TYPE_TRACER, m_tracer, tracerDef); CASE_ADD_TO_POOL(ASSET_TYPE_VEHICLE, m_vehicle, vehDef); CASE_ADD_TO_POOL(ASSET_TYPE_ADDON_MAP_ENTS, m_addon_map_ents, addonMapEnts); default: assert(false); break; } return nullptr; #undef CASE_ADD_TO_POOL } XAssetInfoGeneric* GameAssetPoolIW4::GetAsset(const asset_type_t type, std::string name) const { #define CASE_GET_ASSET(assetType, poolName) \ case assetType: \ { \ if ((poolName) != nullptr) \ return (poolName)->GetAsset(std::move(name)); \ break; \ } switch (type) { CASE_GET_ASSET(ASSET_TYPE_PHYSPRESET, m_phys_preset); CASE_GET_ASSET(ASSET_TYPE_PHYSCOLLMAP, m_phys_collmap); CASE_GET_ASSET(ASSET_TYPE_XANIMPARTS, m_xanim_parts); CASE_GET_ASSET(ASSET_TYPE_XMODEL, m_xmodel); CASE_GET_ASSET(ASSET_TYPE_MATERIAL, m_material); CASE_GET_ASSET(ASSET_TYPE_PIXELSHADER, m_material_pixel_shader); CASE_GET_ASSET(ASSET_TYPE_VERTEXSHADER, m_material_vertex_shader); CASE_GET_ASSET(ASSET_TYPE_VERTEXDECL, m_material_vertex_decl); CASE_GET_ASSET(ASSET_TYPE_TECHNIQUE_SET, m_technique_set); CASE_GET_ASSET(ASSET_TYPE_IMAGE, m_image); CASE_GET_ASSET(ASSET_TYPE_SOUND, m_sound); CASE_GET_ASSET(ASSET_TYPE_SOUND_CURVE, m_sound_curve); CASE_GET_ASSET(ASSET_TYPE_LOADED_SOUND, m_loaded_sound); CASE_GET_ASSET(ASSET_TYPE_CLIPMAP_SP, m_clip_map); CASE_GET_ASSET(ASSET_TYPE_CLIPMAP_MP, m_clip_map); CASE_GET_ASSET(ASSET_TYPE_COMWORLD, m_com_world); CASE_GET_ASSET(ASSET_TYPE_GAMEWORLD_SP, m_game_world_sp); CASE_GET_ASSET(ASSET_TYPE_GAMEWORLD_MP, m_game_world_mp); CASE_GET_ASSET(ASSET_TYPE_MAP_ENTS, m_map_ents); CASE_GET_ASSET(ASSET_TYPE_FXWORLD, m_fx_world); CASE_GET_ASSET(ASSET_TYPE_GFXWORLD, m_gfx_world); CASE_GET_ASSET(ASSET_TYPE_LIGHT_DEF, m_gfx_light_def); CASE_GET_ASSET(ASSET_TYPE_FONT, m_font); CASE_GET_ASSET(ASSET_TYPE_MENULIST, m_menu_list); CASE_GET_ASSET(ASSET_TYPE_MENU, m_menu_def); CASE_GET_ASSET(ASSET_TYPE_LOCALIZE_ENTRY, m_localize); CASE_GET_ASSET(ASSET_TYPE_WEAPON, m_weapon); CASE_GET_ASSET(ASSET_TYPE_FX, m_fx); CASE_GET_ASSET(ASSET_TYPE_IMPACT_FX, m_fx_impact_table); CASE_GET_ASSET(ASSET_TYPE_RAWFILE, m_raw_file); CASE_GET_ASSET(ASSET_TYPE_STRINGTABLE, m_string_table); CASE_GET_ASSET(ASSET_TYPE_LEADERBOARD, m_leaderboard); CASE_GET_ASSET(ASSET_TYPE_STRUCTURED_DATA_DEF, m_structed_data_def_set); CASE_GET_ASSET(ASSET_TYPE_TRACER, m_tracer); CASE_GET_ASSET(ASSET_TYPE_VEHICLE, m_vehicle); CASE_GET_ASSET(ASSET_TYPE_ADDON_MAP_ENTS, m_addon_map_ents); default: assert(false); break; } return nullptr; #undef CASE_GET_ASSET } const char* GameAssetPoolIW4::AssetTypeNameByType(asset_type_t assetType) { if (assetType >= 0 && assetType < static_cast(std::extent::value)) return ASSET_TYPE_NAMES[assetType]; return ASSET_TYPE_INVALID; } const char* GameAssetPoolIW4::GetAssetTypeName(const asset_type_t assetType) const { return AssetTypeNameByType(assetType); } asset_type_t GameAssetPoolIW4::AssetTypeCount() { return ASSET_TYPE_COUNT; } asset_type_t GameAssetPoolIW4::GetAssetTypeCount() const { return AssetTypeCount(); }