From ee6c617609f87e0cf8c38e245ae463f428e9b85e Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Sun, 5 Jun 2022 14:42:54 +0530 Subject: [PATCH 01/13] Add tsx load option, first tiled compat commit --- MainWindow.cpp | 3 ++- Submodules/enigma-dev | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index 47a91a349..83b712abd 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -464,7 +464,8 @@ void MainWindow::on_actionOpen_triggered() { this, tr("Open Project"), "", tr("All supported formats (*.egm *.yyp *.project.gmx *.gm81 *.gmk *.gm6 *.gmd);;GameMaker: Studio 2 Projects " "(*.yyp);;GameMaker: Studio Projects (*.project.gmx);;Classic " - "GameMaker Files (*.gm81 *.gmk *.gm6 *.gmd);;All Files (*)")); + "GameMaker Files (*.gm81 *.gmk *.gm6 *.gmd);;" + "Tiled Tileset (*.tsx);;All Files (*)")); if (!fileName.isEmpty()) openFile(fileName); } diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 2ddad078c..a723e88f2 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 2ddad078c6cd355dcaa45996cf9f3a49df020102 +Subproject commit a723e88f2bf0a1edf427ae113ad3f45b97ba18f4 From c7655c27b9283faa6c46e162cb3f6acd9b36112c Mon Sep 17 00:00:00 2001 From: ka_sh Date: Mon, 6 Jun 2022 23:00:59 +0530 Subject: [PATCH 02/13] Supported format typo fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Thorbjørn Lindeijer --- MainWindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index 83b712abd..90b76b9d5 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -465,7 +465,8 @@ void MainWindow::on_actionOpen_triggered() { tr("All supported formats (*.egm *.yyp *.project.gmx *.gm81 *.gmk *.gm6 *.gmd);;GameMaker: Studio 2 Projects " "(*.yyp);;GameMaker: Studio Projects (*.project.gmx);;Classic " "GameMaker Files (*.gm81 *.gmk *.gm6 *.gmd);;" - "Tiled Tileset (*.tsx);;All Files (*)")); + "Tiled Tilesets (*.tsx);;All Files (*)")); + if (!fileName.isEmpty()) openFile(fileName); } From 06cd82da132e210ee5b6c73e2e6b81519f8f6f32 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Sat, 2 Jul 2022 16:17:32 +0530 Subject: [PATCH 03/13] Add support to load .tmx files --- MainWindow.cpp | 2 +- Submodules/enigma-dev | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index 90b76b9d5..cfae09394 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -465,7 +465,7 @@ void MainWindow::on_actionOpen_triggered() { tr("All supported formats (*.egm *.yyp *.project.gmx *.gm81 *.gmk *.gm6 *.gmd);;GameMaker: Studio 2 Projects " "(*.yyp);;GameMaker: Studio Projects (*.project.gmx);;Classic " "GameMaker Files (*.gm81 *.gmk *.gm6 *.gmd);;" - "Tiled Tilesets (*.tsx);;All Files (*)")); + "Tiled Tilesets (*.tsx);;Tiled Maps (*.tmx);;All Files (*)")); if (!fileName.isEmpty()) openFile(fileName); } diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index a723e88f2..477adc158 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit a723e88f2bf0a1edf427ae113ad3f45b97ba18f4 +Subproject commit 477adc1586e7bf66ed3aa902cc8ea96161b37ba6 From 39cee30de896877f6c980f7f4ad050bdaef9e850 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Wed, 6 Jul 2022 12:17:10 +0530 Subject: [PATCH 04/13] Fixed scale; Added rotation, alpha, hori/vert flip support in roomview --- Submodules/enigma-dev | 2 +- Widgets/RoomView.cpp | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 477adc158..82cc729fb 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 477adc1586e7bf66ed3aa902cc8ea96161b37ba6 +Subproject commit 82cc729fb810a0d0df14d55996eefa107a6835a4 diff --git a/Widgets/RoomView.cpp b/Widgets/RoomView.cpp index 501c0ec34..4b13b9922 100644 --- a/Widgets/RoomView.cpp +++ b/Widgets/RoomView.cpp @@ -89,6 +89,13 @@ void RoomView::paintTiles(QPainter& painter) { bkg = bkg->GetSubModel(TreeNode::kBackgroundFieldNumber); if (!bkg) continue; + // useful in setting source rect correctly + bool bkgUseAsTileset = bkg->Data(FieldPath::Of(Background::kUseAsTilesetFieldNumber)).toBool(); + int bkgTileWidth = bkg->Data(FieldPath::Of(Background::kTileWidthFieldNumber)).toInt(); + int bkgTileHeight = bkg->Data(FieldPath::Of(Background::kTileHeightFieldNumber)).toInt(); + int bkgImageWidth = bkg->Data(FieldPath::Of(Background::kWidthFieldNumber)).toInt(); + int bkgImageHeight = bkg->Data(FieldPath::Of(Background::kHeightFieldNumber)).toInt(); + int x = _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kXFieldNumber)).toInt(); int y = @@ -103,6 +110,11 @@ void RoomView::paintTiles(QPainter& painter) { .toInt(); int h = _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kHeightFieldNumber)) .toInt(); + double rotation = + _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kRotationFieldNumber)).toDouble(); + bool hasAlpha = false; + double alpha = _sortedTiles-> + Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kAlphaFieldNumber)).toDouble(&hasAlpha); QVariant xScale = _sortedTiles->DataOrDefault( FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kXscaleFieldNumber)); @@ -113,10 +125,35 @@ void RoomView::paintTiles(QPainter& painter) { QPixmap pixmap = ArtManager::GetCachedPixmap(imgFile); if (pixmap.isNull()) continue; + // dest rect handles proper scaling of tile in different scenarios, such as image based background is scaled or + // case when a given tile of tileset based background is scaled(possible in tiled using objects) QRectF dest(x, y, w, h); - QRectF src(xOff, yOff, w, h); + QRectF src; + + // if background contains multiple tiles then set the rect using tilewidth and tileheight + // otherwise set it as image width and height + if(bkgUseAsTileset) + src = QRectF(xOff, yOff, bkgTileWidth, bkgTileHeight); + else + src = QRectF(xOff, yOff, bkgImageWidth, bkgImageHeight); + const QTransform transform = painter.transform(); + // Note: Current rotation support is only according to the location of tiles in Tiled, rotation for other formats + // (if exist) would be inaccurate + painter.translate(x,y+h); + painter.rotate(rotation); + painter.translate(-x,-y-h); + + // for scale to work properly, origin must to adjusted to center of pixmap, and its resetted after applying scale + // Note: scale also handles horizontal and vertical flip of tiles + painter.translate(x+(w/2),y+(h/2)); painter.scale(xScale.toFloat(), yScale.toFloat()); + painter.translate(-x-(w/2),-y-(h/2)); + + // set opacity + if(hasAlpha) + painter.setOpacity(alpha); + painter.drawPixmap(dest, pixmap, src); painter.setTransform(transform); } From 3e7c90577350f811c01811b452beb831a01408d2 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Mon, 11 Jul 2022 11:59:10 +0530 Subject: [PATCH 05/13] Optimized some if else branch in room.tile paint code --- Submodules/enigma-dev | 2 +- Widgets/RoomView.cpp | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 82cc729fb..b3e08171d 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 82cc729fb810a0d0df14d55996eefa107a6835a4 +Subproject commit b3e08171db0464a899a9ade46990d6b01888b686 diff --git a/Widgets/RoomView.cpp b/Widgets/RoomView.cpp index 4b13b9922..a7f4ca4ea 100644 --- a/Widgets/RoomView.cpp +++ b/Widgets/RoomView.cpp @@ -128,14 +128,13 @@ void RoomView::paintTiles(QPainter& painter) { // dest rect handles proper scaling of tile in different scenarios, such as image based background is scaled or // case when a given tile of tileset based background is scaled(possible in tiled using objects) QRectF dest(x, y, w, h); - QRectF src; // if background contains multiple tiles then set the rect using tilewidth and tileheight // otherwise set it as image width and height - if(bkgUseAsTileset) - src = QRectF(xOff, yOff, bkgTileWidth, bkgTileHeight); - else - src = QRectF(xOff, yOff, bkgImageWidth, bkgImageHeight); + int bkgUseAsTilesetInt = bkgUseAsTileset; // convert to int to avoid if else branch + QRectF src = QRectF(xOff, yOff, + bkgUseAsTilesetInt*bkgTileWidth + (1-bkgUseAsTilesetInt)*bkgImageWidth, + bkgUseAsTilesetInt*bkgTileHeight + (1-bkgUseAsTilesetInt)*bkgImageHeight); const QTransform transform = painter.transform(); // Note: Current rotation support is only according to the location of tiles in Tiled, rotation for other formats @@ -151,8 +150,9 @@ void RoomView::paintTiles(QPainter& painter) { painter.translate(-x-(w/2),-y-(h/2)); // set opacity - if(hasAlpha) - painter.setOpacity(alpha); + int hasAlphaInt = hasAlpha; // convert to int to avoid if else branch + double finalAlpha = hasAlphaInt*alpha + (1-hasAlphaInt)*1.0; + painter.setOpacity(finalAlpha); painter.drawPixmap(dest, pixmap, src); painter.setTransform(transform); From 865b141d7c61bb5eecef0542dd7c5197723c53ac Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Sat, 23 Jul 2022 00:45:09 +0530 Subject: [PATCH 06/13] A hackish fix to initialize engine server, added hexagonal map visualize updates to room editor --- Plugins/ServerPlugin.cpp | 2 +- Submodules/enigma-dev | 2 +- Widgets/RoomView.cpp | 19 +++++++++++++------ Widgets/RoomView.h | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Plugins/ServerPlugin.cpp b/Plugins/ServerPlugin.cpp index 57a9d4452..04d42aaca 100644 --- a/Plugins/ServerPlugin.cpp +++ b/Plugins/ServerPlugin.cpp @@ -309,7 +309,7 @@ ServerPlugin::ServerPlugin(MainWindow& mainWindow) : RGMPlugin(mainWindow) { qDebug() << "Using emake exe at: " << emakeFileInfo.absolutePath(); qDebug() << "Using ENIGMA sources at: " << MainWindow::EnigmaRoot.absolutePath(); process->setWorkingDirectory(emakeFileInfo.absolutePath()); - QString program = emakeFileInfo.fileName(); + QString program = "./" + emakeFileInfo.fileName(); QStringList arguments; arguments << "--server" << "-e" diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index b3e08171d..c8415a8cd 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit b3e08171db0464a899a9ade46990d6b01888b686 +Subproject commit c8415a8cd2f1d31d6cd71a48fd85e11d5ce3d26b diff --git a/Widgets/RoomView.cpp b/Widgets/RoomView.cpp index a7f4ca4ea..996c97b8b 100644 --- a/Widgets/RoomView.cpp +++ b/Widgets/RoomView.cpp @@ -74,13 +74,16 @@ void RoomView::Paint(QPainter& painter) { QRectF(0, 0, roomWidth.isValid() ? roomWidth.toUInt() : 640, roomWidth.isValid() ? roomHeight.toUInt() : 480), QBrush(roomColor)); + // to check whether room (in case of tmx importer) is of hexagonal orientation or not + QString orientation = _model->Data(FieldPath::Of(Room::kOrientationFieldNumber)).toString(); + paintBackgrounds(painter, false); - paintTiles(painter); + paintTiles(painter, orientation == "hexagonal"); paintInstances(painter); paintBackgrounds(painter, true); } -void RoomView::paintTiles(QPainter& painter) { +void RoomView::paintTiles(QPainter& painter, int isHexMap) { for (int row = 0; row < _sortedTiles->rowCount(); row++) { QVariant bkgName = _sortedTiles->Data( FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kBackgroundNameFieldNumber)); @@ -137,11 +140,15 @@ void RoomView::paintTiles(QPainter& painter) { bkgUseAsTilesetInt*bkgTileHeight + (1-bkgUseAsTilesetInt)*bkgImageHeight); const QTransform transform = painter.transform(); - // Note: Current rotation support is only according to the location of tiles in Tiled, rotation for other formats - // (if exist) would be inaccurate - painter.translate(x,y+h); + + // Note: Current rotation support is only according to the location of tiles in ortho and hex Tiled maps, + // if hexMap is 1(true) tile is rotated from its origin, if hexMap is 0(false) tile is rotate from top-left corner + // Side node: This translate back-and-forth is to achieve correct transformation in global space + painter.translate(isHexMap * (x+(w/2)) + (1 - isHexMap) * x, + isHexMap * (y+(h/2)) + (1 - isHexMap) * (y+h)); painter.rotate(rotation); - painter.translate(-x,-y-h); + painter.translate(isHexMap * (-x-(w/2)) + (1 - isHexMap) * -x, + isHexMap * (-y-(h/2)) + (1 - isHexMap) * (-y-h)); // for scale to work properly, origin must to adjusted to center of pixmap, and its resetted after applying scale // Note: scale also handles horizontal and vertical flip of tiles diff --git a/Widgets/RoomView.h b/Widgets/RoomView.h index 5d7750bf7..6d2a1837a 100644 --- a/Widgets/RoomView.h +++ b/Widgets/RoomView.h @@ -26,7 +26,7 @@ class RoomView : public AssetView { RepeatedSortFilterProxyModel *_sortedTiles; QPixmap _transparentPixmap; - void paintTiles(QPainter &painter); + void paintTiles(QPainter &painter, int isHexMap = 0); void paintBackgrounds(QPainter &painter, bool foregrounds = false); void paintInstances(QPainter &painter); }; From 21afd28cb5eb49cf224d59506ebbb2d1ce54807b Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Sun, 14 Aug 2022 17:58:52 +0530 Subject: [PATCH 07/13] Create separation btw EGMRoom and GMRoom --- Editors/RoomEditor.cpp | 44 +++++++++---------- MainWindow.cpp | 4 +- Models/ProtoModel.h | 2 +- Models/ResourceModelMap.cpp | 18 ++++---- RadialGM.pro | 3 +- Submodules/enigma-dev | 2 +- Widgets/RoomView.cpp | 86 ++++++++++++++++++------------------- 7 files changed, 80 insertions(+), 79 deletions(-) diff --git a/Editors/RoomEditor.cpp b/Editors/RoomEditor.cpp index b868dbbaa..7afb97a0d 100644 --- a/Editors/RoomEditor.cpp +++ b/Editors/RoomEditor.cpp @@ -29,15 +29,15 @@ RoomEditor::RoomEditor(MessageModel* model, QWidget* parent) : BaseEditor(model, _nodeMapper->addMapping(_ui->roomName, TreeNode::kNameFieldNumber); _nodeMapper->toFirst(); - _resMapper->addMapping(_ui->speedSpinBox, Room::kSpeedFieldNumber); - _resMapper->addMapping(_ui->widthSpinBox, Room::kWidthFieldNumber); - _resMapper->addMapping(_ui->heightSpinBox, Room::kHeightFieldNumber); - _resMapper->addMapping(_ui->clearCheckBox, Room::kClearDisplayBufferFieldNumber); - _resMapper->addMapping(_ui->persistentCheckBox, Room::kPersistentFieldNumber); - _resMapper->addMapping(_ui->captionLineEdit, Room::kCaptionFieldNumber); - - _resMapper->addMapping(_ui->enableViewsCheckBox, Room::kEnableViewsFieldNumber); - _resMapper->addMapping(_ui->clearViewportCheckBox, Room::kClearViewBackgroundFieldNumber); + _resMapper->addMapping(_ui->speedSpinBox, EGMRoom::kSpeedFieldNumber); + _resMapper->addMapping(_ui->widthSpinBox, EGMRoom::kWidthFieldNumber); + _resMapper->addMapping(_ui->heightSpinBox, EGMRoom::kHeightFieldNumber); + _resMapper->addMapping(_ui->clearCheckBox, EGMRoom::kClearDisplayBufferFieldNumber); + _resMapper->addMapping(_ui->persistentCheckBox, EGMRoom::kPersistentFieldNumber); + _resMapper->addMapping(_ui->captionLineEdit, EGMRoom::kCaptionFieldNumber); + + _resMapper->addMapping(_ui->enableViewsCheckBox, EGMRoom::kEnableViewsFieldNumber); + _resMapper->addMapping(_ui->clearViewportCheckBox, EGMRoom::kClearViewBackgroundFieldNumber); _resMapper->toFirst(); _viewMapper = new ImmediateDataWidgetMapper(this); @@ -97,41 +97,41 @@ void RoomEditor::RebindSubModels() { _roomModel = _model->GetSubModel(TreeNode::kRoomFieldNumber); _ui->roomView->SetResourceModel(_roomModel); - RepeatedMessageModel* im = _roomModel->GetSubModel(Room::kInstancesFieldNumber); + RepeatedMessageModel* im = _roomModel->GetSubModel(EGMRoom::kInstancesFieldNumber); RepeatedSortFilterProxyModel* imp = new RepeatedSortFilterProxyModel(this); imp->SetSourceModel(im); _ui->instancesListView->setModel(imp); for (int c = 0; c < im->columnCount(); ++c) { - if (c != im->FieldToColumn(Room::Instance::kNameFieldNumber) && - c != im->FieldToColumn(Room::Instance::kObjectTypeFieldNumber) && - c != im->FieldToColumn(Room::Instance::kIdFieldNumber)) + if (c != im->FieldToColumn(EGMRoom::Instance::kNameFieldNumber) && + c != im->FieldToColumn(EGMRoom::Instance::kObjectTypeFieldNumber) && + c != im->FieldToColumn(EGMRoom::Instance::kIdFieldNumber)) _ui->instancesListView->hideColumn(c); else _ui->instancesListView->resizeColumnToContents(c); } - _ui->instancesListView->header()->swapSections(im->FieldToColumn(Room::Instance::kNameFieldNumber), - im->FieldToColumn(Room::Instance::kObjectTypeFieldNumber)); + _ui->instancesListView->header()->swapSections(im->FieldToColumn(EGMRoom::Instance::kNameFieldNumber), + im->FieldToColumn(EGMRoom::Instance::kObjectTypeFieldNumber)); - RepeatedMessageModel* tm = _roomModel->GetSubModel(Room::kTilesFieldNumber); + RepeatedMessageModel* tm = _roomModel->GetSubModel(EGMRoom::kTilesFieldNumber); RepeatedSortFilterProxyModel* tmp = new RepeatedSortFilterProxyModel(this); tmp->SetSourceModel(tm); _ui->tilesListView->setModel(tmp); for (int c = 0; c < tm->columnCount(); ++c) { - if (c != tm->FieldToColumn(Room::Tile::kBackgroundNameFieldNumber) && - c != tm->FieldToColumn(Room::Tile::kIdFieldNumber) && c != tm->FieldToColumn(Room::Tile::kDepthFieldNumber) && - c != tm->FieldToColumn(Room::Tile::kNameFieldNumber)) + if (c != tm->FieldToColumn(EGMRoom::Tile::kBackgroundNameFieldNumber) && + c != tm->FieldToColumn(EGMRoom::Tile::kIdFieldNumber) && c != tm->FieldToColumn(EGMRoom::Tile::kDepthFieldNumber) && + c != tm->FieldToColumn(EGMRoom::Tile::kNameFieldNumber)) _ui->tilesListView->hideColumn(c); else _ui->tilesListView->resizeColumnToContents(c); } - _ui->tilesListView->header()->swapSections(tm->FieldToColumn(Room::Tile::kNameFieldNumber), - tm->FieldToColumn(Room::Tile::kBackgroundNameFieldNumber)); + _ui->tilesListView->header()->swapSections(tm->FieldToColumn(EGMRoom::Tile::kNameFieldNumber), + tm->FieldToColumn(EGMRoom::Tile::kBackgroundNameFieldNumber)); - RepeatedMessageModel* vm = _roomModel->GetSubModel(Room::kViewsFieldNumber); + RepeatedMessageModel* vm = _roomModel->GetSubModel(EGMRoom::kViewsFieldNumber); _viewMapper->setModel(vm); connect(_ui->instancesListView->selectionModel(), &QItemSelectionModel::selectionChanged, diff --git a/MainWindow.cpp b/MainWindow.cpp index cfae09394..72c320411 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -373,7 +373,7 @@ void MainWindow::openProject(std::unique_ptr openedProject) { treeConf.UseEditorLauncher(Launch(this)); treeConf.UseEditorLauncher(Launch(this)); treeConf.UseEditorLauncher(Launch(this)); - treeConf.UseEditorLauncher(Launch(this)); + treeConf.UseEditorLauncher(Launch(this)); treeConf.UseEditorLauncher(Launch(this)); ProtoModel::DisplayConfig msgConf; @@ -388,7 +388,7 @@ void MainWindow::openProject(std::unique_ptr openedProject) { msgConf.SetDefaultIcon("font"); msgConf.SetDefaultIcon("timeline"); msgConf.SetDefaultIcon("object"); - msgConf.SetDefaultIcon("room"); + msgConf.SetDefaultIcon("egmroom"); msgConf.SetDefaultIcon("settings"); ConfigureIconFields(&msgConf, TreeNode::GetDescriptor()); diff --git a/Models/ProtoModel.h b/Models/ProtoModel.h index 032284bf0..72a737ee7 100644 --- a/Models/ProtoModel.h +++ b/Models/ProtoModel.h @@ -22,7 +22,7 @@ using Background = buffers::resources::Background; using Font = buffers::resources::Font; using Object = buffers::resources::Object; using Path = buffers::resources::Path; -using Room = buffers::resources::Room; +using EGMRoom = buffers::resources::EGMRoom; using Sound = buffers::resources::Sound; using Sprite = buffers::resources::Sprite; using Timeline = buffers::resources::Timeline; diff --git a/Models/ResourceModelMap.cpp b/Models/ResourceModelMap.cpp index 02c774efa..9eb36992e 100644 --- a/Models/ResourceModelMap.cpp +++ b/Models/ResourceModelMap.cpp @@ -69,13 +69,13 @@ void ResourceModelMap::ResourceRemoved(TypeCase type, const QString& name, R_EXPECT_V(room); MessageModel* roomModel = room->GetSubModel(TreeNode::kRoomFieldNumber); R_EXPECT_V(roomModel); - RepeatedMessageModel* instancesModel = roomModel->GetSubModel(Room::kInstancesFieldNumber); + RepeatedMessageModel* instancesModel = roomModel->GetSubModel(EGMRoom::kInstancesFieldNumber); auto& remover = removers.emplace(instancesModel, instancesModel).first->second; for (int row = 0; row < instancesModel->rowCount(); ++row) { if (instancesModel ->Data( - FieldPath::Of(FieldPath::StartingAt(row), Room::Instance::kObjectTypeFieldNumber)) + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Instance::kObjectTypeFieldNumber)) .toString() == name) remover.RemoveRow(row); } @@ -84,13 +84,13 @@ void ResourceModelMap::ResourceRemoved(TypeCase type, const QString& name, MessageModel* backupModel = roomModel->GetBackupModel(); if (backupModel != nullptr) { RepeatedMessageModel* instancesModelBak = - backupModel->GetSubModel(Room::kInstancesFieldNumber); + backupModel->GetSubModel(EGMRoom::kInstancesFieldNumber); auto& remover = removers.emplace(instancesModelBak, instancesModelBak).first->second; for (int row = 0; row < instancesModelBak->rowCount(); ++row) { if (instancesModelBak ->Data( - FieldPath::Of(FieldPath::StartingAt(row), Room::Instance::kObjectTypeFieldNumber)) + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Instance::kObjectTypeFieldNumber)) .toString() == name) remover.RemoveRow(row); } @@ -102,13 +102,13 @@ void ResourceModelMap::ResourceRemoved(TypeCase type, const QString& name, if (type == TypeCase::kBackground) { for (auto& room : qAsConst(_resources[TypeCase::kRoom])) { MessageModel* roomModel = room->GetSubModel(TreeNode::kRoomFieldNumber); - RepeatedMessageModel* tilesModel = roomModel->GetSubModel(Room::kTilesFieldNumber); + RepeatedMessageModel* tilesModel = roomModel->GetSubModel(EGMRoom::kTilesFieldNumber); auto& remover = removers.emplace(tilesModel, tilesModel).first->second; for (int row = 0; row < tilesModel->rowCount(); ++row) { if (tilesModel ->Data( - FieldPath::Of(FieldPath::StartingAt(row), Room::Instance::kObjectTypeFieldNumber)) + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Instance::kObjectTypeFieldNumber)) .toString() == name) remover.RemoveRow(row); } @@ -116,12 +116,12 @@ void ResourceModelMap::ResourceRemoved(TypeCase type, const QString& name, // Only models in use in open editors should have backup models MessageModel* backupModel = roomModel->GetBackupModel(); if (backupModel != nullptr) { - RepeatedMessageModel* tilesModelBak = backupModel->GetSubModel(Room::kTilesFieldNumber); + RepeatedMessageModel* tilesModelBak = backupModel->GetSubModel(EGMRoom::kTilesFieldNumber); auto& remover = removers.emplace(tilesModelBak, tilesModelBak).first->second; for (int row = 0; row < tilesModelBak->rowCount(); ++row) { if (tilesModelBak - ->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kBackgroundNameFieldNumber)) + ->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kBackgroundNameFieldNumber)) .toString() == name) remover.RemoveRow(row); } @@ -193,7 +193,7 @@ TypeCase Type(TreeModel::Node* node) { {FullName(), TypeCase::kShader}, {FullName(), TypeCase::kTimeline}, {FullName(), TypeCase::kObject}, - {FullName(), TypeCase::kRoom}, + {FullName(), TypeCase::kRoom}, {FullName(), TypeCase::kSettings}, }; diff --git a/RadialGM.pro b/RadialGM.pro index 421ed26bf..a70aaa86e 100644 --- a/RadialGM.pro +++ b/RadialGM.pro @@ -203,14 +203,15 @@ DISTFILES += \ Submodules/enigma-dev/shared/protos/Background.proto \ Submodules/enigma-dev/shared/protos/Building.md \ Submodules/enigma-dev/shared/protos/CMakeLists.txt \ + Submodules/enigma-dev/shared/protos/EGMRoom.proto \ Submodules/enigma-dev/shared/protos/EventDescriptor.proto \ Submodules/enigma-dev/shared/protos/Font.proto \ + Submodules/enigma-dev/shared/protos/GMRoom.proto \ Submodules/enigma-dev/shared/protos/GameInformation.proto \ Submodules/enigma-dev/shared/protos/Include.proto \ Submodules/enigma-dev/shared/protos/Makefile \ Submodules/enigma-dev/shared/protos/Object.proto \ Submodules/enigma-dev/shared/protos/Path.proto \ - Submodules/enigma-dev/shared/protos/Room.proto \ Submodules/enigma-dev/shared/protos/Script.proto \ Submodules/enigma-dev/shared/protos/Settings.proto \ Submodules/enigma-dev/shared/protos/Shader.proto \ diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index c8415a8cd..2f555dfd1 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit c8415a8cd2f1d31d6cd71a48fd85e11d5ce3d26b +Subproject commit 2f555dfd199d5e7a2032b629f1c7deb76d076b0e diff --git a/Widgets/RoomView.cpp b/Widgets/RoomView.cpp index 996c97b8b..0bb56a69a 100644 --- a/Widgets/RoomView.cpp +++ b/Widgets/RoomView.cpp @@ -37,10 +37,10 @@ void RoomView::SetResourceModel(MessageModel* model) { _model = model; if (model != nullptr) { - _sortedInstances->SetSourceModel(model->GetSubModel(Room::kInstancesFieldNumber)); - _sortedInstances->sort(Room::Instance::kObjectTypeFieldNumber); - _sortedTiles->SetSourceModel(model->GetSubModel(Room::kTilesFieldNumber)); - _sortedTiles->sort(Room::Tile::kDepthFieldNumber); + _sortedInstances->SetSourceModel(model->GetSubModel(EGMRoom::kInstancesFieldNumber)); + _sortedInstances->sort(EGMRoom::Instance::kObjectTypeFieldNumber); + _sortedTiles->SetSourceModel(model->GetSubModel(EGMRoom::kTilesFieldNumber)); + _sortedTiles->sort(EGMRoom::Tile::kDepthFieldNumber); } setFixedSize(sizeHint()); repaint(); @@ -48,8 +48,8 @@ void RoomView::SetResourceModel(MessageModel* model) { QSize RoomView::sizeHint() const { if (!_model) return QSize(640, 480); - QVariant roomWidth = _model->DataOrDefault(FieldPath::Of(Room::kWidthFieldNumber), 640), - roomHeight = _model->DataOrDefault(FieldPath::Of(Room::kHeightFieldNumber), 480); + QVariant roomWidth = _model->DataOrDefault(FieldPath::Of(EGMRoom::kWidthFieldNumber), 640), + roomHeight = _model->DataOrDefault(FieldPath::Of(EGMRoom::kHeightFieldNumber), 480); return QSize(roomWidth.toUInt(), roomHeight.toUInt()); } @@ -58,24 +58,24 @@ void RoomView::Paint(QPainter& painter) { if (!_model) return; - QVariant hsnap = _model->Data(FieldPath::Of(Room::kHsnapFieldNumber)); - QVariant vsnap = _model->Data(FieldPath::Of(Room::kVsnapFieldNumber)); + QVariant hsnap = _model->Data(FieldPath::Of(EGMRoom::kHsnapFieldNumber)); + QVariant vsnap = _model->Data(FieldPath::Of(EGMRoom::kVsnapFieldNumber)); _grid.horSpacing = hsnap.isValid() ? hsnap.toInt() : 16; _grid.vertSpacing = vsnap.isValid() ? vsnap.toInt() : 16; QColor roomColor = QColor(255, 255, 255, 100); - if (_model->Data(FieldPath::Of(Room::kShowColorFieldNumber)).toBool()) - roomColor = _model->Data(FieldPath::Of(Room::kColorFieldNumber)).toInt(); + if (_model->Data(FieldPath::Of(EGMRoom::kShowColorFieldNumber)).toBool()) + roomColor = _model->Data(FieldPath::Of(EGMRoom::kColorFieldNumber)).toInt(); - QVariant roomWidth = _model->Data(FieldPath::Of(Room::kWidthFieldNumber)), - roomHeight = _model->Data(FieldPath::Of(Room::kHeightFieldNumber)); + QVariant roomWidth = _model->Data(FieldPath::Of(EGMRoom::kWidthFieldNumber)), + roomHeight = _model->Data(FieldPath::Of(EGMRoom::kHeightFieldNumber)); painter.fillRect( QRectF(0, 0, roomWidth.isValid() ? roomWidth.toUInt() : 640, roomWidth.isValid() ? roomHeight.toUInt() : 480), QBrush(roomColor)); // to check whether room (in case of tmx importer) is of hexagonal orientation or not - QString orientation = _model->Data(FieldPath::Of(Room::kOrientationFieldNumber)).toString(); + QString orientation = _model->Data(FieldPath::Of(EGMRoom::kOrientationFieldNumber)).toString(); paintBackgrounds(painter, false); paintTiles(painter, orientation == "hexagonal"); @@ -86,7 +86,7 @@ void RoomView::Paint(QPainter& painter) { void RoomView::paintTiles(QPainter& painter, int isHexMap) { for (int row = 0; row < _sortedTiles->rowCount(); row++) { QVariant bkgName = _sortedTiles->Data( - FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kBackgroundNameFieldNumber)); + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kBackgroundNameFieldNumber)); MessageModel* bkg = MainWindow::resourceMap->GetResourceByName(TreeNode::kBackground, bkgName.toString()); if (!bkg) continue; bkg = bkg->GetSubModel(TreeNode::kBackgroundFieldNumber); @@ -100,29 +100,29 @@ void RoomView::paintTiles(QPainter& painter, int isHexMap) { int bkgImageHeight = bkg->Data(FieldPath::Of(Background::kHeightFieldNumber)).toInt(); int x = - _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kXFieldNumber)).toInt(); + _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kXFieldNumber)).toInt(); int y = - _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kYFieldNumber)).toInt(); + _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kYFieldNumber)).toInt(); int xOff = - _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kXoffsetFieldNumber)) + _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kXoffsetFieldNumber)) .toInt(); int yOff = - _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kYoffsetFieldNumber)) + _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kYoffsetFieldNumber)) .toInt(); - int w = _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kWidthFieldNumber)) + int w = _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kWidthFieldNumber)) .toInt(); - int h = _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kHeightFieldNumber)) + int h = _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kHeightFieldNumber)) .toInt(); double rotation = - _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kRotationFieldNumber)).toDouble(); + _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kRotationFieldNumber)).toDouble(); bool hasAlpha = false; double alpha = _sortedTiles-> - Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kAlphaFieldNumber)).toDouble(&hasAlpha); + Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kAlphaFieldNumber)).toDouble(&hasAlpha); QVariant xScale = _sortedTiles->DataOrDefault( - FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kXscaleFieldNumber)); + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kXscaleFieldNumber)); QVariant yScale = _sortedTiles->DataOrDefault( - FieldPath::Of(FieldPath::StartingAt(row), Room::Tile::kYscaleFieldNumber)); + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kYscaleFieldNumber)); QString imgFile = bkg->Data(FieldPath::Of(Background::kImageFieldNumber)).toString(); QPixmap pixmap = ArtManager::GetCachedPixmap(imgFile); @@ -167,19 +167,19 @@ void RoomView::paintTiles(QPainter& painter, int isHexMap) { } void RoomView::paintBackgrounds(QPainter& painter, bool foregrounds) { - RepeatedMessageModel* backgrounds = _model->GetSubModel(Room::kBackgroundsFieldNumber); + RepeatedMessageModel* backgrounds = _model->GetSubModel(EGMRoom::kBackgroundsFieldNumber); for (int row = 0; row < backgrounds->rowCount(); row++) { bool visible = backgrounds - ->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Background::kVisibleFieldNumber)) + ->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Background::kVisibleFieldNumber)) .toBool(); bool foreground = backgrounds - ->Data(FieldPath::Of(FieldPath::StartingAt(row), - Room::Background::kForegroundFieldNumber)) + ->Data(FieldPath::Of(FieldPath::StartingAt(row), + EGMRoom::Background::kForegroundFieldNumber)) .toBool(); QString bkgName = backgrounds - ->Data(FieldPath::Of(FieldPath::StartingAt(row), - Room::Background::kBackgroundNameFieldNumber)) + ->Data(FieldPath::Of(FieldPath::StartingAt(row), + EGMRoom::Background::kBackgroundNameFieldNumber)) .toString(); if (!visible || foreground != foregrounds) continue; @@ -189,10 +189,10 @@ void RoomView::paintBackgrounds(QPainter& painter, bool foregrounds) { if (!bkgRes) continue; int x = - backgrounds->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Background::kXFieldNumber)) + backgrounds->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Background::kXFieldNumber)) .toInt(); int y = - backgrounds->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Background::kYFieldNumber)) + backgrounds->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Background::kYFieldNumber)) .toInt(); int w = bkgRes->Data(FieldPath::Of(Background::kWidthFieldNumber)).toInt(); int h = bkgRes->Data(FieldPath::Of(Background::kHeightFieldNumber)).toInt(); @@ -206,10 +206,10 @@ void RoomView::paintBackgrounds(QPainter& painter, bool foregrounds) { bool stretch = backgrounds - ->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Background::kStretchFieldNumber)) + ->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Background::kStretchFieldNumber)) .toBool(); - int room_w = _model->Data(FieldPath::Of(Room::kWidthFieldNumber)).toInt(); - int room_h = _model->Data(FieldPath::Of(Room::kHeightFieldNumber)).toInt(); + int room_w = _model->Data(FieldPath::Of(EGMRoom::kWidthFieldNumber)).toInt(); + int room_h = _model->Data(FieldPath::Of(EGMRoom::kHeightFieldNumber)).toInt(); const QTransform transform = painter.transform(); if (stretch) { @@ -218,11 +218,11 @@ void RoomView::paintBackgrounds(QPainter& painter, bool foregrounds) { bool hTiled = backgrounds - ->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Background::kHtiledFieldNumber)) + ->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Background::kHtiledFieldNumber)) .toBool(); bool vTiled = backgrounds - ->Data(FieldPath::Of(FieldPath::StartingAt(row), Room::Background::kVtiledFieldNumber)) + ->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Background::kVtiledFieldNumber)) .toBool(); if (hTiled) { @@ -251,7 +251,7 @@ void RoomView::paintInstances(QPainter& painter) { int yoff = 0; QVariant sprName = _sortedInstances->Data( - FieldPath::Of(FieldPath::StartingAt(row), Room::Instance::kObjectTypeFieldNumber)); + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Instance::kObjectTypeFieldNumber)); MessageModel* spr = GetObjectSprite(sprName.toString()); if (spr == nullptr || spr->GetSubModel(Sprite::kSubimagesFieldNumber)->Empty()) { @@ -269,15 +269,15 @@ void RoomView::paintInstances(QPainter& painter) { if (pixmap.isNull()) continue; QVariant x = _sortedInstances->Data( - FieldPath::Of(FieldPath::StartingAt(row), Room::Instance::kXFieldNumber)); + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Instance::kXFieldNumber)); QVariant y = _sortedInstances->Data( - FieldPath::Of(FieldPath::StartingAt(row), Room::Instance::kYFieldNumber)); + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Instance::kYFieldNumber)); QVariant xScale = _sortedInstances->DataOrDefault( - FieldPath::Of(FieldPath::StartingAt(row), Room::Instance::kXscaleFieldNumber), 1); + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Instance::kXscaleFieldNumber), 1); QVariant yScale = _sortedInstances->DataOrDefault( - FieldPath::Of(FieldPath::StartingAt(row), Room::Instance::kYscaleFieldNumber), 1); + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Instance::kYscaleFieldNumber), 1); QVariant rot = _sortedInstances->DataOrDefault( - FieldPath::Of(FieldPath::StartingAt(row), Room::Instance::kRotationFieldNumber), 0); + FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Instance::kRotationFieldNumber), 0); QRectF dest(0, 0, w, h); QRectF src(0, 0, w, h); From f3d771c0d1f463939e90843dd4dc5c9c6068b1c2 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Mon, 22 Aug 2022 13:17:07 +0530 Subject: [PATCH 08/13] Replace Room with EGMRoom, add paint objects to room view --- Editors/RoomEditor.cpp | 4 +- Submodules/enigma-dev | 2 +- Widgets/RoomView.cpp | 152 ++++++++++++++++++++++++++++------------- Widgets/RoomView.h | 4 +- 4 files changed, 110 insertions(+), 52 deletions(-) diff --git a/Editors/RoomEditor.cpp b/Editors/RoomEditor.cpp index 7afb97a0d..1d45a59fd 100644 --- a/Editors/RoomEditor.cpp +++ b/Editors/RoomEditor.cpp @@ -10,7 +10,7 @@ #include "Models/TreeSortFilterProxyModel.h" #include "Models/RepeatedSortFilterProxyModel.h" -#include "Room.pb.h" +#include "EGMRoom.pb.h" #include #include @@ -18,7 +18,7 @@ #include -using View = buffers::resources::Room::View; +using View = buffers::resources::EGMRoom::View; RoomEditor::RoomEditor(MessageModel* model, QWidget* parent) : BaseEditor(model, parent), _ui(new Ui::RoomEditor) { _ui->setupUi(this); diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 2f555dfd1..26150404f 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 2f555dfd199d5e7a2032b629f1c7deb76d076b0e +Subproject commit 26150404fa233835102eb339f67e47cda936fc98 diff --git a/Widgets/RoomView.cpp b/Widgets/RoomView.cpp index 0bb56a69a..f26346c08 100644 --- a/Widgets/RoomView.cpp +++ b/Widgets/RoomView.cpp @@ -41,6 +41,7 @@ void RoomView::SetResourceModel(MessageModel* model) { _sortedInstances->sort(EGMRoom::Instance::kObjectTypeFieldNumber); _sortedTiles->SetSourceModel(model->GetSubModel(EGMRoom::kTilesFieldNumber)); _sortedTiles->sort(EGMRoom::Tile::kDepthFieldNumber); + _objectGroups = model->GetSubModel(EGMRoom::kObjectGroupsFieldNumber); } setFixedSize(sizeHint()); repaint(); @@ -58,10 +59,10 @@ void RoomView::Paint(QPainter& painter) { if (!_model) return; - QVariant hsnap = _model->Data(FieldPath::Of(EGMRoom::kHsnapFieldNumber)); - QVariant vsnap = _model->Data(FieldPath::Of(EGMRoom::kVsnapFieldNumber)); - _grid.horSpacing = hsnap.isValid() ? hsnap.toInt() : 16; - _grid.vertSpacing = vsnap.isValid() ? vsnap.toInt() : 16; + QVariant tileWidth = _model->Data(FieldPath::Of(EGMRoom::kTilewidthFieldNumber)); + QVariant tileHeight = _model->Data(FieldPath::Of(EGMRoom::kTileheightFieldNumber)); + _grid.horSpacing = tileWidth.isValid() ? tileWidth.toInt() : 16; + _grid.vertSpacing = tileHeight.isValid() ? tileHeight.toInt() : 16; QColor roomColor = QColor(255, 255, 255, 100); @@ -78,12 +79,13 @@ void RoomView::Paint(QPainter& painter) { QString orientation = _model->Data(FieldPath::Of(EGMRoom::kOrientationFieldNumber)).toString(); paintBackgrounds(painter, false); - paintTiles(painter, orientation == "hexagonal"); + paintTiles(painter); + paintTiledObjects(painter, orientation == "hexagonal"); paintInstances(painter); paintBackgrounds(painter, true); } -void RoomView::paintTiles(QPainter& painter, int isHexMap) { +void RoomView::paintTiles(QPainter& painter) { for (int row = 0; row < _sortedTiles->rowCount(); row++) { QVariant bkgName = _sortedTiles->Data( FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kBackgroundNameFieldNumber)); @@ -92,13 +94,6 @@ void RoomView::paintTiles(QPainter& painter, int isHexMap) { bkg = bkg->GetSubModel(TreeNode::kBackgroundFieldNumber); if (!bkg) continue; - // useful in setting source rect correctly - bool bkgUseAsTileset = bkg->Data(FieldPath::Of(Background::kUseAsTilesetFieldNumber)).toBool(); - int bkgTileWidth = bkg->Data(FieldPath::Of(Background::kTileWidthFieldNumber)).toInt(); - int bkgTileHeight = bkg->Data(FieldPath::Of(Background::kTileHeightFieldNumber)).toInt(); - int bkgImageWidth = bkg->Data(FieldPath::Of(Background::kWidthFieldNumber)).toInt(); - int bkgImageHeight = bkg->Data(FieldPath::Of(Background::kHeightFieldNumber)).toInt(); - int x = _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kXFieldNumber)).toInt(); int y = @@ -113,11 +108,6 @@ void RoomView::paintTiles(QPainter& painter, int isHexMap) { .toInt(); int h = _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kHeightFieldNumber)) .toInt(); - double rotation = - _sortedTiles->Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kRotationFieldNumber)).toDouble(); - bool hasAlpha = false; - double alpha = _sortedTiles-> - Data(FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kAlphaFieldNumber)).toDouble(&hasAlpha); QVariant xScale = _sortedTiles->DataOrDefault( FieldPath::Of(FieldPath::StartingAt(row), EGMRoom::Tile::kXscaleFieldNumber)); @@ -128,44 +118,110 @@ void RoomView::paintTiles(QPainter& painter, int isHexMap) { QPixmap pixmap = ArtManager::GetCachedPixmap(imgFile); if (pixmap.isNull()) continue; - // dest rect handles proper scaling of tile in different scenarios, such as image based background is scaled or - // case when a given tile of tileset based background is scaled(possible in tiled using objects) QRectF dest(x, y, w, h); - - // if background contains multiple tiles then set the rect using tilewidth and tileheight - // otherwise set it as image width and height - int bkgUseAsTilesetInt = bkgUseAsTileset; // convert to int to avoid if else branch - QRectF src = QRectF(xOff, yOff, - bkgUseAsTilesetInt*bkgTileWidth + (1-bkgUseAsTilesetInt)*bkgImageWidth, - bkgUseAsTilesetInt*bkgTileHeight + (1-bkgUseAsTilesetInt)*bkgImageHeight); - + QRectF src(xOff, yOff, w, h); const QTransform transform = painter.transform(); - - // Note: Current rotation support is only according to the location of tiles in ortho and hex Tiled maps, - // if hexMap is 1(true) tile is rotated from its origin, if hexMap is 0(false) tile is rotate from top-left corner - // Side node: This translate back-and-forth is to achieve correct transformation in global space - painter.translate(isHexMap * (x+(w/2)) + (1 - isHexMap) * x, - isHexMap * (y+(h/2)) + (1 - isHexMap) * (y+h)); - painter.rotate(rotation); - painter.translate(isHexMap * (-x-(w/2)) + (1 - isHexMap) * -x, - isHexMap * (-y-(h/2)) + (1 - isHexMap) * (-y-h)); - - // for scale to work properly, origin must to adjusted to center of pixmap, and its resetted after applying scale - // Note: scale also handles horizontal and vertical flip of tiles - painter.translate(x+(w/2),y+(h/2)); painter.scale(xScale.toFloat(), yScale.toFloat()); - painter.translate(-x-(w/2),-y-(h/2)); - - // set opacity - int hasAlphaInt = hasAlpha; // convert to int to avoid if else branch - double finalAlpha = hasAlphaInt*alpha + (1-hasAlphaInt)*1.0; - painter.setOpacity(finalAlpha); - painter.drawPixmap(dest, pixmap, src); painter.setTransform(transform); } } +void RoomView::paintTiledObjects(QPainter& painter, int isHexMap) { + for(int row = 0; row < _objectGroups->rowCount(); row++) { + const ProtoModel *objects = _objectGroups->GetSubModel(FieldPath::Of( + FieldPath::StartingAt(row), + EGMRoom::ObjectGroup::kObjectsFieldNumber)); + if(!objects) + continue; + const RepeatedMessageModel *objectsAsRepeated = objects->TryCast(); + if(!objectsAsRepeated) + continue; + + for(int objRow = 0; objRow < objectsAsRepeated->rowCount(); ++objRow) { + ProtoModel *currObject = objectsAsRepeated->GetSubModel(objRow); + + QVariant bkgName = currObject->Data(FieldPath::Of( + EGMRoom::ObjectGroup::Object::kBackgroundNameFieldNumber)); + + MessageModel* bkg = MainWindow::resourceMap->GetResourceByName(TreeNode::kBackground, bkgName.toString()); + if (!bkg) continue; + bkg = bkg->GetSubModel(TreeNode::kBackgroundFieldNumber); + if (!bkg) continue; + + // useful in setting source rect correctly + bool bkgUseAsTileset = bkg->Data(FieldPath::Of(Background::kUseAsTilesetFieldNumber)).toBool(); + int bkgTileWidth = bkg->Data(FieldPath::Of(Background::kTileWidthFieldNumber)).toInt(); + int bkgTileHeight = bkg->Data(FieldPath::Of(Background::kTileHeightFieldNumber)).toInt(); + int bkgImageWidth = bkg->Data(FieldPath::Of(Background::kWidthFieldNumber)).toInt(); + int bkgImageHeight = bkg->Data(FieldPath::Of(Background::kHeightFieldNumber)).toInt(); + + int x = currObject->Data(FieldPath::Of( + EGMRoom::ObjectGroup::Object::kXFieldNumber)).toInt(); + int y = currObject->Data(FieldPath::Of( + EGMRoom::ObjectGroup::Object::kYFieldNumber)).toInt(); + int xOff = 0; + int yOff = 0; + int w = currObject->Data(FieldPath::Of( + EGMRoom::ObjectGroup::Object::kWidthFieldNumber)).toInt(); + int h = currObject->Data(FieldPath::Of( + EGMRoom::ObjectGroup::Object::kHeightFieldNumber)).toInt(); + double rotation = currObject->Data(FieldPath::Of( + EGMRoom::ObjectGroup::Object::kRotationFieldNumber)).toDouble(); + bool hasAlpha = false; + double alpha = _objectGroups->Data(FieldPath::Of( + FieldPath::StartingAt(row), + EGMRoom::ObjectGroup::kOpacityFieldNumber)).toDouble(&hasAlpha); + + + QVariant xScale = currObject->DataOrDefault(FieldPath::Of( + EGMRoom::ObjectGroup::Object::kXscaleFieldNumber)); + QVariant yScale = currObject->DataOrDefault(FieldPath::Of( + EGMRoom::ObjectGroup::Object::kYscaleFieldNumber)); + + QString imgFile = bkg->Data(FieldPath::Of(Background::kImageFieldNumber)).toString(); + QPixmap pixmap = ArtManager::GetCachedPixmap(imgFile); + if (pixmap.isNull()) continue; + + // dest rect handles proper scaling of tile in different scenarios, such as image based background is scaled or + // case when a given tile of tileset based background is scaled(possible in tiled using objects) + QRectF dest(x, y, w, h); + + // if background contains multiple tiles then set the rect using tilewidth and tileheight + // otherwise set it as image width and height + int bkgUseAsTilesetInt = bkgUseAsTileset; // convert to int to avoid if else branch + QRectF src = QRectF(xOff, yOff, + bkgUseAsTilesetInt*bkgTileWidth + (1-bkgUseAsTilesetInt)*bkgImageWidth, + bkgUseAsTilesetInt*bkgTileHeight + (1-bkgUseAsTilesetInt)*bkgImageHeight); + + const QTransform transform = painter.transform(); + + // Note: Current rotation support is only according to the location of tiles in ortho and hex Tiled maps, + // if hexMap is 1(true) tile is rotated from its origin, if hexMap is 0(false) tile is rotate from top-left corner + // Side node: This translate back-and-forth is to achieve correct transformation in global space + painter.translate(isHexMap * (x+(w/2)) + (1 - isHexMap) * x, + isHexMap * (y+(h/2)) + (1 - isHexMap) * (y+h)); + painter.rotate(rotation); + painter.translate(isHexMap * (-x-(w/2)) + (1 - isHexMap) * -x, + isHexMap * (-y-(h/2)) + (1 - isHexMap) * (-y-h)); + + // for scale to work properly, origin must to adjusted to center of pixmap, and its resetted after applying scale + // Note: scale also handles horizontal and vertical flip of tiles + painter.translate(x+(w/2),y+(h/2)); + painter.scale(xScale.toFloat(), yScale.toFloat()); + painter.translate(-x-(w/2),-y-(h/2)); + + // set opacity + int hasAlphaInt = hasAlpha; // convert to int to avoid if else branch + double finalAlpha = hasAlphaInt*alpha + (1-hasAlphaInt)*1.0; + painter.setOpacity(finalAlpha); + + painter.drawPixmap(dest, pixmap, src); + painter.setTransform(transform); + } + } +} + void RoomView::paintBackgrounds(QPainter& painter, bool foregrounds) { RepeatedMessageModel* backgrounds = _model->GetSubModel(EGMRoom::kBackgroundsFieldNumber); for (int row = 0; row < backgrounds->rowCount(); row++) { diff --git a/Widgets/RoomView.h b/Widgets/RoomView.h index 6d2a1837a..757de99e1 100644 --- a/Widgets/RoomView.h +++ b/Widgets/RoomView.h @@ -25,8 +25,10 @@ class RoomView : public AssetView { InstanceSortFilterProxyModel *_sortedInstances; RepeatedSortFilterProxyModel *_sortedTiles; QPixmap _transparentPixmap; + RepeatedMessageModel *_objectGroups; - void paintTiles(QPainter &painter, int isHexMap = 0); + void paintTiles(QPainter &painter); + void paintTiledObjects(QPainter &painter, int isHexMap = 0); void paintBackgrounds(QPainter &painter, bool foregrounds = false); void paintInstances(QPainter &painter); }; From 894aae3b11682dc2509e5496bf7f360a5f6e89a2 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Thu, 25 Aug 2022 15:55:18 +0530 Subject: [PATCH 09/13] Add tmx project merge functionality --- MainWindow.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++- MainWindow.h | 2 ++ MainWindow.ui | 11 ++++--- Submodules/enigma-dev | 2 +- 4 files changed, 79 insertions(+), 6 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index 72c320411..be63a5c79 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -462,7 +462,7 @@ void MainWindow::on_actionNew_triggered() { openNewProject(); } void MainWindow::on_actionOpen_triggered() { const QString &fileName = QFileDialog::getOpenFileName( this, tr("Open Project"), "", - tr("All supported formats (*.egm *.yyp *.project.gmx *.gm81 *.gmk *.gm6 *.gmd);;GameMaker: Studio 2 Projects " + tr("All supported formats (*.egm *.yyp *.project.gmx *.gm81 *.gmk *.gm6 *.gmd *.tsx *.tmx);;GameMaker: Studio 2 Projects " "(*.yyp);;GameMaker: Studio Projects (*.project.gmx);;Classic " "GameMaker Files (*.gm81 *.gmk *.gm6 *.gmd);;" "Tiled Tilesets (*.tsx);;Tiled Maps (*.tmx);;All Files (*)")); @@ -494,6 +494,74 @@ void MainWindow::on_actionSave_triggered() { egm::WriteProject(_project.get(), fileName.toStdString()); } +int MainWindow::findRoom(buffers::TreeNode *root, buffers::resources::EGMRoom *&room) { + if(root->type_case() == TypeCase::kRoom) { + room = root->mutable_room(); + return 0; + } + + for (int i=0; i < root->folder().children_size(); ++i) { + int res = findRoom(root->mutable_folder()->mutable_children(i), room); + if (res) return res; + } + + return 0; +} + +void MainWindow::on_actionMerge_triggered() { + buffers::resources::EGMRoom *existingRoom = NULL; + + findRoom(_project->mutable_game()->mutable_root(), existingRoom); + + // check if there is an existing project + if(!existingRoom) { + std::cout << "Load the project first" << std::endl; + } + // pass the existing project to MergeProject method with fileName and current project as arguments + else { + std::cout << "Merging projects" << std::endl; + + const QString &fName = QFileDialog::getOpenFileName( + this, tr("Select TMX project to merge"), "", + tr("Tiled Maps (*.tmx)")); + + if (!fName.isEmpty()) { + std::unique_ptr loadedProject = egm::LoadProject(fName.toStdString()); + + if (!loadedProject) { + QMessageBox::warning(this, tr("Failed To Open Project"), tr("There was a problem loading the project: ") + fName, + QMessageBox::Ok); + return; + } + + buffers::resources::EGMRoom *loadedRoom = NULL; + findRoom(loadedProject->mutable_game()->mutable_root(), loadedRoom); + + if(loadedRoom) { + existingRoom->set_orientation(loadedRoom->orientation()); + existingRoom->set_renderorder(loadedRoom->renderorder()); + existingRoom->set_width(loadedRoom->width()); + existingRoom->set_height(loadedRoom->height()); + existingRoom->set_tilewidth(loadedRoom->tilewidth()); + existingRoom->set_tileheight(loadedRoom->tileheight()); + existingRoom->set_infinite(loadedRoom->infinite()); + existingRoom->set_parallaxoriginx(loadedRoom->parallaxoriginx()); + existingRoom->set_parallaxoriginy(loadedRoom->parallaxoriginy()); + existingRoom->set_nextlayerid(loadedRoom->nextlayerid()); + existingRoom->set_nextobjectid(loadedRoom->nextobjectid()); + existingRoom->set_firstgid(loadedRoom->firstgid()); + existingRoom->set_hexsidelength(loadedRoom->has_hexsidelength()); + existingRoom->set_staggeraxis(loadedRoom->staggeraxis()); + existingRoom->set_staggerindex(loadedRoom->staggerindex()); + existingRoom->set_color(loadedRoom->color()); + existingRoom->mutable_objectgroups()->CopyFrom(loadedRoom->objectgroups()); + } + else + std::cout << "Fatal error, couldnt find loaded room" << std::endl; + } + } +} + void MainWindow::on_actionPreferences_triggered() { PreferencesDialog preferencesDialog(this); preferencesDialog.exec(); diff --git a/MainWindow.h b/MainWindow.h index 56cffccf9..3917ac225 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -62,6 +62,7 @@ class MainWindow : public QMainWindow { void on_actionOpen_triggered(); void on_actionClearRecentMenu_triggered(); void on_actionSave_triggered(); + void on_actionMerge_triggered(); void on_actionPreferences_triggered(); void on_actionExit_triggered(); @@ -127,6 +128,7 @@ class MainWindow : public QMainWindow { void writeSettings(); void setTabbedMode(bool enabled); static QFileInfo getEnigmaRoot(); + int findRoom(buffers::TreeNode *root, buffers::resources::EGMRoom *&room); }; #endif // MAINWINDOW_H diff --git a/MainWindow.ui b/MainWindow.ui index b8926488a..37caf7e63 100644 --- a/MainWindow.ui +++ b/MainWindow.ui @@ -100,7 +100,7 @@ 0 0 1200 - 31 + 23 @@ -122,6 +122,7 @@ + @@ -295,9 +296,6 @@ false - - QDockWidget::AllDockWidgetFeatures - Qt::AllDockWidgetAreas @@ -981,6 +979,11 @@ Ctrl+Shift+G + + + Merge + + diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 26150404f..a2866a1ad 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 26150404fa233835102eb339f67e47cda936fc98 +Subproject commit a2866a1adf9a42f6ae57dca1db548831c3c844eb From b7b8cf2ee1380d43fcd18e2c57365333bc8dcd97 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Tue, 30 Aug 2022 12:19:09 +0530 Subject: [PATCH 10/13] RoomView updates for EGMRoom support itr 2 --- MainWindow.cpp | 1 + Submodules/enigma-dev | 2 +- Widgets/RoomView.cpp | 100 ++++++++++++++++++++++++++++++++++++++++++ Widgets/RoomView.h | 2 + 4 files changed, 104 insertions(+), 1 deletion(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index be63a5c79..2e317997c 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -555,6 +555,7 @@ void MainWindow::on_actionMerge_triggered() { existingRoom->set_staggerindex(loadedRoom->staggerindex()); existingRoom->set_color(loadedRoom->color()); existingRoom->mutable_objectgroups()->CopyFrom(loadedRoom->objectgroups()); + existingRoom->mutable_tilelayers()->CopyFrom(loadedRoom->tilelayers()); } else std::cout << "Fatal error, couldnt find loaded room" << std::endl; diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index a2866a1ad..068660c7a 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit a2866a1adf9a42f6ae57dca1db548831c3c844eb +Subproject commit 068660c7a379c6a298d33555bfcc4a948df06c1f diff --git a/Widgets/RoomView.cpp b/Widgets/RoomView.cpp index f26346c08..088fa0f99 100644 --- a/Widgets/RoomView.cpp +++ b/Widgets/RoomView.cpp @@ -42,6 +42,7 @@ void RoomView::SetResourceModel(MessageModel* model) { _sortedTiles->SetSourceModel(model->GetSubModel(EGMRoom::kTilesFieldNumber)); _sortedTiles->sort(EGMRoom::Tile::kDepthFieldNumber); _objectGroups = model->GetSubModel(EGMRoom::kObjectGroupsFieldNumber); + _tileLayers = model->GetSubModel(EGMRoom::kTileLayersFieldNumber); } setFixedSize(sizeHint()); repaint(); @@ -81,6 +82,7 @@ void RoomView::Paint(QPainter& painter) { paintBackgrounds(painter, false); paintTiles(painter); paintTiledObjects(painter, orientation == "hexagonal"); + paintTileLayerTiles(painter, orientation == "hexagonal"); paintInstances(painter); paintBackgrounds(painter, true); } @@ -160,6 +162,7 @@ void RoomView::paintTiledObjects(QPainter& painter, int isHexMap) { EGMRoom::ObjectGroup::Object::kXFieldNumber)).toInt(); int y = currObject->Data(FieldPath::Of( EGMRoom::ObjectGroup::Object::kYFieldNumber)).toInt(); + // TODO: Add support to loading tileset tile as an object int xOff = 0; int yOff = 0; int w = currObject->Data(FieldPath::Of( @@ -222,6 +225,103 @@ void RoomView::paintTiledObjects(QPainter& painter, int isHexMap) { } } +void RoomView::paintTileLayerTiles(QPainter& painter, int isHexMap) { + for(int row = 0; row < _tileLayers->rowCount(); ++row) { + const ProtoModel *currLayerData = _tileLayers->GetSubModel(FieldPath::Of( + FieldPath::StartingAt(row), + EGMRoom::TileLayer::kDataFieldNumber)); + if(!currLayerData) + continue; + + const ProtoModel *chunks = currLayerData->GetSubModel(FieldPath::Of( + EGMRoom::TileLayer::Data::kChunksFieldNumber)); + + const ProtoModel *tiles = currLayerData->GetSubModel(FieldPath::Of( + EGMRoom::TileLayer::Data::kTilesFieldNumber)); + + if(!tiles) + continue; + const RepeatedMessageModel *tilesAsRepeated = tiles->TryCast(); + if(!tilesAsRepeated) + continue; + + for(int tileRow = 0; tileRow < tilesAsRepeated->rowCount(); ++tileRow) { + const ProtoModel *currTile = tilesAsRepeated->GetSubModel(tileRow); + // std::string bg = currTile->Data(FieldPath::Of(EGMRoom::Tile::kBackgroundNameFieldNumber)).toString().toStdString(); + // std::cout << bg << std::endl; + if(!currTile) + continue; + + QVariant bkgName = currTile->Data(FieldPath::Of(EGMRoom::Tile::kBackgroundNameFieldNumber)); + + MessageModel* bkg = MainWindow::resourceMap->GetResourceByName(TreeNode::kBackground, bkgName.toString()); + if (!bkg) continue; + bkg = bkg->GetSubModel(TreeNode::kBackgroundFieldNumber); + if (!bkg) continue; + + // useful in setting source rect correctly + bool bkgUseAsTileset = bkg->Data(FieldPath::Of(Background::kUseAsTilesetFieldNumber)).toBool(); + int bkgTileWidth = bkg->Data(FieldPath::Of(Background::kTileWidthFieldNumber)).toInt(); + int bkgTileHeight = bkg->Data(FieldPath::Of(Background::kTileHeightFieldNumber)).toInt(); + int bkgImageWidth = bkg->Data(FieldPath::Of(Background::kWidthFieldNumber)).toInt(); + int bkgImageHeight = bkg->Data(FieldPath::Of(Background::kHeightFieldNumber)).toInt(); + + int x = currTile->Data(FieldPath::Of(EGMRoom::Tile::kXFieldNumber)).toInt(); + int y = currTile->Data(FieldPath::Of(EGMRoom::Tile::kYFieldNumber)).toInt(); + int xOff = currTile->Data(FieldPath::Of(EGMRoom::Tile::kXoffsetFieldNumber)).toInt(); + int yOff = currTile->Data(FieldPath::Of(EGMRoom::Tile::kYoffsetFieldNumber)).toInt(); + int w = currTile->Data(FieldPath::Of(EGMRoom::Tile::kWidthFieldNumber)).toInt(); + int h = currTile->Data(FieldPath::Of(EGMRoom::Tile::kHeightFieldNumber)).toInt(); + double rotation = currTile->Data(FieldPath::Of(EGMRoom::Tile::kRotationFieldNumber)).toDouble(); + bool hasAlpha = false; + double alpha = currTile->Data(FieldPath::Of(EGMRoom::Tile::kAlphaFieldNumber)).toDouble(&hasAlpha); + + QVariant xScale = currTile->DataOrDefault(FieldPath::Of(EGMRoom::Tile::kXscaleFieldNumber)); + QVariant yScale = currTile->DataOrDefault(FieldPath::Of(EGMRoom::Tile::kYscaleFieldNumber)); + + QString imgFile = bkg->Data(FieldPath::Of(Background::kImageFieldNumber)).toString(); + QPixmap pixmap = ArtManager::GetCachedPixmap(imgFile); + if (pixmap.isNull()) continue; + + // dest rect handles proper scaling of tile in different scenarios, such as image based background is scaled or + // case when a given tile of tileset based background is scaled(possible in tiled using objects) + QRectF dest(x, y, w, h); + + // if background contains multiple tiles then set the rect using tilewidth and tileheight + // otherwise set it as image width and height + int bkgUseAsTilesetInt = bkgUseAsTileset; // convert to int to avoid if else branch + QRectF src = QRectF(xOff, yOff, + bkgUseAsTilesetInt*bkgTileWidth + (1-bkgUseAsTilesetInt)*bkgImageWidth, + bkgUseAsTilesetInt*bkgTileHeight + (1-bkgUseAsTilesetInt)*bkgImageHeight); +// QRectF src(xOff, yOff, w, h); + const QTransform transform = painter.transform(); + + // Note: Current rotation support is only according to the location of tiles in ortho and hex Tiled maps, + // if hexMap is 1(true) tile is rotated from its origin, if hexMap is 0(false) tile is rotate from top-left corner + // Side node: This translate back-and-forth is to achieve correct transformation in global space + painter.translate(isHexMap * (x+(w/2)) + (1 - isHexMap) * x, + isHexMap * (y+(h/2)) + (1 - isHexMap) * (y+h)); + painter.rotate(rotation); + painter.translate(isHexMap * (-x-(w/2)) + (1 - isHexMap) * -x, + isHexMap * (-y-(h/2)) + (1 - isHexMap) * (-y-h)); + + // for scale to work properly, origin must to adjusted to center of pixmap, and its resetted after applying scale + // Note: scale also handles horizontal and vertical flip of tiles + painter.translate(x+(w/2),y+(h/2)); + painter.scale(xScale.toFloat(), yScale.toFloat()); + painter.translate(-x-(w/2),-y-(h/2)); + + // set opacity + int hasAlphaInt = hasAlpha; // convert to int to avoid if else branch + double finalAlpha = hasAlphaInt*alpha + (1-hasAlphaInt)*1.0; + painter.setOpacity(finalAlpha); + + painter.drawPixmap(dest, pixmap, src); + painter.setTransform(transform); + } + } +} + void RoomView::paintBackgrounds(QPainter& painter, bool foregrounds) { RepeatedMessageModel* backgrounds = _model->GetSubModel(EGMRoom::kBackgroundsFieldNumber); for (int row = 0; row < backgrounds->rowCount(); row++) { diff --git a/Widgets/RoomView.h b/Widgets/RoomView.h index 757de99e1..ef8bfecfe 100644 --- a/Widgets/RoomView.h +++ b/Widgets/RoomView.h @@ -26,9 +26,11 @@ class RoomView : public AssetView { RepeatedSortFilterProxyModel *_sortedTiles; QPixmap _transparentPixmap; RepeatedMessageModel *_objectGroups; + RepeatedMessageModel *_tileLayers; void paintTiles(QPainter &painter); void paintTiledObjects(QPainter &painter, int isHexMap = 0); + void paintTileLayerTiles(QPainter &painter, int isHexMap = 0); void paintBackgrounds(QPainter &painter, bool foregrounds = false); void paintInstances(QPainter &painter); }; From 1f329d7d3af31546104b238e7afeb42d8d0c8bc6 Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Tue, 30 Aug 2022 21:47:21 +0530 Subject: [PATCH 11/13] New egmroom support itr 3, chunk support --- Submodules/enigma-dev | 2 +- Widgets/RoomView.cpp | 158 +++++++++++++++++++++++------------------- Widgets/RoomView.h | 3 + 3 files changed, 91 insertions(+), 72 deletions(-) diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 068660c7a..661784da2 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 068660c7a379c6a298d33555bfcc4a948df06c1f +Subproject commit 661784da2518c343da1eb44714f8e582cf76f842 diff --git a/Widgets/RoomView.cpp b/Widgets/RoomView.cpp index 088fa0f99..9252e6eec 100644 --- a/Widgets/RoomView.cpp +++ b/Widgets/RoomView.cpp @@ -236,89 +236,105 @@ void RoomView::paintTileLayerTiles(QPainter& painter, int isHexMap) { const ProtoModel *chunks = currLayerData->GetSubModel(FieldPath::Of( EGMRoom::TileLayer::Data::kChunksFieldNumber)); + // render tiles present in chunks + if(chunks) { + const RepeatedMessageModel *chunksAsRepeated = chunks->TryCast(); + if(chunksAsRepeated) { + for(int chunkRow = 0; chunkRow < chunksAsRepeated->rowCount(); ++chunkRow) { + const ProtoModel *currChunk = chunksAsRepeated->GetSubModel(chunkRow); + if(currChunk) { + const ProtoModel *chunkTiles = currChunk->GetSubModel(FieldPath::Of( + EGMRoom::TileLayer::Data::Chunk::kTilesFieldNumber)); + painterTiledTileHelper(painter, chunkTiles, isHexMap); + } + } + } + } + + // render tiles present directly in data const ProtoModel *tiles = currLayerData->GetSubModel(FieldPath::Of( - EGMRoom::TileLayer::Data::kTilesFieldNumber)); + EGMRoom::TileLayer::Data::kTilesFieldNumber)); + painterTiledTileHelper(painter, tiles, isHexMap); + } +} - if(!tiles) - continue; - const RepeatedMessageModel *tilesAsRepeated = tiles->TryCast(); - if(!tilesAsRepeated) - continue; +void RoomView::painterTiledTileHelper(QPainter& painter, const ProtoModel *tiles, int isHexMap) { + if(!tiles) + return; + const RepeatedMessageModel *tilesAsRepeated = tiles->TryCast(); + if(!tilesAsRepeated) + return; - for(int tileRow = 0; tileRow < tilesAsRepeated->rowCount(); ++tileRow) { - const ProtoModel *currTile = tilesAsRepeated->GetSubModel(tileRow); - // std::string bg = currTile->Data(FieldPath::Of(EGMRoom::Tile::kBackgroundNameFieldNumber)).toString().toStdString(); - // std::cout << bg << std::endl; - if(!currTile) - continue; + for(int tileRow = 0; tileRow < tilesAsRepeated->rowCount(); ++tileRow) { + const ProtoModel *currTile = tilesAsRepeated->GetSubModel(tileRow); - QVariant bkgName = currTile->Data(FieldPath::Of(EGMRoom::Tile::kBackgroundNameFieldNumber)); + // for empty tiles "" empty bkgName is returned which acts as skipping check for current tile + QVariant bkgName = currTile->Data(FieldPath::Of(EGMRoom::Tile::kBackgroundNameFieldNumber)); - MessageModel* bkg = MainWindow::resourceMap->GetResourceByName(TreeNode::kBackground, bkgName.toString()); - if (!bkg) continue; - bkg = bkg->GetSubModel(TreeNode::kBackgroundFieldNumber); - if (!bkg) continue; - - // useful in setting source rect correctly - bool bkgUseAsTileset = bkg->Data(FieldPath::Of(Background::kUseAsTilesetFieldNumber)).toBool(); - int bkgTileWidth = bkg->Data(FieldPath::Of(Background::kTileWidthFieldNumber)).toInt(); - int bkgTileHeight = bkg->Data(FieldPath::Of(Background::kTileHeightFieldNumber)).toInt(); - int bkgImageWidth = bkg->Data(FieldPath::Of(Background::kWidthFieldNumber)).toInt(); - int bkgImageHeight = bkg->Data(FieldPath::Of(Background::kHeightFieldNumber)).toInt(); - - int x = currTile->Data(FieldPath::Of(EGMRoom::Tile::kXFieldNumber)).toInt(); - int y = currTile->Data(FieldPath::Of(EGMRoom::Tile::kYFieldNumber)).toInt(); - int xOff = currTile->Data(FieldPath::Of(EGMRoom::Tile::kXoffsetFieldNumber)).toInt(); - int yOff = currTile->Data(FieldPath::Of(EGMRoom::Tile::kYoffsetFieldNumber)).toInt(); - int w = currTile->Data(FieldPath::Of(EGMRoom::Tile::kWidthFieldNumber)).toInt(); - int h = currTile->Data(FieldPath::Of(EGMRoom::Tile::kHeightFieldNumber)).toInt(); - double rotation = currTile->Data(FieldPath::Of(EGMRoom::Tile::kRotationFieldNumber)).toDouble(); - bool hasAlpha = false; - double alpha = currTile->Data(FieldPath::Of(EGMRoom::Tile::kAlphaFieldNumber)).toDouble(&hasAlpha); - - QVariant xScale = currTile->DataOrDefault(FieldPath::Of(EGMRoom::Tile::kXscaleFieldNumber)); - QVariant yScale = currTile->DataOrDefault(FieldPath::Of(EGMRoom::Tile::kYscaleFieldNumber)); + MessageModel* bkg = MainWindow::resourceMap->GetResourceByName(TreeNode::kBackground, bkgName.toString()); + if (!bkg) continue; + bkg = bkg->GetSubModel(TreeNode::kBackgroundFieldNumber); + if (!bkg) continue; - QString imgFile = bkg->Data(FieldPath::Of(Background::kImageFieldNumber)).toString(); - QPixmap pixmap = ArtManager::GetCachedPixmap(imgFile); - if (pixmap.isNull()) continue; + // useful in setting source rect correctly + bool bkgUseAsTileset = bkg->Data(FieldPath::Of(Background::kUseAsTilesetFieldNumber)).toBool(); + int bkgTileWidth = bkg->Data(FieldPath::Of(Background::kTileWidthFieldNumber)).toInt(); + int bkgTileHeight = bkg->Data(FieldPath::Of(Background::kTileHeightFieldNumber)).toInt(); + int bkgImageWidth = bkg->Data(FieldPath::Of(Background::kWidthFieldNumber)).toInt(); + int bkgImageHeight = bkg->Data(FieldPath::Of(Background::kHeightFieldNumber)).toInt(); + + int x = currTile->Data(FieldPath::Of(EGMRoom::Tile::kXFieldNumber)).toInt(); + int y = currTile->Data(FieldPath::Of(EGMRoom::Tile::kYFieldNumber)).toInt(); + int xOff = currTile->Data(FieldPath::Of(EGMRoom::Tile::kXoffsetFieldNumber)).toInt(); + int yOff = currTile->Data(FieldPath::Of(EGMRoom::Tile::kYoffsetFieldNumber)).toInt(); + int w = currTile->Data(FieldPath::Of(EGMRoom::Tile::kWidthFieldNumber)).toInt(); + int h = currTile->Data(FieldPath::Of(EGMRoom::Tile::kHeightFieldNumber)).toInt(); + double rotation = currTile->Data(FieldPath::Of(EGMRoom::Tile::kRotationFieldNumber)).toDouble(); + bool hasAlpha = false; + double alpha = currTile->Data(FieldPath::Of(EGMRoom::Tile::kAlphaFieldNumber)).toDouble(&hasAlpha); + + QVariant xScale = currTile->DataOrDefault(FieldPath::Of(EGMRoom::Tile::kXscaleFieldNumber)); + QVariant yScale = currTile->DataOrDefault(FieldPath::Of(EGMRoom::Tile::kYscaleFieldNumber)); - // dest rect handles proper scaling of tile in different scenarios, such as image based background is scaled or - // case when a given tile of tileset based background is scaled(possible in tiled using objects) - QRectF dest(x, y, w, h); + QString imgFile = bkg->Data(FieldPath::Of(Background::kImageFieldNumber)).toString(); + QPixmap pixmap = ArtManager::GetCachedPixmap(imgFile); + if (pixmap.isNull()) continue; - // if background contains multiple tiles then set the rect using tilewidth and tileheight - // otherwise set it as image width and height - int bkgUseAsTilesetInt = bkgUseAsTileset; // convert to int to avoid if else branch - QRectF src = QRectF(xOff, yOff, - bkgUseAsTilesetInt*bkgTileWidth + (1-bkgUseAsTilesetInt)*bkgImageWidth, - bkgUseAsTilesetInt*bkgTileHeight + (1-bkgUseAsTilesetInt)*bkgImageHeight); -// QRectF src(xOff, yOff, w, h); - const QTransform transform = painter.transform(); + // dest rect handles proper scaling of tile in different scenarios, such as image based background is scaled or + // case when a given tile of tileset based background is scaled(possible in tiled using objects) + QRectF dest(x, y, w, h); - // Note: Current rotation support is only according to the location of tiles in ortho and hex Tiled maps, - // if hexMap is 1(true) tile is rotated from its origin, if hexMap is 0(false) tile is rotate from top-left corner - // Side node: This translate back-and-forth is to achieve correct transformation in global space - painter.translate(isHexMap * (x+(w/2)) + (1 - isHexMap) * x, - isHexMap * (y+(h/2)) + (1 - isHexMap) * (y+h)); - painter.rotate(rotation); - painter.translate(isHexMap * (-x-(w/2)) + (1 - isHexMap) * -x, - isHexMap * (-y-(h/2)) + (1 - isHexMap) * (-y-h)); + // if background contains multiple tiles then set the rect using tilewidth and tileheight + // otherwise set it as image width and height + int bkgUseAsTilesetInt = bkgUseAsTileset; // convert to int to avoid if else branch + QRectF src = QRectF(xOff, yOff, + bkgUseAsTilesetInt*bkgTileWidth + (1-bkgUseAsTilesetInt)*bkgImageWidth, + bkgUseAsTilesetInt*bkgTileHeight + (1-bkgUseAsTilesetInt)*bkgImageHeight); + // QRectF src(xOff, yOff, w, h); + const QTransform transform = painter.transform(); - // for scale to work properly, origin must to adjusted to center of pixmap, and its resetted after applying scale - // Note: scale also handles horizontal and vertical flip of tiles - painter.translate(x+(w/2),y+(h/2)); - painter.scale(xScale.toFloat(), yScale.toFloat()); - painter.translate(-x-(w/2),-y-(h/2)); + // Note: Current rotation support is only according to the location of tiles in ortho and hex Tiled maps, + // if hexMap is 1(true) tile is rotated from its origin, if hexMap is 0(false) tile is rotate from top-left corner + // Side node: This translate back-and-forth is to achieve correct transformation in global space + painter.translate(isHexMap * (x+(w/2)) + (1 - isHexMap) * x, + isHexMap * (y+(h/2)) + (1 - isHexMap) * (y+h)); + painter.rotate(rotation); + painter.translate(isHexMap * (-x-(w/2)) + (1 - isHexMap) * -x, + isHexMap * (-y-(h/2)) + (1 - isHexMap) * (-y-h)); + + // for scale to work properly, origin must to adjusted to center of pixmap, and its resetted after applying scale + // Note: scale also handles horizontal and vertical flip of tiles + painter.translate(x+(w/2),y+(h/2)); + painter.scale(xScale.toFloat(), yScale.toFloat()); + painter.translate(-x-(w/2),-y-(h/2)); - // set opacity - int hasAlphaInt = hasAlpha; // convert to int to avoid if else branch - double finalAlpha = hasAlphaInt*alpha + (1-hasAlphaInt)*1.0; - painter.setOpacity(finalAlpha); + // set opacity + int hasAlphaInt = hasAlpha; // convert to int to avoid if else branch + double finalAlpha = hasAlphaInt*alpha + (1-hasAlphaInt)*1.0; + painter.setOpacity(finalAlpha); - painter.drawPixmap(dest, pixmap, src); - painter.setTransform(transform); - } + painter.drawPixmap(dest, pixmap, src); + painter.setTransform(transform); } } diff --git a/Widgets/RoomView.h b/Widgets/RoomView.h index ef8bfecfe..036aacfc4 100644 --- a/Widgets/RoomView.h +++ b/Widgets/RoomView.h @@ -33,6 +33,9 @@ class RoomView : public AssetView { void paintTileLayerTiles(QPainter &painter, int isHexMap = 0); void paintBackgrounds(QPainter &painter, bool foregrounds = false); void paintInstances(QPainter &painter); + + private: + void painterTiledTileHelper(QPainter& painter, const ProtoModel *currTile, int isHexMap); }; #endif // ROOMVIEW_H From 3c826d95c9ee111910cf2aff72233a6c65e2c6da Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Sun, 18 Jun 2023 16:42:00 +0530 Subject: [PATCH 12/13] update code after brinching back GMRoom in Treenode TypeCase --- Editors/BaseEditor.h | 2 +- Editors/PathEditor.cpp | 10 +++++----- Editors/RoomEditor.cpp | 2 +- MainWindow.cpp | 6 +++--- Models/ResourceModelMap.cpp | 13 +++++++------ Models/TreeModel.cpp | 4 +++- Submodules/enigma-dev | 2 +- 7 files changed, 21 insertions(+), 18 deletions(-) diff --git a/Editors/BaseEditor.h b/Editors/BaseEditor.h index 0cf6de9db..6833ed697 100644 --- a/Editors/BaseEditor.h +++ b/Editors/BaseEditor.h @@ -12,7 +12,7 @@ static const QHash ResTypeFields = { {TypeCase::kSound, TreeNode::kSoundFieldNumber}, {TypeCase::kBackground, TreeNode::kBackgroundFieldNumber}, {TypeCase::kPath, TreeNode::kPathFieldNumber}, {TypeCase::kFont, TreeNode::kFontFieldNumber}, {TypeCase::kScript, TreeNode::kScriptFieldNumber}, {TypeCase::kTimeline, TreeNode::kTimelineFieldNumber}, - {TypeCase::kObject, TreeNode::kObjectFieldNumber}, {TypeCase::kRoom, TreeNode::kRoomFieldNumber}, + {TypeCase::kObject, TreeNode::kObjectFieldNumber}, {TypeCase::kEgmRoom, TreeNode::kEgmRoomFieldNumber}, {TypeCase::kSettings, TreeNode::kSettingsFieldNumber}, {TypeCase::kShader, TreeNode::kShaderFieldNumber}}; class BaseEditor : public QWidget { diff --git a/Editors/PathEditor.cpp b/Editors/PathEditor.cpp index 2e3efef32..41ecbe431 100644 --- a/Editors/PathEditor.cpp +++ b/Editors/PathEditor.cpp @@ -36,7 +36,7 @@ PathEditor::PathEditor(MessageModel* model, QWidget* parent) : BaseEditor(model, _ui->mainToolBar->addSeparator(); - ResourceSelector* roomButton(new ResourceSelector(this, TreeNode::TypeCase::kRoom)); + ResourceSelector* roomButton(new ResourceSelector(this, TreeNode::TypeCase::kEgmRoom)); roomButton->setPopupMode(QToolButton::MenuButtonPopup); roomButton->setIcon(ArtManager::GetIcon(":/resources/room.png")); _ui->mainToolBar->addWidget(roomButton); @@ -108,8 +108,8 @@ void PathEditor::RebindSubModels() { QString roomName = _pathModel->Data(FieldPath::Of(Path::kBackgroundRoomNameFieldNumber)).toString(); if (roomName != "") { - _ui->roomView->SetResourceModel(MainWindow::resourceMap->GetResourceByName(TypeCase::kRoom, roomName) - ->GetSubModel(TreeNode::kRoomFieldNumber)); + _ui->roomView->SetResourceModel(MainWindow::resourceMap->GetResourceByName(TypeCase::kEgmRoom, roomName) + ->GetSubModel(TreeNode::kEgmRoomFieldNumber)); } _roomLineEdit->setText(roomName); @@ -152,8 +152,8 @@ void PathEditor::SetSnapToGrid(bool snap) { this->_snapToGrid = snap; } void PathEditor::RoomMenuItemSelected(QAction* action) { _roomLineEdit->setText(action->text()); - _ui->roomView->SetResourceModel(MainWindow::resourceMap->GetResourceByName(TypeCase::kRoom, action->text()) - ->GetSubModel(TreeNode::kRoomFieldNumber)); + _ui->roomView->SetResourceModel(MainWindow::resourceMap->GetResourceByName(TypeCase::kEgmRoom, action->text()) + ->GetSubModel(TreeNode::kEgmRoomFieldNumber)); _ui->pathPreviewBackground->SetZoom(1); _pathModel->SetData(FieldPath::Of(Path::kBackgroundRoomNameFieldNumber), action->text()); } diff --git a/Editors/RoomEditor.cpp b/Editors/RoomEditor.cpp index 1d45a59fd..dc81213e6 100644 --- a/Editors/RoomEditor.cpp +++ b/Editors/RoomEditor.cpp @@ -94,7 +94,7 @@ RoomEditor::RoomEditor(MessageModel* model, QWidget* parent) : BaseEditor(model, RoomEditor::~RoomEditor() { delete _ui; } void RoomEditor::RebindSubModels() { - _roomModel = _model->GetSubModel(TreeNode::kRoomFieldNumber); + _roomModel = _model->GetSubModel(TreeNode::kEgmRoomFieldNumber); _ui->roomView->SetResourceModel(_roomModel); RepeatedMessageModel* im = _roomModel->GetSubModel(EGMRoom::kInstancesFieldNumber); diff --git a/MainWindow.cpp b/MainWindow.cpp index 2e317997c..a0d0fad66 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -495,8 +495,8 @@ void MainWindow::on_actionSave_triggered() { } int MainWindow::findRoom(buffers::TreeNode *root, buffers::resources::EGMRoom *&room) { - if(root->type_case() == TypeCase::kRoom) { - room = root->mutable_room(); + if(root->type_case() == TypeCase::kEgmRoom) { + room = root->mutable_egm_room(); return 0; } @@ -716,7 +716,7 @@ void MainWindow::on_actionCreateTimeline_triggered() { CreateResource(TypeCase:: void MainWindow::on_actionCreateObject_triggered() { CreateResource(TypeCase::kObject); } -void MainWindow::on_actionCreateRoom_triggered() { CreateResource(TypeCase::kRoom); } +void MainWindow::on_actionCreateRoom_triggered() { CreateResource(TypeCase::kEgmRoom); } void MainWindow::on_actionCreateSettings_triggered() { CreateResource(TypeCase::kSettings); } diff --git a/Models/ResourceModelMap.cpp b/Models/ResourceModelMap.cpp index 9eb36992e..6f44426f6 100644 --- a/Models/ResourceModelMap.cpp +++ b/Models/ResourceModelMap.cpp @@ -10,7 +10,8 @@ static std::string ResTypeAsString(TypeCase type) { case TypeCase::kFont: return "font"; case TypeCase::kObject: return "object"; case TypeCase::kPath: return "path"; - case TypeCase::kRoom: return "room"; + case TypeCase::kGmRoom: return "deprecated_room"; + case TypeCase::kEgmRoom: return "room"; case TypeCase::kSound: return "sound"; case TypeCase::kSprite: return "sprite"; case TypeCase::kShader: return "shader"; @@ -65,9 +66,9 @@ void ResourceModelMap::ResourceRemoved(TypeCase type, const QString& name, // Delete all instances of this object type if (type == TypeCase::kObject) { - for (auto& room : qAsConst(_resources[TypeCase::kRoom])) { + for (auto& room : qAsConst(_resources[TypeCase::kEgmRoom])) { R_EXPECT_V(room); - MessageModel* roomModel = room->GetSubModel(TreeNode::kRoomFieldNumber); + MessageModel* roomModel = room->GetSubModel(TreeNode::kEgmRoomFieldNumber); R_EXPECT_V(roomModel); RepeatedMessageModel* instancesModel = roomModel->GetSubModel(EGMRoom::kInstancesFieldNumber); auto& remover = removers.emplace(instancesModel, instancesModel).first->second; @@ -100,8 +101,8 @@ void ResourceModelMap::ResourceRemoved(TypeCase type, const QString& name, // Delete all tiles using this background if (type == TypeCase::kBackground) { - for (auto& room : qAsConst(_resources[TypeCase::kRoom])) { - MessageModel* roomModel = room->GetSubModel(TreeNode::kRoomFieldNumber); + for (auto& room : qAsConst(_resources[TypeCase::kEgmRoom])) { + MessageModel* roomModel = room->GetSubModel(TreeNode::kEgmRoomFieldNumber); RepeatedMessageModel* tilesModel = roomModel->GetSubModel(EGMRoom::kTilesFieldNumber); auto& remover = removers.emplace(tilesModel, tilesModel).first->second; @@ -193,7 +194,7 @@ TypeCase Type(TreeModel::Node* node) { {FullName(), TypeCase::kShader}, {FullName(), TypeCase::kTimeline}, {FullName(), TypeCase::kObject}, - {FullName(), TypeCase::kRoom}, + {FullName(), TypeCase::kEgmRoom}, {FullName(), TypeCase::kSettings}, }; diff --git a/Models/TreeModel.cpp b/Models/TreeModel.cpp index 05a95e441..a6528bb29 100644 --- a/Models/TreeModel.cpp +++ b/Models/TreeModel.cpp @@ -651,7 +651,9 @@ TreeModel::Node *TreeModel::Node::NthChild(int n) const { << "Accessing row " << n << " of a " << children.size() << "-row tree node `" << DebugPath() << "`"; return children[n].get(); } -const std::string &TreeModel::Node::GetMessageType() const { return backing_model->GetDescriptor()->full_name(); } +const std::string &TreeModel::Node::GetMessageType() const { + return backing_model->GetDescriptor()->full_name(); +} void TreeModel::DisplayConfig::SetMessagePassthrough(const std::string &message) { tree_display_configs_[message].is_passthrough = true; diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 661784da2..76b2848e3 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 661784da2518c343da1eb44714f8e582cf76f842 +Subproject commit 76b2848e3cb7384508cad91e9126a75af9d43b16 From 19465002389c84f156056a2599bd9c1eb34e875c Mon Sep 17 00:00:00 2001 From: KartikShrivastava Date: Sun, 2 Jul 2023 12:11:54 +0530 Subject: [PATCH 13/13] add param in LoadProject to translate gm room --- MainWindow.cpp | 4 ++-- Submodules/enigma-dev | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MainWindow.cpp b/MainWindow.cpp index a0d0fad66..3d3cf2747 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -282,7 +282,7 @@ void MainWindow::updateWindowMenu() { void MainWindow::openFile(QString fName) { QFileInfo fileInfo(fName); - std::unique_ptr loadedProject = egm::LoadProject(fName.toStdString()); + std::unique_ptr loadedProject = egm::LoadProject(fName.toStdString(), true); if (!loadedProject) { QMessageBox::warning(this, tr("Failed To Open Project"), tr("There was a problem loading the project: ") + fName, @@ -526,7 +526,7 @@ void MainWindow::on_actionMerge_triggered() { tr("Tiled Maps (*.tmx)")); if (!fName.isEmpty()) { - std::unique_ptr loadedProject = egm::LoadProject(fName.toStdString()); + std::unique_ptr loadedProject = egm::LoadProject(fName.toStdString(), true); if (!loadedProject) { QMessageBox::warning(this, tr("Failed To Open Project"), tr("There was a problem loading the project: ") + fName, diff --git a/Submodules/enigma-dev b/Submodules/enigma-dev index 76b2848e3..db73bd5fd 160000 --- a/Submodules/enigma-dev +++ b/Submodules/enigma-dev @@ -1 +1 @@ -Subproject commit 76b2848e3cb7384508cad91e9126a75af9d43b16 +Subproject commit db73bd5fdabb87ad7a6e0d7a90e3604fb5cc4681