XPlor/libs/xassets/xmodel.cpp
2025-09-10 21:58:26 -04:00

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()
{
}