Skip to content

Commit

Permalink
added support for browsing and saving from cat texture files
Browse files Browse the repository at this point in the history
  • Loading branch information
Renari committed Jun 5, 2016
1 parent 7626e8d commit 6f28ede
Show file tree
Hide file tree
Showing 8 changed files with 217 additions and 15 deletions.
10 changes: 7 additions & 3 deletions SKFM/SKFM.pro
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,19 @@ QT += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = SKM
TARGET = SKFM
TEMPLATE = app


SOURCES += main.cpp\
mainwindow.cpp \
gxtfile.cpp
gxtfile.cpp \
catfile.cpp \
resourcefile.cpp

HEADERS += mainwindow.h \
gxtfile.h
gxtfile.h \
catfile.h \
resourcefile.h

FORMS += mainwindow.ui
101 changes: 101 additions & 0 deletions SKFM/catfile.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#include "catfile.h"
#include <QFile>
#include <QFileInfo>
#include <QMessageBox>

CatFile::CatFile(QString filePath)
{
location = filePath;
fileName = QFileInfo(filePath).fileName();
QFile file(filePath);
if(file.open(QIODevice::ReadOnly))
{
file.read((char*)&headerSize, sizeof(int));
file.read((char*)&extraData, sizeof(int));
file.seek(extraData);
file.read((char*)&extraSize, sizeof(int));
file.read((char*)&fileCount, sizeof(int));
file.read((char*)&fileSize, sizeof(int));
contentOffsets = new int[fileCount];
for(int i = 0; i < fileCount; i++)
{
file.read((char*)&contentOffsets[i], sizeof(int));
}
}
else
{
QMessageBox msgBox;
msgBox.setText("Unable to open " + fileName);
msgBox.exec();
}
file.close();
}

int CatFile::getHeaderSize()
{
return headerSize;
}

int CatFile::getFileCount()
{
return fileCount;
}

int CatFile::getFileSize()
{
return fileSize;
}

int CatFile::getContentOffset(int index)
{
if (index <= fileCount && index > 0)
{
return contentOffsets[index];
}
return 0;
}

QString CatFile::getFileName()
{
return fileName;
}

QString CatFile::getFileLocation()
{
return location;
}

QByteArray CatFile::readFileData(int index)
{
QFile file(location);
if(file.open(QIODevice::ReadOnly))
{
file.seek(contentOffsets[index - 1] + extraData + extraSize);

int size;

// if this is the last file the file ends at the end of the gxt file
if (index == fileCount)
{
size = file.size() - contentOffsets[index - 1] - extraData - extraSize;
}
else
{
size = contentOffsets[index] - contentOffsets[index - 1];
}
return file.read(size);
}
return QByteArray();
}

QPixmap CatFile::readDDSFile(int index)
{
if (index > fileCount || index < 1)
return QPixmap();

QByteArray dds = readFileData(index);
QPixmap pixmap;
pixmap.loadFromData(dds);

return pixmap;
}
30 changes: 30 additions & 0 deletions SKFM/catfile.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#ifndef CATFILE_H
#define CATFILE_H

#include<QPixmap>
#include "resourcefile.h"

class CatFile : public ResourceFile
{
public:
CatFile(QString);
int getHeaderSize();
int getFileCount();
int getFileSize();
int getContentOffset(int);
QString getFileName();
QString getFileLocation();
QPixmap readDDSFile(int);
QByteArray readFileData(int);
private:
int headerSize;
int extraData;
int extraSize;
int fileCount;
int fileSize;
int* contentOffsets;
QString fileName;
QString location;
};

#endif // CATFILE_H
3 changes: 2 additions & 1 deletion SKFM/gxtfile.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@

#include <QString>
#include <QPixmap>
#include "resourcefile.h"

class GxtFile
class GxtFile : public ResourceFile
{
public:
GxtFile(QString filePath);
Expand Down
54 changes: 44 additions & 10 deletions SKFM/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,26 +37,35 @@ void MainWindow::on_actionOpen_triggered()
this,
"Open File",
lastOpenedPath.isEmpty() ? QDir::homePath() : lastOpenedPath,
"Senran Kagura Resource File (*.gxt)");
"Senran Kagura Resource File (*.gxt *tex.cat)");

