From ffd769f7eda97424f00e84b256adc7b70d0fbe23 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 30 Sep 2018 14:54:38 -0500 Subject: [PATCH] Add palette and flip selectors to tileset editor --- forms/tileseteditor.ui | 262 ++++++++++++++++++------- include/core/tileset.h | 1 + include/ui/imageproviders.h | 2 +- include/ui/tileseteditor.h | 18 +- include/ui/tileseteditortileselector.h | 6 +- src/core/tileset.cpp | 11 ++ src/ui/imageproviders.cpp | 3 +- src/ui/tileseteditor.cpp | 51 ++++- src/ui/tileseteditortileselector.cpp | 19 +- 9 files changed, 278 insertions(+), 95 deletions(-) diff --git a/forms/tileseteditor.ui b/forms/tileseteditor.ui index dbc84d15..0eeffd04 100644 --- a/forms/tileseteditor.ui +++ b/forms/tileseteditor.ui @@ -25,7 +25,7 @@ 0 0 - 386 + 363 539 @@ -90,77 +90,199 @@ - - - true + + + QFrame::StyledPanel - - - - 0 - 0 - 386 - 539 - - - - - - - Qt::Horizontal + + QFrame::Raised + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Y Flip + + + + + + + Palette + + + + + + + + + + X Flip + + + + + + + Qt::LeftToRight + + + + + + + + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 32 + 32 + + + + + 32 + 32 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + + + + + + + + + + + true + + + + + 0 + 0 + 363 + 415 + - - - 40 - 20 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + diff --git a/include/core/tileset.h b/include/core/tileset.h index d18ab5e0..82113e4b 100644 --- a/include/core/tileset.h +++ b/include/core/tileset.h @@ -27,6 +27,7 @@ public: static Tileset* getBlockTileset(int, Tileset*, Tileset*); static Metatile* getMetatile(int, Tileset*, Tileset*); static QList> getBlockPalettes(Tileset*, Tileset*); + static QList getPalette(int, Tileset*, Tileset*); }; #endif // TILESET_H diff --git a/include/ui/imageproviders.h b/include/ui/imageproviders.h index c48f920f..96896e78 100644 --- a/include/ui/imageproviders.h +++ b/include/ui/imageproviders.h @@ -10,6 +10,6 @@ QImage getCollisionMetatileImage(Block); QImage getCollisionMetatileImage(int, int); QImage getMetatileImage(uint16_t, Tileset*, Tileset*); QImage getTileImage(uint16_t, Tileset*, Tileset*); -QImage getColoredTileImage(uint16_t, Tileset*, Tileset*, QList); +QImage getColoredTileImage(uint16_t, Tileset*, Tileset*, int); #endif // IMAGEPROVIDERS_H diff --git a/include/ui/tileseteditor.h b/include/ui/tileseteditor.h index 43370ab0..989fb717 100644 --- a/include/ui/tileseteditor.h +++ b/include/ui/tileseteditor.h @@ -26,18 +26,30 @@ private slots: void onHoveredTileCleared(); 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: void initMetatileSelector(); void initTileSelector(); + void initSelectedTileItem(); + void drawSelectedTile(); Ui::TilesetEditor *ui; TilesetEditorMetatileSelector *metatileSelector; TilesetEditorTileSelector *tileSelector; Project *project; - uint paletteNum; + int paletteId; + bool tileXFlip; + bool tileYFlip; QString primaryTilesetLabel; QString secondaryTilesetLabel; - QGraphicsScene *metatilesScene; - QGraphicsScene *tilesScene; + QGraphicsScene *metatilesScene = nullptr; + QGraphicsScene *tilesScene = nullptr; + QGraphicsScene *selectedTileScene = nullptr; + QGraphicsPixmapItem *selectedTilePixmapItem = nullptr; }; #endif // TILESETEDITOR_H diff --git a/include/ui/tileseteditortileselector.h b/include/ui/tileseteditortileselector.h index d13aa19e..7369babb 100644 --- a/include/ui/tileseteditortileselector.h +++ b/include/ui/tileseteditortileselector.h @@ -11,13 +11,13 @@ public: this->primaryTileset = primaryTileset; this->secondaryTileset = secondaryTileset; this->numTilesWide = 16; - this->paletteNum = 0; + this->paletteId = 0; setAcceptHoverEvents(true); } void draw(); void select(uint16_t metatileId); void setTilesets(Tileset*, Tileset*); - void setPaletteNum(int); + void setPaletteId(int); uint16_t getSelectedTile(); protected: @@ -32,7 +32,7 @@ private: Tileset *secondaryTileset; uint16_t selectedTile; int numTilesWide; - int paletteNum; + int paletteId; void updateSelectedTile(); uint16_t getTileId(int x, int y); QPoint getTileCoords(uint16_t); diff --git a/src/core/tileset.cpp b/src/core/tileset.cpp index 772e4d7b..36187c02 100644 --- a/src/core/tileset.cpp +++ b/src/core/tileset.cpp @@ -39,3 +39,14 @@ QList> Tileset::getBlockPalettes(Tileset *primaryTileset, Tileset *s } return palettes; } + +QList Tileset::getPalette(int paletteId, Tileset *primaryTileset, Tileset *secondaryTileset) { + QList 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; +} diff --git a/src/ui/imageproviders.cpp b/src/ui/imageproviders.cpp index bda02cc0..2a1bc5ef 100644 --- a/src/ui/imageproviders.cpp +++ b/src/ui/imageproviders.cpp @@ -80,7 +80,8 @@ QImage getTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTi return tileset->tiles->value(local_index, QImage()); } -QImage getColoredTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTileset, QList palette) { +QImage getColoredTileImage(uint16_t tile, Tileset *primaryTileset, Tileset *secondaryTileset, int paletteId) { + QList palette = Tileset::getPalette(paletteId, primaryTileset, secondaryTileset); QImage tileImage = getTileImage(tile, primaryTileset, secondaryTileset); for (int i = 0; i < 16; i++) { tileImage.setColor(i, palette.at(i)); diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp index 63c90ff1..f9774eed 100644 --- a/src/ui/tileseteditor.cpp +++ b/src/ui/tileseteditor.cpp @@ -1,5 +1,6 @@ #include "tileseteditor.h" #include "ui_tileseteditor.h" +#include "imageproviders.h" #include TilesetEditor::TilesetEditor(Project *project, QString primaryTilesetLabel, QString secondaryTilesetLabel, QWidget *parent) : @@ -9,11 +10,17 @@ TilesetEditor::TilesetEditor(Project *project, QString primaryTilesetLabel, QStr ui->setupUi(this); 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->secondaryTilesetLabel = secondaryTilesetLabel; - initMetatileSelector(); - initTileSelector(); + ui->spinBox_paletteSelector->setMinimum(0); + ui->spinBox_paletteSelector->setMaximum(Project::getNumPalettesTotal() - 1); + this->initMetatileSelector(); + this->initTileSelector(); + this->initSelectedTileItem(); } TilesetEditor::~TilesetEditor() @@ -63,6 +70,25 @@ void TilesetEditor::initTileSelector() 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) { QString message = QString("Metatile: 0x%1") .arg(QString("%1").arg(metatileId, 3, 16, QChar('0')).toUpper()); @@ -88,5 +114,24 @@ void TilesetEditor::onHoveredTileCleared() { } 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(); } diff --git a/src/ui/tileseteditortileselector.cpp b/src/ui/tileseteditortileselector.cpp index 367af1b4..09bc2d60 100644 --- a/src/ui/tileseteditortileselector.cpp +++ b/src/ui/tileseteditortileselector.cpp @@ -13,19 +13,19 @@ void TilesetEditorTileSelector::draw() { int primaryLength = this->primaryTileset->tiles->length(); int secondaryLength = this->secondaryTileset->tiles->length(); int height = totalTiles / this->numTilesWide; - QList palette = this->getCurPaletteTable(); + QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset); QImage image(this->numTilesWide * 16, height * 16, QImage::Format_RGBA8888); QPainter painter(&image); for (uint16_t tile = 0; tile < totalTiles; tile++) { QImage tileImage; 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()) { tileImage = QImage(16, 16, QImage::Format_RGBA8888); tileImage.fill(palette.at(0)); } 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 { tileImage = QImage(16, 16, QImage::Format_RGBA8888); QPainter painter(&tileImage); @@ -43,15 +43,6 @@ void TilesetEditorTileSelector::draw() { this->drawSelection(); } -QList TilesetEditorTileSelector::getCurPaletteTable() { - QList 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) { QPoint coords = this->getTileCoords(tile); SelectablePixmapItem::select(coords.x(), coords.y(), 0, 0); @@ -65,8 +56,8 @@ void TilesetEditorTileSelector::setTilesets(Tileset *primaryTileset, Tileset *se this->draw(); } -void TilesetEditorTileSelector::setPaletteNum(int paletteNum) { - this->paletteNum = paletteNum; +void TilesetEditorTileSelector::setPaletteId(int paletteId) { + this->paletteId = paletteId; this->draw(); }