diff --git a/forms/tileseteditor.ui b/forms/tileseteditor.ui
index 572cd478..960142d5 100644
--- a/forms/tileseteditor.ui
+++ b/forms/tileseteditor.ui
@@ -527,9 +527,11 @@
+
+
-
+
@@ -582,6 +584,14 @@
Display Unused Metatiles
+
+
+ true
+
+
+ Display Unused Tiles
+
+
true
diff --git a/include/ui/tileseteditor.h b/include/ui/tileseteditor.h
index c95bd521..ab901627 100644
--- a/include/ui/tileseteditor.h
+++ b/include/ui/tileseteditor.h
@@ -77,6 +77,7 @@ private slots:
void on_actionShow_Unused_toggled(bool checked);
void on_actionShow_Counts_toggled(bool checked);
+ void on_actionShow_UnusedTiles_toggled(bool checked);
void on_actionUndo_triggered();
@@ -123,6 +124,7 @@ private:
void saveMetatileLabel();
void closeEvent(QCloseEvent*);
void countMetatileUsage();
+ void countTileUsage();
Ui::TilesetEditor *ui;
History metatileHistory;
diff --git a/include/ui/tileseteditormetatileselector.h b/include/ui/tileseteditormetatileselector.h
index 05223fd4..432241e7 100644
--- a/include/ui/tileseteditormetatileselector.h
+++ b/include/ui/tileseteditormetatileselector.h
@@ -17,7 +17,6 @@ public:
void updateSelectedMetatile();
QPoint getMetatileIdCoordsOnWidget(uint16_t metatileId);
- //
QVector usedMetatiles;
bool selectorShowUnused = false;
bool selectorShowCounts = false;
diff --git a/include/ui/tileseteditortileselector.h b/include/ui/tileseteditortileselector.h
index 80f346ae..4d270a40 100644
--- a/include/ui/tileseteditortileselector.h
+++ b/include/ui/tileseteditortileselector.h
@@ -31,6 +31,9 @@ public:
QImage buildPrimaryTilesIndexedImage();
QImage buildSecondaryTilesIndexedImage();
+ QVector usedTiles;
+ bool showUnused = false;
+
protected:
void mousePressEvent(QGraphicsSceneMouseEvent*);
void mouseMoveEvent(QGraphicsSceneMouseEvent*);
@@ -59,6 +62,8 @@ private:
QList getCurPaletteTable();
QList buildSelectedTiles(int, int, QList);
+ void drawUnused();
+
signals:
void hoveredTileChanged(uint16_t);
void hoveredTileCleared();
diff --git a/src/project.cpp b/src/project.cpp
index 64a2f741..97503b48 100644
--- a/src/project.cpp
+++ b/src/project.cpp
@@ -1089,11 +1089,6 @@ void Project::saveTilesetPalettes(Tileset *tileset) {
}
bool Project::loadLayoutTilesets(MapLayout *layout) {
- // TODO: investigate where to put this now
- // if (map->hasUnsavedChanges()) {
- // return true;
- // }
-
layout->tileset_primary = getTileset(layout->tileset_primary_label);
if (!layout->tileset_primary) {
QString defaultTileset = tilesetLabels["primary"].value(0, "gTileset_General");
diff --git a/src/ui/tileseteditor.cpp b/src/ui/tileseteditor.cpp
index 5a4de7a9..9660fbbd 100644
--- a/src/ui/tileseteditor.cpp
+++ b/src/ui/tileseteditor.cpp
@@ -288,6 +288,13 @@ void TilesetEditor::refresh() {
}
}
+ if (tileSelector) {
+ if (tileSelector->showUnused) {
+ countTileUsage();
+ this->tileSelector->draw();
+ }
+ }
+
this->ui->graphicsView_Tiles->setSceneRect(0, 0, 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);
this->ui->graphicsView_Metatiles->setSceneRect(0, 0, this->metatileSelector->pixmap().width() + 2, this->metatileSelector->pixmap().height() + 2);
@@ -933,6 +940,14 @@ void TilesetEditor::on_actionShow_Counts_toggled(bool checked) {
this->metatileSelector->draw();
}
+void TilesetEditor::on_actionShow_UnusedTiles_toggled(bool checked) {
+ this->tileSelector->showUnused = checked;
+
+ if (checked) countTileUsage();
+
+ this->tileSelector->draw();
+}
+
void TilesetEditor::countMetatileUsage() {
// do not double count
metatileSelector->usedMetatiles.fill(0);
@@ -973,3 +988,59 @@ void TilesetEditor::countMetatileUsage() {
}
}
}
+
+void TilesetEditor::countTileUsage() {
+ // check primary tiles
+ this->tileSelector->usedTiles.resize(Project::getNumTilesTotal());
+ this->tileSelector->usedTiles.fill(0);
+
+ QSet primaryTilesets;
+ QSet secondaryTilesets;
+
+ for (auto layout : this->project->mapLayouts.values()) {
+ if (layout->tileset_primary_label == this->primaryTileset->name
+ || layout->tileset_secondary_label == this->secondaryTileset->name) {
+ this->project->loadLayoutTilesets(layout);
+ // need to check metatiles
+ if (layout->tileset_primary && layout->tileset_secondary) {
+ primaryTilesets.insert(layout->tileset_primary);
+ secondaryTilesets.insert(layout->tileset_secondary);
+ }
+ }
+ }
+
+ // check primary tilesets that are used with this secondary tileset for
+ // reference to secondary tiles in primary metatiles
+ for (Tileset *tileset : primaryTilesets) {
+ for (Metatile *metatile : tileset->metatiles) {
+ for (Tile tile : metatile->tiles) {
+ if (tile.tile >= Project::getNumTilesPrimary())
+ this->tileSelector->usedTiles[tile.tile]++;
+ }
+ }
+ }
+
+ // do the opposite for primary tiles in secondary metatiles
+ for (Tileset *tileset : secondaryTilesets) {
+ for (Metatile *metatile : tileset->metatiles) {
+ for (Tile tile : metatile->tiles) {
+ if (tile.tile < Project::getNumTilesPrimary())
+ this->tileSelector->usedTiles[tile.tile]++;
+ }
+ }
+ }
+
+ // check this primary tileset metatiles
+ for (Metatile *metatile : this->primaryTileset->metatiles) {
+ for (Tile tile : metatile->tiles) {
+ this->tileSelector->usedTiles[tile.tile]++;
+ }
+ }
+
+ // and the secondary metatiles
+ for (Metatile *metatile : this->secondaryTileset->metatiles) {
+ for (Tile tile : metatile->tiles) {
+ this->tileSelector->usedTiles[tile.tile]++;
+ }
+ }
+}
diff --git a/src/ui/tileseteditormetatileselector.cpp b/src/ui/tileseteditormetatileselector.cpp
index 687dbe5f..4c67aa0a 100644
--- a/src/ui/tileseteditormetatileselector.cpp
+++ b/src/ui/tileseteditormetatileselector.cpp
@@ -160,14 +160,14 @@ void TilesetEditorMetatileSelector::drawUnused() {
QPen whitePen(Qt::white);
whitePen.setWidth(1);
- QPen redPen(Qt::magenta);
- redPen.setWidth(1);
+ QPen pinkPen(Qt::magenta);
+ pinkPen.setWidth(1);
QPainter oPainter(&redX);
oPainter.setPen(whitePen);
oPainter.drawEllipse(QRect(1, 1, 30, 30));
- oPainter.setPen(redPen);
+ oPainter.setPen(pinkPen);
oPainter.drawEllipse(QRect(2, 2, 28, 28));
oPainter.drawEllipse(QRect(3, 3, 26, 26));
@@ -178,8 +178,8 @@ void TilesetEditorMetatileSelector::drawUnused() {
oPainter.setPen(whitePen);
oPainter.drawLine(0, 0, 31, 31);
- redPen.setWidth(3);
- oPainter.setPen(redPen);
+ pinkPen.setWidth(3);
+ oPainter.setPen(pinkPen);
oPainter.drawLine(2, 2, 29, 29);
oPainter.end();
@@ -188,6 +188,7 @@ void TilesetEditorMetatileSelector::drawUnused() {
QPixmap metatilesPixmap = this->pixmap();
QPainter unusedPainter(&metatilesPixmap);
+ unusedPainter.setOpacity(0.5);
for (int tile = 0; tile < this->usedMetatiles.size(); tile++) {
if (!usedMetatiles[tile]) {
diff --git a/src/ui/tileseteditortileselector.cpp b/src/ui/tileseteditortileselector.cpp
index 54a2da0e..99cb38f4 100644
--- a/src/ui/tileseteditortileselector.cpp
+++ b/src/ui/tileseteditortileselector.cpp
@@ -52,6 +52,8 @@ void TilesetEditorTileSelector::draw() {
if (!this->externalSelection || (this->externalSelectionWidth == 1 && this->externalSelectionHeight == 1)) {
this->drawSelection();
}
+
+ if (showUnused) drawUnused();
}
void TilesetEditorTileSelector::select(uint16_t tile) {
@@ -286,3 +288,53 @@ QImage TilesetEditorTileSelector::buildSecondaryTilesIndexedImage() {
indexedImage.setColorTable(palette.toVector());
return indexedImage;
}
+
+void TilesetEditorTileSelector::drawUnused() {
+ // setup the circle with a line through it image to layer above unused metatiles
+ QPixmap redX(16, 16);
+ redX.fill(Qt::transparent);
+
+ QBitmap mask(16, 16);
+
+ QPen whitePen(Qt::white);
+ whitePen.setWidth(1);
+ QPen pinkPen(Qt::magenta);
+ pinkPen.setWidth(1);
+
+ QPainter oPainter(&redX);
+
+ oPainter.setPen(whitePen);
+ oPainter.drawEllipse(QRect(1, 1, 14, 14));
+ oPainter.setPen(pinkPen);
+ oPainter.drawEllipse(QRect(2, 2, 12, 12));
+ oPainter.drawEllipse(QRect(3, 3, 10, 10));
+
+ oPainter.setPen(whitePen);
+ oPainter.drawEllipse(QRect(4, 4, 8, 8));
+
+ whitePen.setWidth(3);
+ oPainter.setPen(whitePen);
+ oPainter.drawLine(0, 0, 15, 15);
+
+ pinkPen.setWidth(1);
+ oPainter.setPen(pinkPen);
+ oPainter.drawLine(2, 2, 13, 13);
+
+ oPainter.end();
+
+ // draw symbol on unused metatiles
+ QPixmap tilesPixmap = this->pixmap();
+
+ QPainter unusedPainter(&tilesPixmap);
+ unusedPainter.setOpacity(0.5);
+
+ for (int tile = 0; tile < this->usedTiles.size(); tile++) {
+ if (!usedTiles[tile]) {
+ unusedPainter.drawPixmap((tile % 16) * 16, (tile / 16) * 16, redX);
+ }
+ }
+
+ unusedPainter.end();
+
+ this->setPixmap(tilesPixmap);
+}