XPlor/libs/xassets/xmodel.cpp

175 lines
5.2 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()
2025-09-10 21:58:26 -04:00
, mLodInfo(4)
2025-09-03 13:02:54 -04:00
, 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);
2025-09-10 21:58:26 -04:00
SetName("Model");
2025-09-05 18:35:17 -04:00
}
XModel::~XModel()
2025-09-03 13:02:54 -04:00
{
2025-08-14 17:30:25 -04:00
}
2025-09-10 21:58:26 -04:00
void XModel::ParseData(XDataStream *aStream) {
2025-09-07 23:16:08 -04:00
mName.ParsePtr(aStream, false);
qint32 boneNamesPtr, parentListPtr, quatsPtr, transPtr, partClassPtr;
2025-08-14 17:30:25 -04:00
2025-09-10 21:58:26 -04:00
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()));
2025-09-07 23:16:08 -04:00
mBaseMat.ParsePtr(aStream, false);
2025-09-10 21:58:26 -04:00
qint32 surfsPtr = aStream->ParseInt32(QString("%1 surfs ptr").arg(GetName()));
qint32 matHandlesPtr = aStream->ParseInt32(QString("%1 material handles ptr").arg(GetName()));
2025-09-07 23:16:08 -04:00
2025-09-10 21:58:26 -04:00
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()));
2025-09-07 23:16:08 -04:00
mBoneInfo.ParsePtr(aStream, false);
2025-09-10 21:58:26 -04:00
mRadius = aStream->ParseSingle(QString("%1 radius").arg(GetName()));
2025-09-07 23:16:08 -04:00
2025-09-10 21:58:26 -04:00
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()));
2025-09-07 23:16:08 -04:00
aStream->skipRawData(3);
mPhysPreset.ParsePtr(aStream, false);
mPhysGeoms.ParsePtr(aStream, false);
mName.ParseData(aStream);
2025-09-10 21:58:26 -04:00
if (boneNamesPtr == -1) {
for (int i = 0; i < mNumBones; i++) {
quint16 bone = aStream->ParseUInt16(QString("%1 bone %2").arg(GetName()).arg(i));
2025-09-07 23:16:08 -04:00
mBoneNames.append(bone);
}
}
2025-09-10 21:58:26 -04:00
if (parentListPtr == -1) {
for (int i = 0; i < (mNumBones - mNumRootBones); i++) {
quint8 parent = aStream->ParseUInt8(QString("%1 parent %2").arg(GetName()).arg(i));
2025-09-07 23:16:08 -04:00
mParentList.append(parent);
}
}
2025-09-10 21:58:26 -04:00
if (quatsPtr == -1) {
for (int i = 0; i < 8 * (mNumBones - mNumRootBones); i++) {
quint8 quat = aStream->ParseUInt8(QString("%1 quat %2").arg(GetName()).arg(i));
2025-09-07 23:16:08 -04:00
mQuats.append(quat);
}
}
2025-09-10 21:58:26 -04:00
if (transPtr == -1) {
for (int i = 0; i < 16 * (mNumBones - mNumRootBones); i++) {
float trans = aStream->ParseSingle(QString("%1 trans %2").arg(GetName()).arg(i));
2025-09-07 23:16:08 -04:00
mTrans.append(trans);
}
}
2025-09-10 21:58:26 -04:00
if (partClassPtr == -1) {
for (int i = 0; i < mNumBones; i++) {
quint8 partClass = aStream->ParseUInt8(QString("%1 part class %2").arg(GetName()).arg(i));
2025-09-07 23:16:08 -04:00
mPartClassification.append(partClass);
}
}
mBaseMat.ParseData(aStream);
2025-09-10 21:58:26 -04:00
if (surfsPtr == -1) {
for (int i = 0; i < mNumSurfs; i++) {
2025-09-07 23:16:08 -04:00
XSurface newSurf;
newSurf.ParseData(aStream);
mSurfs.append(newSurf);
}
}
2025-09-10 21:58:26 -04:00
if (matHandlesPtr == -1) {
for (int i = 0; i < mNumSurfs; i++) {
2025-09-07 23:16:08 -04:00
XMaterial newMaterial;
newMaterial.ParseData(aStream);
mMaterialHandles.append(newMaterial);
}
}
2025-09-10 21:58:26 -04:00
if (collSurfsPtr == -1) {
for (int i = 0; i < mNumCollSurfs; i++) {
2025-09-07 23:16:08 -04:00
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-10 21:58:26 -04:00
mStreamInfo.ParseData(aStream);
mPhysPreset.ParseData(aStream);
mPhysGeoms.ParseData(aStream);
2025-09-05 18:35:17 -04:00
}
2025-09-10 21:58:26 -04:00
2025-09-05 18:35:17 -04:00
void XModel::Clear()
{
2025-08-14 17:30:25 -04:00
}