XPlor/libs/xassets/xmodel.cpp

186 lines
3.5 KiB
C++
Raw Normal View History

2025-08-14 17:30:25 -04:00
#include "xmodel.h"
2025-09-05 18:35:17 -04:00
#include "xstring.h"
2025-08-14 17:30:25 -04:00
XModel::XModel()
2025-09-03 13:02:54 -04:00
: XAsset()
2025-09-07 23:16:08 -04:00
, mName()
2025-09-03 13:02:54 -04:00
, mNumBones(0)
, mNumRootBones(0)
, mNumSurfs(0)
, mLodRampType(0)
, mBoneNames()
, mParentList()
, mQuats()
, mTrans(0)
2025-09-07 23:16:08 -04:00
, mPartClassification()
, mBaseMat()
2025-09-03 13:02:54 -04:00
, mSurfs()
, mMaterialHandles()
, mLodInfo()
, mCollSurfs()
, mNumCollSurfs(0)
, mContents(0)
2025-09-07 23:16:08 -04:00
, mBoneInfo()
2025-09-03 13:02:54 -04:00
, mRadius(0)
, mMins()
, mMaxs()
, mNumLods(0)
, mCollLod(0)
, mStreamInfo()
, mMemUsage(0)
, mFlags(0)
2025-09-07 23:16:08 -04:00
, mPhysPreset()
, mPhysGeoms()
2025-09-05 18:35:17 -04:00
{
SetType(ASSET_TYPE_XMODEL);
}
XModel::~XModel()
2025-09-03 13:02:54 -04:00
{
2025-08-14 17:30:25 -04:00
}
void XModel::ParseData(QDataStream *aStream) {
2025-09-07 23:16:08 -04:00
mName.ParsePtr(aStream, false);
*aStream
>> mNumBones
>> mNumRootBones
>> mNumSurfs
>> mLodRampType;
qint32 boneNamesPtr, parentListPtr, quatsPtr, transPtr, partClassPtr;
2025-08-14 17:30:25 -04:00
*aStream
2025-09-07 23:16:08 -04:00
>> boneNamesPtr
>> parentListPtr
>> quatsPtr
>> transPtr
>> partClassPtr;
mBaseMat.ParsePtr(aStream, false);
qint32 surfsPtr, matHandlesPtr, lodInfoPtr, collSurfsPtr;
*aStream
>> surfsPtr
>> matHandlesPtr
>> lodInfoPtr
>> collSurfsPtr
>> mNumCollSurfs
>> mContents;
mBoneInfo.ParsePtr(aStream, false);
*aStream
>> mRadius
>> mMins
>> mMaxs
>> mNumLods
>> mCollLod;
mStreamInfo.ParseData(aStream);
*aStream
>> mMemUsage
>> mFlags;
aStream->skipRawData(3);
mPhysPreset.ParsePtr(aStream, false);
mPhysGeoms.ParsePtr(aStream, false);
mName.ParseData(aStream);
if (boneNamesPtr == -1)
{
for (int i = 0; i < mNumBones; i++)
{
quint16 bone;
*aStream >> bone;
mBoneNames.append(bone);
}
}
if (parentListPtr == -1)
{
for (int i = 0; i < mNumBones - mNumRootBones; i++)
{
quint8 parent;
*aStream >> parent;
mParentList.append(parent);
}
}
if (quatsPtr == -1)
{
for (int i = 0; i < 8 * (mNumBones - mNumRootBones); i++)
{
quint8 quat;
*aStream >> quat;
mQuats.append(quat);
}
}
if (transPtr == -1)
{
for (int i = 0; i < 16 * (mNumBones - mNumRootBones); i++)
{
quint8 trans;
*aStream >> trans;
mTrans.append(trans);
}
}
if (partClassPtr == -1)
{
for (int i = 0; i < mNumBones; i++)
{
quint8 partClass;
*aStream >> partClass;
mPartClassification.append(partClass);
}
}
mBaseMat.ParseData(aStream);
if (surfsPtr == -1)
{
for (int i = 0; i < mNumSurfs; i++)
{
XSurface newSurf;
newSurf.ParseData(aStream);
mSurfs.append(newSurf);
}
}
if (matHandlesPtr == -1)
{
for (int i = 0; i < mNumSurfs; i++)
{
XMaterial newMaterial;
newMaterial.ParseData(aStream);
mMaterialHandles.append(newMaterial);
}
}
if (collSurfsPtr == -1)
{
for (int i = 0; i < mNumCollSurfs; i++)
{
XModelCollSurf newCollSurf;
newCollSurf.ParseData(aStream);
mCollSurfs.append(newCollSurf);
}
}
2025-08-14 17:30:25 -04:00
2025-09-07 23:16:08 -04:00
mBoneInfo.ParseData(aStream);
2025-09-05 18:35:17 -04:00
2025-09-07 23:16:08 -04:00
// TODO: Fill out rest of this
2025-09-05 18:35:17 -04:00
}
void XModel::Clear()
{
2025-08-14 17:30:25 -04:00
}