diff --git a/src/noggit/MapView.cpp b/src/noggit/MapView.cpp index 06e3bcd9..f1b287be 100644 --- a/src/noggit/MapView.cpp +++ b/src/noggit/MapView.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include "revision.h" @@ -62,8 +63,6 @@ #include #include #include -#include -#include static const float XSENS = 15.0f; @@ -128,6 +127,9 @@ void MapView::setToolPropertyWidgetVisibility(editing_mode mode) case editing_mode::holes: _hole_tool_dock->setVisible(!ui_hidden); break; + case editing_mode::minimap: + _minimap_tool_dock->setVisible(!ui_hidden); + break; } @@ -194,7 +196,6 @@ QWidgetAction* MapView::createTextSeparator(const QString& text) void MapView::createGUI() { // create tool widgets - _terrain_tool_dock = new QDockWidget("Raise / Lower", this); terrainTool = new noggit::ui::terrain_tool(_terrain_tool_dock); _terrain_tool_dock->setWidget(terrainTool); @@ -267,6 +268,11 @@ void MapView::createGUI() _vertex_shading_dock->setWidget(shaderTool); _tool_properties_docks.insert(_vertex_shading_dock); + _minimap_tool_dock = new QDockWidget("Minimap Creator", this); + minimapTool = new noggit::ui::MinimapCreator(this); + _minimap_tool_dock->setWidget(minimapTool); + _tool_properties_docks.insert(_minimap_tool_dock); + _object_editor_dock = new QDockWidget("Object", this); objectEditor = new noggit::ui::object_editor(this , _world.get() @@ -1528,41 +1534,88 @@ void MapView::initializeGL() } } + +void MapView::saveMinimap(noggit::MinimapRenderSettings* settings) +{ + + switch (settings->export_mode) + { + case noggit::MinimapGenMode::CURRENT_ADT: + { + tile_index tile = tile_index(_camera.position); + + if (_world->mapIndex.hasTile(tile)) + { + mmap_render_success = _world->saveMinimap(512, 512, tile); + } + else + { + Saving = false; + } + + if (mmap_render_success) + { + Saving = false; + } + + break; + } + case noggit::MinimapGenMode::MAP: + { + // increment tile indices here + if (mmap_render_success) + { + mmap_render_index++; + } + + tile_index tile = tile_index(mmap_render_index / 64, mmap_render_index % 64); + + if (_world->mapIndex.hasTile(tile)) + { + mmap_render_success = _world->saveMinimap(512, 512, tile); + } + else + { + do + { + mmap_render_index++; + tile.x = mmap_render_index / 64; + tile.z = mmap_render_index % 64; + + } while (!_world->mapIndex.hasTile(tile) && mmap_render_index != 4095 ); + + if (mmap_render_success) + { + mmap_render_index--; + } + + } + + if (mmap_render_success && mmap_render_index >= 4095) + { + Saving = false; + mmap_render_index = 0; + mmap_render_success = false; + } + + break; + } + case noggit::MinimapGenMode::SELECTED_ADTS: + { + break; + } + } + + +} + void MapView::paintGL() { opengl::context::scoped_setter const _ (::gl, context()); if (Saving) { - // increment tile indices here - if (mmap_render_success) - { - mmap_render_index++; - } - - tile_index tile = tile_index(mmap_render_index / 64, mmap_render_index % 64); - - if (_world->mapIndex.hasTile(tile)) - { - mmap_render_success = _world->saveMinimap(512, 512, tile); - } - else - { - do - { - mmap_render_index++; - tile.x = mmap_render_index / 64; - tile.z = mmap_render_index % 64; - - } while (!_world->mapIndex.hasTile(tile) && mmap_render_index != 4095); - } - - if (mmap_render_success && mmap_render_index == 4095) - { - Saving = false; - mmap_render_index = 0; - mmap_render_success = false; - } + saveMinimap(minimapTool->getMinimapRenderSettings()); } const qreal now(_startup_time.elapsed() / 1000.0); diff --git a/src/noggit/MapView.h b/src/noggit/MapView.h index fbcc3127..25908ae5 100644 --- a/src/noggit/MapView.h +++ b/src/noggit/MapView.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -198,6 +199,8 @@ public: void tick (float dt); void selectModel(std::string const& model); void change_selected_wmo_doodadset(int set); + void saveMinimap(noggit::MinimapRenderSettings* settings); + void initMinimapSave() { Saving = true; }; void set_editing_mode (editing_mode); @@ -312,4 +315,6 @@ private: QDockWidget* _texturing_dock; noggit::ui::hole_tool* holeTool; QDockWidget* _hole_tool_dock; + noggit::ui::MinimapCreator* minimapTool; + QDockWidget* _minimap_tool_dock; }; diff --git a/src/noggit/tool_enums.hpp b/src/noggit/tool_enums.hpp index b76a1b25..0ca58805 100644 --- a/src/noggit/tool_enums.hpp +++ b/src/noggit/tool_enums.hpp @@ -70,6 +70,7 @@ enum class editing_mode water, mccv, object, + minimap }; enum water_opacity diff --git a/src/noggit/ui/MinimapCreator.cpp b/src/noggit/ui/MinimapCreator.cpp new file mode 100644 index 00000000..e2198645 --- /dev/null +++ b/src/noggit/ui/MinimapCreator.cpp @@ -0,0 +1,162 @@ +// This file is part of Noggit3, licensed under GNU General Public License (version 3). + +#include "MinimapCreator.hpp" + +#include + +#include + +#include +#include +#include +#include +#include +#include + + +namespace noggit +{ + namespace ui + { + MinimapCreator::MinimapCreator ( + MapView* mapView, + QWidget* parent ) : QWidget(parent) + { + auto layout = new QHBoxLayout(this); + + auto layout_left = new QFormLayout (this); + + layout->addItem(layout_left); + + auto settings_tabs = new QTabWidget (this); + layout->addWidget(settings_tabs); + + // Generate + auto generate_widget = new QWidget(this); + auto generate_layout = new QFormLayout(generate_widget); + settings_tabs->addTab(generate_widget, "Generate"); + + _radius_spin = new QDoubleSpinBox (generate_widget); + _radius_spin->setRange (0.0f, 100.0f); + _radius_spin->setDecimals (2); + _radius_spin->setValue (_radius); + + generate_layout->addRow ("Radius:", _radius_spin); + + _radius_slider = new QSlider (Qt::Orientation::Horizontal, generate_widget); + _radius_slider->setRange (0, 100); + _radius_slider->setSliderPosition (_radius); + + generate_layout->addRow (_radius_slider); + + auto cur_adt_btn = new QPushButton("Current ADT", generate_widget); + auto sel_adts_btn = new QPushButton("Selected ADTs", generate_widget); + auto all_adts_btn = new QPushButton("Map", generate_widget); + + generate_layout->addRow (cur_adt_btn); + generate_layout->addRow (sel_adts_btn); + generate_layout->addRow (all_adts_btn); + + // Render settings box + auto render_settings_box = new QGroupBox("Render options", generate_widget); + generate_layout->addRow (render_settings_box); + + auto render_settings_box_layout = new QFormLayout (render_settings_box); + + auto draw_models = new QCheckBox("Draw models", render_settings_box); + draw_models->setChecked(_render_settings.draw_m2); + render_settings_box_layout->addRow (draw_models); + + auto draw_wmos = new QCheckBox("Draw WMOs", render_settings_box); + draw_wmos->setChecked(_render_settings.draw_wmo); + render_settings_box_layout->addRow (draw_wmos); + + auto draw_water = new QCheckBox("Draw water", render_settings_box); + draw_water->setChecked(_render_settings.draw_water); + render_settings_box_layout->addRow (draw_water); + + 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); + + // Connections + + connect ( _radius_spin, qOverload (&QDoubleSpinBox::valueChanged) + , [&] (double v) + { + _radius = v; + QSignalBlocker const blocker(_radius_slider); + _radius_slider->setSliderPosition ((int)std::round (v)); + } + ); + + connect ( _radius_slider, &QSlider::valueChanged + , [&] (int v) + { + _radius = v; + QSignalBlocker const blocker(_radius_spin); + _radius_spin->setValue(v); + } + ); + + // Render settings + + connect (draw_models, &QCheckBox::stateChanged, [this] (int s) + { + _render_settings.draw_m2 = s; + }); + + connect (draw_wmos, &QCheckBox::stateChanged, [this] (int s) + { + _render_settings.draw_wmo = s; + }); + + connect (draw_water, &QCheckBox::stateChanged, [this] (int s) + { + _render_settings.draw_water = s; + }); + + connect (draw_adt, &QCheckBox::stateChanged, [this] (int s) + { + _render_settings.draw_adt_grid = s; + }); + + connect (draw_elevation, &QCheckBox::stateChanged, [this] (int s) + { + _render_settings.draw_elevation = s; + }); + + // Buttons + connect(cur_adt_btn, &QPushButton::clicked, [=]() { + _render_settings.export_mode = MinimapGenMode::CURRENT_ADT; + mapView->initMinimapSave(); + }); + + connect(sel_adts_btn, &QPushButton::clicked, [=]() { + _render_settings.export_mode = MinimapGenMode::SELECTED_ADTS; + mapView->initMinimapSave(); + }); + + connect(all_adts_btn, &QPushButton::clicked, [=]() { + _render_settings.export_mode = MinimapGenMode::MAP; + mapView->initMinimapSave(); + }); + + setMinimumWidth(sizeHint().width()); + } + + void MinimapCreator::changeRadius(float change) + { + _radius_spin->setValue (_radius + change); + } + + QSize MinimapCreator::sizeHint() const + { + return QSize(215, height()); + } + } +} diff --git a/src/noggit/ui/MinimapCreator.hpp b/src/noggit/ui/MinimapCreator.hpp new file mode 100644 index 00000000..3d77867f --- /dev/null +++ b/src/noggit/ui/MinimapCreator.hpp @@ -0,0 +1,69 @@ +// This file is part of Noggit3, licensed under GNU General Public License (version 3). + +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +class MapView; + +namespace noggit +{ + + enum MinimapGenMode + { + CURRENT_ADT, + SELECTED_ADTS, + MAP + }; + + struct MinimapRenderSettings + { + MinimapGenMode export_mode; // Export mode + + // Render settings + bool draw_m2 = false; + bool draw_wmo = true; + bool draw_water = true; + bool draw_adt_grid = false; + bool draw_elevation = false; + + // Filtering + std::unordered_map m2_model_filter_include; // filename, size category + std::vector m2_instance_filter_include; // include specific M2 instances + std::vector wmo_model_filter_exclude; // exclude WMOs by filename + std::vector wmo_instance_filter_exclude; // exclude specific WMO instances + }; + + namespace ui + { + class MinimapCreator : public QWidget + { + public: + MinimapCreator (MapView* mapView, QWidget* parent = nullptr); + + void changeRadius(float change); + + float brushRadius() const { return _radius; } + + MinimapRenderSettings* getMinimapRenderSettings() { return &_render_settings; }; + + QSize sizeHint() const override; + + private: + float _radius = 0.01f; + MinimapRenderSettings _render_settings; + QSlider* _radius_slider; + QDoubleSpinBox* _radius_spin; + + }; + } +} diff --git a/src/noggit/ui/Toolbar.cpp b/src/noggit/ui/Toolbar.cpp index 2f1651ff..0651ee8d 100644 --- a/src/noggit/ui/Toolbar.cpp +++ b/src/noggit/ui/Toolbar.cpp @@ -12,13 +12,14 @@ namespace noggit { add_tool_icon (editing_mode::ground, tr("Raise / Lower"), font_awesome::chartarea); add_tool_icon (editing_mode::flatten_blur, tr("Flatten / Blur"), font_awesome::bacon); - add_tool_icon (editing_mode::paint, tr("3D Paint"), font_awesome::paintbrush); + add_tool_icon (editing_mode::paint, tr("Texturing editor"),font_awesome::paintbrush); add_tool_icon (editing_mode::holes, tr("Holes"), font_awesome::cut); - add_tool_icon (editing_mode::areaid, tr("AreaID Paint"), font_awesome::objectgroup); - add_tool_icon (editing_mode::flags, tr("Impassible Flag"), font_awesome::ban); - add_tool_icon (editing_mode::water, tr("Water edit"), font_awesome::water); + add_tool_icon (editing_mode::areaid, tr("Area ID"), font_awesome::objectgroup); + add_tool_icon (editing_mode::flags, tr("Impassible flag"), font_awesome::ban); + add_tool_icon (editing_mode::water, tr("Water editor"), font_awesome::water); add_tool_icon (editing_mode::mccv, tr("Shader editor"), font_awesome::eyedropper); add_tool_icon (editing_mode::object, tr("Object editor"), font_awesome::cube); + add_tool_icon (editing_mode::minimap, tr("Minimap сreator"), font_awesome::cube); } void toolbar::add_tool_icon(editing_mode mode, const QString& name, const font_awesome::icons& icon)