175 lines
5.2 KiB
C++
175 lines
5.2 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(4)
|
|
, 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);
|
|
SetName("Model");
|
|
}
|
|
|
|
XModel::~XModel()
|
|
{
|
|
|
|
}
|
|
|
|
void XModel::ParseData(XDataStream *aStream) {
|
|
mName.ParsePtr(aStream, false);
|
|
|
|
qint32 boneNamesPtr, parentListPtr, quatsPtr, transPtr, partClassPtr;
|
|
|
|
mNumBones = aStream->ParseUInt8(QString("%1 num bones").arg(GetName()));
|
|
mNumRootBones = aStream->ParseUInt8(QString("%1 num root bones").arg(GetName()));
|
|
mNumSurfs = aStream->ParseUInt8(QString("%1 num surfs").arg(GetName()));
|
|
mLodRampType = aStream->ParseUInt8(QString("%1 lod ramp type").arg(GetName()));
|
|
|
|
boneNamesPtr = aStream->ParseInt32(QString("%1 bone names ptr").arg(GetName()));
|
|
parentListPtr = aStream->ParseInt32(QString("%1 parent list ptr").arg(GetName()));
|
|
quatsPtr = aStream->ParseInt32(QString("%1 quats ptr").arg(GetName()));
|
|
transPtr = aStream->ParseInt32(QString("%1 trans ptr").arg(GetName()));
|
|
partClassPtr = aStream->ParseInt32(QString("%1 part classification ptr").arg(GetName()));
|
|
|
|
mBaseMat.ParsePtr(aStream, false);
|
|
|
|
qint32 surfsPtr = aStream->ParseInt32(QString("%1 surfs ptr").arg(GetName()));
|
|
qint32 matHandlesPtr = aStream->ParseInt32(QString("%1 material handles ptr").arg(GetName()));
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
XModelLodInfo newLodInfo;
|
|
newLodInfo.ParseData(aStream);
|
|
mLodInfo.append(newLodInfo);
|
|
}
|
|
|
|
qint32 collSurfsPtr;
|
|
collSurfsPtr = aStream->ParseInt32(QString("%1 coll surfs ptr").arg(GetName()));
|
|
mNumCollSurfs = aStream->ParseInt32(QString("%1 num coll surfs").arg(GetName()));
|
|
mContents = aStream->ParseInt32(QString("%1 contents").arg(GetName()));
|
|
|
|
mBoneInfo.ParsePtr(aStream, false);
|
|
|
|
mRadius = aStream->ParseSingle(QString("%1 radius").arg(GetName()));
|
|
|
|
mMins.setX(aStream->ParseSingle(QString("%1 mins x").arg(GetName())));
|
|
mMins.setY(aStream->ParseSingle(QString("%1 mins y").arg(GetName())));
|
|
mMins.setZ(aStream->ParseSingle(QString("%1 mins z").arg(GetName())));
|
|
|
|
mMaxs.setX(aStream->ParseSingle(QString("%1 maxs x").arg(GetName())));
|
|
mMaxs.setY(aStream->ParseSingle(QString("%1 maxs y").arg(GetName())));
|
|
mMaxs.setZ(aStream->ParseSingle(QString("%1 maxs z").arg(GetName())));
|
|
|
|
mNumLods = aStream->ParseInt16(QString("%1 num lods").arg(GetName()));
|
|
mCollLod = aStream->ParseInt16(QString("%1 coll lod").arg(GetName()));
|
|
|
|
mStreamInfo.ParsePtr(aStream, false);
|
|
|
|
mMemUsage = aStream->ParseInt32(QString("%1 mem usage").arg(GetName()));
|
|
mFlags = aStream->ParseUInt8(QString("%1 flags").arg(GetName()));
|
|
|
|
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->ParseUInt16(QString("%1 bone %2").arg(GetName()).arg(i));
|
|
mBoneNames.append(bone);
|
|
}
|
|
}
|
|
|
|
if (parentListPtr == -1) {
|
|
for (int i = 0; i < (mNumBones - mNumRootBones); i++) {
|
|
quint8 parent = aStream->ParseUInt8(QString("%1 parent %2").arg(GetName()).arg(i));
|
|
mParentList.append(parent);
|
|
}
|
|
}
|
|
|
|
if (quatsPtr == -1) {
|
|
for (int i = 0; i < 8 * (mNumBones - mNumRootBones); i++) {
|
|
quint8 quat = aStream->ParseUInt8(QString("%1 quat %2").arg(GetName()).arg(i));
|
|
mQuats.append(quat);
|
|
}
|
|
}
|
|
|
|
if (transPtr == -1) {
|
|
for (int i = 0; i < 16 * (mNumBones - mNumRootBones); i++) {
|
|
float trans = aStream->ParseSingle(QString("%1 trans %2").arg(GetName()).arg(i));
|
|
mTrans.append(trans);
|
|
}
|
|
}
|
|
|
|
if (partClassPtr == -1) {
|
|
for (int i = 0; i < mNumBones; i++) {
|
|
quint8 partClass = aStream->ParseUInt8(QString("%1 part class %2").arg(GetName()).arg(i));
|
|
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);
|
|
mStreamInfo.ParseData(aStream);
|
|
mPhysPreset.ParseData(aStream);
|
|
mPhysGeoms.ParseData(aStream);
|
|
}
|
|
|
|
|
|
void XModel::Clear()
|
|
{
|
|
|
|
}
|