[ZoneBuilder] Nested assets work now (but it doesn't fix the clip map bug)

This commit is contained in:
TheApadayo 2016-12-23 08:43:37 -05:00
parent 2903444e89
commit e87ce9938d
3 changed files with 23 additions and 26 deletions

View File

@ -13,7 +13,6 @@ namespace Assets
buffer->save(asset); buffer->save(asset);
buffer->pushBlock(Game::XFILE_BLOCK_VIRTUAL); buffer->pushBlock(Game::XFILE_BLOCK_VIRTUAL);
builder->pushAliasBase();
if (asset->name) if (asset->name)
{ {
@ -51,20 +50,16 @@ namespace Assets
// xmodel is already stored // xmodel is already stored
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
Game::cStaticModel_t* destStaticModelList = buffer->dest<Game::cStaticModel_t>(); Game::cStaticModel_t* destStaticModelList = buffer->dest<Game::cStaticModel_t>();
builder->pushAliasBase();
buffer->saveArray(asset->staticModelList, asset->numStaticModels); buffer->saveArray(asset->staticModelList, asset->numStaticModels);
for (int i = 0; i < asset->numStaticModels; ++i) for (int i = 0; i < asset->numStaticModels; ++i)
{ {
if (asset->staticModelList[i].xmodel) if (asset->staticModelList[i].xmodel)
{ {
destStaticModelList[i].xmodel = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_XMODEL, asset->staticModelList[i].xmodel, destStaticModelList[i].xmodel = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_XMODEL, asset->staticModelList[i].xmodel).model;
offsetof(Game::cStaticModel_t, xmodel) + (sizeof(Game::cStaticModel_t) * i)).model;
} }
} }
builder->popAliasBase();
Utils::Stream::ClearPointer(&dest->staticModelList); Utils::Stream::ClearPointer(&dest->staticModelList);
SaveLogExit(); SaveLogExit();
} }
@ -432,7 +427,7 @@ namespace Assets
if (asset->mapEnts) if (asset->mapEnts)
{ {
dest->mapEnts = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_MAP_ENTS, asset->mapEnts, offsetof(Game::clipMap_t, mapEnts)).mapEnts; dest->mapEnts = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_MAP_ENTS, asset->mapEnts).mapEnts;
} }
for (int i = 0; i < 2; ++i) for (int i = 0; i < 2; ++i)
@ -443,7 +438,6 @@ namespace Assets
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
Game::DynEntityDef* dynEntDest = buffer->dest<Game::DynEntityDef>(); Game::DynEntityDef* dynEntDest = buffer->dest<Game::DynEntityDef>();
builder->pushAliasBase();
buffer->saveArray(asset->dynEntDefList[i], asset->dynEntCount[i]); buffer->saveArray(asset->dynEntDefList[i], asset->dynEntCount[i]);
Game::DynEntityDef* dynEnt = asset->dynEntDefList[i]; Game::DynEntityDef* dynEnt = asset->dynEntDefList[i];
@ -451,25 +445,20 @@ namespace Assets
{ {
if (dynEnt[j].xModel) if (dynEnt[j].xModel)
{ {
dynEntDest[j].xModel = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_XMODEL, dynEnt[j].xModel, dynEntDest[j].xModel = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_XMODEL, dynEnt[j].xModel).model;
GET_ALIAS_OFFSET_ARRAY(Game::DynEntityDef, xModel, j)).model;
} }
if (dynEnt[j].destroyFx) if (dynEnt[j].destroyFx)
{ {
dynEntDest[j].destroyFx = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_FX, dynEnt[j].destroyFx, dynEntDest[j].destroyFx = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_FX, dynEnt[j].destroyFx).fx;
GET_ALIAS_OFFSET_ARRAY(Game::DynEntityDef, xModel, j)).fx;
} }
if (dynEnt[j].physPreset) if (dynEnt[j].physPreset)
{ {
dynEntDest[j].physPreset = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_PHYSPRESET, dynEnt[j].physPreset, dynEntDest[j].physPreset = builder->saveSubAsset(Game::XAssetType::ASSET_TYPE_PHYSPRESET, dynEnt[j].physPreset).physPreset;
GET_ALIAS_OFFSET_ARRAY(Game::DynEntityDef, xModel, j)).physPreset;
} }
} }
builder->popAliasBase();
Utils::Stream::ClearPointer(&dest->dynEntDefList[i]); Utils::Stream::ClearPointer(&dest->dynEntDefList[i]);
} }
} }
@ -515,7 +504,6 @@ namespace Assets
buffer->popBlock(); buffer->popBlock();
buffer->popBlock(); buffer->popBlock();
builder->popAliasBase();
SaveLogExit(); SaveLogExit();
} }

View File

