From 55c97a45d931e082c1f94a030da6ce0a73148457 Mon Sep 17 00:00:00 2001 From: garak Date: Fri, 6 Jan 2023 21:57:42 -0500 Subject: [PATCH] render collision apart from metatiles, using graphics item layering to display --- include/core/map.h | 4 ++-- src/core/map.cpp | 10 ++-------- src/editor.cpp | 1 - src/ui/collisionpixmapitem.cpp | 3 ++- src/ui/mapimageexporter.cpp | 12 +++++++----- 5 files changed, 13 insertions(+), 17 deletions(-) diff --git a/include/core/map.h b/include/core/map.h index 50eea778..3bd5352b 100644 --- a/include/core/map.h +++ b/include/core/map.h @@ -76,8 +76,8 @@ public: int getHeight(); int getBorderWidth(); int getBorderHeight(); - QPixmap render(bool ignoreCache, MapLayout *fromLayout = nullptr, QRect bounds = QRect(0, 0, -1, -1)); - QPixmap renderCollision(qreal opacity, bool ignoreCache); + QPixmap render(bool ignoreCache = false, MapLayout *fromLayout = nullptr, QRect bounds = QRect(0, 0, -1, -1)); + QPixmap renderCollision(bool ignoreCache); bool mapBlockChanged(int i, const Blockdata &cache); bool borderBlockChanged(int i, const Blockdata &cache); void cacheBlockdata(); diff --git a/src/core/map.cpp b/src/core/map.cpp index 48f95b50..5114b01d 100644 --- a/src/core/map.cpp +++ b/src/core/map.cpp @@ -100,7 +100,7 @@ void Map::cacheCollision() { layout->cached_collision.append(block); } -QPixmap Map::renderCollision(qreal opacity, bool ignoreCache) { +QPixmap Map::renderCollision(bool ignoreCache) { bool changed_any = false; int width_ = getWidth(); int height_ = getHeight(); @@ -119,17 +119,11 @@ QPixmap Map::renderCollision(qreal opacity, bool ignoreCache) { } changed_any = true; Block block = layout->blockdata.at(i); - QImage metatile_image = getMetatileImage(block.metatileId, layout->tileset_primary, layout->tileset_secondary, metatileLayerOrder, metatileLayerOpacity); QImage collision_metatile_image = getCollisionMetatileImage(block); int map_y = width_ ? i / width_ : 0; int map_x = width_ ? i % width_ : 0; QPoint metatile_origin = QPoint(map_x * 16, map_y * 16); - painter.setOpacity(1); - painter.drawImage(metatile_origin, metatile_image); - painter.save(); - painter.setOpacity(opacity); painter.drawImage(metatile_origin, collision_metatile_image); - painter.restore(); } painter.end(); cacheCollision(); @@ -139,7 +133,7 @@ QPixmap Map::renderCollision(qreal opacity, bool ignoreCache) { return collision_pixmap; } -QPixmap Map::render(bool ignoreCache = false, MapLayout * fromLayout, QRect bounds) { +QPixmap Map::render(bool ignoreCache, MapLayout * fromLayout, QRect bounds) { bool changed_any = false; int width_ = getWidth(); int height_ = getHeight(); diff --git a/src/editor.cpp b/src/editor.cpp index 863dc414..24cca76f 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -111,7 +111,6 @@ void Editor::setEditingCollision() { } if (map_item) { map_item->paintingMode = MapPixmapItem::PaintMode::Metatiles; - map_item->setVisible(false); } if (events_group) { events_group->setVisible(false); diff --git a/src/ui/collisionpixmapitem.cpp b/src/ui/collisionpixmapitem.cpp index 11f03617..eaa4bca1 100644 --- a/src/ui/collisionpixmapitem.cpp +++ b/src/ui/collisionpixmapitem.cpp @@ -51,7 +51,8 @@ void CollisionPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { void CollisionPixmapItem::draw(bool ignoreCache) { if (map) { map->setCollisionItem(this); - setPixmap(map->renderCollision(*this->opacity, ignoreCache)); + setPixmap(map->renderCollision(ignoreCache)); + setOpacity(*this->opacity); } } diff --git a/src/ui/mapimageexporter.cpp b/src/ui/mapimageexporter.cpp index 8ce5760f..099f2288 100644 --- a/src/ui/mapimageexporter.cpp +++ b/src/ui/mapimageexporter.cpp @@ -359,11 +359,14 @@ QPixmap MapImageExporter::getFormattedMapPixmap(Map *map, bool ignoreBorder) { // draw background layer / base image map->render(true); + pixmap = map->pixmap; + if (showCollision) { - map->renderCollision(editor->collisionOpacity, true); - pixmap = map->collision_pixmap; - } else { - pixmap = map->pixmap; + QPainter collisionPainter(&pixmap); + map->renderCollision(true); + collisionPainter.setOpacity(editor->collisionOpacity); + collisionPainter.drawPixmap(0, 0, map->collision_pixmap); + collisionPainter.end(); } // draw map border @@ -384,7 +387,6 @@ QPixmap MapImageExporter::getFormattedMapPixmap(Map *map, bool ignoreBorder) { borderPainter.drawPixmap(x * 16, y * 16, map->layout->border_pixmap); } } - borderPainter.drawImage(borderWidth, borderHeight, pixmap.toImage()); borderPainter.end(); pixmap = newPixmap;