diff --git a/breft_editor/breft.cpp b/breft_editor/breft.cpp new file mode 100644 index 0000000..1a1cf99 --- /dev/null +++ b/breft_editor/breft.cpp @@ -0,0 +1,96 @@ +#include "breft.h" + +QDataStream +&operator<<( QDataStream &stream, const header &data) +{ + stream << data.magic.value << data.endian; + stream << data.version_hi << data.version_lo; + stream << data.length << data.header_size << data.chunk_cnt; + return stream; +} +QDataStream +&operator>>( QDataStream &stream, header &data) +{ + stream >> data.magic.value >> data.endian; + stream >> data.version_hi >> data.version_lo; + stream >> data.length >> data.header_size >> data.chunk_cnt; + return stream; +} + +QDataStream +&operator<<( QDataStream &stream, const reft &data) +{ + stream << data.magic.value << data.length; + return stream; +} +QDataStream +&operator>>( QDataStream &stream, reft &data) +{ + stream >> data.magic.value >> data.length; + return stream; +} + +QDataStream +&operator<<( QDataStream &stream, const projct &data) +{ + stream << data.length << data.unk1 << data.unk2; + stream << data.str_length << data.unk3; + return stream; +} +QDataStream +&operator>>( QDataStream &stream, projct &data) +{ + stream >> data.length >> data.unk1 >> data.unk2; + stream >> data.str_length >> data.unk3; + return stream; +} + +QDataStream +&operator<<( QDataStream &stream, const section1 &data) +{ + stream << data.length << data.count << data.padding; + return stream; +} +QDataStream +&operator>>( QDataStream &stream, section1 &data) +{ + stream >> data.length >> data.count >> data.padding; + return stream; +} + +QDataStream +&operator<<( QDataStream &stream, const section1b &data) +{ + stream << data.offset << data.length; + return stream; +} +QDataStream +&operator>>( QDataStream &stream, section1b &data) +{ + stream >> data.offset >> data.length; + return stream; +} + +QDataStream +&operator<<( QDataStream &stream, const picture_header &data) +{ + stream << data.unk1 << data.height << data.width << data.size; + stream << data.format << data.unk2 << data.unk3 << data.unk4; + stream << data.unk5 << data.unk6 << data.rptx << data.rpty; + stream << data.unk7 << data.unk8 << data.unk9 << data.unkA; + stream << data.unkB << data.unkC << data.unkD << data.unkE; + stream << data.unkF << data.unkG; + return stream; +} +QDataStream +&operator>>( QDataStream &stream, picture_header &data) +{ + stream >> data.unk1 >> data.height >> data.width >> data.size; + stream >> data.format >> data.unk2 >> data.unk3 >> data.unk4; + stream >> data.unk5 >> data.unk6 >> data.rptx >> data.rpty; + stream >> data.unk7 >> data.unk8 >> data.unk9 >> data.unkA; + stream >> data.unkB >> data.unkC >> data.unkD >> data.unkE; + stream >> data.unkF >> data.unkG; + return stream; +} + diff --git a/breft_editor/breft.h b/breft_editor/breft.h new file mode 100644 index 0000000..b4ad389 --- /dev/null +++ b/breft_editor/breft.h @@ -0,0 +1,106 @@ +#ifndef BREFT_H +#define BREFT_H + +#include + +union Magic { + quint32 value; + char string[4]; +}; + +struct header { + Magic magic; + quint16 endian; + quint8 version_hi; + quint8 version_lo; + quint32 length; + quint16 header_size; + quint16 chunk_cnt; +}; + +struct reft { + Magic magic; + quint32 length; +}; + +struct projct { + quint32 length; + quint32 unk1; + quint32 unk2; + quint16 str_length; + quint16 unk3; +}; + +struct section1 { + quint32 length; + quint16 count; + quint16 padding; +}; + +struct section1b { + quint32 offset; + quint32 length; +}; + +struct picture_header { + quint32 unk1; //00 + quint16 height; //04 + quint16 width; //06 + quint32 size; //08 + quint8 format; //0c + quint8 unk2; + quint8 unk3; + quint8 unk4; + quint32 unk5; //10 + quint8 unk6; //14 + quint8 rptx; //15 + quint8 rpty; //16 + quint8 unk7; //17 + quint32 unk8; //18 + quint32 unk9; //1c + quint32 unkA; //20 + quint32 unkB; //24 + quint32 unkC; //28 + quint32 unkD; //30 + quint32 unkE; //34 + quint32 unkF; //38 + quint32 unkG; //3c +}; + +struct tpl_header { + Magic magic; + quint32 count; + quint32 header_size; + quint32 offset; +}; + +struct tpl_header2 { + quint16 height; + quint16 width; + quint32 format; + quint32 offset; + quint32 wrap_s; + quint32 wrap_t; + quint32 min; + quint32 mag; + float lod_bias; + quint8 edge_lod; + quint8 min_lod; + quint8 max_lod; + quint8 unpacked; +}; + +QDataStream &operator<<( QDataStream &stream, const header &data); +QDataStream &operator>>( QDataStream &stream, header &data); +QDataStream &operator<<( QDataStream &stream, const reft &data); +QDataStream &operator>>( QDataStream &stream, reft &data); +QDataStream &operator<<( QDataStream &stream, const projct &data); +QDataStream &operator>>( QDataStream &stream, projct &data); +QDataStream &operator<<( QDataStream &stream, const section1 &data); +QDataStream &operator>>( QDataStream &stream, section1 &data); +QDataStream &operator<<( QDataStream &stream, const section1b &data); +QDataStream &operator>>( QDataStream &stream, section1b &data); +QDataStream &operator<<( QDataStream &stream, const picture_header &data); +QDataStream &operator>>( QDataStream &stream, picture_header &data); + +#endif /*BREFT_H*/ diff --git a/breft_editor/breft.pro b/breft_editor/breft.pro new file mode 100644 index 0000000..e7914bb --- /dev/null +++ b/breft_editor/breft.pro @@ -0,0 +1,17 @@ +QT += core gui\ + network + +TARGET = breft_editor +TEMPLATE = app + + +SOURCES += main.cpp\ + mainwindow.cpp \ + breft.cpp \ + ../WiiQt/tools.cpp \ + ../WiiQt/aes.c \ + ../WiiQt/sha1.c + +HEADERS += mainwindow.h \ + breft.h \ + ../WiiQt/tools.h \ diff --git a/breft_editor/main.cpp b/breft_editor/main.cpp new file mode 100644 index 0000000..9ae175b --- /dev/null +++ b/breft_editor/main.cpp @@ -0,0 +1,11 @@ +#include +#include "mainwindow.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +} diff --git a/breft_editor/mainwindow.cpp b/breft_editor/mainwindow.cpp new file mode 100644 index 0000000..20f38fa --- /dev/null +++ b/breft_editor/mainwindow.cpp @@ -0,0 +1,187 @@ +#include "mainwindow.h" + +#include "../WiiQt/tools.h" +#include "breft.h" + +MainWindow::MainWindow( QWidget *parent ) : QMainWindow( parent) +{ + setObjectName("MainWindow"); + resize(1024, 768); + + setUnifiedTitleAndToolBarOnMac(true); + + QFrame *centralwidget = new QFrame; + Layout = new QGridLayout(centralwidget); + + setupForms(); + + setupActions(); + setupMenu(); + + setCentralWidget(centralwidget); +} + +MainWindow::~MainWindow() +{ +} + +void MainWindow::setupForms() +{ + QVBoxLayout* mainLayout = new QVBoxLayout; + + plainTextEdit_log = new QPlainTextEdit; + mainLayout->addWidget(plainTextEdit_log); + + Layout->addLayout(mainLayout, 0, 0); + + ShowMessage( tr("Done creating forms") ); +} + +void MainWindow::setupActions() +{ + actionQuit = new QAction(this); + actionQuit->setText("Quit"); + actionQuit->setToolTip("Quits the program."); + connect(actionQuit, SIGNAL(triggered()), this, SLOT(on_actionQuit_triggered())); + + actionLoad = new QAction(this); + actionLoad->setText("Load"); + actionLoad->setToolTip("Loads a breft."); + connect(actionLoad, SIGNAL(triggered()), this, SLOT(on_actionLoad_triggered())); + + ShowMessage( tr("Done creating actions") ); +} + +void MainWindow::setupMenu() +{ + menubar = new QMenuBar(this); + + menuFile = new QMenu(tr("&File"), this); + menuFile->addAction(actionLoad); + menuFile->addAction(actionQuit); + menubar->addAction(menuFile->menuAction()); + menubar->addMenu(menuFile); + + setMenuBar(menubar); + + ShowMessage( tr("Done creating menu") ); +} + +void MainWindow::on_actionQuit_triggered() +{ + exit(EXIT_SUCCESS); +} + +void MainWindow::on_actionLoad_triggered() +{ + //DO SOMETHING COOL + QString fn = QFileDialog::getOpenFileName( this, + tr("Effects files(*.breft)"), + QCoreApplication::applicationDirPath(), + tr("BreftFiles (*.breft)")); + if(fn == "") { + ShowMessage( tr("No breft selected") ); + return; + } + + QByteArray data = ReadFile( fn ); + if( data.isEmpty() ) { + ShowMessage( tr("Bad breft file") ); + return; + } + + QDataStream stream(data); + header head; + stream >> head; + ShowMessage( tr("Header loaded") ); + reft rft; + stream >> rft; + ShowMessage( tr("Reft loaded") ); + qint64 curr_pos = stream.device()->pos(); + projct proj; + stream >> proj; + ShowMessage( tr("Project loaded") ); + char* project_name = new char[proj.str_length]; + stream.readRawData(project_name, proj.str_length); + ShowMessage( QString("Project name: %1").arg(project_name) ); + delete[] project_name; + stream.device()->seek(proj.length + curr_pos); + + qint64 temp_pos = stream.device()->pos(); + section1 sec1; + stream >> sec1; + + for(quint32 ii=0; ii> len; + char* string_name = new char[len]; + stream.readRawData(string_name, len); + ShowMessage( tr("String Name: %1").arg(string_name) ); + section1b sec1b; + stream >> sec1b; + curr_pos = stream.device()->pos(); + qint64 my_pos = temp_pos + sec1b.offset; + stream.device()->seek(my_pos); + picture_header pic_head; + stream >> pic_head; + ShowMessage( tr("Picture Header read") ); + QByteArray pic_data(pic_head.size, '\x00'); + stream.readRawData( pic_data.data() , pic_head.size ); + +// SHOW TPL ON SCREEN + +// SAVE TPL TO FILE +#if 0 + QFile tpl( "tpl_data/" + QString(string_name) + ".tpl" ); + if( !tpl.open( QIODevice::WriteOnly ) ) + { + ShowMessage( "Couldn't open " + QString(string_name) + " for writing<\b>" ); + }else{ + //Write header1 + QByteArray tplHead1; + char tpl_head[0x14] = { 0, 0x20, 0xaf, 0x30, + 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x00, 0x14, + 0x00, 0x00, 0x00, 0x00 }; + tplHead1.append(tpl_head, 0x14); + tpl.write( tplHead1 ); + //Write header2 + QByteArray tplHead2; + char tpl_head2[44] = { + 0x00, 0x80, 0x00, 0x80, //height && width + 0x00, 0x00, 0x00, 0x04, //format + 0x00, 0x00, 0x00, 0x40, //offset + 0x00, 0x00, 0x00, 0x00, //wrap_s + 0x00, 0x00, 0x00, 0x00, //wrap_t + 0x00, 0x00, 0x00, 0x01, //min + 0x00, 0x00, 0x00, 0x01, //mag + 0x00, 0x00, 0x00, 0x00, //lod_bias + 0x00, 0x00, 0x00, 0x00, //lods and unpacked + 0x00, 0x00, 0x00, 0x00, //padding + 0x00, 0x00, 0x00, 0x00 }; + *(quint16*)(tpl_head2 + 0) = qToBigEndian(pic_head.height); + *(quint16*)(tpl_head2 + 2) = qToBigEndian(pic_head.width); + *(quint32*)(tpl_head2 + 4) = qToBigEndian((quint32)pic_head.format); + tplHead2.append(tpl_head2, 44); + tpl.write( tplHead2 ); + //Write data + tpl.write( pic_data ); + tpl.close(); + ShowMessage( "Saved " + QString(string_name) ); + } +#endif + + stream.device()->seek(curr_pos); + delete[] string_name; + } + + ShowMessage( tr("Done loading a breft") ); +} + +void MainWindow::ShowMessage( const QString& mes ) +{ + QString str = mes; + plainTextEdit_log->appendHtml( str ); +} + diff --git a/breft_editor/mainwindow.h b/breft_editor/mainwindow.h new file mode 100644 index 0000000..7f5c0c6 --- /dev/null +++ b/breft_editor/mainwindow.h @@ -0,0 +1,46 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include "../WiiQt/includes.h" + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow( QWidget *parent = 0 ); + ~MainWindow(); + void ShowMessage( const QString& mes ); + +private: + void setupForms(); + void setupActions(); + void setupMenu(); + QGridLayout* Layout; + QAction* actionQuit; + QAction* actionLoad; + QMenuBar* menubar; + QMenu* menuFile; + QPlainTextEdit* plainTextEdit_log; + +public slots: + +private slots: + void on_actionQuit_triggered(); + void on_actionLoad_triggered(); + /* + void on_pushButton_CachePathBrowse_clicked(); + void on_actionFlush_triggered(); + void on_actionSetting_txt_triggered(); + void on_actionImportWad_triggered(); + void on_pushButton_wad_clicked(); + void on_pushButton_decFolder_clicked(); + void on_pushButton_nandPath_clicked(); + void on_radioButton_wad_toggled(bool checked); + void on_radioButton_folder_toggled(bool checked); + void on_radioButton_nand_toggled(bool checked); + void on_pushButton_GetTitle_clicked(); + */ +}; + +#endif // MAINWINDOW_H diff --git a/nand_dump/mainwindow.ui b/nand_dump/mainwindow.ui index 5860e12..197dab6 100644 --- a/nand_dump/mainwindow.ui +++ b/nand_dump/mainwindow.ui @@ -219,6 +219,7 @@ + @@ -249,6 +250,11 @@ Ctrl+I + + + Import Folder + +