From 6c268ef75076e77528125d64a4e7d064845a8b2b Mon Sep 17 00:00:00 2001 From: Skarn Date: Fri, 30 Oct 2020 23:29:17 +0300 Subject: [PATCH] minimap creator: add option to render combined minimap --- src/noggit/World.cpp | 41 ++++++++++++++++-- src/noggit/ui/MinimapCreator.cpp | 71 ++++++++++++++++++++++++-------- src/noggit/ui/MinimapCreator.hpp | 3 ++ 3 files changed, 95 insertions(+), 20 deletions(-) diff --git a/src/noggit/World.cpp b/src/noggit/World.cpp index 94fbab99..7cd326a3 100644 --- a/src/noggit/World.cpp +++ b/src/noggit/World.cpp @@ -2181,8 +2181,8 @@ bool World::saveMinimap(tile_index const& tile_idx, MinimapRenderSettings* setti QImage image = pixel_buffer.toImage(); - QSettings settings; - QString str = settings.value ("project/path").toString(); + QSettings app_settings; + QString str = app_settings.value ("project/path").toString(); if (!(str.endsWith('\\') || str.endsWith('/'))) { str += "/"; @@ -2205,14 +2205,49 @@ bool World::saveMinimap(tile_index const& tile_idx, MinimapRenderSettings* setti void* blp_image = blp.createBlpDxtInMemory(true, FORMAT_DXT5, file_size); std::string tex_name = std::string(basename + "_" + std::to_string(tile_idx.x) + "_" + std::to_string(tile_idx.z) + ".blp"); + QFile file(dir.filePath(tex_name.c_str())); file.open(QIODevice::WriteOnly); - QDataStream out(&file); + QDataStream out(&file); out.writeRawData(reinterpret_cast(blp_image), file_size); file.close(); + // Write combined file + if (settings->combined_minimap) + { + QString image_path = QString(std::string(basename + "_combined_minimap.png").c_str()); + QImage combined_image; + + if (dir.exists(image_path)) + { + combined_image = QImage(dir.filePath(image_path)); + + if (combined_image.width() != 8192 | combined_image.height() != 8192) + { + combined_image = QImage(8192, 8192, QImage::Format_ARGB32); + } + } + else + { + combined_image = QImage(8192, 8192, QImage::Format_ARGB32); + } + + QImage scaled_image = image.scaled(128, 128, Qt::KeepAspectRatio); + + for (int i = 0; i < 128; ++i) + { + for (int j = 0; j < 128; ++j) + { + combined_image.setPixelColor(tile_idx.x * 128 + j, tile_idx.z * 128 + i, scaled_image.pixelColor(j, i)); + } + } + + combined_image.save(dir.filePath(image_path)); + + } + // Register in md5translate.trs std::string map_name = gMapDB.getMapName(mapIndex._map_id); std::string tilename_left = (boost::format("%s\\map_%d_%02d.blp") % map_name % tile_idx.x % tile_idx.z).str(); diff --git a/src/noggit/ui/MinimapCreator.cpp b/src/noggit/ui/MinimapCreator.cpp index 9db122bf..244c3c43 100644 --- a/src/noggit/ui/MinimapCreator.cpp +++ b/src/noggit/ui/MinimapCreator.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -110,33 +111,52 @@ namespace noggit render_settings_box_layout->addRow (resolution); - auto draw_models = new QCheckBox("Draw models", render_settings_box); + auto file_format = new QComboBox(this); + file_format->addItem(".blp"); + file_format->addItem(".png"); + file_format->setCurrentText(".blp"); + + render_settings_box_layout->addRow (file_format); + + auto draw_elements_box_layout = new QGridLayout(); + render_settings_box_layout->addItem(draw_elements_box_layout); + + auto draw_models = new QCheckBox("Models", render_settings_box); draw_models->setChecked(_render_settings.draw_m2); - render_settings_box_layout->addRow (draw_models); + draw_elements_box_layout->addWidget(draw_models, 0, 0); - auto draw_wmos = new QCheckBox("Draw WMOs", render_settings_box); + auto draw_wmos = new QCheckBox("WMOs", render_settings_box); draw_wmos->setChecked(_render_settings.draw_wmo); - render_settings_box_layout->addRow (draw_wmos); + draw_elements_box_layout->addWidget(draw_wmos, 1, 0); - auto draw_water = new QCheckBox("Draw water", render_settings_box); + auto draw_water = new QCheckBox("Water", render_settings_box); draw_water->setChecked(_render_settings.draw_water); - render_settings_box_layout->addRow (draw_water); + draw_elements_box_layout->addWidget(draw_water, 2, 0); - auto draw_adt = new QCheckBox("Draw ADT grid", render_settings_box); - draw_adt->setChecked(_render_settings.draw_adt_grid); - render_settings_box_layout->addRow (draw_adt); - - auto draw_elevation = new QCheckBox("Draw elevation lines", render_settings_box); - draw_elevation->setChecked(_render_settings.draw_elevation); - render_settings_box_layout->addRow (draw_elevation); - - auto use_filters = new QCheckBox("Use filters", render_settings_box); + auto use_filters = new QCheckBox("Filter", render_settings_box); use_filters->setChecked(_render_settings.use_filters); - render_settings_box_layout->addRow (use_filters); + draw_elements_box_layout->addWidget(use_filters, 3, 0); + + auto draw_adt = new QCheckBox("ADT grid", render_settings_box); + draw_adt->setChecked(_render_settings.draw_adt_grid); + draw_elements_box_layout->addWidget(draw_adt, 0, 1); + + auto draw_elevation = new QCheckBox("Elevation", render_settings_box); + draw_elevation->setChecked(_render_settings.draw_elevation); + draw_elements_box_layout->addWidget(draw_elevation, 1, 1); + + auto draw_shadows = new QCheckBox("Shadows", render_settings_box); + draw_elevation->setChecked(_render_settings.draw_shadows); + draw_elements_box_layout->addWidget(draw_shadows, 2, 1); + + auto combined_minimap = new QCheckBox("Combine", render_settings_box); + combined_minimap->setChecked(_render_settings.combined_minimap); + draw_elements_box_layout->addWidget(combined_minimap, 3, 1); + _progress_bar = new QProgressBar(this); _progress_bar->setRange(0, 4096); - generate_layout->addRow (_progress_bar); + generate_layout->addRow(_progress_bar); // Filter auto filter_widget = new QWidget(this); @@ -741,6 +761,13 @@ namespace noggit } ); + connect ( file_format, &QComboBox::currentTextChanged + , [&] (QString s) + { + _render_settings.file_format = s.toStdString(); + } + ); + connect (draw_models, &QCheckBox::stateChanged, [this] (int s) { _render_settings.draw_m2 = s; @@ -771,6 +798,16 @@ namespace noggit _render_settings.use_filters = s; }); + connect (draw_shadows, &QCheckBox::stateChanged, [this] (int s) + { + _render_settings.draw_shadows = s; + }); + + connect (combined_minimap, &QCheckBox::stateChanged, [this] (int s) + { + _render_settings.combined_minimap = s; + }); + // Buttons connect(cur_adt_btn, &QPushButton::clicked, [=]() { _render_settings.export_mode = MinimapGenMode::CURRENT_ADT; diff --git a/src/noggit/ui/MinimapCreator.hpp b/src/noggit/ui/MinimapCreator.hpp index 4d42634d..5804f266 100644 --- a/src/noggit/ui/MinimapCreator.hpp +++ b/src/noggit/ui/MinimapCreator.hpp @@ -36,6 +36,7 @@ enum MinimapGenMode struct MinimapRenderSettings { MinimapGenMode export_mode; + std::string file_format = ".blp"; // Render settings int resolution = 512; @@ -44,7 +45,9 @@ struct MinimapRenderSettings bool draw_water = true; bool draw_adt_grid = false; bool draw_elevation = false; + bool draw_shadows = false; bool use_filters = false; + bool combined_minimap = false; // Selection std::array selected_tiles = {false};