From 8d5e5812ec7130960244e4fdf54d722f265bdd1f Mon Sep 17 00:00:00 2001 From: njohnson Date: Mon, 15 Sep 2025 18:52:05 -0400 Subject: [PATCH] Refactor: Updated compression functions for LZX format. --- libs/compression/compression.cpp | 78 ++++++++++++++-------- libs/compression/minilzo.c | 6 -- libs/core/xdatastream.cpp | 18 +++++ libs/core/xdatastream.h | 1 + libs/libs.pro | 6 +- libs/xassets/xd3denums.h | 8 ++- libs/xassets/xoperandinternaldataunion.cpp | 4 +- libs/xassets/xphysmass.cpp | 17 +++-- libs/xassets/xphysmass.h | 4 +- libs/xassets/xrectdef.cpp | 22 +++--- libs/xassets/xrectdef.h | 10 +-- libs/xassets/xsrftriangles.cpp | 19 ++++-- libs/xassets/xsrftriangles.h | 8 +-- libs/xassets/xstatement.cpp | 19 ++++-- libs/xassets/xstatement.h | 6 +- libs/xassets/xstreamdelayinfo.cpp | 12 +--- libs/xassets/xstreamdelayinfo.h | 6 +- libs/xassets/xstreamedsound.cpp | 12 +--- libs/xassets/xstreamedsound.h | 7 +- libs/xassets/xstreamfileinfo.cpp | 19 ++++-- libs/xassets/xstreamfileinfo.h | 8 ++- libs/xassets/xstreamfilename.cpp | 14 ++-- libs/xassets/xstreamfilename.h | 4 +- libs/xassets/xstreamfilenamepacked.cpp | 15 ++--- libs/xassets/xstreamfilenamepacked.h | 2 +- libs/xassets/xstreamfilenameraw.cpp | 16 ++--- libs/xassets/xstreamfilenameraw.h | 6 +- libs/xassets/xstreamsourceinfo.cpp | 11 +-- libs/xassets/xstreamsourceinfo.h | 6 +- libs/xassets/xtexturedesc.cpp | 16 ++++- libs/xassets/xwaterwritable.cpp | 2 +- libs/xassets/xwindowdef.cpp | 65 ++++++++++++++++-- libs/xassets/xwindowdef.h | 6 +- 33 files changed, 276 insertions(+), 177 deletions(-) diff --git a/libs/compression/compression.cpp b/libs/compression/compression.cpp index 0d8116b..850e72a 100644 --- a/libs/compression/compression.cpp +++ b/libs/compression/compression.cpp @@ -31,7 +31,8 @@ QByteArray Compression::CompressXMem(const QByteArray &data) return output; } -QByteArray Compression::DecompressXMem(const QByteArray &data, int flags, int windowSize, int partSize) +QByteArray Compression::DecompressXMem(const QByteArray &data, + int flags, int windowSize, int partSize) { if (data.isEmpty()) return {}; @@ -41,27 +42,49 @@ QByteArray Compression::DecompressXMem(const QByteArray &data, int flags, int wi lzxParams.WindowSize = windowSize; lzxParams.CompressionPartitionSize = partSize; - XMEMDECOMPRESSION_CONTEXT ctx = nullptr; - if (FAILED(XMemCreateDecompressionContext(XMEMCODEC_LZX, &lzxParams, 0, &ctx)) || !ctx) - return {}; + QByteArray internalState(0x94933, Qt::Uninitialized); - // Allocate large enough buffer for decompression (16 MB is a safe upper bound) - const SIZE_T kMaxOutSize = 16 * 1024 * 1024; - QByteArray output(static_cast(kMaxOutSize), Qt::Uninitialized); - SIZE_T actualSize = kMaxOutSize; + XMEMDECOMPRESSION_CONTEXT ctx = XMemInitializeDecompressionContext( + XMEMCODEC_LZX, &lzxParams, 1, + internalState.data(), internalState.size()); - HRESULT hr = XMemDecompress(ctx, - output.data(), &actualSize, - data.constData(), data.size() + 16); - - XMemDestroyDecompressionContext(ctx); - - if (FAILED(hr)) { - qWarning() << "XMemDecompress failed with HRESULT:" << hr; + if (!ctx || XMemResetDecompressionContext(ctx)) { + qWarning() << "Failed to init LZX context"; return {}; } - output.resize(static_cast(actualSize)); + QByteArray output; + output.reserve(16 * 1024 * 1024); // rough guess + + const quint8 *nextIn = reinterpret_cast(data.constData()); + SIZE_T availIn = data.size(); + + QByteArray scratch(0x10000, Qt::Uninitialized); // 64 KB chunks + + while (availIn > 0) { + SIZE_T inSize = availIn; // let XMem tell us how much it will consume + SIZE_T outSize = scratch.size(); // max 64 KB per call + + HRESULT hr = XMemDecompressStream(ctx, + scratch.data(), &outSize, + nextIn, &inSize); + + if (FAILED(hr)) { + qWarning() << "XMemDecompressStream failed, hr=" << hr; + XMemDestroyDecompressionContext(ctx); + return {}; + } + + if (inSize == 0 && outSize == 0) + break; // no progress + + output.append(scratch.constData(), static_cast(outSize)); + + nextIn += inSize; + availIn -= inSize; + } + + XMemDestroyDecompressionContext(ctx); return output; } @@ -77,19 +100,18 @@ quint32 Compression::CalculateAdler32Checksum(const QByteArray &data) { qint64 Compression::FindZlibOffset(const QByteArray &bytes) { - static const QByteArray iwffs("IWffs"); - auto idx = bytes.indexOf(iwffs); - if (idx != -1) - return idx + 0x4000; + QDataStream stream(bytes); - const char header = 0x78; // z-lib: 0x78 [FLG] - int pos = -1; - while ((pos = bytes.indexOf(header, pos + 1)) != -1) + while (!stream.atEnd()) { - QByteArray window = bytes.mid(pos, 0x20); - if (!window.contains(QByteArray::fromHex("000000")) && - !window.contains(QByteArray::fromHex("FFFFFF"))) - return pos; + QByteArray testSegment = stream.device()->peek(2).toHex().toUpper(); + if (testSegment == "7801" || + testSegment == "785E" || + testSegment == "789C" || + testSegment == "78DA") { + return stream.device()->pos(); + } + stream.skipRawData(1); } return -1; } diff --git a/libs/compression/minilzo.c b/libs/compression/minilzo.c index 8fd8664..60b31c3 100644 --- a/libs/compression/minilzo.c +++ b/libs/compression/minilzo.c @@ -25,12 +25,6 @@ http://www.oberhumer.com/opensource/lzo/ */ -/* - * NOTE: - * the full LZO package can be found at - * http://www.oberhumer.com/opensource/lzo/ - */ - #define __LZO_IN_MINILZO 1 #if defined(LZO_CFG_FREESTANDING) diff --git a/libs/core/xdatastream.cpp b/libs/core/xdatastream.cpp index 326a4bc..3e04489 100644 --- a/libs/core/xdatastream.cpp +++ b/libs/core/xdatastream.cpp @@ -223,3 +223,21 @@ double XDataStream::ParseDouble(const QString& aDebugString) } return val; } + +bool XDataStream::ParseBool(const QString &aDebugString) +{ + qint64 start = this->device()->pos(); + + char val; + *this >> val; + + if (mDebug) + { + qDebug() << QString("[%1-%2] Parsed %3: %4") + .arg(start, 10, 10, QChar('0')) + .arg(this->device()->pos(), 10, 10, QChar('0')) + .arg(aDebugString) + .arg(val); + } + return val; +} diff --git a/libs/core/xdatastream.h b/libs/core/xdatastream.h index 5cf9631..0159e16 100644 --- a/libs/core/xdatastream.h +++ b/libs/core/xdatastream.h @@ -25,6 +25,7 @@ public: quint64 ParseUInt64(const QString& aDebugString = ""); float ParseSingle(const QString& aDebugString = ""); double ParseDouble(const QString& aDebugString = ""); + bool ParseBool(const QString& aDebugString = ""); private: bool mDebug; diff --git a/libs/libs.pro b/libs/libs.pro index 011f76b..22b55a7 100644 --- a/libs/libs.pro +++ b/libs/libs.pro @@ -6,6 +6,6 @@ SUBDIRS += core \ fastfile \ xassets \ zonefile \ - ddsfile \ - iwifile \ - ipakfile + #ddsfile \ + #iwifile \ + #ipakfile diff --git a/libs/xassets/xd3denums.h b/libs/xassets/xd3denums.h index 717a0d5..b0aa47d 100644 --- a/libs/xassets/xd3denums.h +++ b/libs/xassets/xd3denums.h @@ -1,7 +1,9 @@ #ifndef XD3DENUMS_H #define XD3DENUMS_H -enum XD3DResourceType +#include + +enum XD3DResourceType : qint32 { D3DRTYPE_NONE = 0x0, D3DRTYPE_VERTEXBUFFER = 0x1, @@ -21,7 +23,7 @@ enum XD3DResourceType D3DRTYPE_FORCE_DWORD = 0x7FFFFFFF, }; -enum XD3DFormat +enum XD3DFormat : qint32 { D3DFMT_DXT1 = 0x1A200152, D3DFMT_LIN_DXT1 = 0x1A200052, @@ -177,7 +179,7 @@ enum XD3DFormat D3DFMT_FORCE_DWORD = 0x7FFFFFFF, }; -enum XD3DMultiSampleType +enum XD3DMultiSampleType : qint32 { D3DMULTISAMPLE_NONE = 0x0, D3DMULTISAMPLE_2_SAMPLES = 0x1, diff --git a/libs/xassets/xoperandinternaldataunion.cpp b/libs/xassets/xoperandinternaldataunion.cpp index e24464b..931f22f 100644 --- a/libs/xassets/xoperandinternaldataunion.cpp +++ b/libs/xassets/xoperandinternaldataunion.cpp @@ -16,9 +16,7 @@ XOperandInternalDataUnion::~XOperandInternalDataUnion() void XOperandInternalDataUnion::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XOperandInternalDataUnion::ParseData + aStream->ParseSingle(QString("%1 center of mass x").arg(GetName())); } void XOperandInternalDataUnion::Clear() diff --git a/libs/xassets/xphysmass.cpp b/libs/xassets/xphysmass.cpp index 2c5c4ed..f5c331f 100644 --- a/libs/xassets/xphysmass.cpp +++ b/libs/xassets/xphysmass.cpp @@ -9,16 +9,19 @@ XPhysMass::XPhysMass() SetName("Phys Mass"); } -XPhysMass::~XPhysMass() -{ - -} - void XPhysMass::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mCenterOfMass.setX(aStream->ParseSingle(QString("%1 center of mass x").arg(GetName()))); + mCenterOfMass.setY(aStream->ParseSingle(QString("%1 center of mass y").arg(GetName()))); + mCenterOfMass.setZ(aStream->ParseSingle(QString("%1 center of mass z").arg(GetName()))); - // TODO: Fill in XPhysMass::ParseData + mMomentsOfInertia.setX(aStream->ParseSingle(QString("%1 moments of inertia x").arg(GetName()))); + mMomentsOfInertia.setY(aStream->ParseSingle(QString("%1 moments of inertia y").arg(GetName()))); + mMomentsOfInertia.setZ(aStream->ParseSingle(QString("%1 moments of inertia y").arg(GetName()))); + + mProductsOfInertia.setX(aStream->ParseSingle(QString("%1 products of inertia x").arg(GetName()))); + mProductsOfInertia.setY(aStream->ParseSingle(QString("%1 products of inertia y").arg(GetName()))); + mProductsOfInertia.setZ(aStream->ParseSingle(QString("%1 products of inertia z").arg(GetName()))); } void XPhysMass::Clear() diff --git a/libs/xassets/xphysmass.h b/libs/xassets/xphysmass.h index fb84128..f6469ae 100644 --- a/libs/xassets/xphysmass.h +++ b/libs/xassets/xphysmass.h @@ -8,8 +8,8 @@ class XPhysMass : public XAsset { public: - XPhysMass(); - ~XPhysMass(); + explicit XPhysMass(); + ~XPhysMass() = default; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; diff --git a/libs/xassets/xrectdef.cpp b/libs/xassets/xrectdef.cpp index 387ee02..704f58f 100644 --- a/libs/xassets/xrectdef.cpp +++ b/libs/xassets/xrectdef.cpp @@ -4,32 +4,30 @@ XRectDef::XRectDef() : XAsset() , mX(0) , mY(0) - , mW(0) - , mH(0) + , mWidth(0) + , mHeight(0) , mHorzAlign(0) , mVertAlign(0) { SetName("Rectangle Definition"); } -XRectDef::~XRectDef() -{ - -} - void XRectDef::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XRectDef::ParseData + mX = aStream->ParseSingle(QString("%1 x").arg(GetName())); + mY = aStream->ParseSingle(QString("%1 y").arg(GetName())); + mWidth = aStream->ParseSingle(QString("%1 width").arg(GetName())); + mHeight = aStream->ParseSingle(QString("%1 height").arg(GetName())); + mHorzAlign = aStream->ParseInt32(QString("%1 horizontal align").arg(GetName())); + mVertAlign = aStream->ParseInt32(QString("%1 vertical align").arg(GetName())); } void XRectDef::Clear() { mX = 0; mY = 0; - mW = 0; - mH = 0; + mWidth = 0; + mHeight = 0; mHorzAlign = 0; mVertAlign = 0; } diff --git a/libs/xassets/xrectdef.h b/libs/xassets/xrectdef.h index 9935bf2..aef5ed4 100644 --- a/libs/xassets/xrectdef.h +++ b/libs/xassets/xrectdef.h @@ -7,7 +7,7 @@ class XRectDef : public XAsset { public: explicit XRectDef(); - ~XRectDef(); + ~XRectDef() = default; void ParseData(XDataStream *aStream) override; void Clear() override; @@ -15,10 +15,10 @@ public: private: float mX; float mY; - float mW; - float mH; - int mHorzAlign; - int mVertAlign; + float mWidth; + float mHeight; + qint32 mHorzAlign; + qint32 mVertAlign; }; #endif // XRECTDEF_H diff --git a/libs/xassets/xsrftriangles.cpp b/libs/xassets/xsrftriangles.cpp index 29493f3..a4a1a14 100644 --- a/libs/xassets/xsrftriangles.cpp +++ b/libs/xassets/xsrftriangles.cpp @@ -13,16 +13,21 @@ XSrfTriangles::XSrfTriangles() SetName("Surface Triangles"); } -XSrfTriangles::~XSrfTriangles() -{ - -} - void XSrfTriangles::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mVertexLayerData = aStream->ParseInt32(QString("%1 vertex layer data").arg(GetName())); + mFirstVertex = aStream->ParseInt32(QString("%1 first vertex").arg(GetName())); + mVertexCount = aStream->ParseUInt32(QString("%1 vertex count").arg(GetName())); + mTriCount = aStream->ParseUInt32(QString("%1 tri count").arg(GetName())); + mBaseIndex = aStream->ParseInt32(QString("%1 base index").arg(GetName())); - // TODO: Fill in XSrfTriangles::ParseData + mTopMipMins.setX(aStream->ParseSingle(QString("%1 top mip min x").arg(GetName()))); + mTopMipMins.setY(aStream->ParseSingle(QString("%1 top mip min y").arg(GetName()))); + mTopMipMins.setZ(aStream->ParseSingle(QString("%1 top mip min z").arg(GetName()))); + + mTopMipMins.setX(aStream->ParseSingle(QString("%1 top mip max x").arg(GetName()))); + mTopMipMins.setY(aStream->ParseSingle(QString("%1 top mip max y").arg(GetName()))); + mTopMipMins.setZ(aStream->ParseSingle(QString("%1 top mip max z").arg(GetName()))); } void XSrfTriangles::Clear() diff --git a/libs/xassets/xsrftriangles.h b/libs/xassets/xsrftriangles.h index b322782..04d1ae1 100644 --- a/libs/xassets/xsrftriangles.h +++ b/libs/xassets/xsrftriangles.h @@ -9,17 +9,17 @@ class XSrfTriangles : public XAsset { public: explicit XSrfTriangles(); - ~XSrfTriangles(); + ~XSrfTriangles() = default; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; private: - int mVertexLayerData; - int mFirstVertex; + qint32 mVertexLayerData; + qint32 mFirstVertex; quint32 mVertexCount; quint32 mTriCount; - int mBaseIndex; + qint32 mBaseIndex; QVector3D mTopMipMins; QVector3D mTopMipMaxs; }; diff --git a/libs/xassets/xstatement.cpp b/libs/xassets/xstatement.cpp index 675caaa..38c82d4 100644 --- a/libs/xassets/xstatement.cpp +++ b/libs/xassets/xstatement.cpp @@ -8,16 +8,21 @@ XStatement::XStatement() SetName("Statement"); } -XStatement::~XStatement() -{ - -} - void XStatement::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mNumEntries = aStream->ParseInt32(QString("%1 # entries").arg(GetName())); - // TODO: Fill in XStatement::ParseData + qint32 entriesPtr; + entriesPtr = aStream->ParseInt32(QString("%1 entries ptr").arg(GetName())); + if (entriesPtr) + { + for (int i = 0; i < mNumEntries; i++) + { + XExpressionEntry newEntry; + newEntry.ParsePtr(aStream); + mEntries.append(newEntry); + } + } } void XStatement::Clear() diff --git a/libs/xassets/xstatement.h b/libs/xassets/xstatement.h index b930931..c75b61b 100644 --- a/libs/xassets/xstatement.h +++ b/libs/xassets/xstatement.h @@ -10,14 +10,14 @@ class XStatement : public XAsset { public: explicit XStatement(); - ~XStatement(); + ~XStatement() = default; void ParseData(XDataStream *aStream) override; void Clear() override; private: - int mNumEntries; - QVector mEntries; + qint32 mNumEntries; + QVector mEntries; }; #endif // XSTATEMENT_H diff --git a/libs/xassets/xstreamdelayinfo.cpp b/libs/xassets/xstreamdelayinfo.cpp index eed9f4a..dd7d770 100644 --- a/libs/xassets/xstreamdelayinfo.cpp +++ b/libs/xassets/xstreamdelayinfo.cpp @@ -2,26 +2,18 @@ XStreamDelayInfo::XStreamDelayInfo() : XAsset() - , mPtr(0) , mSize(0) { SetName("Stream Delay Info"); } -XStreamDelayInfo::~XStreamDelayInfo() -{ - -} - void XStreamDelayInfo::Clear() { - mPtr = nullptr; + //mPtr = nullptr; mSize = 0; } void XStreamDelayInfo::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XStreamDelayInfo::ParseData + mSize = aStream->ParseInt32(QString("%1 size").arg(GetName())); } diff --git a/libs/xassets/xstreamdelayinfo.h b/libs/xassets/xstreamdelayinfo.h index 2b05525..131bc81 100644 --- a/libs/xassets/xstreamdelayinfo.h +++ b/libs/xassets/xstreamdelayinfo.h @@ -7,14 +7,14 @@ class XStreamDelayInfo : public XAsset { public: XStreamDelayInfo(); - ~XStreamDelayInfo(); + ~XStreamDelayInfo() = default; virtual void Clear() override; virtual void ParseData(XDataStream* aStream) override; private: - const void *mPtr; - int mSize; + //const void *mPtr; + qint32 mSize; }; #endif // XSTREAMDELAYINFO_H diff --git a/libs/xassets/xstreamedsound.cpp b/libs/xassets/xstreamedsound.cpp index 3059224..f86c8f5 100644 --- a/libs/xassets/xstreamedsound.cpp +++ b/libs/xassets/xstreamedsound.cpp @@ -2,23 +2,17 @@ XStreamedSound::XStreamedSound() : XAsset() + , mFileName() { SetName("Streamed Sound"); } -XStreamedSound::~XStreamedSound() -{ - -} - void XStreamedSound::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XStreamedSound::ParseData + mFileName.ParseData(aStream); } void XStreamedSound::Clear() { - + mFileName.Clear(); } diff --git a/libs/xassets/xstreamedsound.h b/libs/xassets/xstreamedsound.h index e95367a..aef6a57 100644 --- a/libs/xassets/xstreamedsound.h +++ b/libs/xassets/xstreamedsound.h @@ -2,20 +2,19 @@ #define XSTREAMEDSOUND_H #include "xasset.h" - -class XStreamedFileName; +#include "xstreamfilename.h" class XStreamedSound : public XAsset { public: XStreamedSound(); - ~XStreamedSound(); + ~XStreamedSound() = default; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; private: - XStreamedFileName* mStreamed; + XStreamFileName mFileName; }; #endif // XSTREAMEDSOUND_H diff --git a/libs/xassets/xstreamfileinfo.cpp b/libs/xassets/xstreamfileinfo.cpp index a81df03..5f38c5b 100644 --- a/libs/xassets/xstreamfileinfo.cpp +++ b/libs/xassets/xstreamfileinfo.cpp @@ -1,24 +1,31 @@ #include "xstreamfileinfo.h" +#include "xstreamfilename.h" XStreamFileInfo::XStreamFileInfo() : XAsset() + , mParent(nullptr) + , mRaw() { SetName("Stream File Info"); } -XStreamFileInfo::~XStreamFileInfo() +XStreamFileInfo::XStreamFileInfo(XStreamFileName &aParent) + : XAsset() + , mParent(&aParent) + , mRaw() { - + SetName("Stream File Info"); } void XStreamFileInfo::Clear() { - + mRaw.Clear(); } void XStreamFileInfo::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XStreamFileInfo::ParseData + if (mParent && !mParent->GetFileIndex()) + { + mRaw.ParseData(aStream); + } } diff --git a/libs/xassets/xstreamfileinfo.h b/libs/xassets/xstreamfileinfo.h index 10583aa..ceaa826 100644 --- a/libs/xassets/xstreamfileinfo.h +++ b/libs/xassets/xstreamfileinfo.h @@ -2,21 +2,23 @@ #define XSTREAMFILEINFO_H #include "xasset.h" -#include "xstreamfilenamepacked.h" #include "xstreamfilenameraw.h" +class XStreamFileName; + class XStreamFileInfo : public XAsset { public: XStreamFileInfo(); - ~XStreamFileInfo(); + XStreamFileInfo(XStreamFileName& aParent); + ~XStreamFileInfo() = default; virtual void Clear() override; virtual void ParseData(XDataStream* aStream) override; private: + XStreamFileName* mParent; XStreamFileNameRaw mRaw; - XStreamFileNamePacked mPacked; }; #endif // XSTREAMFILEINFO_H diff --git a/libs/xassets/xstreamfilename.cpp b/libs/xassets/xstreamfilename.cpp index 0e3dac8..76dae3f 100644 --- a/libs/xassets/xstreamfilename.cpp +++ b/libs/xassets/xstreamfilename.cpp @@ -8,16 +8,11 @@ XStreamFileName::XStreamFileName() SetName("Stream File Name"); } -XStreamFileName::~XStreamFileName() -{ - -} - void XStreamFileName::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mFileIndex = aStream->ParseUInt32(QString("%1 file index").arg(GetName())); - // TODO: Fill in XStreamFileName::ParseData + mInfo.ParseData(aStream); } void XStreamFileName::Clear() @@ -25,3 +20,8 @@ void XStreamFileName::Clear() mFileIndex = 0; mInfo.Clear(); } + +quint32 XStreamFileName::GetFileIndex() const +{ + return mFileIndex; +} diff --git a/libs/xassets/xstreamfilename.h b/libs/xassets/xstreamfilename.h index de44713..46993dd 100644 --- a/libs/xassets/xstreamfilename.h +++ b/libs/xassets/xstreamfilename.h @@ -8,11 +8,13 @@ class XStreamFileName : public XAsset { public: explicit XStreamFileName(); - ~XStreamFileName(); + ~XStreamFileName() = default; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; + quint32 GetFileIndex() const; + private: quint32 mFileIndex; XStreamFileInfo mInfo; diff --git a/libs/xassets/xstreamfilenamepacked.cpp b/libs/xassets/xstreamfilenamepacked.cpp index 45dd4a7..6bc1027 100644 --- a/libs/xassets/xstreamfilenamepacked.cpp +++ b/libs/xassets/xstreamfilenamepacked.cpp @@ -2,23 +2,20 @@ XStreamFileNamePacked::XStreamFileNamePacked() : XAsset() + , mOffset(0) + , mLength(0) { SetName("Stream File Name Packed"); } -XStreamFileNamePacked::~XStreamFileNamePacked() -{ - -} - void XStreamFileNamePacked::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XStreamFileNamePacked::ParseData + mOffset = aStream->ParseUInt32(QString("%1 offset").arg(GetName())); + mLength = aStream->ParseUInt32(QString("%1 length").arg(GetName())); } void XStreamFileNamePacked::Clear() { - + mOffset = 0; + mLength = 0; } diff --git a/libs/xassets/xstreamfilenamepacked.h b/libs/xassets/xstreamfilenamepacked.h index 9e7f6e9..7190bc2 100644 --- a/libs/xassets/xstreamfilenamepacked.h +++ b/libs/xassets/xstreamfilenamepacked.h @@ -9,7 +9,7 @@ class XStreamFileNamePacked : public XAsset { public: XStreamFileNamePacked(); - ~XStreamFileNamePacked(); + ~XStreamFileNamePacked() = default; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; diff --git a/libs/xassets/xstreamfilenameraw.cpp b/libs/xassets/xstreamfilenameraw.cpp index 6d6d676..5530a73 100644 --- a/libs/xassets/xstreamfilenameraw.cpp +++ b/libs/xassets/xstreamfilenameraw.cpp @@ -2,23 +2,23 @@ XStreamFileNameRaw::XStreamFileNameRaw() : XAsset() + , mDir() + , mName() { SetName("Stream File Name Raw"); } -XStreamFileNameRaw::~XStreamFileNameRaw() -{ - -} - void XStreamFileNameRaw::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mDir.ParsePtr(aStream, false); + mName.ParsePtr(aStream, false); - // TODO: Fill in XStreamFileNameRaw::ParseData + mDir.ParseData(aStream); + mName.ParseData(aStream); } void XStreamFileNameRaw::Clear() { - + mDir.Clear(); + mName.Clear(); } diff --git a/libs/xassets/xstreamfilenameraw.h b/libs/xassets/xstreamfilenameraw.h index 0fcf8bc..e58b625 100644 --- a/libs/xassets/xstreamfilenameraw.h +++ b/libs/xassets/xstreamfilenameraw.h @@ -8,14 +8,14 @@ class XStreamFileNameRaw : public XAsset { public: XStreamFileNameRaw(); - ~XStreamFileNameRaw(); + ~XStreamFileNameRaw() = default; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; private: - XString* mDir; - XString* mName; + XString mDir; + XString mName; }; #endif // XSTREAMFILENAMERAW_H diff --git a/libs/xassets/xstreamsourceinfo.cpp b/libs/xassets/xstreamsourceinfo.cpp index f4efba4..058ba0f 100644 --- a/libs/xassets/xstreamsourceinfo.cpp +++ b/libs/xassets/xstreamsourceinfo.cpp @@ -9,11 +9,6 @@ XStreamSourceInfo::XStreamSourceInfo() SetName("Stream Source Info"); } -XStreamSourceInfo::~XStreamSourceInfo() -{ - -} - void XStreamSourceInfo::Clear() { mStream = 0; @@ -23,7 +18,7 @@ void XStreamSourceInfo::Clear() void XStreamSourceInfo::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XStreamSourceInfo::ParseData + mStream = aStream->ParseUInt16(QString("%1 stream").arg(GetName())); + mOffset = aStream->ParseUInt16(QString("%1 offset").arg(GetName())); + mType = aStream->ParseUInt32(QString("%1 type").arg(GetName())); } diff --git a/libs/xassets/xstreamsourceinfo.h b/libs/xassets/xstreamsourceinfo.h index 57c9f49..b68479f 100644 --- a/libs/xassets/xstreamsourceinfo.h +++ b/libs/xassets/xstreamsourceinfo.h @@ -7,14 +7,14 @@ class XStreamSourceInfo : public XAsset { public: XStreamSourceInfo(); - ~XStreamSourceInfo(); + ~XStreamSourceInfo() = default; virtual void Clear() override; virtual void ParseData(XDataStream* aStream) override; private: - quint32 mStream; - quint32 mOffset; + quint16 mStream; + quint16 mOffset; quint32 mType; }; diff --git a/libs/xassets/xtexturedesc.cpp b/libs/xassets/xtexturedesc.cpp index 5aeff51..7a3f26c 100644 --- a/libs/xassets/xtexturedesc.cpp +++ b/libs/xassets/xtexturedesc.cpp @@ -35,5 +35,19 @@ void XTextureDesc::ParseData(XDataStream *aStream) { Q_UNUSED(aStream); - // TODO: Fill in XTextureDesc::ParseData + mResourceType = (XD3DResourceType)aStream->ParseInt32(QString("%1 resource type").arg(GetName())); + mWidth = aStream->ParseUInt32(QString("%1 width").arg(GetName())); + mHeight = aStream->ParseUInt32(QString("%1 height").arg(GetName())); + mDepth = aStream->ParseUInt32(QString("%1 depth").arg(GetName())); + mFormat = (XD3DFormat)aStream->ParseInt32(QString("%1 format").arg(GetName())); + mRowPitch = aStream->ParseUInt32(QString("%1 row pitch").arg(GetName())); + mSlicePitch = aStream->ParseUInt32(QString("%1 slice pitch").arg(GetName())); + mBitsPerPixel = aStream->ParseUInt32(QString("%1 bits per pixel").arg(GetName())); + mWidthInBlocks = aStream->ParseUInt32(QString("%1 width in blocks").arg(GetName())); + mHeightInBlocks = aStream->ParseUInt32(QString("%1 height in blocks").arg(GetName())); + mDepthInBlocks = aStream->ParseUInt32(QString("%1 depth in blocks").arg(GetName())); + mBytesPerBlock = aStream->ParseUInt32(QString("%1 bytes per block").arg(GetName())); + mExpBias = aStream->ParseInt32(QString("%1 exp bias").arg(GetName())); + mFlags = aStream->ParseUInt32(QString("%1 flags").arg(GetName())); + mMultiSampleType = (XD3DMultiSampleType)aStream->ParseInt32(QString("%1 multi-sample type").arg(GetName())); } diff --git a/libs/xassets/xwaterwritable.cpp b/libs/xassets/xwaterwritable.cpp index faa6061..4b50f62 100644 --- a/libs/xassets/xwaterwritable.cpp +++ b/libs/xassets/xwaterwritable.cpp @@ -16,7 +16,7 @@ void XWaterWritable::ParseData(XDataStream *aStream) { Q_UNUSED(aStream); - // TODO: Fill in XWaterWritable::ParseData + mFloatTime = aStream->ParseSingle(QString("%1 float time").arg(GetName())); } void XWaterWritable::Clear() diff --git a/libs/xassets/xwindowdef.cpp b/libs/xassets/xwindowdef.cpp index 86ae6f1..077fdba 100644 --- a/libs/xassets/xwindowdef.cpp +++ b/libs/xassets/xwindowdef.cpp @@ -2,10 +2,10 @@ XWindowDef::XWindowDef() : XAsset() - , mName("") + , mName() , mRect() , mRectClient() - , mGroup("") + , mGroup() , mStyle(0) , mBorder(0) , mOwnerDraw(0) @@ -18,7 +18,7 @@ XWindowDef::XWindowDef() , mBackColor() , mBorderColor() , mOutlineColor() - , mBackground(new XMaterial()) + , mBackground() { SetName("Window Definition"); } @@ -32,15 +32,66 @@ void XWindowDef::ParseData(XDataStream *aStream) { Q_UNUSED(aStream); - // TODO: Fill in XWindowDef::ParseData + mName.ParsePtr(aStream, false); + + mRect.ParseData(aStream); + mRectClient.ParseData(aStream); + + mGroup.ParsePtr(aStream, false); + + mStyle = aStream->ParseInt32(QString("%1 style").arg(GetName())); + mBorder = aStream->ParseInt32(QString("%1 border").arg(GetName())); + mOwnerDraw = aStream->ParseInt32(QString("%1 owner draw").arg(GetName())); + mOwnerDrawFlags = aStream->ParseInt32(QString("%1 owner draw flags").arg(GetName())); + mBorderSize = aStream->ParseSingle(QString("%1 border size").arg(GetName())); + mStaticFlags = aStream->ParseInt32(QString("%1 static flags").arg(GetName())); + + for (int i = 0; i < 4; i++) + { + mDynamicFlags[i] = aStream->ParseInt32(QString("%1 dynamic flag %2").arg(GetName()).arg(i)); + } + + mNextTime = aStream->ParseInt32(QString("%1 next time").arg(GetName())); + + float r, g, b, a; + + r = aStream->ParseSingle(QString("%1 foreground red").arg(GetName())); + g = aStream->ParseSingle(QString("%1 foreground green").arg(GetName())); + b = aStream->ParseSingle(QString("%1 foreground blue").arg(GetName())); + a = aStream->ParseSingle(QString("%1 foreground alpha").arg(GetName())); + mForeColor = QColor(r, g, b, a); + + r = aStream->ParseSingle(QString("%1 background red").arg(GetName())); + g = aStream->ParseSingle(QString("%1 background green").arg(GetName())); + b = aStream->ParseSingle(QString("%1 background blue").arg(GetName())); + a = aStream->ParseSingle(QString("%1 background alpha").arg(GetName())); + mBackColor = QColor(r, g, b, a); + + r = aStream->ParseSingle(QString("%1 border red").arg(GetName())); + g = aStream->ParseSingle(QString("%1 border green").arg(GetName())); + b = aStream->ParseSingle(QString("%1 border blue").arg(GetName())); + a = aStream->ParseSingle(QString("%1 border alpha").arg(GetName())); + mBorderColor = QColor(r, g, b, a); + + r = aStream->ParseSingle(QString("%1 outline red").arg(GetName())); + g = aStream->ParseSingle(QString("%1 outline green").arg(GetName())); + b = aStream->ParseSingle(QString("%1 outline blue").arg(GetName())); + a = aStream->ParseSingle(QString("%1 outline alpha").arg(GetName())); + mOutlineColor = QColor(r, g, b, a); + + mBackground.ParsePtr(aStream, false); + + mName.ParseData(aStream); + mGroup.ParseData(aStream); + mBackground.ParseData(aStream); } void XWindowDef::Clear() { - mName.clear(); + mName.Clear(); mRect.Clear(); mRectClient.Clear(); - mGroup.clear(); + mGroup.Clear(); mStyle = 0; mBorder = 0; mOwnerDraw = 0; @@ -53,5 +104,5 @@ void XWindowDef::Clear() mBackColor = QColor(); mBorderColor = QColor(); mOutlineColor = QColor(); - mBackground->Clear(); + mBackground.Clear(); } diff --git a/libs/xassets/xwindowdef.h b/libs/xassets/xwindowdef.h index d9e79d0..3685a72 100644 --- a/libs/xassets/xwindowdef.h +++ b/libs/xassets/xwindowdef.h @@ -17,10 +17,10 @@ public: void Clear() override; private: - QString mName; + XString mName; XRectDef mRect; XRectDef mRectClient; - QString mGroup; + XString mGroup; int mStyle; int mBorder; int mOwnerDraw; @@ -33,7 +33,7 @@ private: QColor mBackColor; QColor mBorderColor; QColor mOutlineColor; - XMaterial *mBackground; + XMaterial mBackground; }; #endif // XWINDOWDEF_H