iw4x-client/src/Components/Modules/AssetInterfaces/IMaterial.cpp

161 lines
4.3 KiB
C++
Raw Normal View History

2016-01-22 05:59:43 -05:00
#include <STDInclude.hpp>
namespace Assets
{
void IMaterial::Mark(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
{
Game::Material* asset = header.material;
if (asset->techniqueSet)
{
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_TECHSET, asset->techniqueSet->name);
}
if (asset->textureTable)
{
for (char i = 0; i < asset->textureCount; i++)
{
if (asset->textureTable[i].info.image)
{
if (asset->textureTable[i].semantic == SEMANTIC_WATER_MAP)
{
if (asset->textureTable[i].info.water->image)
{
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_IMAGE, asset->textureTable[i].info.water->image->name);
}
}
else
{
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_IMAGE, asset->textureTable[i].info.image->name);
}
}
}
}
}
void IMaterial::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
{
Assert_AssetStruct(Game::Material, 96);
Utils::Stream* buffer = builder->GetBuffer();
Game::Material* asset = header.material;
Game::Material* dest = (Game::Material*)buffer->At();
buffer->Save(asset, sizeof(Game::Material));
buffer->PushBlock(Game::XFILE_BLOCK_VIRTUAL);
if (asset->name)
{
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
dest->name = (char *)-1;
}
if (asset->techniqueSet)
{
dest->techniqueSet = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_TECHSET, asset->techniqueSet->name).materialTechset;
}
if (asset->textureTable)
{
Assert_AssetStruct(Game::MaterialTextureDef, 12);
2016-01-22 07:18:26 -05:00
// Pointer/Offset insertion is untested, but it worked in T6, so I think it's fine
if (builder->HasPointer(asset->textureTable))
{
dest->textureTable = builder->GetPointer(asset->textureTable);
}
else
2016-01-22 05:59:43 -05:00
{
2016-01-22 07:18:26 -05:00
buffer->Align(Utils::Stream::ALIGN_4);
builder->StorePointer(asset->textureTable);
2016-01-22 05:59:43 -05:00
2016-01-22 07:18:26 -05:00
Game::MaterialTextureDef* destTextureTable = (Game::MaterialTextureDef*)buffer->At();
buffer->SaveArray(asset->textureTable, asset->textureCount);
2016-01-22 05:59:43 -05:00
2016-01-22 07:18:26 -05:00
for (char i = 0; i < asset->textureCount; i++)
{
Game::MaterialTextureDef* destTextureDef = &destTextureTable[i];
Game::MaterialTextureDef* textureDef = &asset->textureTable[i];
2016-01-22 05:59:43 -05:00
2016-01-22 07:18:26 -05:00
if (textureDef->semantic == SEMANTIC_WATER_MAP)
2016-01-22 05:59:43 -05:00
{
2016-01-22 07:18:26 -05:00
Assert_AssetStruct(Game::water_t, 68);
2016-01-22 05:59:43 -05:00
2016-01-22 07:18:26 -05:00
Game::water_t* destWater = (Game::water_t*)buffer->At();
Game::water_t* water = textureDef->info.water;
2016-01-22 05:59:43 -05:00
2016-01-22 07:18:26 -05:00
if (water)
2016-01-22 05:59:43 -05:00
{
buffer->Align(Utils::Stream::ALIGN_4);
2016-01-22 07:18:26 -05:00
buffer->Save(water, sizeof(Game::water_t));
destTextureDef->info.water = (Game::water_t *) - 1;
// Save_water_t
if (water->H0X)
{
buffer->Align(Utils::Stream::ALIGN_4);
buffer->Save(water->H0X, 8, water->M * water->N);
destWater->H0X = (float *)-1;
}
if (water->H0Y)
{
buffer->Align(Utils::Stream::ALIGN_4);
buffer->Save(water->H0Y, 4, water->M * water->N);
destWater->H0Y = (float *)-1;
}
if (water->image)
{
destWater->image = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_IMAGE, water->image->name).image;
}
2016-01-22 05:59:43 -05:00
}
}
2016-01-22 07:18:26 -05:00
else if (textureDef->info.image)
{
destTextureDef->info.image = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_IMAGE, textureDef->info.image->name).image;
}
2016-01-22 05:59:43 -05:00
}
2016-01-22 07:18:26 -05:00
dest->textureTable = (Game::MaterialTextureDef*) - 1;
}
2016-01-22 05:59:43 -05:00
}
if (asset->constantTable)
{
Assert_AssetStruct(Game::MaterialConstantDef, 32);
2016-01-22 07:18:26 -05:00
if (builder->HasPointer(asset->constantTable))
{
dest->constantTable = builder->GetPointer(asset->constantTable);
}
else
{
buffer->Align(Utils::Stream::ALIGN_16);
builder->StorePointer(asset->constantTable);
buffer->SaveArray(asset->constantTable, asset->constantCount);
dest->constantTable = (Game::MaterialConstantDef *) - 1;
}
2016-01-22 05:59:43 -05:00
}
if (asset->stateBitTable)
{
2016-01-22 07:18:26 -05:00
if (builder->HasPointer(asset->stateBitTable))
{
dest->stateBitTable = builder->GetPointer(asset->stateBitTable);
}
else
{
buffer->Align(Utils::Stream::ALIGN_4);
builder->StorePointer(asset->stateBitTable);
buffer->Save(asset->stateBitTable, 8, asset->stateBitsCount);
dest->stateBitTable = (void *)-1;
}
2016-01-22 05:59:43 -05:00
}
buffer->PopBlock();
}
}