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

128 lines
3.4 KiB
C++
Raw Normal View History

2016-01-25 17:47:50 -05:00
#include <STDInclude.hpp>
namespace Assets
{
void IXModelSurfs::saveXSurfaceCollisionTree(Game::XSurfaceCollisionTree* entry, Components::ZoneBuilder::Zone* builder)
2016-01-26 10:12:41 -05:00
{
AssertSize(Game::XSurfaceCollisionTree, 40);
2016-01-26 10:12:41 -05:00
Utils::Stream* buffer = builder->getBuffer();
2016-01-26 10:12:41 -05:00
Game::XSurfaceCollisionTree* destEntry = buffer->dest<Game::XSurfaceCollisionTree>();
buffer->save(entry);
2016-01-26 10:12:41 -05:00
if (entry->node)
{
buffer->align(Utils::Stream::ALIGN_16);
buffer->save(entry->node, 16, entry->numNode);
Utils::Stream::ClearPointer(&destEntry->node);
2016-01-26 10:12:41 -05:00
}
if (entry->leaf)
{
buffer->align(Utils::Stream::ALIGN_2);
buffer->saveArray(entry->leaf, entry->numLeaf);
Utils::Stream::ClearPointer(&destEntry->leaf);
2016-01-26 10:12:41 -05:00
}
}
void IXModelSurfs::saveXSurface(Game::XSurface* surf, Game::XSurface* destSurf, Components::ZoneBuilder::Zone* builder)
2016-01-26 10:12:41 -05:00
{
Utils::Stream* buffer = builder->getBuffer();
2016-01-26 10:12:41 -05:00
if (surf->blendInfo)
{
buffer->align(Utils::Stream::ALIGN_2);
buffer->save(surf->blendInfo, sizeof(short), surf->blendNum1 + (surf->blendNum2 * 3) + (surf->blendNum3 * 5) + (surf->blendNum4 * 7));
Utils::Stream::ClearPointer(&destSurf->blendInfo);
2016-01-26 10:12:41 -05:00
}
// Access vertex block
buffer->pushBlock(Game::XFILE_BLOCK_VERTEX);
2016-01-26 10:12:41 -05:00
if (surf->vertexBuffer)
{
AssertSize(Game::GfxPackedVertex, 32);
2016-01-26 10:12:41 -05:00
buffer->align(Utils::Stream::ALIGN_16);
buffer->saveArray(surf->vertexBuffer, surf->numVertices);
Utils::Stream::ClearPointer(&destSurf->vertexBuffer);
2016-01-26 10:12:41 -05:00
}
buffer->popBlock();
2016-01-26 10:12:41 -05:00
// Save_XRigidVertListArray
if (surf->ct)
{
AssertSize(Game::XRigidVertList, 12);
2016-01-26 10:12:41 -05:00
buffer->align(Utils::Stream::ALIGN_4);
2016-01-26 10:12:41 -05:00
Game::XRigidVertList* destCt = buffer->dest<Game::XRigidVertList>();
buffer->saveArray(surf->ct, surf->numCT);
2016-01-26 10:12:41 -05:00
for (int i = 0; i < surf->numCT; ++i)
{
Game::XRigidVertList* destRigidVertList = &destCt[i];
Game::XRigidVertList* rigidVertList = &surf->ct[i];
if (rigidVertList->entry)
{
buffer->align(Utils::Stream::ALIGN_4);
this->saveXSurfaceCollisionTree(rigidVertList->entry, builder);
Utils::Stream::ClearPointer(&destRigidVertList->entry);
2016-01-26 10:12:41 -05:00
}
}
Utils::Stream::ClearPointer(&destSurf->ct);
2016-01-26 10:12:41 -05:00
}
// Access index block
buffer->pushBlock(Game::XFILE_BLOCK_INDEX);
2016-01-26 10:12:41 -05:00
if (surf->indexBuffer)
{
AssertSize(Game::Face, 6);
2016-01-26 10:12:41 -05:00
buffer->align(Utils::Stream::ALIGN_16);
buffer->saveArray(surf->indexBuffer, surf->numPrimitives);
Utils::Stream::ClearPointer(&destSurf->indexBuffer);
2016-01-26 10:12:41 -05:00
}
buffer->popBlock();
2016-01-26 10:12:41 -05:00
}
void IXModelSurfs::save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
2016-01-25 17:47:50 -05:00
{
AssertSize(Game::XModelSurfs, 36);
2016-01-25 17:47:50 -05:00
Utils::Stream* buffer = builder->getBuffer();
2016-01-25 17:47:50 -05:00
Game::XModelSurfs* asset = header.surfaces;
Game::XModelSurfs* dest = buffer->dest<Game::XModelSurfs>();
buffer->save(asset);
2016-01-25 17:47:50 -05:00
buffer->pushBlock(Game::XFILE_BLOCK_VIRTUAL);
2016-01-25 17:47:50 -05:00
if (asset->name)
{
buffer->saveString(builder->getAssetName(this->getType(), asset->name));
Utils::Stream::ClearPointer(&dest->name);
2016-01-25 17:47:50 -05:00
}
if (asset->surfaces)
{
AssertSize(Game::XSurface, 64);
2016-01-25 17:47:50 -05:00
buffer->align(Utils::Stream::ALIGN_4);
2016-01-26 10:12:41 -05:00
Game::XSurface* destSurfaces = buffer->dest<Game::XSurface>();
buffer->saveArray(asset->surfaces, asset->numSurfaces);
2016-01-25 17:47:50 -05:00
for (int i = 0; i < asset->numSurfaces; ++i)
{
this->saveXSurface(&asset->surfaces[i], &destSurfaces[i], builder);
2016-01-25 17:47:50 -05:00
}
Utils::Stream::ClearPointer(&dest->surfaces);
2016-01-25 17:47:50 -05:00
}
buffer->popBlock();
2016-01-25 17:47:50 -05:00
}
}