implement radius based painting for area id

This commit is contained in:
Skarn
2020-10-10 01:18:36 +03:00
parent 19bad58459
commit 4988dc3188
5 changed files with 75 additions and 6 deletions

View File

@@ -1842,7 +1842,7 @@ void MapView::tick (float dt)
if (_mod_shift_down)
{
// draw the selected AreaId on current selected chunk
_world->setAreaID(_cursor_pos, _selected_area_id, false);
_world->setAreaID(_cursor_pos, _selected_area_id, false, ZoneIDBrowser->brushRadius());
}
else if (_mod_ctrl_down)
{
@@ -2348,6 +2348,9 @@ void MapView::draw_map()
case editing_mode::mccv:
radius = shaderTool->brushRadius();
break;
case editing_mode::areaid:
radius = ZoneIDBrowser->brushRadius();
break;
}
//! \note Select terrain below mouse, if no item selected or the item is map.
@@ -2706,6 +2709,10 @@ void MapView::mouseMoveEvent (QMouseEvent* event)
case editing_mode::mccv:
shaderTool->changeRadius(relative_movement.dx() / XSENS);
break;
case editing_mode::areaid:
ZoneIDBrowser->changeRadius(relative_movement.dx() / XSENS);
break;
}
}

View File

@@ -1411,7 +1411,7 @@ void World::CropWaterADT(const tile_index& pos)
for_tile_at(pos, [](MapTile* tile) { tile->CropWater(); });
}
void World::setAreaID(math::vector_3d const& pos, int id, bool adt)
void World::setAreaID(math::vector_3d const& pos, int id, bool adt, float radius)
{
if (adt)
{
@@ -1419,7 +1419,22 @@ void World::setAreaID(math::vector_3d const& pos, int id, bool adt)
}
else
{
for_chunk_at(pos, [&](MapChunk* chunk) { chunk->setAreaID(id);});
if (radius >= 0)
{
for_all_chunks_in_range(pos, radius,
[&] (MapChunk* chunk)
{
chunk->setAreaID(id);
return true;
}
);
}
else
{
for_chunk_at(pos, [&](MapChunk* chunk) { chunk->setAreaID(id);});
}
}
}

View File

@@ -126,7 +126,7 @@ public:
);
unsigned int getAreaID (math::vector_3d const&);
void setAreaID(math::vector_3d const& pos, int id, bool adt);
void setAreaID(math::vector_3d const& pos, int id, bool adt, float radius = -1.0f);
selection_result intersect ( math::matrix_4x4 const& model_view
, math::ray const&

View File

@@ -7,6 +7,7 @@
#include <noggit/Misc.h>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QFormLayout>
#include <iostream>
#include <sstream>
@@ -21,8 +22,21 @@ namespace noggit
, _area_tree(new QTreeWidget())
, mapID(-1)
{
new QVBoxLayout(this);
this->layout()->addWidget(_area_tree);
auto layout = new QFormLayout(this);
_radius_spin = new QDoubleSpinBox (this);
_radius_spin->setRange (0.0f, 250.0f);
_radius_spin->setDecimals (2);
_radius_spin->setValue (_radius);
layout->addRow ("Radius:", _radius_spin);
_radius_slider = new QSlider (Qt::Orientation::Horizontal, this);
_radius_slider->setRange (0, 100);
_radius_slider->setSliderPosition (_radius);
layout->addRow (_radius_slider);
layout->addRow (_area_tree);
connect ( _area_tree, &QTreeWidget::itemSelectionChanged
@@ -35,6 +49,24 @@ namespace noggit
}
}
);
connect ( _radius_spin, qOverload<double> (&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);
}
);
}
void zone_id_browser::setMapID(int id)
@@ -89,6 +121,11 @@ namespace noggit
}
}
void zone_id_browser::changeRadius(float change)
{
_radius_spin->setValue (_radius + change);
}
QTreeWidgetItem* zone_id_browser::create_or_get_tree_widget_item(int area_id)
{
auto it = _items.find(area_id);

View File

@@ -4,6 +4,8 @@
#include <QtWidgets/QWidget>
#include <QtWidgets/QTreeWidget>
#include <QtWidgets/QDoubleSpinBox>
#include <QtWidgets/QSlider>
#include <functional>
#include <string>
@@ -20,14 +22,22 @@ namespace noggit
zone_id_browser(QWidget* parent = nullptr);
void setMapID(int id);
void setZoneID(int id);
void changeRadius(float change);
float brushRadius() const { return _radius; }
signals:
void selected (int area_id);
private:
QTreeWidget* _area_tree;
QSlider* _radius_slider;
QDoubleSpinBox* _radius_spin;
std::map<int, QTreeWidgetItem*> _items;
int mapID;
float _radius = 15.0f;
void buildAreaList();
QTreeWidgetItem* create_or_get_tree_widget_item(int area_id);