@ -204,7 +204,7 @@ namespace Components
offset.offset = (this->indexStart + (index * sizeof(Game::XAsset)) + 4); offset.offset = (this->indexStart + (index * sizeof(Game::XAsset)) + 4);
return offset.getPackedOffset(); return offset.getPackedOffset();
} }
/*
void ZoneBuilder::Zone::pushAliasBase() void ZoneBuilder::Zone::pushAliasBase()
{ {
this->aliasBaseStack.push_back(this->buffer.getBlockSize(Game::XFILE_BLOCK_VIRTUAL)); this->aliasBaseStack.push_back(this->buffer.getBlockSize(Game::XFILE_BLOCK_VIRTUAL));
@ -222,8 +222,9 @@ namespace Components
{ {
return this->aliasBaseStack.back(); return this->aliasBaseStack.back();
} }
*/
Game::XAssetHeader ZoneBuilder::Zone::saveSubAsset(Game::XAssetType type, void* ptr, unsigned int aliasOffset) Game::XAssetHeader ZoneBuilder::Zone::saveSubAsset(Game::XAssetType type, void* ptr)
{ {
Game::XAssetHeader header; Game::XAssetHeader header;
header.data = ptr; header.data = ptr;
@ -253,13 +254,18 @@ namespace Components
assetToSave.header = header; assetToSave.header = header;
assetToSave.type = type; assetToSave.type = type;
this->storeAlias(ptr, this->getAliasBase() + aliasOffset); // we alias the next 4 (aligned) bytes of the stream b/c DB_InsertPointer gives us a nice pointer to use as the alias
// otherwise it would be a fuckfest trying to figure out where the alias is in the stream
this->buffer.align(Utils::Stream::ALIGN_4);
this->storeAlias(ptr, this->buffer.getBlockSize(Game::XFILE_BLOCK_VIRTUAL));
this->buffer.increaseBlockSize(Game::XFILE_BLOCK_VIRTUAL, 4);
this->buffer.pushBlock(Game::XFILE_BLOCK_TEMP); this->buffer.pushBlock(Game::XFILE_BLOCK_TEMP);
AssetHandler::ZoneSave(assetToSave, this); AssetHandler::ZoneSave(assetToSave, this);
this->buffer.popBlock(); this->buffer.popBlock();
this->savedAssets.push_back(header); this->savedAssets.push_back(header);
Utils::Stream::ClearPointer(&header.data); header.data = reinterpret_cast<void*>(-2); // DB_InsertPointer marker
} }
} }
else else
@ -445,6 +451,11 @@ namespace Components
return NULL; return NULL;
} }
void ZoneBuilder::Zone::storePointer(const void* pointer)
{
this->pointerMap[pointer] = this->buffer.getPackedOffset();
}
void ZoneBuilder::Zone::storeAlias(const void* ptr, unsigned int alias) void ZoneBuilder::Zone::storeAlias(const void* ptr, unsigned int alias)
{ {
this->aliasMap[ptr] = alias; this->aliasMap[ptr] = alias;
@ -456,6 +467,7 @@ namespace Components
{ {
return this->aliasMap[ptr]; return this->aliasMap[ptr];
} }
Logger::Print("Warning: Missing Alias for pointer! Export will almost certainly fail!\n");
return 0; return 0;
} }

View File

@ -23,6 +23,7 @@ namespace Components
bool hasPointer(const void* pointer); bool hasPointer(const void* pointer);
void storePointer(const void* pointer); void storePointer(const void* pointer);
void storePointer(const void* pointer, Utils::Stream::Offset offset);
template<typename T> template<typename T>
inline T* getPointer(const T* pointer) { return reinterpret_cast<T*>(this->safeGetPointer(pointer)); } inline T* getPointer(const T* pointer) { return reinterpret_cast<T*>(this->safeGetPointer(pointer)); }
@ -30,7 +31,7 @@ namespace Components
int findAsset(Game::XAssetType type, std::string name); int findAsset(Game::XAssetType type, std::string name);
Game::XAsset* getAsset(int index); Game::XAsset* getAsset(int index);
uint32_t getAssetTableOffset(int index); uint32_t getAssetTableOffset(int index);
Game::XAssetHeader saveSubAsset(Game::XAssetType type, void* ptr, unsigned int aliasOffset); Game::XAssetHeader saveSubAsset(Game::XAssetType type, void* ptr);
bool loadAsset(Game::XAssetType type, std::string name); bool loadAsset(Game::XAssetType type, std::string name);
void markAsset(Game::XAssetType type, void* ptr); void markAsset(Game::XAssetType type, void* ptr);
@ -47,10 +48,6 @@ namespace Components
void incrementExternalSize(unsigned int size); void incrementExternalSize(unsigned int size);
void pushAliasBase();
void popAliasBase();
unsigned int getAliasBase();
private: private:
void loadFastFiles(); void loadFastFiles();