Add palette and flip selectors to tileset editor

This commit is contained in:
Marcus Huderle 2018-09-30 14:54:38 -05:00
parent 0bc3513b15
commit ffd769f7ed
9 changed files with 278 additions and 95 deletions

View file

@ -25,7 +25,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>386</width> <width>363</width>
<height>539</height> <height>539</height>
</rect> </rect>
</property> </property>
@ -90,77 +90,199 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QScrollArea" name="scrollArea_Tiles"> <widget class="QFrame" name="frame_2">
<property name="widgetResizable"> <property name="frameShape">
<bool>true</bool> <enum>QFrame::StyledPanel</enum>
</property> </property>
<widget class="QWidget" name="scrollAreaWidgetContents"> <property name="frameShadow">
<property name="geometry"> <enum>QFrame::Raised</enum>
<rect> </property>
<x>0</x> <layout class="QVBoxLayout" name="verticalLayout">
<y>0</y> <item alignment="Qt::AlignTop">
<width>386</width> <widget class="QFrame" name="frame_4">
<height>539</height> <property name="frameShape">
</rect> <enum>QFrame::StyledPanel</enum>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <property name="frameShadow">
<item row="1" column="0"> <enum>QFrame::Raised</enum>
<spacer name="horizontalSpacer_3"> </property>
<property name="orientation"> <layout class="QHBoxLayout" name="horizontalLayout_4">
<enum>Qt::Horizontal</enum> <item>
<widget class="QFrame" name="frame_3">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QFormLayout" name="formLayout_3">
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Y Flip</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Palette</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBox_paletteSelector"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>X Flip</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="checkBox_xFlip">
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="checkBox_yFlip">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="frame_5">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QGraphicsView" name="graphicsView_selectedTile">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QScrollArea" name="scrollArea_Tiles">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>363</width>
<height>415</height>
</rect>
</property> </property>
<property name="sizeHint" stdset="0"> <layout class="QGridLayout" name="gridLayout_2">
<size> <item row="1" column="2">
<width>40</width> <spacer name="horizontalSpacer_4">
<height>20</height> <property name="orientation">
</size> <enum>Qt::Horizontal</enum>
</property> </property>
</spacer> <property name="sizeHint" stdset="0">
</item> <size>
<item row="0" column="1"> <width>40</width>
<spacer name="verticalSpacer_3"> <height>20</height>
<property name="orientation"> </size>
<enum>Qt::Vertical</enum> </property>
</property> </spacer>
<property name="sizeHint" stdset="0"> </item>
<size> <item row="0" column="1">
<width>20</width> <spacer name="verticalSpacer_3">
<height>40</height> <property name="orientation">
</size> <enum>Qt::Vertical</enum>
</property> </property>
</spacer> <property name="sizeHint" stdset="0">
</item> <size>
<item row="1" column="1"> <width>20</width>
<widget class="QGraphicsView" name="graphicsView_Tiles"/> <height>40</height>
</item> </size>
<item row="1" column="2"> </property>
<spacer name="horizontalSpacer_4"> </spacer>
<property name="orientation"> </item>
<enum>Qt::Horizontal</enum> <item row="1" column="1">
</property> <widget class="QGraphicsView" name="graphicsView_Tiles"/>
<property name="sizeHint" stdset="0"> </item>
<size> <item row="2" column="1">
<width>40</width> <spacer name="verticalSpacer_4">
<height>20</height> <property name="orientation">
</size> <enum>Qt::Vertical</enum>
</property> </property>
</spacer> <property name="sizeHint" stdset="0">
</item> <size>
<item row="2" column="1"> <width>20</width>
<spacer name="verticalSpacer_4"> <height>40</height>
<property name="orientation"> </size>
<enum>Qt::Vertical</enum> </property>
</property> </spacer>
<property name="sizeHint" stdset="0"> </item>
<size> <item row="1" column="0">
<width>20</width> <spacer name="horizontalSpacer_3">
<height>40</height> <property name="orientation">
</size> <enum>Qt::Horizontal</enum>
</property> </property>
</spacer> <property name="sizeHint" stdset="0">
</item> <size>
</layout> <width>40</width>
</widget> <height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QFormLayout" name="formLayout"/>
</widget> </widget>
</item> </item>
</layout> </layout>

View file

