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

127 lines
3.6 KiB
C++
Raw Normal View History

2016-01-22 05:59:43 -05:00
#include <STDInclude.hpp>
namespace Assets
{
void IMaterialTechniqueSet::Mark(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
{
Game::MaterialTechniqueSet* asset = header.materialTechset;
for (int i = 0; i < ARR_SIZE(Game::MaterialTechniqueSet::techniques); i++)
{
Game::MaterialTechnique* technique = asset->techniques[i];
if (!technique) continue;
for (short j = 0; j < technique->numPasses; j++)
2016-01-22 05:59:43 -05:00
{
Game::MaterialPass* pass = &technique->passes[j];
2016-01-22 05:59:43 -05:00
if (pass->vertexDecl)
{
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_VERTEXDECL, pass->vertexDecl->name);
}
if (pass->vertexShader)
{
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_VERTEXSHADER, pass->vertexShader->name);
}
if (pass->pixelShader)
{
builder->LoadAsset(Game::XAssetType::ASSET_TYPE_PIXELSHADER, pass->pixelShader->name);
}
}
}
}
void IMaterialTechniqueSet::Save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
{
Assert_Size(Game::MaterialTechniqueSet, 204);
2016-01-22 05:59:43 -05:00
Utils::Stream* buffer = builder->GetBuffer();
Game::MaterialTechniqueSet* asset = header.materialTechset;
Game::MaterialTechniqueSet* dest = buffer->Dest<Game::MaterialTechniqueSet>();
2016-01-22 05:59:43 -05:00
buffer->Save(asset, sizeof(Game::MaterialTechniqueSet));
buffer->PushBlock(Game::XFILE_BLOCK_VIRTUAL);
if (asset->name)
{
buffer->SaveString(builder->GetAssetName(this->GetType(), asset->name));
dest->name = reinterpret_cast<char*>(-1);
2016-01-22 05:59:43 -05:00
}
// Save_MaterialTechniquePtrArray
static_assert(ARR_SIZE(Game::MaterialTechniqueSet::techniques) == 48, "Techniques array invalid!");
for (int i = 0; i < ARR_SIZE(Game::MaterialTechniqueSet::techniques); i++)
{
Game::MaterialTechnique* technique = asset->techniques[i];
if (technique)
{
2016-01-22 07:18:26 -05:00
if (builder->HasPointer(technique))
{
dest->techniques[i] = builder->GetPointer(technique);
}
else
2016-01-22 05:59:43 -05:00
{
2016-01-22 07:18:26 -05:00
// Size-check is obsolete, as the structure is dynamic
buffer->Align(Utils::Stream::ALIGN_4);
builder->StorePointer(technique);
2016-01-22 05:59:43 -05:00
Game::MaterialTechnique* destTechnique = buffer->Dest<Game::MaterialTechnique>();
2016-01-22 07:18:26 -05:00
buffer->Save(technique, 8);
2016-01-22 05:59:43 -05:00
2016-01-22 07:18:26 -05:00
// Save_MaterialPassArray
for (short j = 0; j < technique->numPasses; j++)
2016-01-22 05:59:43 -05:00
{
Assert_Size(Game::MaterialPass, 20);
2016-01-22 07:18:26 -05:00
Game::MaterialPass* destPass = buffer->Dest<Game::MaterialPass>();
Game::MaterialPass* pass = &technique->passes[j];
2016-01-22 07:18:26 -05:00
buffer->Save(pass, sizeof(Game::MaterialPass));
if (pass->vertexDecl)
{
destPass->vertexDecl = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_VERTEXDECL, pass->vertexDecl->name).vertexDecl;
}
if (pass->vertexShader)
{
destPass->vertexShader = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_VERTEXSHADER, pass->vertexShader->name).vertexShader;
}
if (pass->pixelShader)
{
destPass->pixelShader = builder->RequireAsset(Game::XAssetType::ASSET_TYPE_PIXELSHADER, pass->pixelShader->name).pixelShader;
}
if (pass->argumentDef)
{
buffer->Align(Utils::Stream::ALIGN_4);
buffer->SaveArray(pass->argumentDef, pass->argCount1 + pass->argCount2 + pass->argCount3);
destPass->argumentDef = reinterpret_cast<Game::ShaderArgumentDef*>(-1);
2016-01-22 07:18:26 -05:00
}
2016-01-22 05:59:43 -05:00
}
2016-01-22 07:18:26 -05:00
// We absolutely have to write something here!
if (technique->name)
2016-01-22 05:59:43 -05:00
{
2016-01-22 07:18:26 -05:00
buffer->SaveString(technique->name);
2016-01-22 05:59:43 -05:00
}
2016-01-22 07:18:26 -05:00
else
2016-01-22 05:59:43 -05:00
{
2016-01-22 07:18:26 -05:00
buffer->SaveString("");
2016-01-22 05:59:43 -05:00
}
destTechnique->name = reinterpret_cast<char*>(-1);
dest->techniques[i] = reinterpret_cast<Game::MaterialTechnique*>(-1);
2016-01-22 05:59:43 -05:00
}
}
}
buffer->PopBlock();
}
}