From 56d1a0d57009e95f0d397d52a6ba5aebffbf0e5c Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 26 Jun 2025 14:07:04 -0400 Subject: [PATCH] Fix exported metatile image scaling, remove hardcoded cell sizes --- forms/tileseteditor.ui | 18 ++++------ include/config.h | 2 +- include/ui/metatilelayersitem.h | 9 +---- include/ui/tilemaptileselector.h | 2 +- src/ui/metatilelayersitem.cpp | 42 ++++++++++++++++-------- src/ui/metatileselector.cpp | 4 +-- src/ui/regionmapentriespixmapitem.cpp | 6 ++-- src/ui/regionmaplayoutpixmapitem.cpp | 4 +-- src/ui/tilemaptileselector.cpp | 6 ++-- src/ui/tileseteditormetatileselector.cpp | 2 +- src/ui/tileseteditortileselector.cpp | 26 ++++++++------- 11 files changed, 62 insertions(+), 59 deletions(-) diff --git a/forms/tileseteditor.ui b/forms/tileseteditor.ui index d1817859..6c696bf3 100644 --- a/forms/tileseteditor.ui +++ b/forms/tileseteditor.ui @@ -6,7 +6,7 @@ 0 0 - 733 + 748 784 @@ -267,16 +267,10 @@ 0 - - - 66 - 34 - - - 96 - 34 + 1 + 1 @@ -561,8 +555,8 @@ 0 0 - 445 - 237 + 499 + 241 @@ -623,7 +617,7 @@ 0 0 - 733 + 748 37 diff --git a/include/config.h b/include/config.h index 171e3850..234fa76d 100644 --- a/include/config.h +++ b/include/config.h @@ -82,7 +82,7 @@ public: this->collisionOpacity = 50; this->collisionZoom = 30; this->metatilesZoom = 30; - this->tilesetEditorMetatilesZoom = 30; + this->tilesetEditorMetatilesZoom = 45; this->tilesetEditorTilesZoom = 30; this->showPlayerView = false; this->showCursorTile = true; diff --git a/include/ui/metatilelayersitem.h b/include/ui/metatilelayersitem.h index ef05a77d..1ca27c1c 100644 --- a/include/ui/metatilelayersitem.h +++ b/include/ui/metatilelayersitem.h @@ -9,14 +9,7 @@ class MetatileLayersItem: public SelectablePixmapItem { Q_OBJECT public: - MetatileLayersItem(Metatile *metatile, Tileset *primaryTileset, Tileset *secondaryTileset): SelectablePixmapItem(16, 16, 6, 2) { - this->metatile = metatile; - this->primaryTileset = primaryTileset; - this->secondaryTileset = secondaryTileset; - this->clearLastModifiedCoords(); - this->clearLastHoveredCoords(); - setAcceptHoverEvents(true); - } + MetatileLayersItem(Metatile *metatile, Tileset *primaryTileset, Tileset *secondaryTileset); void draw(); void setTilesets(Tileset*, Tileset*); void setMetatile(Metatile*); diff --git a/include/ui/tilemaptileselector.h b/include/ui/tilemaptileselector.h index 155957a6..558b6dc6 100644 --- a/include/ui/tilemaptileselector.h +++ b/include/ui/tilemaptileselector.h @@ -136,7 +136,7 @@ public: this->palette = PaletteUtil::parse(palFilepath, &err); } this->setPixmap(QPixmap::fromImage(this->tileset)); - this->numTilesWide = this->tileset.width() / 8; + this->numTilesWide = this->tileset.width() / this->cellWidth; this->selectedTile = 0x00; setAcceptHoverEvents(true); } diff --git a/src/ui/metatilelayersitem.cpp b/src/ui/metatilelayersitem.cpp index fabb49a4..a26ed14b 100644 --- a/src/ui/metatilelayersitem.cpp +++ b/src/ui/metatilelayersitem.cpp @@ -3,6 +3,17 @@ #include "imageproviders.h" #include +MetatileLayersItem::MetatileLayersItem(Metatile *metatile, Tileset *primaryTileset, Tileset *secondaryTileset) + : SelectablePixmapItem(16, 16, 2 * projectConfig.getNumLayersInMetatile(), 2), + metatile(metatile), + primaryTileset(primaryTileset), + secondaryTileset(secondaryTileset) +{ + clearLastModifiedCoords(); + clearLastHoveredCoords(); + setAcceptHoverEvents(true); +} + static const QList tilePositions = { QPoint(0, 0), QPoint(1, 0), @@ -20,23 +31,31 @@ static const QList tilePositions = { void MetatileLayersItem::draw() { const int numLayers = projectConfig.getNumLayersInMetatile(); - QPixmap pixmap(numLayers * 32, 32); + const int layerWidth = this->cellWidth * 2; + const int layerHeight = this->cellHeight * 2; + QPixmap pixmap(numLayers * layerWidth, layerHeight); QPainter painter(&pixmap); // Draw tile images int numTiles = qMin(projectConfig.getNumTilesInMetatile(), this->metatile ? this->metatile->tiles.length() : 0); for (int i = 0; i < numTiles; i++) { Tile tile = this->metatile->tiles.at(i); - QImage tileImage = getPalettedTileImage(tile.tileId, this->primaryTileset, this->secondaryTileset, tile.palette, true).scaled(16, 16); + QImage tileImage = getPalettedTileImage(tile.tileId, + this->primaryTileset, + this->secondaryTileset, + tile.palette, + true + ).scaled(this->cellWidth, this->cellHeight); tile.flip(&tileImage); - painter.drawImage(tilePositions.at(i) * 16, tileImage); + QPoint pos = tilePositions.at(i); + painter.drawImage(pos.x() * this->cellWidth, pos.y() * this->cellHeight, tileImage); } if (this->showGrid) { // Draw grid painter.setPen(Qt::white); for (int i = 1; i < numLayers; i++) { - int x = i * 32; - painter.drawLine(x, 0, x, 32); + int x = i * layerWidth; + painter.drawLine(x, 0, x, layerHeight); } } @@ -127,13 +146,8 @@ void MetatileLayersItem::clearLastHoveredCoords() { } QPoint MetatileLayersItem::getBoundedPos(const QPointF &pos) { - int x, y; - int maxX = (projectConfig.getNumLayersInMetatile() * 2) - 1; - x = static_cast(pos.x()) / 16; - y = static_cast(pos.y()) / 16; - if (x < 0) x = 0; - if (y < 0) y = 0; - if (x > maxX) x = maxX; - if (y > 1) y = 1; - return QPoint(x, y); + int x = static_cast(pos.x()) / this->cellWidth; + int y = static_cast(pos.y()) / this->cellHeight; + return QPoint( qMax(0, qMin(x, this->maxSelectionWidth - 1)), + qMax(0, qMin(y, this->maxSelectionHeight - 1)) ); } diff --git a/src/ui/metatileselector.cpp b/src/ui/metatileselector.cpp index 012b6609..828c73cd 100644 --- a/src/ui/metatileselector.cpp +++ b/src/ui/metatileselector.cpp @@ -21,7 +21,7 @@ void MetatileSelector::updateBasePixmap() { if (length_ % this->numMetatilesWide != 0) { height_++; } - QImage image(this->numMetatilesWide * 16, height_ * 16, QImage::Format_RGBA8888); + QImage image(this->numMetatilesWide * this->cellWidth, height_ * this->cellHeight, QImage::Format_RGBA8888); image.fill(Qt::magenta); QPainter painter(&image); for (int i = 0; i < length_; i++) { @@ -32,7 +32,7 @@ void MetatileSelector::updateBasePixmap() { QImage metatile_image = getMetatileImage(tile, this->primaryTileset, this->secondaryTileset, layout->metatileLayerOrder, layout->metatileLayerOpacity); int map_y = i / this->numMetatilesWide; int map_x = i % this->numMetatilesWide; - QPoint metatile_origin = QPoint(map_x * 16, map_y * 16); + QPoint metatile_origin = QPoint(map_x * this->cellWidth, map_y * this->cellHeight); painter.drawImage(metatile_origin, metatile_image); } painter.end(); diff --git a/src/ui/regionmapentriespixmapitem.cpp b/src/ui/regionmapentriespixmapitem.cpp index 8ac888a0..5bf9a08f 100644 --- a/src/ui/regionmapentriespixmapitem.cpp +++ b/src/ui/regionmapentriespixmapitem.cpp @@ -17,12 +17,12 @@ void RegionMapEntriesPixmapItem::draw() { entry_w = entry.width, entry_h = entry.height; } - QImage image(region_map->tilemapWidth() * 8, region_map->tilemapHeight() * 8, QImage::Format_RGBA8888); + QImage image(region_map->tilemapWidth() * this->cellWidth, region_map->tilemapHeight() * this->cellHeight, QImage::Format_RGBA8888); QPainter painter(&image); for (int i = 0; i < region_map->tilemapSize(); i++) { QImage bottom_img = this->tile_selector->tileImg(region_map->getTile(i)); - QImage top_img(8, 8, QImage::Format_RGBA8888); + QImage top_img(this->cellWidth, this->cellHeight, QImage::Format_RGBA8888); int x = i % region_map->tilemapWidth(); int y = i / region_map->tilemapWidth(); bool insideEntry = false; @@ -40,7 +40,7 @@ void RegionMapEntriesPixmapItem::draw() { } else { top_img.fill(Qt::black); } - QPoint pos = QPoint(x * 8, y * 8); + QPoint pos = QPoint(x * this->cellWidth, y * this->cellHeight); painter.setOpacity(1); painter.drawImage(pos, bottom_img); painter.save(); diff --git a/src/ui/regionmaplayoutpixmapitem.cpp b/src/ui/regionmaplayoutpixmapitem.cpp index eda35152..1895f8c8 100644 --- a/src/ui/regionmaplayoutpixmapitem.cpp +++ b/src/ui/regionmaplayoutpixmapitem.cpp @@ -8,7 +8,7 @@ void RegionMapLayoutPixmapItem::draw() { QPainter painter(&image); for (int i = 0; i < region_map->tilemapSize(); i++) { QImage bottom_img = this->tile_selector->tileImg(region_map->getTile(i)); - QImage top_img(8, 8, QImage::Format_RGBA8888); + QImage top_img(this->cellWidth, this->cellHeight, QImage::Format_RGBA8888); if (region_map->squareHasMap(i)) { top_img.fill(Qt::gray); } else { @@ -16,7 +16,7 @@ void RegionMapLayoutPixmapItem::draw() { } int x = i % region_map->tilemapWidth(); int y = i / region_map->tilemapWidth(); - QPoint pos = QPoint(x * 8, y * 8); + QPoint pos = QPoint(x * this->cellWidth, y * this->cellHeight); painter.setOpacity(1); painter.drawImage(pos, bottom_img); painter.save(); diff --git a/src/ui/tilemaptileselector.cpp b/src/ui/tilemaptileselector.cpp index 45771ad2..35dd294a 100644 --- a/src/ui/tilemaptileselector.cpp +++ b/src/ui/tilemaptileselector.cpp @@ -7,9 +7,9 @@ void TilemapTileSelector::draw() { this->pixelWidth = width_; size_t height_ = this->tileset.height(); this->pixelHeight = height_; - size_t ntiles_ = (width_/8) * (height_/8); + size_t ntiles_ = (width_/this->cellWidth) * (height_/this->cellHeight); - this->numTilesWide = width_ / 8; + this->numTilesWide = width_ / this->cellWidth; this->numTiles = ntiles_; this->setPixmap(QPixmap::fromImage(this->setPalette(this->tile_palette))); @@ -92,7 +92,7 @@ QImage TilemapTileSelector::tileImg(shared_ptr tile) { QImage tilesetImage = setPalette(tile->palette()); // take a tile from the tileset - QImage img = tilesetImage.copy(pos.x() * 8, pos.y() * 8, 8, 8); + QImage img = tilesetImage.copy(pos.x() * this->cellWidth, pos.y() * this->cellHeight, this->cellWidth, this->cellHeight); // QImage::flip was introduced in 6.9.0 to replace QImage::mirrored. #if (QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)) diff --git a/src/ui/tileseteditormetatileselector.cpp b/src/ui/tileseteditormetatileselector.cpp index 4e09cf34..5026a49b 100644 --- a/src/ui/tileseteditormetatileselector.cpp +++ b/src/ui/tileseteditormetatileselector.cpp @@ -4,7 +4,7 @@ #include TilesetEditorMetatileSelector::TilesetEditorMetatileSelector(Tileset *primaryTileset, Tileset *secondaryTileset, Layout *layout) - : SelectablePixmapItem(32, 32, 1, 1) { + : SelectablePixmapItem(16, 16, 1, 1) { this->primaryTileset = primaryTileset; this->secondaryTileset = secondaryTileset; this->numMetatilesWide = 8; diff --git a/src/ui/tileseteditortileselector.cpp b/src/ui/tileseteditortileselector.cpp index 01e4008c..034a86a7 100644 --- a/src/ui/tileseteditortileselector.cpp +++ b/src/ui/tileseteditortileselector.cpp @@ -22,27 +22,27 @@ void TilesetEditorTileSelector::draw() { int secondaryLength = this->secondaryTileset->tiles.length(); int height = totalTiles / this->numTilesWide; QList palette = Tileset::getPalette(this->paletteId, this->primaryTileset, this->secondaryTileset, true); - QImage image(this->numTilesWide * 16, height * 16, QImage::Format_RGBA8888); + QImage image(this->numTilesWide * this->cellWidth, height * this->cellHeight, QImage::Format_RGBA8888); QPainter painter(&image); for (uint16_t tile = 0; tile < totalTiles; tile++) { QImage tileImage; if (tile < primaryLength) { - tileImage = getPalettedTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId, true).scaled(16, 16); + tileImage = getPalettedTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId, true).scaled(this->cellWidth, this->cellHeight); } else if (tile < Project::getNumTilesPrimary()) { - tileImage = QImage(16, 16, QImage::Format_RGBA8888); + tileImage = QImage(this->cellWidth, this->cellHeight, QImage::Format_RGBA8888); tileImage.fill(palette.at(0)); } else if (tile < Project::getNumTilesPrimary() + secondaryLength) { - tileImage = getPalettedTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId, true).scaled(16, 16); + tileImage = getPalettedTileImage(tile, this->primaryTileset, this->secondaryTileset, this->paletteId, true).scaled(this->cellWidth, this->cellHeight); } else { - tileImage = QImage(16, 16, QImage::Format_RGBA8888); + tileImage = QImage(this->cellWidth, this->cellHeight, QImage::Format_RGBA8888); QPainter painter(&tileImage); - painter.fillRect(0, 0, 16, 16, palette.at(0)); + painter.fillRect(0, 0, this->cellWidth, this->cellHeight, palette.at(0)); } int y = tile / this->numTilesWide; int x = tile % this->numTilesWide; - QPoint origin = QPoint(x * 16, y * 16); + QPoint origin = QPoint(x * this->cellWidth, y * this->cellHeight); painter.drawImage(origin, tileImage); } @@ -52,9 +52,9 @@ void TilesetEditorTileSelector::draw() { // Round up height for incomplete last row row++; } - const int y = row * 16; + const int y = row * this->cellHeight; painter.setPen(Qt::white); - painter.drawLine(0, y, this->numTilesWide * 16, y); + painter.drawLine(0, y, this->numTilesWide * this->cellWidth, y); } painter.end(); @@ -244,8 +244,10 @@ QImage TilesetEditorTileSelector::buildSecondaryTilesIndexedImage() { } QImage TilesetEditorTileSelector::buildImage(int tileIdStart, int numTiles) { + const int tileWidth = 8; + const int tileHeight = 8; int height = qCeil(numTiles / static_cast(this->numTilesWide)); - QImage image(this->numTilesWide * 8, height * 8, QImage::Format_RGBA8888); + QImage image(this->numTilesWide * tileWidth, height * tileHeight, QImage::Format_RGBA8888); image.fill(0); QPainter painter(&image); @@ -253,7 +255,7 @@ QImage TilesetEditorTileSelector::buildImage(int tileIdStart, int numTiles) { QImage tileImage = getGreyscaleTileImage(tileIdStart + i, this->primaryTileset, this->secondaryTileset); int y = i / this->numTilesWide; int x = i % this->numTilesWide; - QPoint origin = QPoint(x * 8, y * 8); + QPoint origin = QPoint(x * tileWidth, y * tileHeight); painter.drawImage(origin, tileImage); } painter.end(); @@ -305,7 +307,7 @@ void TilesetEditorTileSelector::drawUnused() { for (int tile = 0; tile < this->usedTiles.size(); tile++) { if (!this->usedTiles[tile]) { - unusedPainter.drawPixmap((tile % 16) * 16, (tile / 16) * 16, redX); + unusedPainter.drawPixmap((tile % this->cellWidth) * this->cellWidth, (tile / this->cellWidth) * this->cellHeight, redX); } }