@ -27,6 +27,7 @@ public:
static Tileset* getBlockTileset(int, Tileset*, Tileset*); static Tileset* getBlockTileset(int, Tileset*, Tileset*);
static Metatile* getMetatile(int, Tileset*, Tileset*); static Metatile* getMetatile(int, Tileset*, Tileset*);
static QList<QList<QRgb>> getBlockPalettes(Tileset*, Tileset*); static QList<QList<QRgb>> getBlockPalettes(Tileset*, Tileset*);
static QList<QRgb> getPalette(int, Tileset*, Tileset*);
}; };
#endif // TILESET_H #endif // TILESET_H

View file

@ -10,6 +10,6 @@ QImage getCollisionMetatileImage(Block);
QImage getCollisionMetatileImage(int, int); QImage getCollisionMetatileImage(int, int);
QImage getMetatileImage(uint16_t, Tileset*, Tileset*); QImage getMetatileImage(uint16_t, Tileset*, Tileset*);
QImage getTileImage(uint16_t, Tileset*, Tileset*); QImage getTileImage(uint16_t, Tileset*, Tileset*);
QImage getColoredTileImage(uint16_t, Tileset*, Tileset*, QList<QRgb>); QImage getColoredTileImage(uint16_t, Tileset*, Tileset*, int);
#endif // IMAGEPROVIDERS_H #endif // IMAGEPROVIDERS_H

View file

@ -26,18 +26,30 @@ private slots:
void onHoveredTileCleared(); void onHoveredTileCleared();
void onSelectedTileChanged(uint16_t); void onSelectedTileChanged(uint16_t);
void on_spinBox_paletteSelector_valueChanged(int arg1);
void on_checkBox_xFlip_stateChanged(int arg1);
void on_checkBox_yFlip_stateChanged(int arg1);
private: private:
void initMetatileSelector(); void initMetatileSelector();
void initTileSelector(); void initTileSelector();
void initSelectedTileItem();
void drawSelectedTile();
Ui::TilesetEditor *ui; Ui::TilesetEditor *ui;
TilesetEditorMetatileSelector *metatileSelector; TilesetEditorMetatileSelector *metatileSelector;
TilesetEditorTileSelector *tileSelector; TilesetEditorTileSelector *tileSelector;
Project *project; Project *project;
uint paletteNum; int paletteId;
bool tileXFlip;
bool tileYFlip;
QString primaryTilesetLabel; QString primaryTilesetLabel;
QString secondaryTilesetLabel; QString secondaryTilesetLabel;
QGraphicsScene *metatilesScene; QGraphicsScene *metatilesScene = nullptr;
QGraphicsScene *tilesScene; QGraphicsScene *tilesScene = nullptr;
QGraphicsScene *selectedTileScene = nullptr;
QGraphicsPixmapItem *selectedTilePixmapItem = nullptr;
}; };
#endif // TILESETEDITOR_H #endif // TILESETEDITOR_H

View file

@ -11,13 +11,13 @@ public:
this->primaryTileset = primaryTileset; this->primaryTileset = primaryTileset;
this->secondaryTileset = secondaryTileset; this->secondaryTileset = secondaryTileset;
this->numTilesWide = 16; this->numTilesWide = 16;
this->paletteNum = 0; this->paletteId = 0;
setAcceptHoverEvents(true); setAcceptHoverEvents(true);
} }
void draw(); void draw();
void select(uint16_t metatileId); void select(uint16_t metatileId);
void setTilesets(Tileset*, Tileset*); void setTilesets(Tileset*, Tileset*);
void setPaletteNum(int); void setPaletteId(int);
uint16_t getSelectedTile(); uint16_t getSelectedTile();
protected: protected:
@ -32,7 +32,7 @@ private:
Tileset *secondaryTileset; Tileset *secondaryTileset;
uint16_t selectedTile; uint16_t selectedTile;
int numTilesWide; int numTilesWide;
int paletteNum; int paletteId;
void updateSelectedTile(); void updateSelectedTile();
uint16_t getTileId(int x, int y); uint16_t getTileId(int x, int y);
QPoint getTileCoords(uint16_t); QPoint getTileCoords(uint16_t);

View file