if (!filePath.isEmpty())
{
QFileInfo file = QFileInfo(filePath);
lastOpenedPath = file.absoluteDir().absolutePath();

ui->treeWidget->clear();

gxtFiles.push_back(new GxtFile(filePath));

QTreeWidgetItem *item = new QTreeWidgetItem();
ui->treeWidget->clear();
item->setText(0, QFileInfo(filePath).baseName());

int fileCount = gxtFiles.last()->getFileCount();
if (!file.suffix().compare("gxt", Qt::CaseInsensitive))
{
openedResource = new GxtFile(filePath);
}
else if (!file.suffix().compare("cat", Qt::CaseInsensitive))
{
openedResource = new CatFile(filePath);
}

int fileCount = openedResource->getFileCount();

for (int i = 0; i < fileCount; i++)
for (int i = 1; i <= fileCount; i++)
{
QTreeWidgetItem *childItem = new QTreeWidgetItem();
childItem->setText(0, QString::number(i + 1));

QString childText = QString::number(i);

childItem->setText(0, childText);
item->addChild(childItem);
}
ui->treeWidget->addTopLevelItem(item);
Expand Down Expand Up @@ -99,7 +108,18 @@ void MainWindow::on_treeWidget_itemSelectionChanged()
void MainWindow::loadImageToView(int index)
{
scene->clear();
QPixmap pixmap = gxtFiles.last()->readDDSFile(index);
QFileInfo fileInfo = QFileInfo(openedResource->getFileLocation());
QPixmap pixmap;
if (!fileInfo.suffix().compare("gxt", Qt::CaseInsensitive))
{
GxtFile *gxtFile = dynamic_cast<GxtFile *>(openedResource);
pixmap = gxtFile->readDDSFile(index);
}
else if (!fileInfo.suffix().compare("cat", Qt::CaseInsensitive))
{
CatFile *catFile = dynamic_cast<CatFile *>(openedResource);
pixmap = catFile->readDDSFile(index);
}
scene->setSceneRect(0, 0, pixmap.width(), pixmap.height());
QGraphicsPixmapItem *texture = new QGraphicsPixmapItem(pixmap);
scene->addItem(texture);
Expand All @@ -116,10 +136,24 @@ void MainWindow::on_actionSave_triggered()
"Save File",
QDir::homePath(),
"DirectDraw Surface (*.dds)");

QFile file(path);
QFileInfo fileInfo = QFileInfo(openedResource->getFileLocation());

if(!file.open(QIODevice::WriteOnly))
return;
file.write(gxtFiles.last()->readFileData(getSelectedItem()));

if (!fileInfo.suffix().compare("gxt", Qt::CaseInsensitive))
{
GxtFile *gxtFile = dynamic_cast<GxtFile *>(openedResource);
file.write(gxtFile->readFileData(getSelectedItem()));
}
else if (!fileInfo.suffix().compare("cat", Qt::CaseInsensitive))
{
CatFile *catFile = dynamic_cast<CatFile *>(openedResource);
file.write(catFile->readFileData(getSelectedItem()));
}

file.close();
}
}
Expand Down
4 changes: 3 additions & 1 deletion SKFM/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <QGraphicsView>
#include <QTreeWidgetItem>
#include "gxtfile.h"
#include "catfile.h"

using std::vector;

Expand All @@ -32,7 +33,8 @@ private slots:

private:
Ui::MainWindow *ui;
QVector<GxtFile*> gxtFiles;
ResourceFile *openedResource;
//QVector<GxtFile*> gxtFiles;
//QVector<CatFile*> catFiles;
QGraphicsScene *scene;
QByteArray *selectedImageData;
Expand Down
11 changes: 11 additions & 0 deletions SKFM/resourcefile.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#include "resourcefile.h"

ResourceFile::ResourceFile()
{

}

ResourceFile::~ResourceFile()
{

}
19 changes: 19 additions & 0 deletions SKFM/resourcefile.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#ifndef RESOURCEFILE_H
#define RESOURCEFILE_H

#include <QString>

class ResourceFile
{
public:
ResourceFile();
virtual ~ResourceFile();
virtual int getHeaderSize() = 0;
virtual int getFileCount() = 0;
virtual int getFileSize() = 0;
virtual int getContentOffset(int) = 0;
virtual QString getFileName() = 0;
virtual QString getFileLocation() = 0;
};

#endif // RESOURCEFILE_H

0 comments on commit 6f28ede

Please sign in to comment.