2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-06-27 03:18:17 +00:00

feat: initial T4 support (#807)

* feat: initial T4 support

* chore: adjust t4 symbols a bit for accuracy

* chore: add PackIndex asset to T4

* chore: remove unused AssetXModelPieces

* chore: add default and global asset pools loader for T4

* chore: use separate defines for T4 in ImageDumper

* chore: remove unnecessary namespaces in gfximage_actions

* chore: small things

* chore: fix T4 PhysPreset type

* chore: use proper XQuat2 type for T4 xanims

* chore: fix errors on T4 types

* chore: use iw3 like struct for XModelStreamInfo

* docs: add basic docs for T4

* chore: add basic ObjCompiler setup for T4

* chore: adjust loaded sound definition

* chore: make sure t4 material has the correct alignment

* chore: make sure t4 uses similar names for assets as other games

* fix: asset references should not be reusable

* chore: add content writer for t4

* feat: add t4 localize loader

* chore: reorder game ids to be alphabetically ordered

---------

Co-authored-by: Jan Laupetin <jan@laupetin.net>
This commit is contained in:
mo
2026-06-07 13:06:33 +01:00
committed by GitHub
parent 04628fc52c
commit 44d6710991
88 changed files with 6787 additions and 18 deletions
+4 -1
View File
@@ -3,6 +3,7 @@
#include "IW3/CommonAssetIW3.h"
#include "IW4/CommonAssetIW4.h"
#include "IW5/CommonAssetIW5.h"
#include "T4/CommonAssetT4.h"
#include "T5/CommonAssetT5.h"
#include "T6/CommonAssetT6.h"
@@ -10,13 +11,15 @@
ICommonAssetTypeMapper* ICommonAssetTypeMapper::GetCommonAssetMapperByGame(GameId gameId)
{
static ICommonAssetTypeMapper* assetTypeMappers[static_cast<unsigned>(GameId::COUNT)]{
static ICommonAssetTypeMapper* assetTypeMappers[]{
new IW3::CommonAssetTypeMapper(),
new IW4::CommonAssetTypeMapper(),
new IW5::CommonAssetTypeMapper(),
new T4::CommonAssetTypeMapper(),
new T5::CommonAssetTypeMapper(),
new T6::CommonAssetTypeMapper(),
};
static_assert(std::extent_v<decltype(assetTypeMappers)> == static_cast<unsigned>(GameId::COUNT));
assert(static_cast<unsigned>(gameId) < static_cast<unsigned>(GameId::COUNT));
auto* result = assetTypeMappers[static_cast<unsigned>(gameId)];
+4 -1
View File
@@ -3,6 +3,7 @@
#include "IW3/GameIW3.h"
#include "IW4/GameIW4.h"
#include "IW5/GameIW5.h"
#include "T4/GameT4.h"
#include "T5/GameT5.h"
#include "T6/GameT6.h"
#include "Utils/StringUtils.h"
@@ -11,13 +12,15 @@
IGame* IGame::GetGameById(GameId gameId)
{
static IGame* games[static_cast<unsigned>(GameId::COUNT)]{
static IGame* games[]{
new IW3::Game(),
new IW4::Game(),
new IW5::Game(),
new T4::Game(),
new T5::Game(),
new T6::Game(),
};
static_assert(std::extent_v<decltype(games)> == static_cast<unsigned>(GameId::COUNT));
assert(static_cast<unsigned>(gameId) < static_cast<unsigned>(GameId::COUNT));
auto* result = games[static_cast<unsigned>(gameId)];
+2
View File
@@ -15,6 +15,7 @@ enum class GameId : std::uint8_t
IW3,
IW4,
IW5,
T4,
T5,
T6,
@@ -48,6 +49,7 @@ static constexpr const char* GameId_Names[]{
"IW3",
"IW4",
"IW5",
"T4",
"T5",
"T6",
};
-2
View File
@@ -159,7 +159,6 @@ namespace IW3
WFT_NUM_FIELD_TYPES
};
using AssetXModelPieces = Asset<ASSET_TYPE_XMODELPIECES, XModelPieces>;
using AssetPhysPreset = Asset<ASSET_TYPE_PHYSPRESET, PhysPreset>;
using AssetXAnim = Asset<ASSET_TYPE_XANIMPARTS, XAnimParts>;
using AssetXModel = Asset<ASSET_TYPE_XMODEL, XModel>;
@@ -194,7 +193,6 @@ namespace IW3
using SubAssetPixelShader = SubAsset<SUB_ASSET_TYPE_PIXEL_SHADER, MaterialPixelShader>;
} // namespace IW3
DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetXModelPieces, name);
DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetPhysPreset, name);
DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetXAnim, name);
DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetXModel, name);
+104
View File
@@ -0,0 +1,104 @@
#include "CommonAssetT4.h"
#include "T4.h"
#include <cassert>
namespace T4
{
CommonAssetTypeMapper::CommonAssetTypeMapper() = default;
CommonAssetType CommonAssetTypeMapper::GameToCommonAssetType(const asset_type_t gameAssetType) const
{
static CommonAssetType lookupTable[static_cast<unsigned>(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::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::MENU_LIST, // 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::PACK_INDEX, // ASSET_TYPE_PACK_INDEX
};
assert(gameAssetType < ASSET_TYPE_COUNT);
return lookupTable[gameAssetType];
}
std::optional<asset_type_t> 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::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::MENU_LIST, 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::PACK_INDEX, ASSET_TYPE_PACK_INDEX)
default:
return std::nullopt;
}
#undef MAP_COMMON
}
} // namespace T4
+15
View File
@@ -0,0 +1,15 @@
#pragma once
#include "Game/CommonAsset.h"
namespace T4
{
class CommonAssetTypeMapper final : public ICommonAssetTypeMapper
{
public:
CommonAssetTypeMapper();
[[nodiscard]] CommonAssetType GameToCommonAssetType(asset_type_t gameAssetType) const override;
[[nodiscard]] std::optional<asset_type_t> CommonToGameAssetType(CommonAssetType commonAssetType) const override;
};
} // namespace T4
+35
View File
@@ -0,0 +1,35 @@
#include "CommonT4.h"
#include "Utils/Pack.h"
using namespace T4;
PackedTexCoords Common::Vec2PackTexCoords(const float (&in)[2])
{
return PackedTexCoords{pack32::Vec2PackTexCoordsVU(in)};
}
PackedUnitVec Common::Vec3PackUnitVec(const float (&in)[3])
{
return PackedUnitVec{pack32::Vec3PackUnitVecScaleBased(in)};
}
GfxColor Common::Vec4PackGfxColor(const float (&in)[4])
{
return GfxColor{pack32::Vec4PackGfxColor(in)};
}
void Common::Vec2UnpackTexCoords(const PackedTexCoords& in, float (&out)[2])
{
pack32::Vec2UnpackTexCoordsVU(in.packed, out);
}
void Common::Vec3UnpackUnitVec(const PackedUnitVec& in, float (&out)[3])
{
pack32::Vec3UnpackUnitVecScaleBased(in.packed, out);
}
void Common::Vec4UnpackGfxColor(const GfxColor& in, float (&out)[4])
{
pack32::Vec4UnpackGfxColor(in.packed, out);
}
+32
View File
@@ -0,0 +1,32 @@
#pragma once
#include "T4.h"
#include "Utils/Djb2.h"
#include <iostream>
namespace T4
{
class Common
{
public:
static constexpr uint32_t R_HashString(const char* str, const uint32_t hash)
{
return djb2_xor_nocase(str, hash);
}
static constexpr uint32_t R_HashString(const char* string)
{
// Using djb2 with a 0 starting value makes a worse hash func apparently
// but who am I to judge
return R_HashString(string, 0u);
}
static PackedTexCoords Vec2PackTexCoords(const float (&in)[2]);
static PackedUnitVec Vec3PackUnitVec(const float (&in)[3]);
static GfxColor Vec4PackGfxColor(const float (&in)[4]);
static void Vec2UnpackTexCoords(const PackedTexCoords& in, float (&out)[2]);
static void Vec3UnpackUnitVec(const PackedUnitVec& in, float (&out)[3]);
static void Vec4UnpackGfxColor(const GfxColor& in, float (&out)[4]);
};
} // namespace T4
+93
View File
@@ -0,0 +1,93 @@
#include "GameT4.h"
#include "T4.h"
#include <algorithm>
using namespace T4;
namespace
{
constexpr const char* ASSET_TYPE_NAMES[]{
"xmodelpieces",
"physpreset",
"physconstraints",
"destructibledef",
"xanim",
"xmodel",
"material",
"techniqueset",
"image",
"sound",
"loadedsound",
"clipmap_unused",
"clipmap",
"comworld",
"gameworldsp",
"gameworldmp",
"mapents",
"gfxworld",
"lightdef",
"uimap",
"font",
"menulist",
"menu",
"localize",
"weapon",
"snddriverglobals",
"fx",
"impactfx",
"aitype",
"mptype",
"character",
"xmodelalias",
"rawfile",
"stringtable",
"packindex",
};
static_assert(std::extent_v<decltype(ASSET_TYPE_NAMES)> == ASSET_TYPE_COUNT);
constexpr const char* SUB_ASSET_TYPE_NAMES[]{
"technique",
"vertexdecl",
"vertexshader",
"pixelshader",
};
static_assert(std::extent_v<decltype(SUB_ASSET_TYPE_NAMES)> == SUB_ASSET_TYPE_COUNT);
} // namespace
namespace T4
{
Game::Game()
: AbstractGame(ASSET_TYPE_NAMES, std::extent_v<decltype(ASSET_TYPE_NAMES)>, SUB_ASSET_TYPE_NAMES, std::extent_v<decltype(SUB_ASSET_TYPE_NAMES)>)
{
AddAssetTypeNameAlias<AssetTechniqueSet>("techset");
AddAssetTypeNameAlias<AssetLoadedSound>("loaded_sound");
AddAssetTypeNameAlias<AssetClipMap>("col_map_sp");
AddAssetTypeNameAlias<AssetClipMapPvs>("col_map_mp");
AddAssetTypeNameAlias<AssetComWorld>("com_map");
AddAssetTypeNameAlias<AssetGameWorldSp>("game_map_sp");
AddAssetTypeNameAlias<AssetGameWorldMp>("game_map_mp");
AddAssetTypeNameAlias<AssetMapEnts>("map_ents");
AddAssetTypeNameAlias<AssetGfxWorld>("gfx_map");
AddAssetTypeNameAlias<AssetLightDef>("gfxlightdef");
AddAssetTypeNameAlias<AssetMenuList>("menufile");
}
GameId Game::GetId() const
{
return GameId::T4;
}
const std::string& Game::GetFullName() const
{
static std::string fullName = "Call Of Duty: World at War";
return fullName;
}
const std::string& Game::GetShortName() const
{
static std::string shortName = "T4";
return shortName;
}
} // namespace T4
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#include "Game/IGame.h"
namespace T4
{
class Game final : public AbstractGame
{
public:
Game();
[[nodiscard]] GameId GetId() const override;
[[nodiscard]] const std::string& GetFullName() const override;
[[nodiscard]] const std::string& GetShortName() const override;
};
} // namespace T4
+150
View File
@@ -0,0 +1,150 @@
#pragma once
// clang-format off: Order of includes matters here
#include "Game/IAsset.h"
#include "T4_Assets.h"
// clang-format on
namespace T4
{
enum XAssetType
{
ASSET_TYPE_XMODELPIECES,
ASSET_TYPE_PHYSPRESET,
ASSET_TYPE_PHYSCONSTRAINTS,
ASSET_TYPE_DESTRUCTIBLEDEF,
ASSET_TYPE_XANIMPARTS,
ASSET_TYPE_XMODEL,
ASSET_TYPE_MATERIAL,
ASSET_TYPE_TECHNIQUE_SET,
ASSET_TYPE_IMAGE,
ASSET_TYPE_SOUND,
ASSET_TYPE_LOADED_SOUND,
ASSET_TYPE_CLIPMAP,
ASSET_TYPE_CLIPMAP_PVS,
ASSET_TYPE_COMWORLD,
ASSET_TYPE_GAMEWORLD_SP,
ASSET_TYPE_GAMEWORLD_MP,
ASSET_TYPE_MAP_ENTS,
ASSET_TYPE_GFXWORLD,
ASSET_TYPE_LIGHT_DEF,
ASSET_TYPE_UI_MAP,
ASSET_TYPE_FONT,
ASSET_TYPE_MENULIST,
ASSET_TYPE_MENU,
ASSET_TYPE_LOCALIZE_ENTRY,
ASSET_TYPE_WEAPON,
ASSET_TYPE_SNDDRIVER_GLOBALS,
ASSET_TYPE_FX,
ASSET_TYPE_IMPACT_FX,
ASSET_TYPE_AITYPE,
ASSET_TYPE_MPTYPE,
ASSET_TYPE_CHARACTER,
ASSET_TYPE_XMODELALIAS,
ASSET_TYPE_RAWFILE,
ASSET_TYPE_STRINGTABLE,
ASSET_TYPE_PACK_INDEX,
ASSET_TYPE_COUNT,
ASSET_TYPE_STRING = ASSET_TYPE_COUNT,
ASSET_TYPE_ASSETLIST
};
enum SubAssetType
{
SUB_ASSET_TYPE_TECHNIQUE,
SUB_ASSET_TYPE_VERTEX_DECL,
SUB_ASSET_TYPE_VERTEX_SHADER,
SUB_ASSET_TYPE_PIXEL_SHADER,
SUB_ASSET_TYPE_COUNT
};
struct ScriptStringList
{
int count;
const char** strings;
};
struct XAsset
{
XAssetType type;
XAssetHeader header;
};
struct XAssetList
{
ScriptStringList stringList;
int assetCount;
XAsset* assets;
};
using AssetPhysPreset = Asset<ASSET_TYPE_PHYSPRESET, PhysPreset>;
using AssetPhysConstraints = Asset<ASSET_TYPE_PHYSCONSTRAINTS, PhysConstraints>;
using AssetDestructibleDef = Asset<ASSET_TYPE_DESTRUCTIBLEDEF, DestructibleDef>;
using AssetXAnim = Asset<ASSET_TYPE_XANIMPARTS, XAnimParts>;
using AssetXModel = Asset<ASSET_TYPE_XMODEL, XModel>;
using AssetMaterial = Asset<ASSET_TYPE_MATERIAL, Material>;
using AssetTechniqueSet = Asset<ASSET_TYPE_TECHNIQUE_SET, MaterialTechniqueSet>;
using AssetImage = Asset<ASSET_TYPE_IMAGE, GfxImage>;
using AssetSound = Asset<ASSET_TYPE_SOUND, snd_alias_list_t>;
using AssetLoadedSound = Asset<ASSET_TYPE_LOADED_SOUND, LoadedSound>;
using AssetClipMap = Asset<ASSET_TYPE_CLIPMAP, clipMap_t>;
using AssetClipMapPvs = Asset<ASSET_TYPE_CLIPMAP_PVS, clipMap_t>;
using AssetComWorld = Asset<ASSET_TYPE_COMWORLD, ComWorld>;
using AssetGameWorldSp = Asset<ASSET_TYPE_GAMEWORLD_SP, GameWorldSp>;
using AssetGameWorldMp = Asset<ASSET_TYPE_GAMEWORLD_MP, GameWorldMp>;
using AssetMapEnts = Asset<ASSET_TYPE_MAP_ENTS, MapEnts>;
using AssetGfxWorld = Asset<ASSET_TYPE_GFXWORLD, GfxWorld>;
using AssetLightDef = Asset<ASSET_TYPE_LIGHT_DEF, GfxLightDef>;
using AssetFont = Asset<ASSET_TYPE_FONT, Font_s>;
using AssetMenuList = Asset<ASSET_TYPE_MENULIST, MenuList>;
using AssetMenu = Asset<ASSET_TYPE_MENU, menuDef_t>;
using AssetLocalize = Asset<ASSET_TYPE_LOCALIZE_ENTRY, LocalizeEntry>;
using AssetWeapon = Asset<ASSET_TYPE_WEAPON, WeaponDef>;
using AssetSoundDriverGlobals = Asset<ASSET_TYPE_SNDDRIVER_GLOBALS, SndDriverGlobals>;
using AssetFx = Asset<ASSET_TYPE_FX, FxEffectDef>;
using AssetImpactFx = Asset<ASSET_TYPE_IMPACT_FX, FxImpactTable>;
using AssetRawFile = Asset<ASSET_TYPE_RAWFILE, RawFile>;
using AssetStringTable = Asset<ASSET_TYPE_STRINGTABLE, StringTable>;
using AssetPackIndex = Asset<ASSET_TYPE_PACK_INDEX, PackIndex>;
using SubAssetTechnique = SubAsset<SUB_ASSET_TYPE_TECHNIQUE, MaterialTechnique>;
using SubAssetVertexDecl = SubAsset<SUB_ASSET_TYPE_VERTEX_DECL, MaterialVertexDeclaration>;
using SubAssetVertexShader = SubAsset<SUB_ASSET_TYPE_VERTEX_SHADER, MaterialVertexShader>;
using SubAssetPixelShader = SubAsset<SUB_ASSET_TYPE_PIXEL_SHADER, MaterialPixelShader>;
} // namespace T4
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetPhysPreset, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetPhysConstraints, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetDestructibleDef, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetXAnim, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetXModel, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetMaterial, info.name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetTechniqueSet, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetImage, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetSound, aliasName);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetLoadedSound, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetClipMap, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetClipMapPvs, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetComWorld, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetGameWorldSp, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetGameWorldMp, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetMapEnts, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetGfxWorld, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetLightDef, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetFont, fontName);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetMenuList, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetMenu, window.name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetLocalize, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetWeapon, szInternalName);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetSoundDriverGlobals, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetFx, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetImpactFx, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetRawFile, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetStringTable, name);
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetPackIndex, name);
File diff suppressed because it is too large Load Diff