XPlor/libs/assets/animparts.h
2025-06-07 11:20:47 -04:00

191 lines
4.6 KiB
C++

#ifndef ANIMPARTS_H
#define ANIMPARTS_H
#include <QString>
#include <QDataStream>
union XAnimDynamicFrames
{
quint8 (*_1)[3];
quint16 (*_2)[3];
};
union XAnimDynamicIndices
{
quint8 _1[1];
quint16 _2[1];
};
struct XAnimPartTransFrames
{
float mins[3];
float size[3];
XAnimDynamicFrames frames;
XAnimDynamicIndices indices;
};
union XAnimPartTransData
{
XAnimPartTransFrames frames;
float frame0[3];
};
struct XAnimPartTrans
{
quint16 size;
quint8 smallTrans;
XAnimPartTransData u;
};
struct XAnimDeltaPartQuatDataFrames
{
qint16 (*frames)[2];
XAnimDynamicIndices indices;
};
union XAnimDeltaPartQuatData
{
XAnimDeltaPartQuatDataFrames frames;
qint16 frame0[2];
};
struct XAnimDeltaPartQuat
{
quint16 size;
XAnimDeltaPartQuatData u;
};
struct XAnimDeltaPart
{
XAnimPartTrans *trans;
XAnimDeltaPartQuat *quat;
};
struct XAnimNotifyInfo
{
quint16 name;
float time;
};
struct XAnimIndices
{
quint8 *_1;
quint16 *_2;
void *data;
};
struct XAnimParts
{
qint32 namePtr;
QString name;
quint16 dataByteCount;
quint16 dataShortCount;
quint16 dataIntCount;
quint16 randomDataByteCount;
quint16 randomDataIntCount;
quint16 numframes;
bool bLoop;
bool bDelta;
quint8 boneCount[12];
quint8 notifyCount;
quint8 assetType;
bool pad;
unsigned int randomDataShortCount;
unsigned int indexCount;
float framerate;
float frequency;
quint16 *names;
quint8 *dataByte;
qint16 *dataShort;
int *dataInt;
qint16 *randomDataShort;
quint8 *randomDataByte;
int *randomDataInt;
XAnimIndices indices;
qint32 notifyPtr;
XAnimNotifyInfo notify;
qint32 deltaPartPtr;
XAnimDeltaPart deltaPart;
};
QDataStream& operator<<(QDataStream& out, const XAnimParts& in) {
out.writeRawData(reinterpret_cast<const char*>(&in.namePtr), 4);
out.writeRawData(reinterpret_cast<const char*>(&in.dataByteCount), 2);
out.writeRawData(reinterpret_cast<const char*>(&in.dataShortCount), 2);
out.writeRawData(reinterpret_cast<const char*>(&in.dataIntCount), 2);
out.writeRawData(reinterpret_cast<const char*>(&in.randomDataByteCount), 2);
out.writeRawData(reinterpret_cast<const char*>(&in.randomDataIntCount), 2);
out.writeRawData(reinterpret_cast<const char*>(&in.numframes), 2);
out.writeRawData(reinterpret_cast<const char*>(&in.bLoop), 1);
out.writeRawData(reinterpret_cast<const char*>(&in.bDelta), 1);
for (int i = 0; i < 12; i++) {
out.writeRawData(reinterpret_cast<const char*>(&in.boneCount[i]), 1);
}
out.writeRawData(reinterpret_cast<const char*>(&in.notifyCount), 1);
out.writeRawData(reinterpret_cast<const char*>(&in.assetType), 1);
out.writeRawData(reinterpret_cast<const char*>(&in.pad), 1);
out.writeRawData(reinterpret_cast<const char*>(&in.randomDataShortCount), 2);
out.writeRawData(reinterpret_cast<const char*>(&in.indexCount), 2);
out.writeRawData(reinterpret_cast<const char*>(&in.framerate), 4);
out.writeRawData(reinterpret_cast<const char*>(&in.frequency), 4);
return out;
}
QDataStream& operator>>(QDataStream& in, XAnimParts& out) {
in.readRawData(reinterpret_cast<char*>(&out.namePtr), 4);
in.readRawData(reinterpret_cast<char*>(&out.dataByteCount), 2);
in.readRawData(reinterpret_cast<char*>(&out.dataShortCount), 2);
in.readRawData(reinterpret_cast<char*>(&out.dataIntCount), 2);
in.readRawData(reinterpret_cast<char*>(&out.randomDataByteCount), 2);
in.readRawData(reinterpret_cast<char*>(&out.randomDataIntCount), 2);
in.readRawData(reinterpret_cast<char*>(&out.numframes), 2);
in.readRawData(reinterpret_cast<char*>(&out.bLoop), 1);
in.readRawData(reinterpret_cast<char*>(&out.bDelta), 1);
for (int i = 0; i < 12; i++) {
in.readRawData(reinterpret_cast<char*>(&out.boneCount[i]), 1);
}
in.readRawData(reinterpret_cast<char*>(&out.notifyCount), 1);
in.readRawData(reinterpret_cast<char*>(&out.assetType), 1);
in.readRawData(reinterpret_cast<char*>(&out.pad), 1);
in.readRawData(reinterpret_cast<char*>(&out.randomDataShortCount), 2);
in.readRawData(reinterpret_cast<char*>(&out.indexCount), 2);
in.readRawData(reinterpret_cast<char*>(&out.framerate), 4);
in.readRawData(reinterpret_cast<char*>(&out.frequency), 4);
return in;
}
struct Animation {
QString name;
std::shared_ptr<XAnimParts> parts;
};
QDataStream& operator<<(QDataStream& out, const Animation& in) {
out << *in.parts;
return out;
}
QDataStream& operator>>(QDataStream& in, Animation& out) {
in >> *out.parts;
return in;
}
#endif // ANIMPARTS_H