186 lines
3.5 KiB
C++
186 lines
3.5 KiB
C++
#include "xmodel.h"
|
|
#include "xstring.h"
|
|
|
|
XModel::XModel()
|
|
: XAsset()
|
|
, mName()
|
|
, mNumBones(0)
|
|
, mNumRootBones(0)
|
|
, mNumSurfs(0)
|
|
, mLodRampType(0)
|
|
, mBoneNames()
|
|
, mParentList()
|
|
, mQuats()
|
|
, mTrans(0)
|
|
, mPartClassification()
|
|
, mBaseMat()
|
|
, mSurfs()
|
|
, mMaterialHandles()
|
|
, mLodInfo()
|
|
, mCollSurfs()
|
|
, mNumCollSurfs(0)
|
|
, mContents(0)
|
|
, mBoneInfo()
|
|
, mRadius(0)
|
|
, mMins()
|
|
, mMaxs()
|
|
, mNumLods(0)
|
|
, mCollLod(0)
|
|
, mStreamInfo()
|
|
, mMemUsage(0)
|
|
, mFlags(0)
|
|
, mPhysPreset()
|
|
, mPhysGeoms()
|
|
{
|
|
SetType(ASSET_TYPE_XMODEL);
|
|
}
|
|
|
|
XModel::~XModel()
|
|
{
|
|
|
|
}
|
|
|
|
void XModel::ParseData(QDataStream *aStream) {
|
|
|
|
mName.ParsePtr(aStream, false);
|
|
|
|
*aStream
|
|
>> mNumBones
|
|
>> mNumRootBones
|
|
>> mNumSurfs
|
|
>> mLodRampType;
|
|
|
|
qint32 boneNamesPtr, parentListPtr, quatsPtr, transPtr, partClassPtr;
|
|
|
|
*aStream
|
|
>> 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);
|
|
}
|
|
}
|
|
|
|
mBoneInfo.ParseData(aStream);
|
|
|
|
// TODO: Fill out rest of this
|
|
}
|
|
|
|
void XModel::Clear()
|
|
{
|
|
|
|
}
|