@ -39,3 +39,14 @@ QList<QList<QRgb>> Tileset::getBlockPalettes(Tileset *primaryTileset, Tileset *s
} }
return palettes; return palettes;
} }
QList<QRgb> Tileset::getPalette(int paletteId, Tileset *primaryTileset, Tileset *secondaryTileset) {
QList<QRgb> paletteTable;
Tileset *tileset = paletteId < Project::getNumPalettesPrimary()
? primaryTileset
: secondaryTileset;
for (int i = 0; i < tileset->palettes->at(paletteId).length(); i++) {
paletteTable.append(tileset->palettes->at(paletteId).at(i));
}
return paletteTable;
}

View file

@ -80,7 +80,8 @@ QImage getTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTi
return tileset->tiles->value(local_index, QImage()); return tileset->tiles->value(local_index, QImage());
} }
QImage getColoredTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTileset, QList<QRgb> palette) { QImage getColoredTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTileset, int paletteId) {
QList<QRgb> palette = Tileset::getPalette(paletteId, primaryTileset, secondaryTileset);
QImage tileImage = getTileImage(tile, primaryTileset, secondaryTileset); QImage tileImage = getTileImage(tile, primaryTileset, secondaryTileset);
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
tileImage.setColor(i, palette.at(i)); tileImage.setColor(i, palette.at(i));

View file

@ -1,5 +1,6 @@
#include "tileseteditor.h" #include "tileseteditor.h"
#include "ui_tileseteditor.h" #include "ui_tileseteditor.h"
#include "imageproviders.h"
#include <QDebug> #include <QDebug>
TilesetEditor::TilesetEditor(Project *project, QString primaryTilesetLabel, QString secondaryTilesetLabel, QWidget *parent) : TilesetEditor::TilesetEditor(Project *project, QString primaryTilesetLabel, QString secondaryTilesetLabel, QWidget *parent) :
@ -9,11 +10,17 @@ TilesetEditor::TilesetEditor(Project *project, QString primaryTilesetLabel, QStr
ui->setupUi(this); ui->setupUi(this);
this->project = project; this->project = project;
this->tileXFlip = ui->checkBox_xFlip->isChecked();
this->tileYFlip = ui->checkBox_yFlip->isChecked();
this->paletteId = ui->spinBox_paletteSelector->value();
this->primaryTilesetLabel = primaryTilesetLabel; this->primaryTilesetLabel = primaryTilesetLabel;
this->secondaryTilesetLabel = secondaryTilesetLabel; this->secondaryTilesetLabel = secondaryTilesetLabel;
initMetatileSelector(); ui->spinBox_paletteSelector->setMinimum(0);
initTileSelector(); ui->spinBox_paletteSelector->setMaximum(Project::getNumPalettesTotal() - 1);
this->initMetatileSelector();
this->initTileSelector();
this->initSelectedTileItem();
} }
TilesetEditor::~TilesetEditor() TilesetEditor::~TilesetEditor()
@ -63,6 +70,25 @@ void TilesetEditor::initTileSelector()
this->ui->graphicsView_Tiles->setFixedSize(this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2); this->ui->graphicsView_Tiles->setFixedSize(this->tileSelector->pixmap().width() + 2, this->tileSelector->pixmap().height() + 2);
} }
void TilesetEditor::initSelectedTileItem() {
this->selectedTileScene = new QGraphicsScene;
this->drawSelectedTile();
this->ui->graphicsView_selectedTile->setScene(this->selectedTileScene);
}
void TilesetEditor::drawSelectedTile() {
if (!this->selectedTileScene) {
return;
}
Tileset *primaryTileset = this->project->getTileset(this->primaryTilesetLabel);
Tileset *secondaryTileset = this->project->getTileset(this->secondaryTilesetLabel);
QImage tileImage = getColoredTileImage(this->tileSelector->getSelectedTile(), primaryTileset, secondaryTileset, this->paletteId)
.mirrored(this->tileXFlip, this->tileYFlip);
this->selectedTilePixmapItem = new QGraphicsPixmapItem(QPixmap::fromImage(tileImage).scaled(32, 32));
this->selectedTileScene->addItem(this->selectedTilePixmapItem);
}
void TilesetEditor::onHoveredMetatileChanged(uint16_t metatileId) { void TilesetEditor::onHoveredMetatileChanged(uint16_t metatileId) {
QString message = QString("Metatile: 0x%1") QString message = QString("Metatile: 0x%1")
.arg(QString("%1").arg(metatileId, 3, 16, QChar('0')).toUpper()); .arg(QString("%1").arg(metatileId, 3, 16, QChar('0')).toUpper());
@ -88,5 +114,24 @@ void TilesetEditor::onHoveredTileCleared() {
} }
void TilesetEditor::onSelectedTileChanged(uint16_t) { void TilesetEditor::onSelectedTileChanged(uint16_t) {
this->drawSelectedTile();
}
void TilesetEditor::on_spinBox_paletteSelector_valueChanged(int paletteId)
{
this->paletteId = paletteId;
this->tileSelector->setPaletteId(paletteId);
this->drawSelectedTile();
}
void TilesetEditor::on_checkBox_xFlip_stateChanged(int checked)
{
this->tileXFlip = checked;
this->drawSelectedTile();
}
void TilesetEditor::on_checkBox_yFlip_stateChanged(int checked)
{
this->tileYFlip = checked;
this->drawSelectedTile();
} }

View file

@ -13,19 +13,19 @@ void TilesetEditorTileSelector::draw() {
int primaryLength = this->primaryTileset->tiles->length(); int primaryLength = this->primaryTileset->tiles->length();
int secondaryLength = this->secondaryTileset->tiles->length(); int secondaryLength = this->secondaryTileset->tiles->length();
int height = totalTiles / this->numTilesWide; int height = totalTiles / this->numTilesWide;
QList<QRgb> palette = this->getCurPaletteTable(); QList<QRgb> palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset);
QImage image(this->numTilesWide * 16, height * 16, QImage::Format_RGBA8888); QImage image(this->numTilesWide * 16, height * 16, QImage::Format_RGBA8888);
QPainter painter(&image); QPainter painter(&image);
for (uint16_t tile = 0; tile < totalTiles; tile++) { for (uint16_t tile = 0; tile < totalTiles; tile++) {
QImage tileImage; QImage tileImage;
if (tile < primaryLength) { if (tile < primaryLength) {
tileImage = getColoredTileImage(tile, this->primaryTileset, this->secondaryTileset, palette).scaled(16, 16); tileImage = getColoredTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId).scaled(16, 16);
} else if (tile < Project::getNumTilesPrimary()) { } else if (tile < Project::getNumTilesPrimary()) {
tileImage = QImage(16, 16, QImage::Format_RGBA8888); tileImage = QImage(16, 16, QImage::Format_RGBA8888);
tileImage.fill(palette.at(0)); tileImage.fill(palette.at(0));
} else if (tile < Project::getNumTilesPrimary() + secondaryLength) { } else if (tile < Project::getNumTilesPrimary() + secondaryLength) {
tileImage = getColoredTileImage(tile, this->primaryTileset, this->secondaryTileset, palette).scaled(16, 16); tileImage = getColoredTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId).scaled(16, 16);
} else { } else {
tileImage = QImage(16, 16, QImage::Format_RGBA8888); tileImage = QImage(16, 16, QImage::Format_RGBA8888);
QPainter painter(&tileImage); QPainter painter(&tileImage);
@ -43,15 +43,6 @@ void TilesetEditorTileSelector::draw() {
this->drawSelection(); this->drawSelection();
} }
QList<QRgb> TilesetEditorTileSelector::getCurPaletteTable() {
QList<QRgb> paletteTable;
for (int i = 0; i < this->primaryTileset->palettes->at(this->paletteNum).length(); i++) {
paletteTable.append(this->primaryTileset->palettes->at(this->paletteNum).at(i));
}
return paletteTable;
}
void TilesetEditorTileSelector::select(uint16_t tile) { void TilesetEditorTileSelector::select(uint16_t tile) {
QPoint coords = this->getTileCoords(tile); QPoint coords = this->getTileCoords(tile);
SelectablePixmapItem::select(coords.x(), coords.y(), 0, 0); SelectablePixmapItem::select(coords.x(), coords.y(), 0, 0);
@ -65,8 +56,8 @@ void TilesetEditorTileSelector::setTilesets(Tileset *primaryTileset, Tileset *se
this->draw(); this->draw();
} }
void TilesetEditorTileSelector::setPaletteNum(int paletteNum) { void TilesetEditorTileSelector::setPaletteId(int paletteId) {
this->paletteNum = paletteNum; this->paletteId = paletteId;
this->draw(); this->draw();
} }