XPlor/libs/xassets/xsurface.cpp

85 lines
2.2 KiB
C++

#include "xsurface.h"
XSurface::XSurface()
: XAsset()
, mTileMode(0)
, mDeformed(false)
, mVertCount(0)
, mTriCount(0)
, mTriIndices()
, mVertInfo()
, mVert()
, mVertListCount(0)
, mVertList()
, mPartBits()
{
SetName("Surface");
}
void XSurface::ParseData(XDataStream *aStream)
{
mTileMode = aStream->ParseUInt8(QString("%1 tile mode").arg(GetName()));
mDeformed = aStream->ParseUInt8(QString("%1 deformed").arg(GetName()));
mVertCount = aStream->ParseUInt16(QString("%1 vertex count").arg(GetName()));
mTriCount = aStream->ParseUInt16(QString("%1 tri count").arg(GetName()));
mZoneHandle = aStream->ParseInt8(QString("%1 zone handle").arg(GetName()));
aStream->skipRawData(1);
mBaseTriIndex = aStream->ParseUInt16(QString("%1 base tri index").arg(GetName()));
mBaseVertIndex = aStream->ParseUInt16(QString("%1 base vertex index").arg(GetName()));
mTriIndices.ParsePtr(aStream, false);
mVertInfo.ParseData(aStream);
mVert.ParsePtr(aStream, false);
mVertListCount = aStream->ParseUInt32(QString("%1 vertex list count").arg(GetName()));
qint32 vertListPtr = aStream->ParseInt32(QString("%1 vert list ptr").arg(GetName()));
for (int i = 0; i < 4; i++)
{
mPartBits.push_back(aStream->ParseInt32(QString("%1 part bits %2").arg(GetName()).arg(i)));
}
mVert.ParseDataSafe(aStream);
if (vertListPtr == -1)
{
for (int i = 0; i < mVertListCount; i++)
{
XRigidVertList newVertList;
newVertList.ParseData(aStream);
mVertList.push_back(newVertList);
}
for (int i = 0; i < mVertList.size(); i++)
{
auto collTree = mVertList[i].CollisionTree();
collTree.ParseDataSafe(aStream);
mVertList[i].SetCollisionTree(collTree);
}
}
mTriIndices.ParseDataSafe(aStream);
}
void XSurface::Clear()
{
mTileMode = 0;
mDeformed = false;
mVertCount = 0;
mTriCount = 0;
mZoneHandle = 0;
mBaseTriIndex = 0;
mBaseVertIndex = 0;
mTriIndices.Clear();
mVertInfo.Clear();
mVert.Clear();
mVertListCount = 0;
mVertList.clear();
mPartBits.clear();
}