diff --git a/app/app.pro b/app/app.pro index 1cbef80..433d696 100644 --- a/app/app.pro +++ b/app/app.pro @@ -10,7 +10,9 @@ SOURCES += $$files($$PWD/*.cpp) HEADERS += $$files($$PWD/*.h) FORMS += $$files($$PWD/*.ui) -RESOURCES += ../data/data.qrc +RESOURCES += ../data/data.qrc \ + ../data/Data.qrc \ + data/Data.qrc LIBS += \ -L$$PWD/../third_party/devil_sdk/lib/ -lDevIL -lILU -lILUT \ @@ -21,9 +23,6 @@ LIBS += \ -L$$OUT_PWD/../libs/ -lcompression \ -L$$OUT_PWD/../libs/ -lencryption \ -L$$OUT_PWD/../libs/ -lfastfile \ - -L$$OUT_PWD/../libs/ -lddsfile \ - -L$$OUT_PWD/../libs/ -lipakfile \ - -L$$OUT_PWD/../libs/ -liwifile \ -L$$OUT_PWD/../libs/ -lzonefile INCLUDEPATH += \ @@ -34,9 +33,6 @@ INCLUDEPATH += \ $$PWD/../libs/compression \ $$PWD/../libs/encryption \ $$PWD/../libs/fastfile \ - $$PWD/../libs/ddsfile \ - $$PWD/../libs/ipakfile \ - $$PWD/../libs/iwifile \ $$PWD/../libs/xassets \ $$PWD/../libs/zonefile @@ -48,9 +44,6 @@ DEPENDPATH += \ $$PWD/../libs/compression \ $$PWD/../libs/encryption \ $$PWD/../libs/fastfile \ - $$PWD/../libs/ddsfile \ - $$PWD/../libs/ipakfile \ - $$PWD/../libs/iwifile \ $$PWD/../libs/xassets \ $$PWD/../libs/zonefile diff --git a/app/ddsviewer.cpp b/app/ddsviewer.cpp index 6cdad15..0263e37 100644 --- a/app/ddsviewer.cpp +++ b/app/ddsviewer.cpp @@ -7,176 +7,176 @@ DDSViewer::DDSViewer(QWidget *parent) , ui(new Ui::DDSViewer) { ui->setupUi(this); - mDDSFile = nullptr; + //mDDSFile = nullptr; } DDSViewer::~DDSViewer() { delete ui; } -void DDSViewer::SetDDSFile(const DDSFile* aDDSFile) { - mDDSFile = aDDSFile; +// void DDSViewer::SetDDSFile(const DDSFile* aDDSFile) { +// mDDSFile = aDDSFile; - ui->label_Title->setText(mDDSFile->fileStem + ".dds"); +// ui->label_Title->setText(mDDSFile->fileStem + ".dds"); - char magicData[5]; - magicData[0] = static_cast(mDDSFile->header.magic & 0xFF); - magicData[1] = static_cast((mDDSFile->header.magic >> 8) & 0xFF); - magicData[2] = static_cast((mDDSFile->header.magic >> 16) & 0xFF); - magicData[3] = static_cast((mDDSFile->header.magic >> 24) & 0xFF); - magicData[4] = '\0'; +// char magicData[5]; +// magicData[0] = static_cast(mDDSFile->header.magic & 0xFF); +// magicData[1] = static_cast((mDDSFile->header.magic >> 8) & 0xFF); +// magicData[2] = static_cast((mDDSFile->header.magic >> 16) & 0xFF); +// magicData[3] = static_cast((mDDSFile->header.magic >> 24) & 0xFF); +// magicData[4] = '\0'; - // If you’re using Qt and want a QString: - QString magicStr = QString::fromLatin1(magicData); - ui->lineEdit_Magic->setText(magicStr); - ui->spinBox_Size->setValue(mDDSFile->header.size); +// // If you’re using Qt and want a QString: +// QString magicStr = QString::fromLatin1(magicData); +// ui->lineEdit_Magic->setText(magicStr); +// ui->spinBox_Size->setValue(mDDSFile->header.size); - ui->checkBox_CapsValid->setChecked((mDDSFile->header.flags & DDSD_CAPS) != 0); - ui->checkBox_HeightValid->setChecked((mDDSFile->header.flags & DDSD_HEIGHT) != 0); - ui->checkBox_WidthValid->setChecked((mDDSFile->header.flags & DDSD_WIDTH) != 0); - ui->checkBox_PitchValid->setChecked((mDDSFile->header.flags & DDSD_PITCH) != 0); - ui->checkBox_PFValid->setChecked((mDDSFile->header.flags & DDSD_PIXELFORMAT) != 0); - ui->checkBox_MipmapCountValid->setChecked((mDDSFile->header.flags & DDSD_MIPMAPCOUNT) != 0); - ui->checkBox_LinearSizeValid->setChecked((mDDSFile->header.flags & DDSD_LINEARSIZE) != 0); - ui->checkBox_DepthValid->setChecked((mDDSFile->header.flags & DDSD_DEPTH) != 0); +// ui->checkBox_CapsValid->setChecked((mDDSFile->header.flags & DDSD_CAPS) != 0); +// ui->checkBox_HeightValid->setChecked((mDDSFile->header.flags & DDSD_HEIGHT) != 0); +// ui->checkBox_WidthValid->setChecked((mDDSFile->header.flags & DDSD_WIDTH) != 0); +// ui->checkBox_PitchValid->setChecked((mDDSFile->header.flags & DDSD_PITCH) != 0); +// ui->checkBox_PFValid->setChecked((mDDSFile->header.flags & DDSD_PIXELFORMAT) != 0); +// ui->checkBox_MipmapCountValid->setChecked((mDDSFile->header.flags & DDSD_MIPMAPCOUNT) != 0); +// ui->checkBox_LinearSizeValid->setChecked((mDDSFile->header.flags & DDSD_LINEARSIZE) != 0); +// ui->checkBox_DepthValid->setChecked((mDDSFile->header.flags & DDSD_DEPTH) != 0); - ui->spinBox_PLSize->setValue(mDDSFile->header.pitchOrLinearSize); - ui->spinBox_Depth->setValue(mDDSFile->header.depth); - ui->spinBox_Width->setValue(mDDSFile->header.width); - ui->spinBox_Height->setValue(mDDSFile->header.height); - ui->spinBox_MipmapCount->setValue(mDDSFile->header.mipMapCount); +// ui->spinBox_PLSize->setValue(mDDSFile->header.pitchOrLinearSize); +// ui->spinBox_Depth->setValue(mDDSFile->header.depth); +// ui->spinBox_Width->setValue(mDDSFile->header.width); +// ui->spinBox_Height->setValue(mDDSFile->header.height); +// ui->spinBox_MipmapCount->setValue(mDDSFile->header.mipMapCount); - ui->spinBox_Res1->setValue(mDDSFile->header.reserved1[0]); - ui->spinBox_Res2->setValue(mDDSFile->header.reserved1[1]); - ui->spinBox_Res3->setValue(mDDSFile->header.reserved1[2]); - ui->spinBox_Res4->setValue(mDDSFile->header.reserved1[3]); - ui->spinBox_Res5->setValue(mDDSFile->header.reserved1[4]); - ui->spinBox_Res6->setValue(mDDSFile->header.reserved1[5]); - ui->spinBox_Res7->setValue(mDDSFile->header.reserved1[6]); - ui->spinBox_Res8->setValue(mDDSFile->header.reserved1[7]); - ui->spinBox_Res9->setValue(mDDSFile->header.reserved1[8]); - ui->spinBox_Res10->setValue(mDDSFile->header.reserved1[9]); - ui->spinBox_Res11->setValue(mDDSFile->header.reserved1[10]); +// ui->spinBox_Res1->setValue(mDDSFile->header.reserved1[0]); +// ui->spinBox_Res2->setValue(mDDSFile->header.reserved1[1]); +// ui->spinBox_Res3->setValue(mDDSFile->header.reserved1[2]); +// ui->spinBox_Res4->setValue(mDDSFile->header.reserved1[3]); +// ui->spinBox_Res5->setValue(mDDSFile->header.reserved1[4]); +// ui->spinBox_Res6->setValue(mDDSFile->header.reserved1[5]); +// ui->spinBox_Res7->setValue(mDDSFile->header.reserved1[6]); +// ui->spinBox_Res8->setValue(mDDSFile->header.reserved1[7]); +// ui->spinBox_Res9->setValue(mDDSFile->header.reserved1[8]); +// ui->spinBox_Res10->setValue(mDDSFile->header.reserved1[9]); +// ui->spinBox_Res11->setValue(mDDSFile->header.reserved1[10]); - ui->spinBox_Res12->setValue(mDDSFile->header.reserved2); +// ui->spinBox_Res12->setValue(mDDSFile->header.reserved2); - ui->spinBox_PF_Size->setValue(mDDSFile->header.pixelFormat.size); +// ui->spinBox_PF_Size->setValue(mDDSFile->header.pixelFormat.size); - ui->checkBox_PF_AlphaPxValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHAPIXELS) != 0); - ui->checkBox_PF_AlphaOnlyValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHA) != 0); - ui->checkBox_PF_FormatValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_FOURCC) != 0); - ui->checkBox_PF_RGBValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_RGB) != 0); - ui->checkBox_PF_YUVValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_YUV) != 0); - ui->checkBox_PF_LuminanceValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_LUMINANCE) != 0); +// ui->checkBox_PF_AlphaPxValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHAPIXELS) != 0); +// ui->checkBox_PF_AlphaOnlyValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_ALPHA) != 0); +// ui->checkBox_PF_FormatValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_FOURCC) != 0); +// ui->checkBox_PF_RGBValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_RGB) != 0); +// ui->checkBox_PF_YUVValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_YUV) != 0); +// ui->checkBox_PF_LuminanceValid->setChecked((mDDSFile->header.pixelFormat.flags & DDPF_LUMINANCE) != 0); - QString formatStr = QString::number(mDDSFile->header.pixelFormat.format); - switch (mDDSFile->header.pixelFormat.format) { - case IWI_FORMAT_ARGB32: - formatStr = "ARGB32"; - break; - case IWI_FORMAT_RGB24: - formatStr = "RGB24"; - break; - case IWI_FORMAT_GA16: - formatStr = "GA16"; - break; - case IWI_FORMAT_A8: - formatStr = "A8"; - break; - case IWI_FORMAT_DXT1: - formatStr = "DXT1"; - break; - case IWI_FORMAT_DXT3: - formatStr = "DXT3"; - break; - case IWI_FORMAT_DXT5: - formatStr = "DXT5"; - break; - } - ui->lineEdit_PF_Format->setText(formatStr); - ui->spinBox_PF_RGBBitCount->setValue(mDDSFile->header.pixelFormat.rgbBitCount); - ui->spinBox_RedBitCount->setValue(mDDSFile->header.pixelFormat.rBitMask); - ui->spinBox_GreenBitCount->setValue(mDDSFile->header.pixelFormat.gBitMask); - ui->spinBox_BlueBitCount->setValue(mDDSFile->header.pixelFormat.bBitMask); - ui->spinBox_AlphaBitMask->setValue(mDDSFile->header.pixelFormat.aBitMask); +// QString formatStr = QString::number(mDDSFile->header.pixelFormat.format); +// switch (mDDSFile->header.pixelFormat.format) { +// case IWI_FORMAT_ARGB32: +// formatStr = "ARGB32"; +// break; +// case IWI_FORMAT_RGB24: +// formatStr = "RGB24"; +// break; +// case IWI_FORMAT_GA16: +// formatStr = "GA16"; +// break; +// case IWI_FORMAT_A8: +// formatStr = "A8"; +// break; +// case IWI_FORMAT_DXT1: +// formatStr = "DXT1"; +// break; +// case IWI_FORMAT_DXT3: +// formatStr = "DXT3"; +// break; +// case IWI_FORMAT_DXT5: +// formatStr = "DXT5"; +// break; +// } +// ui->lineEdit_PF_Format->setText(formatStr); +// ui->spinBox_PF_RGBBitCount->setValue(mDDSFile->header.pixelFormat.rgbBitCount); +// ui->spinBox_RedBitCount->setValue(mDDSFile->header.pixelFormat.rBitMask); +// ui->spinBox_GreenBitCount->setValue(mDDSFile->header.pixelFormat.gBitMask); +// ui->spinBox_BlueBitCount->setValue(mDDSFile->header.pixelFormat.bBitMask); +// ui->spinBox_AlphaBitMask->setValue(mDDSFile->header.pixelFormat.aBitMask); - ui->checkBox_Caps1_TextureValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_TEXTURE) != 0); - ui->checkBox_Caps1_ComplexValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_COMPLEX) != 0); - ui->checkBox_Caps1_MipmapValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_MIPMAP) != 0); +// ui->checkBox_Caps1_TextureValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_TEXTURE) != 0); +// ui->checkBox_Caps1_ComplexValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_COMPLEX) != 0); +// ui->checkBox_Caps1_MipmapValid->setChecked((mDDSFile->header.caps.caps1 & DDSCAPS_MIPMAP) != 0); - ui->checkBox_Caps2_CubemapValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP) != 0); - ui->checkBox_Caps2_CMPXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) != 0); - ui->checkBox_Caps2_CMNXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) != 0); - ui->checkBox_Caps2_CMPYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) != 0); - ui->checkBox_Caps2_CMNYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) != 0); - ui->checkBox_Caps2_CMPZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) != 0); - ui->checkBox_Caps2_CMNZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) != 0); - ui->checkBox_Caps2_VolumeValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_VOLUME) != 0); +// ui->checkBox_Caps2_CubemapValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP) != 0); +// ui->checkBox_Caps2_CMPXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) != 0); +// ui->checkBox_Caps2_CMNXValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) != 0); +// ui->checkBox_Caps2_CMPYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) != 0); +// ui->checkBox_Caps2_CMNYValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) != 0); +// ui->checkBox_Caps2_CMPZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) != 0); +// ui->checkBox_Caps2_CMNZValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) != 0); +// ui->checkBox_Caps2_VolumeValid->setChecked((mDDSFile->header.caps.caps2 & DDSCAPS2_VOLUME) != 0); - ui->spinBox_Caps_DDSX->setValue(mDDSFile->header.caps.dDSX); - ui->spinBox_Caps_Res->setValue(mDDSFile->header.caps.reserved); +// ui->spinBox_Caps_DDSX->setValue(mDDSFile->header.caps.dDSX); +// ui->spinBox_Caps_Res->setValue(mDDSFile->header.caps.reserved); - ui->comboBox_Mipmap->clear(); - for (auto mipmap : mDDSFile->mipmaps) { - ui->comboBox_Mipmap->addItem(QString("%1x%2").arg(mipmap.width).arg(mipmap.height)); - } +// ui->comboBox_Mipmap->clear(); +// for (auto mipmap : mDDSFile->mipmaps) { +// ui->comboBox_Mipmap->addItem(QString("%1x%2").arg(mipmap.width).arg(mipmap.height)); +// } - connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &DDSViewer::MipmapIndexChanged); +// connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &DDSViewer::MipmapIndexChanged); - if (!mDDSFile->mipmaps.empty()) { - MipmapIndexChanged(0); - } -} +// if (!mDDSFile->mipmaps.empty()) { +// MipmapIndexChanged(0); +// } +// } -void DDSViewer::MipmapIndexChanged(int aMipmapIndex) { - if (aMipmapIndex == -1) { return; } +// void DDSViewer::MipmapIndexChanged(int aMipmapIndex) { +// if (aMipmapIndex == -1) { return; } - auto mipmaps = mDDSFile->mipmaps; - auto mipmap = mipmaps[aMipmapIndex]; +// auto mipmaps = mDDSFile->mipmaps; +// auto mipmap = mipmaps[aMipmapIndex]; - ui->spinBox_MipmapSize->setValue(mipmap.size); - ui->spinBox_MipmapWidth->setValue(mipmap.width); - ui->spinBox_MipmapHeight->setValue(mipmap.height); +// ui->spinBox_MipmapSize->setValue(mipmap.size); +// ui->spinBox_MipmapWidth->setValue(mipmap.width); +// ui->spinBox_MipmapHeight->setValue(mipmap.height); - // Validate Data - if (mipmap.size <= 0) { - qDebug() << "Error: Mipmap data is empty!"; - return; - } - if (mipmap.width <= 0 || mipmap.height <= 0) { - qDebug() << "Error: Invalid mipmap dimensions!"; - return; - } +// // Validate Data +// if (mipmap.size <= 0) { +// qDebug() << "Error: Mipmap data is empty!"; +// return; +// } +// if (mipmap.width <= 0 || mipmap.height <= 0) { +// qDebug() << "Error: Invalid mipmap dimensions!"; +// return; +// } - // Ensure data size matches expected size - int bytesPerPixel = 4; // RGBA8888 - quint32 expectedSize = mipmap.width * mipmap.height * bytesPerPixel; - if (mipmap.size < expectedSize) { - qDebug() << "Error: Mipmap data size mismatch! Expected:" << expectedSize << ", Got:" << mipmap.size; - return; - } +// // Ensure data size matches expected size +// int bytesPerPixel = 4; // RGBA8888 +// quint32 expectedSize = mipmap.width * mipmap.height * bytesPerPixel; +// if (mipmap.size < expectedSize) { +// qDebug() << "Error: Mipmap data size mismatch! Expected:" << expectedSize << ", Got:" << mipmap.size; +// return; +// } - // Create QImage - const unsigned char* imageData = reinterpret_cast(mipmap.data.constData()); - QImage image(reinterpret_cast(imageData), - mipmap.width, mipmap.height, - mipmap.width * bytesPerPixel, // Stride - QImage::Format_RGBA8888); +// // Create QImage +// const unsigned char* imageData = reinterpret_cast(mipmap.data.constData()); +// QImage image(reinterpret_cast(imageData), +// mipmap.width, mipmap.height, +// mipmap.width * bytesPerPixel, // Stride +// QImage::Format_RGBA8888); - if (image.isNull()) { - qDebug() << "Error: QImage creation failed!"; - return; - } +// if (image.isNull()) { +// qDebug() << "Error: QImage creation failed!"; +// return; +// } - // Convert to QPixmap - QPixmap pixmap = QPixmap::fromImage(image); - if (pixmap.isNull()) { - qDebug() << "Error: QPixmap conversion failed!"; - return; - } +// // Convert to QPixmap +// QPixmap pixmap = QPixmap::fromImage(image); +// if (pixmap.isNull()) { +// qDebug() << "Error: QPixmap conversion failed!"; +// return; +// } - // Scale and display - pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); - ui->label_Image->setPixmap(pixmap); -} +// // Scale and display +// pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); +// ui->label_Image->setPixmap(pixmap); +// } diff --git a/app/ddsviewer.h b/app/ddsviewer.h index d5b8ce0..33ce1a4 100644 --- a/app/ddsviewer.h +++ b/app/ddsviewer.h @@ -1,7 +1,6 @@ #ifndef DDSVIEWER_H #define DDSVIEWER_H -#include "ddsfile.h" #include namespace Ui { @@ -16,14 +15,14 @@ public: explicit DDSViewer(QWidget *parent = nullptr); ~DDSViewer(); - void SetDDSFile(const DDSFile *aDDSFile); + //void SetDDSFile(const DDSFile *aDDSFile); private slots: - void MipmapIndexChanged(int aMipmapIndex); + //void MipmapIndexChanged(int aMipmapIndex); private: Ui::DDSViewer *ui; - const DDSFile* mDDSFile; + //const DDSFile* mDDSFile; }; #endif // DDSVIEWER_H diff --git a/app/imagewidget.h b/app/imagewidget.h index 22be24c..c65a64a 100644 --- a/app/imagewidget.h +++ b/app/imagewidget.h @@ -2,9 +2,9 @@ #define IMAGEWIDGET_H #include "enums.h" -#include "dds_structs.h" +//#include "dds_structs.h" #include "d3dbsp_structs.h" -#include "ipak_structs.h" +//#include "ipak_structs.h" #include diff --git a/app/iwiviewer.cpp b/app/iwiviewer.cpp index e4b9c3e..f80b3e0 100644 --- a/app/iwiviewer.cpp +++ b/app/iwiviewer.cpp @@ -14,85 +14,85 @@ IWIViewer::~IWIViewer() delete ui; } -void IWIViewer::SetIWIFile(const IWIFile* aIWIFile) { - mIWIFile = aIWIFile; +// void IWIViewer::SetIWIFile(const IWIFile* aIWIFile) { +// mIWIFile = aIWIFile; - ui->label_Title->setText(mIWIFile->fileStem + ".iwi"); +// ui->label_Title->setText(mIWIFile->fileStem + ".iwi"); - // If you’re using Qt and want a QString: - QString magicStr = QString::fromLatin1(mIWIFile->header.Magic, 3); - ui->lineEdit_Magic->setText(magicStr); +// // If you’re using Qt and want a QString: +// QString magicStr = QString::fromLatin1(mIWIFile->header.Magic, 3); +// ui->lineEdit_Magic->setText(magicStr); - ui->spinBox_Version->setValue(mIWIFile->header.Version); - ui->spinBox_Depth->setValue(mIWIFile->info.Depth); - QString formatStr = ""; - switch (mIWIFile->info.Format) { - case IWI_FORMAT_ARGB32: - formatStr = "ARGB32"; - break; - case IWI_FORMAT_RGB24: - formatStr = "RGB24"; - break; - case IWI_FORMAT_GA16: - formatStr = "GA16"; - break; - case IWI_FORMAT_A8: - formatStr = "A8"; - break; - case IWI_FORMAT_DXT1: - formatStr = "DXT1"; - break; - case IWI_FORMAT_DXT3: - formatStr = "DXT3"; - break; - case IWI_FORMAT_DXT5: - formatStr = "DXT5"; - break; - } - ui->lineEdit_Format->setText(formatStr); - ui->spinBox_Height->setValue(mIWIFile->info.Height); - ui->spinBox_Width->setValue(mIWIFile->info.Width); - ui->spinBox_Usage->setValue(mIWIFile->info.Usage); +// ui->spinBox_Version->setValue(mIWIFile->header.Version); +// ui->spinBox_Depth->setValue(mIWIFile->info.Depth); +// QString formatStr = ""; +// switch (mIWIFile->info.Format) { +// case IWI_FORMAT_ARGB32: +// formatStr = "ARGB32"; +// break; +// case IWI_FORMAT_RGB24: +// formatStr = "RGB24"; +// break; +// case IWI_FORMAT_GA16: +// formatStr = "GA16"; +// break; +// case IWI_FORMAT_A8: +// formatStr = "A8"; +// break; +// case IWI_FORMAT_DXT1: +// formatStr = "DXT1"; +// break; +// case IWI_FORMAT_DXT3: +// formatStr = "DXT3"; +// break; +// case IWI_FORMAT_DXT5: +// formatStr = "DXT5"; +// break; +// } +// ui->lineEdit_Format->setText(formatStr); +// ui->spinBox_Height->setValue(mIWIFile->info.Height); +// ui->spinBox_Width->setValue(mIWIFile->info.Width); +// ui->spinBox_Usage->setValue(mIWIFile->info.Usage); - ui->comboBox_Mipmap->clear(); - for (auto mipmap : mIWIFile->mipmaps) { - ui->comboBox_Mipmap->addItem(QString::number(mipmap.offset)); - } +// ui->comboBox_Mipmap->clear(); +// for (auto mipmap : mIWIFile->mipmaps) { +// ui->comboBox_Mipmap->addItem(QString::number(mipmap.offset)); +// } - connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &IWIViewer::MipmapIndexChanged); +// connect(ui->comboBox_Mipmap, &QComboBox::currentIndexChanged, this, &IWIViewer::MipmapIndexChanged); - if (!mIWIFile->mipmaps.empty()) { - MipmapIndexChanged(0); - } -} +// if (!mIWIFile->mipmaps.empty()) { +// MipmapIndexChanged(0); +// } +// } -void IWIViewer::MipmapIndexChanged(int aMipmapIndex) { - auto mipmaps = mIWIFile->mipmaps; +// void IWIViewer::MipmapIndexChanged(int aMipmapIndex) { +// auto mipmaps = mIWIFile->mipmaps; - if (aMipmapIndex == -1) { return; } +// if (aMipmapIndex == -1) { return; } - auto mipmap = mipmaps[aMipmapIndex]; - ui->spinBox_MipmapSize->setValue(mipmap.size); - ui->spinBox_MipmapOffset->setValue(mipmap.offset); +// auto mipmap = mipmaps[aMipmapIndex]; +// ui->spinBox_MipmapSize->setValue(mipmap.size); +// ui->spinBox_MipmapOffset->setValue(mipmap.offset); - const unsigned char* imageData = reinterpret_cast(mipmap.data.constData()); - QImage image(reinterpret_cast(imageData), - mIWIFile->info.Width, mIWIFile->info.Height, - QImage::Format_RGBA8888); +// const unsigned char* imageData = reinterpret_cast(mipmap.data.constData()); +// QImage image(reinterpret_cast(imageData), +// mIWIFile->info.Width, mIWIFile->info.Height, +// QImage::Format_RGBA8888); - if (image.isNull()) { - qDebug() << "Error: QImage creation failed!"; - return; - } +// if (image.isNull()) { +// qDebug() << "Error: QImage creation failed!"; +// return; +// } - // Convert to QPixmap - QPixmap pixmap = QPixmap::fromImage(image); - if (pixmap.isNull()) { - qDebug() << "Error: QPixmap conversion failed!"; - return; - } +// // Convert to QPixmap +// QPixmap pixmap = QPixmap::fromImage(image); +// if (pixmap.isNull()) { +// qDebug() << "Error: QPixmap conversion failed!"; +// return; +// } - // Scale and display - pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); - ui->label_Image->setPixmap(pixmap); -} +// // Scale and display +// pixmap = pixmap.scaled(ui->label_Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); +// ui->label_Image->setPixmap(pixmap); +// } diff --git a/app/iwiviewer.h b/app/iwiviewer.h index f83982f..1f7d814 100644 --- a/app/iwiviewer.h +++ b/app/iwiviewer.h @@ -1,7 +1,7 @@ #ifndef IWIVIEWER_H #define IWIVIEWER_H -#include "iwifile.h" +//#include "iwifile.h" #include namespace Ui { @@ -18,10 +18,10 @@ public: void MipmapIndexChanged(int aMipmapIndex); - void SetIWIFile(const IWIFile *aIWIFile); + //void SetIWIFile(const IWIFile *aIWIFile); private: Ui::IWIViewer *ui; - const IWIFile* mIWIFile; + //const IWIFile* mIWIFile; }; #endif // IWIVIEWER_H diff --git a/app/localstringviewer.cpp b/app/localstringviewer.cpp index 1563ed2..0202b0f 100644 --- a/app/localstringviewer.cpp +++ b/app/localstringviewer.cpp @@ -42,7 +42,7 @@ void LocalStringViewer::AddLocalString(XLocalizeEntry aLocalString) { ui->tableWidget_Strings->setRowCount(mLocalStrings.size()); ui->groupBox_LocalStrViewer->setTitle(QString("Entries (%1)").arg(mLocalStrings.size())); QTableWidgetItem *aliasItem = new QTableWidgetItem(aLocalString.GetValue()->GetString()); - QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.GetName()->GetString()); + QTableWidgetItem *stringItem = new QTableWidgetItem(aLocalString.LocalizeEntryName()->GetString()); ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 0, aliasItem); ui->tableWidget_Strings->setItem(mLocalStrings.size() - 1, 1, stringItem); } diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index c177e21..b9b91af 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -15,12 +15,8 @@ #include "stringtableviewer.h" #include "techsetviewer.h" #include "fastfile_factory.h" -#include "iwifile.h" -#include "ddsfile.h" #include "statusbarmanager.h" -#include "ddsviewer.h" #include "fastfileviewer.h" -#include "ipak_structs.h" #include "iwiviewer.h" #include "localstringviewer.h" #include "zonefileviewer.h" @@ -33,9 +29,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); - setAcceptDrops(true); + XAsset::SetDebug(false); - XAsset::SetDebug(true); + setAcceptDrops(true); mTypeMap = QMap(); mTypeOrder = QStringList(); @@ -82,6 +78,11 @@ MainWindow::MainWindow(QWidget *parent) Q_UNUSED(checked); PreferenceEditor *prefEditor = new PreferenceEditor(this); + + connect(prefEditor, &PreferenceEditor::DebugModeChanged, this, [](bool aEnable) { + XAsset::SetDebug(aEnable); + }); + prefEditor->exec(); }); @@ -168,13 +169,13 @@ MainWindow::MainWindow(QWidget *parent) scriptEditor->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); scriptEditor->setFont(QFont("Consolas")); - // if (rawFile->contents.isEmpty()) { - // scriptEditor->setPlainText("EMPTY"); - // } else { - // scriptEditor->setPlainText(rawFile->contents); - // } + if (rawFile->Buffer().isEmpty()) { + scriptEditor->setPlainText("EMPTY"); + } else { + scriptEditor->setPlainText(QString::fromUtf8(rawFile->Buffer())); + } - QString fileStem;// = rawFile->path.split('/').last(); + QString fileStem = rawFile->DisplayName().split('/').last(); for (int i = 0; i < ui->tabWidget->count(); i++) { if (ui->tabWidget->tabText(i) == fileStem) { delete scriptEditor; @@ -265,48 +266,48 @@ MainWindow::MainWindow(QWidget *parent) // } // } - //ui->tabWidget->addTab(matViewer, fileStem); + ui->tabWidget->addTab(matViewer, aParentName); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_MATERIAL)); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); }); - connect(mTreeWidget, &XTreeWidget::DDSFileSelected, this, [this](const DDSFile* ddsFile, const QString aParentName) { - DDSViewer *ddsViewer = new DDSViewer(this); - ddsViewer->setAcceptDrops(false); - ddsViewer->SetDDSFile(ddsFile); - ddsViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); + //connect(mTreeWidget, &XTreeWidget::DDSFileSelected, this, [this](const DDSFile* ddsFile, const QString aParentName) { + // DDSViewer *ddsViewer = new DDSViewer(this); + // ddsViewer->setAcceptDrops(false); + // ddsViewer->SetDDSFile(ddsFile); + // ddsViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); - QString fileStem = ddsFile->fileStem + ".dds"; - for (int i = 0; i < ui->tabWidget->count(); i++) { - if (ui->tabWidget->tabText(i) == fileStem) { - delete ddsViewer; - return; - } - } + // QString fileStem = ddsFile->fileStem + ".dds"; + // for (int i = 0; i < ui->tabWidget->count(); i++) { + // if (ui->tabWidget->tabText(i) == fileStem) { + // delete ddsViewer; + // return; + // } + // } - ui->tabWidget->addTab(ddsViewer, fileStem); - ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE)); - ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); - }); + // ui->tabWidget->addTab(ddsViewer, fileStem); + // ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE)); + // ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); + //}); - connect(mTreeWidget, &XTreeWidget::IWIFileSelected, this, [this](const IWIFile* iwiFile, const QString aParentName) { - IWIViewer *iwiViewer = new IWIViewer(this); - iwiViewer->setAcceptDrops(false); - iwiViewer->SetIWIFile(iwiFile); - iwiViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); + // connect(mTreeWidget, &XTreeWidget::IWIFileSelected, this, [this](const IWIFile* iwiFile, const QString aParentName) { + // IWIViewer *iwiViewer = new IWIViewer(this); + // iwiViewer->setAcceptDrops(false); + // iwiViewer->SetIWIFile(iwiFile); + // iwiViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); - QString fileStem = iwiFile->fileStem + ".iwi"; - for (int i = 0; i < ui->tabWidget->count(); i++) { - if (ui->tabWidget->tabText(i) == fileStem) { - delete iwiViewer; - return; - } - } + // QString fileStem = iwiFile->fileStem + ".iwi"; + // for (int i = 0; i < ui->tabWidget->count(); i++) { + // if (ui->tabWidget->tabText(i) == fileStem) { + // delete iwiViewer; + // return; + // } + // } - ui->tabWidget->addTab(iwiViewer, fileStem); - ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE)); - ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); - }); + // ui->tabWidget->addTab(iwiViewer, fileStem); + // ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE)); + // ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); + // }); connect(mTreeWidget, &XTreeWidget::FastFileSelected, this, [this](const FastFile* aFastFile, const QString aParentName) { FastFileViewer *fastFileViewer = new FastFileViewer(this); @@ -383,7 +384,7 @@ MainWindow::MainWindow(QWidget *parent) techSetViewer->SetTechSet(aTechSet); techSetViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); - QString fileStem = aTechSet->GetName(); + QString fileStem = aTechSet->TechniqueSetName().GetString(); for (int i = 0; i < ui->tabWidget->count(); i++) { if (ui->tabWidget->tabText(i) == fileStem) { delete techSetViewer; @@ -391,7 +392,7 @@ MainWindow::MainWindow(QWidget *parent) } } - ui->tabWidget->addTab(techSetViewer, aTechSet->GetName()); + ui->tabWidget->addTab(techSetViewer, aTechSet->TechniqueSetName().GetString()); ui->tabWidget->setTabIcon(ui->tabWidget->count() - 1, Utils::CreateAssetIcon(ASSET_TYPE_TECHNIQUE_SET)); ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1); }); @@ -402,7 +403,7 @@ MainWindow::MainWindow(QWidget *parent) strTableViewer->SetStringTable(aStrTable); strTableViewer->setProperty("PARENT_NAME", QVariant::fromValue(aParentName)); - QString fileStem = aStrTable->GetName()->GetString(); + QString fileStem = aStrTable->StringTableName()->GetString(); for (int i = 0; i < ui->tabWidget->count(); i++) { if (ui->tabWidget->tabText(i) == fileStem) { delete strTableViewer; @@ -482,7 +483,7 @@ MainWindow::MainWindow(QWidget *parent) QDockWidget *logDockWidget = new QDockWidget(this); logDockWidget->setWidget(mLogWidget); logDockWidget->setWindowTitle("Logs"); - addDockWidget(Qt::RightDockWidgetArea, logDockWidget); + addDockWidget(Qt::BottomDockWidgetArea, logDockWidget); ui->toolBar->addAction(ui->actionNew_Fast_File); ui->toolBar->addAction(ui->actionNew_Zone_File); @@ -673,21 +674,21 @@ quint32 DXT3 = 0x33545844; // 'DXT3' quint32 DXT5 = 0x35545844; // 'DXT5' int MainWindow::LoadFile_IWI(const QString aFilePath) { - mTreeWidget->AddIWIFile(new IWIFile(aFilePath)); + //mTreeWidget->AddIWIFile(new IWIFile(aFilePath)); return 0; } -int MainWindow::LoadFile_DDSFiles(const QStringList aFilePaths) { - for (const QString &filePath : aFilePaths) { - if (!filePath.endsWith(".dds", Qt::CaseInsensitive)) { - qDebug() << "Error: Invalid filename " << filePath; - return -1; - } - mTreeWidget->AddDDSFile(new DDSFile(filePath)); - } - return 0; -} +// int MainWindow::LoadFile_DDSFiles(const QStringList aFilePaths) { +// for (const QString &filePath : aFilePaths) { +// if (!filePath.endsWith(".dds", Qt::CaseInsensitive)) { +// qDebug() << "Error: Invalid filename " << filePath; +// return -1; +// } +// mTreeWidget->AddDDSFile(new DDSFile(filePath)); +// } +// return 0; +// } void MainWindow::HandleLogEntry(const QString &entry) { QString logContents = mLogWidget->toPlainText() + "\n" + entry; @@ -711,14 +712,14 @@ void MainWindow::HandleProgressUpdate(const QString &message, int progress, int statusBar()->showMessage(progressText); } -int MainWindow::LoadFile_DDS(const QString aFilePath) { - if (!aFilePath.endsWith(".dds", Qt::CaseInsensitive)) { - qDebug() << "Error: Invalid filename " << aFilePath; - return -1; - } - mTreeWidget->AddDDSFile(new DDSFile(aFilePath)); - return 0; -} +// int MainWindow::LoadFile_DDS(const QString aFilePath) { +// if (!aFilePath.endsWith(".dds", Qt::CaseInsensitive)) { +// qDebug() << "Error: Invalid filename " << aFilePath; +// return -1; +// } +// mTreeWidget->AddDDSFile(new DDSFile(aFilePath)); +// return 0; +// } int MainWindow::LoadFile_XSUB(const QString aFilePath) { QFile file(aFilePath); @@ -757,130 +758,130 @@ int MainWindow::LoadFile_IPAK(const QString aFilePath) { QDataStream stream(&file); stream.setByteOrder(QDataStream::BigEndian); - IPAKHeader header; - stream >> header; + // IPAKHeader header; + // stream >> header; - if (header.version == "50000") { - if (header.magic == "KAPI") { - stream.setByteOrder(QDataStream::LittleEndian); - } else if (header.magic == "IPAK") { - stream.setByteOrder(QDataStream::BigEndian); - } else { - qDebug() << "Invalid IPAK file!"; - return -1; - } - } else { - qDebug() << "Invalid IPAK file version!"; - return -1; - } + // if (header.version == "50000") { + // if (header.magic == "KAPI") { + // stream.setByteOrder(QDataStream::LittleEndian); + // } else if (header.magic == "IPAK") { + // stream.setByteOrder(QDataStream::BigEndian); + // } else { + // qDebug() << "Invalid IPAK file!"; + // return -1; + // } + // } else { + // qDebug() << "Invalid IPAK file version!"; + // return -1; + // } - qDebug() << "IPAK File " << "\n" - << "- Platform: " << header.platform << "\n" - << "- Magic: " << header.magic << "\n" - << "- Size: " << header.size << "\n" - << "- Version: " << header.version << "\n" - << "- Sections: " << header.sectionCount; + // qDebug() << "IPAK File " << "\n" + // << "- Platform: " << header.platform << "\n" + // << "- Magic: " << header.magic << "\n" + // << "- Size: " << header.size << "\n" + // << "- Version: " << header.version << "\n" + // << "- Sections: " << header.sectionCount; - QDir outputFolder = QDir(QDir::currentPath() + "/output"); - outputFolder.remove(QDir::currentPath() + "/output"); - outputFolder.mkdir(QDir::currentPath() + "/output"); + // QDir outputFolder = QDir(QDir::currentPath() + "/output"); + // outputFolder.remove(QDir::currentPath() + "/output"); + // outputFolder.mkdir(QDir::currentPath() + "/output"); - QVector metas = QVector(); + // QVector metas = QVector(); - QVector entries = QVector(); - QVector sections = QVector(header.sectionCount); - for (quint32 i = 0; i < header.sectionCount; i++) { - IPAKSection currentSection; - stream >> currentSection; - sections << currentSection; + // QVector entries = QVector(); + // QVector sections = QVector(header.sectionCount); + // for (quint32 i = 0; i < header.sectionCount; i++) { + // IPAKSection currentSection; + // stream >> currentSection; + // sections << currentSection; - qDebug() << " - IPAK Section " << i + 1 << "\n" - << " - Type: " << currentSection.type << " -> " << currentSection.typeInt << "\n" - << " - Offset: " << currentSection.offset << "\n" - << " - Item (IWI) Count: " << currentSection.itemCount << "\n" - << " - Size: " << currentSection.size; + // qDebug() << " - IPAK Section " << i + 1 << "\n" + // << " - Type: " << currentSection.type << " -> " << currentSection.typeInt << "\n" + // << " - Offset: " << currentSection.offset << "\n" + // << " - Item (IWI) Count: " << currentSection.itemCount << "\n" + // << " - Size: " << currentSection.size; - qint64 sectionPos = stream.device()->pos(); - stream.device()->seek(currentSection.offset); + // qint64 sectionPos = stream.device()->pos(); + // stream.device()->seek(currentSection.offset); - QString sectionType = currentSection.type; - if (sectionType == "Data") { - IPAKDataChunkHeader chunkHeader; - stream >> chunkHeader; - qDebug() << " - Chunk Header\n" - << " - Count: " << chunkHeader.count << "\n" - << " - Offset: " << chunkHeader.offset; + // QString sectionType = currentSection.type; + // if (sectionType == "Data") { + // IPAKDataChunkHeader chunkHeader; + // stream >> chunkHeader; + // qDebug() << " - Chunk Header\n" + // << " - Count: " << chunkHeader.count << "\n" + // << " - Offset: " << chunkHeader.offset; - for (quint32 j = 0; j < 31; j++) { - IPAKDataChunkCommand command; - stream >> command; - if (!command.size) { continue; } - chunkHeader.commands << command; - qDebug() << " - Command\n" - << " - Size: " << command.size << "\n" - << " - Compressed: " << command.compressed; + // for (quint32 j = 0; j < 31; j++) { + // IPAKDataChunkCommand command; + // stream >> command; + // if (!command.size) { continue; } + // chunkHeader.commands << command; + // qDebug() << " - Command\n" + // << " - Size: " << command.size << "\n" + // << " - Compressed: " << command.compressed; - } - for (quint32 j = 0; j < chunkHeader.count; j++) { - auto command = chunkHeader.commands[j]; + // } + // for (quint32 j = 0; j < chunkHeader.count; j++) { + // auto command = chunkHeader.commands[j]; - qDebug() << "Reading from " << stream.device()->pos(); - QByteArray data = stream.device()->read(command.size); - qDebug() << " to " << stream.device()->pos(); + // qDebug() << "Reading from " << stream.device()->pos(); + // QByteArray data = stream.device()->read(command.size); + // qDebug() << " to " << stream.device()->pos(); - QString outputFilePath = outputFolder.filePath(QString("%1.iwi").arg(j)); - if (command.compressed) { - //data = Compression::DecompressLZO(data); - } - QFile outputFile(outputFilePath); - if (!outputFile.open(QIODevice::WriteOnly)) { - qDebug() << "Failed to extract IPAK file."; - } - qDebug() << " - File Name: " << outputFile.fileName(); - outputFile.write(data); - outputFile.close(); - } + // QString outputFilePath = outputFolder.filePath(QString("%1.iwi").arg(j)); + // if (command.compressed) { + // //data = Compression::DecompressLZO(data); + // } + // QFile outputFile(outputFilePath); + // if (!outputFile.open(QIODevice::WriteOnly)) { + // qDebug() << "Failed to extract IPAK file."; + // } + // qDebug() << " - File Name: " << outputFile.fileName(); + // outputFile.write(data); + // outputFile.close(); + // } - qDebug() << stream.device()->pos(); - stream.skipRawData(sizeof(quint32) * (31 - chunkHeader.count)); - qDebug() << stream.device()->pos(); - } else if (sectionType == "Index") { - for (quint32 j = 0; j < currentSection.itemCount; j++) { - IPAKIndexEntry entry; - stream >> entry; + // qDebug() << stream.device()->pos(); + // stream.skipRawData(sizeof(quint32) * (31 - chunkHeader.count)); + // qDebug() << stream.device()->pos(); + // } else if (sectionType == "Index") { + // for (quint32 j = 0; j < currentSection.itemCount; j++) { + // IPAKIndexEntry entry; + // stream >> entry; - if (entry.size == 0) { continue; } + // if (entry.size == 0) { continue; } - entries << entry; + // entries << entry; - quint64 entryPos = stream.device()->pos(); - qDebug() << " - Index Entry " << j + 1 << "\n" - << " - Name Hash: " << entry.nameHash << "\n" - << " - Data Hash: " << entry.dataHash << "\n" - << " - Offset: " << entry.offset << "\n" - << " - Size: " << entry.size; + // quint64 entryPos = stream.device()->pos(); + // qDebug() << " - Index Entry " << j + 1 << "\n" + // << " - Name Hash: " << entry.nameHash << "\n" + // << " - Data Hash: " << entry.dataHash << "\n" + // << " - Offset: " << entry.offset << "\n" + // << " - Size: " << entry.size; - stream.device()->seek(entry.offset); + // stream.device()->seek(entry.offset); - QByteArray sectionData(entry.size, Qt::Uninitialized); - stream.readRawData(sectionData.data(), entry.size); + // QByteArray sectionData(entry.size, Qt::Uninitialized); + // stream.readRawData(sectionData.data(), entry.size); - const QString entryKey = QString::number(entry.nameHash); - QFile outputFile(outputFolder.filePath(QString("%1.dds").arg(entryKey))); - if (!outputFile.open(QIODevice::WriteOnly)) { - qDebug() << "Failed to extract IPAK file."; - } - qDebug() << " - File Name: " << outputFile.fileName(); - outputFile.write(sectionData); - outputFile.close(); + // const QString entryKey = QString::number(entry.nameHash); + // QFile outputFile(outputFolder.filePath(QString("%1.dds").arg(entryKey))); + // if (!outputFile.open(QIODevice::WriteOnly)) { + // qDebug() << "Failed to extract IPAK file."; + // } + // qDebug() << " - File Name: " << outputFile.fileName(); + // outputFile.write(sectionData); + // outputFile.close(); - stream.device()->seek(entryPos); - } - } - stream.device()->seek(sectionPos); - qDebug() << stream.device()->pos(); - } + // stream.device()->seek(entryPos); + // } + // } + // stream.device()->seek(sectionPos); + // qDebug() << stream.device()->pos(); + // } return 0; // Success } @@ -891,6 +892,7 @@ void MainWindow::dragEnterEvent(QDragEnterEvent *event) { if (mimeData->hasUrls()) { foreach (const QUrl url, mimeData->urls()) { if (!url.toString().contains(".ff") && + !url.toString().contains(".fp") && !url.toString().contains(".zone") && !url.toString().contains(".ipak") && !url.toString().contains(".d3dbsp") && @@ -925,7 +927,7 @@ void MainWindow::dropEvent(QDropEvent *event) { const QString urlStr = url.toLocalFile(); if (urlStr.contains(".zone")) { qDebug() << "OpenZoneFile Returned: " << OpenZoneFile(urlStr); - } else if (urlStr.contains(".ff")) { + } else if (urlStr.contains(".ff") || urlStr.contains(".fp")) { qDebug() << "OpenFastFile Returned: " << OpenFastFile(urlStr); } else if (urlStr.contains(".ipak")) { qDebug() << "LoadFile_IPAK Returned: " << LoadFile_IPAK(urlStr); @@ -935,7 +937,7 @@ void MainWindow::dropEvent(QDropEvent *event) { qDebug() << "LoadFile_IWI Returned: " << LoadFile_IWI(urlStr); } else if (urlStr.contains(".dds")) { if (mimeData->urls().size() == 1) { - qDebug() << "LoadFile_DDS Returned: " << LoadFile_DDS(urlStr); + //qDebug() << "LoadFile_DDS Returned: " << LoadFile_DDS(urlStr); } else { ddsPaths << urlStr; } @@ -969,7 +971,7 @@ void MainWindow::dropEvent(QDropEvent *event) { } } if (ddsPaths.size() > 1) { - qDebug() << "LoadFile_DDSFiles Returned: " << LoadFile_DDSFiles(ddsPaths); + //qDebug() << "LoadFile_DDSFiles Returned: " << LoadFile_DDSFiles(ddsPaths); } } else { ui->statusBar->showMessage("Can't display dropped data!"); diff --git a/app/mainwindow.h b/app/mainwindow.h index 7b2c3c8..037c32a 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -43,8 +43,6 @@ private slots: int LoadFile_IPAK(const QString aFilePath); int LoadFile_XSUB(const QString aFilePath); int LoadFile_IWI(const QString aFilePath); - int LoadFile_DDS(const QString aFilePath); - int LoadFile_DDSFiles(const QStringList aFilePaths); void HandleLogEntry(const QString &entry); void HandleStatusUpdate(const QString &message, int timeout); diff --git a/app/modelviewer.ui b/app/modelviewer.ui index 0a09b3a..b17a424 100644 --- a/app/modelviewer.ui +++ b/app/modelviewer.ui @@ -6,8 +6,8 @@ 0 0 - 1001 - 897 + 780 + 644 @@ -15,606 +15,636 @@ - - - Properties - - - - - - - - Name Pointer: - - - - - - - 1000000000 - - - - - - - Model Name: - - - - - - - - - - Tag Count: - - - - - - - tags - - - 1000000000 - - - - - - - Root Tag Count: - - - - - - - root tags - - - 1000000000 - - - - - - - Surface Count: - - - - - - - surfaces - - - 1000000000 - - - - - - - Unknown A: - - - - - - - 1000000000 - - - - - - - Bone Name Pointer: - - - - - - - 1000000000 - - - - - - - Parent List Pointer: - - - - - - - 1000000000 - - - - - - - Quats Pointer: - - - - - - - 1000000000 - - - - - - - Transformation Pointer: - - - - - - - 1000000000 - - - - - - - Classification Pointer: - - - - - - - 1000000000 - - - - - - - Base Material Pointer: - - - - - - - 1000000000 - - - - - - - Surfaces Pointer; - - - - - - - 1000000000 - - - - - - - Material Handlers Pointer: - - - - - - - 1000000000 - - - - - - - Coll Surf Pointer: - - - - - - - 1000000000 - - - - - - - Coll Surface Count: - - - - - - - 1000000000 - - - - - - - Contents: - - - - - - - 1000000000 - - - - - - - Bone Info Pointer: - - - - - - - 1000000000 - - - - - - - Radius: - - - - - - - - - - Min X: - - - - - - - - - - Min Y: - - - - - - - - - - Min Z: - - - - - - - - - - Max X: - - - - - - - - - - Max Y: - - - - - - - - - - Max Z: - - - - - - - - - - Lod Count: - - - - - - - 1000000000 - - - - - - - Coll Lod: - - - - - - - 1000000000 - - - - - - - Stream Info Pointer: - - - - - - - 1000000000 - - - - - - - Memory Usage: - - - - - - - 1000000000 - - - - - - - Flags: - - - - - - - 1000000000 - - - - - - - Phys Preset Pointer: - - - - - - - 1000000000 - - - - - - - Phys Geometry Pointer: - - - - - - - 1000000000 - - - - - - - - - - - Lod Info - - - - - - Lod Info Index: - - - - - - - - - - Qt::Orientation::Horizontal - - - - - - - Distance: - - - - - - - - - - Surface Count: - - - - - - - 1000000000 - - - - - - - Surface Index: - - - - - - - 1000000000 - - - - - - - Part Bit 1: - - - - - - - 1000000000 - - - - - - - Part Bit 2: - - - - - - - 1000000000 - - - - - - - Part Bit 3: - - - - - - - 1000000000 - - - - - - - Part Bit 4: - - - - - - - 1000000000 - - - - - - - Part Bit 5: - - - - - - - 1000000000 - - - - - - - - - - Qt::Orientation::Vertical - - - - 20 - 40 - - - - - - - - - - - - - Qt::Orientation::Vertical - - - - - - - 3D Window + + + 0 + + + + 0 + 0 + 762 + 566 + + + + Model Data + + + + + + + + Name Pointer: + + + + + + + 1000000000 + + + + + + + Model Name: + + + + + + + + + + Tag Count: + + + + + + + tags + + + 1000000000 + + + + + + + Root Tag Count: + + + + + + + root tags + + + 1000000000 + + + + + + + Surface Count: + + + + + + + surfaces + + + 1000000000 + + + + + + + Unknown A: + + + + + + + 1000000000 + + + + + + + Bone Name Pointer: + + + + + + + 1000000000 + + + + + + + Parent List Pointer: + + + + + + + 1000000000 + + + + + + + Quats Pointer: + + + + + + + 1000000000 + + + + + + + Transformation Pointer: + + + + + + + 1000000000 + + + + + + + Classification Pointer: + + + + + + + 1000000000 + + + + + + + Base Material Pointer: + + + + + + + 1000000000 + + + + + + + Surfaces Pointer; + + + + + + + 1000000000 + + + + + + + Material Handlers Pointer: + + + + + + + 1000000000 + + + + + + + Coll Surf Pointer: + + + + + + + 1000000000 + + + + + + + Coll Surface Count: + + + + + + + 1000000000 + + + + + + + + + Qt::Orientation::Vertical + + + + + + + + + Contents: + + + + + + + 1000000000 + + + + + + + Bone Info Pointer: + + + + + + + 1000000000 + + + + + + + Radius: + + + + + + + + + + Min X: + + + + + + + + + + Min Y: + + + + + + + + + + Min Z: + + + + + + + + + + Max X: + + + + + + + + + + Max Y: + + + + + + + + + + Max Z: + + + + + + + + + + Lod Count: + + + + + + + 1000000000 + + + + + + + Coll Lod: + + + + + + + 1000000000 + + + + + + + Stream Info Pointer: + + + + + + + 1000000000 + + + + + + + Memory Usage: + + + + + + + 1000000000 + + + + + + + Flags: + + + + + + + 1000000000 + + + + + + + Phys Preset Pointer: + + + + + + + 1000000000 + + + + + + + Phys Geometry Pointer: + + + + + + + 1000000000 + + + + + + + + + Qt::Orientation::Vertical + + + + + + + + + Lod Info + + + + + + Lod Info Index: + + + + + + + + + + Qt::Orientation::Horizontal + + + + + + + Distance: + + + + + + + + + + Surface Count: + + + + + + + 1000000000 + + + + + + + Surface Index: + + + + + + + 1000000000 + + + + + + + Part Bit 1: + + + + + + + 1000000000 + + + + + + + Part Bit 2: + + + + + + + 1000000000 + + + + + + + Part Bit 3: + + + + + + + 1000000000 + + + + + + + Part Bit 4: + + + + + + + 1000000000 + + + + + + + Part Bit 5: + + + + + + + 1000000000 + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + 0 + 0 + 762 + 566 + + + + 3D View + + diff --git a/app/preferenceeditor.cpp b/app/preferenceeditor.cpp index 03b3237..14dcb3f 100644 --- a/app/preferenceeditor.cpp +++ b/app/preferenceeditor.cpp @@ -27,6 +27,8 @@ PreferenceEditor::PreferenceEditor(QWidget *parent) ui->frame_FileEditors->show(); } }); + + connect(ui->checkBox_DebugMode, &QCheckBox::clicked, this, &PreferenceEditor::DebugModeChanged); } PreferenceEditor::~PreferenceEditor() diff --git a/app/preferenceeditor.h b/app/preferenceeditor.h index ac09083..33e0bef 100644 --- a/app/preferenceeditor.h +++ b/app/preferenceeditor.h @@ -15,6 +15,9 @@ public: explicit PreferenceEditor(QWidget *parent = nullptr); ~PreferenceEditor(); +signals: + void DebugModeChanged(bool aEnable); + private: Ui::PreferenceEditor *ui; }; diff --git a/app/preferenceeditor.ui b/app/preferenceeditor.ui index fc50978..8e09ab0 100644 --- a/app/preferenceeditor.ui +++ b/app/preferenceeditor.ui @@ -73,14 +73,14 @@ - 0 + -1 View - + :/icons/icons/Icon_Views.png:/icons/icons/Icon_Views.png @@ -89,7 +89,7 @@ Tree Widget - + :/icons/icons/Icon_Tree.png:/icons/icons/Icon_Tree.png @@ -98,12 +98,19 @@ File Editors - + :/icons/icons/Icon_Editor.png:/icons/icons/Icon_Editor.png + + + + Enable Debug Mode + + + @@ -135,7 +142,7 @@ - :/icons/icons/Icon_Views.png + :/icons/icons/Icon_Views.png true @@ -292,7 +299,7 @@ - :/icons/icons/Icon_Tree.png + :/icons/icons/Icon_Tree.png true @@ -370,7 +377,7 @@ - :/icons/icons/Icon_Editor.png + :/icons/icons/Icon_Editor.png true @@ -489,7 +496,7 @@ - + diff --git a/app/techsetviewer.cpp b/app/techsetviewer.cpp index 03ba4f7..d7fc588 100644 --- a/app/techsetviewer.cpp +++ b/app/techsetviewer.cpp @@ -16,10 +16,18 @@ TechSetViewer::~TechSetViewer() void TechSetViewer::SetTechSet(const XMaterialTechniqueSet* aTechSet) { //ui->listWidget_Ptrs->clear(); ui->label_Title->setText(aTechSet->GetName()); + ui->lineEdit_TechniqueName->setText(aTechSet->DisplayName()); + ui->spinBox_WorldVertFormat->setValue(aTechSet->WorldVertFormat()); - // int ptrIndex = 1; - //for (auto ptr : aTechSet->pointers) { - // ui->listWidget_Ptrs->addItem(QString("Pointer %1: %2").arg(ptrIndex).arg(ptr)); - // ptrIndex++; - //} + for (const XMaterialTechnique &technique : aTechSet->Techniques()) + { + ui->listWidget_Techniques->addItem(technique.DisplayName()); + } + + connect(ui->listWidget_Techniques, &QListWidget::currentRowChanged, this, [&](int aRow) { + const XMaterialTechnique &technique = aTechSet->Techniques()[aRow]; + ui->lineEdit_TechniqueName->setText(technique.DisplayName()); + ui->spinBox_Flags->setValue(technique.Flags()); + ui->spinBox_PassCount->setValue(technique.PassCount()); + }); } diff --git a/app/techsetviewer.ui b/app/techsetviewer.ui index 4bc7283..dd00c50 100644 --- a/app/techsetviewer.ui +++ b/app/techsetviewer.ui @@ -81,9 +81,9 @@ - + - + Name: @@ -92,7 +92,7 @@ - Technique set name + Technique name diff --git a/app/xtreewidget.cpp b/app/xtreewidget.cpp index d142819..be35bb8 100644 --- a/app/xtreewidget.cpp +++ b/app/xtreewidget.cpp @@ -7,8 +7,9 @@ XTreeWidget::XTreeWidget(QWidget *parent) : QTreeWidget(parent) { mFastFiles = QMap(); mZoneFiles = QMap(); - mDDSFiles = QMap(); - mIWIFiles = QMap(); + //mDDSFiles = QMap(); + //mIWIFiles = QMap(); + mRootItemMap = QMap>(); setContextMenuPolicy(Qt::CustomContextMenu); setSelectionMode(QTreeWidget::SingleSelection); @@ -41,36 +42,36 @@ void XTreeWidget::AddFastFile(FastFile* aFastFile) { XTreeWidgetItem *fastFileItem = new XTreeWidgetItem(this); fastFileItem->setText(0, aFastFile->GetStem()); fastFileItem->setIcon(0, Utils::CreateAssetIcon("FF")); - if (aFastFile->GetPlatform() == "PC") { + if (aFastFile->GetCommonInfo().GetPlatform() == PLATFORM_PC) { fastFileItem->setIcon(1, Utils::CreateAssetIcon("PC")); - } else if (aFastFile->GetPlatform() == "360") { + } else if (aFastFile->GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { fastFileItem->setIcon(1, Utils::CreateAssetIcon("360")); - } else if (aFastFile->GetPlatform() == "PS3") { + } else if (aFastFile->GetCommonInfo().GetPlatform() == PLATFORM_PS3) { fastFileItem->setIcon(1, Utils::CreateAssetIcon("PS3")); - } else if (aFastFile->GetPlatform() == "Wii") { + } else if (aFastFile->GetCommonInfo().GetPlatform() == PLATFORM_WII) { fastFileItem->setIcon(1, Utils::CreateAssetIcon("WII")); - } else if (aFastFile->GetPlatform() == "WiiU") { + } else if (aFastFile->GetCommonInfo().GetPlatform() == PLATFORM_WIIU) { fastFileItem->setIcon(1, Utils::CreateAssetIcon("WU")); } - if (aFastFile->GetGame() == "COD2") { + if (aFastFile->GetCommonInfo().GetGame() == GAME_COD2) { fastFileItem->setIcon(2, Utils::CreateGameIcon(2)); - } if (aFastFile->GetGame() == "COD4") { + } if (aFastFile->GetCommonInfo().GetGame() == GAME_COD4) { fastFileItem->setIcon(2, Utils::CreateGameIcon(4)); - } else if (aFastFile->GetGame() == "COD5") { + } else if (aFastFile->GetCommonInfo().GetGame() == GAME_COD5) { fastFileItem->setIcon(2, Utils::CreateGameIcon(5)); - } else if (aFastFile->GetGame() == "COD6") { + } else if (aFastFile->GetCommonInfo().GetGame() == GAME_COD6) { fastFileItem->setIcon(2, Utils::CreateGameIcon(6)); - } else if (aFastFile->GetGame() == "COD7") { + } else if (aFastFile->GetCommonInfo().GetGame() == GAME_COD7) { fastFileItem->setIcon(2, Utils::CreateGameIcon(7)); - } else if (aFastFile->GetGame() == "COD8") { + } else if (aFastFile->GetCommonInfo().GetGame() == GAME_COD8) { fastFileItem->setIcon(2, Utils::CreateGameIcon(8)); - } else if (aFastFile->GetGame() == "COD9") { + } else if (aFastFile->GetCommonInfo().GetGame() == GAME_COD9) { fastFileItem->setIcon(2, Utils::CreateGameIcon(9)); - } else if (aFastFile->GetGame() == "COD10") { + } else if (aFastFile->GetCommonInfo().GetGame() == GAME_COD10) { fastFileItem->setIcon(2, Utils::CreateGameIcon(10)); - } else if (aFastFile->GetGame() == "COD11") { + } else if (aFastFile->GetCommonInfo().GetGame() == GAME_COD11) { fastFileItem->setIcon(2, Utils::CreateGameIcon(11)); - } else if (aFastFile->GetGame() == "COD12") { + } else if (aFastFile->GetCommonInfo().GetGame() == GAME_COD12) { fastFileItem->setIcon(2, Utils::CreateGameIcon(12)); } @@ -83,6 +84,47 @@ void XTreeWidget::AddFastFile(FastFile* aFastFile) { sortByColumn(0, Qt::AscendingOrder); } +void XTreeWidget::AddAsset(XAsset* aAsset, const QString& aZoneFileName, XTreeWidgetItem* aRootItem) +{ + const XAssetType assetType = aAsset->GetType(); + QIcon assetIcon = Utils::CreateAssetIcon(assetType); + + QTreeWidgetItem *groupItem = nullptr; + for (int i = 0; i < aRootItem->childCount(); i++) + { + QTreeWidgetItem *testItem = aRootItem->child(i); + if (testItem && (testItem->text(0) == aAsset->GetName() || (testItem->text(0) + "s") == aAsset->GetName())) + { + groupItem = testItem; + break; + } + } + if (!groupItem) + { + QString newName = aAsset->GetName(); + if (*(newName.end() - 1) != 's') + { + newName += 's'; + } + + groupItem = new XTreeWidgetItem(aRootItem); + groupItem->setText(0, newName); + groupItem->setIcon(0, assetIcon); + } + + XTreeWidgetItem *newItem = new XTreeWidgetItem(groupItem); + newItem->SetAssetType(assetType); + newItem->SetAssetPtr(aAsset); + newItem->setText(0, aAsset->DisplayName()); + newItem->setIcon(0, assetIcon); + + for (XAsset *subAsset : aAsset->SubAssets()) + { + AddAsset(subAsset, aZoneFileName, newItem); + } + update(); +} + void XTreeWidget::AddZoneFile(const ZoneFile* aZoneFile, XTreeWidgetItem *aParentItem) { XTreeWidgetItem *zoneItem; if (aParentItem != nullptr) { @@ -90,183 +132,16 @@ void XTreeWidget::AddZoneFile(const ZoneFile* aZoneFile, XTreeWidgetItem *aParen } else { zoneItem = new XTreeWidgetItem(this); } + const QString zoneFileName = aZoneFile->GetBaseStem() + ".zone"; + zoneItem->setText(0, zoneFileName); zoneItem->setIcon(0, Utils::CreateAssetIcon("ZF")); - zoneItem->setText(0, aZoneFile->GetBaseStem() + ".zone"); XAssetList assetList = aZoneFile->GetAssetList(); - QVector localizeEntries; for (int i = 0; i < assetList.Size(); i++) { - XAsset *currentAsset = assetList.GetAsset(i); - if (currentAsset->GetType() == ASSET_TYPE_LOCALIZE_ENTRY) - { - localizeEntries.append(currentAsset); - } else if (currentAsset->GetType() == ASSET_TYPE_LOCALIZE_ENTRY) - { - localizeEntries.append(currentAsset); - } + AddAsset(assetList.GetAsset(i), zoneFileName, zoneItem); } - - // if (!assetMap.localizeEntries.isEmpty()) { - // QIcon localStrIcon = Utils::CreateAssetIcon(ASSET_TYPE_LOCALIZE_ENTRY); - - // XTreeWidgetItem *localStrRoot = new XTreeWidgetItem(zoneItem); - // localStrRoot->setText(0, "String Files"); - // localStrRoot->setIcon(0, localStrIcon); - // localStrRoot->SetCategory(CATEGORY_TYPE); - - // XTreeWidgetItem *localStrItem = new XTreeWidgetItem(localStrRoot); - // localStrItem->setText(0, aZoneFile->GetStem().section('.', 0, 0) + ".str"); - // localStrItem->setIcon(0, localStrIcon); - // } - - // if (!assetMap.techSets.isEmpty()) { - // QIcon techSetIcon = Utils::CreateAssetIcon(ASSET_TYPE_TECHNIQUE_SET); - - // XTreeWidgetItem *techSetRoot = new XTreeWidgetItem(zoneItem); - // techSetRoot->setText(0, "Tech Sets"); - // techSetRoot->setIcon(0, techSetIcon); - // techSetRoot->SetCategory(CATEGORY_TYPE); - - // for (auto techSet : assetMap.techSets) { - // XTreeWidgetItem *techSetItem = new XTreeWidgetItem(techSetRoot); - // techSetItem->setText(0, techSet.name); - // techSetItem->setIcon(0, techSetIcon); - // } - // } - - // if (!assetMap.rawFiles.isEmpty()) { - // QIcon rawFileIcon = Utils::CreateAssetIcon(ASSET_TYPE_RAWFILE); - - // XTreeWidgetItem *rawFileRoot = new XTreeWidgetItem(zoneItem); - // rawFileRoot->setText(0, "Raw Files"); - // rawFileRoot->setIcon(0, rawFileIcon); - // rawFileRoot->SetCategory(CATEGORY_TYPE); - // for (auto rawFile : assetMap.rawFiles) { - // if (!rawFile.length) { continue; } - - // XTreeWidgetItem *tempItem = rawFileRoot; - // // const QStringList pathParts = rawFile->path.split('/'); - // // for (const QString &pathPart : pathParts) { - // // bool childFound = false; - // // for (int i = 0; i < tempItem->childCount(); i++) { - // // QTreeWidgetItem *rawChildItem = tempItem->child(i); - // // XTreeWidgetItem *childItem = dynamic_cast(rawChildItem); - // // if (childItem->text(0) == pathPart) { - // // tempItem = childItem; - - // // childFound = true; - // // break; - // // } - // // } - - // // const QString rawFileStr = pathPart;// = QString("%1 [%2-%3]").arg(pathPart).arg(rawFile.startPos).arg(rawFile.endPos); - // // if (pathPart == pathParts.last()) { - // // XTreeWidgetItem *rawFileItem = new XTreeWidgetItem(tempItem); - // // rawFileItem->setText(0, rawFileStr); - - // // tempItem = rawFileItem; - // // } else if (!childFound) { - // // tempItem = new XTreeWidgetItem(tempItem); - // // tempItem->setText(0, rawFileStr); - // // } - - // // } - // tempItem->setIcon(0, rawFileIcon); - // } - // } - - // if (!assetMap.menuDefinitions.isEmpty()) { - // // QIcon MenuDefIcon = Utils::CreateAssetIcon(ASSET_TYPE_MENU); - - // // XTreeWidgetItem *menuRoot = new XTreeWidgetItem(zoneItem); - // // menuRoot->setText(0, "Menu Files"); - // // menuRoot->setIcon(0, MenuDefIcon); - // // menuRoot->SetCategory(CATEGORY_TYPE); - - // // int menuIndex = 1; - // // for (MenuDef menuDef : assetMap.menuDefinitions) { - // // XTreeWidgetItem *MenuDefRoot = new XTreeWidgetItem(menuRoot); - // // MenuDefRoot->setText(0, QString("Menu %1").arg(menuIndex)); - // // for (Menu menu : menuDef.men) { - // // XTreeWidgetItem *menuItem = new XTreeWidgetItem(MenuDefRoot); - // // menuItem->setText(0, menu.filePath); - // // menuItem->setIcon(0, MenuDefIcon); - // // } - // // menuIndex++; - // // } - // } - - // if (!assetMap.images.isEmpty()) { - // // QIcon imageIcon = Utils::CreateAssetIcon(ASSET_TYPE_IMAGE); - - // // XTreeWidgetItem *imageRoot = new XTreeWidgetItem(zoneItem); - // // imageRoot->setText(0, "Images"); - // // imageRoot->setIcon(0, imageIcon); - // // imageRoot->SetCategory(CATEGORY_TYPE); - - // // for (Image image : assetMap.images) { - // // XTreeWidgetItem *imageItem = new XTreeWidgetItem(imageRoot); - // // imageItem->setText(0, image.materialName); - // // imageItem->setIcon(0, imageIcon); - // // } - // } - - // if (!assetMap.models.isEmpty()) { - // QIcon modelIcon = Utils::CreateAssetIcon(ASSET_TYPE_XMODEL); - - // XTreeWidgetItem *modelsRoot = new XTreeWidgetItem(zoneItem); - // modelsRoot->setText(0, "Models"); - // modelsRoot->setIcon(0, modelIcon); - // modelsRoot->SetCategory(CATEGORY_TYPE); - - // for (auto model: assetMap.models) { - // XTreeWidgetItem *modelItem = new XTreeWidgetItem(modelsRoot); - // modelItem->setText(0, model.name); - // modelItem->setIcon(0, modelIcon); - // } - // } - - // if (!assetMap.materials.isEmpty()) { - // QIcon materialIcon = Utils::CreateAssetIcon(ASSET_TYPE_MATERIAL); - - // XTreeWidgetItem *materialsRoot = new XTreeWidgetItem(zoneItem); - // materialsRoot->setText(0, "Materials"); - // materialsRoot->setIcon(0, materialIcon); - // materialsRoot->SetCategory(CATEGORY_TYPE); - - // for (auto material: assetMap.materials) { - // XTreeWidgetItem *materialItem = new XTreeWidgetItem(materialsRoot); - // //materialItem->setText(0, material.name); - // materialItem->setIcon(0, materialIcon); - // } - // } - - // if (!assetMap.stringTables.isEmpty()) { - // QIcon stringTableIcon = Utils::CreateAssetIcon(ASSET_TYPE_STRINGTABLE); - - // XTreeWidgetItem *strTableRoot = new XTreeWidgetItem(zoneItem); - // strTableRoot->setText(0, "String Tables"); - // strTableRoot->setIcon(0, stringTableIcon); - // strTableRoot->SetCategory(CATEGORY_TYPE); - - // for (auto strTable: assetMap.stringTables) { - // XTreeWidgetItem *modelItem = new XTreeWidgetItem(strTableRoot); - // modelItem->setText(0, strTable.name); - // modelItem->setIcon(0, stringTableIcon); - // } - // } - - // if (!assetMap.sounds.isEmpty()) { - // QIcon soundIcon = Utils::CreateAssetIcon(ASSET_TYPE_SOUND); - - // XTreeWidgetItem *soundsRoot = new XTreeWidgetItem(zoneItem); - // soundsRoot->setText(0, "Sounds"); - // soundsRoot->setIcon(0, soundIcon); - // soundsRoot->SetCategory(CATEGORY_TYPE); - // } - mZoneFiles[aZoneFile->GetBaseStem() + ".zone"] = aZoneFile; } @@ -284,93 +159,93 @@ void XTreeWidget::PrepareContextMenu(const QPoint &pos) { QMenu *contextMenu = new QMenu(this); if (activeText.contains(".dds")) { - const QString fileStem = activeText.replace(".dds", ""); - if (!mDDSFiles.contains(fileStem)) { - qDebug() << "Error: Could not find " << fileStem << " in DDS map!"; - return; - } + // const QString fileStem = activeText.replace(".dds", ""); + // if (!mDDSFiles.contains(fileStem)) { + // qDebug() << "Error: Could not find " << fileStem << " in DDS map!"; + // return; + // } - QAction *closeAction = new QAction("Close File"); - contextMenu->addAction(closeAction); - connect(closeAction, &QAction::triggered, this, [this, &fileStem, &activeItem](bool checked) { - Q_UNUSED(checked); + // QAction *closeAction = new QAction("Close File"); + // contextMenu->addAction(closeAction); + // connect(closeAction, &QAction::triggered, this, [this, &fileStem, &activeItem](bool checked) { + // Q_UNUSED(checked); - mDDSFiles.remove(fileStem); - invisibleRootItem()->removeChild(activeItem); - }); + // mDDSFiles.remove(fileStem); + // invisibleRootItem()->removeChild(activeItem); + // }); - QMenu *exportSubmenu = new QMenu("Export...", this); - contextMenu->addMenu(exportSubmenu); + // QMenu *exportSubmenu = new QMenu("Export...", this); + // contextMenu->addMenu(exportSubmenu); - const DDSFile* ddsFile = mDDSFiles[fileStem]; + // const DDSFile* ddsFile = mDDSFiles[fileStem]; - QAction *exportIWIAction = new QAction("Export as IWI"); - exportSubmenu->addAction(exportIWIAction); - connect(exportIWIAction, &QAction::triggered, this, [ddsFile](bool checked) { - Q_UNUSED(checked); + // QAction *exportIWIAction = new QAction("Export as IWI"); + // exportSubmenu->addAction(exportIWIAction); + // connect(exportIWIAction, &QAction::triggered, this, [ddsFile](bool checked) { + // Q_UNUSED(checked); - ddsFile->SaveIWI(); - }); + // ddsFile->SaveIWI(); + // }); - QAction *exportPNGAction = new QAction("Export as PNG"); - exportSubmenu->addAction(exportPNGAction); - connect(exportPNGAction, &QAction::triggered, this, [ddsFile](bool checked) { - Q_UNUSED(checked); + // QAction *exportPNGAction = new QAction("Export as PNG"); + // exportSubmenu->addAction(exportPNGAction); + // connect(exportPNGAction, &QAction::triggered, this, [ddsFile](bool checked) { + // Q_UNUSED(checked); - ddsFile->SavePNG(); - }); + // ddsFile->SavePNG(); + // }); - QAction *exportJPGAction = new QAction("Export as JPG"); - exportSubmenu->addAction(exportJPGAction); - connect(exportJPGAction, &QAction::triggered, this, [ddsFile](bool checked) { - Q_UNUSED(checked); + // QAction *exportJPGAction = new QAction("Export as JPG"); + // exportSubmenu->addAction(exportJPGAction); + // connect(exportJPGAction, &QAction::triggered, this, [ddsFile](bool checked) { + // Q_UNUSED(checked); - ddsFile->SaveJPG(); - }); + // ddsFile->SaveJPG(); + // }); } else if (activeText.contains(".iwi")) { - const QString fileStem = activeText.replace(".iwi", ""); - if (!mIWIFiles.contains(fileStem)) { - qDebug() << "Error: Could not find " << fileStem << " in IWI map!"; - return; - } + // const QString fileStem = activeText.replace(".iwi", ""); + // if (!mIWIFiles.contains(fileStem)) { + // qDebug() << "Error: Could not find " << fileStem << " in IWI map!"; + // return; + // } - QAction *closeAction = new QAction("Close File"); - contextMenu->addAction(closeAction); - connect(closeAction, &QAction::triggered, this, [this, &fileStem, &activeItem](bool checked) { - Q_UNUSED(checked); + // QAction *closeAction = new QAction("Close File"); + // contextMenu->addAction(closeAction); + // connect(closeAction, &QAction::triggered, this, [this, &fileStem, &activeItem](bool checked) { + // Q_UNUSED(checked); - mIWIFiles.remove(fileStem); - invisibleRootItem()->removeChild(activeItem); - }); + // mIWIFiles.remove(fileStem); + // invisibleRootItem()->removeChild(activeItem); + // }); - QMenu *exportSubmenu = new QMenu("Export...", this); - contextMenu->addMenu(exportSubmenu); + // QMenu *exportSubmenu = new QMenu("Export...", this); + // contextMenu->addMenu(exportSubmenu); - const IWIFile* iwiFile = mIWIFiles[fileStem]; + // const IWIFile* iwiFile = mIWIFiles[fileStem]; - QAction *exportDDSAction = new QAction("Export as DDS"); - exportSubmenu->addAction(exportDDSAction); - connect(exportDDSAction, &QAction::triggered, this, [iwiFile](bool checked) { - Q_UNUSED(checked); + // QAction *exportDDSAction = new QAction("Export as DDS"); + // exportSubmenu->addAction(exportDDSAction); + // connect(exportDDSAction, &QAction::triggered, this, [iwiFile](bool checked) { + // Q_UNUSED(checked); - iwiFile->SaveDDS(); - }); + // iwiFile->SaveDDS(); + // }); - QAction *exportPNGAction = new QAction("Export as PNG"); - exportSubmenu->addAction(exportPNGAction); - connect(exportPNGAction, &QAction::triggered, this, [iwiFile](bool checked) { - Q_UNUSED(checked); + // QAction *exportPNGAction = new QAction("Export as PNG"); + // exportSubmenu->addAction(exportPNGAction); + // connect(exportPNGAction, &QAction::triggered, this, [iwiFile](bool checked) { + // Q_UNUSED(checked); - iwiFile->SavePNG(); - }); + // iwiFile->SavePNG(); + // }); - QAction *exportJPGAction = new QAction("Export as JPG"); - exportSubmenu->addAction(exportJPGAction); - connect(exportJPGAction, &QAction::triggered, this, [iwiFile](bool checked) { - Q_UNUSED(checked); + // QAction *exportJPGAction = new QAction("Export as JPG"); + // exportSubmenu->addAction(exportJPGAction); + // connect(exportJPGAction, &QAction::triggered, this, [iwiFile](bool checked) { + // Q_UNUSED(checked); - iwiFile->SaveJPG(); - }); + // iwiFile->SaveJPG(); + // }); } else if (activeText.contains(".ff")) { const QString fileStem = activeText; @@ -629,122 +504,35 @@ void XTreeWidget::ItemSelectionChanged() { QString selectedText = selectedItem->text(0); emit ItemSelected(selectedText); - XTreeWidgetItem *parentItem = dynamic_cast(selectedItem->parent()); - - /*if (selectedText.contains(".dds")) { - if (!mDDSFiles.contains(selectedText)) { - LogManager::instance().addError("Could not find " + selectedText + " in DDS map!"); - return; - } - emit DDSFileSelected(mDDSFiles[selectedText], selectedText); - } else if (selectedText.contains(".iwi")) { - if (!mIWIFiles.contains(selectedText)) { - LogManager::instance().addError("Could not find " + selectedText + " in IWI map!"); - return; - } - emit IWIFileSelected(mIWIFiles[selectedText], selectedText); - } else */if (selectedText.contains(".ff")) { - if (!mFastFiles.contains(selectedText)) { - LogManager::instance().addError("Could not find " + selectedText + " in Fast File map!"); - return; - } - emit FastFileSelected(mFastFiles[selectedText], selectedText); - } else if (selectedText.contains(".zone")) { - if (!mZoneFiles.contains(selectedText)) { - LogManager::instance().addError("Could not find " + selectedText + " in Zone File map!"); - return; - } - emit ZoneFileSelected(mZoneFiles[selectedText], selectedText); - } else if (selectedText.contains(".str")) { - if (!mZoneFiles.contains(selectedText.replace(".str", ".zone"))) { - LogManager::instance().addError("Could not find " + selectedText + " in Zone File map!"); - return; - } - emit LocalStringSelected(mZoneFiles[selectedText], selectedText); - } else if (parentItem && (parentItem->text(0) == "Images")) { - XTreeWidgetItem *grandpaItem = dynamic_cast(parentItem->parent()); - if (grandpaItem && grandpaItem->text(0).contains(".zone")) { - const QString fileStem = grandpaItem->text(0).section('.', 0, 0); - // QVector images = mZoneFiles[fileStem]->GetAssetMap().images; - // for (Image image : images) { - // if (image.materialName == selectedText) { - // emit ImageSelected(std::make_shared(image), fileStem); - // break; - // } - // } - } - } /*else if (parentItem && (parentItem->text(0) == "Tech Sets")) { - XTreeWidgetItem *grandpaItem = dynamic_cast(parentItem->parent()); - if (grandpaItem && grandpaItem->text(0).contains(".zone")) { - const QString fileStem = grandpaItem->text(0).section('.', 0, 0); - auto techsets = mZoneFiles[fileStem]->GetAssetList().techSets; - for (auto techset : techsets) { - if (techset.name == selectedText) { - emit TechSetSelected(new MaterialTechSet(techset), fileStem); - break; - } + switch (selectedItem->AssetType()) + { + case ASSET_TYPE_NONE: + if (selectedText.contains(".ff")) { + if (!mFastFiles.contains(selectedText)) { + LogManager::instance().addError("Could not find " + selectedText + " in Fast File map!"); + return; } - } - } else if (parentItem && (parentItem->text(0) == "Materials")) { - XTreeWidgetItem *grandpaItem = dynamic_cast(parentItem->parent()); - if (grandpaItem && grandpaItem->text(0).contains(".zone")) { - const QString fileStem = grandpaItem->text(0).section('.', 0, 0); - auto materials = mZoneFiles[fileStem]->GetAssetMap().materials; - for (auto material : materials) { - // if (material.name == selectedText) { - // emit MaterialSelected(std::make_shared(material), fileStem); - // break; - // } + emit FastFileSelected(mFastFiles[selectedText], selectedText); + } else if (selectedText.contains(".zone")) { + if (!mZoneFiles.contains(selectedText)) { + LogManager::instance().addError("Could not find " + selectedText + " in Zone File map!"); + return; } + emit ZoneFileSelected(mZoneFiles[selectedText], selectedText); } - } else if (parentItem && selectedText.contains(".wav")) { - XTreeWidgetItem *grandpaItem = dynamic_cast(parentItem->parent()); - while (grandpaItem && !grandpaItem->text(0).contains(".zone")) { - grandpaItem = dynamic_cast(grandpaItem->parent()); - - if (grandpaItem == invisibleRootItem()) { - break; - } - } - if (grandpaItem && grandpaItem != invisibleRootItem() && grandpaItem->text(0).contains(".zone")) { - const QString fileStem = grandpaItem->text(0).section('.', 0, 0); - // QVector LoadedSounds = mZoneFiles[fileStem]->GetAssetMap().sounds; - // for (LoadedSound LoadedSound : LoadedSounds) { - // for (Sound sound : LoadedSound.sounds) { - // if (sound.path.contains(selectedText)) { - // emit SoundSelected(std::make_shared(sound), fileStem); - // break; - // } - // } - // } - } - } else if (selectedItem->GetCategory() != CATEGORY_TYPE) { - XTreeWidgetItem *zoneRoot = selectedItem; - - bool zoneChild = false; - while (zoneRoot) { - zoneRoot = dynamic_cast(zoneRoot->parent()); - if (zoneRoot->text(0).contains("Raw Files")) { - zoneChild = true; - break; - } - } - if (!zoneChild) { return; } - const QString fileStem = zoneRoot->parent()->text(0); - - if (!mZoneFiles.contains(fileStem)) { - LogManager::instance().addError("Could not find " + fileStem + " in Zone File map!"); - return; - } - - auto rawFiles = mZoneFiles[fileStem]->GetAssetMap().rawFiles; - for (auto rawFile : rawFiles) { - //if (rawFile->path.split('/').last() == selectedText) { - // emit RawFileSelected(std::make_shared(rawFile), fileStem); - // return; - //} - } - }*/ + break; + case ASSET_TYPE_TECHNIQUE_SET: + emit TechSetSelected(dynamic_cast(selectedItem->AssetPtr()), selectedText); + break; + case ASSET_TYPE_MATERIAL: + emit MaterialSelected(dynamic_cast(selectedItem->AssetPtr()), selectedText); + break; + case ASSET_TYPE_RAWFILE: + emit RawFileSelected(dynamic_cast(selectedItem->AssetPtr()), selectedText); + break; + default: + break; + }; } const ZoneFile* XTreeWidget::FindZoneFile(const QString aStem) { @@ -773,34 +561,34 @@ bool XTreeWidget::HasFastFile(const QString aStem) { return FindFastFile(aStem) != nullptr; } -void XTreeWidget::AddIWIFile(IWIFile* aIWIFile) { - const QString iwiFileName = QString(aIWIFile->fileStem + ".iwi"); +// void XTreeWidget::AddIWIFile(IWIFile* aIWIFile) { +// const QString iwiFileName = QString(aIWIFile->fileStem + ".iwi"); - for (int i = 0; i < invisibleRootItem()->childCount(); i++) { - auto iwiFileItem = invisibleRootItem()->child(i); - if (iwiFileItem->text(0) == iwiFileName) { - delete iwiFileItem; - } - } +// for (int i = 0; i < invisibleRootItem()->childCount(); i++) { +// auto iwiFileItem = invisibleRootItem()->child(i); +// if (iwiFileItem->text(0) == iwiFileName) { +// delete iwiFileItem; +// } +// } - XTreeWidgetItem *iwiItem = new XTreeWidgetItem(this); - iwiItem->setIcon(0, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE)); - iwiItem->setText(0, iwiFileName); - mIWIFiles[aIWIFile->fileStem.section(".", 0, 0)] = aIWIFile; -} +// XTreeWidgetItem *iwiItem = new XTreeWidgetItem(this); +// iwiItem->setIcon(0, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE)); +// iwiItem->setText(0, iwiFileName); +// mIWIFiles[aIWIFile->fileStem.section(".", 0, 0)] = aIWIFile; +// } -void XTreeWidget::AddDDSFile(DDSFile* aDDSFile) { - const QString ddsFileName = QString(aDDSFile->fileStem + ".dds"); +// void XTreeWidget::AddDDSFile(DDSFile* aDDSFile) { +// const QString ddsFileName = QString(aDDSFile->fileStem + ".dds"); - for (int i = 0; i < invisibleRootItem()->childCount(); i++) { - auto ddsFileItem = invisibleRootItem()->child(i); - if (ddsFileItem->text(0) == ddsFileName) { - delete ddsFileItem; - } - } +// for (int i = 0; i < invisibleRootItem()->childCount(); i++) { +// auto ddsFileItem = invisibleRootItem()->child(i); +// if (ddsFileItem->text(0) == ddsFileName) { +// delete ddsFileItem; +// } +// } - XTreeWidgetItem *ddsItem = new XTreeWidgetItem(this); - ddsItem->setIcon(0, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE)); - ddsItem->setText(0, ddsFileName); - mDDSFiles[aDDSFile->fileStem.section(".", 0, 0)] = aDDSFile; -} +// XTreeWidgetItem *ddsItem = new XTreeWidgetItem(this); +// ddsItem->setIcon(0, Utils::CreateAssetIcon(ASSET_TYPE_IMAGE)); +// ddsItem->setText(0, ddsFileName); +// mDDSFiles[aDDSFile->fileStem.section(".", 0, 0)] = aDDSFile; +// } diff --git a/app/xtreewidget.h b/app/xtreewidget.h index a1c1645..24be5d8 100644 --- a/app/xtreewidget.h +++ b/app/xtreewidget.h @@ -2,8 +2,8 @@ #define XTREEWIDGET_H #include "d3dbsp_structs.h" -#include "ddsfile.h" -#include "iwifile.h" +//#include "iwifile.h" +//#include "ddsfile.h" #include "fastfile.h" #include "xloadedsound.h" #include "xtreewidgetitem.h" @@ -25,8 +25,8 @@ public: void AddFastFile(FastFile* aFastFile); void AddZoneFile(const ZoneFile *aZoneFile, XTreeWidgetItem *aParentItem = nullptr); - void AddIWIFile(IWIFile* aIWIFile); - void AddDDSFile(DDSFile* aDDSFile); + //void AddIWIFile(IWIFile* aIWIFile); + //void AddDDSFile(IWIFile* aDDSFile); const ZoneFile *FindZoneFile(const QString aStem); const FastFile* FindFastFile(const QString aStem); @@ -35,9 +35,9 @@ public: bool HasFastFile(const QString aStem); void CloseFastFile(const QString aFFName); + void AddAsset(XAsset *aAsset, const QString &aZoneFileName, XTreeWidgetItem *aRootItem); signals: - void DDSFileSelected(const DDSFile* aDDSFile, const QString aParentName); - void IWIFileSelected(const IWIFile* aIWIFile, const QString aParentName); + //void IWIFileSelected(const IWIFile* aIWIFile, const QString aParentName); void FastFileSelected(const FastFile* aFastFile, const QString aParentName); void ZoneFileSelected(const ZoneFile* aZoneFile, const QString aParentName); void LocalStringSelected(const ZoneFile* aZoneFile, const QString aParentName); @@ -60,8 +60,10 @@ protected: private: QMap mFastFiles; QMap mZoneFiles; - QMap mDDSFiles; - QMap mIWIFiles; + //QMap mDDSFiles; + //QMap mIWIFiles; + + QMap> mRootItemMap; }; #endif // XTREEWIDGET_H diff --git a/app/xtreewidgetitem.cpp b/app/xtreewidgetitem.cpp index affe42e..a428770 100644 --- a/app/xtreewidgetitem.cpp +++ b/app/xtreewidgetitem.cpp @@ -3,27 +3,19 @@ XTreeWidgetItem::XTreeWidgetItem(QTreeWidget *parent, bool group) : QTreeWidgetItem(parent) , isGroup(group) - , mCategory(CATEGORY_NONE) { + , mAssetType(ASSET_TYPE_NONE) + , mAssetPtr(nullptr) { } XTreeWidgetItem::XTreeWidgetItem(QTreeWidgetItem *parent, bool group) : QTreeWidgetItem(parent) , isGroup(group) - , mCategory(CATEGORY_NONE) { + , mAssetType(ASSET_TYPE_NONE) + , mAssetPtr(nullptr) { } -void XTreeWidgetItem::SetCategory(TREE_CATEGORY category) -{ - mCategory = category; -} - -TREE_CATEGORY XTreeWidgetItem::GetCategory() -{ - return mCategory; -} - bool XTreeWidgetItem::operator<(const QTreeWidgetItem &other) const { // Attempt to cast the other item to our custom type. const XTreeWidgetItem* otherItem = dynamic_cast(&other); @@ -54,3 +46,33 @@ XTreeWidgetItem& XTreeWidgetItem::operator=(const XTreeWidgetItem &other) } return *this; } + +XAssetType XTreeWidgetItem::AssetType() const +{ + return mAssetType; +} + +void XTreeWidgetItem::SetAssetType(XAssetType aAssetType) +{ + mAssetType = aAssetType; +} + +bool XTreeWidgetItem::GetIsGroup() const +{ + return isGroup; +} + +void XTreeWidgetItem::SetIsGroup(bool aIsGroup) +{ + isGroup = aIsGroup; +} + +XAsset *XTreeWidgetItem::AssetPtr() const +{ + return mAssetPtr; +} + +void XTreeWidgetItem::SetAssetPtr(XAsset *aAssetPtr) +{ + mAssetPtr = aAssetPtr; +} diff --git a/app/xtreewidgetitem.h b/app/xtreewidgetitem.h index 213bc36..b6b89f9 100644 --- a/app/xtreewidgetitem.h +++ b/app/xtreewidgetitem.h @@ -1,35 +1,36 @@ #ifndef XTREEWIDGETITEM_H #define XTREEWIDGETITEM_H +#include "xassettype.h" #include #include -enum TREE_CATEGORY { - CATEGORY_NONE = 0x00, - CATEGORY_FILE = 0x01, - CATEGORY_TYPE = 0x02 -}; +class XAsset; // Custom item class class XTreeWidgetItem : public QTreeWidgetItem { public: - // Flag to indicate if the item is a collapsible group/header. - bool isGroup; - - // Constructors: default to non-group unless specified. XTreeWidgetItem(QTreeWidget *parent, bool group = false); XTreeWidgetItem(QTreeWidgetItem *parent, bool group = false); - - void SetCategory(TREE_CATEGORY category); - TREE_CATEGORY GetCategory(); + ~XTreeWidgetItem() = default; // Override the less-than operator to customize sorting. bool operator<(const QTreeWidgetItem &other) const override; XTreeWidgetItem &operator =(const XTreeWidgetItem &other); + XAssetType AssetType() const; + void SetAssetType(XAssetType aAssetType); + + bool GetIsGroup() const; + void SetIsGroup(bool aIsGroup); + XAsset *AssetPtr() const; + void SetAssetPtr(XAsset *aAssetPtr); + private: - TREE_CATEGORY mCategory; + bool isGroup; + XAssetType mAssetType; + XAsset* mAssetPtr; }; diff --git a/app/zonefileviewer.cpp b/app/zonefileviewer.cpp index b3ca3a2..59719a5 100644 --- a/app/zonefileviewer.cpp +++ b/app/zonefileviewer.cpp @@ -52,14 +52,13 @@ void ZoneFileViewer::HighlightRecordInOrder() { void ZoneFileViewer::SortTags(const QString &aSearchText) { ui->listWidget_Tags->clear(); - const QStringList tags = mZoneFile->GetTags(); if (aSearchText.isEmpty()) { - ui->listWidget_Tags->addItems(tags); + ui->listWidget_Tags->addItems(mTags); return; } QStringList sortedTags; - foreach (const QString tag, tags) { + foreach (const QString tag, mTags) { if (tag.contains(aSearchText)) { sortedTags << tag; } @@ -72,17 +71,22 @@ void ZoneFileViewer::SortTags(const QString &aSearchText) { void ZoneFileViewer::SetZoneFile(const ZoneFile* aZoneFile) { mZoneFile = aZoneFile; + auto rawTags = aZoneFile->GetAssetList().GetStringList().ScriptStrings(); + for (int i = 0; i < rawTags.size(); i++) + { + mTags.push_back(rawTags[i].GetString()); + } + ui->tableWidget_RecordCounts->clearContents(); ui->tableWidget_RecordOrder->clearContents(); ui->listWidget_Tags->clear(); - const QStringList tags = mZoneFile->GetTags(); - ui->listWidget_Tags->addItems(tags); + ui->listWidget_Tags->addItems(mTags); ui->label_Title->setText(mZoneFile->GetBaseStem() + ".zone"); - ui->groupBox_Tags->setTitle(QString("Tags (%1)").arg(tags.size())); + ui->groupBox_Tags->setTitle(QString("Tags (%1)").arg(mTags.size())); - if (tags.isEmpty()) { + if (mTags.isEmpty()) { ui->groupBox_Tags->hide(); } else { ui->groupBox_Tags->show(); diff --git a/app/zonefileviewer.h b/app/zonefileviewer.h index 6a95549..ca83e91 100644 --- a/app/zonefileviewer.h +++ b/app/zonefileviewer.h @@ -28,6 +28,7 @@ public slots: private: Ui::ZoneFileViewer *ui; const ZoneFile* mZoneFile; + QStringList mTags; }; #endif // ZONEFILEVIEWER_H diff --git a/libs/compression/compression.cpp b/libs/compression/compression.cpp index 850e72a..b9153f0 100644 --- a/libs/compression/compression.cpp +++ b/libs/compression/compression.cpp @@ -336,7 +336,7 @@ QByteArray Compression::DecompressLZO(const QByteArray &aCompressedData, quint32 } QByteArray Compression::DecompressOodle(const QByteArray &aCompressedData, quint32 aDecompressedSize) { - return pDecompressOodle(aCompressedData, aCompressedData.length(), aDecompressedSize); + return pDecompressOodle(aCompressedData, aCompressedData.size(), aDecompressedSize); } QByteArray Compression::CompressOodle(const QByteArray &aData) { @@ -352,18 +352,16 @@ quint32 Compression::pGetOodleCompressedBounds(quint32 aBufferSize) { } QByteArray Compression::pCompressOodle(QByteArray aBuffer, quint32 aBufferSize, quint32 aOutputBufferSize, OodleFormat aformat, OodleCompressionLevel alevel) { - QLibrary oodleLib("oo2core_8_win64"); - - if (!oodleLib.load()) { - qDebug() << "Failed to load DLL:" << oodleLib.errorString(); + QLibrary lib("../../../third_party/oodle_lib/dll/oo2core_8_win64.dll"); // adjust path if needed + if (!lib.load()) { + qDebug() << "Failed to load:" << lib.errorString(); return QByteArray(); } - OodleLZ_CompressFunc OodleLZ_Compress = - (OodleLZ_CompressFunc)oodleLib.resolve("OodleLZ_Compress"); + OodleLZ_CompressFunc OodleLZ_Compress = (OodleLZ_CompressFunc)lib.resolve("OodleLZ_Compress"); if (!OodleLZ_Compress) { - qDebug() << "Failed to resolve function:" << oodleLib.errorString(); + qDebug() << "Failed to resolve OodleLZ_Compress:" << lib.errorString(); return QByteArray(); } @@ -375,26 +373,58 @@ QByteArray Compression::pCompressOodle(QByteArray aBuffer, quint32 aBufferSize, return QByteArray(reinterpret_cast(outputBuffer), aOutputBufferSize); } -QByteArray Compression::pDecompressOodle(QByteArray aBuffer, quint32 aBufferSize, quint32 aOutputBufferSize) { - QLibrary oodleLib("oo2core_8_win64"); - - if (!oodleLib.load()) { - qDebug() << "Failed to load DLL:" << oodleLib.errorString(); - return QByteArray(); +QByteArray Compression::pDecompressOodle(const QByteArray &aBuffer, + quint32 aBufferSize, + quint32 aOutputBufferSize) +{ + QLibrary lib("../../../third_party/oodle_lib/dll/oo2core_8_win64.dll"); + if (!lib.load()) { + qWarning() << "Failed to load Oodle DLL:" << lib.errorString(); + return {}; } OodleLZ_DecompressFunc OodleLZ_Decompress = - (OodleLZ_DecompressFunc)oodleLib.resolve("OodleLZ_Decompress"); - + reinterpret_cast(lib.resolve("OodleLZ_Decompress")); if (!OodleLZ_Decompress) { - qDebug() << "Failed to resolve function:" << oodleLib.errorString(); - return QByteArray(); + qWarning() << "Failed to resolve OodleLZ_Decompress:" << lib.errorString(); + return {}; } - std::byte *outputBuffer = new std::byte[aOutputBufferSize]; + QByteArray out(aOutputBufferSize + 1, Qt::Uninitialized); - if (aBuffer.length() > 0 && aBufferSize > 0 && aOutputBufferSize > 0) - OodleLZ_Decompress(reinterpret_cast(aBuffer.data()), aBufferSize, outputBuffer, aOutputBufferSize, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + if (aBuffer.isEmpty() || aBufferSize == 0 || aOutputBufferSize == 0) { + qWarning() << "Invalid Oodle parameters (empty input or size 0)"; + return {}; + } - return QByteArray(reinterpret_cast(outputBuffer), aOutputBufferSize); + int result = OodleLZ_Decompress( + aBuffer.constData(), + static_cast(aBufferSize), + out.data(), + static_cast(aOutputBufferSize), + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3); + + if (result < 0) { + qWarning() << "OodleLZ_Decompress failed with code" << result; + return {}; + } + + if (result > out.size()) { + qWarning() << "Oodle returned more than expected:" << result + << "expected" << aOutputBufferSize; + return out; + } + + out.resize(result); + + return out; } diff --git a/libs/compression/compression.h b/libs/compression/compression.h index 8026ece..7c9f685 100644 --- a/libs/compression/compression.h +++ b/libs/compression/compression.h @@ -41,7 +41,22 @@ enum OodleCompressionLevel { }; typedef int (*OodleLZ_CompressFunc)(OodleFormat Format, std::byte *Buffer, long BufferSize, std::byte *OutputBuffer, OodleCompressionLevel Level, uint a, uint b, uint c); -typedef int (*OodleLZ_DecompressFunc)(std::byte* Buffer, long BufferSize, std::byte* OutputBuffer, long OutputBufferSize, uint a, uint b, uint c, uint d, uint e, uint f, uint g, uint h, uint i, int ThreadModule); +typedef int (__stdcall *OodleLZ_DecompressFunc)( + const void *compBuf, + int64_t compBufSize, + void *rawBuf, + int64_t rawLen, + uint32_t fuzzSafe, + uint32_t checkCRC, + uint32_t verbosity, + void *decBufBase, + size_t decBufSize, + void *fpCallback, + void *callbackUserData, + void *decoderMemory, + size_t decoderMemorySize, + int threadPhase +); class Compression { public: @@ -80,7 +95,7 @@ private: static quint32 pGetOodleCompressedBounds(quint32 aBufferSize); static QByteArray pCompressOodle(QByteArray aBuffer, quint32 aBufferSize, quint32 aOutputBufferSize, OodleFormat aformat, OodleCompressionLevel alevel); - static QByteArray pDecompressOodle(QByteArray aBuffer, quint32 aBufferSize, quint32 aOutputBufferSize); + static QByteArray pDecompressOodle(const QByteArray &aBuffer, quint32 aBufferSize, quint32 aOutputBufferSize); }; diff --git a/libs/fastfile/360/fastfile_cod10_360.cpp b/libs/fastfile/360/fastfile_cod10_360.cpp index ef47f9a..1508213 100644 --- a/libs/fastfile/360/fastfile_cod10_360.cpp +++ b/libs/fastfile/360/fastfile_cod10_360.cpp @@ -12,8 +12,6 @@ FastFile_COD10_360::FastFile_COD10_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("360"); - SetGame("COD10"); } FastFile_COD10_360::FastFile_COD10_360(const QByteArray& aData) @@ -103,6 +101,7 @@ bool FastFile_COD10_360::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD10_360* zoneFile = new ZoneFile_COD10_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod11_360.cpp b/libs/fastfile/360/fastfile_cod11_360.cpp index 4ba4dd7..182a4fe 100644 --- a/libs/fastfile/360/fastfile_cod11_360.cpp +++ b/libs/fastfile/360/fastfile_cod11_360.cpp @@ -15,8 +15,6 @@ FastFile_COD11_360::FastFile_COD11_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD11"); - SetPlatform("PC"); } FastFile_COD11_360::FastFile_COD11_360(const QByteArray& aData) @@ -141,6 +139,7 @@ bool FastFile_COD11_360::Load(const QByteArray aData) { // Load the zone file with decompressed data ZoneFile_COD11_360* zoneFile = new ZoneFile_COD11_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod12_360.cpp b/libs/fastfile/360/fastfile_cod12_360.cpp index a8804d6..285a34a 100644 --- a/libs/fastfile/360/fastfile_cod12_360.cpp +++ b/libs/fastfile/360/fastfile_cod12_360.cpp @@ -15,8 +15,6 @@ FastFile_COD12_360::FastFile_COD12_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD12"); - SetPlatform("PC"); } FastFile_COD12_360::FastFile_COD12_360(const QByteArray& aData) @@ -141,6 +139,7 @@ bool FastFile_COD12_360::Load(const QByteArray aData) { // Load the zone file with decompressed data ZoneFile_COD12_360* zoneFile = new ZoneFile_COD12_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod2_360.cpp b/libs/fastfile/360/fastfile_cod2_360.cpp index ce49fc1..8f76708 100644 --- a/libs/fastfile/360/fastfile_cod2_360.cpp +++ b/libs/fastfile/360/fastfile_cod2_360.cpp @@ -14,8 +14,6 @@ FastFile_COD2_360::FastFile_COD2_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("360"); - SetGame("COD2"); } FastFile_COD2_360::FastFile_COD2_360(const QByteArray& aData) @@ -81,6 +79,7 @@ bool FastFile_COD2_360::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD2_360* zoneFile = new ZoneFile_COD2_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod4_360.cpp b/libs/fastfile/360/fastfile_cod4_360.cpp index 48c85fb..74a2330 100644 --- a/libs/fastfile/360/fastfile_cod4_360.cpp +++ b/libs/fastfile/360/fastfile_cod4_360.cpp @@ -15,8 +15,6 @@ FastFile_COD4_360::FastFile_COD4_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("360"); - SetGame("COD4"); } FastFile_COD4_360::FastFile_COD4_360(const QByteArray& aData) @@ -130,6 +128,7 @@ bool FastFile_COD4_360::Load(const QByteArray aData) { ZoneFile_COD4_360* zoneFile = new ZoneFile_COD4_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod5_360.cpp b/libs/fastfile/360/fastfile_cod5_360.cpp index 8f6b65e..834ce96 100644 --- a/libs/fastfile/360/fastfile_cod5_360.cpp +++ b/libs/fastfile/360/fastfile_cod5_360.cpp @@ -15,8 +15,6 @@ FastFile_COD5_360::FastFile_COD5_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("360"); - SetGame("COD5"); } FastFile_COD5_360::FastFile_COD5_360(const QByteArray& aData) @@ -82,6 +80,7 @@ bool FastFile_COD5_360::Load(const QByteArray aData) { ZoneFile_COD5_360* zoneFile = new ZoneFile_COD5_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod6_360.cpp b/libs/fastfile/360/fastfile_cod6_360.cpp index b0990f5..989e0fe 100644 --- a/libs/fastfile/360/fastfile_cod6_360.cpp +++ b/libs/fastfile/360/fastfile_cod6_360.cpp @@ -15,8 +15,6 @@ FastFile_COD6_360::FastFile_COD6_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("360"); - SetGame("COD6"); } FastFile_COD6_360::FastFile_COD6_360(const QByteArray& aData) @@ -115,6 +113,7 @@ bool FastFile_COD6_360::Load(const QByteArray aData) { ZoneFile_COD6_360* zoneFile = new ZoneFile_COD6_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod7_360.cpp b/libs/fastfile/360/fastfile_cod7_360.cpp index c5ae73f..c63f184 100644 --- a/libs/fastfile/360/fastfile_cod7_360.cpp +++ b/libs/fastfile/360/fastfile_cod7_360.cpp @@ -14,8 +14,6 @@ FastFile_COD7_360::FastFile_COD7_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("360"); - SetGame("COD7"); } FastFile_COD7_360::FastFile_COD7_360(const QByteArray& aData) @@ -140,6 +138,7 @@ bool FastFile_COD7_360::Load(const QByteArray aData) { ZoneFile_COD7_360* zoneFile = new ZoneFile_COD7_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod7_5_360.cpp b/libs/fastfile/360/fastfile_cod7_5_360.cpp index efc12af..0b7df8d 100644 --- a/libs/fastfile/360/fastfile_cod7_5_360.cpp +++ b/libs/fastfile/360/fastfile_cod7_5_360.cpp @@ -14,8 +14,6 @@ FastFile_COD7_5_360::FastFile_COD7_5_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("360"); - SetGame("COD7.5"); } FastFile_COD7_5_360::FastFile_COD7_5_360(const QByteArray& aData) @@ -138,6 +136,7 @@ bool FastFile_COD7_5_360::Load(const QByteArray aData) { ZoneFile_COD7_360* zoneFile = new ZoneFile_COD7_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod8_360.cpp b/libs/fastfile/360/fastfile_cod8_360.cpp index 7f8be32..91df21b 100644 --- a/libs/fastfile/360/fastfile_cod8_360.cpp +++ b/libs/fastfile/360/fastfile_cod8_360.cpp @@ -12,8 +12,6 @@ FastFile_COD8_360::FastFile_COD8_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("360"); - SetGame("COD8"); } FastFile_COD8_360::FastFile_COD8_360(const QByteArray& aData) @@ -101,6 +99,7 @@ bool FastFile_COD8_360::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD8_360* zoneFile = new ZoneFile_COD8_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/360/fastfile_cod9_360.cpp b/libs/fastfile/360/fastfile_cod9_360.cpp index bf2b7b8..d7aa799 100644 --- a/libs/fastfile/360/fastfile_cod9_360.cpp +++ b/libs/fastfile/360/fastfile_cod9_360.cpp @@ -12,8 +12,6 @@ FastFile_COD9_360::FastFile_COD9_360() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("360"); - SetGame("COD9"); } FastFile_COD9_360::FastFile_COD9_360(const QByteArray& aData) @@ -105,6 +103,7 @@ bool FastFile_COD9_360::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD9_360* zoneFile = new ZoneFile_COD9_360(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PC/fastfile_cod10_pc.cpp b/libs/fastfile/PC/fastfile_cod10_pc.cpp index 865707c..6389e51 100644 --- a/libs/fastfile/PC/fastfile_cod10_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod10_pc.cpp @@ -12,8 +12,6 @@ FastFile_COD10_PC::FastFile_COD10_PC() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD10"); - SetPlatform("PC"); } FastFile_COD10_PC::FastFile_COD10_PC(const QByteArray& aData) @@ -80,12 +78,10 @@ bool FastFile_COD10_PC::Load(const QByteArray aData) { SetMagic(pParseFFMagic(&fastFileStream)); quint32 version = pParseFFVersion(&fastFileStream); SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD9"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(XDataStream::BigEndian); - if (GetPlatform() == "PC") { + if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { fastFileStream.setByteOrder(XDataStream::LittleEndian); } @@ -122,6 +118,7 @@ bool FastFile_COD10_PC::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD10_PC* zoneFile = new ZoneFile_COD10_PC(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PC/fastfile_cod11_pc.cpp b/libs/fastfile/PC/fastfile_cod11_pc.cpp index 1950b2a..222a832 100644 --- a/libs/fastfile/PC/fastfile_cod11_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod11_pc.cpp @@ -12,8 +12,6 @@ FastFile_COD11_PC::FastFile_COD11_PC() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD11"); - SetPlatform("PC"); } FastFile_COD11_PC::FastFile_COD11_PC(const QByteArray& aData) @@ -116,6 +114,7 @@ bool FastFile_COD11_PC::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD11_PC* zoneFile = new ZoneFile_COD11_PC(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PC/fastfile_cod12_pc.cpp b/libs/fastfile/PC/fastfile_cod12_pc.cpp index 89cd449..daf7eda 100644 --- a/libs/fastfile/PC/fastfile_cod12_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod12_pc.cpp @@ -15,8 +15,6 @@ FastFile_COD12_PC::FastFile_COD12_PC() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD12"); - SetPlatform("PC"); } FastFile_COD12_PC::FastFile_COD12_PC(const QByteArray& aData) diff --git a/libs/fastfile/PC/fastfile_cod21_pc.cpp b/libs/fastfile/PC/fastfile_cod21_pc.cpp new file mode 100644 index 0000000..a2c4b7a --- /dev/null +++ b/libs/fastfile/PC/fastfile_cod21_pc.cpp @@ -0,0 +1,209 @@ +#include "fastfile_cod21_pc.h" +#include "zonefile_cod21_pc.h" + +#include "utils.h" +#include "compression.h" +#include "encryption.h" + +#include +#include + +FastFile_COD21_PC::FastFile_COD21_PC() + : FastFile() { + SetCompany(COMPANY_INFINITY_WARD); + SetType(FILETYPE_FAST_FILE); + SetSignage(SIGNAGE_SIGNED); + SetMagic(0); + SetVersion(0); +} + +FastFile_COD21_PC::FastFile_COD21_PC(const QByteArray& aData) + : FastFile_COD21_PC() { + + if (!aData.isEmpty()) { + Load(aData); + } +} + +FastFile_COD21_PC::FastFile_COD21_PC(const QString aFilePath) + : FastFile_COD21_PC() { + + if (!aFilePath.isEmpty()) { + Load(aFilePath); + } +} + +FastFile_COD21_PC::~FastFile_COD21_PC() { + +} + +QByteArray FastFile_COD21_PC::GetBinaryData() const { + return QByteArray(); +} + +bool FastFile_COD21_PC::Load(const QString aFilePath) { + if (aFilePath.isEmpty()) { + return false; + } + + // Check fastfile can be read + QFile *file = new QFile(aFilePath); + if (!file->open(QIODevice::ReadOnly)) { + qDebug() << QString("Error: Failed to open FastFile: %1!").arg(aFilePath); + return false; + } + + // Decompress fastfile and close + const QString fastFileStem = aFilePath.section("/", -1, -1).split('.').first(); + SetStem(fastFileStem); + if (!Load(file->readAll())) { + qDebug() << "Error: Failed to load fastfile: " << fastFileStem; + return false; + } + + file->close(); + + // Open zone file after decompressing ff and writing + return true; +} + +bool FastFile_COD21_PC::Load(const QByteArray aData) { + QByteArray decompressedData; + + // Create a XDataStream on the input data. + XDataStream fastFileStream(aData); + fastFileStream.setByteOrder(XDataStream::LittleEndian); + auto dev = fastFileStream.device(); + + if (dev->bytesAvailable() < 12) { + qWarning() << "Not enough data for block header"; + return false; + } + + // Skip to start of fastfile + quint64 startIndex = aData.indexOf("IWCIWffs100"); + + if (startIndex == -1) + { + qDebug() << "Failed to find data start!"; + return true; + } + + fastFileStream.skipRawData(startIndex + 11); + qDebug() << "Start index: " << startIndex + 11; + + // Skip RSA hashes + fastFileStream.skipRawData(32760); + + qint32 decompressedDataLen = fastFileStream.ParseInt32(); + qDebug() << "Decompressed Data Len: " << decompressedDataLen; + + fastFileStream.skipRawData(3); + + qint8 compressionType = fastFileStream.ParseInt8(); + qDebug() << "Compression Type: " << compressionType; + + long decompressedDataCount = 0; + int loopCount = 1; + while (decompressedDataCount < decompressedDataLen) + { + qDebug() << QString("Block Offset: {0:%1}, total: {1:%2}").arg(fastFileStream.device()->pos()).arg(decompressedDataCount); + + if (loopCount == 512) + { + // Skip an RSA block + fastFileStream.skipRawData(0x4000); + loopCount = 0; + } + qint32 compLenRaw = fastFileStream.ParseInt32(); + qDebug() << "Test: " << fastFileStream.device()->pos(); + qint32 compressedLen = (compLenRaw + 3) & ~3; + qint32 decompressedLen = fastFileStream.ParseInt32(); + + if (dev->bytesAvailable() < compressedLen) { + qDebug() << "Too Much at: " << fastFileStream.device()->pos(); + qWarning() << "Not enough data for compressed block. Want" + << compressedLen << "have" << dev->bytesAvailable(); + break; + } + + fastFileStream.skipRawData(4); // padding + + QByteArray compressedAligned(compressedLen, Qt::Uninitialized); + + // Read the full aligned block + if (fastFileStream.readRawData(compressedAligned.data(), compressedLen) != compressedLen) { + qWarning() << "Unexpected EOF while reading aligned compressed block"; + //return false; + } + + // Only first compLenRaw bytes are real data + QByteArray compressedChunk = compressedAligned.left(compLenRaw); + + QByteArray decompressedChunk; + switch (compressionType) + { + // Decompress None + case 1: + decompressedChunk = compressedChunk; + break; + + // unknown + case 4: + case 5: + qDebug() << "unimplemented compression type!"; + return false; + + // Decompress Oodle + case 6: + case 7: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + qDebug() << "Calling Oodle with compLenRaw=" << compLenRaw + << "aligned=" << compressedLen + << "decompressedLen=" << decompressedLen; + decompressedChunk = Compression::DecompressOodle(compressedChunk, decompressedLen); + break; + + default: + qDebug() << "Unknown type of compression!"; + return false; + } + + if (decompressedChunk.isNull()) + { + qDebug() << "Decompressor returned null!"; + continue; + } + + if (decompressedDataCount + decompressedLen > decompressedDataLen) { + qWarning() << "Decompressed overrun:" << decompressedDataCount + decompressedLen + << ">" << decompressedDataLen; + decompressedLen = decompressedDataLen - decompressedDataCount; + decompressedChunk.truncate(decompressedLen); + } + + decompressedData.append(decompressedChunk); + + decompressedDataCount += decompressedLen; + loopCount++; + } + Utils::ExportData(GetBaseStem() + ".zone", decompressedData); + + // // Load the zone file with the decompressed data (using an Xbox platform flag). + ZoneFile_COD21_PC* zoneFile = new ZoneFile_COD21_PC(); + zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); + if (!zoneFile->Load(decompressedData)) { + qWarning() << "Failed to load ZoneFile!"; + return false; + } + SetZoneFile(zoneFile); + + return true; +} + diff --git a/libs/fastfile/PC/fastfile_cod21_pc.h b/libs/fastfile/PC/fastfile_cod21_pc.h new file mode 100644 index 0000000..e029131 --- /dev/null +++ b/libs/fastfile/PC/fastfile_cod21_pc.h @@ -0,0 +1,20 @@ +#ifndef FASTFILE_COD21_PC_H +#define FASTFILE_COD21_PC_H + +#include "fastfile.h" + +class FastFile_COD21_PC : public FastFile +{ +public: + FastFile_COD21_PC(); + FastFile_COD21_PC(const QByteArray &aData); + FastFile_COD21_PC(const QString aFilePath); + ~FastFile_COD21_PC(); + + QByteArray GetBinaryData() const override; + + bool Load(const QString aFilePath) override; + bool Load(const QByteArray aData) override; +}; + +#endif // FASTFILE_COD21_PC_H diff --git a/libs/fastfile/PC/fastfile_cod4_pc.cpp b/libs/fastfile/PC/fastfile_cod4_pc.cpp index bd39b40..9f05206 100644 --- a/libs/fastfile/PC/fastfile_cod4_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod4_pc.cpp @@ -15,8 +15,6 @@ FastFile_COD4_PC::FastFile_COD4_PC() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("PC"); - SetGame("COD4"); } FastFile_COD4_PC::FastFile_COD4_PC(const QByteArray& aData) @@ -44,7 +42,7 @@ QByteArray FastFile_COD4_PC::GetBinaryData() const { } bool FastFile_COD4_PC::Load(const QString aFilePath) { - StatusBarManager::instance().updateStatus("Loading " + GetGame() + " Fast File w/path", 1000); + StatusBarManager::instance().updateStatus("Loading COD" + GetCommonInfo().GetGameString() + " Fast File w/path", 1000); if (aFilePath.isEmpty()) { return false; @@ -86,6 +84,7 @@ bool FastFile_COD4_PC::Load(const QByteArray aData) { ZoneFile_COD4_PC* zoneFile = new ZoneFile_COD4_PC(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PC/fastfile_cod5_pc.cpp b/libs/fastfile/PC/fastfile_cod5_pc.cpp index e8bcd36..b51c5ec 100644 --- a/libs/fastfile/PC/fastfile_cod5_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod5_pc.cpp @@ -15,8 +15,6 @@ FastFile_COD5_PC::FastFile_COD5_PC() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("PC"); - SetGame("COD5"); } FastFile_COD5_PC::FastFile_COD5_PC(const QByteArray& aData) @@ -86,6 +84,7 @@ bool FastFile_COD5_PC::Load(const QByteArray aData) { ZoneFile_COD5_PC* zoneFile = new ZoneFile_COD5_PC(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PC/fastfile_cod6_pc.cpp b/libs/fastfile/PC/fastfile_cod6_pc.cpp index 1aa09ef..6bd932d 100644 --- a/libs/fastfile/PC/fastfile_cod6_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod6_pc.cpp @@ -15,8 +15,6 @@ FastFile_COD6_PC::FastFile_COD6_PC() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetPlatform("PC"); - SetGame("COD6"); } FastFile_COD6_PC::FastFile_COD6_PC(const QByteArray& aData) @@ -101,6 +99,7 @@ bool FastFile_COD6_PC::Load(const QByteArray aData) { ZoneFile_COD6_PC* zoneFile = new ZoneFile_COD6_PC(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PC/fastfile_cod7_pc.cpp b/libs/fastfile/PC/fastfile_cod7_pc.cpp index d33f148..1bb5483 100644 --- a/libs/fastfile/PC/fastfile_cod7_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod7_pc.cpp @@ -1,9 +1,8 @@ #include "fastfile_cod7_pc.h" -#include "zonefile_cod7_pc.h" +//#include "zonefile_cod7_pc.h" #include "utils.h" #include "compression.h" -#include "encryption.h" #include #include @@ -15,8 +14,6 @@ FastFile_COD7_PC::FastFile_COD7_PC() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD7"); - SetPlatform("PC"); } FastFile_COD7_PC::FastFile_COD7_PC(const QByteArray& aData) @@ -83,8 +80,6 @@ bool FastFile_COD7_PC::Load(const QByteArray aData) { SetMagic(pParseFFMagic(&fastFileStream)); quint32 version = pParseFFVersion(&fastFileStream); SetVersion(version); - SetPlatform("360"); - SetGame("COD7"); // Assume the first 12 bytes are a header; the rest is zlib-compressed zone data. const QByteArray compressedData = aData.mid(12); @@ -92,13 +87,14 @@ bool FastFile_COD7_PC::Load(const QByteArray aData) { Utils::ExportData(GetBaseStem() + ".zone", decompressedData); - ZoneFile_COD7_PC* zoneFile = new ZoneFile_COD7_PC(); - zoneFile->SetStem(GetBaseStem() + ".zone"); - if (!zoneFile->Load(decompressedData)) { - qWarning() << "Failed to load ZoneFile!"; - return false; - } - SetZoneFile(zoneFile); + // ZoneFile_COD7_PC* zoneFile = new ZoneFile_COD7_PC(); + // zoneFile->SetStem(GetBaseStem() + ".zone"); + // zoneFile->SetCommonInfo(&mCommonInfo); + // if (!zoneFile->Load(decompressedData)) { + // qWarning() << "Failed to load ZoneFile!"; + // return false; + // } + // SetZoneFile(zoneFile); return true; } diff --git a/libs/fastfile/PC/fastfile_cod8_pc.cpp b/libs/fastfile/PC/fastfile_cod8_pc.cpp index 52f8d5f..d62d07a 100644 --- a/libs/fastfile/PC/fastfile_cod8_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod8_pc.cpp @@ -15,8 +15,6 @@ FastFile_COD8_PC::FastFile_COD8_PC() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD8"); - SetPlatform("PC"); } FastFile_COD8_PC::FastFile_COD8_PC(const QByteArray& aData) @@ -88,6 +86,7 @@ bool FastFile_COD8_PC::Load(const QByteArray aData) { ZoneFile_COD8_PC* zoneFile = new ZoneFile_COD8_PC(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PC/fastfile_cod9_pc.cpp b/libs/fastfile/PC/fastfile_cod9_pc.cpp index de4d678..97ab377 100644 --- a/libs/fastfile/PC/fastfile_cod9_pc.cpp +++ b/libs/fastfile/PC/fastfile_cod9_pc.cpp @@ -12,8 +12,6 @@ FastFile_COD9_PC::FastFile_COD9_PC() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD9"); - SetPlatform("PC"); } FastFile_COD9_PC::FastFile_COD9_PC(const QByteArray& aData) @@ -174,6 +172,7 @@ bool FastFile_COD9_PC::Load(const QByteArray aData) { // Load zone file ZoneFile_COD9_PC* zoneFile = new ZoneFile_COD9_PC(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(finalZone)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PS3/fastfile_cod10_ps3.cpp b/libs/fastfile/PS3/fastfile_cod10_ps3.cpp index 753f406..59a0eed 100644 --- a/libs/fastfile/PS3/fastfile_cod10_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod10_ps3.cpp @@ -12,8 +12,6 @@ FastFile_COD10_PS3::FastFile_COD10_PS3() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD10"); - SetPlatform("PS3"); } FastFile_COD10_PS3::FastFile_COD10_PS3(const QByteArray& aData) @@ -80,20 +78,18 @@ bool FastFile_COD10_PS3::Load(const QByteArray aData) { SetMagic(pParseFFMagic(&fastFileStream)); quint32 version = pParseFFVersion(&fastFileStream); SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD9"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(XDataStream::BigEndian); - if (GetPlatform() == "PC") { + if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { fastFileStream.setByteOrder(XDataStream::LittleEndian); } // Select key based on game. QByteArray key; - if (GetPlatform() == "360") { + if (GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { key = QByteArray::fromHex("0E50F49F412317096038665622DD091332A209BA0A05A00E1377CEDB0A3CB1D3"); - } else if (GetPlatform() == "PC") { + } else if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { key = QByteArray::fromHex("641D8A2FE31D3AA63622BBC9CE8587229D42B0F8ED9B924130BF88B65EDC50BE"); } @@ -122,6 +118,7 @@ bool FastFile_COD10_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD10_PS3* zoneFile = new ZoneFile_COD10_PS3(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PS3/fastfile_cod11_ps3.cpp b/libs/fastfile/PS3/fastfile_cod11_ps3.cpp index 45b94ca..8b509c1 100644 --- a/libs/fastfile/PS3/fastfile_cod11_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod11_ps3.cpp @@ -13,8 +13,6 @@ FastFile_COD11_PS3::FastFile_COD11_PS3() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD11"); - SetPlatform("PS3"); } FastFile_COD11_PS3::FastFile_COD11_PS3(const QByteArray& aData) @@ -140,6 +138,7 @@ bool FastFile_COD11_PS3::Load(const QByteArray aData) { // Load the zone file with decompressed data ZoneFile_COD11_PS3* zoneFile = new ZoneFile_COD11_PS3(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PS3/fastfile_cod12_ps3.cpp b/libs/fastfile/PS3/fastfile_cod12_ps3.cpp index ae8f481..541e2b2 100644 --- a/libs/fastfile/PS3/fastfile_cod12_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod12_ps3.cpp @@ -12,8 +12,6 @@ FastFile_COD12_PS3::FastFile_COD12_PS3() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD12"); - SetPlatform("PS3"); } FastFile_COD12_PS3::FastFile_COD12_PS3(const QByteArray& aData) @@ -80,20 +78,18 @@ bool FastFile_COD12_PS3::Load(const QByteArray aData) { SetMagic(pParseFFMagic(&fastFileStream)); quint32 version = pParseFFVersion(&fastFileStream); SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD9"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(XDataStream::BigEndian); - if (GetPlatform() == "PC") { + if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { fastFileStream.setByteOrder(XDataStream::LittleEndian); } // Select key based on game. QByteArray key; - if (GetPlatform() == "360") { + if (GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { key = QByteArray::fromHex("0E50F49F412317096038665622DD091332A209BA0A05A00E1377CEDB0A3CB1D3"); - } else if (GetPlatform() == "PC") { + } else if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { key = QByteArray::fromHex("641D8A2FE31D3AA63622BBC9CE8587229D42B0F8ED9B924130BF88B65EDC50BE"); } @@ -122,6 +118,7 @@ bool FastFile_COD12_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD12_PS3* zoneFile = new ZoneFile_COD12_PS3(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PS3/fastfile_cod4_ps3.cpp b/libs/fastfile/PS3/fastfile_cod4_ps3.cpp index a8743fb..e88c060 100644 --- a/libs/fastfile/PS3/fastfile_cod4_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod4_ps3.cpp @@ -15,8 +15,6 @@ FastFile_COD4_PS3::FastFile_COD4_PS3() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD4"); - SetPlatform("PS3"); } FastFile_COD4_PS3::FastFile_COD4_PS3(const QByteArray& aData) @@ -108,6 +106,7 @@ bool FastFile_COD4_PS3::Load(const QByteArray aData) { ZoneFile_COD4_PS3* zoneFile = new ZoneFile_COD4_PS3(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PS3/fastfile_cod5_ps3.cpp b/libs/fastfile/PS3/fastfile_cod5_ps3.cpp index 5c98ca9..8aec701 100644 --- a/libs/fastfile/PS3/fastfile_cod5_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod5_ps3.cpp @@ -15,8 +15,6 @@ FastFile_COD5_PS3::FastFile_COD5_PS3() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD5"); - SetPlatform("PS3"); } FastFile_COD5_PS3::FastFile_COD5_PS3(const QByteArray& aData) @@ -108,6 +106,7 @@ bool FastFile_COD5_PS3::Load(const QByteArray aData) { ZoneFile_COD5_PS3* zoneFile = new ZoneFile_COD5_PS3(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PS3/fastfile_cod6_ps3.cpp b/libs/fastfile/PS3/fastfile_cod6_ps3.cpp index 884886a..1bf501e 100644 --- a/libs/fastfile/PS3/fastfile_cod6_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod6_ps3.cpp @@ -15,8 +15,6 @@ FastFile_COD6_PS3::FastFile_COD6_PS3() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD6"); - SetPlatform("PS3"); } FastFile_COD6_PS3::FastFile_COD6_PS3(const QByteArray& aData) @@ -101,6 +99,7 @@ bool FastFile_COD6_PS3::Load(const QByteArray aData) { ZoneFile_COD6_PS3* zoneFile = new ZoneFile_COD6_PS3(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/PS3/fastfile_cod7_ps3.cpp b/libs/fastfile/PS3/fastfile_cod7_ps3.cpp index 5ec48d2..3d6bc2d 100644 --- a/libs/fastfile/PS3/fastfile_cod7_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod7_ps3.cpp @@ -15,8 +15,6 @@ FastFile_COD7_PS3::FastFile_COD7_PS3() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD7"); - SetPlatform("PS3"); } FastFile_COD7_PS3::FastFile_COD7_PS3(const QByteArray& aData) @@ -84,6 +82,7 @@ bool FastFile_COD7_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD7_PS3* zoneFile = new ZoneFile_COD7_PS3(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(XDataStream::BigEndian); diff --git a/libs/fastfile/PS3/fastfile_cod8_ps3.cpp b/libs/fastfile/PS3/fastfile_cod8_ps3.cpp index 65b7efb..c44cd9a 100644 --- a/libs/fastfile/PS3/fastfile_cod8_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod8_ps3.cpp @@ -15,8 +15,6 @@ FastFile_COD8_PS3::FastFile_COD8_PS3() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD8"); - SetPlatform("PS3"); } FastFile_COD8_PS3::FastFile_COD8_PS3(const QByteArray& aData) @@ -83,23 +81,22 @@ bool FastFile_COD8_PS3::Load(const QByteArray aData) { SetMagic(pParseFFMagic(&fastFileStream)); quint32 version = pParseFFVersion(&fastFileStream); SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD7"); ZoneFile_COD8_PS3* zoneFile = new ZoneFile_COD8_PS3(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(XDataStream::BigEndian); - if (GetPlatform() == "PC") { + if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { fastFileStream.setByteOrder(XDataStream::LittleEndian); // Select key based on game. QByteArray key; fastFileStream.skipRawData(4); - if (GetPlatform() == "360") { + if (GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { key = QByteArray::fromHex("1ac1d12d527c59b40eca619120ff8217ccff09cd16896f81b829c7f52793405d"); - } else if (GetPlatform() == "PS3") { + } else if (GetCommonInfo().GetPlatform() == PLATFORM_PS3) { key = QByteArray::fromHex("46D3F997F29C9ACE175B0DAE3AB8C0C1B8E423E2E3BF7E3C311EA35245BF193A"); // or // key = QByteArray::fromHex("0C99B3DDB8D6D0845D1147E470F28A8BF2AE69A8A9F534767B54E9180FF55370"); diff --git a/libs/fastfile/PS3/fastfile_cod9_ps3.cpp b/libs/fastfile/PS3/fastfile_cod9_ps3.cpp index 7c48e8e..338b7ba 100644 --- a/libs/fastfile/PS3/fastfile_cod9_ps3.cpp +++ b/libs/fastfile/PS3/fastfile_cod9_ps3.cpp @@ -12,8 +12,6 @@ FastFile_COD9_PS3::FastFile_COD9_PS3() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD9"); - SetPlatform("PS3"); } FastFile_COD9_PS3::FastFile_COD9_PS3(const QByteArray& aData) @@ -80,20 +78,18 @@ bool FastFile_COD9_PS3::Load(const QByteArray aData) { SetMagic(pParseFFMagic(&fastFileStream)); quint32 version = pParseFFVersion(&fastFileStream); SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD9"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(XDataStream::BigEndian); - if (GetPlatform() == "PC") { + if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { fastFileStream.setByteOrder(XDataStream::LittleEndian); } // Select key based on game. QByteArray key; - if (GetPlatform() == "360") { + if (GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { key = QByteArray::fromHex("0E50F49F412317096038665622DD091332A209BA0A05A00E1377CEDB0A3CB1D3"); - } else if (GetPlatform() == "PC") { + } else if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { key = QByteArray::fromHex("641D8A2FE31D3AA63622BBC9CE8587229D42B0F8ED9B924130BF88B65EDC50BE"); } @@ -114,9 +110,9 @@ bool FastFile_COD9_PS3::Load(const QByteArray aData) { QByteArray rsaSignature(256, Qt::Uninitialized); fastFileStream.readRawData(rsaSignature.data(), 256); - if (GetPlatform() == "360") { + if (GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { //decompressedData = Compressor::cod9_decryptFastFile(aData); - } else if (GetPlatform() == "PC") { + } else if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { //decompressedData = Encryption::decryptFastFile_BO2(aData); } @@ -130,6 +126,7 @@ bool FastFile_COD9_PS3::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD9_PS3* zoneFile = new ZoneFile_COD9_PS3(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/Wii/fastfile_cod4_wii.cpp b/libs/fastfile/Wii/fastfile_cod4_wii.cpp index 9830d5f..0551e85 100644 --- a/libs/fastfile/Wii/fastfile_cod4_wii.cpp +++ b/libs/fastfile/Wii/fastfile_cod4_wii.cpp @@ -14,8 +14,6 @@ FastFile_COD4_Wii::FastFile_COD4_Wii() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD4"); - SetPlatform("Wii"); } FastFile_COD4_Wii::FastFile_COD4_Wii(const QByteArray& aData) @@ -75,6 +73,7 @@ bool FastFile_COD4_Wii::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD4_Wii* zoneFile = new ZoneFile_COD4_Wii(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/Wii/fastfile_cod7_wii.cpp b/libs/fastfile/Wii/fastfile_cod7_wii.cpp index 50a31e0..d1cea87 100644 --- a/libs/fastfile/Wii/fastfile_cod7_wii.cpp +++ b/libs/fastfile/Wii/fastfile_cod7_wii.cpp @@ -14,8 +14,6 @@ FastFile_COD7_Wii::FastFile_COD7_Wii() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD7"); - SetPlatform("Wii"); } FastFile_COD7_Wii::FastFile_COD7_Wii(const QByteArray& aData) @@ -80,8 +78,6 @@ bool FastFile_COD7_Wii::Load(const QByteArray aData) { SetMagic(pParseFFMagic(&fastFileStream)); quint32 version = pParseFFVersion(&fastFileStream); SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD7"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(XDataStream::BigEndian); @@ -103,6 +99,7 @@ bool FastFile_COD7_Wii::Load(const QByteArray aData) { ZoneFile_COD7_Wii* zoneFile = new ZoneFile_COD7_Wii(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/Wii/fastfile_cod8_wii.cpp b/libs/fastfile/Wii/fastfile_cod8_wii.cpp index 696a65e..6291c28 100644 --- a/libs/fastfile/Wii/fastfile_cod8_wii.cpp +++ b/libs/fastfile/Wii/fastfile_cod8_wii.cpp @@ -14,8 +14,6 @@ FastFile_COD8_Wii::FastFile_COD8_Wii() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD8"); - SetPlatform("Wii"); } FastFile_COD8_Wii::FastFile_COD8_Wii(const QByteArray& aData) @@ -90,6 +88,7 @@ bool FastFile_COD8_Wii::Load(const QByteArray aData) { ZoneFile_COD8_Wii* zoneFile = new ZoneFile_COD8_Wii(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/WiiU/fastfile_cod10_wiiu.cpp b/libs/fastfile/WiiU/fastfile_cod10_wiiu.cpp index f6b34ca..e793fa1 100644 --- a/libs/fastfile/WiiU/fastfile_cod10_wiiu.cpp +++ b/libs/fastfile/WiiU/fastfile_cod10_wiiu.cpp @@ -12,8 +12,6 @@ FastFile_COD10_WiiU::FastFile_COD10_WiiU() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD10"); - SetPlatform("WiiU"); } FastFile_COD10_WiiU::FastFile_COD10_WiiU(const QByteArray& aData) @@ -78,20 +76,18 @@ bool FastFile_COD10_WiiU::Load(const QByteArray aData) { SetMagic(pParseFFMagic(&fastFileStream)); quint32 version = pParseFFVersion(&fastFileStream); SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD9"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(XDataStream::BigEndian); - if (GetPlatform() == "PC") { + if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { fastFileStream.setByteOrder(XDataStream::LittleEndian); } // Select key based on game. QByteArray key; - if (GetPlatform() == "360") { + if (GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { key = QByteArray::fromHex("0E50F49F412317096038665622DD091332A209BA0A05A00E1377CEDB0A3CB1D3"); - } else if (GetPlatform() == "PC") { + } else if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { key = QByteArray::fromHex("641D8A2FE31D3AA63622BBC9CE8587229D42B0F8ED9B924130BF88B65EDC50BE"); } @@ -112,9 +108,9 @@ bool FastFile_COD10_WiiU::Load(const QByteArray aData) { QByteArray rsaSignature(256, Qt::Uninitialized); fastFileStream.readRawData(rsaSignature.data(), 256); - if (GetPlatform() == "360") { + if (GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { //decompressedData = Compressor::cod9_decryptFastFile(aData); - } else if (GetPlatform() == "PC") { + } else if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { //decompressedData = Encryption::decryptFastFile_BO2(aData); } @@ -128,6 +124,7 @@ bool FastFile_COD10_WiiU::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD10_WiiU *zoneFile = new ZoneFile_COD10_WiiU(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/WiiU/fastfile_cod9_wiiu.cpp b/libs/fastfile/WiiU/fastfile_cod9_wiiu.cpp index de6b99c..9e333af 100644 --- a/libs/fastfile/WiiU/fastfile_cod9_wiiu.cpp +++ b/libs/fastfile/WiiU/fastfile_cod9_wiiu.cpp @@ -12,8 +12,6 @@ FastFile_COD9_WiiU::FastFile_COD9_WiiU() SetSignage(SIGNAGE_UNSIGNED); SetMagic(0); SetVersion(0); - SetGame("COD9"); - SetPlatform("WiiU"); } FastFile_COD9_WiiU::FastFile_COD9_WiiU(const QByteArray& aData) @@ -78,20 +76,18 @@ bool FastFile_COD9_WiiU::Load(const QByteArray aData) { SetMagic(pParseFFMagic(&fastFileStream)); quint32 version = pParseFFVersion(&fastFileStream); SetVersion(version); - SetPlatform(pCalculateFFPlatform(version)); - SetGame("COD9"); // For COD7/COD9, use BigEndian. fastFileStream.setByteOrder(XDataStream::BigEndian); - if (GetPlatform() == "PC") { + if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { fastFileStream.setByteOrder(XDataStream::LittleEndian); } // Select key based on game. QByteArray key; - if (GetPlatform() == "360") { + if (GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { key = QByteArray::fromHex("0E50F49F412317096038665622DD091332A209BA0A05A00E1377CEDB0A3CB1D3"); - } else if (GetPlatform() == "PC") { + } else if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { key = QByteArray::fromHex("641D8A2FE31D3AA63622BBC9CE8587229D42B0F8ED9B924130BF88B65EDC50BE"); } @@ -112,9 +108,9 @@ bool FastFile_COD9_WiiU::Load(const QByteArray aData) { QByteArray rsaSignature(256, Qt::Uninitialized); fastFileStream.readRawData(rsaSignature.data(), 256); - if (GetPlatform() == "360") { + if (GetCommonInfo().GetPlatform() == PLATFORM_XBOX) { //decompressedData = Compressor::cod9_decryptFastFile(aData); - } else if (GetPlatform() == "PC") { + } else if (GetCommonInfo().GetPlatform() == PLATFORM_PC) { //decompressedData = Encryption::decryptFastFile_BO2(aData); } @@ -128,6 +124,7 @@ bool FastFile_COD9_WiiU::Load(const QByteArray aData) { // Load the zone file with the decompressed data (using an Xbox platform flag). ZoneFile_COD9_WiiU* zoneFile = new ZoneFile_COD9_WiiU(); zoneFile->SetStem(GetBaseStem() + ".zone"); + zoneFile->SetCommonInfo(&mCommonInfo); if (!zoneFile->Load(decompressedData)) { qWarning() << "Failed to load ZoneFile!"; return false; diff --git a/libs/fastfile/fastfile.cpp b/libs/fastfile/fastfile.cpp index 685efad..ccc5450 100644 --- a/libs/fastfile/fastfile.cpp +++ b/libs/fastfile/fastfile.cpp @@ -7,15 +7,15 @@ #include FastFile::FastFile() - : mStem(""), - mType(FILETYPE_NONE), - mCompany(COMPANY_NONE), - mSignage(SIGNAGE_NONE), - mMagic(""), - mVersion(0), - mZoneFile(nullptr), - mGame(""), - mPlatform("") { + : mCommonInfo(), + mStem(""), + mType(FILETYPE_NONE), + mCompany(COMPANY_NONE), + mSignage(SIGNAGE_NONE), + mMagic(""), + mVersion(0), + mZoneFile(nullptr) +{ } @@ -24,15 +24,15 @@ FastFile::FastFile(const QByteArray &aData) { } FastFile::FastFile(FastFile &fastFile) - : mStem(fastFile.GetStem()), - mType(fastFile.GetType()), - mCompany(fastFile.GetCompany()), - mSignage(fastFile.GetSignage()), - mMagic(fastFile.GetMagic()), - mVersion(fastFile.GetVersion()), - mZoneFile(fastFile.GetZoneFile()), - mGame(fastFile.GetGame()), - mPlatform(fastFile.GetPlatform()) { + : mCommonInfo(fastFile.GetCommonInfo()), + mStem(fastFile.GetStem()), + mType(fastFile.GetType()), + mCompany(fastFile.GetCompany()), + mSignage(fastFile.GetSignage()), + mMagic(fastFile.GetMagic()), + mVersion(fastFile.GetVersion()), + mZoneFile(fastFile.GetZoneFile()) +{ } @@ -72,14 +72,6 @@ const ZoneFile* FastFile::GetZoneFile() const { return mZoneFile; } -QString FastFile::GetGame() const { - return mGame; -} - -QString FastFile::GetPlatform() const { - return mPlatform; -} - void FastFile::SetStem(const QString aStem) { mStem = aStem; } @@ -108,13 +100,6 @@ void FastFile::SetZoneFile(const ZoneFile* aZoneFile) { mZoneFile = aZoneFile; } -void FastFile::SetGame(const QString aGame) { mGame = aGame; -} - -void FastFile::SetPlatform(const QString aPlatform) { - mPlatform = aPlatform; -} - FF_COMPANY FastFile::pParseFFCompany(XDataStream *afastFileStream, quint32 &aCompanyInt) { LogManager::instance().addEntry("Parsing company into reference..."); // Check for null datastream ptr @@ -272,6 +257,27 @@ FastFile* FastFile::Open(const QString &aFilePath) { return fastFile; } + +XCommonInfo FastFile::GetCommonInfo() const +{ + return mCommonInfo; +} + +void FastFile::SetCommonInfo(const XCommonInfo &newCommonInfo) +{ + mCommonInfo = newCommonInfo; +} + +bool FastFile::Debug() const +{ + return mDebug; +} + +void FastFile::SetDebug(bool aDebug) +{ + mDebug = aDebug; +} + bool FastFile::ExportFastFile(const QString aFastFilePath) const { QFile fastFile(aFastFilePath); if (!fastFile.open(QIODevice::WriteOnly)) { diff --git a/libs/fastfile/fastfile.h b/libs/fastfile/fastfile.h index 62a71fd..8475c8c 100644 --- a/libs/fastfile/fastfile.h +++ b/libs/fastfile/fastfile.h @@ -2,8 +2,9 @@ #define FASTFILE_H #include "enums.h" -#include "utils.h" #include "zonefile.h" +#include "xcommoninfo.h" +#include "utils.h" #include #include @@ -33,8 +34,6 @@ public: virtual QString GetMagic() const; virtual quint32 GetVersion() const; virtual const ZoneFile *GetZoneFile() const; - virtual QString GetGame() const; - virtual QString GetPlatform() const; virtual void SetStem(const QString aStem); virtual void SetType(const FF_FILETYPE aType); @@ -43,8 +42,6 @@ public: virtual void SetMagic(const QString aMagic); virtual void SetVersion(const quint32 aVersion); virtual void SetZoneFile(const ZoneFile* aZoneFile); - virtual void SetGame(const QString aGame); - virtual void SetPlatform(const QString aPlatform); static FF_COMPANY pParseFFCompany(XDataStream *afastFileStream, quint32 &aCompanyInt); static FF_COMPANY pParseFFCompany(XDataStream *afastFileStream); @@ -57,6 +54,15 @@ public: static FastFile* Open(const QString& aFilePath); + XCommonInfo GetCommonInfo() const; + void SetCommonInfo(const XCommonInfo &newCommonInfo); + + bool Debug() const; + void SetDebug(bool aDebug); + +protected: + XCommonInfo mCommonInfo; + private: QString mStem; FF_FILETYPE mType; @@ -65,8 +71,8 @@ private: QString mMagic; quint32 mVersion; const ZoneFile* mZoneFile; - QString mGame; - QString mPlatform; + + bool mDebug; }; #endif // FASTFILE_H diff --git a/libs/fastfile/fastfile_factory.h b/libs/fastfile/fastfile_factory.h index 162be37..47c08de 100644 --- a/libs/fastfile/fastfile_factory.h +++ b/libs/fastfile/fastfile_factory.h @@ -15,6 +15,7 @@ #include "360/fastfile_cod12_360.h" //#include "PS3/fastfile_cod3_ps3.h" +#include "PC/fastfile_cod21_pc.h" #include "PS3/fastfile_cod4_ps3.h" #include "PS3/fastfile_cod5_ps3.h" #include "PS3/fastfile_cod6_ps3.h" @@ -45,39 +46,14 @@ #include #include -#include #include #include class FastFile; -enum FastFile_Platform { - PLATFORM_NONE = 0x00, - PLATFORM_PC = 0x01, - PLATFORM_360 = 0x02, - PLATFORM_PS3 = 0x03, - PLATFORM_WII = 0x04, - PLATFORM_WIIU = 0x05 -}; - -enum FastFile_Game { - GAME_NONE = 0x00, - GAME_COD2 = 0x01, - GAME_COD4 = 0x02, - GAME_COD5 = 0x03, - GAME_COD6 = 0x04, - GAME_COD7 = 0x05, - GAME_COD7_5 = 0x06, - GAME_COD8 = 0x07, - GAME_COD9 = 0x08, - GAME_COD10 = 0x09, - GAME_COD11 = 0x10, - GAME_COD12 = 0x11 -}; - class FastFileFactory { public: - static FastFile* Create(const QString& aFilePath, FastFile_Platform aPlatform = PLATFORM_NONE, FastFile_Game aGame = GAME_NONE) { + static FastFile* Create(const QString& aFilePath, XPlatform aPlatform = PLATFORM_NONE, XGame aGame = GAME_NONE) { QFile fastFile(aFilePath); if (!fastFile.open(QIODevice::ReadOnly)) { qDebug() << "Factory failed to open fast file: " << aFilePath; @@ -96,7 +72,7 @@ public: aGame = pGetGame(data); } - if (aPlatform == PLATFORM_360) { + if (aPlatform == PLATFORM_XBOX) { if (aGame == GAME_COD2) { resultFF = new FastFile_COD2_360(aFilePath); } else if (aGame == GAME_COD4) { @@ -173,9 +149,15 @@ public: resultFF = new FastFile_COD10_WiiU(aFilePath); } } + + if (resultFF) + { + resultFF->SetCommonInfo(XCommonInfo(aGame, aPlatform)); + } + return resultFF; } - static FastFile* Create(const QByteArray& aData, const QString aStem = "no_name", FastFile_Platform aPlatform = PLATFORM_NONE, FastFile_Game aGame = GAME_NONE) { + static FastFile* Create(const QByteArray& aData, const QString aStem = "no_name", XPlatform aPlatform = PLATFORM_NONE, XGame aGame = GAME_NONE) { FastFile* resultFF = nullptr; if (aPlatform == PLATFORM_NONE) { @@ -185,7 +167,7 @@ public: aGame = pGetGame(aData); } - if (aPlatform == PLATFORM_360) { + if (aPlatform == PLATFORM_XBOX) { if (aGame == GAME_COD2) { resultFF = new FastFile_COD2_360(); } else if (aGame == GAME_COD4) { @@ -228,6 +210,8 @@ public: resultFF = new FastFile_COD11_PC(); } else if (aGame == GAME_COD12) { resultFF = new FastFile_COD12_PC(); + } else if (aGame == GAME_COD21) { + resultFF = new FastFile_COD21_PC(); } } else if (aPlatform == PLATFORM_PS3) { if (aGame == GAME_COD4) { @@ -266,8 +250,10 @@ public: } if (resultFF) { resultFF->SetStem(aStem); + resultFF->SetCommonInfo(XCommonInfo(aGame, aPlatform)); resultFF->Load(aData); } + return resultFF; } private: @@ -286,33 +272,38 @@ private: return sections; } - static FastFile_Platform pGetPlatform(const QByteArray& aData) { + static XPlatform pGetPlatform(const QByteArray& aData) { const QStringList sections = pGetDataSections(aData); - if (sections[0] == "0000" || sections[0] == "4E58") { - return PLATFORM_360; - } else if (sections[4] == "0000") { + if (pGetGame(aData) == GAME_COD21) + { + return PLATFORM_PC; + } + else if (sections[0] == "0000" || sections[0] == "4E58") { + return PLATFORM_XBOX; + } + else if (sections[4] == "0000") { if (sections[5] == "0001" && sections[6] == "78DA") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[5] == "0001" && sections[6] == "4957") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[5] == "0183" && sections[6] == "7801") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[5] == "01D9" && sections[6] == "0000") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[6] == "0101" && sections[7] == "CA3E") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[6] == "0000" && sections[7] == "0001") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[6] == "0101" && sections[7] == "CC76") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[6] == "0101" && sections[7] == "0101") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[2] == "7831") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[0] == "5331" && sections[2] == "7531") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[2] == "3030" && sections[3] == "3030") { - return PLATFORM_360; + return PLATFORM_XBOX; } else if (sections[5] == "01A2" && sections[6] == "7801") { return PLATFORM_WII; } else if (sections[5] == "01DD" && sections[6] == "7801") { @@ -328,7 +319,7 @@ private: return PLATFORM_PS3; } - static FastFile_Game pGetGame(const QByteArray& aData) { + static XGame pGetGame(const QByteArray& aData) { const QStringList sections = pGetDataSections(aData); if (sections[0] == "0000") { return GAME_COD2; @@ -353,6 +344,8 @@ private: return GAME_COD11; } else if (sections[2] == "3030") { return GAME_COD12; + } else if (sections[2] == "6131" || sections[2] == "6431") { + return GAME_COD21; } return GAME_NONE; } diff --git a/libs/iwifile/iwifile.cpp b/libs/iwifile/iwifile.cpp index 8ec6e63..78ae08e 100644 --- a/libs/iwifile/iwifile.cpp +++ b/libs/iwifile/iwifile.cpp @@ -1,5 +1,4 @@ #include "iwifile.h" -#include "ddsfile.h" IWIFile::IWIFile() : fileStem(), @@ -81,39 +80,39 @@ IWIFile::IWIFile(const QString &aFilePath) : file.close(); } -IWIFile::IWIFile(const DDSFile &aDDSFile) { - // Ensure the DDS file has mipmaps - if (aDDSFile.mipmaps.isEmpty()) { - qDebug() << "Error: No mipmaps found in DDS file!"; - return; - } +// IWIFile::IWIFile(const DDSFile &aDDSFile) { +// // Ensure the DDS file has mipmaps +// if (aDDSFile.mipmaps.isEmpty()) { +// qDebug() << "Error: No mipmaps found in DDS file!"; +// return; +// } - // Create IWIFile object - fileStem = aDDSFile.fileStem; +// // Create IWIFile object +// fileStem = aDDSFile.fileStem; - // Set header (Magic & Version) - memcpy(header.Magic, "IWi", 3); - header.Version = 0x06; // Default to CoD4/CoD5 version +// // Set header (Magic & Version) +// memcpy(header.Magic, "IWi", 3); +// header.Version = 0x06; // Default to CoD4/CoD5 version - // Set IWI Texture Info - info.Format = static_cast(aDDSFile.header.pixelFormat.format); - info.Width = aDDSFile.header.width; - info.Height = aDDSFile.header.height; - info.Depth = 1; // Default depth for 2D textures - info.Usage = 0; // No specific usage +// // Set IWI Texture Info +// info.Format = static_cast(aDDSFile.header.pixelFormat.format); +// info.Width = aDDSFile.header.width; +// info.Height = aDDSFile.header.height; +// info.Depth = 1; // Default depth for 2D textures +// info.Usage = 0; // No specific usage - // Convert DDS mipmaps to IWI mipmaps - int offset = 28; // Standard offset start - for (const auto& ddsMipmap : aDDSFile.mipmaps) { - IWIMipmap iwiMipmap; - iwiMipmap.offset = offset; - iwiMipmap.size = ddsMipmap.data.size(); - iwiMipmap.data = ddsMipmap.data; +// // Convert DDS mipmaps to IWI mipmaps +// int offset = 28; // Standard offset start +// for (const auto& ddsMipmap : aDDSFile.mipmaps) { +// IWIMipmap iwiMipmap; +// iwiMipmap.offset = offset; +// iwiMipmap.size = ddsMipmap.data.size(); +// iwiMipmap.data = ddsMipmap.data; - offset += iwiMipmap.size; - mipmaps.append(iwiMipmap); - } -} +// offset += iwiMipmap.size; +// mipmaps.append(iwiMipmap); +// } +// } IWIFile::IWIFile(const IWIFile &iwiFile) { fileStem = iwiFile.fileStem; @@ -210,79 +209,81 @@ bool IWIFile::SaveIWI() const { return true; } -bool IWIFile::SaveDDS() const { - SetupExportDirs(); - QFile file("exports/dds/" + fileStem + ".dds"); - if (!file.open(QIODevice::WriteOnly)) { - qDebug() << "Error: Unable to write DDS file " << fileStem + ".dds"; - return false; - } +// bool IWIFile::SaveDDS() const { +// SetupExportDirs(); +// QFile file("exports/dds/" + fileStem + ".dds"); +// if (!file.open(QIODevice::WriteOnly)) { +// qDebug() << "Error: Unable to write DDS file " << fileStem + ".dds"; +// return false; +// } - DDSHeader ddsHeader = {}; - ddsHeader.magic = 0x20534444; // 'DDS ' - ddsHeader.size = 124; - ddsHeader.flags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_LINEARSIZE; - ddsHeader.height = info.Height; - ddsHeader.width = info.Width; - ddsHeader.depth = 0; - ddsHeader.mipMapCount = mipmaps.size(); +// DDSHeader ddsHeader = {}; +// ddsHeader.magic = 0x20534444; // 'DDS ' +// ddsHeader.size = 124; +// ddsHeader.flags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_LINEARSIZE; +// ddsHeader.height = info.Height; +// ddsHeader.width = info.Width; +// ddsHeader.depth = 0; +// ddsHeader.mipMapCount = mipmaps.size(); - DDSPixelFormat ddsPixelFormat = DDSFile::CalculatePixelFormat(info.Format); - if (ddsPixelFormat.flags & DDPF_FOURCC) { - ddsHeader.flags |= DDSD_LINEARSIZE; - } else { - ddsHeader.flags |= DDSD_PITCH; - } - ddsHeader.pixelFormat = ddsPixelFormat; +// DDSPixelFormat ddsPixelFormat = DDSFile::CalculatePixelFormat(info.Format); +// if (ddsPixelFormat.flags & DDPF_FOURCC) { +// ddsHeader.flags |= DDSD_LINEARSIZE; +// } else { +// ddsHeader.flags |= DDSD_PITCH; +// } +// ddsHeader.pixelFormat = ddsPixelFormat; - // Calculate pitch/linear size - if (ddsPixelFormat.flags & DDPF_FOURCC) { - int blockSize = (ddsPixelFormat.format == 0x31545844) ? 8 : 16; - ddsHeader.pitchOrLinearSize = fmax(1, (ddsHeader.width + 3) / 4) * blockSize * (ddsHeader.height / 4); - } else { - ddsHeader.pitchOrLinearSize = ddsHeader.width * (ddsPixelFormat.rgbBitCount / 8); - } +// // Calculate pitch/linear size +// if (ddsPixelFormat.flags & DDPF_FOURCC) { +// int blockSize = (ddsPixelFormat.format == 0x31545844) ? 8 : 16; +// ddsHeader.pitchOrLinearSize = fmax(1, (ddsHeader.width + 3) / 4) * blockSize * (ddsHeader.height / 4); +// } else { +// ddsHeader.pitchOrLinearSize = ddsHeader.width * (ddsPixelFormat.rgbBitCount / 8); +// } - DDSCaps ddsCaps = {}; - ddsCaps.caps1 = DDSCAPS_TEXTURE; - ddsCaps.caps2 = 0; - ddsCaps.dDSX = 0; - ddsCaps.reserved = 0; - ddsHeader.caps = ddsCaps; +// DDSCaps ddsCaps = {}; +// ddsCaps.caps1 = DDSCAPS_TEXTURE; +// ddsCaps.caps2 = 0; +// ddsCaps.dDSX = 0; +// ddsCaps.reserved = 0; +// ddsHeader.caps = ddsCaps; - QDataStream out(&file); - out.setByteOrder(QDataStream::LittleEndian); +// QDataStream out(&file); +// out.setByteOrder(QDataStream::LittleEndian); - // Write DDS header - out.writeRawData(reinterpret_cast(&ddsHeader), sizeof(DDSHeader)); +// // Write DDS header +// out.writeRawData(reinterpret_cast(&ddsHeader), sizeof(DDSHeader)); - for (auto mipmap : mipmaps) { - if (!mipmap.data.size()) { continue; } +// for (auto mipmap : mipmaps) { +// if (!mipmap.data.size()) { continue; } - // Write mipmap data - out.writeRawData(reinterpret_cast(mipmap.data.constData()), mipmap.data.size()); - } - file.close(); +// // Write mipmap data +// out.writeRawData(reinterpret_cast(mipmap.data.constData()), mipmap.data.size()); +// } +// file.close(); - return true; -} +// return true; +// } bool IWIFile::SavePNG() const { - DDSFile ddsFile(*this); - if (!ddsFile.SavePNG()) { - qDebug() << "Error: Failed to save PNG file: " << fileStem + ".png"; - return false; - } - return true; + // DDSFile ddsFile(*this); + // if (!ddsFile.SavePNG()) { + // qDebug() << "Error: Failed to save PNG file: " << fileStem + ".png"; + // return false; + // } + // return true; + return false; } bool IWIFile::SaveJPG() const { - DDSFile ddsFile(*this); - if (!ddsFile.SavePNG()) { - qDebug() << "Error: Failed to save JPG file: " << fileStem + ".jpg"; - return false; - } - return true; + // DDSFile ddsFile(*this); + // if (!ddsFile.SavePNG()) { + // qDebug() << "Error: Failed to save JPG file: " << fileStem + ".jpg"; + // return false; + // } + // return true; + return false; } // Check if the IWI version is supported diff --git a/libs/iwifile/iwifile.h b/libs/iwifile/iwifile.h index 47bf577..f0270a9 100644 --- a/libs/iwifile/iwifile.h +++ b/libs/iwifile/iwifile.h @@ -9,8 +9,6 @@ #include #include -#include "ddsfile.h" - // Supported versions static const QVector supportedVersions = { 0x05, // CoD2 @@ -50,7 +48,6 @@ public: IWIFile(); IWIFile(const QString &aFilePath); - IWIFile(const DDSFile &aDDSFile); IWIFile(const IWIFile &iwiFile); IWIFile& operator=(const IWIFile& other); ~IWIFile(); diff --git a/libs/xassets/xanimdeltapart.cpp b/libs/xassets/xanimdeltapart.cpp index 5c7b023..62c7093 100644 --- a/libs/xassets/xanimdeltapart.cpp +++ b/libs/xassets/xanimdeltapart.cpp @@ -9,10 +9,8 @@ XAnimDeltaPart::XAnimDeltaPart() } void XAnimDeltaPart::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - mTrans.ParsePtr(aStream); - mQuat.ParsePtr(aStream); - } + mTrans.ParsePtr(aStream); + mQuat.ParsePtr(aStream); } void XAnimDeltaPart::Clear() diff --git a/libs/xassets/xanimdeltapartquat.cpp b/libs/xassets/xanimdeltapartquat.cpp index cde96ac..094f23d 100644 --- a/libs/xassets/xanimdeltapartquat.cpp +++ b/libs/xassets/xanimdeltapartquat.cpp @@ -7,12 +7,10 @@ XAnimDeltaPartQuat::XAnimDeltaPartQuat() } void XAnimDeltaPartQuat::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - mSize = aStream->ParseUInt32(QString("%1 size").arg(GetName())); + mSize = aStream->ParseUInt32(QString("%1 size").arg(GetName())); - // Parse data - mData.ParseData(aStream); - } + // Parse data + mData.ParseData(aStream); } quint32 XAnimDeltaPartQuat::GetSize() const { diff --git a/libs/xassets/xanimdeltapartquatdata.cpp b/libs/xassets/xanimdeltapartquatdata.cpp index 52a4402..1f1cd2e 100644 --- a/libs/xassets/xanimdeltapartquatdata.cpp +++ b/libs/xassets/xanimdeltapartquatdata.cpp @@ -7,10 +7,8 @@ XAnimDeltaPartQuatData::XAnimDeltaPartQuatData() } void XAnimDeltaPartQuatData::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - // Parse frames - mFrames.ParseData(aStream); - } + // Parse frames + mFrames.ParseData(aStream); } const XAnimDeltaPartQuatDataFrames& XAnimDeltaPartQuatData::GetFrames() const { diff --git a/libs/xassets/xanimdeltapartquatdataframes.cpp b/libs/xassets/xanimdeltapartquatdataframes.cpp index 0a22794..b21fd06 100644 --- a/libs/xassets/xanimdeltapartquatdataframes.cpp +++ b/libs/xassets/xanimdeltapartquatdataframes.cpp @@ -37,15 +37,13 @@ void XAnimDeltaPartQuatDataFrames::SetIndices(const XAnimDynamicIndices& indices } void XAnimDeltaPartQuatDataFrames::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - mFramesPtr = aStream->ParseInt32(QString("%1 frames ptr").arg(GetName())); + mFramesPtr = aStream->ParseInt32(QString("%1 frames ptr").arg(GetName())); - mFrames[0] = aStream->ParseInt16(QString("%1 frame %2").arg(GetName()).arg(0)); - mFrames[1] = aStream->ParseInt16(QString("%1 frame %2").arg(GetName()).arg(1)); + mFrames[0] = aStream->ParseInt16(QString("%1 frame %2").arg(GetName()).arg(0)); + mFrames[1] = aStream->ParseInt16(QString("%1 frame %2").arg(GetName()).arg(1)); - // Parse indices - mIndices.ParseData(aStream); - } + // Parse indices + mIndices.ParseData(aStream); } void XAnimDeltaPartQuatDataFrames::Clear() diff --git a/libs/xassets/xanimdynamicframes.cpp b/libs/xassets/xanimdynamicframes.cpp index 2adfedb..17a0046 100644 --- a/libs/xassets/xanimdynamicframes.cpp +++ b/libs/xassets/xanimdynamicframes.cpp @@ -8,15 +8,9 @@ XAnimDynamicFrames::XAnimDynamicFrames() } void XAnimDynamicFrames::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - qint32 framePtr = aStream->ParseInt32(QString("%1 frames ptr").arg(GetName())); - if (framePtr == -1) - { - mFrames[0] = aStream->ParseUInt8(QString("%1 frame %2").arg(GetName()).arg(0)); - mFrames[1] = aStream->ParseUInt8(QString("%1 frame %2").arg(GetName()).arg(1)); - mFrames[2] = aStream->ParseUInt8(QString("%1 frame %2").arg(GetName()).arg(2)); - } - } + mFrames[0] = aStream->ParseUInt8(QString("%1 frame %2").arg(GetName()).arg(0)); + mFrames[1] = aStream->ParseUInt8(QString("%1 frame %2").arg(GetName()).arg(1)); + mFrames[2] = aStream->ParseUInt8(QString("%1 frame %2").arg(GetName()).arg(2)); } void XAnimDynamicFrames::Clear() diff --git a/libs/xassets/xanimdynamicindices.cpp b/libs/xassets/xanimdynamicindices.cpp index 5d58744..42081e1 100644 --- a/libs/xassets/xanimdynamicindices.cpp +++ b/libs/xassets/xanimdynamicindices.cpp @@ -8,9 +8,7 @@ XAnimDynamicIndices::XAnimDynamicIndices() } void XAnimDynamicIndices::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - mIndices[0] = aStream->ParseUInt8(QString("%1 index").arg(GetName())); - } + mIndices[0] = aStream->ParseUInt8(QString("%1 index").arg(GetName())); } void XAnimDynamicIndices::Clear() diff --git a/libs/xassets/xanimindices.cpp b/libs/xassets/xanimindices.cpp index 012020d..986fca7 100644 --- a/libs/xassets/xanimindices.cpp +++ b/libs/xassets/xanimindices.cpp @@ -7,14 +7,9 @@ XAnimIndices::XAnimIndices() SetName("Animation Indices"); } -void XAnimIndices::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - qint32 indexPtr = aStream->ParseInt32(QString("%1 index ptr").arg(GetName())); - if (indexPtr == -1) - { - mIndex = aStream->ParseUInt32(QString("%1 index").arg(GetName())); - } - } +void XAnimIndices::ParseData(XDataStream *aStream) +{ + mIndex = aStream->ParseUInt32(QString("%1 index").arg(GetName())); } void XAnimIndices::Clear() diff --git a/libs/xassets/xanimnotifyinfo.cpp b/libs/xassets/xanimnotifyinfo.cpp index 7d88ef5..f2d0c93 100644 --- a/libs/xassets/xanimnotifyinfo.cpp +++ b/libs/xassets/xanimnotifyinfo.cpp @@ -8,12 +8,10 @@ XAnimNotifyInfo::XAnimNotifyInfo() SetName("Animation Notify Info"); } -void XAnimNotifyInfo::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - - mName = aStream->ParseUInt32(QString("%1 name").arg(GetName())); - mTime = aStream->ParseSingle(QString("%1 time").arg(GetName())); - } +void XAnimNotifyInfo::ParseData(XDataStream *aStream) +{ + mName = aStream->ParseUInt32(QString("%1 name").arg(GetName())); + mTime = aStream->ParseSingle(QString("%1 time").arg(GetName())); } void XAnimNotifyInfo::Clear() diff --git a/libs/xassets/xanimparts.cpp b/libs/xassets/xanimparts.cpp index 7942cb4..21b72a5 100644 --- a/libs/xassets/xanimparts.cpp +++ b/libs/xassets/xanimparts.cpp @@ -14,7 +14,7 @@ XAnimParts::XAnimParts() , mBoneCount(12) , mNotifyCount(0) , mAssetType(0) - , mPad(false) + , mIsDefault(false) , mRandomDataShortCount(0) , mIndexCount(0) , mFramerate(0.0f) @@ -34,85 +34,86 @@ XAnimParts::XAnimParts() SetName("Animation Parts"); } -void XAnimParts::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { +void XAnimParts::ParseData(XDataStream *aStream) +{ + mName.ParsePtr(aStream, false); - mName.ParsePtr(aStream, false); + // Parse all fields + mDataByteCount = aStream->ParseUInt16(QString("%1 data byte count").arg(GetName())); + mDataShortCount = aStream->ParseUInt16(QString("%1 data short count").arg(GetName())); + mDataIntCount = aStream->ParseUInt16(QString("%1 data int count").arg(GetName())); + mRandomDataByteCount = aStream->ParseUInt16(QString("%1 random date byte count").arg(GetName())); + mRandomDataIntCount = aStream->ParseUInt16(QString("%1 random data int count").arg(GetName())); + mNumFrames = aStream->ParseUInt16(QString("%1 # frames").arg(GetName())); - // Parse all fields - mDataByteCount = aStream->ParseUInt32(QString("%1 data byte count").arg(GetName())); - mDataShortCount = aStream->ParseUInt32(QString("%1 data short count").arg(GetName())); - mDataIntCount = aStream->ParseUInt32(QString("%1 data int count").arg(GetName())); - mRandomDataByteCount = aStream->ParseUInt32(QString("%1 random date byte count").arg(GetName())); - mRandomDataIntCount = aStream->ParseUInt32(QString("%1 random data int count").arg(GetName())); - mNumFrames = aStream->ParseUInt32(QString("%1 # frames").arg(GetName())); + mIsLoop = aStream->ParseUInt8(QString("%1 loop").arg(GetName())); + mIsDelta = aStream->ParseUInt8(QString("%1 delta").arg(GetName())); + aStream->skipRawData(2); - quint8 loopDelta = aStream->ParseUInt8(QString("%1 loop delta").arg(GetName())); - mIsLoop = (loopDelta & 0x1) != 0; - mIsDelta = (loopDelta & 0x2) != 0; - - for (int i = 0; i < 12; i++) - { - mBoneCount[i] = aStream->ParseUInt8(QString("%1 bone count %2").arg(GetName()).arg(i)); - } - - mNotifyCount = aStream->ParseUInt8(QString("%1 notify count").arg(GetName())); - mAssetType = aStream->ParseUInt8(QString("%1 asset type").arg(GetName())); - mPad = aStream->ParseUInt32(QString("%1 pad").arg(GetName())) != 0; - - qint32 namesPtr, dataBytePtr, dataShortPtr, dataIntPtr, - randomDataShortPtr, randomDataBytePtr, randomDataIntPtr; - - mRandomDataShortCount = aStream->ParseUInt32(QString("%1 random data short count").arg(GetName())); - mIndexCount = aStream->ParseUInt32(QString("%1 index count").arg(GetName())); - mFramerate = aStream->ParseSingle(QString("%1 frame rate").arg(GetName())); - mFrequency = aStream->ParseSingle(QString("%1 frequency").arg(GetName())); - namesPtr = aStream->ParseInt32(QString("%1 names ptr").arg(GetName())); - dataBytePtr = aStream->ParseInt32(QString("%1 data byte ptr").arg(GetName())); - dataShortPtr = aStream->ParseInt32(QString("%1 data short ptr").arg(GetName())); - dataIntPtr = aStream->ParseInt32(QString("%1 data int ptr").arg(GetName())); - randomDataShortPtr = aStream->ParseInt32(QString("%1 random data short ptr").arg(GetName())); - randomDataBytePtr = aStream->ParseInt32(QString("%1 random data byte ptr").arg(GetName())); - randomDataIntPtr = aStream->ParseInt32(QString("%1 random data int ptr").arg(GetName())); - - // Parse indices - mIndices.ParseData(aStream); - mNotify.ParsePtr(aStream, false); - mDeltaPart.ParsePtr(aStream, false); - - mName.ParseData(aStream); - if (namesPtr) - { - mNames = aStream->ParseInt32(QString("%1 names").arg(GetName())); - } - mNotify.ParseData(aStream); - mDeltaPart.ParseData(aStream); - if (dataBytePtr) - { - mDataByte = aStream->ParseUInt8(QString("%1 data byte").arg(GetName())); - } - if (dataShortPtr) - { - mDataShort = aStream->ParseInt16(QString("%1 data short").arg(GetName())); - } - if (dataIntPtr) - { - mDataInt = aStream->ParseInt32(QString("%1 data int").arg(GetName())); - } - if (randomDataShortPtr) - { - mRandomDataShort = aStream->ParseInt16(QString("%1 random data short").arg(GetName())); - } - if (randomDataBytePtr) - { - mRandomDataByte = aStream->ParseUInt8(QString("%1 random data byte").arg(GetName())); - } - if (randomDataIntPtr) - { - mRandomDataInt = aStream->ParseInt32(QString("%1 random data int").arg(GetName())); - } - mIndices.ParseData(aStream); + for (int i = 0; i < 10; i++) + { + mBoneCount[i] = aStream->ParseUInt8(QString("%1 bone count %2").arg(GetName()).arg(i)); } + aStream->skipRawData(2); + + mNotifyCount = aStream->ParseUInt8(QString("%1 notify count").arg(GetName())); + mAssetType = aStream->ParseUInt8(QString("%1 asset type").arg(GetName())); + mIsDefault = aStream->ParseUInt8(QString("%1 pad").arg(GetName())); + aStream->skipRawData(1); + + qint32 namesPtr, dataBytePtr, dataShortPtr, dataIntPtr, + randomDataShortPtr, randomDataBytePtr, randomDataIntPtr; + + mRandomDataShortCount = aStream->ParseUInt32(QString("%1 random data short count").arg(GetName())); + mIndexCount = aStream->ParseUInt32(QString("%1 index count").arg(GetName())); + mFramerate = aStream->ParseSingle(QString("%1 frame rate").arg(GetName())); + mFrequency = aStream->ParseSingle(QString("%1 frequency").arg(GetName())); + namesPtr = aStream->ParseInt32(QString("%1 names ptr").arg(GetName())); + dataBytePtr = aStream->ParseInt32(QString("%1 data byte ptr").arg(GetName())); + dataShortPtr = aStream->ParseInt32(QString("%1 data short ptr").arg(GetName())); + dataIntPtr = aStream->ParseInt32(QString("%1 data int ptr").arg(GetName())); + randomDataShortPtr = aStream->ParseInt32(QString("%1 random data short ptr").arg(GetName())); + randomDataBytePtr = aStream->ParseInt32(QString("%1 random data byte ptr").arg(GetName())); + randomDataIntPtr = aStream->ParseInt32(QString("%1 random data int ptr").arg(GetName())); + + // Parse indices + mIndices.ParsePtr(aStream, false); + mNotify.ParsePtr(aStream, false); + mDeltaPart.ParsePtr(aStream, false); + + mName.ParseDataSafe(aStream); + SetDisplayName(mName.GetString()); + if (namesPtr) + { + mNames = aStream->ParseInt32(QString("%1 names").arg(GetName())); + } + mNotify.ParseDataSafe(aStream); + mDeltaPart.ParseDataSafe(aStream); + if (dataBytePtr) + { + mDataByte = aStream->ParseUInt8(QString("%1 data byte").arg(GetName())); + } + if (dataShortPtr) + { + mDataShort = aStream->ParseInt16(QString("%1 data short").arg(GetName())); + } + if (dataIntPtr) + { + mDataInt = aStream->ParseInt32(QString("%1 data int").arg(GetName())); + } + if (randomDataShortPtr) + { + mRandomDataShort = aStream->ParseInt16(QString("%1 random data short").arg(GetName())); + } + if (randomDataBytePtr) + { + mRandomDataByte = aStream->ParseUInt8(QString("%1 random data byte").arg(GetName())); + } + if (randomDataIntPtr) + { + mRandomDataInt = aStream->ParseInt32(QString("%1 random data int").arg(GetName())); + } + mIndices.ParseDataSafe(aStream); } void XAnimParts::Clear() diff --git a/libs/xassets/xanimparts.h b/libs/xassets/xanimparts.h index 35f5c94..fa969cc 100644 --- a/libs/xassets/xanimparts.h +++ b/libs/xassets/xanimparts.h @@ -35,7 +35,7 @@ private: quint8 mNotifyCount = 0; quint8 mAssetType = 0; - bool mPad = false; + bool mIsDefault = false; quint32 mRandomDataShortCount = 0; quint32 mIndexCount = 0; diff --git a/libs/xassets/xanimparttrans.cpp b/libs/xassets/xanimparttrans.cpp index 4eb8434..433bf07 100644 --- a/libs/xassets/xanimparttrans.cpp +++ b/libs/xassets/xanimparttrans.cpp @@ -19,13 +19,11 @@ XAnimPartTrans::XAnimPartTrans(const XAnimPartTrans &aSrc) } void XAnimPartTrans::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - mSize = aStream->ParseUInt32(QString("%1 size").arg(GetName())); - mIsSmallTrans = aStream->ParseUInt8(QString("%1 is small trans").arg(GetName())) != 0; + mSize = aStream->ParseUInt32(QString("%1 size").arg(GetName())); + mIsSmallTrans = aStream->ParseUInt8(QString("%1 is small trans").arg(GetName())) != 0; - // Parse data - mData.ParseData(aStream); - } + // Parse data + mData.ParseData(aStream); } void XAnimPartTrans::Clear() diff --git a/libs/xassets/xanimparttransdata.cpp b/libs/xassets/xanimparttransdata.cpp index 1c135e6..1cc269e 100644 --- a/libs/xassets/xanimparttransdata.cpp +++ b/libs/xassets/xanimparttransdata.cpp @@ -17,11 +17,9 @@ XAnimPartTransData::XAnimPartTransData(const XAnimPartTransData &aSrc) } void XAnimPartTransData::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - // We need to determine which part of the union to parse - // For simplicity, we'll assume it's always frames for now - mFrames.ParseData(aStream); - } + // We need to determine which part of the union to parse + // For simplicity, we'll assume it's always frames for now + mFrames.ParseData(aStream); } void XAnimPartTransData::Clear() diff --git a/libs/xassets/xanimparttransframes.cpp b/libs/xassets/xanimparttransframes.cpp index ae458b4..08aaa7d 100644 --- a/libs/xassets/xanimparttransframes.cpp +++ b/libs/xassets/xanimparttransframes.cpp @@ -11,20 +11,18 @@ XAnimPartTransFrames::XAnimPartTransFrames() } void XAnimPartTransFrames::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - mMins[0] = aStream->ParseSingle(QString("%1 min %2").arg(GetName()).arg(0)); - mMins[1] = aStream->ParseSingle(QString("%1 min %2").arg(GetName()).arg(1)); - mMins[2] = aStream->ParseSingle(QString("%1 min %2").arg(GetName()).arg(2)); - mMaxs[0] = aStream->ParseSingle(QString("%1 max %2").arg(GetName()).arg(0)); - mMaxs[1] = aStream->ParseSingle(QString("%1 max %2").arg(GetName()).arg(1)); - mMaxs[2] = aStream->ParseSingle(QString("%1 max %2").arg(GetName()).arg(2)); + mMins[0] = aStream->ParseSingle(QString("%1 min %2").arg(GetName()).arg(0)); + mMins[1] = aStream->ParseSingle(QString("%1 min %2").arg(GetName()).arg(1)); + mMins[2] = aStream->ParseSingle(QString("%1 min %2").arg(GetName()).arg(2)); + mMaxs[0] = aStream->ParseSingle(QString("%1 max %2").arg(GetName()).arg(0)); + mMaxs[1] = aStream->ParseSingle(QString("%1 max %2").arg(GetName()).arg(1)); + mMaxs[2] = aStream->ParseSingle(QString("%1 max %2").arg(GetName()).arg(2)); - // Parse frames - mFrames.ParseData(aStream); + // Parse frames + mFrames.ParsePtr(aStream); - // Parse indices - mIndices.ParseData(aStream); - } + // Parse indices + mIndices.ParseData(aStream); } void XAnimPartTransFrames::Clear() diff --git a/libs/xassets/xasset.cpp b/libs/xassets/xasset.cpp index 974657f..767cd44 100644 --- a/libs/xassets/xasset.cpp +++ b/libs/xassets/xasset.cpp @@ -23,6 +23,9 @@ XAsset::XAsset() : mPtr(0) , mType(ASSET_TYPE_NONE) , mName("Unknown Asset") + , mDisplayName("Unknown") + , mCommonInfo(nullptr) + , mSubAssets() { } @@ -79,7 +82,15 @@ void XAsset::Clear() void XAsset::ParsePtr(XDataStream *aStream, bool aDataFlag) { mPtr = aStream->ParseInt32(QString("%1 ptr").arg(GetName())); - if (aDataFlag && mPtr == -1) + if (aDataFlag) + { + ParseDataSafe(aStream); + } +} + +void XAsset::ParseDataSafe(XDataStream *aStream) +{ + if (GetPtr() == -1) { ParseData(aStream); } @@ -146,6 +157,8 @@ XAsset* XAsset::Create(XAssetType aAssetType) return new XModelPieces(); case ASSET_TYPE_PHYSPRESET: return new XPhysPreset(); + case ASSET_TYPE_SCRIPT_PARSE_TREE: + return new XRawFile(); // case ASSET_TYPE_UI_MAP: // case ASSET_TYPE_AITYPE: // case ASSET_TYPE_MPTYPE: @@ -237,7 +250,7 @@ QString XAsset::XAssetTypeToString(XAssetType type) { return "String"; case ASSET_TYPE_ASSETLIST: return "AssetList"; - case ASSET_TYPE_COLLISION_MAP: + case ASSET_TYPE_COL_MAP_MP: return "CollisionMap"; case ASSET_TYPE_GFX_MAP: return "GfxMap"; @@ -430,4 +443,39 @@ QString XAsset::XAssetTypeToString(XAssetType type) { } } +const XCommonInfo *XAsset::GetCommonInfo() const +{ + return mCommonInfo; +} + +void XAsset::SetCommonInfo(const XCommonInfo *newCommonInfo) +{ + mCommonInfo = newCommonInfo; +} + +QString XAsset::DisplayName() const +{ + return mDisplayName; +} + +void XAsset::SetDisplayName(const QString &aDisplayName) +{ + mDisplayName = aDisplayName; +} + +QVector XAsset::SubAssets() const +{ + return mSubAssets; +} + +void XAsset::SetSubAssets(const QVector &aSubAssets) +{ + mSubAssets = aSubAssets; +} + +void XAsset::AddSubAsset(XAsset* aSubAsset) +{ + mSubAssets.push_back(aSubAsset); +} + bool XAsset::mDebug = true; diff --git a/libs/xassets/xasset.h b/libs/xassets/xasset.h index 3fc67e7..01f5398 100644 --- a/libs/xassets/xasset.h +++ b/libs/xassets/xasset.h @@ -2,16 +2,19 @@ #define XASSET_H #include "xassettype.h" - #include "xdatastream.h" +#include "xcommoninfo.h" + #include #include #include +class ZoneFile; + class XAsset { public: - XAsset(); + explicit XAsset(); virtual ~XAsset() = default; void SetPtr(qint32 aPtr); @@ -29,16 +32,32 @@ public: virtual void Clear(); virtual void ParsePtr(XDataStream *aStream, bool aDataFlag = true); virtual void ParseData(XDataStream *aStream) = 0; + virtual void ParseDataSafe(XDataStream *aStream); static XAsset* Create(XAssetType aAssetType); static QString XAssetTypeToString(XAssetType type); static bool mDebug; + const XCommonInfo *GetCommonInfo() const; + void SetCommonInfo(const XCommonInfo *newCommonInfo); + + QString DisplayName() const; + void SetDisplayName(const QString &aDisplayName); + + QVector SubAssets() const; + void SetSubAssets(const QVector &aSubAssets); + void AddSubAsset(XAsset *aSubAsset); + private: qint32 mPtr; XAssetType mType; QString mName; + QString mDisplayName; + + const XCommonInfo* mCommonInfo; + + QVector mSubAssets; }; #endif // XASSET_H diff --git a/libs/xassets/xassetlist.cpp b/libs/xassets/xassetlist.cpp index caf73ba..22e64cf 100644 --- a/libs/xassets/xassetlist.cpp +++ b/libs/xassets/xassetlist.cpp @@ -57,16 +57,13 @@ void XAssetList::ParseData(XDataStream *aStream) { for (int i = 0; i < mAssetHeaders.size(); i++) { - if (aStream->device()->pos() > 98000) - { - qDebug() << "test"; - } XAssetHeader assetHeader = mAssetHeaders[i]; XAsset* asset = XAsset::Create(assetHeader.GetAssetType()); if (asset) { asset->SetPtr(assetHeader.GetAssetPtr()); - asset->ParseData(aStream); + asset->SetCommonInfo(GetCommonInfo()); + asset->ParseDataSafe(aStream); mAssets.append(asset); } diff --git a/libs/xassets/xassettype.h b/libs/xassets/xassettype.h index a1631e8..b5e00ff 100644 --- a/libs/xassets/xassettype.h +++ b/libs/xassets/xassettype.h @@ -1,8 +1,6 @@ #ifndef XASSETTYPE_H #define XASSETTYPE_H -#include - enum XAssetType { ASSET_TYPE_XMODELPIECES, @@ -11,6 +9,7 @@ enum XAssetType ASSET_TYPE_XMODEL, ASSET_TYPE_MATERIAL, ASSET_TYPE_PIXELSHADER, + ASSET_TYPE_VERTEXSHADER, ASSET_TYPE_TECHNIQUE_SET, ASSET_TYPE_IMAGE, ASSET_TYPE_SOUND, @@ -26,7 +25,7 @@ enum XAssetType ASSET_TYPE_LIGHT_DEF, ASSET_TYPE_UI_MAP, ASSET_TYPE_FONT, - ASSET_TYPE_MENULIST, + ASSET_TYPE_MENULIST, // Sometimes referred to as MENUFILE ASSET_TYPE_MENU, ASSET_TYPE_LOCALIZE_ENTRY, ASSET_TYPE_WEAPON, @@ -43,11 +42,13 @@ enum XAssetType ASSET_TYPE_STRING, ASSET_TYPE_ASSETLIST, - ASSET_TYPE_COLLISION_MAP, + ASSET_TYPE_COL_MAP_MP, ASSET_TYPE_GFX_MAP, ASSET_TYPE_D3DBSP, ASSET_TYPE_GAME_MAP_SP, + ASSET_TYPE_GAME_MAP_MP, ASSET_TYPE_COL_MAP_SP, + ASSET_TYPE_COM_MAP, ASSET_TYPE_DESTRUCTIBLE, ASSET_TYPE_SHOCK_FILE, ASSET_TYPE_PHYSCOLLMAP, diff --git a/libs/xassets/xcardmemory.cpp b/libs/xassets/xcardmemory.cpp index 5d61481..b468f82 100644 --- a/libs/xassets/xcardmemory.cpp +++ b/libs/xassets/xcardmemory.cpp @@ -2,7 +2,7 @@ XCardMemory::XCardMemory() : XAsset() - , mPlatform(0) + , mPlatform(2) { SetName("Card Memory"); } @@ -12,17 +12,18 @@ XCardMemory::~XCardMemory() } -qint32 XCardMemory::GetPlatform() const +QVector XCardMemory::GetPlatform() const { return mPlatform; } void XCardMemory::ParseData(XDataStream *aStream) { - mPlatform = aStream->ParseInt32(QString("%1 platform").arg(GetName())); + mPlatform[0] = aStream->ParseInt32(QString("%1 platform 1").arg(GetName())); + mPlatform[1] = aStream->ParseInt32(QString("%1 platform 2").arg(GetName())); } void XCardMemory::Clear() { - mPlatform = 0; + mPlatform.clear(); } diff --git a/libs/xassets/xcardmemory.h b/libs/xassets/xcardmemory.h index 451d8f9..2c2368d 100644 --- a/libs/xassets/xcardmemory.h +++ b/libs/xassets/xcardmemory.h @@ -9,13 +9,13 @@ public: explicit XCardMemory(); ~XCardMemory(); - qint32 GetPlatform() const; + QVector GetPlatform() const; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; private: - qint32 mPlatform; + QVector mPlatform; }; #endif // XCARDMEMORY_H diff --git a/libs/xassets/xcollisionpartition.cpp b/libs/xassets/xcollisionpartition.cpp index 8c12ece..ea2c37d 100644 --- a/libs/xassets/xcollisionpartition.cpp +++ b/libs/xassets/xcollisionpartition.cpp @@ -17,17 +17,15 @@ XCollisionPartition::~XCollisionPartition() void XCollisionPartition::ParseData(XDataStream *aStream) { if (GetPtr() == -1) { - *aStream - >> mTriCount - >> mBorderCount; + mTriCount = aStream->ParseUInt8(QString("%1 tri count").arg(GetName())); + mBorderCount = aStream->ParseUInt8(QString("%1 border count").arg(GetName())); aStream->skipRawData(2); - qint32 bordersPtr; - *aStream - >> mFirstTri - >> bordersPtr; + mFirstTri = aStream->ParseUInt32(QString("%1 first tri").arg(GetName())); + qint32 bordersPtr; + bordersPtr = aStream->ParseUInt32(QString("%1 first tri").arg(GetName())); if (bordersPtr == -1) { for (int i = 0; i < mBorderCount; i++) diff --git a/libs/xassets/xcollisionpartition.h b/libs/xassets/xcollisionpartition.h index 6da08af..4a5252d 100644 --- a/libs/xassets/xcollisionpartition.h +++ b/libs/xassets/xcollisionpartition.h @@ -18,7 +18,7 @@ public: private: quint8 mTriCount; quint8 mBorderCount; - int mFirstTri; + qint32 mFirstTri; QVector mBorders; }; diff --git a/libs/xassets/xcommoninfo.cpp b/libs/xassets/xcommoninfo.cpp new file mode 100644 index 0000000..c061005 --- /dev/null +++ b/libs/xassets/xcommoninfo.cpp @@ -0,0 +1,44 @@ +#include "xcommoninfo.h" + +XCommonInfo::XCommonInfo() {} + +XCommonInfo::XCommonInfo(const XGame &aGame, const XPlatform &aPlatform) + : mGame(aGame) + , mPlatform(aPlatform) {} + +XGame XCommonInfo::GetGame() const +{ + return mGame; +} + +QString XCommonInfo::GetGameString() const +{ + if (mGame == GAME_NONE) return "UNKNOWN"; + else if (mGame == GAME_COD7_5) return "COD7.5"; + return QString("COD%1").arg(mGame); +} + +void XCommonInfo::SetGame(XGame newGame) +{ + mGame = newGame; +} + +XPlatform XCommonInfo::GetPlatform() const +{ + return mPlatform; +} + +QString XCommonInfo::GetPlatformString() const +{ + if (mPlatform == PLATFORM_XBOX) return "Xbox"; + else if (mPlatform == PLATFORM_PS3) return "PS3"; + else if (mPlatform == PLATFORM_PC) return "PC"; + else if (mPlatform == PLATFORM_WII) return "Wii"; + else if (mPlatform == PLATFORM_WIIU) return "Wii U"; + return "UNKNOWN"; +} + +void XCommonInfo::SetPlatform(XPlatform newPlatform) +{ + mPlatform = newPlatform; +} diff --git a/libs/xassets/xcommoninfo.h b/libs/xassets/xcommoninfo.h new file mode 100644 index 0000000..fc1ea9e --- /dev/null +++ b/libs/xassets/xcommoninfo.h @@ -0,0 +1,26 @@ +#ifndef XCOMMONINFO_H +#define XCOMMONINFO_H + +#include "xgame.h" +#include "xplatform.h" + +class XCommonInfo +{ +public: + XCommonInfo(); + XCommonInfo(const XGame& aGame, const XPlatform& aPlatform); + + XGame GetGame() const; + QString GetGameString() const; + void SetGame(XGame newGame); + + XPlatform GetPlatform() const; + QString GetPlatformString() const; + void SetPlatform(XPlatform newPlatform); + +private: + XGame mGame; + XPlatform mPlatform; +}; + +#endif // XCOMMONINFO_H diff --git a/libs/xassets/xcomworld.cpp b/libs/xassets/xcomworld.cpp index 6a05fbc..107192c 100644 --- a/libs/xassets/xcomworld.cpp +++ b/libs/xassets/xcomworld.cpp @@ -31,15 +31,17 @@ void XComWorld::ParseData(XDataStream *aStream) { mName->ParsePtr(aStream, false); - quint32 primaryLightPtr; - *aStream - >> mInUse - >> mPrimaryLightCount - >> primaryLightPtr; + mInUse = aStream->ParseUInt8(QString("%1 in use").arg(GetName())); + aStream->skipRawData(3); + + mPrimaryLightCount = aStream->ParseUInt32(QString("%1 primary light count").arg(GetName())); + + quint32 primaryLightsPtr; + primaryLightsPtr = aStream->ParseUInt32(QString("%1 primary lights ptr").arg(GetName())); mName->ParseData(aStream); - if (primaryLightPtr) + if (primaryLightsPtr) { if (mPrimaryLights != nullptr) { diff --git a/libs/xassets/xcstaticmodelwritable.cpp b/libs/xassets/xcstaticmodelwritable.cpp index dbaf6b3..e7164ca 100644 --- a/libs/xassets/xcstaticmodelwritable.cpp +++ b/libs/xassets/xcstaticmodelwritable.cpp @@ -7,15 +7,8 @@ XCStaticModelWritable::XCStaticModelWritable() SetName("C Static Model Writable"); } -XCStaticModelWritable::~XCStaticModelWritable() -{ - -} - void XCStaticModelWritable::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) { - *aStream >> mNextModelInWorldSector; - } + mNextModelInWorldSector = aStream->ParseUInt32(QString("%1 next model in world sector").arg(GetName())); } quint32 XCStaticModelWritable::GetNextModelInWorldSector() const { diff --git a/libs/xassets/xcstaticmodelwritable.h b/libs/xassets/xcstaticmodelwritable.h index 3deb4d2..856c7ef 100644 --- a/libs/xassets/xcstaticmodelwritable.h +++ b/libs/xassets/xcstaticmodelwritable.h @@ -7,7 +7,6 @@ class XCStaticModelWritable : public XAsset { public: explicit XCStaticModelWritable(); - ~XCStaticModelWritable(); void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xd3dindexbuffer.cpp b/libs/xassets/xd3dindexbuffer.cpp index 4878284..5b4fd64 100644 --- a/libs/xassets/xd3dindexbuffer.cpp +++ b/libs/xassets/xd3dindexbuffer.cpp @@ -12,18 +12,8 @@ void XD3DIndexBuffer::ParseData(XDataStream *aStream) { XD3DResource::ParseData(aStream); - *aStream >> mAddress; - if (IsDebug()) - { - qDebug() << QString("[%1] mAddress = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mAddress); - } - - - *aStream >> mSize; - if (IsDebug()) - { - qDebug() << QString("[%1] mSize = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mSize); - } + mAddress = aStream->ParseUInt32(QString("%1 address").arg(GetName())); + mSize = aStream->ParseUInt32(QString("%1 size").arg(GetName())); } void XD3DIndexBuffer::Clear() diff --git a/libs/xassets/xd3dresource.cpp b/libs/xassets/xd3dresource.cpp index 93c5a2f..e8f0f69 100644 --- a/libs/xassets/xd3dresource.cpp +++ b/libs/xassets/xd3dresource.cpp @@ -19,41 +19,12 @@ XD3DResource::~XD3DResource() void XD3DResource::ParseData(XDataStream *aStream) { - *aStream >> mCommon; - if (IsDebug()) - { - qDebug() << QString("[%1] mCommon = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mCommon); - } - - *aStream >> mReferenceCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mReferenceCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mReferenceCount); - } - - *aStream >> mFence; - if (IsDebug()) - { - qDebug() << QString("[%1] mFence = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mFence); - } - - *aStream >> mReadFence; - if (IsDebug()) - { - qDebug() << QString("[%1] mReadFence = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mReadFence); - } - - *aStream >> mIdentifier; - if (IsDebug()) - { - qDebug() << QString("[%1] mIdentifier = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mIdentifier); - } - - *aStream >> mBaseFlush; - if (IsDebug()) - { - qDebug() << QString("[%1] mBaseFlush = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mBaseFlush); - } + mCommon = aStream->ParseUInt32(QString("%1 common").arg(GetName())); + mReferenceCount = aStream->ParseUInt32(QString("%1 reference count").arg(GetName())); + mFence = aStream->ParseUInt32(QString("%1 fence").arg(GetName())); + mReadFence = aStream->ParseUInt32(QString("%1 read fence").arg(GetName())); + mIdentifier = aStream->ParseUInt32(QString("%1 identifier").arg(GetName())); + mBaseFlush = aStream->ParseUInt32(QString("%1 base flush").arg(GetName())); } void XD3DResource::Clear() diff --git a/libs/xassets/xdmaterial.cpp b/libs/xassets/xdmaterial.cpp index df5c66f..fbaba14 100644 --- a/libs/xassets/xdmaterial.cpp +++ b/libs/xassets/xdmaterial.cpp @@ -16,9 +16,8 @@ void XDMaterial::ParseData(XDataStream *aStream) { if (GetPtr() == -1) { mMaterial = XString::ParseCustom(aStream); - *aStream - >> mSurfaceFlags - >> mContentFlags; + mSurfaceFlags = aStream->ParseInt32(QString("%1 surface flags").arg(GetName())); + mContentFlags = aStream->ParseInt32(QString("%1 content flags").arg(GetName())); } } diff --git a/libs/xassets/xdmaterial.h b/libs/xassets/xdmaterial.h index f14aae4..6247018 100644 --- a/libs/xassets/xdmaterial.h +++ b/libs/xassets/xdmaterial.h @@ -23,8 +23,8 @@ public: private: QString mMaterial = ""; - int mSurfaceFlags = 0; - int mContentFlags = 0; + qint32 mSurfaceFlags = 0; + qint32 mContentFlags = 0; }; #endif // XDMATERIAL_H diff --git a/libs/xassets/xdobjanimmat.cpp b/libs/xassets/xdobjanimmat.cpp index 3beb3ff..93c1b9a 100644 --- a/libs/xassets/xdobjanimmat.cpp +++ b/libs/xassets/xdobjanimmat.cpp @@ -20,21 +20,15 @@ void XDObjAnimMat::ParseData(XDataStream *aStream) { for (int i = 0; i < 4; i++) { - quint32 rawQuat; - *aStream >> rawQuat; - memcpy(&mQuat[i], &rawQuat, sizeof(mQuat[i])); + mQuat.push_back(aStream->ParseSingle(QString("%1 quat %2").arg(GetName()).arg(i))); } for (int i = 0; i < 3; i++) { - quint32 rawTrans; - *aStream >> rawTrans; - memcpy(&mTrans[i], &rawTrans, sizeof(mTrans[i])); + mTrans.push_back(aStream->ParseSingle(QString("%1 trans %2").arg(GetName()).arg(i))); } - quint32 rawTransWeight; - *aStream >> rawTransWeight; - memcpy(&mTransWeight, &rawTransWeight, sizeof(mTransWeight)); + mTransWeight = aStream->ParseSingle(QString("%1 trans weight").arg(GetName())); } } diff --git a/libs/xassets/xdynentityclient.cpp b/libs/xassets/xdynentityclient.cpp index fad77ef..99e4156 100644 --- a/libs/xassets/xdynentityclient.cpp +++ b/libs/xassets/xdynentityclient.cpp @@ -19,11 +19,10 @@ void XDynEntityClient::ParseData(XDataStream *aStream) { if (GetPtr()) { - *aStream - >> mPhysObjId - >> mFlags - >> mLightingHandle - >> mHealth; + mPhysObjId = aStream->ParseInt32(QString("%1 phys obj id").arg(GetName())); + mFlags = aStream->ParseUInt32(QString("%1 flags").arg(GetName())); + mLightingHandle = aStream->ParseUInt32(QString("%1 lighting handle").arg(GetName())); + mHealth = aStream->ParseInt32(QString("%1 health").arg(GetName())); } } diff --git a/libs/xassets/xdynentityclient.h b/libs/xassets/xdynentityclient.h index baf54e4..5adf79c 100644 --- a/libs/xassets/xdynentityclient.h +++ b/libs/xassets/xdynentityclient.h @@ -13,10 +13,10 @@ public: void Clear() override; private: - int mPhysObjId; + qint32 mPhysObjId; quint32 mFlags; quint32 mLightingHandle; - int mHealth; + qint32 mHealth; }; #endif // XDYNENTITYCLIENT_H diff --git a/libs/xassets/xdynentitycoll.cpp b/libs/xassets/xdynentitycoll.cpp index c50bbcd..d6c9001 100644 --- a/libs/xassets/xdynentitycoll.cpp +++ b/libs/xassets/xdynentitycoll.cpp @@ -17,16 +17,14 @@ XDynEntityColl::~XDynEntityColl() void XDynEntityColl::ParseData(XDataStream *aStream) { - if (GetPtr()) { - *aStream - >> mSector - >> mNextEntInSector - >> mLinkMins[0] - >> mLinkMins[1] - >> mLinkMaxs[0] - >> mLinkMaxs[1]; + mSector = aStream->ParseUInt32(QString("%1 sector").arg(GetName())); + mNextEntInSector = aStream->ParseUInt32(QString("%1 next ent in sector").arg(GetName())); + mLinkMins[0] = aStream->ParseSingle(QString("%1 link min 1").arg(GetName())); + mLinkMins[1] = aStream->ParseSingle(QString("%1 link min 2").arg(GetName())); + mLinkMaxs[0] = aStream->ParseSingle(QString("%1 link max 1").arg(GetName())); + mLinkMaxs[1] = aStream->ParseSingle(QString("%1 link max 2").arg(GetName())); } } diff --git a/libs/xassets/xdynentitydef.cpp b/libs/xassets/xdynentitydef.cpp index 3431ac4..655d6f6 100644 --- a/libs/xassets/xdynentitydef.cpp +++ b/libs/xassets/xdynentitydef.cpp @@ -31,19 +31,18 @@ void XDynEntityDef::ParseData(XDataStream *aStream) mPose.ParseData(aStream); mModel.ParsePtr(aStream, false); - *aStream - >> mBrushModel - >> mPhysicsBrushModel; + mBrushModel = aStream->ParseUInt32(QString("%1 brush model").arg(GetName())); + mPhysicsBrushModel = aStream->ParseUInt32(QString("%1 physics brush model").arg(GetName())); mDestroyFx.ParsePtr(aStream, false); mDestroyPieces.ParsePtr(aStream, false); mPhysPreset.ParsePtr(aStream, false); - *aStream >> mHealth; + mHealth = aStream->ParseUInt32(QString("%1 health").arg(GetName())); mMass.ParseData(aStream); - *aStream >> mContents; + mContents = aStream->ParseUInt32(QString("%1 contents").arg(GetName())); mModel.ParseData(aStream); mDestroyFx.ParseData(aStream); diff --git a/libs/xassets/xdynentitydef.h b/libs/xassets/xdynentitydef.h index bcaf2a2..a782386 100644 --- a/libs/xassets/xdynentitydef.h +++ b/libs/xassets/xdynentitydef.h @@ -33,9 +33,9 @@ private: XFxEffectDef mDestroyFx; XModelPieces mDestroyPieces; XPhysPreset mPhysPreset; - int mHealth; + qint32 mHealth; XPhysMass mMass; - int mContents; + qint32 mContents; }; #endif // XDYNENTITYDEF_H diff --git a/libs/xassets/xdynentitypose.cpp b/libs/xassets/xdynentitypose.cpp index af980cf..d04dcfc 100644 --- a/libs/xassets/xdynentitypose.cpp +++ b/libs/xassets/xdynentitypose.cpp @@ -19,7 +19,7 @@ void XDynEntityPose::ParseData(XDataStream *aStream) { mPose.ParseData(aStream); - *aStream >> mRadius; + mRadius = aStream->ParseSingle(QString("%1 radius").arg(GetName())); } } diff --git a/libs/xassets/xeffectdef.cpp b/libs/xassets/xeffectdef.cpp index 5069eda..8767412 100644 --- a/libs/xassets/xeffectdef.cpp +++ b/libs/xassets/xeffectdef.cpp @@ -21,7 +21,7 @@ XEffectDef::~XEffectDef() void XEffectDef::Clear() { - mName.clear(); + mName.Clear(); mFlags = 0; mTotalSize = 0; mMsecLoopingLife = 0; @@ -33,7 +33,24 @@ void XEffectDef::Clear() void XEffectDef::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mName.ParsePtr(aStream, false); - // TODO: Fill in XEffectDef::ParseData + mFlags = aStream->ParseInt32(QString("%1 flags").arg(GetName())); + mTotalSize = aStream->ParseInt32(QString("%1 total size").arg(GetName())); + mMsecLoopingLife = aStream->ParseInt32(QString("%1 looping life (ms)").arg(GetName())); + mElemDefCountLooping = aStream->ParseInt32(QString("%1 looping count").arg(GetName())); + mElemDefCountOneShot = aStream->ParseInt32(QString("%1 one shot count").arg(GetName())); + mElemDefCountEmission = aStream->ParseInt32(QString("%1 emission count").arg(GetName())); + + qint32 elemDefsPtr = aStream->ParseInt32(QString("%1 element def ptr").arg(GetName())); + if (elemDefsPtr) + { + int elemCount = mElemDefCountLooping + mElemDefCountOneShot + mElemDefCountEmission; + for (int i = 0; i < elemCount; i++) + { + XFxElemDef newElemDef; + newElemDef.ParseData(aStream); + mElemDefs.push_back(newElemDef); + } + } } diff --git a/libs/xassets/xeffectdef.h b/libs/xassets/xeffectdef.h index ef2b5fa..184c7bc 100644 --- a/libs/xassets/xeffectdef.h +++ b/libs/xassets/xeffectdef.h @@ -16,14 +16,14 @@ public: void ParseData(XDataStream *aStream) override; private: - QString mName; + XString mName; - int mFlags; - int mTotalSize; - int mMsecLoopingLife; - int mElemDefCountLooping; - int mElemDefCountOneShot; - int mElemDefCountEmission; + qint32 mFlags; + qint32 mTotalSize; + qint32 mMsecLoopingLife; + qint32 mElemDefCountLooping; + qint32 mElemDefCountOneShot; + qint32 mElemDefCountEmission; QVector mElemDefs; }; diff --git a/libs/xassets/xeffectdefref.cpp b/libs/xassets/xeffectdefref.cpp index b69ba58..722bf2c 100644 --- a/libs/xassets/xeffectdefref.cpp +++ b/libs/xassets/xeffectdefref.cpp @@ -16,14 +16,17 @@ XEffectDefRef::~XEffectDefRef() void XEffectDefRef::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XEffectDefRef::ParseData + mName.ParsePtr(aStream); + if (mName.GetPtr() && mName.GetPtr() != -1) + { + qDebug() << "DB_FindXAssetHeader(0x1A, " << mName.GetPtr() << ", v1)"; + // TODO: Find asset/asset header + // Shouldn't affect parsing + } } void XEffectDefRef::Clear() { - delete mHandle; - mHandle = new XEffectDef(); + mHandle->Clear(); mName.Clear(); } diff --git a/libs/xassets/xentryinternaldata.cpp b/libs/xassets/xentryinternaldata.cpp index 4e07974..26e3e2d 100644 --- a/libs/xassets/xentryinternaldata.cpp +++ b/libs/xassets/xentryinternaldata.cpp @@ -10,9 +10,7 @@ XEntryInternalData::XEntryInternalData() void XEntryInternalData::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XEntryInternalData::ParseData + mOperand.ParseData(aStream); } void XEntryInternalData::Clear() diff --git a/libs/xassets/xexpressionentry.cpp b/libs/xassets/xexpressionentry.cpp index 901f9e0..c26fcb2 100644 --- a/libs/xassets/xexpressionentry.cpp +++ b/libs/xassets/xexpressionentry.cpp @@ -10,9 +10,8 @@ XExpressionEntry::XExpressionEntry() void XExpressionEntry::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XExpressionEntry::ParseData + mType = aStream->ParseInt32(QString("%1 type").arg(GetName())); + mData.ParseData(aStream); } void XExpressionEntry::Clear() diff --git a/libs/xassets/xexpressionentry.h b/libs/xassets/xexpressionentry.h index 14a2ad2..092dd56 100644 --- a/libs/xassets/xexpressionentry.h +++ b/libs/xassets/xexpressionentry.h @@ -14,7 +14,7 @@ public: void Clear() override; private: - int mType; + qint32 mType; XEntryInternalData mData; }; diff --git a/libs/xassets/xfile.cpp b/libs/xassets/xfile.cpp index 7fe6437..bb14c0c 100644 --- a/libs/xassets/xfile.cpp +++ b/libs/xassets/xfile.cpp @@ -1,4 +1,5 @@ #include "xfile.h" +#include "xcommoninfo.h" #include @@ -10,13 +11,19 @@ XFile::XFile() void XFile::ParseData(XDataStream *aStream) { - quint32 contentLength; - *aStream - >> contentLength; - contentLength += 44; + quint32 contentLength = aStream->ParseUInt32(QString("%1 content length").arg(GetName())); + if (GetCommonInfo()->GetGame() == GAME_COD5) + { + contentLength += 36; + aStream->skipRawData(8 * 4); + } + else + { + contentLength += 44; + aStream->skipRawData(10 * 4); + } qDebug() << "Content size: " << contentLength; - aStream->skipRawData(8 * 4); } void XFile::Clear() diff --git a/libs/xassets/xfont.cpp b/libs/xassets/xfont.cpp index c166027..5491e46 100644 --- a/libs/xassets/xfont.cpp +++ b/libs/xassets/xfont.cpp @@ -44,9 +44,10 @@ void XFont::ParseData(XDataStream *aStream) *aStream >> glyphsPtr; - mFontName.ParseData(aStream); - mMaterial.ParseData(aStream); - mGlowMaterial.ParseData(aStream); + mFontName.ParseDataSafe(aStream); + SetDisplayName(mFontName.GetString()); + mMaterial.ParseDataSafe(aStream); + mGlowMaterial.ParseDataSafe(aStream); if (glyphsPtr == -1) { diff --git a/libs/xassets/xfxeffectdef.cpp b/libs/xassets/xfxeffectdef.cpp index d62ba8d..a3ed736 100644 --- a/libs/xassets/xfxeffectdef.cpp +++ b/libs/xassets/xfxeffectdef.cpp @@ -38,7 +38,7 @@ void XFxEffectDef::ParseData(XDataStream *aStream) mElemDefCountEmission = aStream->ParseInt32(QString("%1 elem def count emission").arg(GetName())); elemDefsPtr = aStream->ParseInt32(QString("%1 elem defs ptr").arg(GetName())); - mName.ParseData(aStream); + mName.ParseDataSafe(aStream); if (elemDefsPtr) { diff --git a/libs/xassets/xfxelematlas.cpp b/libs/xassets/xfxelematlas.cpp index 759d1d2..0709654 100644 --- a/libs/xassets/xfxelematlas.cpp +++ b/libs/xassets/xfxelematlas.cpp @@ -26,7 +26,11 @@ void XFxElemAtlas::Clear() void XFxElemAtlas::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XFxElemAtlas::ParseData + mBehavior = aStream->ParseUInt8(QString("%1 behavior").arg(GetName())); + mIndex = aStream->ParseUInt8(QString("%1 index").arg(GetName())); + mFps = aStream->ParseUInt8(QString("%1 fps").arg(GetName())); + mLoopCount = aStream->ParseUInt8(QString("%1 loop count").arg(GetName())); + mColIndexBits = aStream->ParseUInt8(QString("%1 column index bits").arg(GetName())); + mRowIndexBits = aStream->ParseUInt8(QString("%1 row index bits").arg(GetName())); + mEntryCount = aStream->ParseInt16(QString("%1 entry count").arg(GetName())); } diff --git a/libs/xassets/xfxelemdef.cpp b/libs/xassets/xfxelemdef.cpp index 0cef2bb..9daff7f 100644 --- a/libs/xassets/xfxelemdef.cpp +++ b/libs/xassets/xfxelemdef.cpp @@ -23,9 +23,7 @@ XFxElemDef::XFxElemDef() , mVisualCount(0) , mVelIntervalCount(0) , mVisStateIntervalCount(0) - , mVelSamplesPtr(0) , mVelSamples() - , mVisSamplesPtr(0) , mVisSamples() , mVisuals() , mCollMins() @@ -71,9 +69,7 @@ void XFxElemDef::Clear() mVisualCount = 0; mVelIntervalCount = 0; mVisStateIntervalCount = 0; - mVelSamplesPtr = 0; mVelSamples.clear(); - mVisSamplesPtr = 0; mVisSamples.clear(); mVisuals.Clear(); mCollMins = QVector3D(); @@ -137,14 +133,14 @@ void XFxElemDef::ParseData(XDataStream *aStream) mCollMaxs.setY(aStream->ParseSingle(QString("%1 coll maxs y").arg(GetName()))); mCollMaxs.setZ(aStream->ParseSingle(QString("%1 coll maxs z").arg(GetName()))); - mEffectOnImpact.ParseData(aStream); - mEffectOnDeath.ParseData(aStream); - mEffectEmitted.ParseData(aStream); + mEffectOnImpact.ParsePtr(aStream, false); + mEffectOnDeath.ParsePtr(aStream, false); + mEffectEmitted.ParsePtr(aStream, false); mEmitDist.ParseData(aStream); mEmitDistVariance.ParseData(aStream); - qint32 trailDefPtr; - trailDefPtr = aStream->ParseInt32(QString("%1 trail def ptr").arg(GetName())); + mTrailDef.ParsePtr(aStream, false); + mSortOrder = aStream->ParseUInt8(QString("%1 sort order").arg(GetName())); mLightingFrac = aStream->ParseUInt8(QString("%1 lighting frac").arg(GetName())); mUseItemClip = aStream->ParseUInt8(QString("%1 use item clip").arg(GetName())); @@ -171,5 +167,9 @@ void XFxElemDef::ParseData(XDataStream *aStream) } } - // TODO: Finish this ugh + mVisuals.ParseData(aStream); + mEffectOnImpact.ParseData(aStream); + mEffectOnDeath.ParseData(aStream); + mEffectEmitted.ParseData(aStream); + mTrailDef.ParseData(aStream); } diff --git a/libs/xassets/xfxelemdef.h b/libs/xassets/xfxelemdef.h index 362f914..6193c58 100644 --- a/libs/xassets/xfxelemdef.h +++ b/libs/xassets/xfxelemdef.h @@ -22,7 +22,7 @@ public: void ParseData(XDataStream *aStream) override; private: - int mFlags; + qint32 mFlags; XFxSpawnDef mSpawn; XFxFloatRange mSpawnRange; XFxFloatRange mFadeInRange; @@ -43,9 +43,7 @@ private: quint8 mVisualCount; quint8 mVelIntervalCount; quint8 mVisStateIntervalCount; - qint32 mVelSamplesPtr; QVector mVelSamples; - qint32 mVisSamplesPtr; QVector mVisSamples; XFxElemDefVisuals mVisuals; QVector3D mCollMins; diff --git a/libs/xassets/xfxelemvec3range.cpp b/libs/xassets/xfxelemvec3range.cpp index f2cba42..9622e53 100644 --- a/libs/xassets/xfxelemvec3range.cpp +++ b/libs/xassets/xfxelemvec3range.cpp @@ -8,11 +8,6 @@ XFxElemVec3Range::XFxElemVec3Range() SetName("Element Vec3 Range"); } -XFxElemVec3Range::~XFxElemVec3Range() -{ - -} - void XFxElemVec3Range::Clear() { mBase = QVector3D(); @@ -21,11 +16,13 @@ void XFxElemVec3Range::Clear() void XFxElemVec3Range::ParseData(XDataStream *aStream) { - *aStream - >> mBase[0] - >> mBase[1] - >> mBase[2] - >> mAmplitude[0] - >> mAmplitude[1] - >> mAmplitude[2]; + for (int i = 0; i < 3; i++) + { + mBase[i] = aStream->ParseSingle(QString("%1 base %2").arg(GetName()).arg(i)); + } + + for (int i = 0; i < 3; i++) + { + mAmplitude[i] = aStream->ParseSingle(QString("%1 amplitude %2").arg(GetName()).arg(i)); + } } diff --git a/libs/xassets/xfxelemvec3range.h b/libs/xassets/xfxelemvec3range.h index ac59eaa..12cd6a9 100644 --- a/libs/xassets/xfxelemvec3range.h +++ b/libs/xassets/xfxelemvec3range.h @@ -9,7 +9,6 @@ class XFxElemVec3Range : public XAsset { public: explicit XFxElemVec3Range(); - ~XFxElemVec3Range(); void Clear() override; void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xfxelemvelstateinframe.cpp b/libs/xassets/xfxelemvelstateinframe.cpp index 1f22637..d0265bf 100644 --- a/libs/xassets/xfxelemvelstateinframe.cpp +++ b/libs/xassets/xfxelemvelstateinframe.cpp @@ -8,11 +8,6 @@ XFxElemVelStateInFrame::XFxElemVelStateInFrame() SetName("Element Vel State in Frame"); } -XFxElemVelStateInFrame::~XFxElemVelStateInFrame() -{ - -} - void XFxElemVelStateInFrame::Clear() { mVelocity.Clear(); diff --git a/libs/xassets/xfxelemvelstateinframe.h b/libs/xassets/xfxelemvelstateinframe.h index cbc9a65..3abb80f 100644 --- a/libs/xassets/xfxelemvelstateinframe.h +++ b/libs/xassets/xfxelemvelstateinframe.h @@ -8,7 +8,6 @@ class XFxElemVelStateInFrame : public XAsset { public: explicit XFxElemVelStateInFrame(); - ~XFxElemVelStateInFrame(); void Clear() override; void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xfxfloatrange.cpp b/libs/xassets/xfxfloatrange.cpp index 17055be..781d2c2 100644 --- a/libs/xassets/xfxfloatrange.cpp +++ b/libs/xassets/xfxfloatrange.cpp @@ -8,11 +8,6 @@ XFxFloatRange::XFxFloatRange() SetName("Float Range"); } -XFxFloatRange::~XFxFloatRange() -{ - -} - void XFxFloatRange::Clear() { mBase = 0; @@ -21,7 +16,6 @@ void XFxFloatRange::Clear() void XFxFloatRange::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XFxFloatRange::ParseData + mBase = aStream->ParseSingle(QString("%1 base").arg(GetName())); + mAmplitude = aStream->ParseSingle(QString("%1 base").arg(GetName())); } diff --git a/libs/xassets/xfxfloatrange.h b/libs/xassets/xfxfloatrange.h index 34c36f5..2883e7b 100644 --- a/libs/xassets/xfxfloatrange.h +++ b/libs/xassets/xfxfloatrange.h @@ -7,7 +7,6 @@ class XFxFloatRange : public XAsset { public: explicit XFxFloatRange(); - ~XFxFloatRange(); void Clear() override; void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xfximpactentry.cpp b/libs/xassets/xfximpactentry.cpp index 5e116ed..7319caf 100644 --- a/libs/xassets/xfximpactentry.cpp +++ b/libs/xassets/xfximpactentry.cpp @@ -2,30 +2,39 @@ XFxImpactEntry::XFxImpactEntry() : XAsset() - , mNonFleshPtrs() , mNonFlesh() - , mFleshPtrs() , mFlesh() { SetName("Impact Entry"); } -XFxImpactEntry::~XFxImpactEntry() -{ - -} - void XFxImpactEntry::Clear() { - mNonFleshPtrs.clear(); mNonFlesh.clear(); - mFleshPtrs.clear(); mFlesh.clear(); } void XFxImpactEntry::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + for (int i = 0; i < 29; i++) + { + XEffectDef newNonFlesh; + newNonFlesh.ParsePtr(aStream, false); + mNonFlesh.push_back(newNonFlesh); + } + for (int i = 0; i < 29; i++) + { + mNonFlesh[i].ParseDataSafe(aStream); + } - // TODO: Fill in XFxImpactEntry::ParseData + for (int i = 0; i < 4; i++) + { + XEffectDef newFlesh; + newFlesh.ParsePtr(aStream, false); + mFlesh.push_back(newFlesh); + } + for (int i = 0; i < mFlesh.size(); i++) + { + mFlesh[i].ParseDataSafe(aStream); + } } diff --git a/libs/xassets/xfximpactentry.h b/libs/xassets/xfximpactentry.h index 7cb2138..5546983 100644 --- a/libs/xassets/xfximpactentry.h +++ b/libs/xassets/xfximpactentry.h @@ -8,16 +8,13 @@ class XFxImpactEntry : public XAsset { public: explicit XFxImpactEntry(); - ~XFxImpactEntry(); + ~XFxImpactEntry() = default; void Clear() override; void ParseData(XDataStream *aStream) override; private: - QVector mNonFleshPtrs; QVector mNonFlesh; - - QVector mFleshPtrs; QVector mFlesh; }; diff --git a/libs/xassets/xfximpacttable.cpp b/libs/xassets/xfximpacttable.cpp index ec53b5b..2f40592 100644 --- a/libs/xassets/xfximpacttable.cpp +++ b/libs/xassets/xfximpacttable.cpp @@ -2,31 +2,33 @@ XFxImpactTable::XFxImpactTable() : XAsset() - , mNamePtr(0) - , mName("") - , mTablePtr(0) + , mName() , mTable() { SetType(ASSET_TYPE_IMPACT_FX); SetName("Impact Table"); } -XFxImpactTable::~XFxImpactTable() -{ - -} - void XFxImpactTable::Clear() { - mNamePtr = 0; - mName = ""; - mTablePtr = 0; - mTable = QVector(); + mName.Clear(); + mTable.clear(); } void XFxImpactTable::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mName.ParsePtr(aStream, false); + qint32 tablePtr = aStream->ParseInt32(QString("%1 impact table ptr").arg(GetName())); - // TODO: Fill in XFxImpactTable::ParseData + mName.ParseDataSafe(aStream); + SetDisplayName(mName.GetString()); + + if (tablePtr) + { + for (int i = 0; i < 12; i++) + { + XFxImpactEntry newImpactEntry; + newImpactEntry.ParseData(aStream); + } + } } diff --git a/libs/xassets/xfximpacttable.h b/libs/xassets/xfximpacttable.h index 12f1a05..4722cc0 100644 --- a/libs/xassets/xfximpacttable.h +++ b/libs/xassets/xfximpacttable.h @@ -8,15 +8,13 @@ class XFxImpactTable : public XAsset { public: explicit XFxImpactTable(); - ~XFxImpactTable(); + ~XFxImpactTable() = default; void Clear() override; void ParseData(XDataStream *aStream) override; private: - qint32 mNamePtr; - QString mName; - qint32 mTablePtr; + XString mName; QVector mTable; }; diff --git a/libs/xassets/xfxintrange.cpp b/libs/xassets/xfxintrange.cpp index 919ca44..6852e90 100644 --- a/libs/xassets/xfxintrange.cpp +++ b/libs/xassets/xfxintrange.cpp @@ -8,11 +8,6 @@ XFxIntRange::XFxIntRange() SetName("Int Range"); } -XFxIntRange::~XFxIntRange() -{ - -} - void XFxIntRange::Clear() { mBase = 0; @@ -21,7 +16,6 @@ void XFxIntRange::Clear() void XFxIntRange::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XFxIntRange::ParseData + mBase = aStream->ParseInt32(QString("%1 base").arg(GetName())); + mAmplitude = aStream->ParseInt32(QString("%1 amplitude").arg(GetName())); } diff --git a/libs/xassets/xfxintrange.h b/libs/xassets/xfxintrange.h index db3329f..05ffd41 100644 --- a/libs/xassets/xfxintrange.h +++ b/libs/xassets/xfxintrange.h @@ -7,14 +7,13 @@ class XFxIntRange : public XAsset { public: explicit XFxIntRange(); - ~XFxIntRange(); void Clear() override; void ParseData(XDataStream *aStream) override; private: - int mBase; - int mAmplitude; + qint32 mBase; + qint32 mAmplitude; }; #endif // XFXINTRANGE_H diff --git a/libs/xassets/xfxspawndef.cpp b/libs/xassets/xfxspawndef.cpp index c8b0123..3b13d66 100644 --- a/libs/xassets/xfxspawndef.cpp +++ b/libs/xassets/xfxspawndef.cpp @@ -21,7 +21,7 @@ void XFxSpawnDef::Clear() void XFxSpawnDef::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XFxSpawnDef::ParseData + // TODO: Determine when to parse one shot instead + // Shouldn't affect general asset parsing though + mLooping.ParseData(aStream); } diff --git a/libs/xassets/xfxspawndeflooping.cpp b/libs/xassets/xfxspawndeflooping.cpp index 4696f09..9c3b880 100644 --- a/libs/xassets/xfxspawndeflooping.cpp +++ b/libs/xassets/xfxspawndeflooping.cpp @@ -8,11 +8,6 @@ XFxSpawnDefLooping::XFxSpawnDefLooping() SetName("Spawn Definition Looping"); } -XFxSpawnDefLooping::~XFxSpawnDefLooping() -{ - -} - void XFxSpawnDefLooping::Clear() { mIntervalMsec = 0; @@ -21,7 +16,6 @@ void XFxSpawnDefLooping::Clear() void XFxSpawnDefLooping::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XFxSpawnDefLooping::ParseData + mIntervalMsec = aStream->ParseInt32(QString("%1 interval (ms)").arg(GetName())); + mCount = aStream->ParseInt32(QString("%1 count").arg(GetName())); } diff --git a/libs/xassets/xfxspawndeflooping.h b/libs/xassets/xfxspawndeflooping.h index 629baef..8d4092d 100644 --- a/libs/xassets/xfxspawndeflooping.h +++ b/libs/xassets/xfxspawndeflooping.h @@ -9,7 +9,6 @@ class XFxSpawnDefLooping : public XAsset { public: explicit XFxSpawnDefLooping(); - ~XFxSpawnDefLooping(); void Clear() override; void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xfxspawndefoneshot.cpp b/libs/xassets/xfxspawndefoneshot.cpp index 4fc4efa..1c991ea 100644 --- a/libs/xassets/xfxspawndefoneshot.cpp +++ b/libs/xassets/xfxspawndefoneshot.cpp @@ -7,11 +7,6 @@ XFxSpawnDefOneShot::XFxSpawnDefOneShot() SetName("Spawn Definition Oneshot"); } -XFxSpawnDefOneShot::~XFxSpawnDefOneShot() -{ - -} - void XFxSpawnDefOneShot::Clear() { mCount.Clear(); @@ -19,7 +14,5 @@ void XFxSpawnDefOneShot::Clear() void XFxSpawnDefOneShot::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XFxSpawnDefOneShot::ParseData + mCount.ParseData(aStream); } diff --git a/libs/xassets/xfxspawndefoneshot.h b/libs/xassets/xfxspawndefoneshot.h index 6189b5c..47d577b 100644 --- a/libs/xassets/xfxspawndefoneshot.h +++ b/libs/xassets/xfxspawndefoneshot.h @@ -8,7 +8,6 @@ class XFxSpawnDefOneShot : public XAsset { public: explicit XFxSpawnDefOneShot(); - ~XFxSpawnDefOneShot(); void Clear() override; void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xfxtraildef.cpp b/libs/xassets/xfxtraildef.cpp index 5d530f2..96830ec 100644 --- a/libs/xassets/xfxtraildef.cpp +++ b/libs/xassets/xfxtraildef.cpp @@ -13,11 +13,6 @@ XFxTrailDef::XFxTrailDef() SetName("Trail Definition"); } -XFxTrailDef::~XFxTrailDef() -{ - -} - void XFxTrailDef::Clear() { mScrollTimeMsec = 0; @@ -31,7 +26,32 @@ void XFxTrailDef::Clear() void XFxTrailDef::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mScrollTimeMsec = aStream->ParseInt32(QString("%1 scroll time (ms)").arg(GetName())); + mRepeatDist = aStream->ParseInt32(QString("%1 repeat dist").arg(GetName())); + mSplitDist = aStream->ParseInt32(QString("%1 split dist").arg(GetName())); + mVertCount = aStream->ParseInt32(QString("%1 vert count").arg(GetName())); - // TODO: Fill in XFxTrailDef::ParseData + qint32 vertsPtr = aStream->ParseInt32(QString("%1 verts ptr").arg(GetName())); + + mIndCount = aStream->ParseUInt32(QString("%1 sort order").arg(GetName())); + + qint32 indicesPtr = aStream->ParseInt32(QString("%1 indices ptr").arg(GetName())); + + if (vertsPtr) + { + for (int i = 0; i < mVertCount; i++) + { + XFxTrailVertex newVert; + newVert.ParseData(aStream); + mVerts.push_back(newVert); + } + } + + if (indicesPtr) + { + for (int i = 0; i < mIndCount; i++) + { + mIndices.push_back(aStream->ParseUInt16(QString("%1 index %2").arg(GetName()).arg(i))); + } + } } diff --git a/libs/xassets/xfxtraildef.h b/libs/xassets/xfxtraildef.h index d6dd868..16deefc 100644 --- a/libs/xassets/xfxtraildef.h +++ b/libs/xassets/xfxtraildef.h @@ -10,18 +10,17 @@ class XFxTrailDef : public XAsset { public: explicit XFxTrailDef(); - ~XFxTrailDef(); void Clear() override; void ParseData(XDataStream *aStream) override; private: - int mScrollTimeMsec; - int mRepeatDist; - int mSplitDist; - int mVertCount; + qint32 mScrollTimeMsec; + qint32 mRepeatDist; + qint32 mSplitDist; + qint32 mVertCount; QVector mVerts; - int mIndCount; + qint32 mIndCount; QVector mIndices; }; diff --git a/libs/xassets/xfxtrailvertex.cpp b/libs/xassets/xfxtrailvertex.cpp index e8fd3c1..cbd909f 100644 --- a/libs/xassets/xfxtrailvertex.cpp +++ b/libs/xassets/xfxtrailvertex.cpp @@ -6,12 +6,7 @@ XFxTrailVertex::XFxTrailVertex() , mNormal() , mTexCoord(0) { - SetName("Trail Vertex"); -} - -XFxTrailVertex::~XFxTrailVertex() -{ - + SetName("FX Trail Vertex"); } void XFxTrailVertex::Clear() @@ -23,7 +18,11 @@ void XFxTrailVertex::Clear() void XFxTrailVertex::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mPos.setX(aStream->ParseSingle(QString("%1 pos x").arg(GetName()))); + mPos.setX(aStream->ParseSingle(QString("%1 pos y").arg(GetName()))); - // TODO: Fill in XFxTrailVertex::ParseData + mNormal.setX(aStream->ParseSingle(QString("%1 normal x").arg(GetName()))); + mNormal.setX(aStream->ParseSingle(QString("%1 normal y").arg(GetName()))); + + mTexCoord = aStream->ParseSingle(QString("%1 tex coord").arg(GetName())); } diff --git a/libs/xassets/xfxtrailvertex.h b/libs/xassets/xfxtrailvertex.h index 4b2eb7a..34e265d 100644 --- a/libs/xassets/xfxtrailvertex.h +++ b/libs/xassets/xfxtrailvertex.h @@ -9,7 +9,6 @@ class XFxTrailVertex : public XAsset { public: explicit XFxTrailVertex(); - ~XFxTrailVertex(); void Clear() override; void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xgame.h b/libs/xassets/xgame.h index e879a61..4792b3e 100644 --- a/libs/xassets/xgame.h +++ b/libs/xassets/xgame.h @@ -1,17 +1,23 @@ #ifndef XGAME_H #define XGAME_H -enum XGame { - GAME_NONE = 0x00, // No game - GAME_COD1 = 0x01, // Call of Duty - GAME_COD2 = 0x02, // Call of Duty 2 - GAME_COD3 = 0x03, // Call of Duty 3 - GAME_COD4 = 0x04, // Modern Warware 1 - GAME_COD5 = 0x05, // World at War - GAME_COD6 = 0x06, // Modern Warfare 2 - GAME_COD7 = 0x07, // Black Ops 1 - GAME_COD8 = 0x08, // Modern Warfare 3 - GAME_COD9 = 0x09 // Black Ops 2 +enum XGame +{ + GAME_NONE = 0, // No game + GAME_COD1 = 1, // Call of Duty + GAME_COD2 = 2, // Call of Duty 2 + GAME_COD3 = 3, // Call of Duty 3 + GAME_COD4 = 4, // Modern Warware 1 + GAME_COD5 = 5, // World at War + GAME_COD6 = 6, // Modern Warfare 2 + GAME_COD7 = 7, // Black Ops 1 + GAME_COD7_5 = 75, // Future Warfare + GAME_COD8 = 8, // Modern Warfare 3 + GAME_COD9 = 9, // Black Ops 2 + GAME_COD10 = 10, // + GAME_COD11 = 11, // + GAME_COD12 = 12, // Black Ops 3 + GAME_COD21 = 21 // Black Ops 6/7 }; #endif // XGAME_H diff --git a/libs/xassets/xgfxcolor.cpp b/libs/xassets/xgfxcolor.cpp index 8bd1f5f..adcddbf 100644 --- a/libs/xassets/xgfxcolor.cpp +++ b/libs/xassets/xgfxcolor.cpp @@ -2,35 +2,16 @@ XGfxColor::XGfxColor() : XAsset() - , mArray(4) + , mArray() { SetName("GFX Color"); } void XGfxColor::ParseData(XDataStream *aStream) { - *aStream >> mArray[0]; - if (IsDebug()) + for (int i = 0; i < 4; i++) { - qDebug() << QString("[%1] mArray[0] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mArray[0]); - } - - *aStream >> mArray[1]; - if (IsDebug()) - { - qDebug() << QString("[%1] mArray[1] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mArray[1]); - } - - *aStream >> mArray[2]; - if (IsDebug()) - { - qDebug() << QString("[%1] mArray[2] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mArray[2]); - } - - *aStream >> mArray[3]; - if (IsDebug()) - { - qDebug() << QString("[%1] mArray[3] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mArray[3]); + mArray.push_back(aStream->ParseUInt8(QString("%1 array at %2").arg(GetName()).arg(i))); } } diff --git a/libs/xassets/xgfxdrawsurffields.cpp b/libs/xassets/xgfxdrawsurffields.cpp index 7da31aa..728b647 100644 --- a/libs/xassets/xgfxdrawsurffields.cpp +++ b/libs/xassets/xgfxdrawsurffields.cpp @@ -2,6 +2,7 @@ XGfxDrawSurfFields::XGfxDrawSurfFields() : XAsset() + , mRawData(0) , mObjectId(0) , mReflectionProbeIndex(0) , mCustomIndex(0) @@ -18,14 +19,9 @@ XGfxDrawSurfFields::XGfxDrawSurfFields() void XGfxDrawSurfFields::ParseData(XDataStream *aStream) { // Read the raw 64-bit value from the stream - quint64 raw; - *aStream >> raw; - if (IsDebug()) - { - qDebug() << QString("[%1] raw = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(raw); - } + mRawData = aStream->ParseUInt64(QString("%1 raw value").arg(GetName())); - // Decode bitfields from the 64-bit packed value + // TODO: Decode bitfields from the 64-bit packed value // mObjectId =- raw & 0xFFFF; // bits 0-15 // mReflectionProbeIndex = (raw >> 16) & 0xFF; // bits 16-23 // mCustomIndex = (raw >> 24) & 0x1F; // bits 24-28 diff --git a/libs/xassets/xgfxdrawsurffields.h b/libs/xassets/xgfxdrawsurffields.h index fe3b47f..b9c6240 100644 --- a/libs/xassets/xgfxdrawsurffields.h +++ b/libs/xassets/xgfxdrawsurffields.h @@ -12,6 +12,8 @@ public: virtual void Clear() override; private: + quint64 mRawData; + quint64 mObjectId; quint64 mReflectionProbeIndex; quint64 mCustomIndex; diff --git a/libs/xassets/xgfximage.cpp b/libs/xassets/xgfximage.cpp index 35fb6d8..b475646 100644 --- a/libs/xassets/xgfximage.cpp +++ b/libs/xassets/xgfximage.cpp @@ -4,7 +4,10 @@ XGfxImage::XGfxImage() : XAsset() , mMapType() , mTexture() + , mPicmip() + , mNoPicmip(false) , mSemantic(0) + , mTrack(0) , mCardMemory() , mWidth(0) , mHeight(0) @@ -21,11 +24,6 @@ XGfxImage::XGfxImage() SetName("GFX Image"); } -XGfxImage::~XGfxImage() -{ - -} - void XGfxImage::ParseData(XDataStream *aStream) { if (GetPtr() == -1) @@ -33,10 +31,12 @@ void XGfxImage::ParseData(XDataStream *aStream) mMapType = (XMapType)aStream->ParseUInt32(QString("%1 map type").arg(GetName())); mTexture.ParsePtr(aStream, false); + mPicmip.ParseData(aStream); mSemantic = aStream->ParseUInt8(QString("%1 semantic").arg(GetName())); + mTrack = aStream->ParseUInt8(QString("%1 track").arg(GetName())); - aStream->skipRawData(3); + aStream->skipRawData(4); mCardMemory.ParseData(aStream); @@ -47,23 +47,32 @@ void XGfxImage::ParseData(XDataStream *aStream) mDepth = aStream->ParseUInt16(QString("%1 depth").arg(GetName())); mCategory = aStream->ParseUInt8(QString("%1 category").arg(GetName())); mDelayLoadPixels = aStream->ParseUInt8(QString("%1 delay load pixels").arg(GetName())); - pixelsPtr = aStream->ParseInt32(QString("%1 pixels ptr").arg(GetName())); - mBaseSize = aStream->ParseUInt32(QString("%1 base size").arg(GetName())); - mStreamSlot = aStream->ParseUInt16(QString("%1 stream slot").arg(GetName())); - mStreaming = aStream->ParseUInt8(QString("%1 streaming").arg(GetName())); - aStream->skipRawData(1); + if (GetCommonInfo()->GetGame() == GAME_COD4) + { + pixelsPtr = 0; + } + else + { + pixelsPtr = aStream->ParseInt32(QString("%1 pixels ptr").arg(GetName())); + mBaseSize = aStream->ParseUInt32(QString("%1 base size").arg(GetName())); + mStreamSlot = aStream->ParseUInt16(QString("%1 stream slot").arg(GetName())); + mStreaming = aStream->ParseUInt8(QString("%1 streaming").arg(GetName())); + + aStream->skipRawData(1); + } mName.ParsePtr(aStream); + SetDisplayName(mName.GetString()); //int variableSkip = mDelayLoadPixels ? 2 : 5; //aStream->skipRawData(variableSkip); - if (pixelsPtr == -1) - { - mPixels.resize(mCardMemory.GetPlatform()); - aStream->readRawData(mPixels.data(), mCardMemory.GetPlatform()); - } + //if (pixelsPtr == -1) + //{ + //mPixels.resize(mCardMemory.GetPlatform()); + //aStream->readRawData(mPixels.data(), mCardMemory.GetPlatform()); + //} mTexture.ParseData(aStream); } diff --git a/libs/xassets/xgfximage.h b/libs/xassets/xgfximage.h index 3477c89..c6b0483 100644 --- a/libs/xassets/xgfximage.h +++ b/libs/xassets/xgfximage.h @@ -4,7 +4,9 @@ #include "xasset.h" #include "xcardmemory.h" #include "xgfxtexture.h" +#include "xgfximageloaddef.h" #include "xmaptype.h" +#include "xpicmip.h" #include "xstring.h" #include @@ -14,7 +16,6 @@ class XGfxImage : public XAsset { public: explicit XGfxImage(); - ~XGfxImage(); virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; @@ -22,7 +23,10 @@ public: private: XMapType mMapType; XGfxTexture mTexture; + XPicmip mPicmip; + bool mNoPicmip; quint8 mSemantic; + quint8 mTrack; XCardMemory mCardMemory; quint16 mWidth; quint16 mHeight; diff --git a/libs/xassets/xgfximageloaddef.cpp b/libs/xassets/xgfximageloaddef.cpp index b3f8605..507a2b3 100644 --- a/libs/xassets/xgfximageloaddef.cpp +++ b/libs/xassets/xgfximageloaddef.cpp @@ -18,11 +18,12 @@ XGfxImageLoadDef::~XGfxImageLoadDef() void XGfxImageLoadDef::ParseData(XDataStream *aStream) { - *aStream - >> mLevelCount - >> mFlags - >> mDimensions - >> mFormat; + mLevelCount = aStream->ParseUInt8(QString("%1 level count").arg(GetName())); + mFlags = aStream->ParseUInt8(QString("%1 flags").arg(GetName())); + mDimensions[0] = aStream->ParseUInt16(QString("%1 dimension 1").arg(GetName())); + mDimensions[1] = aStream->ParseUInt16(QString("%1 dimension 2").arg(GetName())); + mDimensions[2] = aStream->ParseUInt16(QString("%1 dimension 3").arg(GetName())); + mFormat = aStream->ParseUInt32(QString("%1 format").arg(GetName())); mTexture.ParsePtr(aStream); } diff --git a/libs/xassets/xgfxlightdef.cpp b/libs/xassets/xgfxlightdef.cpp index 96abc30..cfd3860 100644 --- a/libs/xassets/xgfxlightdef.cpp +++ b/libs/xassets/xgfxlightdef.cpp @@ -26,8 +26,9 @@ void XGfxLightDef::ParseData(XDataStream *aStream) { mName.ParsePtr(aStream, false); mAttenuation.ParseData(aStream); - *aStream >> mLmapLookupStart; + mLmapLookupStart = aStream->ParseUInt32(QString("%1 lmap lookup start").arg(GetName())); - mName.ParseData(aStream); + mName.ParseDataSafe(aStream); + SetDisplayName(mName.GetString()); mAttenuation.ParseData(aStream); } diff --git a/libs/xassets/xgfxlightdef.h b/libs/xassets/xgfxlightdef.h index e81411d..2d1f941 100644 --- a/libs/xassets/xgfxlightdef.h +++ b/libs/xassets/xgfxlightdef.h @@ -17,7 +17,7 @@ public: private: XString mName; XGfxLightImage mAttenuation; - int mLmapLookupStart; + qint32 mLmapLookupStart; }; #endif // XGFXLIGHTDEF_H diff --git a/libs/xassets/xgfxpackedvertex.cpp b/libs/xassets/xgfxpackedvertex.cpp index 9a89f13..88d3189 100644 --- a/libs/xassets/xgfxpackedvertex.cpp +++ b/libs/xassets/xgfxpackedvertex.cpp @@ -16,23 +16,11 @@ void XGfxPackedVertex::ParseData(XDataStream *aStream) { if (GetPtr() == -1) { - - quint32 rawCoord; for (int i = 0; i < 3; i++) { - *aStream >> rawCoord; - memcpy(&mXYZ[i], &rawCoord, sizeof(mXYZ[i])); - if (IsDebug()) - { - qDebug() << QString("[%1] mXYZ[%2] = %3").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(i).arg(mXYZ[0]); - } - } - - *aStream >> mBinormalSign; - if (IsDebug()) - { - qDebug() << QString("[%1] mBinormalSign = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mBinormalSign); + mXYZ[i] = aStream->ParseSingle(QString("%1 xyz %2").arg(GetName()).arg(i)); } + mBinormalSign = aStream->ParseSingle(QString("%1 terrain contents").arg(GetName())); mColor.ParseData(aStream); mTexCoord.ParseData(aStream); @@ -43,5 +31,10 @@ void XGfxPackedVertex::ParseData(XDataStream *aStream) void XGfxPackedVertex::Clear() { - + mXYZ = QVector3D(); + mBinormalSign = 0; + mColor.Clear(); + mTexCoord.Clear(); + mNormal.Clear(); + mTangent.Clear(); } diff --git a/libs/xassets/xgfxpixelshaderloaddef.cpp b/libs/xassets/xgfxpixelshaderloaddef.cpp index f066944..a1f8445 100644 --- a/libs/xassets/xgfxpixelshaderloaddef.cpp +++ b/libs/xassets/xgfxpixelshaderloaddef.cpp @@ -2,10 +2,9 @@ XGfxPixelShaderLoadDef::XGfxPixelShaderLoadDef() : XAsset() - , mCachedPart() - , mPhysicalPart() - , mCachedPartSize(0) - , mPhysicalPartSize(0) + , mProgramSize(0) + , mLoadForRenderer(0) + , mProgram() { SetName("GFX Pixel Shader Load Definition"); } @@ -15,39 +14,63 @@ XGfxPixelShaderLoadDef::~XGfxPixelShaderLoadDef() } -quint16 XGfxPixelShaderLoadDef::GetPhysicalPartSize() const -{ - return mPhysicalPartSize; -} - -quint16 XGfxPixelShaderLoadDef::GetCachedPartSize() const -{ - return mCachedPartSize; -} - void XGfxPixelShaderLoadDef::Clear() { - mCachedPart.clear(); - mPhysicalPart.clear(); - mCachedPartSize = 0; - mPhysicalPartSize = 0; + mProgram.clear(); } void XGfxPixelShaderLoadDef::ParseData(XDataStream *aStream) { - qint32 cachedPartPtr, physicalPartPtr; - *aStream - >> cachedPartPtr - >> physicalPartPtr - >> mCachedPartSize - >> mPhysicalPartSize; - - if (physicalPartPtr) + if (IsDebug()) { - aStream->readRawData(mPhysicalPart.data(), mPhysicalPartSize); + qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); } - if (cachedPartPtr) + + qint32 programPtr = aStream->ParseInt32(QString("%1 program ptr").arg(GetName())); + Q_UNUSED(programPtr); + + mProgramSize = aStream->ParseUInt16(QString("%1 cached part").arg(GetName())); + mLoadForRenderer = aStream->ParseUInt16(QString("%1 physical part").arg(GetName())); +} + +void XGfxPixelShaderLoadDef::ParseProgram(XDataStream *aStream) +{ + mProgram = QByteArray(mProgramSize * 4, Qt::Uninitialized); + aStream->readRawData(mProgram.data(), mProgramSize * 4); + + if (IsDebug()) { - aStream->readRawData(mCachedPart.data(), mCachedPartSize); + qDebug() << QString("[%1] %2: %3").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()).arg(mProgram); } } + +quint16 XGfxPixelShaderLoadDef::ProgramSize() const +{ + return mProgramSize; +} + +void XGfxPixelShaderLoadDef::SetProgramSize(quint16 aProgramSize) +{ + mProgramSize = aProgramSize; +} + +quint16 XGfxPixelShaderLoadDef::LoadForRenderer() const +{ + return mLoadForRenderer; +} + +void XGfxPixelShaderLoadDef::SetLoadForRenderer(quint16 aLoadForRenderer) +{ + mLoadForRenderer = aLoadForRenderer; +} + +QByteArray XGfxPixelShaderLoadDef::Program() const +{ + return mProgram; +} + +void XGfxPixelShaderLoadDef::SetProgram(const QByteArray &aProgram) +{ + mProgram = aProgram; +} + diff --git a/libs/xassets/xgfxpixelshaderloaddef.h b/libs/xassets/xgfxpixelshaderloaddef.h index 7b844f9..61d858a 100644 --- a/libs/xassets/xgfxpixelshaderloaddef.h +++ b/libs/xassets/xgfxpixelshaderloaddef.h @@ -11,17 +11,22 @@ public: explicit XGfxPixelShaderLoadDef(); ~XGfxPixelShaderLoadDef(); - quint16 GetPhysicalPartSize() const; - quint16 GetCachedPartSize() const; - void ParseData(XDataStream *aStream) override; void Clear() override; + void ParseProgram(XDataStream *aStream); + + quint16 ProgramSize() const; + void SetProgramSize(quint16 aProgramSize); + quint16 LoadForRenderer() const; + void SetLoadForRenderer(quint16 aLoadForRenderer); + QByteArray Program() const; + void SetProgram(const QByteArray &aProgram); + private: - QByteArray mCachedPart; - QByteArray mPhysicalPart; - quint16 mCachedPartSize; - quint16 mPhysicalPartSize; + quint16 mProgramSize; + quint16 mLoadForRenderer; + QByteArray mProgram; }; #endif // XGFXPIXELSHADERLOADDEF_H diff --git a/libs/xassets/xgfxplacement.cpp b/libs/xassets/xgfxplacement.cpp index e8a0249..17bb0d7 100644 --- a/libs/xassets/xgfxplacement.cpp +++ b/libs/xassets/xgfxplacement.cpp @@ -15,14 +15,15 @@ XGfxPlacement::~XGfxPlacement() void XGfxPlacement::ParseData(XDataStream *aStream) { - *aStream - >> mQuat[0] - >> mQuat[1] - >> mQuat[2] - >> mQuat[3] - >> mOrigin[0] - >> mOrigin[2] - >> mOrigin[3]; + for (int i = 0; i < 4; i++) + { + mQuat[i] = aStream->ParseSingle(QString("%1 quaternion %2").arg(GetName()).arg(i)); + } + + for (int i = 0; i < 3; i++) + { + mOrigin[i] = aStream->ParseSingle(QString("%1 origin %2").arg(GetName()).arg(i)); + } } void XGfxPlacement::Clear() diff --git a/libs/xassets/xgfxvertexshaderloaddef.cpp b/libs/xassets/xgfxvertexshaderloaddef.cpp index 7a01669..a932da2 100644 --- a/libs/xassets/xgfxvertexshaderloaddef.cpp +++ b/libs/xassets/xgfxvertexshaderloaddef.cpp @@ -2,25 +2,18 @@ XGfxVertexShaderLoadDef::XGfxVertexShaderLoadDef() : XAsset() - , mCachedPart() - , mPhysicalPart() - , mCachedPartSize(0) - , mPhysicalPartSize(0) + , mProgramSize(0) + , mLoadForRenderer(0) + , mProgram() { SetName("GFX Vertex Shader Load Definition"); } -XGfxVertexShaderLoadDef::~XGfxVertexShaderLoadDef() -{ - -} - void XGfxVertexShaderLoadDef::Clear() { - mCachedPart = QByteArray(); - mPhysicalPart = QByteArray(); - mCachedPartSize = 0; - mPhysicalPartSize = 0; + mProgramSize = 0; + mLoadForRenderer = 0; + mProgram.clear(); } void XGfxVertexShaderLoadDef::ParseData(XDataStream *aStream) @@ -29,35 +22,51 @@ void XGfxVertexShaderLoadDef::ParseData(XDataStream *aStream) { qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); } - qint32 cachedPartPtr, physicalPartPtr; - *aStream - >> cachedPartPtr - >> physicalPartPtr - >> mCachedPartSize - >> mPhysicalPartSize; + + qint32 programPtr = aStream->ParseInt32(QString("%1 program ptr").arg(GetName())); + Q_UNUSED(programPtr); + + mProgramSize = aStream->ParseUInt16(QString("%1 cached part").arg(GetName())); + mLoadForRenderer = aStream->ParseUInt16(QString("%1 physical part").arg(GetName())); +} + +void XGfxVertexShaderLoadDef::ParseProgram(XDataStream *aStream) +{ + mProgram = QByteArray(mProgramSize * 4, Qt::Uninitialized); + aStream->readRawData(mProgram.data(), mProgramSize * 4); if (IsDebug()) { - qDebug() << QString("[%1] cachedPartPtr = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(cachedPartPtr); - qDebug() << QString("[%1] physicalPartPtr = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(physicalPartPtr); - qDebug() << QString("[%1] mCachedPartSize = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mCachedPartSize); - qDebug() << QString("[%1] mPerPrimArgCount %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPhysicalPartSize); - } - - if (physicalPartPtr) - { - aStream->readRawData(mPhysicalPart.data(), mPhysicalPartSize); - if (IsDebug()) - { - qDebug() << QString("[%1] mPhysicalPart = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPhysicalPart); - } - } - if (cachedPartPtr) - { - aStream->readRawData(mCachedPart.data(), mCachedPartSize); - if (IsDebug()) - { - qDebug() << QString("[%1] mCachedPart = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mCachedPart); - } + qDebug() << QString("[%1] %2: %3").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()).arg(mProgram); } } + +quint16 XGfxVertexShaderLoadDef::ProgramSize() const +{ + return mProgramSize; +} + +void XGfxVertexShaderLoadDef::SetProgramSize(quint16 aProgramSize) +{ + mProgramSize = aProgramSize; +} + +quint16 XGfxVertexShaderLoadDef::LoadForRenderer() const +{ + return mLoadForRenderer; +} + +void XGfxVertexShaderLoadDef::SetLoadForRenderer(quint16 aLoadForRenderer) +{ + mLoadForRenderer = aLoadForRenderer; +} + +QByteArray XGfxVertexShaderLoadDef::Program() const +{ + return mProgram; +} + +void XGfxVertexShaderLoadDef::SetProgram(const QByteArray &aProgram) +{ + mProgram = aProgram; +} diff --git a/libs/xassets/xgfxvertexshaderloaddef.h b/libs/xassets/xgfxvertexshaderloaddef.h index ea4954a..e02804b 100644 --- a/libs/xassets/xgfxvertexshaderloaddef.h +++ b/libs/xassets/xgfxvertexshaderloaddef.h @@ -9,16 +9,24 @@ class XGfxVertexShaderLoadDef : public XAsset { public: explicit XGfxVertexShaderLoadDef(); - ~XGfxVertexShaderLoadDef(); + ~XGfxVertexShaderLoadDef() = default; virtual void Clear() override; virtual void ParseData(XDataStream *aStream) override; + void ParseProgram(XDataStream *aStream); + + quint16 ProgramSize() const; + void SetProgramSize(quint16 aProgramSize); + quint16 LoadForRenderer() const; + void SetLoadForRenderer(quint16 aLoadForRenderer); + QByteArray Program() const; + void SetProgram(const QByteArray &aProgram); + private: - QByteArray mCachedPart; - QByteArray mPhysicalPart; - int mCachedPartSize; - int mPhysicalPartSize; + quint16 mProgramSize; + quint16 mLoadForRenderer; + QByteArray mProgram; }; #endif // XGFXCERTEXSHADERLOADDEF_H diff --git a/libs/xassets/xgfxworld.cpp b/libs/xassets/xgfxworld.cpp index 960382c..f150ab2 100644 --- a/libs/xassets/xgfxworld.cpp +++ b/libs/xassets/xgfxworld.cpp @@ -168,7 +168,7 @@ void XGfxWorld::ParseData(XDataStream *aStream) { mDpvs.ParseData(aStream); mDpvsDyn.ParseData(aStream); - mName.ParseData(aStream); + mName.ParseDataSafe(aStream); mBaseName.ParseData(aStream); if (indicesPtr) { diff --git a/libs/xassets/xitemdef.cpp b/libs/xassets/xitemdef.cpp index 8429ecf..79ea27d 100644 --- a/libs/xassets/xitemdef.cpp +++ b/libs/xassets/xitemdef.cpp @@ -1,9 +1,11 @@ #include "xitemdef.h" +#include "xmenudef.h" + XItemDef::XItemDef() : XAsset() , mWindow() - , mTextRect() + , mTextRect(4) , mType(0) , mDataType(0) , mAlignment(0) @@ -15,26 +17,26 @@ XItemDef::XItemDef() , mTextStyle(0) , mGameMsgWindowIndex(0) , mGameMsgWindowMode(0) - , mtext("") + , mText() , mItemFlags(0) , mParent(new XMenuDef()) - , mMouseEnterText("") - , mMouseExitText("") - , mMouseEnter("") - , mMouseExit("") - , mAction("") - , mOnAccept("") - , mOnFocus("") - , mLeaveFocus("") - , mDvar("") - , mDvarTest("") - , mOnKey(new XItemKeyHandler()) - , mEnableDvar("") + , mMouseEnterText() + , mMouseExitText() + , mMouseEnter() + , mMouseExit() + , mAction() + , mOnAccept() + , mOnFocus() + , mLeaveFocus() + , mDvar() + , mDvarTest() + , mOnKey() + , mEnableDvar() , mDvarFlags(0) - , mFocusSound(new XSoundAliasList()) + , mFocusSound() , mSpecial(0.0f) - , mCursorPos() - , mTypeData() + , mCursorPos(4) + , mTypeData(*this) , mImageTrack(0) , mVisibleExp() , mTextExp() @@ -48,11 +50,6 @@ XItemDef::XItemDef() SetName("Item Definition"); } -XItemDef::~XItemDef() -{ - -} - int XItemDef::GetType() const { return mType; @@ -60,12 +57,266 @@ int XItemDef::GetType() const void XItemDef::Clear() { - + mWindow.Clear(); + mTextRect.clear(); + mType = 0; + mDataType = 0; + mAlignment = 0; + mFontEnum = 0; + mTextAlignMode = 0; + mTextalignx = 0.0f; + mTextaligny = 0.0f; + mTextscale = 0.0f; + mTextStyle = 0; + mGameMsgWindowIndex = 0; + mGameMsgWindowMode = 0; + mText.Clear(); + mItemFlags = 0; + mParent->Clear(); + mMouseEnterText.Clear(); + mMouseExitText.Clear(); + mMouseEnter.Clear(); + mMouseExit.Clear(); + mAction.Clear(); + mOnAccept.Clear(); + mOnFocus.Clear(); + mLeaveFocus.Clear(); + mDvar.Clear(); + mDvarTest.Clear(); + mOnKey.Clear(); + mEnableDvar.Clear(); + mDvarFlags = 0; + mFocusSound.Clear(); + mSpecial = 0.0f; + //mCursorPos; + mTypeData.Clear(); + mImageTrack = 0; + mVisibleExp.Clear(); + mTextExp.Clear(); + mMaterialExp.Clear(); + mRectXExp.Clear(); + mRectYExp.Clear(); + mRectWExp.Clear(); + mRectHExp.Clear(); + mForecolorAExp.Clear(); } void XItemDef::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mWindow.SetCommonInfo(GetCommonInfo()); + mWindow.ParseData(aStream); - // TODO: Fill in XItemDef::ParseData + for (int i = 0; i < 1; i++) + { + mTextRect[i].ParseData(aStream); + } + + mType = aStream->ParseInt32(QString("%1 type").arg(GetName())); + mDataType = aStream->ParseInt32(QString("%1 data type").arg(GetName())); + mAlignment = aStream->ParseInt32(QString("%1 alignment").arg(GetName())); + mFontEnum = aStream->ParseInt32(QString("%1 font enum").arg(GetName())); + mTextAlignMode = aStream->ParseInt32(QString("%1 text align mode").arg(GetName())); + mTextalignx = aStream->ParseSingle(QString("%1 text align x").arg(GetName())); + mTextaligny = aStream->ParseSingle(QString("%1 text align y").arg(GetName())); + mTextscale = aStream->ParseSingle(QString("%1 text scale").arg(GetName())); + mTextStyle = aStream->ParseInt32(QString("%1 text style").arg(GetName())); + mGameMsgWindowIndex = aStream->ParseInt32(QString("%1 game msg window index").arg(GetName())); + mGameMsgWindowMode = aStream->ParseInt32(QString("%1 game msg window mode").arg(GetName())); + + mText.ParsePtr(aStream, false); + + mItemFlags = aStream->ParseInt32(QString("%1 type").arg(GetName())); + + mParent->ParsePtr(aStream, false); + + mMouseEnterText.ParsePtr(aStream, false); + mMouseExitText.ParsePtr(aStream, false); + mMouseEnter.ParsePtr(aStream, false); + mMouseExit.ParsePtr(aStream, false); + mAction.ParsePtr(aStream, false); + mOnAccept.ParsePtr(aStream, false); + mOnFocus.ParsePtr(aStream, false); + mLeaveFocus.ParsePtr(aStream, false); + mDvar.ParsePtr(aStream, false); + mDvarTest.ParsePtr(aStream, false); + mOnKey.ParsePtr(aStream, false); + mEnableDvar.ParsePtr(aStream, false); + + mDvarFlags = aStream->ParseInt32(QString("%1 dvar flags").arg(GetName())); + + mFocusSound.ParsePtr(aStream, false); + + mSpecial = aStream->ParseSingle(QString("%1 special").arg(GetName())); + + for (int i = 0; i < 1; i++) + { + mCursorPos[i] = aStream->ParseInt32(QString("%1 cursor pos %2").arg(GetName()).arg(i)); + } + + mTypeData.ParseData(aStream); + + mImageTrack = aStream->ParseInt32(QString("%1 image track").arg(GetName())); + + mVisibleExp.SetCommonInfo(GetCommonInfo()); + mVisibleExp.ParseData(aStream); + + mTextExp.SetCommonInfo(GetCommonInfo()); + mTextExp.ParseData(aStream); + + mMaterialExp.SetCommonInfo(GetCommonInfo()); + mMaterialExp.ParseData(aStream); + + mRectXExp.SetCommonInfo(GetCommonInfo()); + mRectXExp.ParseData(aStream); + + mRectYExp.SetCommonInfo(GetCommonInfo()); + mRectYExp.ParseData(aStream); + + mRectWExp.SetCommonInfo(GetCommonInfo()); + mRectWExp.ParseData(aStream); + + mRectHExp.SetCommonInfo(GetCommonInfo()); + mRectHExp.ParseData(aStream); + + mForecolorAExp.SetCommonInfo(GetCommonInfo()); + mForecolorAExp.ParseData(aStream); + + + mWindow.WindowName().ParseData(aStream); + mWindow.Group().ParseData(aStream); + mWindow.Background().ParseData(aStream); + + mText.ParseDataSafe(aStream); + mMouseEnterText.ParseDataSafe(aStream); + mMouseExitText.ParseDataSafe(aStream); + mMouseEnter.ParseDataSafe(aStream); + mMouseExit.ParseDataSafe(aStream); + mAction.ParseDataSafe(aStream); + mOnAccept.ParseDataSafe(aStream); + mOnFocus.ParseDataSafe(aStream); + mLeaveFocus.ParseDataSafe(aStream); + mDvar.ParseDataSafe(aStream); + mDvarTest.ParseDataSafe(aStream); + + mOnKey.ParseDataSafe(aStream); + + mEnableDvar.ParseDataSafe(aStream); + + mFocusSound.ParseDataSafe(aStream); + + mTypeData.ParseData(aStream); + + if (mVisibleExp.EntriesPtr()) + { + for (int i = 0; i < mVisibleExp.Entries().size(); i++) + { + mVisibleExp.Entries()[i].ParsePtr(aStream, false); + } + } + if (mTextExp.EntriesPtr()) + { + for (int i = 0; i < mTextExp.Entries().size(); i++) + { + mTextExp.Entries()[i].ParsePtr(aStream, false); + } + } + if (mMaterialExp.EntriesPtr()) + { + for (int i = 0; i < mMaterialExp.Entries().size(); i++) + { + mMaterialExp.Entries()[i].ParsePtr(aStream, false); + } + } + if (mRectXExp.EntriesPtr()) + { + for (int i = 0; i < mRectXExp.Entries().size(); i++) + { + mRectXExp.Entries()[i].ParsePtr(aStream, false); + } + } + if (mRectYExp.EntriesPtr()) + { + for (int i = 0; i < mRectYExp.Entries().size(); i++) + { + mRectYExp.Entries()[i].ParsePtr(aStream, false); + } + } + if (mRectWExp.EntriesPtr()) + { + for (int i = 0; i < mRectWExp.Entries().size(); i++) + { + mRectWExp.Entries()[i].ParsePtr(aStream, false); + } + } + if (mRectHExp.EntriesPtr()) + { + for (int i = 0; i < mRectHExp.Entries().size(); i++) + { + mRectHExp.Entries()[i].ParsePtr(aStream, false); + } + } + if (mForecolorAExp.EntriesPtr()) + { + for (int i = 0; i < mForecolorAExp.Entries().size(); i++) + { + mForecolorAExp.Entries()[i].ParsePtr(aStream, false); + } + } + + if (mVisibleExp.EntriesPtr()) + { + for (int i = 0; i < mVisibleExp.Entries().size(); i++) + { + mVisibleExp.Entries()[i].ParseDataSafe(aStream); + } + } + if (mTextExp.EntriesPtr()) + { + for (int i = 0; i < mTextExp.Entries().size(); i++) + { + mTextExp.Entries()[i].ParseDataSafe(aStream); + } + } + if (mMaterialExp.EntriesPtr()) + { + for (int i = 0; i < mMaterialExp.Entries().size(); i++) + { + mMaterialExp.Entries()[i].ParseDataSafe(aStream); + } + } + if (mRectXExp.EntriesPtr()) + { + for (int i = 0; i < mRectXExp.Entries().size(); i++) + { + mRectXExp.Entries()[i].ParseDataSafe(aStream); + } + } + if (mRectYExp.EntriesPtr()) + { + for (int i = 0; i < mRectYExp.Entries().size(); i++) + { + mRectYExp.Entries()[i].ParseDataSafe(aStream); + } + } + if (mRectWExp.EntriesPtr()) + { + for (int i = 0; i < mRectWExp.Entries().size(); i++) + { + mRectWExp.Entries()[i].ParseDataSafe(aStream); + } + } + if (mRectHExp.EntriesPtr()) + { + for (int i = 0; i < mRectHExp.Entries().size(); i++) + { + mRectHExp.Entries()[i].ParseDataSafe(aStream); + } + } + if (mForecolorAExp.EntriesPtr()) + { + for (int i = 0; i < mForecolorAExp.Entries().size(); i++) + { + mForecolorAExp.Entries()[i].ParseDataSafe(aStream); + } + } } diff --git a/libs/xassets/xitemdef.h b/libs/xassets/xitemdef.h index 6486e3d..7ae42d8 100644 --- a/libs/xassets/xitemdef.h +++ b/libs/xassets/xitemdef.h @@ -3,17 +3,17 @@ #include "xasset.h" #include "xitemkeyhandler.h" -#include "xmenudef.h" #include "xsoundaliaslist.h" #include "xstatement.h" #include "xwindowdef.h" #include "xitemdefdata.h" +class XMenuDef; + class XItemDef : public XAsset { public: explicit XItemDef(); - ~XItemDef(); int GetType() const; @@ -23,38 +23,38 @@ public: private: XWindowDef mWindow; QVector mTextRect; - int mType; - int mDataType; - int mAlignment; - int mFontEnum; - int mTextAlignMode; + qint32 mType; + qint32 mDataType; + qint32 mAlignment; + qint32 mFontEnum; + qint32 mTextAlignMode; float mTextalignx; float mTextaligny; float mTextscale; - int mTextStyle; - int mGameMsgWindowIndex; - int mGameMsgWindowMode; - QString mtext; - int mItemFlags; - XMenuDef *mParent; - QString mMouseEnterText; - QString mMouseExitText; - QString mMouseEnter; - QString mMouseExit; - QString mAction; - QString mOnAccept; - QString mOnFocus; - QString mLeaveFocus; - QString mDvar; - QString mDvarTest; - XItemKeyHandler *mOnKey; - QString mEnableDvar; - int mDvarFlags; - XSoundAliasList *mFocusSound; + qint32 mTextStyle; + qint32 mGameMsgWindowIndex; + qint32 mGameMsgWindowMode; + XString mText; + qint32 mItemFlags; + XMenuDef* mParent; + XString mMouseEnterText; + XString mMouseExitText; + XString mMouseEnter; + XString mMouseExit; + XString mAction; + XString mOnAccept; + XString mOnFocus; + XString mLeaveFocus; + XString mDvar; + XString mDvarTest; + XItemKeyHandler mOnKey; + XString mEnableDvar; + qint32 mDvarFlags; + XSoundAliasList mFocusSound; float mSpecial; - int mCursorPos[4]; + QVector mCursorPos; XItemDefData mTypeData; - int mImageTrack; + qint32 mImageTrack; XStatement mVisibleExp; XStatement mTextExp; XStatement mMaterialExp; diff --git a/libs/xassets/xitemdefdata.cpp b/libs/xassets/xitemdefdata.cpp index 56c6566..259f958 100644 --- a/libs/xassets/xitemdefdata.cpp +++ b/libs/xassets/xitemdefdata.cpp @@ -23,11 +23,6 @@ XItemDefData::XItemDefData(XItemDef &aParent) } -XItemDefData::~XItemDefData() -{ - delete mParent; -} - void XItemDefData::Clear() { mListBox.Clear(); diff --git a/libs/xassets/xitemdefdata.h b/libs/xassets/xitemdefdata.h index b1ae70e..b2f2b9f 100644 --- a/libs/xassets/xitemdefdata.h +++ b/libs/xassets/xitemdefdata.h @@ -13,7 +13,7 @@ class XItemDefData : public XAsset public: explicit XItemDefData(); XItemDefData(XItemDef& aParent); - ~XItemDefData(); + ~XItemDefData() = default; void Clear() override; void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xitemkeyhandler.cpp b/libs/xassets/xitemkeyhandler.cpp index 45dbc62..e9fd9f1 100644 --- a/libs/xassets/xitemkeyhandler.cpp +++ b/libs/xassets/xitemkeyhandler.cpp @@ -11,27 +11,26 @@ XItemKeyHandler::XItemKeyHandler() XItemKeyHandler::~XItemKeyHandler() { - + if (mNext) + { + delete mNext; + } } void XItemKeyHandler::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) + *aStream >> mKey; + + mAction.ParsePtr(aStream, false); + + qint32 nextPtr = aStream->ParseInt32(QString("%1 next ptr").arg(GetName())); + + mAction.ParseDataSafe(aStream); + + if (nextPtr) { - *aStream >> mKey; - - mAction.ParsePtr(aStream, false); - - qint32 nextPtr; - *aStream >> nextPtr; - - mAction.ParseData(aStream); - - if (nextPtr) - { - mNext = new XItemKeyHandler(); - mNext->ParseData(aStream); - } + mNext = new XItemKeyHandler(); + mNext->ParseData(aStream); } } @@ -39,5 +38,9 @@ void XItemKeyHandler::Clear() { mKey = 0; mAction.Clear(); - mNext = nullptr; + + if (mNext) + { + mNext->Clear(); + } } diff --git a/libs/xassets/xitemkeyhandler.h b/libs/xassets/xitemkeyhandler.h index 9f2245b..cb917ff 100644 --- a/libs/xassets/xitemkeyhandler.h +++ b/libs/xassets/xitemkeyhandler.h @@ -14,7 +14,7 @@ public: void Clear() override; private: - int mKey; + qint32 mKey; XString mAction; XItemKeyHandler *mNext; }; diff --git a/libs/xassets/xlistboxdef.cpp b/libs/xassets/xlistboxdef.cpp index 3d64f77..7ca575f 100644 --- a/libs/xassets/xlistboxdef.cpp +++ b/libs/xassets/xlistboxdef.cpp @@ -16,38 +16,69 @@ XListBoxDef::XListBoxDef() , mUsePaging(false) , mSelectBorder() , mDisableColor() - , mSelectIcon(new XMaterial()) + , mSelectIcon() { SetName("List Box Definition"); } -XListBoxDef::~XListBoxDef() -{ - -} - void XListBoxDef::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + mMousePos = aStream->ParseInt32(QString("%1 has been uploaded").arg(GetName())); + mStartPos = aStream->ParseInt32(QString("%1 has been uploaded").arg(GetName())); + mEndPos = aStream->ParseInt32(QString("%1 has been uploaded").arg(GetName())); + mDrawPadding = aStream->ParseInt32(QString("%1 has been uploaded").arg(GetName())); + mElementWidth = aStream->ParseSingle(QString("%1 has been uploaded").arg(GetName())); + mElementHeight = aStream->ParseSingle(QString("%1 has been uploaded").arg(GetName())); + mElementStyle = aStream->ParseInt32(QString("%1 has been uploaded").arg(GetName())); + mNumColumns = aStream->ParseInt32(QString("%1 has been uploaded").arg(GetName())); - // TODO: Fill in XListBoxDef::ParseData + for (int i = 0; i < 16; i++) + { + XColumnInfo newCol; + newCol.ParseData(aStream); + mColumnInfo.push_back(newCol); + } + + mDoubleClick.ParsePtr(aStream, false); + + mNotselectable = aStream->ParseInt32(QString("%1 has been uploaded").arg(GetName()));; + mNoScrollBars = aStream->ParseInt32(QString("%1 has been uploaded").arg(GetName()));; + mUsePaging = aStream->ParseInt32(QString("%1 has been uploaded").arg(GetName()));; + + float r = aStream->ParseSingle(QString("%1 select border red").arg(GetName())); + float g = aStream->ParseSingle(QString("%1 select border green").arg(GetName())); + float b = aStream->ParseSingle(QString("%1 select border blue").arg(GetName())); + float a = aStream->ParseSingle(QString("%1 select border alpha").arg(GetName())); + mSelectBorder = QColor(r, g, b, a); + + r = aStream->ParseSingle(QString("%1 disable red").arg(GetName())); + g = aStream->ParseSingle(QString("%1 disable green").arg(GetName())); + b = aStream->ParseSingle(QString("%1 disable blue").arg(GetName())); + a = aStream->ParseSingle(QString("%1 disable alpha").arg(GetName())); + mDisableColor = QColor(r, g, b, a); + + mSelectIcon.ParsePtr(aStream, false); + + mDoubleClick.ParseDataSafe(aStream); + mSelectIcon.ParseDataSafe(aStream); } void XListBoxDef::Clear() { - mStartPos = QVector(4); - mEndPos = QVector(4); + mMousePos = 0; + mStartPos = 0; + mEndPos = 0; mDrawPadding = 0; - mElementWidth = 0; - mElementHeight = 0; + mElementWidth = 0.0f; + mElementHeight = 0.0f; mElementStyle = 0; mNumColumns = 0; - mColumnInfo = QVector(16); - mDoubleClick = ""; - mNotselectable = false; - mNoScrollBars = false; - mUsePaging = false; - mSelectBorder = QVector(4); - mDisableColor = QVector(4); - delete mSelectIcon; + mColumnInfo.clear(); + mDoubleClick.Clear(); + mNotselectable = 0; + mNoScrollBars = 0; + mUsePaging = 0; + mSelectBorder = QColor(); + mDisableColor = QColor(); + mSelectIcon.Clear(); } diff --git a/libs/xassets/xlistboxdef.h b/libs/xassets/xlistboxdef.h index f07f365..ceb5cbf 100644 --- a/libs/xassets/xlistboxdef.h +++ b/libs/xassets/xlistboxdef.h @@ -1,6 +1,7 @@ #ifndef XLISTBOXDEF_H #define XLISTBOXDEF_H +#include "qcolor.h" #include "xasset.h" #include "xcolumninfo.h" #include "xmaterial.h" @@ -9,27 +10,28 @@ class XListBoxDef : public XAsset { public: explicit XListBoxDef(); - ~XListBoxDef(); + ~XListBoxDef() = default; void ParseData(XDataStream *aStream) override; void Clear() override; private: - QVector mStartPos; - QVector mEndPos; - int mDrawPadding; + qint32 mMousePos; + qint32 mStartPos; + qint32 mEndPos; + qint32 mDrawPadding; float mElementWidth; float mElementHeight; - int mElementStyle; - int mNumColumns; + qint32 mElementStyle; + qint32 mNumColumns; QVector mColumnInfo; - QString mDoubleClick; - int mNotselectable; - int mNoScrollBars; - int mUsePaging; - QVector mSelectBorder; - QVector mDisableColor; - XMaterial *mSelectIcon; + XString mDoubleClick; + qint32 mNotselectable; + qint32 mNoScrollBars; + qint32 mUsePaging; + QColor mSelectBorder; + QColor mDisableColor; + XMaterial mSelectIcon; }; #endif // XLISTBOXDEF_H diff --git a/libs/xassets/xlocalizeentry.cpp b/libs/xassets/xlocalizeentry.cpp index b17578d..08d5fd5 100644 --- a/libs/xassets/xlocalizeentry.cpp +++ b/libs/xassets/xlocalizeentry.cpp @@ -20,7 +20,7 @@ XString* XLocalizeEntry::GetValue() const return mValue; } -XString* XLocalizeEntry::GetName() const +XString* XLocalizeEntry::LocalizeEntryName() const { return mName; } @@ -40,6 +40,7 @@ void XLocalizeEntry::ParseData(XDataStream *aStream) mValue->ParseData(aStream); mName->ParseData(aStream); + SetDisplayName(mName->GetString()); } } @@ -53,12 +54,12 @@ void XLocalizeEntry::SetValue(QString aValue) mValue->SetString(aValue); } -void XLocalizeEntry::SetName(XString* aName) +void XLocalizeEntry::SetLocalizeEntryName(XString* aName) { mName = aName; } -void XLocalizeEntry::SetName(QString aName) +void XLocalizeEntry::SetLocalizeEntryName(QString aName) { mName->SetString(aName); } diff --git a/libs/xassets/xlocalizeentry.h b/libs/xassets/xlocalizeentry.h index 1fdee10..5667bb5 100644 --- a/libs/xassets/xlocalizeentry.h +++ b/libs/xassets/xlocalizeentry.h @@ -15,9 +15,9 @@ public: void SetValue(QString aValue); XString* GetValue() const; - void SetName(XString* aName); - void SetName(QString aName); - XString* GetName() const; + void SetLocalizeEntryName(XString* aName); + void SetLocalizeEntryName(QString aName); + XString* LocalizeEntryName() const; virtual void Clear() override; virtual void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xmapents.cpp b/libs/xassets/xmapents.cpp index fffe95f..858d40f 100644 --- a/libs/xassets/xmapents.cpp +++ b/libs/xassets/xmapents.cpp @@ -29,7 +29,7 @@ void XMapEnts::ParseData(XDataStream *aStream) *aStream >> mNumEntityChars; - mName.ParseData(aStream); + mName.ParseDataSafe(aStream); mEntityString.SetContentLength(mNumEntityChars); mEntityString.ParseData(aStream); diff --git a/libs/xassets/xmaterial.cpp b/libs/xassets/xmaterial.cpp index 983e01f..2313921 100644 --- a/libs/xassets/xmaterial.cpp +++ b/libs/xassets/xmaterial.cpp @@ -3,7 +3,7 @@ XMaterial::XMaterial() : XAsset() , mInfo() - , mStateBitsEntry(26) + , mStateBitsEntry(34) , mTextureCount(0) , mConstantCount(0) , mStateBitsCount(0) @@ -18,62 +18,51 @@ XMaterial::XMaterial() SetName("Material"); } -XMaterial::~XMaterial() -{ - -} - void XMaterial::ParseData(XDataStream *aStream) { mInfo.ParseData(aStream); + AddSubAsset(&mInfo); - for (int i = 0; i < 26; i++) + for (int i = 0; i < 34; i++) { - *aStream >> mStateBitsEntry[i]; - if (IsDebug()) - { - qDebug() << QString("[%1] mStateBitsEntry[%2] = %3").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(i).arg(mStateBitsEntry[i]); - } + mStateBitsEntry[i] = aStream->ParseUInt8(QString("%1 state bits entry %2").arg(GetName()).arg(i + 1)); } - - *aStream >> mTextureCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mTextureCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mTextureCount); - } - *aStream >> mConstantCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mConstantCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mConstantCount); - } - *aStream >> mStateBitsCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mStateBitsCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mStateBitsCount); - } - *aStream >> mStateFlags; - if (IsDebug()) - { - qDebug() << QString("[%1] mStateFlags = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mStateFlags); - } - *aStream >> mCameraRegion; - if (IsDebug()) - { - qDebug() << QString("[%1] mCameraRegion = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mCameraRegion); - } + mTextureCount = aStream->ParseUInt8(QString("%1 texture count").arg(GetName())); + mConstantCount = aStream->ParseUInt8(QString("%1 constant count").arg(GetName())); + mStateBitsCount = aStream->ParseUInt8(QString("%1 state bits count").arg(GetName())); + mStateFlags = aStream->ParseUInt8(QString("%1 state flags").arg(GetName())); + mCameraRegion = aStream->ParseUInt8(QString("%1 camera region").arg(GetName())); aStream->skipRawData(1); + mTechniqueSet.SetCommonInfo(GetCommonInfo()); mTechniqueSet.ParsePtr(aStream, false); + mTextureTable.SetCommonInfo(GetCommonInfo()); mTextureTable.ParsePtr(aStream, false); + mConstantTable.SetCommonInfo(GetCommonInfo()); mConstantTable.ParsePtr(aStream, false); + mStateBitsTable.SetCommonInfo(GetCommonInfo()); mStateBitsTable.ParsePtr(aStream, false); - mTechniqueSet.ParseData(aStream); - mTextureTable.ParseData(aStream); - mConstantTable.ParseData(aStream); - mStateBitsTable.ParseData(aStream); + XString materialName = mInfo.MaterialName(); + materialName.SetRemoveString(","); + materialName.ParseDataSafe(aStream); + AddSubAsset(&materialName); + SetDisplayName(materialName.GetString()); + mInfo.SetMaterialName(materialName); + + mTechniqueSet.ParseDataSafe(aStream); + AddSubAsset(&mTechniqueSet); + + mTextureTable.ParseDataSafe(aStream); + AddSubAsset(&mTextureTable); + + mConstantTable.ParseDataSafe(aStream); + AddSubAsset(&mConstantTable); + + mStateBitsTable.ParseDataSafe(aStream); + AddSubAsset(&mStateBitsTable); } void XMaterial::Clear() @@ -90,3 +79,113 @@ void XMaterial::Clear() mConstantTable = XMaterialConstantDef(); mStateBitsTable = XGfxStateBits(); } + +XMaterialInfo XMaterial::Info() const +{ + return mInfo; +} + +void XMaterial::SetInfo(const XMaterialInfo &aInfo) +{ + mInfo = aInfo; +} + +QVector XMaterial::StateBitsEntry() const +{ + return mStateBitsEntry; +} + +void XMaterial::SetStateBitsEntry(const QVector &aStateBitsEntry) +{ + mStateBitsEntry = aStateBitsEntry; +} + +quint8 XMaterial::TextureCount() const +{ + return mTextureCount; +} + +void XMaterial::SetTextureCount(quint8 aTextureCount) +{ + mTextureCount = aTextureCount; +} + +quint8 XMaterial::ConstantCount() const +{ + return mConstantCount; +} + +void XMaterial::SetConstantCount(quint8 aConstantCount) +{ + mConstantCount = aConstantCount; +} + +quint8 XMaterial::StateBitsCount() const +{ + return mStateBitsCount; +} + +void XMaterial::SetStateBitsCount(quint8 aStateBitsCount) +{ + mStateBitsCount = aStateBitsCount; +} + +quint8 XMaterial::StateFlags() const +{ + return mStateFlags; +} + +void XMaterial::SetStateFlags(quint8 aStateFlags) +{ + mStateFlags = aStateFlags; +} + +quint8 XMaterial::CameraRegion() const +{ + return mCameraRegion; +} + +void XMaterial::SetCameraRegion(quint8 aCameraRegion) +{ + mCameraRegion = aCameraRegion; +} + +XMaterialTechniqueSet XMaterial::TechniqueSet() const +{ + return mTechniqueSet; +} + +void XMaterial::SetTechniqueSet(const XMaterialTechniqueSet &aTechniqueSet) +{ + mTechniqueSet = aTechniqueSet; +} + +XMaterialTextureDef XMaterial::TextureTable() const +{ + return mTextureTable; +} + +void XMaterial::SetTextureTable(const XMaterialTextureDef &aTextureTable) +{ + mTextureTable = aTextureTable; +} + +XMaterialConstantDef XMaterial::ConstantTable() const +{ + return mConstantTable; +} + +void XMaterial::SetConstantTable(const XMaterialConstantDef &aConstantTable) +{ + mConstantTable = aConstantTable; +} + +XGfxStateBits XMaterial::StateBitsTable() const +{ + return mStateBitsTable; +} + +void XMaterial::SetStateBitsTable(const XGfxStateBits &aStateBitsTable) +{ + mStateBitsTable = aStateBitsTable; +} diff --git a/libs/xassets/xmaterial.h b/libs/xassets/xmaterial.h index 807f8fa..4a1a600 100644 --- a/libs/xassets/xmaterial.h +++ b/libs/xassets/xmaterial.h @@ -11,11 +11,37 @@ class XMaterial : public XAsset { public: explicit XMaterial(); - ~XMaterial() override; + ~XMaterial() = default; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; + XMaterialInfo Info() const; + void SetInfo(const XMaterialInfo &aInfo); + QVector StateBitsEntry() const; + void SetStateBitsEntry(const QVector &aStateBitsEntry); + quint8 TextureCount() const; + void SetTextureCount(quint8 aTextureCount); + quint8 ConstantCount() const; + void SetConstantCount(quint8 aConstantCount); + quint8 StateBitsCount() const; + void SetStateBitsCount(quint8 aStateBitsCount); + quint8 StateFlags() const; + void SetStateFlags(quint8 aStateFlags); + quint8 CameraRegion() const; + void SetCameraRegion(quint8 aCameraRegion); + XMaterialTechniqueSet TechniqueSet() const; + void SetTechniqueSet(const XMaterialTechniqueSet &aTechniqueSet); + XMaterialTextureDef TextureTable() const; + void SetTextureTable(const XMaterialTextureDef &aTextureTable); + XMaterialConstantDef ConstantTable() const; + void SetConstantTable(const XMaterialConstantDef &aConstantTable); + XGfxStateBits StateBitsTable() const; + void SetStateBitsTable(const XGfxStateBits &aStateBitsTable); + + XString MaterialName() const; + void SetMaterialName(const XString &aName); + private: XMaterialInfo mInfo; QVector mStateBitsEntry; diff --git a/libs/xassets/xmaterialargumentdef.cpp b/libs/xassets/xmaterialargumentdef.cpp index aa19dde..d59ca6f 100644 --- a/libs/xassets/xmaterialargumentdef.cpp +++ b/libs/xassets/xmaterialargumentdef.cpp @@ -17,11 +17,6 @@ XMaterialArgumentDef::XMaterialArgumentDef(XMaterialShaderArgument &aParent) SetName("Material Argument Definition"); } -XMaterialArgumentDef::~XMaterialArgumentDef() -{ - -} - void XMaterialArgumentDef::Clear() { @@ -36,7 +31,7 @@ void XMaterialArgumentDef::ParseData(XDataStream *aStream) *aStream >> mCodeSampler; - if (mParent->GetType() == 1 || mParent->GetType() == 7) + if (mParent->GetArgType() == 1 || mParent->GetArgType() == 7) { if (mCodeSampler == -1) { diff --git a/libs/xassets/xmaterialargumentdef.h b/libs/xassets/xmaterialargumentdef.h index 5a9ac84..44021da 100644 --- a/libs/xassets/xmaterialargumentdef.h +++ b/libs/xassets/xmaterialargumentdef.h @@ -10,7 +10,7 @@ class XMaterialArgumentDef : public XAsset public: explicit XMaterialArgumentDef(); XMaterialArgumentDef(XMaterialShaderArgument &aParent); - ~XMaterialArgumentDef(); + ~XMaterialArgumentDef() = default; virtual void Clear() override; virtual void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xmaterialconstantdef.cpp b/libs/xassets/xmaterialconstantdef.cpp index 29cd794..ef4d75e 100644 --- a/libs/xassets/xmaterialconstantdef.cpp +++ b/libs/xassets/xmaterialconstantdef.cpp @@ -4,7 +4,7 @@ XMaterialConstantDef::XMaterialConstantDef() : XAsset() , mNameHash(0) , mName() - , mLiteral() + , mLiteral(4) { SetName("Material Constant Definition"); } @@ -25,11 +25,10 @@ void XMaterialConstantDef::ParseData(XDataStream *aStream) mName.SetString(QString::fromUtf8(rawName)); - *aStream - >> mLiteral[0] - >> mLiteral[1] - >> mLiteral[2] - >> mLiteral[3]; + mLiteral[0] = aStream->ParseUInt32(QString("%1 literal 1").arg(GetName())); + mLiteral[1] = aStream->ParseUInt32(QString("%1 literal 2").arg(GetName())); + mLiteral[2] = aStream->ParseUInt32(QString("%1 literal 3").arg(GetName())); + mLiteral[3] = aStream->ParseUInt32(QString("%1 literal 4").arg(GetName())); } } diff --git a/libs/xassets/xmaterialinfo.cpp b/libs/xassets/xmaterialinfo.cpp index 72e8d40..0f64b86 100644 --- a/libs/xassets/xmaterialinfo.cpp +++ b/libs/xassets/xmaterialinfo.cpp @@ -2,65 +2,181 @@ XMaterialInfo::XMaterialInfo() : XAsset() - , mName() + , mMaterialName() , mGameFlags(0) , mSortKey(0) , mTextureAtlasRowCount(0) , mTextureAtlasColumnCount(0) , mDrawSurf() , mSurfaceTypeBits(0) + , mHashIndex(0) + , mStateBitsEntry() + , mTextureCount(0) + , mConstantCount(0) + , mStateBitsCount(0) + , mStateFlags(0) + , mCameraRegion(0) { SetName("Material Info"); } -XMaterialInfo::~XMaterialInfo() -{ - -} - void XMaterialInfo::ParseData(XDataStream *aStream) { - mName.ParsePtr(aStream, false); + mMaterialName.ParsePtr(aStream, false); - - *aStream >> mGameFlags; - if (IsDebug()) - { - qDebug() << QString("[%1] mGameFlags = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mGameFlags); - } - - *aStream >> mSortKey; - if (IsDebug()) - { - qDebug() << QString("[%1] mSortKey = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mSortKey); - } - - *aStream >> mTextureAtlasRowCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mTextureAtlasRowCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mTextureAtlasRowCount); - } - - *aStream >> mTextureAtlasColumnCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mTextureAtlasColumnCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mTextureAtlasColumnCount); - } + mGameFlags = aStream->ParseUInt8(QString("%1 game flags").arg(GetName())); + mSortKey = aStream->ParseUInt8(QString("%1 sort key").arg(GetName())); + mTextureAtlasRowCount = aStream->ParseUInt8(QString("%1 texture atlas row count").arg(GetName())); + mTextureAtlasColumnCount = aStream->ParseUInt8(QString("%1 texture atlas column count").arg(GetName())); mDrawSurf.ParseData(aStream); - *aStream >> mSurfaceTypeBits; - if (IsDebug()) - { - qDebug() << QString("[%1] mSurfaceTypeBits = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mSurfaceTypeBits); - } - - aStream->skipRawData(4); - - mName.ParseData(aStream); + mSurfaceTypeBits = aStream->ParseUInt32(QString("%1 surface type bits").arg(GetName())); + mHashIndex = aStream->ParseUInt16(QString("%1 hash index").arg(GetName())); + aStream->skipRawData(2); } void XMaterialInfo::Clear() { } + +quint8 XMaterialInfo::GameFlags() const +{ + return mGameFlags; +} + +void XMaterialInfo::SetGameFlags(quint8 aGameFlags) +{ + mGameFlags = aGameFlags; +} + +quint8 XMaterialInfo::SortKey() const +{ + return mSortKey; +} + +void XMaterialInfo::SetSortKey(quint8 aSortKey) +{ + mSortKey = aSortKey; +} + +quint8 XMaterialInfo::TextureAtlasRowCount() const +{ + return mTextureAtlasRowCount; +} + +void XMaterialInfo::SetTextureAtlasRowCount(quint8 aTextureAtlasRowCount) +{ + mTextureAtlasRowCount = aTextureAtlasRowCount; +} + +quint8 XMaterialInfo::TextureAtlasColumnCount() const +{ + return mTextureAtlasColumnCount; +} + +void XMaterialInfo::SetTextureAtlasColumnCount(quint8 aTextureAtlasColumnCount) +{ + mTextureAtlasColumnCount = aTextureAtlasColumnCount; +} + +XGfxDrawSurf XMaterialInfo::DrawSurf() const +{ + return mDrawSurf; +} + +void XMaterialInfo::SetDrawSurf(const XGfxDrawSurf &aDrawSurf) +{ + mDrawSurf = aDrawSurf; +} + +quint32 XMaterialInfo::SurfaceTypeBits() const +{ + return mSurfaceTypeBits; +} + +void XMaterialInfo::SetSurfaceTypeBits(quint32 aSurfaceTypeBits) +{ + mSurfaceTypeBits = aSurfaceTypeBits; +} + +XString XMaterialInfo::MaterialName() const +{ + return mMaterialName; +} + +void XMaterialInfo::SetMaterialName(const XString &aMaterialName) +{ + mMaterialName = aMaterialName; +} + +quint32 XMaterialInfo::HashIndex() const +{ + return mHashIndex; +} + +void XMaterialInfo::SetHashIndex(quint32 aHashIndex) +{ + mHashIndex = aHashIndex; +} + +QByteArray XMaterialInfo::StateBitsEntry() const +{ + return mStateBitsEntry; +} + +void XMaterialInfo::SetStateBitsEntry(const QByteArray &aStateBitsEntry) +{ + mStateBitsEntry = aStateBitsEntry; +} + +quint8 XMaterialInfo::TextureCount() const +{ + return mTextureCount; +} + +void XMaterialInfo::SetTextureCount(quint8 aTextureCount) +{ + mTextureCount = aTextureCount; +} + +quint8 XMaterialInfo::ConstantCount() const +{ + return mConstantCount; +} + +void XMaterialInfo::SetConstantCount(quint8 aConstantCount) +{ + mConstantCount = aConstantCount; +} + +quint8 XMaterialInfo::StateBitsCount() const +{ + return mStateBitsCount; +} + +void XMaterialInfo::SetStateBitsCount(quint8 aStateBitsCount) +{ + mStateBitsCount = aStateBitsCount; +} + +quint8 XMaterialInfo::StateFlags() const +{ + return mStateFlags; +} + +void XMaterialInfo::SetStateFlags(quint8 aStateFlags) +{ + mStateFlags = aStateFlags; +} + +quint8 XMaterialInfo::CameraRegion() const +{ + return mCameraRegion; +} + +void XMaterialInfo::SetCameraRegion(quint8 aCameraRegion) +{ + mCameraRegion = aCameraRegion; +} diff --git a/libs/xassets/xmaterialinfo.h b/libs/xassets/xmaterialinfo.h index 0608ba9..f1ad518 100644 --- a/libs/xassets/xmaterialinfo.h +++ b/libs/xassets/xmaterialinfo.h @@ -9,19 +9,57 @@ class XMaterialInfo : public XAsset { public: explicit XMaterialInfo(); - ~XMaterialInfo(); + ~XMaterialInfo() = default; void ParseData(XDataStream *aStream) override; void Clear() override; + quint8 GameFlags() const; + void SetGameFlags(quint8 aGameFlags); + quint8 SortKey() const; + void SetSortKey(quint8 aSortKey); + quint8 TextureAtlasRowCount() const; + void SetTextureAtlasRowCount(quint8 aTextureAtlasRowCount); + quint8 TextureAtlasColumnCount() const; + void SetTextureAtlasColumnCount(quint8 aTextureAtlasColumnCount); + XGfxDrawSurf DrawSurf() const; + void SetDrawSurf(const XGfxDrawSurf &aDrawSurf); + quint32 SurfaceTypeBits() const; + void SetSurfaceTypeBits(quint32 aSurfaceTypeBits); + + XString MaterialName() const; + void SetMaterialName(const XString &aMaterialName); + quint32 HashIndex() const; + void SetHashIndex(quint32 aHashIndex); + QByteArray StateBitsEntry() const; + void SetStateBitsEntry(const QByteArray &aStateBitsEntry); + quint8 TextureCount() const; + void SetTextureCount(quint8 aTextureCount); + quint8 ConstantCount() const; + void SetConstantCount(quint8 aConstantCount); + quint8 StateBitsCount() const; + void SetStateBitsCount(quint8 aStateBitsCount); + quint8 StateFlags() const; + void SetStateFlags(quint8 aStateFlags); + quint8 CameraRegion() const; + void SetCameraRegion(quint8 aCameraRegion); + private: - XString mName; + XString mMaterialName; quint8 mGameFlags; quint8 mSortKey; quint8 mTextureAtlasRowCount; quint8 mTextureAtlasColumnCount; XGfxDrawSurf mDrawSurf; quint32 mSurfaceTypeBits; + quint32 mHashIndex; + QByteArray mStateBitsEntry; + quint8 mTextureCount; + quint8 mConstantCount; + quint8 mStateBitsCount; + quint8 mStateFlags; + quint8 mCameraRegion; + }; #endif // XMATERIALINFO_H diff --git a/libs/xassets/xmaterialpass.cpp b/libs/xassets/xmaterialpass.cpp index 87044b4..39c6fcc 100644 --- a/libs/xassets/xmaterialpass.cpp +++ b/libs/xassets/xmaterialpass.cpp @@ -16,7 +16,7 @@ XMaterialPass::XMaterialPass() , mPerObjArgCount(0) , mStableArgCount(0) , mCustomSamplerFlags(0) - , mPrecompiledIndex(0) + //, mPrecompiledIndex(0) , mArgs() { SetName("Material Pass"); @@ -35,43 +35,48 @@ void XMaterialPass::ParseData(XDataStream *aStream) } mVertexDecl.ParsePtr(aStream, false); - for (int i = 0; i < 15; i++) + if (GetCommonInfo()->GetGame() != GAME_COD4) { - mVertexShaderArray[i].ParsePtr(aStream, false); + for (int i = 0; i < 15; i++) + { + mVertexShaderArray[i].ParsePtr(aStream, false); + } } mVertexShader.ParsePtr(aStream, false); mPixelShader.ParsePtr(aStream, false); - qint32 argsPtr; - *aStream - >> mPerPrimArgCount - >> mPerObjArgCount - >> mStableArgCount - >> mCustomSamplerFlags - >> mPrecompiledIndex; - - aStream->skipRawData(3); - - *aStream >> argsPtr; - - if (IsDebug()) + if (GetCommonInfo()->GetGame() == GAME_COD4) { - qDebug() << QString("[%1] mPerPrimArgCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPerPrimArgCount); - qDebug() << QString("[%1] mPerObjArgCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPerObjArgCount); - qDebug() << QString("[%1] mStableArgCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mStableArgCount); - qDebug() << QString("[%1] mCustomSamplerFlags = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mCustomSamplerFlags); - qDebug() << QString("[%1] mPrecompiledIndex = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPrecompiledIndex); - qDebug() << QString("[%1] argsPtr = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(argsPtr); + mPerPrimArgCount = aStream->ParseUInt8(QString("%1 per primary arg count").arg(GetName())); + mPerObjArgCount = aStream->ParseUInt8(QString("%1 per object arg count").arg(GetName())); + mStableArgCount = aStream->ParseUInt8(QString("%1 stable arg count").arg(GetName())); + mCustomSamplerFlags = aStream->ParseUInt8(QString("%1 custom sampler flags").arg(GetName())); + } + else + { + mPerPrimArgCount = aStream->ParseUInt32(QString("%1 per primary arg count").arg(GetName())); + mPerObjArgCount = aStream->ParseUInt32(QString("%1 per object arg count").arg(GetName())); + mStableArgCount = aStream->ParseUInt32(QString("%1 stable arg count").arg(GetName())); + mCustomSamplerFlags = aStream->ParseUInt32(QString("%1 custom sampler flags").arg(GetName())); + mPrecompiledIndex = aStream->ParseUInt32(QString("%1 precompiled index").arg(GetName())); + + aStream->skipRawData(3); } - mVertexDecl.ParseData(aStream); - for (int i = 0; i < 15; i++) + qint32 argsPtr = aStream->ParseInt32(QString("%1 args ptr").arg(GetName())); + + mVertexDecl.ParseDataSafe(aStream); + + if (GetCommonInfo()->GetGame() != GAME_COD4) { - mVertexShaderArray[i].ParseData(aStream); + for (int i = 0; i < mVertexShaderArray.size(); i++) + { + mVertexShaderArray[i].ParseData(aStream); + } } - mVertexShader.ParseData(aStream); - mPixelShader.ParseData(aStream); + mVertexShader.ParseDataSafe(aStream); + mPixelShader.ParseDataSafe(aStream); if (argsPtr) { diff --git a/libs/xassets/xmaterialpass.h b/libs/xassets/xmaterialpass.h index 0dbf7b1..cfb492d 100644 --- a/libs/xassets/xmaterialpass.h +++ b/libs/xassets/xmaterialpass.h @@ -22,11 +22,11 @@ private: QVector mVertexShaderArray; XMaterialVertexShader mVertexShader; XMaterialPixelShader mPixelShader; - int mPerPrimArgCount; - int mPerObjArgCount; - int mStableArgCount; - int mCustomSamplerFlags; - int mPrecompiledIndex; + quint32 mPerPrimArgCount; + quint32 mPerObjArgCount; + quint32 mStableArgCount; + quint32 mCustomSamplerFlags; + quint32 mPrecompiledIndex; QVector mArgs; }; diff --git a/libs/xassets/xmaterialpixelshader.cpp b/libs/xassets/xmaterialpixelshader.cpp index 4bb5564..99f594d 100644 --- a/libs/xassets/xmaterialpixelshader.cpp +++ b/libs/xassets/xmaterialpixelshader.cpp @@ -2,29 +2,50 @@ XMaterialPixelShader::XMaterialPixelShader() : XAsset() - , mName() - , mShaderProgram() + , mShaderName() + , mProgram() { SetType(ASSET_TYPE_PIXELSHADER); SetName("Material Pixel Shader"); } -XMaterialPixelShader::~XMaterialPixelShader() -{ - -} - void XMaterialPixelShader::Clear() { - mName.Clear(); - mShaderProgram.Clear(); + mShaderName.Clear(); + mProgram.Clear(); } void XMaterialPixelShader::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) + if (IsDebug()) { - mName.ParsePtr(aStream); - mShaderProgram.ParseData(aStream); + qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); } + mShaderName.ParsePtr(aStream, false); + mProgram.ParseData(aStream); + + mShaderName.ParseDataSafe(aStream); + SetDisplayName(mShaderName.GetString()); + + mProgram.LoadDef().ParseProgram(aStream); +} + +XString XMaterialPixelShader::ShaderName() const +{ + return mShaderName; +} + +void XMaterialPixelShader::SetShaderName(const XString &aName) +{ + mShaderName = aName; +} + +XMaterialPixelShaderProgram XMaterialPixelShader::ShaderProgram() const +{ + return mProgram; +} + +void XMaterialPixelShader::SetShaderProgram(const XMaterialPixelShaderProgram &aShaderProgram) +{ + mProgram = aShaderProgram; } diff --git a/libs/xassets/xmaterialpixelshader.h b/libs/xassets/xmaterialpixelshader.h index f01de1d..934493c 100644 --- a/libs/xassets/xmaterialpixelshader.h +++ b/libs/xassets/xmaterialpixelshader.h @@ -9,14 +9,19 @@ class XMaterialPixelShader : public XAsset { public: explicit XMaterialPixelShader(); - ~XMaterialPixelShader(); + ~XMaterialPixelShader() = default; void Clear() override; void ParseData(XDataStream *aStream) override; + XString ShaderName() const; + void SetShaderName(const XString &aName); + XMaterialPixelShaderProgram ShaderProgram() const; + void SetShaderProgram(const XMaterialPixelShaderProgram &aShaderProgram); + private: - XString mName; - XMaterialPixelShaderProgram mShaderProgram; + XString mShaderName; + XMaterialPixelShaderProgram mProgram; }; #endif // XMATERIALPIXERHSHADER_H diff --git a/libs/xassets/xmaterialpixelshaderprogram.cpp b/libs/xassets/xmaterialpixelshaderprogram.cpp index e373024..44eb960 100644 --- a/libs/xassets/xmaterialpixelshaderprogram.cpp +++ b/libs/xassets/xmaterialpixelshaderprogram.cpp @@ -8,11 +8,6 @@ XMaterialPixelShaderProgram::XMaterialPixelShaderProgram() SetName("Material Pixel Shader Program"); } -XMaterialPixelShaderProgram::~XMaterialPixelShaderProgram() -{ - -} - void XMaterialPixelShaderProgram::Clear() { mPixelShader.Clear(); @@ -21,15 +16,25 @@ void XMaterialPixelShaderProgram::Clear() void XMaterialPixelShaderProgram::ParseData(XDataStream *aStream) { - mLoadDef.ParseData(aStream); - mPixelShader.ParseData(aStream); - - if (mLoadDef.GetPhysicalPartSize()) + if (IsDebug()) { - //mPixelShader. + qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); } - else + + mPixelShader.ParsePtr(aStream, false); + + if (!mPixelShader.GetPtr()) { - //mLoadDef + mLoadDef.ParseData(aStream); } } + +XGfxPixelShaderLoadDef XMaterialPixelShaderProgram::LoadDef() const +{ + return mLoadDef; +} + +void XMaterialPixelShaderProgram::SetLoadDef(const XGfxPixelShaderLoadDef &aLoadDef) +{ + mLoadDef = aLoadDef; +} diff --git a/libs/xassets/xmaterialpixelshaderprogram.h b/libs/xassets/xmaterialpixelshaderprogram.h index b04b5b2..7800b84 100644 --- a/libs/xassets/xmaterialpixelshaderprogram.h +++ b/libs/xassets/xmaterialpixelshaderprogram.h @@ -12,11 +12,14 @@ class XMaterialPixelShaderProgram : public XAsset { public: explicit XMaterialPixelShaderProgram(); - ~XMaterialPixelShaderProgram(); + ~XMaterialPixelShaderProgram() = default; void Clear() override; void ParseData(XDataStream *aStream) override; + XGfxPixelShaderLoadDef LoadDef() const; + void SetLoadDef(const XGfxPixelShaderLoadDef &aLoadDef); + private: XD3DPixelShader mPixelShader; XGfxPixelShaderLoadDef mLoadDef; diff --git a/libs/xassets/xmaterialshaderargument.cpp b/libs/xassets/xmaterialshaderargument.cpp index 3ed1f3f..efce6a9 100644 --- a/libs/xassets/xmaterialshaderargument.cpp +++ b/libs/xassets/xmaterialshaderargument.cpp @@ -18,19 +18,18 @@ void XMaterialShaderArgument::Clear() void XMaterialShaderArgument::ParseData(XDataStream *aStream) { - *aStream - >> mType - >> mDest; + mType = aStream->ParseUInt16(QString("%1 type").arg(GetName())); + mDest = aStream->ParseUInt16(QString("%1 destination").arg(GetName())); mDef.ParseData(aStream); } -quint16 XMaterialShaderArgument::GetType() const +quint16 XMaterialShaderArgument::GetArgType() const { return mType; } -quint16 XMaterialShaderArgument::GetDest() const +quint16 XMaterialShaderArgument::GetArgDest() const { return mDest; } diff --git a/libs/xassets/xmaterialshaderargument.h b/libs/xassets/xmaterialshaderargument.h index 35ba427..f9a331c 100644 --- a/libs/xassets/xmaterialshaderargument.h +++ b/libs/xassets/xmaterialshaderargument.h @@ -12,8 +12,8 @@ public: virtual void Clear() override; virtual void ParseData(XDataStream *aStream) override; - quint16 GetType() const; - quint16 GetDest() const; + quint16 GetArgType() const; + quint16 GetArgDest() const; private: quint16 mType; diff --git a/libs/xassets/xmaterialstreamrouting.cpp b/libs/xassets/xmaterialstreamrouting.cpp index 850f622..3baf72d 100644 --- a/libs/xassets/xmaterialstreamrouting.cpp +++ b/libs/xassets/xmaterialstreamrouting.cpp @@ -6,19 +6,14 @@ XMaterialStreamRouting::XMaterialStreamRouting() SetName("Material Stream Routing"); } -XMaterialStreamRouting::~XMaterialStreamRouting() -{ - -} - void XMaterialStreamRouting::Clear() { - + mSource = 0; + mDest = 0; } void XMaterialStreamRouting::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XMaterialStreamRouting::ParseData + mSource = aStream->ParseUInt8(QString("%1 source").arg(GetName())); + mDest = aStream->ParseUInt8(QString("%1 destination").arg(GetName())); } diff --git a/libs/xassets/xmaterialstreamrouting.h b/libs/xassets/xmaterialstreamrouting.h index ebb8664..6b633b0 100644 --- a/libs/xassets/xmaterialstreamrouting.h +++ b/libs/xassets/xmaterialstreamrouting.h @@ -7,7 +7,7 @@ class XMaterialStreamRouting : public XAsset { public: explicit XMaterialStreamRouting(); - ~XMaterialStreamRouting(); + ~XMaterialStreamRouting() = default; virtual void Clear() override; virtual void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xmaterialtechnique.cpp b/libs/xassets/xmaterialtechnique.cpp index 2e708e8..d919d80 100644 --- a/libs/xassets/xmaterialtechnique.cpp +++ b/libs/xassets/xmaterialtechnique.cpp @@ -2,7 +2,7 @@ XMaterialTechnique::XMaterialTechnique() : XAsset() - , mName() + , mTechniqueName() , mFlags(0) , mPassCount(0) , mPassArray() @@ -10,46 +10,72 @@ XMaterialTechnique::XMaterialTechnique() SetName("Material Technique"); } -XMaterialTechnique::~XMaterialTechnique() -{ - -} - void XMaterialTechnique::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) + if (IsDebug()) { - if (IsDebug()) - { - qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); - } - mName.ParsePtr(aStream, false); - - *aStream - >> mFlags - >> mPassCount; - - if (IsDebug()) - { - qDebug() << QString("[%1] mFlags = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mFlags); - qDebug() << QString("[%1] mPassCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPassCount); - } - - mPassArray = QVector(mPassCount); - - for (int i = 0; i < mPassCount; i++) - { - mPassArray[i].ParseData(aStream); - } - - mName.ParseData(aStream); + qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); } + mTechniqueName.ParsePtr(aStream, false); + + mFlags = aStream->ParseUInt16(QString("%1 flags").arg(GetName())); + mPassCount = aStream->ParseUInt16(QString("%1 pass count").arg(GetName())); + + mPassArray = QVector(mPassCount); + + for (int i = 0; i < mPassCount; i++) + { + mPassArray[i].SetCommonInfo(GetCommonInfo()); + mPassArray[i].ParseData(aStream); + } + + mTechniqueName.ParseDataSafe(aStream); } void XMaterialTechnique::Clear() { - mName.Clear(); + mTechniqueName.Clear(); mFlags = 0; mPassCount = 0; mPassArray.clear(); } + +XString XMaterialTechnique::TechniqueName() const +{ + return mTechniqueName; +} + +void XMaterialTechnique::SetTechniqueName(const XString &aName) +{ + mTechniqueName = aName; +} + +quint16 XMaterialTechnique::Flags() const +{ + return mFlags; +} + +void XMaterialTechnique::SetFlags(quint16 aFlags) +{ + mFlags = aFlags; +} + +quint16 XMaterialTechnique::PassCount() const +{ + return mPassCount; +} + +void XMaterialTechnique::SetPassCount(quint16 aPassCount) +{ + mPassCount = aPassCount; +} + +QVector XMaterialTechnique::PassArray() const +{ + return mPassArray; +} + +void XMaterialTechnique::SetPassArray(const QVector &aPassArray) +{ + mPassArray = aPassArray; +} diff --git a/libs/xassets/xmaterialtechnique.h b/libs/xassets/xmaterialtechnique.h index 060bb4d..a1f6b5f 100644 --- a/libs/xassets/xmaterialtechnique.h +++ b/libs/xassets/xmaterialtechnique.h @@ -11,13 +11,22 @@ class XMaterialTechnique : public XAsset { public: explicit XMaterialTechnique(); - ~XMaterialTechnique(); + ~XMaterialTechnique() = default; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; + XString TechniqueName() const; + void SetTechniqueName(const XString &aName); + quint16 Flags() const; + void SetFlags(quint16 aFlags); + quint16 PassCount() const; + void SetPassCount(quint16 aPassCount); + QVector PassArray() const; + void SetPassArray(const QVector &aPassArray); + private: - XString mName; + XString mTechniqueName; quint16 mFlags; quint16 mPassCount; QVector mPassArray; diff --git a/libs/xassets/xmaterialtechniqueset.cpp b/libs/xassets/xmaterialtechniqueset.cpp index fbb5cd4..d07a2bd 100644 --- a/libs/xassets/xmaterialtechniqueset.cpp +++ b/libs/xassets/xmaterialtechniqueset.cpp @@ -2,10 +2,9 @@ XMaterialTechniqueSet::XMaterialTechniqueSet() : XAsset() - , mName() + , mTechniqueSetName() , mWorldVertFormat(0) - , mRemappedTechniqueSet() - , mTechniques(26) + , mTechniques() { SetType(ASSET_TYPE_TECHNIQUE_SET); SetName("Material Technique Set"); @@ -13,60 +12,153 @@ XMaterialTechniqueSet::XMaterialTechniqueSet() XMaterialTechniqueSet::~XMaterialTechniqueSet() { - + } void XMaterialTechniqueSet::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) + if (IsDebug()) + { + qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); + } + mTechniqueSetName.ParsePtr(aStream, false); + + mWorldVertFormat = aStream->ParseUInt8(QString("%1 world vertex format").arg(GetName())); + mHasBeenUploaded = aStream->ParseUInt8(QString("%1 has been uploaded").arg(GetName())); + + aStream->skipRawData(2 + 4); + + if (IsDebug()) + { + qDebug() << QString("Parsing techniques."); + } + + for (int i = 0; i < GetMaxTechniqueCount(); i++) + { + XMaterialTechnique newTechnique; + newTechnique.SetCommonInfo(GetCommonInfo()); + newTechnique.ParsePtr(aStream, false); + mTechniques.push_back(newTechnique); + + if (IsDebug()) + { + qDebug() << QString("[%1] material technique ptr = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(newTechnique.GetPtr()); + } + } + + mTechniqueSetName.SetRemoveString(","); + mTechniqueSetName.ParseDataSafe(aStream); + SetDisplayName(mTechniqueSetName.GetString()); + AddSubAsset(&mTechniqueSetName); + + if (IsDebug()) + { + qDebug() << QString("[%1] technique set name = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mTechniqueSetName.GetString()); + } + + for (int i = 0; i < mTechniques.size(); i++) { if (IsDebug()) { - qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); - } - mName.ParsePtr(aStream, false); - - *aStream >> mWorldVertFormat; - if (IsDebug()) - { - qDebug() << QString("[%1] mWorldVertFormat = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mWorldVertFormat); - } - - aStream->skipRawData(3); - - qint32 remappedPtr; - *aStream >> remappedPtr; - if (IsDebug()) - { - qDebug() << QString("[%1] remappedPtr = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(remappedPtr); - - qDebug() << QString("Parsing techniques."); - } - for (int i = 0; i < 26; i++) - { - XMaterialTechnique newTechnique; - newTechnique.ParsePtr(aStream, false); - mTechniques.append(newTechnique); - } - - mName.SetRemoveString(","); - mName.ParseData(aStream); - - for (int i = 0; i < 26; i++) - { - mTechniques[i].ParseData(aStream); + qDebug() << QString("Parsing technique: %1").arg(i); } + mTechniques[i].SetCommonInfo(GetCommonInfo()); + mTechniques[i].ParseDataSafe(aStream); + AddSubAsset(&mTechniques[i]); } } void XMaterialTechniqueSet::Clear() { - mName.Clear(); + mTechniqueSetName.Clear(); mWorldVertFormat = 0; - delete mRemappedTechniqueSet; - mRemappedTechniqueSet = new XMaterialTechniqueSet(); - mTechniques.clear(); - mTechniques = QVector(26); + mTechniques = QVector(GetMaxTechniqueCount()); +} + +quint32 XMaterialTechniqueSet::GetMaxTechniqueCount() const +{ + if (GetCommonInfo()->GetPlatform() == PLATFORM_PS3) { + if (GetCommonInfo()->GetGame() == GAME_COD4) { + return 26; + } else if (GetCommonInfo()->GetGame() == GAME_COD5) { + return 51; + } else if (GetCommonInfo()->GetGame() == GAME_COD6) { + return 37; + } else if (GetCommonInfo()->GetGame() == GAME_COD7) { + return 71; + } else if (GetCommonInfo()->GetGame() == GAME_COD8) { + return 41; + } else if (GetCommonInfo()->GetGame() == GAME_COD10) { + return 39; + } + } else if (GetCommonInfo()->GetPlatform() == PLATFORM_XBOX) { + if (GetCommonInfo()->GetGame() == GAME_COD4) { + return 26; + } else if (GetCommonInfo()->GetGame() == GAME_COD5) { + return 51; + } else if (GetCommonInfo()->GetGame() == GAME_COD6) { + return 33; + } else if (GetCommonInfo()->GetGame() == GAME_COD7) { + return 71; + } else if (GetCommonInfo()->GetGame() == GAME_COD8) { + return 37; + } else if (GetCommonInfo()->GetGame() == GAME_COD10) { + return 36; + } + } else if (GetCommonInfo()->GetPlatform() == PLATFORM_PC) { + if (GetCommonInfo()->GetGame() == GAME_COD4) { + return 34; + } else if (GetCommonInfo()->GetGame() == GAME_COD5) { + return 59; + } else if (GetCommonInfo()->GetGame() == GAME_COD6) { + return 48; + } else if (GetCommonInfo()->GetGame() == GAME_COD7) { + return 130; + } else if (GetCommonInfo()->GetGame() == GAME_COD8) { + return 54; + } + } + return 0; +} + +XString XMaterialTechniqueSet::TechniqueSetName() const +{ + return mTechniqueSetName; +} + +void XMaterialTechniqueSet::SetTechniqueSetName(const XString &aName) +{ + mTechniqueSetName = aName; +} + +quint8 XMaterialTechniqueSet::WorldVertFormat() const +{ + return mWorldVertFormat; +} + +void XMaterialTechniqueSet::SetWorldVertFormat(quint8 aWorldVertFormat) +{ + mWorldVertFormat = aWorldVertFormat; +} + +bool XMaterialTechniqueSet::HasBeenUploaded() const +{ + return mHasBeenUploaded; +} + +void XMaterialTechniqueSet::SetHasBeenUploaded(bool aHasBeenUploaded) +{ + mHasBeenUploaded = aHasBeenUploaded; +} + +QVector XMaterialTechniqueSet::Techniques() const +{ + return mTechniques; +} + +void XMaterialTechniqueSet::SetTechniques(const QVector &aTechniques) +{ + mTechniques = aTechniques; } diff --git a/libs/xassets/xmaterialtechniqueset.h b/libs/xassets/xmaterialtechniqueset.h index c98a8dc..843939e 100644 --- a/libs/xassets/xmaterialtechniqueset.h +++ b/libs/xassets/xmaterialtechniqueset.h @@ -14,10 +14,21 @@ public: void ParseData(XDataStream *aStream) override; void Clear() override; + quint32 GetMaxTechniqueCount() const; + + XString TechniqueSetName() const; + void SetTechniqueSetName(const XString &aName); + quint8 WorldVertFormat() const; + void SetWorldVertFormat(quint8 aWorldVertFormat); + bool HasBeenUploaded() const; + void SetHasBeenUploaded(bool aHasBeenUploaded); + QVector Techniques() const; + void SetTechniques(const QVector &aTechniques); + private: - XString mName; + XString mTechniqueSetName; quint8 mWorldVertFormat; - XMaterialTechniqueSet* mRemappedTechniqueSet; + bool mHasBeenUploaded; QVector mTechniques; }; diff --git a/libs/xassets/xmaterialtexturedef.cpp b/libs/xassets/xmaterialtexturedef.cpp index c5fb2f8..cdcb36f 100644 --- a/libs/xassets/xmaterialtexturedef.cpp +++ b/libs/xassets/xmaterialtexturedef.cpp @@ -5,7 +5,7 @@ XMaterialTextureDef::XMaterialTextureDef() , mNameHash(0) , mNameStart(0) , mNameEnd(0) - , mSamplerState(0) + , mSamplerState() , mSemantic(0) , mDefInfo(*this) { @@ -26,23 +26,17 @@ void XMaterialTextureDef::ParseData(XDataStream *aStream) { if (GetPtr() == -1) { + char tempSamplerState; *aStream >> mNameHash >> mNameStart >> mNameEnd - >> mSamplerState + >> tempSamplerState >> mSemantic; + // TODO: Convert tempSamplerState to mSamplerState + mDefInfo.SetCommonInfo(GetCommonInfo()); mDefInfo.ParseData(aStream); - - if (mSemantic == 11) - { - - } - else - { - - } } } @@ -51,7 +45,6 @@ void XMaterialTextureDef::Clear() mNameHash = 0; mNameStart = 0; mNameEnd = 0; - mSamplerState = 0; mSemantic = 0; mDefInfo.Clear(); } diff --git a/libs/xassets/xmaterialtexturedef.h b/libs/xassets/xmaterialtexturedef.h index 63df5e7..fb83885 100644 --- a/libs/xassets/xmaterialtexturedef.h +++ b/libs/xassets/xmaterialtexturedef.h @@ -3,6 +3,7 @@ #include "xasset.h" #include "xmaterialtexturedefinfo.h" +#include "xmaterialtexturedefsamplerstate.h" class XMaterialTextureDef : public XAsset { @@ -19,7 +20,7 @@ private: quint32 mNameHash; char mNameStart; char mNameEnd; - quint8 mSamplerState; + XMaterialTextureDefSamplerState mSamplerState; quint8 mSemantic; XMaterialTextureDefInfo mDefInfo; }; diff --git a/libs/xassets/xmaterialtexturedefinfo.cpp b/libs/xassets/xmaterialtexturedefinfo.cpp index f11f0fb..0116a63 100644 --- a/libs/xassets/xmaterialtexturedefinfo.cpp +++ b/libs/xassets/xmaterialtexturedefinfo.cpp @@ -26,17 +26,14 @@ XMaterialTextureDefInfo::~XMaterialTextureDefInfo() void XMaterialTextureDefInfo::ParseData(XDataStream *aStream) { - mImage.ParsePtr(aStream, false); - - if (aParent->GetSemantic() == 11) { - if (mImage.GetPtr() == -1) - { - mWater.ParseData(aStream); - } + if (aParent && aParent->GetSemantic() == 11) { + mWater.SetCommonInfo(GetCommonInfo()); + mWater.ParsePtr(aStream); } else { - mImage.ParseData(aStream); + mImage.SetCommonInfo(GetCommonInfo()); + mImage.ParsePtr(aStream); } } diff --git a/libs/xassets/xmaterialtexturedefsamplerstate.h b/libs/xassets/xmaterialtexturedefsamplerstate.h new file mode 100644 index 0000000..ef35238 --- /dev/null +++ b/libs/xassets/xmaterialtexturedefsamplerstate.h @@ -0,0 +1,13 @@ +#ifndef XMATERIALTEXTUREDEFSAMPLERSTATE_H +#define XMATERIALTEXTUREDEFSAMPLERSTATE_H + +struct XMaterialTextureDefSamplerState +{ + unsigned char filter : 3; + unsigned char mipMap : 2; + unsigned char clampU : 1; + unsigned char clampV : 1; + unsigned char clampW : 1; +}; + +#endif // XMATERIALTEXTUREDEFSAMPLERSTATE_H diff --git a/libs/xassets/xmaterialvertexdeclaration.cpp b/libs/xassets/xmaterialvertexdeclaration.cpp index 1102e9a..94798e4 100644 --- a/libs/xassets/xmaterialvertexdeclaration.cpp +++ b/libs/xassets/xmaterialvertexdeclaration.cpp @@ -4,6 +4,7 @@ XMaterialVertexDeclaration::XMaterialVertexDeclaration() : XAsset() , mStreamCount(0) , mHasOptionalSource(false) + , mIsLoaded(false) , mRouting() { SetName("Material Vertex Declaration"); @@ -11,26 +12,23 @@ XMaterialVertexDeclaration::XMaterialVertexDeclaration() void XMaterialVertexDeclaration::Clear() { - + mStreamCount = 0; + mHasOptionalSource = false; + mIsLoaded = false; + mRouting.Clear(); } void XMaterialVertexDeclaration::ParseData(XDataStream *aStream) { if (IsDebug()) { - qDebug() << QString("[%1]").arg(aStream->device()->pos(), 10, 10, QChar('0')) << "Parsing data for " << XAssetTypeToString(GetType()); + qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); } - if (GetPtr() == -1) - { - *aStream - >> mStreamCount - >> mHasOptionalSource; - if (IsDebug()) - { - qDebug() << QString("[%1]").arg(aStream->device()->pos(), 10, 10, QChar('0')) << " mStreamCount = " << mStreamCount; - qDebug() << QString("[%1]").arg(aStream->device()->pos(), 10, 10, QChar('0')) << " mHasOptionalSource = " << mHasOptionalSource; - } + mStreamCount = aStream->ParseUInt8(QString("%1 stream count").arg(GetName())); + mHasOptionalSource = aStream->ParseUInt8(QString("%1 has optional source").arg(GetName())); + mIsLoaded = aStream->ParseUInt8(QString("%1 is loaded").arg(GetName())); - mRouting.ParseData(aStream); - } + aStream->skipRawData(1); + + mRouting.ParseData(aStream); } diff --git a/libs/xassets/xmaterialvertexdeclaration.h b/libs/xassets/xmaterialvertexdeclaration.h index 8eed9d1..7ed9850 100644 --- a/libs/xassets/xmaterialvertexdeclaration.h +++ b/libs/xassets/xmaterialvertexdeclaration.h @@ -13,8 +13,9 @@ public: virtual void ParseData(XDataStream *aStream) override; private: - int mStreamCount; + quint8 mStreamCount; bool mHasOptionalSource; + bool mIsLoaded; XMaterialVertexStreamRouting mRouting; }; diff --git a/libs/xassets/xmaterialvertexshader.cpp b/libs/xassets/xmaterialvertexshader.cpp index a12f1cd..544aada 100644 --- a/libs/xassets/xmaterialvertexshader.cpp +++ b/libs/xassets/xmaterialvertexshader.cpp @@ -3,29 +3,48 @@ XMaterialVertexShader::XMaterialVertexShader() : XAsset() - , mName() + , mShaderName() , mProgram() { + SetType(ASSET_TYPE_VERTEXSHADER); SetName("Material Vertex Shader"); } void XMaterialVertexShader::Clear() { - + mShaderName.Clear(); + mProgram.Clear(); } void XMaterialVertexShader::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) + if (IsDebug()) { - if (IsDebug()) - { - qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); - } - mName.ParsePtr(aStream, false); - mProgram.ParseData(aStream); - - mName.ParseData(aStream); - mProgram.ParseData(aStream); + qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); } + mShaderName.ParsePtr(aStream, false); + mProgram.ParseData(aStream); + + mShaderName.ParseDataSafe(aStream); + mProgram.LoadDef().ParseProgram(aStream); +} + +XString XMaterialVertexShader::ShaderName() const +{ + return mShaderName; +} + +void XMaterialVertexShader::SetShaderName(const XString &aName) +{ + mShaderName = aName; +} + +XMaterialVertexShaderProgram XMaterialVertexShader::Program() const +{ + return mProgram; +} + +void XMaterialVertexShader::SetProgram(const XMaterialVertexShaderProgram &aProgram) +{ + mProgram = aProgram; } diff --git a/libs/xassets/xmaterialvertexshader.h b/libs/xassets/xmaterialvertexshader.h index 5e1afdc..862187f 100644 --- a/libs/xassets/xmaterialvertexshader.h +++ b/libs/xassets/xmaterialvertexshader.h @@ -11,12 +11,18 @@ class XMaterialVertexShader : public XAsset { public: explicit XMaterialVertexShader(); + ~XMaterialVertexShader() = default; virtual void Clear() override; virtual void ParseData(XDataStream *aStream) override; + XString ShaderName() const; + void SetShaderName(const XString &aName); + XMaterialVertexShaderProgram Program() const; + void SetProgram(const XMaterialVertexShaderProgram &aProgram); + private: - XString mName; + XString mShaderName; XMaterialVertexShaderProgram mProgram; }; diff --git a/libs/xassets/xmaterialvertexshaderprogram.cpp b/libs/xassets/xmaterialvertexshaderprogram.cpp index 9224bb7..4b3ae49 100644 --- a/libs/xassets/xmaterialvertexshaderprogram.cpp +++ b/libs/xassets/xmaterialvertexshaderprogram.cpp @@ -2,20 +2,15 @@ XMaterialVertexShaderProgram::XMaterialVertexShaderProgram() : XAsset() - //, mVertexShader() + , mVertexShader() , mLoadDef() { SetName("Material Vertex Shader Program"); } -XMaterialVertexShaderProgram::~XMaterialVertexShaderProgram() -{ - -} - void XMaterialVertexShaderProgram::Clear() { - //mVertexShader.Clear(); + mVertexShader.Clear(); mLoadDef.Clear(); } @@ -25,5 +20,21 @@ void XMaterialVertexShaderProgram::ParseData(XDataStream *aStream) { qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); } - mLoadDef.ParseData(aStream); + + mVertexShader.ParsePtr(aStream, false); + + if (!mVertexShader.GetPtr()) + { + mLoadDef.ParseData(aStream); + } +} + +XGfxVertexShaderLoadDef XMaterialVertexShaderProgram::LoadDef() const +{ + return mLoadDef; +} + +void XMaterialVertexShaderProgram::SetLoadDef(const XGfxVertexShaderLoadDef &aLoadDef) +{ + mLoadDef = aLoadDef; } diff --git a/libs/xassets/xmaterialvertexshaderprogram.h b/libs/xassets/xmaterialvertexshaderprogram.h index 7bfdb15..7eb3eab 100644 --- a/libs/xassets/xmaterialvertexshaderprogram.h +++ b/libs/xassets/xmaterialvertexshaderprogram.h @@ -2,19 +2,23 @@ #define XMATERIALVERTEXSHADERPROGRAM_H #include "xasset.h" +#include "xd3dvertexshader.h" #include "xgfxvertexshaderloaddef.h" class XMaterialVertexShaderProgram : public XAsset { public: XMaterialVertexShaderProgram(); - ~XMaterialVertexShaderProgram(); + ~XMaterialVertexShaderProgram() = default; virtual void Clear() override; virtual void ParseData(XDataStream *aStream) override; + XGfxVertexShaderLoadDef LoadDef() const; + void SetLoadDef(const XGfxVertexShaderLoadDef &aLoadDef); + private: - //XD3DVertexShader mVertexShader; + XD3DVertexShader mVertexShader; XGfxVertexShaderLoadDef mLoadDef; }; diff --git a/libs/xassets/xmaterialvertexstreamrouting.cpp b/libs/xassets/xmaterialvertexstreamrouting.cpp index 2a9bc6d..14af964 100644 --- a/libs/xassets/xmaterialvertexstreamrouting.cpp +++ b/libs/xassets/xmaterialvertexstreamrouting.cpp @@ -3,14 +3,15 @@ XMaterialVertexStreamRouting::XMaterialVertexStreamRouting() : XAsset() , mData(16) - , mDecl(15) + , mDecl(16) { SetName("Material Vertex Stream Routing"); } void XMaterialVertexStreamRouting::Clear() { - + mData.clear(); + mDecl.clear(); } void XMaterialVertexStreamRouting::ParseData(XDataStream *aStream) @@ -19,7 +20,11 @@ void XMaterialVertexStreamRouting::ParseData(XDataStream *aStream) { qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName()); } - for (int i = 0; i < 15; i++) + for (int i = 0; i < 16; i++) + { + mData[i].ParseData(aStream); + } + for (int i = 0; i < 16; i++) { mDecl[i].ParsePtr(aStream, false); } diff --git a/libs/xassets/xmenudef.cpp b/libs/xassets/xmenudef.cpp index 2a4475e..45f36f5 100644 --- a/libs/xassets/xmenudef.cpp +++ b/libs/xassets/xmenudef.cpp @@ -8,7 +8,7 @@ XMenuDef::XMenuDef() , mFullScreen(0) , mItemCount(0) , mFontIndex(0) - , mCursorItem(4) + , mCursorItem() , mFadeCycle(0) , mFadeClamp(0.0f) , mFadeAmount(0.0f) @@ -32,11 +32,6 @@ XMenuDef::XMenuDef() SetName("Menu Definition"); } -XMenuDef::~XMenuDef() -{ - -} - void XMenuDef::Clear() { @@ -48,14 +43,13 @@ void XMenuDef::ParseData(XDataStream *aStream) mFont.ParsePtr(aStream, false); - *aStream - >> mFullScreen - >> mItemCount - >> mFontIndex; + mFullScreen = aStream->ParseInt32(QString("%1 fullscreen").arg(GetName())); + mItemCount = aStream->ParseInt32(QString("%1 item count").arg(GetName())); + mFontIndex = aStream->ParseInt32(QString("%1 font index").arg(GetName())); - for (int i = 0; i < 4; i++) + for (int i = 0; i < 1; i++) { - *aStream >> mCursorItem[i]; + mCursorItem.push_back(aStream->ParseInt32(QString("%1 cursor item %2").arg(GetName()).arg(i))); } mFadeCycle = aStream->ParseInt32(QString("%1 fade cycle").arg(GetName())); @@ -74,45 +68,79 @@ void XMenuDef::ParseData(XDataStream *aStream) mAllowedBinding.ParsePtr(aStream, false); mSoundName.ParsePtr(aStream, false); - *aStream >> mImageTrack; + mImageTrack = aStream->ParseInt32(QString("%1 image track").arg(GetName())); float focusR = aStream->ParseSingle(QString("%1 focus color r").arg(GetName())); float focusG = aStream->ParseSingle(QString("%1 focus color g").arg(GetName())); float focusB = aStream->ParseSingle(QString("%1 focus color b").arg(GetName())); float focusA = aStream->ParseSingle(QString("%1 focus color a").arg(GetName())); + mFocusColor = QColor::fromRgbF(focusR, focusG, focusB, focusA); float disableR = aStream->ParseSingle(QString("%1 disable color r").arg(GetName())); float disableG = aStream->ParseSingle(QString("%1 disable color g").arg(GetName())); float disableB = aStream->ParseSingle(QString("%1 disable color b").arg(GetName())); float disableA = aStream->ParseSingle(QString("%1 disable color a").arg(GetName())); - - mFocusColor = QColor::fromRgbF(focusR, focusG, focusB, focusA); mDisableColor = QColor::fromRgbF(disableR, disableG, disableB, disableA); mRectXExp.ParseData(aStream); mRectYExp.ParseData(aStream); - qint32 itemsPtr; - *aStream >> itemsPtr; + qint32 itemsPtr = aStream->ParseInt32(QString("%1 items ptr").arg(GetName())); - mFont.ParseData(aStream); - mOnOpen.ParseData(aStream); - mOnClose.ParseData(aStream); - mOnESC.ParseData(aStream); - mOnKey.ParseData(aStream); - mVisibleExp.ParseData(aStream); - mAllowedBinding.ParseData(aStream); - mSoundName.ParseData(aStream); - mRectXExp.ParseData(aStream); - mRectYExp.ParseData(aStream); + mWindow.WindowName().ParseDataSafe(aStream); + mWindow.Group().ParseDataSafe(aStream); + mWindow.Background().ParseDataSafe(aStream); + + mFont.ParseDataSafe(aStream); + mOnOpen.ParseDataSafe(aStream); + mOnClose.ParseDataSafe(aStream); + mOnESC.ParseDataSafe(aStream); + mOnKey.ParseDataSafe(aStream); + + if (mVisibleExp.EntriesPtr()) + { + for (int i = 0; i < mVisibleExp.NumEntries(); i++) + { + XExpressionEntry newEntry; + newEntry.ParsePtr(aStream); + mVisibleExp.AddEntry(newEntry); + } + } + + mAllowedBinding.ParseDataSafe(aStream); + mSoundName.ParseDataSafe(aStream); + + if (mRectXExp.EntriesPtr()) + { + for (int i = 0; i < mRectXExp.NumEntries(); i++) + { + XExpressionEntry newEntry; + newEntry.ParsePtr(aStream); + mRectXExp.AddEntry(newEntry); + } + } + if (mRectYExp.EntriesPtr()) + { + for (int i = 0; i < mRectYExp.NumEntries(); i++) + { + XExpressionEntry newEntry; + newEntry.ParsePtr(aStream); + mRectYExp.AddEntry(newEntry); + } + } if (itemsPtr) { for (int i = 0; i < mItemCount; i++) { XItemDef newItemDef; - newItemDef.ParsePtr(aStream); - mItems.append(newItemDef); + newItemDef.SetCommonInfo(GetCommonInfo()); + newItemDef.ParsePtr(aStream, false); + mItems.push_back(newItemDef); + } + for (int i = 0; i < mItems.size(); i++) + { + mItems[i].ParseDataSafe(aStream); } } } diff --git a/libs/xassets/xmenudef.h b/libs/xassets/xmenudef.h index 0d05750..fb86dd9 100644 --- a/libs/xassets/xmenudef.h +++ b/libs/xassets/xmenudef.h @@ -7,14 +7,13 @@ #include "xstatement.h" #include "xstring.h" #include "xwindowdef.h" - -class XItemDef; +#include "xitemdef.h" class XMenuDef : public XAsset { public: explicit XMenuDef(); - ~XMenuDef(); + ~XMenuDef() = default; virtual void Clear() override; virtual void ParseData(XDataStream *aStream) override; diff --git a/libs/xassets/xmenulist.cpp b/libs/xassets/xmenulist.cpp index efcc98a..969f334 100644 --- a/libs/xassets/xmenulist.cpp +++ b/libs/xassets/xmenulist.cpp @@ -2,30 +2,25 @@ XMenuList::XMenuList() : XAsset() - , mName(new XString()) + , mName() , mMenuCount(0) - , mMenus(QVector()) + , mMenus() { SetType(ASSET_TYPE_MENULIST); - XAsset::SetName("Menu List"); + SetName("Menu List"); } XMenuList::~XMenuList() { - for (int i = 0; i < mMenus.size(); i++) - { - delete mMenus[i]; - } - - delete mName; + mMenus.clear(); } -void XMenuList::SetName(XString *aName) +void XMenuList::SetMenuListName(XString aName) { mName = aName; } -XString *XMenuList::GetName() const +XString XMenuList::MenuListName() const { return mName; } @@ -35,37 +30,47 @@ int XMenuList::GetMenuCount() const return mMenuCount; } -void XMenuList::SetMenuEntry(int aIndex, XMenuDef *aMenuDef) +void XMenuList::SetMenuEntry(int aIndex, XMenuDef aMenuDef) { mMenus[aIndex] = aMenuDef; } -XMenuDef *XMenuList::GetMenuEntry(int aIndex) const +XMenuDef XMenuList::GetMenuEntry(int aIndex) const { return mMenus[aIndex]; } void XMenuList::Clear() { - for (int i = 0; i < mMenus.size(); i++) - { - delete mMenus[i]; - } - - mName->Clear(); + mName.Clear(); mMenuCount = 0; mMenus.clear(); } void XMenuList::ParseData(XDataStream *aStream) { - mName->ParsePtr(aStream, false); + mName.ParsePtr(aStream, false); - *aStream - >> mMenuCount; + mMenuCount = aStream->ParseUInt32(QString("%1 menu count").arg(GetName())); - for (int i = 0; i < mMenuCount; i++) + qint32 menusPtr = aStream->ParseInt32(QString("%1 menus ptr").arg(GetName())); + + mName.ParseDataSafe(aStream); + SetDisplayName(mName.GetString()); + + if (menusPtr) { - //XMenuDef* newMenu = new XMenuDef(); + for (uint i = 0; i < mMenuCount; i++) + { + XMenuDef newMenu; + newMenu.SetCommonInfo(GetCommonInfo()); + newMenu.ParsePtr(aStream, false); + mMenus.push_back(newMenu); + } + + for (uint i = 0; i < mMenus.size(); i++) + { + mMenus[i].ParseDataSafe(aStream); + } } } diff --git a/libs/xassets/xmenulist.h b/libs/xassets/xmenulist.h index 8b78bb3..51c2fc5 100644 --- a/libs/xassets/xmenulist.h +++ b/libs/xassets/xmenulist.h @@ -10,21 +10,21 @@ public: XMenuList(); ~XMenuList(); - void SetName(XString* aName); - XString* GetName() const; + void SetMenuListName(XString aName); + XString MenuListName() const; int GetMenuCount() const; - void SetMenuEntry(int aIndex, XMenuDef* aMenuDef); - XMenuDef* GetMenuEntry(int aIndex) const; + void SetMenuEntry(int aIndex, XMenuDef aMenuDef); + XMenuDef GetMenuEntry(int aIndex) const; virtual void Clear() override; virtual void ParseData(XDataStream *aStream) override; private: - XString* mName; - int mMenuCount; - QVector mMenus; + XString mName; + quint32 mMenuCount; + QVector mMenus; }; #endif // XMENULIST_H diff --git a/libs/xassets/xmodel.cpp b/libs/xassets/xmodel.cpp index 7472fd7..6dbfcbf 100644 --- a/libs/xassets/xmodel.cpp +++ b/libs/xassets/xmodel.cpp @@ -29,6 +29,7 @@ XModel::XModel() , mStreamInfo() , mMemUsage(0) , mFlags(0) + , mBad(false) , mPhysPreset() , mPhysGeoms() { @@ -85,20 +86,22 @@ void XModel::ParseData(XDataStream *aStream) { 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())); + mNumLods = aStream->ParseUInt16(QString("%1 num lods").arg(GetName())); mCollLod = aStream->ParseInt16(QString("%1 coll lod").arg(GetName())); - mStreamInfo.ParsePtr(aStream, false); + mStreamInfo.ParseData(aStream); mMemUsage = aStream->ParseInt32(QString("%1 mem usage").arg(GetName())); mFlags = aStream->ParseUInt8(QString("%1 flags").arg(GetName())); + mBad = aStream->ParseUInt8(QString("%1 bad").arg(GetName())); - aStream->skipRawData(3); + aStream->skipRawData(2); mPhysPreset.ParsePtr(aStream, false); mPhysGeoms.ParsePtr(aStream, false); - mName.ParseData(aStream); + mName.ParseDataSafe(aStream); + SetDisplayName(mName.GetString()); if (boneNamesPtr == -1) { for (int i = 0; i < mNumBones; i++) { @@ -116,8 +119,10 @@ void XModel::ParseData(XDataStream *aStream) { 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); + + XModelQuat newQuat; + newQuat.ParseData(aStream); + mQuats.append(newQuat); } } @@ -148,6 +153,7 @@ void XModel::ParseData(XDataStream *aStream) { if (matHandlesPtr == -1) { for (int i = 0; i < mNumSurfs; i++) { XMaterial newMaterial; + newMaterial.SetCommonInfo(GetCommonInfo()); newMaterial.ParseData(aStream); mMaterialHandles.append(newMaterial); } diff --git a/libs/xassets/xmodel.h b/libs/xassets/xmodel.h index 86c495b..011dc84 100644 --- a/libs/xassets/xmodel.h +++ b/libs/xassets/xmodel.h @@ -2,6 +2,7 @@ #define XMODEL_H #include "xasset.h" +#include "xmodelquat.h" #include "xmodelstreaminfo.h" #include "xphysgeomlist.h" #include "xphyspreset.h" @@ -29,7 +30,7 @@ private: quint8 mLodRampType; QVector mBoneNames; QVector mParentList; - QVector mQuats; + QVector mQuats; QVector mTrans; QVector mPartClassification; XDObjAnimMat mBaseMat; @@ -48,6 +49,7 @@ private: XModelStreamInfo mStreamInfo; qint32 mMemUsage; quint8 mFlags; + bool mBad; XPhysPreset mPhysPreset; XPhysGeomList mPhysGeoms; }; diff --git a/libs/xassets/xmodellodinfo.cpp b/libs/xassets/xmodellodinfo.cpp index 843e22d..8cbab73 100644 --- a/libs/xassets/xmodellodinfo.cpp +++ b/libs/xassets/xmodellodinfo.cpp @@ -5,56 +5,27 @@ XModelLodInfo::XModelLodInfo() , mDist(0) , mNumSurfs(0) , mSurfIndex(0) - , mPartBits(4) + , mPartBits() + , mLod(0) + , mSmcIndexPlusOne(0) + , mSmcAllocBits(0) { SetName("Model LOD Info"); } -XModelLodInfo::~XModelLodInfo() -{ - -} - void XModelLodInfo::ParseData(XDataStream *aStream) { - quint32 rawDist; - *aStream >> rawDist; - memcpy(&mDist, &rawDist, sizeof(mDist)); - - if (IsDebug()) + mDist = aStream->ParseSingle(QString("%1 distance").arg(GetName())); + mNumSurfs = aStream->ParseUInt16(QString("%1 number surfaces").arg(GetName())); + mSurfIndex = aStream->ParseUInt16(QString("%1 surface index").arg(GetName())); + for (int i = 0; i < 4; i++) { - qDebug() << QString("[%1] mDist = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mDist); - } - *aStream >> mNumSurfs; - if (IsDebug()) - { - qDebug() << QString("[%1] mNumSurfs = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mNumSurfs); - } - *aStream >> mSurfIndex; - if (IsDebug()) - { - qDebug() << QString("[%1] mSurfIndex = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mSurfIndex); - } - *aStream >> mPartBits[0]; - if (IsDebug()) - { - qDebug() << QString("[%1] mPartBits[0] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPartBits[0]); - } - *aStream >> mPartBits[1]; - if (IsDebug()) - { - qDebug() << QString("[%1] mPartBits[1] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPartBits[1]); - } - *aStream >> mPartBits[2]; - if (IsDebug()) - { - qDebug() << QString("[%1] mPartBits[2] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPartBits[2]); - } - *aStream >> mPartBits[3]; - if (IsDebug()) - { - qDebug() << QString("[%1] mPartBits[3] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPartBits[3]); + mPartBits.push_back(aStream->ParseInt32(QString("%1 part bit %2").arg(GetName()).arg(i))); } + mLod = aStream->ParseUInt8(QString("%1 level of detail").arg(GetName())); + mSmcIndexPlusOne = aStream->ParseUInt8(QString("%1 smc index plus one").arg(GetName())); + mSmcAllocBits = aStream->ParseUInt8(QString("%1 smc alloc bits").arg(GetName())); + aStream->skipRawData(1); } void XModelLodInfo::Clear() @@ -63,4 +34,7 @@ void XModelLodInfo::Clear() mNumSurfs = 0; mSurfIndex = 0; mPartBits.clear(); + mLod = 0; + mSmcIndexPlusOne = 0; + mSmcAllocBits = 0; } diff --git a/libs/xassets/xmodellodinfo.h b/libs/xassets/xmodellodinfo.h index 47fe375..1c66c54 100644 --- a/libs/xassets/xmodellodinfo.h +++ b/libs/xassets/xmodellodinfo.h @@ -8,8 +8,8 @@ class XModelLodInfo : public XAsset { public: - XModelLodInfo(); - ~XModelLodInfo(); + explicit XModelLodInfo(); + ~XModelLodInfo() = default; virtual void ParseData(XDataStream* aStream) override; virtual void Clear() override; @@ -19,6 +19,9 @@ private: quint16 mNumSurfs; quint16 mSurfIndex; QVector mPartBits; + quint8 mLod; + quint8 mSmcIndexPlusOne; + quint8 mSmcAllocBits; }; #endif // XMODELLODINFO_H diff --git a/libs/xassets/xmodelpieces.cpp b/libs/xassets/xmodelpieces.cpp index d1676bd..25acd73 100644 --- a/libs/xassets/xmodelpieces.cpp +++ b/libs/xassets/xmodelpieces.cpp @@ -26,7 +26,7 @@ void XModelPieces::ParseData(XDataStream *aStream) >> mNumPieces >> piecesPtr; - mName.ParseData(aStream); + mName.ParseDataSafe(aStream); if (piecesPtr) { diff --git a/libs/xassets/xmodelquat.cpp b/libs/xassets/xmodelquat.cpp new file mode 100644 index 0000000..094f95f --- /dev/null +++ b/libs/xassets/xmodelquat.cpp @@ -0,0 +1,31 @@ +#include "xmodelquat.h" + +XModelQuat::XModelQuat() + : XAsset() + , mQuatElements(4) +{ + +} + +void XModelQuat::ParseData(XDataStream *aStream) +{ + for (int i = 0; i < 4; i++) + { + mQuatElements[i] = aStream->ParseUInt8(QString("%1 quad element %2").arg(GetName()).arg(i + 1)); + } +} + +void XModelQuat::Clear() +{ + mQuatElements.clear(); +} + +QVector XModelQuat::QuatElements() const +{ + return mQuatElements; +} + +void XModelQuat::SetQuatElements(const QVector &aQuatElements) +{ + mQuatElements = aQuatElements; +} diff --git a/libs/xassets/xmodelquat.h b/libs/xassets/xmodelquat.h new file mode 100644 index 0000000..637efd1 --- /dev/null +++ b/libs/xassets/xmodelquat.h @@ -0,0 +1,21 @@ +#ifndef XMODELQUAT_H +#define XMODELQUAT_H + +#include "xasset.h" + +class XModelQuat : public XAsset +{ +public: + XModelQuat(); + + void ParseData(XDataStream *aStream) override; + void Clear() override; + + QVector QuatElements() const; + void SetQuatElements(const QVector &aQuatElements); + +private: + QVector mQuatElements; +}; + +#endif // XMODELQUAT_H diff --git a/libs/xassets/xmultidef.cpp b/libs/xassets/xmultidef.cpp index 60bf486..2db33ec 100644 --- a/libs/xassets/xmultidef.cpp +++ b/libs/xassets/xmultidef.cpp @@ -2,9 +2,7 @@ XMultiDef::XMultiDef() : XAsset() - , mDvarListPtrs() , mDvarList() - , mDvarStrPtrs() , mDvarStr() , mDvarValue() , mCount(0) @@ -13,23 +11,41 @@ XMultiDef::XMultiDef() SetName("Multi Definition"); } -XMultiDef::~XMultiDef() -{ - -} - void XMultiDef::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); + for (int i = 0; i < 32; i++) + { + XString newListDvar; + newListDvar.ParsePtr(aStream, false); + mDvarList.push_back(newListDvar); + } + for (int i = 0; i < 32; i++) + { + XString newListStr; + newListStr.ParsePtr(aStream, false); + mDvarStr.push_back(newListStr); + } + for (int i = 0; i < 32; i++) + { + mDvarValue.push_back(aStream->ParseSingle(QString("%1 dvar value %2").arg(GetName()).arg(i))); + } + mCount = aStream->ParseInt32(QString("%1 count").arg(GetName())); + mStrDef = aStream->ParseInt32(QString("%1 string def").arg(GetName())); + + for (int i = 0; i < mDvarList.size(); i++) + { + mDvarList[i].ParseDataSafe(aStream); + } + for (int i = 0; i < mDvarStr.size(); i++) + { + mDvarStr[i].ParseDataSafe(aStream); + } - // TODO: Fill in XMultiDef::ParseData } void XMultiDef::Clear() { - mDvarListPtrs.clear(); mDvarList.clear(); - mDvarStrPtrs.clear(); mDvarStr.clear(); mDvarValue.clear(); mCount = 0; diff --git a/libs/xassets/xmultidef.h b/libs/xassets/xmultidef.h index 03b0441..5e0fed7 100644 --- a/libs/xassets/xmultidef.h +++ b/libs/xassets/xmultidef.h @@ -2,6 +2,7 @@ #define XMULTIDEF_H #include "xasset.h" +#include "xstring.h" #include @@ -9,19 +10,17 @@ class XMultiDef : public XAsset { public: explicit XMultiDef(); - ~XMultiDef(); + ~XMultiDef() = default; void ParseData(XDataStream *aStream) override; void Clear() override; private: - QVector mDvarListPtrs; - QStringList mDvarList; - QVector mDvarStrPtrs; - QStringList mDvarStr; + QVector mDvarList; + QVector mDvarStr; QVector mDvarValue; - int mCount; - int mStrDef; + qint32 mCount; + qint32 mStrDef; }; #endif // XMULTIDEF_H diff --git a/libs/xassets/xoperand.cpp b/libs/xassets/xoperand.cpp index 30dd407..24e72f9 100644 --- a/libs/xassets/xoperand.cpp +++ b/libs/xassets/xoperand.cpp @@ -15,9 +15,8 @@ XOperand::~XOperand() void XOperand::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - // TODO: Fill in XOperand::ParseData + mDataType = (XExpDataType)aStream->ParseUInt32(QString("%1 data type").arg(GetName())); + mInternals.ParseData(aStream, mDataType); } void XOperand::Clear() diff --git a/libs/xassets/xoperandinternaldataunion.cpp b/libs/xassets/xoperandinternaldataunion.cpp index 931f22f..cf4fcad 100644 --- a/libs/xassets/xoperandinternaldataunion.cpp +++ b/libs/xassets/xoperandinternaldataunion.cpp @@ -4,7 +4,7 @@ XOperandInternalDataUnion::XOperandInternalDataUnion() : XAsset() , mIntVal(0) , mFloatVal(0.0f) - , mString("") + , mString() { SetName("Operand Internal Data Union"); } @@ -19,9 +19,25 @@ void XOperandInternalDataUnion::ParseData(XDataStream *aStream) aStream->ParseSingle(QString("%1 center of mass x").arg(GetName())); } +void XOperandInternalDataUnion::ParseData(XDataStream *aStream, XExpDataType aDataType) +{ + if (aDataType == VAL_INT) + { + mIntVal = aStream->ParseInt32(QString("%1 int val").arg(GetName())); + } + else if (aDataType == VAL_FLOAT) + { + mFloatVal = aStream->ParseSingle(QString("%1 float val").arg(GetName())); + } + else if (aDataType == VAL_STRING) + { + mString.ParseData(aStream); + } +} + void XOperandInternalDataUnion::Clear() { mIntVal = 0; mFloatVal = 0; - mString.clear(); + mString.Clear(); } diff --git a/libs/xassets/xoperandinternaldataunion.h b/libs/xassets/xoperandinternaldataunion.h index aaae84c..04a68eb 100644 --- a/libs/xassets/xoperandinternaldataunion.h +++ b/libs/xassets/xoperandinternaldataunion.h @@ -2,6 +2,8 @@ #define XOPERANDINTERNALDATAUNION_H #include "xasset.h" +#include "xmenuenums.h" +#include "xstring.h" #include @@ -12,12 +14,13 @@ public: ~XOperandInternalDataUnion(); void ParseData(XDataStream *aStream) override; + void ParseData(XDataStream *aStream, XExpDataType aDataType); void Clear() override; private: int mIntVal; float mFloatVal; - QString mString; + XString mString; }; #endif // XOPERANDINTERNALDATAUNION_H diff --git a/libs/xassets/xpackedtexcoords.cpp b/libs/xassets/xpackedtexcoords.cpp index f8bc4f0..e360550 100644 --- a/libs/xassets/xpackedtexcoords.cpp +++ b/libs/xassets/xpackedtexcoords.cpp @@ -9,14 +9,10 @@ XPackedTexCoords::XPackedTexCoords() void XPackedTexCoords::ParseData(XDataStream *aStream) { - *aStream >> mPacked; - if (IsDebug()) - { - qDebug() << QString("[%1] mPacked = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPacked); - } + mPacked = aStream->ParseUInt32(QString("%1 packed").arg(GetName())); } void XPackedTexCoords::Clear() { - + mPacked = 0; } diff --git a/libs/xassets/xpackedunitvec.cpp b/libs/xassets/xpackedunitvec.cpp index d503448..7430f6b 100644 --- a/libs/xassets/xpackedunitvec.cpp +++ b/libs/xassets/xpackedunitvec.cpp @@ -2,21 +2,20 @@ XPackedUnitVec::XPackedUnitVec() : XAsset() - , mPacked(0) + , mArray() { SetName("Packed Unit Vec"); } void XPackedUnitVec::ParseData(XDataStream *aStream) { - *aStream >> mPacked; - if (IsDebug()) + for (int i = 0; i < 4; i++) { - qDebug() << QString("[%1] mPacked = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mPacked); + mArray.push_back(aStream->ParseInt8(QString("%1 array %2").arg(GetName()).arg(i))); } } void XPackedUnitVec::Clear() { - + mArray.clear(); } diff --git a/libs/xassets/xpackedunitvec.h b/libs/xassets/xpackedunitvec.h index 97db0ae..c64f826 100644 --- a/libs/xassets/xpackedunitvec.h +++ b/libs/xassets/xpackedunitvec.h @@ -12,7 +12,7 @@ public: void Clear() override; private: - quint32 mPacked; + QVector mArray; }; #endif // XPACKEDUNITVEC_H diff --git a/libs/xassets/xphyspreset.cpp b/libs/xassets/xphyspreset.cpp index a839d54..219974c 100644 --- a/libs/xassets/xphyspreset.cpp +++ b/libs/xassets/xphyspreset.cpp @@ -54,7 +54,8 @@ void XPhysPreset::ParseData(XDataStream *aStream) *aStream >> mTempDefaultToCylinder; - mName.ParseData(aStream); + mName.ParseDataSafe(aStream); + SetDisplayName(mName.GetString()); mSndAliasPrefix.ParseData(aStream); } } diff --git a/libs/xassets/xpicmip.cpp b/libs/xassets/xpicmip.cpp new file mode 100644 index 0000000..a1ed048 --- /dev/null +++ b/libs/xassets/xpicmip.cpp @@ -0,0 +1,28 @@ +#include "xpicmip.h" + +XPicmip::XPicmip() + : mPlatform(2) +{ + +} + +void XPicmip::ParseData(XDataStream *aStream) +{ + mPlatform[0] = aStream->ParseUInt8(QString("%1 platform 1").arg(GetName())); + mPlatform[1] = aStream->ParseUInt8(QString("%1 platform 2").arg(GetName())); +} + +void XPicmip::Clear() +{ + mPlatform.clear(); +} + +QVector XPicmip::Platform() const +{ + return mPlatform; +} + +void XPicmip::SetPlatform(const QVector &aPlatform) +{ + mPlatform = aPlatform; +} diff --git a/libs/xassets/xpicmip.h b/libs/xassets/xpicmip.h new file mode 100644 index 0000000..a0b4be8 --- /dev/null +++ b/libs/xassets/xpicmip.h @@ -0,0 +1,21 @@ +#ifndef XPICMIP_H +#define XPICMIP_H + +#include "xasset.h" + +class XPicmip : public XAsset +{ +public: + XPicmip(); + + virtual void ParseData(XDataStream* aStream) override; + virtual void Clear() override; + + QVector Platform() const; + void SetPlatform(const QVector &aPlatform); + +private: + QVector mPlatform; +}; + +#endif // XPICMIP_H diff --git a/libs/xassets/xplatform.h b/libs/xassets/xplatform.h index 6f38a1a..bd8b586 100644 --- a/libs/xassets/xplatform.h +++ b/libs/xassets/xplatform.h @@ -5,12 +5,12 @@ enum XPlatform { - PLATFORM_NONE = 0x00, // No platform - PLATFORM_XBOX = 0x01, // Xbox 360 - PLATFORM_PS3 = 0x02, // Playstation 3 - PLATFORM_PC = 0x03, // PC - PLATFORM_WII = 0x04, // WII - PLATFORM_WIIU = 0x05 // WII U + PLATFORM_NONE = 0, // No platform + PLATFORM_XBOX = 1, // Xbox 360 + PLATFORM_PS3 = 2, // Playstation 3 + PLATFORM_PC = 3, // PC + PLATFORM_WII = 4, // WII + PLATFORM_WIIU = 5 // WII U }; #endif // XPLATFORM_H diff --git a/libs/xassets/xrawfile.cpp b/libs/xassets/xrawfile.cpp index cbe5b8e..dfc54b6 100644 --- a/libs/xassets/xrawfile.cpp +++ b/libs/xassets/xrawfile.cpp @@ -2,7 +2,7 @@ XRawFile::XRawFile() : XAsset() - , mName(new XString()) + , mName() , mLength(0) , mBuffer() { @@ -10,31 +10,16 @@ XRawFile::XRawFile() SetName("Raw File"); } -XRawFile::~XRawFile() +void XRawFile::SetRawFileName(const XString& aName) { - delete mName; -} - -void XRawFile::SetName(XString* aName) -{ - if (aName == nullptr) - { - return; - } - mName = aName; } -void XRawFile::SetName(const QString& aName) +void XRawFile::SetRawFileName(const QString& aName) { - if (mName == nullptr) - { - mName = new XString(); - } - - mName->SetString(aName); + mName.SetString(aName); } -XString* XRawFile::Name() const +XString XRawFile::GetRawFileName() const { return mName; } @@ -63,7 +48,7 @@ QByteArray XRawFile::Buffer() const void XRawFile::Clear() { - mName->Clear(); + mName.Clear(); mLength = 0; mBuffer = QByteArray(); @@ -72,18 +57,15 @@ void XRawFile::Clear() void XRawFile::ParseData(XDataStream *aStream) { - mName->ParsePtr(aStream, false); + mName.ParsePtr(aStream, false); qint32 bufferPtr; *aStream >> mLength >> bufferPtr; - if (mName == nullptr) - { - mName = new XString(); - } - mName->ParseData(aStream); + mName.ParseDataSafe(aStream); + SetDisplayName(mName.GetString()); if (bufferPtr) { diff --git a/libs/xassets/xrawfile.h b/libs/xassets/xrawfile.h index 9b11916..fa8a39e 100644 --- a/libs/xassets/xrawfile.h +++ b/libs/xassets/xrawfile.h @@ -8,11 +8,10 @@ class XRawFile : public XAsset { public: XRawFile(); - ~XRawFile(); - void SetName(XString* aName = nullptr); - void SetName(const QString& aName); - XString* Name() const; + void SetRawFileName(const XString& aName); + void SetRawFileName(const QString& aName); + XString GetRawFileName() const; void SetLength(int aLength); int Length() const; @@ -24,7 +23,7 @@ public: virtual void ParseData(XDataStream *aStream) override; private: - XString* mName; + XString mName; quint32 mLength; QByteArray mBuffer; }; diff --git a/libs/xassets/xrigidvertlist.cpp b/libs/xassets/xrigidvertlist.cpp index 8345854..8cbe481 100644 --- a/libs/xassets/xrigidvertlist.cpp +++ b/libs/xassets/xrigidvertlist.cpp @@ -11,41 +11,72 @@ XRigidVertList::XRigidVertList() SetName("Rigid Vertex List"); } -XRigidVertList::~XRigidVertList() -{ - -} - void XRigidVertList::ParseData(XDataStream *aStream) { - *aStream >> mBoneOffset; - if (IsDebug()) - { - qDebug() << QString("[%1] mBoneOffset = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mBoneOffset); - } + mBoneOffset = aStream->ParseUInt16(QString("%1 bone offset").arg(GetName())); + mVertCount = aStream->ParseUInt16(QString("%1 vertex count").arg(GetName())); + mTriOffset = aStream->ParseUInt16(QString("%1 tri offset").arg(GetName())); + mTriCount = aStream->ParseUInt16(QString("%1 tri count").arg(GetName())); - *aStream >> mVertCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mVertCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mVertCount); - } - - *aStream >> mTriOffset; - if (IsDebug()) - { - qDebug() << QString("[%1] mTriOffset = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mTriOffset); - } - - *aStream >> mTriCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mTriCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mTriCount); - } - - mCollisionTree.ParsePtr(aStream); + mCollisionTree.ParsePtr(aStream, false); } void XRigidVertList::Clear() { - + mBoneOffset = 0; + mVertCount = 0; + mTriOffset = 0; + mTriCount = 0; + + mCollisionTree.Clear(); +} + +quint16 XRigidVertList::BoneOffset() const +{ + return mBoneOffset; +} + +void XRigidVertList::SetBoneOffset(quint16 aBoneOffset) +{ + mBoneOffset = aBoneOffset; +} + +quint16 XRigidVertList::VertCount() const +{ + return mVertCount; +} + +void XRigidVertList::SetVertCount(quint16 aVertCount) +{ + mVertCount = aVertCount; +} + +quint16 XRigidVertList::TriOffset() const +{ + return mTriOffset; +} + +void XRigidVertList::SetTriOffset(quint16 aTriOffset) +{ + mTriOffset = aTriOffset; +} + +quint16 XRigidVertList::TriCount() const +{ + return mTriCount; +} + +void XRigidVertList::SetTriCount(quint16 aTriCount) +{ + mTriCount = aTriCount; +} + +XSurfaceCollisionTree XRigidVertList::CollisionTree() const +{ + return mCollisionTree; +} + +void XRigidVertList::SetCollisionTree(const XSurfaceCollisionTree &aCollisionTree) +{ + mCollisionTree = aCollisionTree; } diff --git a/libs/xassets/xrigidvertlist.h b/libs/xassets/xrigidvertlist.h index 1588866..721dfc4 100644 --- a/libs/xassets/xrigidvertlist.h +++ b/libs/xassets/xrigidvertlist.h @@ -7,12 +7,22 @@ class XRigidVertList : public XAsset { public: - explicit XRigidVertList(); - ~XRigidVertList(); + explicit XRigidVertList();; void ParseData(XDataStream *aStream) override; void Clear() override; + quint16 BoneOffset() const; + void SetBoneOffset(quint16 aBoneOffset); + quint16 VertCount() const; + void SetVertCount(quint16 aVertCount); + quint16 TriOffset() const; + void SetTriOffset(quint16 aTriOffset); + quint16 TriCount() const; + void SetTriCount(quint16 aTriCount); + XSurfaceCollisionTree CollisionTree() const; + void SetCollisionTree(const XSurfaceCollisionTree &aCollisionTree); + private: quint16 mBoneOffset; quint16 mVertCount; diff --git a/libs/xassets/xscriptstringlist.cpp b/libs/xassets/xscriptstringlist.cpp index 6558cbb..b76797d 100644 --- a/libs/xassets/xscriptstringlist.cpp +++ b/libs/xassets/xscriptstringlist.cpp @@ -48,6 +48,9 @@ void XScriptStringList::ParsePtr(XDataStream *aStream, bool aDataFlag) *aStream >> mCount >> stringsPtr; + + mCount--; + if (mDebug) { // Always treat as unsigned when displaying in hex @@ -68,3 +71,23 @@ void XScriptStringList::ParsePtr(XDataStream *aStream, bool aDataFlag) ParseData(aStream); } } + +int XScriptStringList::Count() const +{ + return mCount; +} + +void XScriptStringList::SetCount(int aCount) +{ + mCount = aCount; +} + +QVector XScriptStringList::ScriptStrings() const +{ + return mScriptStrings; +} + +void XScriptStringList::SetScriptStrings(const QVector &aScriptStrings) +{ + mScriptStrings = aScriptStrings; +} diff --git a/libs/xassets/xscriptstringlist.h b/libs/xassets/xscriptstringlist.h index ab23a51..ee4ee87 100644 --- a/libs/xassets/xscriptstringlist.h +++ b/libs/xassets/xscriptstringlist.h @@ -17,6 +17,11 @@ public: virtual void ParseData(XDataStream *aStream) override; virtual void ParsePtr(XDataStream *aStream, bool aDataFlag = true) override; + int Count() const; + void SetCount(int aCount); + QVector ScriptStrings() const; + void SetScriptStrings(const QVector &aScriptStrings); + private: int mCount; QVector mScriptStrings; diff --git a/libs/xassets/xsoundaliaslist.cpp b/libs/xassets/xsoundaliaslist.cpp index 9002120..5e0c84e 100644 --- a/libs/xassets/xsoundaliaslist.cpp +++ b/libs/xassets/xsoundaliaslist.cpp @@ -10,11 +10,6 @@ XSoundAliasList::XSoundAliasList() SetName("Sound Alias List"); } -XSoundAliasList::~XSoundAliasList() -{ - -} - void XSoundAliasList::Clear() { mAliasName.Clear(); diff --git a/libs/xassets/xsoundaliaslist.h b/libs/xassets/xsoundaliaslist.h index f574848..cdda7a5 100644 --- a/libs/xassets/xsoundaliaslist.h +++ b/libs/xassets/xsoundaliaslist.h @@ -8,7 +8,7 @@ class XSoundAliasList : public XAsset { public: explicit XSoundAliasList(); - ~XSoundAliasList(); + ~XSoundAliasList() = default; virtual void Clear() override; virtual void ParseData(XDataStream* aStream) override; diff --git a/libs/xassets/xsoundcurve.cpp b/libs/xassets/xsoundcurve.cpp index 5f20a7c..44cd668 100644 --- a/libs/xassets/xsoundcurve.cpp +++ b/libs/xassets/xsoundcurve.cpp @@ -57,12 +57,13 @@ void XSoundCurve::ParseData(XDataStream *aStream) for (int i = 0; i < 8; i++) { + mKnots.push_back(QVector()); for (int j = 0; j < 2; j++) { float knot; *aStream >> knot; - mKnots[i][j] = knot; + mKnots[i].push_back(knot); } } } diff --git a/libs/xassets/xsounddriverglobals.cpp b/libs/xassets/xsounddriverglobals.cpp index e0995ba..99f0cec 100644 --- a/libs/xassets/xsounddriverglobals.cpp +++ b/libs/xassets/xsounddriverglobals.cpp @@ -30,5 +30,6 @@ void XSoundDriverGlobals::ParseData(XDataStream* aStream) mAudioReverbSettings->ParseData(aStream); mName->ParseData(aStream); + SetDisplayName(mName->GetString()); } } diff --git a/libs/xassets/xstatement.cpp b/libs/xassets/xstatement.cpp index 38c82d4..4509f05 100644 --- a/libs/xassets/xstatement.cpp +++ b/libs/xassets/xstatement.cpp @@ -11,18 +11,7 @@ XStatement::XStatement() void XStatement::ParseData(XDataStream *aStream) { mNumEntries = aStream->ParseInt32(QString("%1 # entries").arg(GetName())); - - 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); - } - } + mEntriesPtr = aStream->ParseInt32(QString("%1 entries ptr").arg(GetName())); } void XStatement::Clear() @@ -30,3 +19,38 @@ void XStatement::Clear() mNumEntries = 0; mEntries.clear(); } + +qint32 XStatement::NumEntries() const +{ + return mNumEntries; +} + +void XStatement::SetNumEntries(qint32 aNumEntries) +{ + mNumEntries = aNumEntries; +} + +qint32 XStatement::EntriesPtr() const +{ + return mEntriesPtr; +} + +void XStatement::SetEntriesPtr(qint32 aEntriesPtr) +{ + mEntriesPtr = aEntriesPtr; +} + +QVector XStatement::Entries() const +{ + return mEntries; +} + +void XStatement::AddEntry(const XExpressionEntry& aEntry) +{ + mEntries.push_back(aEntry); +} + +void XStatement::SetEntries(const QVector &aEntries) +{ + mEntries = aEntries; +} diff --git a/libs/xassets/xstatement.h b/libs/xassets/xstatement.h index c75b61b..674bb73 100644 --- a/libs/xassets/xstatement.h +++ b/libs/xassets/xstatement.h @@ -15,8 +15,17 @@ public: void ParseData(XDataStream *aStream) override; void Clear() override; + qint32 NumEntries() const; + void SetNumEntries(qint32 aNumEntries); + qint32 EntriesPtr() const; + void SetEntriesPtr(qint32 aEntriesPtr); + QVector Entries() const; + void SetEntries(const QVector &aEntries); + + void AddEntry(const XExpressionEntry &aEntry); private: qint32 mNumEntries; + qint32 mEntriesPtr; QVector mEntries; }; diff --git a/libs/xassets/xstreamfilenameraw.cpp b/libs/xassets/xstreamfilenameraw.cpp index 5530a73..66712fe 100644 --- a/libs/xassets/xstreamfilenameraw.cpp +++ b/libs/xassets/xstreamfilenameraw.cpp @@ -14,7 +14,7 @@ void XStreamFileNameRaw::ParseData(XDataStream *aStream) mName.ParsePtr(aStream, false); mDir.ParseData(aStream); - mName.ParseData(aStream); + mName.ParseDataSafe(aStream); } void XStreamFileNameRaw::Clear() diff --git a/libs/xassets/xstring.cpp b/libs/xassets/xstring.cpp index 2507d6f..16f7025 100644 --- a/libs/xassets/xstring.cpp +++ b/libs/xassets/xstring.cpp @@ -21,11 +21,6 @@ XString::XString(const QString aString) SetName("String"); } -XString::~XString() -{ - -} - QString XString::GetString() const { return mString; @@ -83,27 +78,24 @@ void XString::Clear() void XString::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) + if (mContentLength == -1) { - if (mContentLength == -1) - { - mString = ParseCustom(aStream); - } - else if (mContentLength != 0) - { - QByteArray rawString(mContentLength, Qt::Uninitialized); - aStream->readRawData(rawString.data(), mContentLength); - mString = QString::fromUtf8(rawString); - } + mString = ParseCustom(aStream); + } + else if (mContentLength != 0) + { + QByteArray rawString(mContentLength, Qt::Uninitialized); + aStream->readRawData(rawString.data(), mContentLength); + mString = QString::fromUtf8(rawString); + } - if (!mRemoveString.isEmpty()) - { - mString = mString.replace(mRemoveString, ""); - } + if (!mRemoveString.isEmpty()) + { + mString = mString.replace(mRemoveString, ""); + } - if (IsDebug()) - { - qDebug() << QString("[%1] mString = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mString); - } + if (IsDebug()) + { + qDebug() << QString("[%1] mString = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mString); } } diff --git a/libs/xassets/xstring.h b/libs/xassets/xstring.h index efd2ef9..129e71e 100644 --- a/libs/xassets/xstring.h +++ b/libs/xassets/xstring.h @@ -12,7 +12,7 @@ class XString : public XAsset public: XString(); XString(const QString aString); - virtual ~XString() override; + ~XString() = default; void SetString(const QString& aString); QString GetString() const; diff --git a/libs/xassets/xstringtable.cpp b/libs/xassets/xstringtable.cpp index 8747aac..e28234b 100644 --- a/libs/xassets/xstringtable.cpp +++ b/libs/xassets/xstringtable.cpp @@ -22,7 +22,7 @@ XStringTable::~XStringTable() } } -void XStringTable::SetName(XString *aName) { +void XStringTable::SetStringTableName(XString *aName) { if (aName == nullptr) { return; @@ -31,11 +31,11 @@ void XStringTable::SetName(XString *aName) { mName = aName; } -void XStringTable::SetName(const QString aName) { +void XStringTable::SetStringTableName(const QString aName) { mName->SetString(aName); } -XString *XStringTable::GetName() const { +XString *XStringTable::StringTableName() const { return mName; } @@ -90,6 +90,7 @@ void XStringTable::ParseData(XDataStream *aStream) { >> valuesPtr; mName->ParseData(aStream); + SetDisplayName(mName->GetString()); if (valuesPtr) { mValues = XString::ParseArray(aStream, mRowCount * mColumnCount); diff --git a/libs/xassets/xstringtable.h b/libs/xassets/xstringtable.h index 515e2a0..26954f5 100644 --- a/libs/xassets/xstringtable.h +++ b/libs/xassets/xstringtable.h @@ -10,7 +10,7 @@ public: explicit XStringTable(); ~XStringTable(); - XString* GetName() const; + XString* StringTableName() const; XStringArray* GetValues() const; int GetColumnCount() const; int GetRowCount() const; @@ -19,8 +19,8 @@ public: virtual void Clear() override; public slots: - void SetName(QString aName); - void SetName(XString* aName); + void SetStringTableName(QString aName); + void SetStringTableName(XString* aName); void SetValues(XStringArray *aValues); void SetColumnCount(int aColumnCount); void SetRowCount(int aRowCount); diff --git a/libs/xassets/xsunflare.cpp b/libs/xassets/xsunflare.cpp index 0d31c82..c52145a 100644 --- a/libs/xassets/xsunflare.cpp +++ b/libs/xassets/xsunflare.cpp @@ -35,39 +35,44 @@ XSunFlare::~XSunFlare() void XSunFlare::ParseData(XDataStream *aStream) { - *aStream - >> mHasValidData; + mHasValidData = aStream->ParseUInt8(QString("%1 has valid data").arg(GetName())); aStream->skipRawData(3); mSpriteMaterial.ParsePtr(aStream, false); mFlareMaterial.ParsePtr(aStream, false); - *aStream - >> mSpriteSize - >> mFlareMinSize - >> mFlareMinDot - >> mFlareMaxSize - >> mFlareMaxDot - >> mFlareMaxAlpha - >> mFlareFadeInTime - >> mFlareFadeOutTime - >> mBlindMinDot - >> mBlindMaxDot - >> mBlindMaxDarken - >> mBlindFadeInTime - >> mBlindFadeOutTime - >> mGlareMinDot - >> mGlareMaxDot - >> mGlareMaxLighten - >> mGlareFadeInTime - >> mGlareFadeOutTime - >> mSunFxPosition[0] - >> mSunFxPosition[1] - >> mSunFxPosition[2]; + mSpriteSize = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + mFlareMinSize = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + mFlareMinDot = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + mFlareMaxSize = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + mFlareMaxDot = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + mFlareMaxAlpha = aStream->ParseSingle(QString("%1 radius").arg(GetName())); - mSpriteMaterial.ParseData(aStream); - mFlareMaterial.ParseData(aStream); + mFlareFadeInTime = aStream->ParseInt32(QString("%1 radius").arg(GetName())); + mFlareFadeOutTime = aStream->ParseInt32(QString("%1 radius").arg(GetName())); + + mBlindMinDot = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + mBlindMaxDot = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + mBlindMaxDarken = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + + mBlindFadeInTime = aStream->ParseInt32(QString("%1 radius").arg(GetName())); + mBlindFadeInTime = aStream->ParseInt32(QString("%1 radius").arg(GetName())); + + mGlareMinDot = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + mGlareMaxDot = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + mGlareMaxLighten = aStream->ParseSingle(QString("%1 radius").arg(GetName())); + + mGlareFadeInTime = aStream->ParseInt32(QString("%1 radius").arg(GetName())); + mGlareFadeOutTime = aStream->ParseInt32(QString("%1 radius").arg(GetName())); + + for (int i = 0; i < 3; i++) + { + mSunFxPosition[i] = aStream->ParseSingle(QString("%1 sun fx position %2").arg(GetName()).arg(i)); + } + + mSpriteMaterial.ParseDataSafe(aStream); + mFlareMaterial.ParseDataSafe(aStream); } void XSunFlare::Clear() diff --git a/libs/xassets/xsunflare.h b/libs/xassets/xsunflare.h index d5c42e4..d35b84d 100644 --- a/libs/xassets/xsunflare.h +++ b/libs/xassets/xsunflare.h @@ -25,18 +25,18 @@ private: float mFlareMaxSize; float mFlareMaxDot; float mFlareMaxAlpha; - int mFlareFadeInTime; - int mFlareFadeOutTime; + qint32 mFlareFadeInTime; + qint32 mFlareFadeOutTime; float mBlindMinDot; float mBlindMaxDot; float mBlindMaxDarken; - int mBlindFadeInTime; - int mBlindFadeOutTime; + qint32 mBlindFadeInTime; + qint32 mBlindFadeOutTime; float mGlareMinDot; float mGlareMaxDot; float mGlareMaxLighten; - int mGlareFadeInTime; - int mGlareFadeOutTime; + qint32 mGlareFadeInTime; + qint32 mGlareFadeOutTime; QVector3D mSunFxPosition; }; diff --git a/libs/xassets/xsurface.cpp b/libs/xassets/xsurface.cpp index 7db1fb3..3d16d5e 100644 --- a/libs/xassets/xsurface.cpp +++ b/libs/xassets/xsurface.cpp @@ -6,103 +6,79 @@ XSurface::XSurface() , mDeformed(false) , mVertCount(0) , mTriCount(0) - , mTriIndices(0) + , mTriIndices() , mVertInfo() , mVert() - , mVertBuffer() , mVertListCount(0) , mVertList() - , mIndexBuffer() - , mPartBits(4) + , mPartBits() { SetName("Surface"); } -XSurface::~XSurface() -{ - -} - void XSurface::ParseData(XDataStream *aStream) { - *aStream >> mTileMode; - if (IsDebug()) - { - qDebug() << QString("[%1] mTileMode = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mTileMode); - } + mTileMode = aStream->ParseUInt8(QString("%1 tile mode").arg(GetName())); + mDeformed = aStream->ParseUInt8(QString("%1 deformed").arg(GetName())); - *aStream >> mDeformed; - if (IsDebug()) - { - qDebug() << QString("[%1] mDeformed = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mDeformed); - } + mVertCount = aStream->ParseUInt16(QString("%1 vertex count").arg(GetName())); + mTriCount = aStream->ParseUInt16(QString("%1 tri count").arg(GetName())); - *aStream >> mVertCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mVertCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mVertCount); - } + mZoneHandle = aStream->ParseInt8(QString("%1 zone handle").arg(GetName())); - *aStream >> mTriCount; - if (IsDebug()) - { - qDebug() << QString("[%1] mTriCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mTriCount); - } + aStream->skipRawData(1); - aStream->skipRawData(2); + mBaseTriIndex = aStream->ParseUInt16(QString("%1 base tri index").arg(GetName())); + mBaseVertIndex = aStream->ParseUInt16(QString("%1 base vertex index").arg(GetName())); - qint32 triIndicesPtr; - *aStream >> triIndicesPtr; - if (IsDebug()) - { - qDebug() << QString("[%1] triIndicesPtr = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(triIndicesPtr); - } + mTriIndices.ParsePtr(aStream, false); - mVertInfo.SetPtr(-1); mVertInfo.ParseData(aStream); mVert.ParsePtr(aStream, false); - mVertBuffer.ParseData(aStream); - *aStream >> mVertListCount; - if (IsDebug()) + mVertListCount = aStream->ParseUInt32(QString("%1 vertex list count").arg(GetName())); + + qint32 vertListPtr = aStream->ParseInt32(QString("%1 vert list ptr").arg(GetName())); + + for (int i = 0; i < 4; i++) { - qDebug() << QString("[%1] mVertListCount = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mVertListCount); + mPartBits.push_back(aStream->ParseInt32(QString("%1 part bits %2").arg(GetName()).arg(i))); } - mVertList.ParseData(aStream); - mIndexBuffer.ParseData(aStream); + mVert.ParseDataSafe(aStream); - *aStream - >> mPartBits[0] - >> mPartBits[1] - >> mPartBits[2] - >> mPartBits[3]; - if (IsDebug()) + if (vertListPtr == -1) { - qDebug() << QString("[%1] mPartBits = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(*mPartBits.data()); - } - - //mVertInfo.ParseData(aStream); - mVert.ParseData(aStream); - mVertBuffer.ParseData(aStream); - //mVertList.ParseData(aStream); - - if (triIndicesPtr == -1) - { - for (int i = 0; i < mTriCount; i++) + for (int i = 0; i < mVertListCount; i++) { - quint16 newTri; - *aStream >> newTri; - if (IsDebug()) - { - qDebug() << QString("[%1] newTri = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(newTri); - } - mTriIndices.append(newTri); + XRigidVertList newVertList; + newVertList.ParseData(aStream); + mVertList.push_back(newVertList); + } + for (int i = 0; i < mVertList.size(); i++) + { + auto collTree = mVertList[i].CollisionTree(); + collTree.ParseDataSafe(aStream); + mVertList[i].SetCollisionTree(collTree); } } + + mTriIndices.ParseDataSafe(aStream); } void XSurface::Clear() { - + mTileMode = 0; + mDeformed = false; + mVertCount = 0; + mTriCount = 0; + mZoneHandle = 0; + mBaseTriIndex = 0; + mBaseVertIndex = 0; + mTriIndices.Clear(); + mVertInfo.Clear(); + mVert.Clear(); + mVertListCount = 0; + mVertList.clear(); + mPartBits.clear(); } diff --git a/libs/xassets/xsurface.h b/libs/xassets/xsurface.h index 1d957cf..6297cd9 100644 --- a/libs/xassets/xsurface.h +++ b/libs/xassets/xsurface.h @@ -2,17 +2,15 @@ #define XSURFACE_H #include "xasset.h" -#include "xd3dindexbuffer.h" #include "xrigidvertlist.h" +#include "xsurfacetri.h" #include "xsurfacevertexinfo.h" #include "xgfxpackedvertex.h" -#include "xd3dvertexbuffer.h" class XSurface : public XAsset { public: explicit XSurface(); - ~XSurface(); void ParseData(XDataStream *aStream) override; void Clear() override; @@ -22,14 +20,15 @@ private: bool mDeformed; quint16 mVertCount; quint16 mTriCount; - QVector mTriIndices; + qint8 mZoneHandle; + quint16 mBaseTriIndex; + quint16 mBaseVertIndex; + XSurfaceTri mTriIndices; XSurfaceVertexInfo mVertInfo; XGfxPackedVertex mVert; - XD3DVertexBuffer mVertBuffer; quint32 mVertListCount; - XRigidVertList mVertList; - XD3DIndexBuffer mIndexBuffer; - QVector mPartBits; + QVector mVertList; + QVector mPartBits; }; #endif // XSURFACE_H diff --git a/libs/xassets/xsurfacecollisionaabb.cpp b/libs/xassets/xsurfacecollisionaabb.cpp index 4d6973b..f94dc57 100644 --- a/libs/xassets/xsurfacecollisionaabb.cpp +++ b/libs/xassets/xsurfacecollisionaabb.cpp @@ -2,24 +2,26 @@ XSurfaceCollisionAabb::XSurfaceCollisionAabb() : XAsset() - , mMins(3) - , mMaxs(3) + , mMins(0) + , mMaxs(0) { SetName("Surface Collision AABB"); } void XSurfaceCollisionAabb::ParseData(XDataStream *aStream) { - *aStream - >> mMins[0] - >> mMins[1] - >> mMins[2] - >> mMaxs[0] - >> mMaxs[1] - >> mMaxs[2]; + for (int i = 0; i < 3; i++) + { + mMins.push_back(aStream->ParseUInt16(QString("%1 min %2").arg(GetName()).arg(i))); + } + for (int i = 0; i < 3; i++) + { + mMaxs.push_back(aStream->ParseUInt16(QString("%1 max %2").arg(GetName()).arg(i))); + } } void XSurfaceCollisionAabb::Clear() { - + mMins.clear(); + mMaxs.clear(); } diff --git a/libs/xassets/xsurfacecollisionleaf.cpp b/libs/xassets/xsurfacecollisionleaf.cpp index e8a14e0..34f33dc 100644 --- a/libs/xassets/xsurfacecollisionleaf.cpp +++ b/libs/xassets/xsurfacecollisionleaf.cpp @@ -9,7 +9,7 @@ XSurfaceCollisionLeaf::XSurfaceCollisionLeaf() void XSurfaceCollisionLeaf::ParseData(XDataStream *aStream) { - *aStream >> mTriangleBeginIndex; + mTriangleBeginIndex = aStream->ParseUInt16(QString("%1 triangle collision leaf").arg(GetName())); } void XSurfaceCollisionLeaf::Clear() diff --git a/libs/xassets/xsurfacecollisionnode.cpp b/libs/xassets/xsurfacecollisionnode.cpp index 764efe7..de4637b 100644 --- a/libs/xassets/xsurfacecollisionnode.cpp +++ b/libs/xassets/xsurfacecollisionnode.cpp @@ -13,9 +13,8 @@ void XSurfaceCollisionNode::ParseData(XDataStream *aStream) { mAABB.ParseData(aStream); - *aStream - >> mChildBeginIndex - >> mChildCount; + mChildBeginIndex = aStream->ParseUInt16(QString("%1 child begin index").arg(GetName())); + mChildCount = aStream->ParseUInt16(QString("%1 child count").arg(GetName())); } void XSurfaceCollisionNode::Clear() diff --git a/libs/xassets/xsurfacecollisiontree.cpp b/libs/xassets/xsurfacecollisiontree.cpp index 3dedccd..9c052b7 100644 --- a/libs/xassets/xsurfacecollisiontree.cpp +++ b/libs/xassets/xsurfacecollisiontree.cpp @@ -14,28 +14,18 @@ XSurfaceCollisionTree::XSurfaceCollisionTree() void XSurfaceCollisionTree::ParseData(XDataStream *aStream) { - quint32 rawTrans; - *aStream >> rawTrans; - memcpy(&mTrans[0], &rawTrans, sizeof(mTrans[0])); - *aStream >> rawTrans; - memcpy(&mTrans[1], &rawTrans, sizeof(mTrans[1])); - *aStream >> rawTrans; - memcpy(&mTrans[2], &rawTrans, sizeof(mTrans[2])); + mTrans.setX(aStream->ParseSingle(QString("%1 transformation x").arg(GetName()))); + mTrans.setY(aStream->ParseSingle(QString("%1 transformation y").arg(GetName()))); + mTrans.setZ(aStream->ParseSingle(QString("%1 transformation z").arg(GetName()))); - quint32 rawScale; - *aStream >> rawScale; - memcpy(&mScale[0], &rawScale, sizeof(mScale[0])); - *aStream >> rawScale; - memcpy(&mScale[1], &rawScale, sizeof(mScale[1])); - *aStream >> rawScale; - memcpy(&mScale[2], &rawScale, sizeof(mScale[2])); + mScale.setX(aStream->ParseSingle(QString("%1 scale x").arg(GetName()))); + mScale.setY(aStream->ParseSingle(QString("%1 scale y").arg(GetName()))); + mScale.setZ(aStream->ParseSingle(QString("%1 scale z").arg(GetName()))); - qint32 nodesPtr, leafsPtr; - *aStream - >> mNodeCount - >> nodesPtr - >> mLeafCount - >> leafsPtr; + mNodeCount = aStream->ParseUInt32(QString("%1 node count").arg(GetName())); + qint32 nodesPtr = aStream->ParseInt32(QString("%1 nodes ptr").arg(GetName())); + mLeafCount = aStream->ParseUInt32(QString("%1 leaf count").arg(GetName())); + qint32 leafsPtr = aStream->ParseInt32(QString("%1 leafs ptr").arg(GetName())); if (nodesPtr) { @@ -43,7 +33,7 @@ void XSurfaceCollisionTree::ParseData(XDataStream *aStream) { XSurfaceCollisionNode newNode; newNode.ParseData(aStream); - mNodes.append(newNode); + mNodes.push_back(newNode); } } if (leafsPtr) @@ -52,12 +42,23 @@ void XSurfaceCollisionTree::ParseData(XDataStream *aStream) { XSurfaceCollisionLeaf newLeaf; newLeaf.ParseData(aStream); - mLeafs.append(newLeaf); + mLeafs.push_back(newLeaf); + } + + // TODO: Figure out if this is necessary + if (mLeafCount % 2 != 0) + { + //aStream->skipRawData(2); } } } void XSurfaceCollisionTree::Clear() { - + mTrans = QVector3D(); + mScale = QVector3D(); + mNodeCount = 0; + mNodes.clear(); + mLeafCount = 0; + mLeafs.clear(); } diff --git a/libs/xassets/xsurfacetri.cpp b/libs/xassets/xsurfacetri.cpp new file mode 100644 index 0000000..bb0e895 --- /dev/null +++ b/libs/xassets/xsurfacetri.cpp @@ -0,0 +1,21 @@ +#include "xsurfacetri.h" + +XSurfaceTri::XSurfaceTri() + : XAsset() + , mData() +{ + SetName("Surface Triangle"); +} + +void XSurfaceTri::ParseData(XDataStream *aStream) +{ + for (int i = 0; i < 3; i++) + { + mData.push_back(aStream->ParseUInt16(QString("%1 surface tri %2").arg(GetName()).arg(i))); + } +} + +void XSurfaceTri::Clear() +{ + mData.clear(); +} diff --git a/libs/xassets/xsurfacetri.h b/libs/xassets/xsurfacetri.h new file mode 100644 index 0000000..f27eb72 --- /dev/null +++ b/libs/xassets/xsurfacetri.h @@ -0,0 +1,18 @@ +#ifndef XSURFACETRI_H +#define XSURFACETRI_H + +#include "xasset.h" + +class XSurfaceTri : public XAsset +{ +public: + explicit XSurfaceTri(); + + void ParseData(XDataStream *aStream) override; + void Clear() override; + +private: + QVector mData; +}; + +#endif // XSURFACETRI_H diff --git a/libs/xassets/xsurfacevertexinfo.cpp b/libs/xassets/xsurfacevertexinfo.cpp index 7968b63..62a8f47 100644 --- a/libs/xassets/xsurfacevertexinfo.cpp +++ b/libs/xassets/xsurfacevertexinfo.cpp @@ -2,7 +2,7 @@ XSurfaceVertexInfo::XSurfaceVertexInfo() : XAsset() - , mVertCount(4) + , mVertCount() , mVertsBlend() { SetName("Surface Vertex Info"); @@ -10,54 +10,27 @@ XSurfaceVertexInfo::XSurfaceVertexInfo() void XSurfaceVertexInfo::ParseData(XDataStream *aStream) { - if (GetPtr() == -1) + for (int i = 0; i < 4; i++) { - *aStream >> mVertCount[0]; + mVertCount.push_back(aStream->ParseInt16(QString("%1 vertex count %2").arg(GetName()).arg(i))); + } + + qint32 vertsBlendPtr = aStream->ParseInt32(QString("%1 vertices blend ptr").arg(GetName())); + if (vertsBlendPtr == -1) + { + int vertBlendSize = 2 * (mVertCount[0] + 3 * mVertCount[1] + 5 * mVertCount[2] + 7 * mVertCount[3]); + mVertsBlend = QByteArray(vertBlendSize, Qt::Uninitialized); + aStream->readRawData(mVertsBlend.data(), vertBlendSize); + if (IsDebug()) { - qDebug() << QString("[%1] mVertCount[0] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mVertCount[0]); - } - - *aStream >> mVertCount[1]; - if (IsDebug()) - { - qDebug() << QString("[%1] mVertCount[1] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mVertCount[1]); - } - - *aStream >> mVertCount[2]; - if (IsDebug()) - { - qDebug() << QString("[%1] mVertCount[2] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mVertCount[2]); - } - - *aStream >> mVertCount[3]; - if (IsDebug()) - { - qDebug() << QString("[%1] mVertCount[3] = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mVertCount[3]); - } - - qint32 vertsBlendPtr; - *aStream >> vertsBlendPtr; - if (IsDebug()) - { - qDebug() << QString("[%1] vertsBlendPtr = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(vertsBlendPtr); - } - - - if (vertsBlendPtr == -1) - { - aStream->readRawData(mVertsBlend.data(), 2 * (mVertCount[0] + 3 * mVertCount[1] + 5 * mVertCount[2] + 7 * mVertCount[3])); - - if (IsDebug()) - { - qDebug() << QString("[%1] mVertsBlend = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mVertsBlend); - } - + qDebug() << QString("[%1] vertices blend = %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(mVertsBlend); } } } void XSurfaceVertexInfo::Clear() { - + mVertCount.clear(); + mVertsBlend.clear(); } diff --git a/libs/xassets/xweapondef.cpp b/libs/xassets/xweapondef.cpp index 8861085..0e9d596 100644 --- a/libs/xassets/xweapondef.cpp +++ b/libs/xassets/xweapondef.cpp @@ -17,6 +17,8 @@ void XWeaponDef::ParseData(XDataStream *aStream) { mInternalName = XString::ParseCustom(aStream); mDisplayName = XString::ParseCustom(aStream); mOverlayName = XString::ParseCustom(aStream); + + SetDisplayName(mInternalName); } } diff --git a/libs/xassets/xwindowdef.cpp b/libs/xassets/xwindowdef.cpp index 077fdba..4961855 100644 --- a/libs/xassets/xwindowdef.cpp +++ b/libs/xassets/xwindowdef.cpp @@ -2,7 +2,7 @@ XWindowDef::XWindowDef() : XAsset() - , mName() + , mWindowName() , mRect() , mRectClient() , mGroup() @@ -12,7 +12,7 @@ XWindowDef::XWindowDef() , mOwnerDrawFlags(0) , mBorderSize(0.0f) , mStaticFlags(0) - , mDynamicFlags(4) + , mDynamicFlags() , mNextTime(0) , mForeColor() , mBackColor() @@ -30,9 +30,7 @@ XWindowDef::~XWindowDef() void XWindowDef::ParseData(XDataStream *aStream) { - Q_UNUSED(aStream); - - mName.ParsePtr(aStream, false); + mWindowName.ParsePtr(aStream, false); mRect.ParseData(aStream); mRectClient.ParseData(aStream); @@ -46,9 +44,9 @@ void XWindowDef::ParseData(XDataStream *aStream) 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++) + for (int i = 0; i < 1; i++) { - mDynamicFlags[i] = aStream->ParseInt32(QString("%1 dynamic flag %2").arg(GetName()).arg(i)); + mDynamicFlags.push_back(aStream->ParseInt32(QString("%1 dynamic flag %2").arg(GetName()).arg(i))); } mNextTime = aStream->ParseInt32(QString("%1 next time").arg(GetName())); @@ -79,16 +77,13 @@ void XWindowDef::ParseData(XDataStream *aStream) a = aStream->ParseSingle(QString("%1 outline alpha").arg(GetName())); mOutlineColor = QColor(r, g, b, a); + mBackground.SetCommonInfo(GetCommonInfo()); mBackground.ParsePtr(aStream, false); - - mName.ParseData(aStream); - mGroup.ParseData(aStream); - mBackground.ParseData(aStream); } void XWindowDef::Clear() { - mName.Clear(); + mWindowName.Clear(); mRect.Clear(); mRectClient.Clear(); mGroup.Clear(); @@ -106,3 +101,173 @@ void XWindowDef::Clear() mOutlineColor = QColor(); mBackground.Clear(); } + +XString XWindowDef::WindowName() const +{ + return mWindowName; +} + +void XWindowDef::SetWindowName(const XString &aWindowName) +{ + mWindowName = aWindowName; +} + +XRectDef XWindowDef::Rect() const +{ + return mRect; +} + +void XWindowDef::SetRect(const XRectDef &aRect) +{ + mRect = aRect; +} + +XRectDef XWindowDef::RectClient() const +{ + return mRectClient; +} + +void XWindowDef::SetRectClient(const XRectDef &aRectClient) +{ + mRectClient = aRectClient; +} + +XString XWindowDef::Group() const +{ + return mGroup; +} + +void XWindowDef::SetGroup(const XString &aGroup) +{ + mGroup = aGroup; +} + +int XWindowDef::Style() const +{ + return mStyle; +} + +void XWindowDef::SetStyle(int aStyle) +{ + mStyle = aStyle; +} + +int XWindowDef::Border() const +{ + return mBorder; +} + +void XWindowDef::SetBorder(int aBorder) +{ + mBorder = aBorder; +} + +int XWindowDef::OwnerDraw() const +{ + return mOwnerDraw; +} + +void XWindowDef::SetOwnerDraw(int aOwnerDraw) +{ + mOwnerDraw = aOwnerDraw; +} + +int XWindowDef::OwnerDrawFlags() const +{ + return mOwnerDrawFlags; +} + +void XWindowDef::SetOwnerDrawFlags(int aOwnerDrawFlags) +{ + mOwnerDrawFlags = aOwnerDrawFlags; +} + +float XWindowDef::BorderSize() const +{ + return mBorderSize; +} + +void XWindowDef::SetBorderSize(float aBorderSize) +{ + mBorderSize = aBorderSize; +} + +int XWindowDef::StaticFlags() const +{ + return mStaticFlags; +} + +void XWindowDef::SetStaticFlags(int aStaticFlags) +{ + mStaticFlags = aStaticFlags; +} + +QVector XWindowDef::DynamicFlags() const +{ + return mDynamicFlags; +} + +void XWindowDef::SetDynamicFlags(const QVector &aDynamicFlags) +{ + mDynamicFlags = aDynamicFlags; +} + +int XWindowDef::NextTime() const +{ + return mNextTime; +} + +void XWindowDef::SetNextTime(int aNextTime) +{ + mNextTime = aNextTime; +} + +QColor XWindowDef::ForeColor() const +{ + return mForeColor; +} + +void XWindowDef::SetForeColor(const QColor &aForeColor) +{ + mForeColor = aForeColor; +} + +QColor XWindowDef::BackColor() const +{ + return mBackColor; +} + +void XWindowDef::SetBackColor(const QColor &aBackColor) +{ + mBackColor = aBackColor; +} + +QColor XWindowDef::BorderColor() const +{ + return mBorderColor; +} + +void XWindowDef::SetBorderColor(const QColor &aBorderColor) +{ + mBorderColor = aBorderColor; +} + +QColor XWindowDef::OutlineColor() const +{ + return mOutlineColor; +} + +void XWindowDef::SetOutlineColor(const QColor &aOutlineColor) +{ + mOutlineColor = aOutlineColor; +} + +XMaterial XWindowDef::Background() const +{ + return mBackground; +} + +void XWindowDef::SetBackground(const XMaterial &aBackground) +{ + mBackground = aBackground; +} diff --git a/libs/xassets/xwindowdef.h b/libs/xassets/xwindowdef.h index 3685a72..f1b66a9 100644 --- a/libs/xassets/xwindowdef.h +++ b/libs/xassets/xwindowdef.h @@ -16,8 +16,43 @@ public: void ParseData(XDataStream *aStream) override; void Clear() override; + XString WindowName() const; + void SetWindowName(const XString &aWindowName); + XRectDef Rect() const; + void SetRect(const XRectDef &aRect); + XRectDef RectClient() const; + void SetRectClient(const XRectDef &aRectClient); + XString Group() const; + void SetGroup(const XString &aGroup); + int Style() const; + void SetStyle(int aStyle); + int Border() const; + void SetBorder(int aBorder); + int OwnerDraw() const; + void SetOwnerDraw(int aOwnerDraw); + int OwnerDrawFlags() const; + void SetOwnerDrawFlags(int aOwnerDrawFlags); + float BorderSize() const; + void SetBorderSize(float aBorderSize); + int StaticFlags() const; + void SetStaticFlags(int aStaticFlags); + QVector DynamicFlags() const; + void SetDynamicFlags(const QVector &aDynamicFlags); + int NextTime() const; + void SetNextTime(int aNextTime); + QColor ForeColor() const; + void SetForeColor(const QColor &aForeColor); + QColor BackColor() const; + void SetBackColor(const QColor &aBackColor); + QColor BorderColor() const; + void SetBorderColor(const QColor &aBorderColor); + QColor OutlineColor() const; + void SetOutlineColor(const QColor &aOutlineColor); + XMaterial Background() const; + void SetBackground(const XMaterial &aBackground); + private: - XString mName; + XString mWindowName; XRectDef mRect; XRectDef mRectClient; XString mGroup; diff --git a/libs/zonefile/360/zonefile_cod10_360.cpp b/libs/zonefile/360/zonefile_cod10_360.cpp index ab79c9a..c9572f1 100644 --- a/libs/zonefile/360/zonefile_cod10_360.cpp +++ b/libs/zonefile/360/zonefile_cod10_360.cpp @@ -13,7 +13,7 @@ ZoneFile_COD10_360::ZoneFile_COD10_360() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(17, ASSET_TYPE_GFX_MAP); diff --git a/libs/zonefile/360/zonefile_cod2_360.cpp b/libs/zonefile/360/zonefile_cod2_360.cpp index 8931e4c..7e6a4ec 100644 --- a/libs/zonefile/360/zonefile_cod2_360.cpp +++ b/libs/zonefile/360/zonefile_cod2_360.cpp @@ -15,7 +15,7 @@ ZoneFile_COD2_360::ZoneFile_COD2_360() //pSetType(-1, ASSET_TYPE_FX); //pSetType(-1, ASSET_TYPE_SOUND); //pSetType(-1, ASSET_TYPE_XANIMPARTS); - //pSetType(-1, ASSET_TYPE_COLLISION_MAP); + //pSetType(-1, ASSET_TYPE_COL_MAP_MP); //pSetType(-1, ASSET_TYPE_STRINGTABLE); //pSetType(-1, ASSET_TYPE_MENU); //pSetType(-1, ASSET_TYPE_TECHNIQUE_SET); diff --git a/libs/zonefile/360/zonefile_cod5_360.cpp b/libs/zonefile/360/zonefile_cod5_360.cpp index 5c4fb92..17c5a9b 100644 --- a/libs/zonefile/360/zonefile_cod5_360.cpp +++ b/libs/zonefile/360/zonefile_cod5_360.cpp @@ -15,7 +15,7 @@ ZoneFile_COD5_360::ZoneFile_COD5_360() pSetType(8, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(17, ASSET_TYPE_GFX_MAP); diff --git a/libs/zonefile/360/zonefile_cod6_360.cpp b/libs/zonefile/360/zonefile_cod6_360.cpp index 3cb6a29..cefce63 100644 --- a/libs/zonefile/360/zonefile_cod6_360.cpp +++ b/libs/zonefile/360/zonefile_cod6_360.cpp @@ -279,7 +279,7 @@ bool ZoneFile_COD6_360::Load(const QByteArray aFileData) { // result.images << pParseASSET_TYPE_IMAGE(aZoneFileStream); // } else if (assetType == ASSET_TYPE_SOUND) { // loaded_sound // result.sounds << pParseASSET_TYPE_SOUND(aZoneFileStream); -// } else if (assetType == ASSET_TYPE_COLLISION_MAP) { // col_map_mp +// } else if (assetType == ASSET_TYPE_COL_MAP_MP) { // col_map_mp // pParseAsset_ColMapMP(aZoneFileStream); // } else if (assetType == ASSET_MP_MAP) { // game_map_sp // pParseAsset_GameMapSP(aZoneFileStream); diff --git a/libs/zonefile/360/zonefile_cod9_360.cpp b/libs/zonefile/360/zonefile_cod9_360.cpp index df8452f..a73f9cb 100644 --- a/libs/zonefile/360/zonefile_cod9_360.cpp +++ b/libs/zonefile/360/zonefile_cod9_360.cpp @@ -13,7 +13,7 @@ ZoneFile_COD9_360::ZoneFile_COD9_360() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(17, ASSET_TYPE_GFX_MAP); diff --git a/libs/zonefile/PC/zonefile_cod10_pc.cpp b/libs/zonefile/PC/zonefile_cod10_pc.cpp index e99eeb3..d41fda2 100644 --- a/libs/zonefile/PC/zonefile_cod10_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod10_pc.cpp @@ -9,7 +9,7 @@ ZoneFile_COD10_PC::ZoneFile_COD10_PC() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(17, ASSET_TYPE_GFX_MAP); diff --git a/libs/zonefile/PC/zonefile_cod11_pc.cpp b/libs/zonefile/PC/zonefile_cod11_pc.cpp index 904e5ca..571d552 100644 --- a/libs/zonefile/PC/zonefile_cod11_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod11_pc.cpp @@ -9,7 +9,7 @@ ZoneFile_COD11_PC::ZoneFile_COD11_PC() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(17, ASSET_TYPE_GFX_MAP); diff --git a/libs/zonefile/PC/zonefile_cod21_pc.cpp b/libs/zonefile/PC/zonefile_cod21_pc.cpp new file mode 100644 index 0000000..5d54929 --- /dev/null +++ b/libs/zonefile/PC/zonefile_cod21_pc.cpp @@ -0,0 +1,81 @@ +#include "zonefile_cod21_pc.h" + +ZoneFile_COD21_PC::ZoneFile_COD21_PC() + : ZoneFile() +{ + pSetType(0, ASSET_TYPE_PHYSPRESET); + pSetType(1, ASSET_TYPE_PHYS_CONSTRAINTS); + pSetType(2, ASSET_TYPE_DESTRUCTIBLE_DEF); + pSetType(3, ASSET_TYPE_XANIMPARTS); + pSetType(4, ASSET_TYPE_XMODEL); + pSetType(5, ASSET_TYPE_XMODEL_MESH); + pSetType(6, ASSET_TYPE_MATERIAL); + pSetType(7, ASSET_TYPE_COMPUTE_SHADER_SET); + pSetType(8, ASSET_TYPE_TECHNIQUE_SET); + pSetType(9, ASSET_TYPE_IMAGE); + pSetType(10, ASSET_TYPE_SOUND); + pSetType(17, ASSET_TYPE_LIGHT_DEF); + pSetType(21, ASSET_TYPE_FONT_ICON); + pSetType(23, ASSET_TYPE_WEAPON); + pSetType(27, ASSET_TYPE_CG_MEDIA_TABLE); + pSetType(28, ASSET_TYPE_PLAYER_SOUNDS_TABLE); + pSetType(29, ASSET_TYPE_PLAYER_FX_TABLE); + pSetType(30, ASSET_TYPE_SHARED_WEAPON_SOUNDS); + pSetType(31, ASSET_TYPE_ATTACHMENT); + pSetType(32, ASSET_TYPE_ATTACHMENT_UNIQUE); + pSetType(33, ASSET_TYPE_WEAPON_CAMO); + pSetType(34, ASSET_TYPE_CUSTOMIZATION_TABLE); + pSetType(35, ASSET_TYPE_CUSTOMIZATION_TABLE_FEIMAGES); + pSetType(36, ASSET_TYPE_CUSTOMIZATION_TABLE_COLOR); + pSetType(38, ASSET_TYPE_FX); + pSetType(47, ASSET_TYPE_RAWFILE); + pSetType(48, ASSET_TYPE_STRINGTABLE); + pSetType(49, ASSET_TYPE_STRUCTURED_TABLE); + pSetType(50, ASSET_TYPE_LEADERBOARD_DEF); + pSetType(51, ASSET_TYPE_DDL); + pSetType(54, ASSET_TYPE_SCRIPT_PARSE_TREE); + pSetType(55, ASSET_TYPE_KEY_VALUE_PAIRS); + pSetType(56, ASSET_TYPE_VEHICLE); + pSetType(58, ASSET_TYPE_VEHICLE_TRACER); + pSetType(60, ASSET_TYPE_SURFACE_FX_TABLE); + pSetType(61, ASSET_TYPE_SURFACE_SOUND_DEF); + pSetType(62, ASSET_TYPE_FOOTSTEP_TABLE); + pSetType(63, ASSET_TYPE_ENTITY_FX_IMPACTS); + pSetType(64, ASSET_TYPE_ENTITY_SOUND_IMPACTS); + pSetType(66, ASSET_TYPE_VEHICLE_FX_DEF); + pSetType(67, ASSET_TYPE_VEHICLE_SOUND_DEF); + pSetType(69, ASSET_TYPE_SCRIPT_BUNDLE); + pSetType(70, ASSET_TYPE_SCRIPT_BUNDLE_LIST); + pSetType(71, ASSET_TYPE_RUMBLE); + pSetType(74, ASSET_TYPE_AIM_TABLE); + pSetType(75, ASSET_TYPE_ANIM_SELECTOR_TABLE); + pSetType(76, ASSET_TYPE_ANIM_MAPPING_TABLE); + pSetType(77, ASSET_TYPE_ANIM_STATE_MACHINE); + pSetType(78, ASSET_TYPE_BEHAVIOR_TREE); + pSetType(79, ASSET_TYPE_BEHAVIOR_STATE_MACHINE); + pSetType(81, ASSET_TYPE_S_ANIM); + pSetType(82, ASSET_TYPE_LIGHT_DEF); + pSetType(83, ASSET_TYPE_BIT_FIELD); + pSetType(84, ASSET_TYPE_SURFACE_SOUND_DEF); + pSetType(85, ASSET_TYPE_SURFACE_FX_TABLE); + pSetType(86, ASSET_TYPE_RUMBLE); + pSetType(89, ASSET_TYPE_AIM_TABLE); + pSetType(90, ASSET_TYPE_MAP_TABLE); + pSetType(91, ASSET_TYPE_MAP_TABLE_LOADING_IMAGES); + pSetType(92, ASSET_TYPE_MEDAL); + pSetType(93, ASSET_TYPE_MEDAL_TABLE); + pSetType(94, ASSET_TYPE_OBJECTIVE); + pSetType(95, ASSET_TYPE_OBJECTIVE_LIST); + pSetType(100, ASSET_TYPE_LASER); + pSetType(101, ASSET_TYPE_BEAM); + pSetType(102, ASSET_TYPE_STREAMER_HINT); +} + +ZoneFile_COD21_PC::~ZoneFile_COD21_PC() +{ + +} + +bool ZoneFile_COD21_PC::Load(const QByteArray aFileData) { + return true;//ZoneFile::Load(aFileData); +} diff --git a/libs/zonefile/PC/zonefile_cod21_pc.h b/libs/zonefile/PC/zonefile_cod21_pc.h new file mode 100644 index 0000000..c98d864 --- /dev/null +++ b/libs/zonefile/PC/zonefile_cod21_pc.h @@ -0,0 +1,16 @@ +#ifndef ZONEFILE_COD21_PC_H +#define ZONEFILE_COD21_PC_H + +#include "zonefile.h" + +class ZoneFile_COD21_PC : public ZoneFile +{ +public: + ZoneFile_COD21_PC(); + ~ZoneFile_COD21_PC(); + + bool Load(const QByteArray aFileData) override; + +}; + +#endif // ZONEFILE_COD21_PC_H diff --git a/libs/zonefile/PC/zonefile_cod4_pc.cpp b/libs/zonefile/PC/zonefile_cod4_pc.cpp index 6565b40..a4e1c2b 100644 --- a/libs/zonefile/PC/zonefile_cod4_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod4_pc.cpp @@ -3,29 +3,38 @@ ZoneFile_COD4_PC::ZoneFile_COD4_PC() : ZoneFile() { + pSetType(0, ASSET_TYPE_XMODELPIECES); pSetType(1, ASSET_TYPE_PHYSPRESET); pSetType(2, ASSET_TYPE_XANIMPARTS); pSetType(3, ASSET_TYPE_XMODEL); - pSetType(5, ASSET_TYPE_DESTRUCTIBLE); + pSetType(4, ASSET_TYPE_MATERIAL); + pSetType(5, ASSET_TYPE_TECHNIQUE_SET); pSetType(6, ASSET_TYPE_IMAGE); - pSetType(7, ASSET_TYPE_TECHNIQUE_SET); - pSetType(10, ASSET_TYPE_COL_MAP_SP); - pSetType(11, ASSET_TYPE_COLLISION_MAP); - pSetType(12, ASSET_TYPE_D3DBSP); - pSetType(13, ASSET_TYPE_GAME_MAP_SP); - pSetType(16, ASSET_TYPE_GFX_MAP); - pSetType(18, ASSET_TYPE_LIGHT_DEF); - pSetType(20, ASSET_TYPE_MENU); - pSetType(21, ASSET_TYPE_FONT); - pSetType(22, ASSET_TYPE_SOUND); - pSetType(23, ASSET_TYPE_WEAPON); - pSetType(24, ASSET_TYPE_LOCALIZE_ENTRY); - pSetType(25, ASSET_TYPE_FX); - pSetType(26, ASSET_TYPE_UI_MAP); - pSetType(31, ASSET_TYPE_RAWFILE); - pSetType(32, ASSET_TYPE_SCRIPT_PARSE_TREE); - pSetType(33, ASSET_TYPE_STRINGTABLE); - + pSetType(7, ASSET_TYPE_PIXELSHADER); + pSetType(8, ASSET_TYPE_SOUND_CURVE); + pSetType(9, ASSET_TYPE_LOADED_SOUND); + pSetType(0xA, ASSET_TYPE_COL_MAP_MP); + pSetType(0xB, ASSET_TYPE_COL_MAP_SP); + pSetType(0xC, ASSET_TYPE_COM_MAP); + pSetType(0xD, ASSET_TYPE_GAME_MAP_SP); + pSetType(0xE, ASSET_TYPE_GAME_MAP_MP); + pSetType(0xF, ASSET_TYPE_MAP_ENTS); + pSetType(0x10, ASSET_TYPE_GFX_MAP); + pSetType(0x11, ASSET_TYPE_LIGHT_DEF); + pSetType(0x12, ASSET_TYPE_UI_MAP); + pSetType(0x13, ASSET_TYPE_FONT); + pSetType(0x14, ASSET_TYPE_MENULIST); + pSetType(0x15, ASSET_TYPE_MENU); + pSetType(0x16, ASSET_TYPE_LOCALIZE_ENTRY); + pSetType(0x17, ASSET_TYPE_WEAPON); + pSetType(0x18, ASSET_TYPE_SNDDRIVER_GLOBALS); + pSetType(0x19, ASSET_TYPE_IMPACT_FX); + pSetType(0x1A, ASSET_TYPE_AITYPE); + pSetType(0x1B, ASSET_TYPE_MPTYPE); + pSetType(0x1C, ASSET_TYPE_CHARACTER); + pSetType(0x1D, ASSET_TYPE_XMODELALIAS); + pSetType(0x1F, ASSET_TYPE_RAWFILE); + pSetType(0x20, ASSET_TYPE_STRINGTABLE); } ZoneFile_COD4_PC::~ZoneFile_COD4_PC() { @@ -33,5 +42,5 @@ ZoneFile_COD4_PC::~ZoneFile_COD4_PC() { } bool ZoneFile_COD4_PC::Load(const QByteArray aFileData) { - return true; + return ZoneFile::Load(aFileData); } diff --git a/libs/zonefile/PC/zonefile_cod5_pc.cpp b/libs/zonefile/PC/zonefile_cod5_pc.cpp index e28dc8c..9ea734d 100644 --- a/libs/zonefile/PC/zonefile_cod5_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod5_pc.cpp @@ -7,11 +7,11 @@ ZoneFile_COD5_PC::ZoneFile_COD5_PC() pSetType(3, ASSET_TYPE_DESTRUCTIBLE); pSetType(4, ASSET_TYPE_XANIMPARTS); pSetType(5, ASSET_TYPE_XMODEL); - pSetType(6, ASSET_TYPE_IMAGE); + pSetType(6, ASSET_TYPE_MATERIAL); pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(17, ASSET_TYPE_GFX_MAP); @@ -31,5 +31,5 @@ ZoneFile_COD5_PC::~ZoneFile_COD5_PC() { } bool ZoneFile_COD5_PC::Load(const QByteArray aFileData) { - return true; + return ZoneFile::Load(aFileData); } diff --git a/libs/zonefile/PC/zonefile_cod6_pc.cpp b/libs/zonefile/PC/zonefile_cod6_pc.cpp index 2f05c08..0a3cac4 100644 --- a/libs/zonefile/PC/zonefile_cod6_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod6_pc.cpp @@ -11,7 +11,7 @@ ZoneFile_COD6_PC::ZoneFile_COD6_PC() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(17, ASSET_TYPE_GFX_MAP); diff --git a/libs/zonefile/PC/zonefile_cod7_pc.cpp b/libs/zonefile/PC/zonefile_cod7_pc.cpp index cc32880..ddd9eff 100644 --- a/libs/zonefile/PC/zonefile_cod7_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod7_pc.cpp @@ -48,12 +48,6 @@ ZoneFile_COD7_PC::ZoneFile_COD7_PC() pSetType(42, ASSET_TYPE_EMBLEMSET); pSetType(43, ASSET_TYPE_COUNT); pSetType(44, ASSET_TYPE_ASSETLIST); - -} - -ZoneFile_COD7_PC::~ZoneFile_COD7_PC() -{ - } bool ZoneFile_COD7_PC::Load(const QByteArray aFileData) { diff --git a/libs/zonefile/PC/zonefile_cod7_pc.h b/libs/zonefile/PC/zonefile_cod7_pc.h index 6293c04..5fc5f82 100644 --- a/libs/zonefile/PC/zonefile_cod7_pc.h +++ b/libs/zonefile/PC/zonefile_cod7_pc.h @@ -7,10 +7,9 @@ class ZoneFile_COD7_PC : public ZoneFile { public: ZoneFile_COD7_PC(); - ~ZoneFile_COD7_PC(); + ~ZoneFile_COD7_PC() = default; bool Load(const QByteArray aFileData) override; - }; #endif // ZONEFILE_COD7_PC_H diff --git a/libs/zonefile/PC/zonefile_cod8_pc.cpp b/libs/zonefile/PC/zonefile_cod8_pc.cpp index 16bf686..b3bc9c8 100644 --- a/libs/zonefile/PC/zonefile_cod8_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod8_pc.cpp @@ -9,7 +9,7 @@ ZoneFile_COD8_PC::ZoneFile_COD8_PC() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(17, ASSET_TYPE_GFX_MAP); diff --git a/libs/zonefile/PC/zonefile_cod9_pc.cpp b/libs/zonefile/PC/zonefile_cod9_pc.cpp index 75b4e4d..67c4682 100644 --- a/libs/zonefile/PC/zonefile_cod9_pc.cpp +++ b/libs/zonefile/PC/zonefile_cod9_pc.cpp @@ -9,7 +9,7 @@ ZoneFile_COD9_PC::ZoneFile_COD9_PC() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(17, ASSET_TYPE_GFX_MAP); diff --git a/libs/zonefile/PS3/zonefile_cod10_ps3.cpp b/libs/zonefile/PS3/zonefile_cod10_ps3.cpp index 0cc8dd5..a9a0976 100644 --- a/libs/zonefile/PS3/zonefile_cod10_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod10_ps3.cpp @@ -13,7 +13,7 @@ ZoneFile_COD10_PS3::ZoneFile_COD10_PS3() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/PS3/zonefile_cod11_ps3.cpp b/libs/zonefile/PS3/zonefile_cod11_ps3.cpp index cf8a138..4cec463 100644 --- a/libs/zonefile/PS3/zonefile_cod11_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod11_ps3.cpp @@ -13,7 +13,7 @@ ZoneFile_COD11_PS3::ZoneFile_COD11_PS3() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/PS3/zonefile_cod12_ps3.cpp b/libs/zonefile/PS3/zonefile_cod12_ps3.cpp index 5bd0d9f..7386009 100644 --- a/libs/zonefile/PS3/zonefile_cod12_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod12_ps3.cpp @@ -13,7 +13,7 @@ ZoneFile_COD12_PS3::ZoneFile_COD12_PS3() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/PS3/zonefile_cod5_ps3.cpp b/libs/zonefile/PS3/zonefile_cod5_ps3.cpp index f048241..d1d0479 100644 --- a/libs/zonefile/PS3/zonefile_cod5_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod5_ps3.cpp @@ -15,7 +15,7 @@ ZoneFile_COD5_PS3::ZoneFile_COD5_PS3() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/PS3/zonefile_cod6_ps3.cpp b/libs/zonefile/PS3/zonefile_cod6_ps3.cpp index dc3654c..c845bac 100644 --- a/libs/zonefile/PS3/zonefile_cod6_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod6_ps3.cpp @@ -11,7 +11,7 @@ ZoneFile_COD6_PS3::ZoneFile_COD6_PS3() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/PS3/zonefile_cod7_ps3.cpp b/libs/zonefile/PS3/zonefile_cod7_ps3.cpp index f3ed648..eacf36e 100644 --- a/libs/zonefile/PS3/zonefile_cod7_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod7_ps3.cpp @@ -13,7 +13,7 @@ ZoneFile_COD7_PS3::ZoneFile_COD7_PS3() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/PS3/zonefile_cod8_ps3.cpp b/libs/zonefile/PS3/zonefile_cod8_ps3.cpp index bc278c3..93b81a6 100644 --- a/libs/zonefile/PS3/zonefile_cod8_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod8_ps3.cpp @@ -13,7 +13,7 @@ ZoneFile_COD8_PS3::ZoneFile_COD8_PS3() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/PS3/zonefile_cod9_ps3.cpp b/libs/zonefile/PS3/zonefile_cod9_ps3.cpp index 0336b94..c2828ca 100644 --- a/libs/zonefile/PS3/zonefile_cod9_ps3.cpp +++ b/libs/zonefile/PS3/zonefile_cod9_ps3.cpp @@ -12,7 +12,7 @@ ZoneFile_COD9_PS3::ZoneFile_COD9_PS3() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/Wii/zonefile_cod4_wii.cpp b/libs/zonefile/Wii/zonefile_cod4_wii.cpp index 50f9d30..ea7471e 100644 --- a/libs/zonefile/Wii/zonefile_cod4_wii.cpp +++ b/libs/zonefile/Wii/zonefile_cod4_wii.cpp @@ -13,7 +13,7 @@ ZoneFile_COD4_Wii::ZoneFile_COD4_Wii() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/Wii/zonefile_cod7_wii.cpp b/libs/zonefile/Wii/zonefile_cod7_wii.cpp index d0ca04a..04e0d3b 100644 --- a/libs/zonefile/Wii/zonefile_cod7_wii.cpp +++ b/libs/zonefile/Wii/zonefile_cod7_wii.cpp @@ -13,7 +13,7 @@ ZoneFile_COD7_Wii::ZoneFile_COD7_Wii() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/Wii/zonefile_cod8_wii.cpp b/libs/zonefile/Wii/zonefile_cod8_wii.cpp index 0cd4b3a..05d00ea 100644 --- a/libs/zonefile/Wii/zonefile_cod8_wii.cpp +++ b/libs/zonefile/Wii/zonefile_cod8_wii.cpp @@ -13,7 +13,7 @@ ZoneFile_COD8_Wii::ZoneFile_COD8_Wii() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/WiiU/zonefile_cod10_wiiu.cpp b/libs/zonefile/WiiU/zonefile_cod10_wiiu.cpp index ee3912f..d9ddc2c 100644 --- a/libs/zonefile/WiiU/zonefile_cod10_wiiu.cpp +++ b/libs/zonefile/WiiU/zonefile_cod10_wiiu.cpp @@ -13,7 +13,7 @@ ZoneFile_COD10_WiiU::ZoneFile_COD10_WiiU() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/WiiU/zonefile_cod9_wiiu.cpp b/libs/zonefile/WiiU/zonefile_cod9_wiiu.cpp index f96505a..5d583e1 100644 --- a/libs/zonefile/WiiU/zonefile_cod9_wiiu.cpp +++ b/libs/zonefile/WiiU/zonefile_cod9_wiiu.cpp @@ -13,7 +13,7 @@ ZoneFile_COD9_WiiU::ZoneFile_COD9_WiiU() pSetType(7, ASSET_TYPE_TECHNIQUE_SET); pSetType(9, ASSET_TYPE_SOUND); pSetType(11, ASSET_TYPE_COL_MAP_SP); - pSetType(12, ASSET_TYPE_COLLISION_MAP); + pSetType(12, ASSET_TYPE_COL_MAP_MP); pSetType(13, ASSET_TYPE_D3DBSP); pSetType(14, ASSET_TYPE_GAME_MAP_SP); pSetType(15, ASSET_TYPE_MENU); diff --git a/libs/zonefile/zonefile.cpp b/libs/zonefile/zonefile.cpp index 4ad7392..0bd60e8 100644 --- a/libs/zonefile/zonefile.cpp +++ b/libs/zonefile/zonefile.cpp @@ -1,52 +1,59 @@ #include "zonefile.h" #include "xassetlist.h" #include "xfile.h" +#include "xdatastream.h" +#include "xcommoninfo.h" #include -#include "xdatastream.h" #include -ZoneFile::ZoneFile() : - mStem(), - mSize(), - mTagCount(), - mTags(), - mRecordCount(), - mRecords(), - mPlatform(), - mGame(), - mTypeMap(), - mHeaderData(), - mAssetList(this) +ZoneFile::ZoneFile() + : mStem() + , mSize() + , mTagCount() + , mTags() + , mRecordCount() + , mRecords() + , mCommonInfo(nullptr) + , mTypeMap() + , mHeaderData() + , mAssetList(this) + , mDebug(false) { } -ZoneFile::~ZoneFile() { +ZoneFile::ZoneFile(const ZoneFile &aZoneFile) + : mStem(aZoneFile.mStem) + , mSize(aZoneFile.mSize) + , mTagCount(aZoneFile.mTagCount) + , mTags(aZoneFile.mTags) + , mRecordCount(aZoneFile.mRecordCount) + , mRecords(aZoneFile.mRecords) + , mAssetTypes(aZoneFile.mAssetTypes) + , mCommonInfo(aZoneFile.mCommonInfo) + , mTypeMap(aZoneFile.mTypeMap) + , mHeaderData(aZoneFile.mHeaderData) + , mAssetList(aZoneFile.mAssetList) +{ } -ZoneFile::ZoneFile(const ZoneFile &aZoneFile) { - mStem = aZoneFile.mStem; - mSize = aZoneFile.mSize; - mTagCount = aZoneFile.mTagCount; - mTags = aZoneFile.mTags; - mRecordCount = aZoneFile.mRecordCount; - mRecords = aZoneFile.mRecords; - mAssetList = aZoneFile.mAssetList; - mHeaderData = aZoneFile.mHeaderData; -} - -ZoneFile &ZoneFile::operator=(const ZoneFile &other) { - if (this != &other) { - mStem = other.mStem; - mSize = other.mSize; - mTagCount = other.mTagCount; - mTags = other.mTags; +ZoneFile &ZoneFile::operator=(const ZoneFile &other) +{ + if (this != &other) + { + mStem = other.mStem; + mSize = other.mSize; + mTagCount = other.mTagCount; + mTags = other.mTags; mRecordCount = other.mRecordCount; - mRecords = other.mRecords; - mAssetList = other.mAssetList; - mHeaderData = other.mHeaderData; + mRecords = other.mRecords; + mAssetTypes = other.mAssetTypes; + mCommonInfo = other.mCommonInfo; + mTypeMap = other.mTypeMap; + mHeaderData = other.mHeaderData; + mAssetList = other.mAssetList; } return *this; } @@ -54,9 +61,17 @@ ZoneFile &ZoneFile::operator=(const ZoneFile &other) { bool ZoneFile::Load(const QByteArray aFileData) { XDataStream zoneStream(aFileData); - zoneStream.SetDebug(); + zoneStream.SetDebug(mDebug); + if (GetCommonInfo()->GetPlatform() == PLATFORM_PC) + { + zoneStream.setByteOrder(QDataStream::LittleEndian); + } + + mHeaderData.SetCommonInfo(mCommonInfo); mHeaderData.ParseData(&zoneStream); + + mAssetList.SetCommonInfo(mCommonInfo); mAssetList.ParseData(&zoneStream); return true; @@ -173,3 +188,58 @@ void ZoneFile::pSetType(quint32 aRawType, XAssetType aType) { mTypeMap[aRawType] = aType; } + +quint32 ZoneFile::RecordCount() const +{ + return mRecordCount; +} + +QStringList ZoneFile::Records() const +{ + return mRecords; +} + +QVector ZoneFile::AssetTypes() const +{ + return mAssetTypes; +} + +void ZoneFile::SetAssetTypes(const QVector &aAssetTypes) +{ + mAssetTypes = aAssetTypes; +} + +QMap ZoneFile::TypeMap() const +{ + return mTypeMap; +} + +void ZoneFile::SetTypeMap(const QMap &aTypeMap) +{ + mTypeMap = aTypeMap; +} + +XFile ZoneFile::HeaderData() const +{ + return mHeaderData; +} + +bool ZoneFile::Debug() const +{ + return mDebug; +} + +void ZoneFile::SetDebug(bool aDebug) +{ + mDebug = aDebug; +} + +const XCommonInfo *ZoneFile::GetCommonInfo() const +{ + return mCommonInfo; +} + +void ZoneFile::SetCommonInfo(const XCommonInfo *newCommonInfo) +{ + mCommonInfo = newCommonInfo; +} diff --git a/libs/zonefile/zonefile.h b/libs/zonefile/zonefile.h index ed1012c..0716dc7 100644 --- a/libs/zonefile/zonefile.h +++ b/libs/zonefile/zonefile.h @@ -13,7 +13,7 @@ class ZoneFile { public: ZoneFile(); - ~ZoneFile(); + virtual ~ZoneFile() = default; ZoneFile(const ZoneFile &aZoneFile); ZoneFile &operator=(const ZoneFile &other); @@ -40,6 +40,19 @@ public: void SetAssetList(XAssetList aAssetList); XAssetType GetType(quint32 aRawType) const; + const XCommonInfo *GetCommonInfo() const; + void SetCommonInfo(const XCommonInfo *newCommonInfo); + + quint32 RecordCount() const; + QStringList Records() const; + QVector AssetTypes() const; + void SetAssetTypes(const QVector &aAssetTypes); + QMap TypeMap() const; + void SetTypeMap(const QMap &aTypeMap); + XFile HeaderData() const; + bool Debug() const; + void SetDebug(bool aDebug); + protected: void pSetType(quint32 aRawType, XAssetType aType); @@ -51,13 +64,14 @@ private: quint32 mRecordCount; QStringList mRecords; QVector mAssetTypes; - QString mPlatform; - QString mGame; + const XCommonInfo* mCommonInfo; QMap mTypeMap; XFile mHeaderData; XAssetList mAssetList; + + bool mDebug; }; #endif // ZONEFILE_H diff --git a/third_party/oodle_lib/dll/oo2core_8_win64.dll b/third_party/oodle_lib/dll/oo2core_8_win64.dll new file mode 100644 index 0000000..68548cf Binary files /dev/null and b/third_party/oodle_lib/dll/oo2core_8_win64.dll differ diff --git a/tools/asset_assess/mainwindow.cpp b/tools/asset_assess/mainwindow.cpp index 34ec669..f3e7300 100644 --- a/tools/asset_assess/mainwindow.cpp +++ b/tools/asset_assess/mainwindow.cpp @@ -29,7 +29,8 @@ void MainWindow::LogLine(const QString &aLogText) if (mTextEdit->toPlainText().isEmpty()) { mTextEdit->setPlainText(aLogText); } else { - mTextEdit->setPlainText(mTextEdit->toPlainText() + "\r\n" + aLogText); + mTextEdit->setPlainText(mTextEdit->toPlainText() + " +" + aLogText); } }