Skip unnecessary dive map rendering, fix rendering small connections

This commit is contained in:
GriffinR 2024-08-13 22:18:40 -04:00
parent 63b77a1fdc
commit 0b800c1201
5 changed files with 41 additions and 20 deletions

View file

@ -78,6 +78,7 @@ public:
void setMapEditingButtonsEnabled(bool enabled); void setMapEditingButtonsEnabled(bool enabled);
void setConnectionsVisibility(bool visible); void setConnectionsVisibility(bool visible);
void updateDivingMapsVisibility(); void updateDivingMapsVisibility();
void displayDivingConnections();
void addConnection(MapConnection* connection); void addConnection(MapConnection* connection);
void removeConnection(MapConnection* connection); void removeConnection(MapConnection* connection);
void removeSelectedConnection(); void removeSelectedConnection();

View file

@ -13,7 +13,6 @@ public:
: QGraphicsPixmapItem(getBasePixmap(connection)) : QGraphicsPixmapItem(getBasePixmap(connection))
{ {
m_connection = connection; m_connection = connection;
setZValue(2);
// Update pixmap if the connected map is swapped. // Update pixmap if the connected map is swapped.
connect(m_connection, &MapConnection::targetMapNameChanged, this, &DivingMapPixmapItem::updatePixmap); connect(m_connection, &MapConnection::targetMapNameChanged, this, &DivingMapPixmapItem::updatePixmap);

View file

@ -216,23 +216,29 @@ QPixmap Map::renderBorder(bool ignoreCache) {
} }
QPixmap Map::renderConnection(const QString &direction, MapLayout * fromLayout) { QPixmap Map::renderConnection(const QString &direction, MapLayout * fromLayout) {
if (direction == "dive" || direction == "emerge") // Cardinal connections are rendered within the bounds of the border draw distance,
return render(true); // and we need to render the nearest segment of the map.
// Dive/Emerge maps are rendered normally, but within the bounds of their parent map.
if (!MapConnection::isCardinal(direction))
return QPixmap();
int x = 0, y = 0, w = getWidth(), h = getHeight(); int x = 0, y = 0, w = getWidth(), h = getHeight();
if (direction == "up") { if (direction == "up") {
y = getHeight() - BORDER_DISTANCE; h = qMin(h, BORDER_DISTANCE);
h = BORDER_DISTANCE; y = getHeight() - h;
} else if (direction == "down") { } else if (direction == "down") {
h = BORDER_DISTANCE; h = qMin(h, BORDER_DISTANCE);
} else if (direction == "left") { } else if (direction == "left") {
x = getWidth() - BORDER_DISTANCE; w = qMin(w, BORDER_DISTANCE);
w = BORDER_DISTANCE; x = getWidth() - w;
} else if (direction == "right") { } else if (direction == "right") {
w = BORDER_DISTANCE; w = qMin(w, BORDER_DISTANCE);
} else if (MapConnection::isDiving(direction)) {
if (fromLayout) {
w = qMin(w, fromLayout->getWidth());
h = qMin(h, fromLayout->getHeight());
fromLayout = nullptr; // This would be used for palettes later, but we want our own palettes, not the parent's.
}
} else {
// Unknown direction
return QPixmap();
} }
render(true, fromLayout, QRect(x, y, w, h)); render(true, fromLayout, QRect(x, y, w, h));

View file

@ -737,10 +737,6 @@ void Editor::displayConnection(MapConnection* connection) {
if (!connection) if (!connection)
return; return;
// It's possible for a map connection to be displayed repeatedly if it's being
// updated by mirroring and the target map is changing to/from the current map.
connection->disconnect();
if (MapConnection::isDiving(connection->direction())) { if (MapConnection::isDiving(connection->direction())) {
displayDivingConnection(connection); displayDivingConnection(connection);
return; return;
@ -758,6 +754,10 @@ void Editor::displayConnection(MapConnection* connection) {
ConnectionsListItem *listItem = new ConnectionsListItem(ui->scrollAreaContents_ConnectionsList, pixmapItem->connection, project->mapNames); ConnectionsListItem *listItem = new ConnectionsListItem(ui->scrollAreaContents_ConnectionsList, pixmapItem->connection, project->mapNames);
ui->layout_ConnectionsList->insertWidget(ui->layout_ConnectionsList->count() - 1, listItem); // Insert above the vertical spacer ui->layout_ConnectionsList->insertWidget(ui->layout_ConnectionsList->count() - 1, listItem); // Insert above the vertical spacer
// It's possible for a map connection to be displayed repeatedly if it's being
// updated by mirroring and the target map is changing to/from the current map.
connection->disconnect();
// Double clicking the list item or pixmap opens the connected map // Double clicking the list item or pixmap opens the connected map
connect(listItem, &ConnectionsListItem::doubleClicked, this, &Editor::onMapConnectionDoubleClicked); connect(listItem, &ConnectionsListItem::doubleClicked, this, &Editor::onMapConnectionDoubleClicked);
connect(pixmapItem, &ConnectionPixmapItem::connectionItemDoubleClicked, this, &Editor::onMapConnectionDoubleClicked); connect(pixmapItem, &ConnectionPixmapItem::connectionItemDoubleClicked, this, &Editor::onMapConnectionDoubleClicked);
@ -871,6 +871,14 @@ void Editor::removeConnectionPixmap(MapConnection* connection) {
delete pixmapItem; delete pixmapItem;
} }
void Editor::displayDivingConnections() {
if (!this->map)
return;
for (auto connection : this->map->getConnections())
displayDivingConnection(connection);
}
void Editor::displayDivingConnection(MapConnection* connection) { void Editor::displayDivingConnection(MapConnection* connection) {
if (!connection) if (!connection)
return; return;
@ -879,6 +887,10 @@ void Editor::displayDivingConnection(MapConnection* connection) {
if (!MapConnection::isDiving(direction)) if (!MapConnection::isDiving(direction))
return; return;
// Save some rendering time if it won't be displayed
if (!porymapConfig.showDiveEmergeMaps)
return;
// Note: We only support editing 1 Dive and Emerge connection per map. // Note: We only support editing 1 Dive and Emerge connection per map.
// In a vanilla game only the first Dive/Emerge connection is considered, so allowing // In a vanilla game only the first Dive/Emerge connection is considered, so allowing
// users to have multiple is likely to lead to confusion. In case users have changed // users to have multiple is likely to lead to confusion. In case users have changed
@ -890,7 +902,6 @@ void Editor::displayDivingConnection(MapConnection* connection) {
auto item = new DivingMapPixmapItem(connection); auto item = new DivingMapPixmapItem(connection);
scene->addItem(item); scene->addItem(item);
diving_map_items.insert(direction, item); diving_map_items.insert(direction, item);
maskNonVisibleConnectionTiles();
// Display map name in combo box // Display map name in combo box
auto comboBox = (direction == "dive") ? ui->comboBox_DiveMap : ui->comboBox_EmergeMap; auto comboBox = (direction == "dive") ? ui->comboBox_DiveMap : ui->comboBox_EmergeMap;
@ -963,7 +974,6 @@ void Editor::setDivingMapName(QString mapName, QString direction) {
addConnection(new MapConnection(mapName, direction)); addConnection(new MapConnection(mapName, direction));
} }
updateDivingMapsVisibility(); updateDivingMapsVisibility();
maskNonVisibleConnectionTiles();
} }
void Editor::updateDivingMapsVisibility() { void Editor::updateDivingMapsVisibility() {
@ -1810,7 +1820,6 @@ void Editor::maskNonVisibleConnectionTiles() {
QBrush brush(ui->graphicsView_Map->palette().color(QPalette::Active, QPalette::Base)); QBrush brush(ui->graphicsView_Map->palette().color(QPalette::Active, QPalette::Base));
connection_mask = scene->addPath(mask, pen, brush); connection_mask = scene->addPath(mask, pen, brush);
connection_mask->setZValue(3); // Above diving maps
} }
void Editor::clearMapBorder() { void Editor::clearMapBorder() {

View file

@ -2302,6 +2302,12 @@ void MainWindow::setDivingMapsVisible(bool visible) {
ui->actionDive_Emerge_Map->setChecked(visible); ui->actionDive_Emerge_Map->setChecked(visible);
porymapConfig.showDiveEmergeMaps = visible; porymapConfig.showDiveEmergeMaps = visible;
if (visible) {
// We skip rendering diving maps if this setting is not enabled,
// so when we enable it we need to make sure they've rendered.
this->editor->displayDivingConnections();
}
this->editor->updateDivingMapsVisibility(); this->editor->updateDivingMapsVisibility();
} }