mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-19 19:27:52 -05:00
ZoneCodeGenerator: Change ContentLoader to use vars for fastfile pointer transfer and change ZoneInputStream API to be able to specify load location to better reflect the way the games do it.
This commit is contained in:
@ -57,122 +57,129 @@ using namespace T6;
|
||||
|
||||
ContentLoaderT6::ContentLoaderT6()
|
||||
{
|
||||
varXAsset = nullptr;
|
||||
varScriptStringList = nullptr;
|
||||
|
||||
// Script String 0 is always empty string
|
||||
m_script_strings.emplace_back("");
|
||||
}
|
||||
|
||||
void ContentLoaderT6::LoadScriptStringList(ScriptStringList* scriptStringList)
|
||||
void ContentLoaderT6::LoadScriptStringList(const bool atStreamStart)
|
||||
{
|
||||
m_stream->PushBlock(XFILE_BLOCK_VIRTUAL);
|
||||
|
||||
if(scriptStringList->strings != nullptr)
|
||||
if (atStreamStart)
|
||||
m_stream->Load<ScriptStringList>(varScriptStringList);
|
||||
|
||||
if(varScriptStringList->strings != nullptr)
|
||||
{
|
||||
assert(scriptStringList->strings == PTR_FOLLOWING);
|
||||
assert(varScriptStringList->strings == PTR_FOLLOWING);
|
||||
|
||||
scriptStringList->strings = m_stream->Alloc<const char*>();
|
||||
LoadXStringArray(scriptStringList->strings, scriptStringList->count, true);
|
||||
varScriptStringList->strings = m_stream->Alloc<const char*>(alignof(const char));
|
||||
varXString = varScriptStringList->strings;
|
||||
LoadXStringArray(true, varScriptStringList->count);
|
||||
|
||||
for(int i = 0; i < scriptStringList->count; i++)
|
||||
for(int i = 0; i < varScriptStringList->count; i++)
|
||||
{
|
||||
m_script_strings.emplace_back(scriptStringList->strings[i]);
|
||||
m_script_strings.emplace_back(varScriptStringList->strings[i]);
|
||||
}
|
||||
}
|
||||
|
||||
m_stream->PopBlock();
|
||||
}
|
||||
|
||||
void ContentLoaderT6::LoadXAsset(XAsset* pXAsset, const bool atStreamStart)
|
||||
void ContentLoaderT6::LoadXAsset(const bool atStreamStart)
|
||||
{
|
||||
#define LOAD_ASSET(type_index, typeName, headerEntry) \
|
||||
case type_index: \
|
||||
{ \
|
||||
Loader_##typeName loader(this, m_zone, m_stream); \
|
||||
loader.LoadPtr_##typeName(&pXAsset->header.headerEntry); \
|
||||
loader.Load(&varXAsset->header.headerEntry); \
|
||||
break; \
|
||||
}
|
||||
|
||||
assert(pXAsset != nullptr);
|
||||
assert(varXAsset != nullptr);
|
||||
|
||||
if(atStreamStart)
|
||||
m_stream->Load<XAsset>();
|
||||
m_stream->Load<XAsset>(varXAsset);
|
||||
|
||||
switch(pXAsset->type)
|
||||
switch(varXAsset->type)
|
||||
{
|
||||
LOAD_ASSET(ASSET_TYPE_PHYSPRESET, PhysPreset, physPreset);
|
||||
LOAD_ASSET(ASSET_TYPE_PHYSCONSTRAINTS, PhysConstraints, physConstraints);
|
||||
LOAD_ASSET(ASSET_TYPE_DESTRUCTIBLEDEF, DestructibleDef, destructibleDef);
|
||||
LOAD_ASSET(ASSET_TYPE_XANIMPARTS, XAnimParts, parts);
|
||||
LOAD_ASSET(ASSET_TYPE_XMODEL, XModel, model);
|
||||
LOAD_ASSET(ASSET_TYPE_MATERIAL, Material, material);
|
||||
LOAD_ASSET(ASSET_TYPE_TECHNIQUE_SET, MaterialTechniqueSet, techniqueSet);
|
||||
LOAD_ASSET(ASSET_TYPE_IMAGE, GfxImage, image);
|
||||
LOAD_ASSET(ASSET_TYPE_SOUND, SndBank, sound);
|
||||
LOAD_ASSET(ASSET_TYPE_SOUND_PATCH, SndPatch, soundPatch);
|
||||
LOAD_ASSET(ASSET_TYPE_CLIPMAP, clipMap_t, clipMap);
|
||||
LOAD_ASSET(ASSET_TYPE_CLIPMAP_PVS, clipMap_t, clipMap);
|
||||
LOAD_ASSET(ASSET_TYPE_COMWORLD, ComWorld, comWorld);
|
||||
LOAD_ASSET(ASSET_TYPE_GAMEWORLD_SP, GameWorldSp, gameWorldSp);
|
||||
LOAD_ASSET(ASSET_TYPE_GAMEWORLD_MP, GameWorldMp, gameWorldMp);
|
||||
LOAD_ASSET(ASSET_TYPE_MAP_ENTS, MapEnts, mapEnts);
|
||||
LOAD_ASSET(ASSET_TYPE_GFXWORLD, GfxWorld, gfxWorld);
|
||||
LOAD_ASSET(ASSET_TYPE_LIGHT_DEF, GfxLightDef, lightDef);
|
||||
LOAD_ASSET(ASSET_TYPE_FONT, Font_s, font);
|
||||
LOAD_ASSET(ASSET_TYPE_FONTICON, FontIcon, fontIcon);
|
||||
LOAD_ASSET(ASSET_TYPE_MENULIST, MenuList, menuList);
|
||||
LOAD_ASSET(ASSET_TYPE_MENU, menuDef_t, menu);
|
||||
LOAD_ASSET(ASSET_TYPE_LOCALIZE_ENTRY, LocalizeEntry, localize);
|
||||
LOAD_ASSET(ASSET_TYPE_WEAPON, WeaponVariantDef, weapon);
|
||||
LOAD_ASSET(ASSET_TYPE_ATTACHMENT, WeaponAttachment, attachment);
|
||||
LOAD_ASSET(ASSET_TYPE_ATTACHMENT_UNIQUE, WeaponAttachmentUnique, attachmentUnique);
|
||||
LOAD_ASSET(ASSET_TYPE_WEAPON_CAMO, WeaponCamo, weaponCamo);
|
||||
LOAD_ASSET(ASSET_TYPE_SNDDRIVER_GLOBALS, SndDriverGlobals, sndDriverGlobals);
|
||||
LOAD_ASSET(ASSET_TYPE_FX, FxEffectDef, fx);
|
||||
LOAD_ASSET(ASSET_TYPE_IMPACT_FX, FxImpactTable, impactFx);
|
||||
// LOAD_ASSET(ASSET_TYPE_PHYSPRESET, PhysPreset, physPreset);
|
||||
// LOAD_ASSET(ASSET_TYPE_PHYSCONSTRAINTS, PhysConstraints, physConstraints);
|
||||
// LOAD_ASSET(ASSET_TYPE_DESTRUCTIBLEDEF, DestructibleDef, destructibleDef);
|
||||
// LOAD_ASSET(ASSET_TYPE_XANIMPARTS, XAnimParts, parts);
|
||||
// LOAD_ASSET(ASSET_TYPE_XMODEL, XModel, model);
|
||||
// LOAD_ASSET(ASSET_TYPE_MATERIAL, Material, material);
|
||||
// LOAD_ASSET(ASSET_TYPE_TECHNIQUE_SET, MaterialTechniqueSet, techniqueSet);
|
||||
// LOAD_ASSET(ASSET_TYPE_IMAGE, GfxImage, image);
|
||||
// LOAD_ASSET(ASSET_TYPE_SOUND, SndBank, sound);
|
||||
// LOAD_ASSET(ASSET_TYPE_SOUND_PATCH, SndPatch, soundPatch);
|
||||
// LOAD_ASSET(ASSET_TYPE_CLIPMAP, clipMap_t, clipMap);
|
||||
// LOAD_ASSET(ASSET_TYPE_CLIPMAP_PVS, clipMap_t, clipMap);
|
||||
// LOAD_ASSET(ASSET_TYPE_COMWORLD, ComWorld, comWorld);
|
||||
// LOAD_ASSET(ASSET_TYPE_GAMEWORLD_SP, GameWorldSp, gameWorldSp);
|
||||
// LOAD_ASSET(ASSET_TYPE_GAMEWORLD_MP, GameWorldMp, gameWorldMp);
|
||||
// LOAD_ASSET(ASSET_TYPE_MAP_ENTS, MapEnts, mapEnts);
|
||||
// LOAD_ASSET(ASSET_TYPE_GFXWORLD, GfxWorld, gfxWorld);
|
||||
// LOAD_ASSET(ASSET_TYPE_LIGHT_DEF, GfxLightDef, lightDef);
|
||||
// LOAD_ASSET(ASSET_TYPE_FONT, Font_s, font);
|
||||
// LOAD_ASSET(ASSET_TYPE_FONTICON, FontIcon, fontIcon);
|
||||
// LOAD_ASSET(ASSET_TYPE_MENULIST, MenuList, menuList);
|
||||
// LOAD_ASSET(ASSET_TYPE_MENU, menuDef_t, menu);
|
||||
// LOAD_ASSET(ASSET_TYPE_LOCALIZE_ENTRY, LocalizeEntry, localize);
|
||||
// LOAD_ASSET(ASSET_TYPE_WEAPON, WeaponVariantDef, weapon);
|
||||
// LOAD_ASSET(ASSET_TYPE_ATTACHMENT, WeaponAttachment, attachment);
|
||||
// LOAD_ASSET(ASSET_TYPE_ATTACHMENT_UNIQUE, WeaponAttachmentUnique, attachmentUnique);
|
||||
// LOAD_ASSET(ASSET_TYPE_WEAPON_CAMO, WeaponCamo, weaponCamo);
|
||||
// LOAD_ASSET(ASSET_TYPE_SNDDRIVER_GLOBALS, SndDriverGlobals, sndDriverGlobals);
|
||||
// LOAD_ASSET(ASSET_TYPE_FX, FxEffectDef, fx);
|
||||
// LOAD_ASSET(ASSET_TYPE_IMPACT_FX, FxImpactTable, impactFx);
|
||||
LOAD_ASSET(ASSET_TYPE_RAWFILE, RawFile, rawfile);
|
||||
LOAD_ASSET(ASSET_TYPE_STRINGTABLE, StringTable, stringTable);
|
||||
LOAD_ASSET(ASSET_TYPE_LEADERBOARD, LeaderboardDef, leaderboardDef);
|
||||
LOAD_ASSET(ASSET_TYPE_XGLOBALS, XGlobals, xGlobals);
|
||||
LOAD_ASSET(ASSET_TYPE_DDL, ddlRoot_t, ddlRoot);
|
||||
LOAD_ASSET(ASSET_TYPE_GLASSES, Glasses, glasses);
|
||||
LOAD_ASSET(ASSET_TYPE_EMBLEMSET, EmblemSet, emblemSet);
|
||||
// LOAD_ASSET(ASSET_TYPE_LEADERBOARD, LeaderboardDef, leaderboardDef);
|
||||
// LOAD_ASSET(ASSET_TYPE_XGLOBALS, XGlobals, xGlobals);
|
||||
// LOAD_ASSET(ASSET_TYPE_DDL, ddlRoot_t, ddlRoot);
|
||||
// LOAD_ASSET(ASSET_TYPE_GLASSES, Glasses, glasses);
|
||||
// LOAD_ASSET(ASSET_TYPE_EMBLEMSET, EmblemSet, emblemSet);
|
||||
LOAD_ASSET(ASSET_TYPE_SCRIPTPARSETREE, ScriptParseTree, scriptParseTree);
|
||||
LOAD_ASSET(ASSET_TYPE_KEYVALUEPAIRS, KeyValuePairs, keyValuePairs);
|
||||
LOAD_ASSET(ASSET_TYPE_VEHICLEDEF, VehicleDef, vehicleDef);
|
||||
LOAD_ASSET(ASSET_TYPE_MEMORYBLOCK, MemoryBlock, memoryBlock);
|
||||
LOAD_ASSET(ASSET_TYPE_ADDON_MAP_ENTS, AddonMapEnts, addonMapEnts);
|
||||
LOAD_ASSET(ASSET_TYPE_TRACER, TracerDef, tracerDef);
|
||||
LOAD_ASSET(ASSET_TYPE_SKINNEDVERTS, SkinnedVertsDef, skinnedVertsDef);
|
||||
LOAD_ASSET(ASSET_TYPE_QDB, Qdb, qdb);
|
||||
LOAD_ASSET(ASSET_TYPE_SLUG, Slug, slug);
|
||||
LOAD_ASSET(ASSET_TYPE_FOOTSTEP_TABLE, FootstepTableDef, footstepTableDef);
|
||||
LOAD_ASSET(ASSET_TYPE_FOOTSTEPFX_TABLE, FootstepFXTableDef, footstepFXTableDef);
|
||||
LOAD_ASSET(ASSET_TYPE_ZBARRIER, ZBarrierDef, zbarrierDef);
|
||||
// LOAD_ASSET(ASSET_TYPE_KEYVALUEPAIRS, KeyValuePairs, keyValuePairs);
|
||||
// LOAD_ASSET(ASSET_TYPE_VEHICLEDEF, VehicleDef, vehicleDef);
|
||||
// LOAD_ASSET(ASSET_TYPE_MEMORYBLOCK, MemoryBlock, memoryBlock);
|
||||
// LOAD_ASSET(ASSET_TYPE_ADDON_MAP_ENTS, AddonMapEnts, addonMapEnts);
|
||||
// LOAD_ASSET(ASSET_TYPE_TRACER, TracerDef, tracerDef);
|
||||
// LOAD_ASSET(ASSET_TYPE_SKINNEDVERTS, SkinnedVertsDef, skinnedVertsDef);
|
||||
// LOAD_ASSET(ASSET_TYPE_QDB, Qdb, qdb);
|
||||
// LOAD_ASSET(ASSET_TYPE_SLUG, Slug, slug);
|
||||
// LOAD_ASSET(ASSET_TYPE_FOOTSTEP_TABLE, FootstepTableDef, footstepTableDef);
|
||||
// LOAD_ASSET(ASSET_TYPE_FOOTSTEPFX_TABLE, FootstepFXTableDef, footstepFXTableDef);
|
||||
// LOAD_ASSET(ASSET_TYPE_ZBARRIER, ZBarrierDef, zbarrierDef);
|
||||
|
||||
default:
|
||||
{
|
||||
throw UnsupportedAssetTypeException(pXAsset->type);
|
||||
throw UnsupportedAssetTypeException(varXAsset->type);
|
||||
}
|
||||
}
|
||||
|
||||
#undef LOAD_ASSET
|
||||
}
|
||||
|
||||
void ContentLoaderT6::LoadXAssetArray(XAsset* pArray, const size_t count, const bool atStreamStart)
|
||||
void ContentLoaderT6::LoadXAssetArray(const bool atStreamStart, const size_t count)
|
||||
{
|
||||
assert(pArray != nullptr);
|
||||
assert(varXAsset != nullptr);
|
||||
|
||||
if(atStreamStart)
|
||||
m_stream->Load<XAsset>(count);
|
||||
m_stream->Load<XAsset>(varXAsset, count);
|
||||
|
||||
size_t assetCounts[ASSET_TYPE_COUNT]{0};
|
||||
|
||||
for(size_t index = 0; index < count; index++)
|
||||
{
|
||||
assert(pArray[index].type >= 0 && pArray[index].type < ASSET_TYPE_COUNT);
|
||||
assert(varXAsset[index].type >= 0 && varXAsset[index].type < ASSET_TYPE_COUNT);
|
||||
|
||||
if(pArray[index].type >= 0 && pArray[index].type < ASSET_TYPE_COUNT)
|
||||
if(varXAsset[index].type >= 0 && varXAsset[index].type < ASSET_TYPE_COUNT)
|
||||
{
|
||||
assetCounts[pArray[index].type]++;
|
||||
assetCounts[varXAsset[index].type]++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -187,7 +194,8 @@ void ContentLoaderT6::LoadXAssetArray(XAsset* pArray, const size_t count, const
|
||||
|
||||
for(size_t index = 0; index < count; index++)
|
||||
{
|
||||
LoadXAsset(&pArray[index], false);
|
||||
LoadXAsset(false);
|
||||
varXAsset++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -198,25 +206,28 @@ void ContentLoaderT6::Load(Zone* zone, IZoneInputStream* stream)
|
||||
|
||||
m_stream->PushBlock(XFILE_BLOCK_VIRTUAL);
|
||||
|
||||
auto* assetList = m_stream->Alloc<XAssetList>();
|
||||
m_stream->Load<XAssetList>();
|
||||
auto* assetList = m_stream->Alloc<XAssetList>(alignof(XAssetList));
|
||||
m_stream->Load<XAssetList>(assetList);
|
||||
|
||||
LoadScriptStringList(&assetList->stringList);
|
||||
varScriptStringList = &assetList->stringList;
|
||||
LoadScriptStringList(false);
|
||||
|
||||
if(assetList->depends != nullptr)
|
||||
{
|
||||
assert(assetList->depends == PTR_FOLLOWING);
|
||||
|
||||
assetList->depends = m_stream->Alloc<const char*>();
|
||||
LoadXStringArray(assetList->depends, assetList->dependCount, true);
|
||||
assetList->depends = m_stream->Alloc<const char*>(alignof(const char));
|
||||
varXString = assetList->depends;
|
||||
LoadXStringArray(true, assetList->dependCount);
|
||||
}
|
||||
|
||||
if(assetList->assets != nullptr)
|
||||
{
|
||||
assert(assetList->assets == PTR_FOLLOWING);
|
||||
|
||||
assetList->assets = m_stream->Alloc<XAsset>();
|
||||
LoadXAssetArray(assetList->assets, assetList->assetCount, true);
|
||||
assetList->assets = m_stream->Alloc<XAsset>(alignof(XAsset));
|
||||
varXAsset = assetList->assets;
|
||||
LoadXAssetArray(true, assetList->assetCount);
|
||||
}
|
||||
|
||||
m_stream->PopBlock();
|
||||
|
@ -7,11 +7,13 @@
|
||||
class ContentLoaderT6 final : public ContentLoader, public IContentLoadingEntryPoint, public IZoneScriptStringProvider
|
||||
{
|
||||
std::vector<std::string> m_script_strings;
|
||||
T6::XAsset* varXAsset;
|
||||
T6::ScriptStringList* varScriptStringList;
|
||||
|
||||
void LoadScriptStringList(T6::ScriptStringList* scriptStringList);
|
||||
void LoadScriptStringList(bool atStreamStart);
|
||||
|
||||
void LoadXAsset(T6::XAsset* pXAsset, bool atStreamStart);
|
||||
void LoadXAssetArray(T6::XAsset* pArray, size_t count, bool atStreamStart);
|
||||
void LoadXAsset(bool atStreamStart);
|
||||
void LoadXAssetArray(bool atStreamStart, size_t count);
|
||||
|
||||
public:
|
||||
ContentLoaderT6();
|
||||
|
Reference in New Issue
Block a user