[ZoneBuilder] Nested assets work now (but it doesn't fix the clip map bug)
This commit is contained in:
parent
2903444e89
commit
e87ce9938d
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user