Added the option to select the channel in TerrainWorldEditor's Isolevel Brush.

This commit is contained in:
Relintai 2025-02-04 11:28:12 +01:00
parent 6c7d5c9049
commit 45e5c77395
2 changed files with 39 additions and 3 deletions

View File

@ -36,6 +36,7 @@
#include "scene/gui/box_container.h" #include "scene/gui/box_container.h"
#include "scene/gui/flow_container.h" #include "scene/gui/flow_container.h"
#include "scene/gui/option_button.h"
#include "scene/main/control.h" #include "scene/main/control.h"
#include "terrain_world.h" #include "terrain_world.h"
@ -53,10 +54,13 @@
#include "core/input/input.h" #include "core/input/input.h"
#include "editor/plugins/spatial_editor_plugin.h" #include "editor/plugins/spatial_editor_plugin.h"
#include "scene/3d/camera.h" #include "scene/3d/camera.h"
#include "scene/gui/box_container.h"
#include "scene/gui/flow_container.h"
#include "scene/gui/label.h" #include "scene/gui/label.h"
#include "scene/gui/scroll_container.h" #include "scene/gui/scroll_container.h"
#include "scene/gui/separator.h" #include "scene/gui/separator.h"
#include "scene/gui/slider.h" #include "scene/gui/slider.h"
#include "scene/gui/spin_box.h"
EditorPlugin::AfterGUIInput TerrainWorldEditor::forward_spatial_input_event(Camera *p_camera, const Ref<InputEvent> &p_event) { EditorPlugin::AfterGUIInput TerrainWorldEditor::forward_spatial_input_event(Camera *p_camera, const Ref<InputEvent> &p_event) {
if (!_world || !_world->get_editable()) { if (!_world || !_world->get_editable()) {
@ -131,10 +135,15 @@ EditorPlugin::AfterGUIInput TerrainWorldEditor::do_input_action(Camera *p_camera
} }
void TerrainWorldEditor::edit(TerrainWorld *p_world) { void TerrainWorldEditor::edit(TerrainWorld *p_world) {
if (_world == p_world) {
return;
}
_world = p_world; _world = p_world;
if (!_world) if (!_world) {
return; return;
}
_channel_type = _world->get_channel_index_info(TerrainWorld::CHANNEL_TYPE_INFO_TYPE); _channel_type = _world->get_channel_index_info(TerrainWorld::CHANNEL_TYPE_INFO_TYPE);
_channel_isolevel = _world->get_channel_index_info(TerrainWorld::CHANNEL_TYPE_INFO_ISOLEVEL); _channel_isolevel = _world->get_channel_index_info(TerrainWorld::CHANNEL_TYPE_INFO_ISOLEVEL);
@ -147,6 +156,9 @@ void TerrainWorldEditor::edit(TerrainWorld *p_world) {
_add_remove_isolevel_slider->show(); _add_remove_isolevel_slider->show();
} }
_isolevel_brush_channel_select_sb->set_value(_channel_isolevel);
_isolevel_brush_channel = _channel_isolevel;
spatial_editor = Object::cast_to<SpatialEditorPlugin>(_editor->get_editor_plugin_screen()); spatial_editor = Object::cast_to<SpatialEditorPlugin>(_editor->get_editor_plugin_screen());
for (int i = 0; i < _surfaces_vbox_container->get_child_count(); ++i) { for (int i = 0; i < _surfaces_vbox_container->get_child_count(); ++i) {
@ -206,6 +218,8 @@ TerrainWorldEditor::TerrainWorldEditor() {
_tool_mode = TOOL_MODE_ADD; _tool_mode = TOOL_MODE_ADD;
_isolevel_picker_mode = false; _isolevel_picker_mode = false;
_isolevel_brush_channel = -1;
_brush_allow_create_chunks = true; _brush_allow_create_chunks = true;
_isolevel_brush_size = 10; _isolevel_brush_size = 10;
_isolevel_brush_smoothness = 10; _isolevel_brush_smoothness = 10;
@ -220,6 +234,8 @@ TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {
_channel_isolevel = -1; _channel_isolevel = -1;
_isolevel_picker_mode = false; _isolevel_picker_mode = false;
_isolevel_brush_channel = -1;
_brush_allow_create_chunks = true; _brush_allow_create_chunks = true;
_isolevel_brush_size = 10; _isolevel_brush_size = 10;
_isolevel_brush_smoothness = 10; _isolevel_brush_smoothness = 10;
@ -388,6 +404,17 @@ TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {
_isolevel_brush_smoothness_slider->connect("value_changed", this, "_on_isolevel_brush_smoothness_slider_changed"); _isolevel_brush_smoothness_slider->connect("value_changed", this, "_on_isolevel_brush_smoothness_slider_changed");
_isolevel_brush_tool_container->add_child(_isolevel_brush_smoothness_slider); _isolevel_brush_tool_container->add_child(_isolevel_brush_smoothness_slider);
// Isolevel Brush Channel Select Dropdown
Label *isolevel_brush_channel_label = memnew(Label);
isolevel_brush_channel_label->set_text(TTR("Channel"));
_isolevel_brush_tool_container->add_child(isolevel_brush_channel_label);
_isolevel_brush_channel_select_sb = memnew(SpinBox);
_isolevel_brush_channel_select_sb->set_v_size_flags(SIZE_EXPAND_FILL);
_isolevel_brush_channel_select_sb->set_tooltip(TTR("Isolevel Channel"));
_isolevel_brush_channel_select_sb->connect("value_changed", this, "_on_isolevel_brush_channel_select_sb_changed");
_isolevel_brush_tool_container->add_child(_isolevel_brush_channel_select_sb);
// Surface Selector Separator // Surface Selector Separator
main_container->add_child(memnew(HSeparator)); main_container->add_child(memnew(HSeparator));
@ -524,6 +551,10 @@ void TerrainWorldEditor::_on_isolevel_brush_smoothness_slider_changed(float valu
_isolevel_brush_smoothness = value; _isolevel_brush_smoothness = value;
} }
void TerrainWorldEditor::_on_isolevel_brush_channel_select_sb_changed(int value) {
_isolevel_brush_channel = value;
}
void TerrainWorldEditor::_bind_methods() { void TerrainWorldEditor::_bind_methods() {
ClassDB::bind_method("_node_removed", &TerrainWorldEditor::_node_removed); ClassDB::bind_method("_node_removed", &TerrainWorldEditor::_node_removed);
ClassDB::bind_method("_on_surface_button_pressed", &TerrainWorldEditor::_on_surface_button_pressed); ClassDB::bind_method("_on_surface_button_pressed", &TerrainWorldEditor::_on_surface_button_pressed);
@ -533,6 +564,7 @@ void TerrainWorldEditor::_bind_methods() {
ClassDB::bind_method("_on_isolevel_brush_tool_button_pressed", &TerrainWorldEditor::_on_isolevel_brush_tool_button_pressed); ClassDB::bind_method("_on_isolevel_brush_tool_button_pressed", &TerrainWorldEditor::_on_isolevel_brush_tool_button_pressed);
ClassDB::bind_method("_on_isolevel_brush_size_slider_changed", &TerrainWorldEditor::_on_isolevel_brush_size_slider_changed); ClassDB::bind_method("_on_isolevel_brush_size_slider_changed", &TerrainWorldEditor::_on_isolevel_brush_size_slider_changed);
ClassDB::bind_method("_on_isolevel_brush_smoothness_slider_changed", &TerrainWorldEditor::_on_isolevel_brush_smoothness_slider_changed); ClassDB::bind_method("_on_isolevel_brush_smoothness_slider_changed", &TerrainWorldEditor::_on_isolevel_brush_smoothness_slider_changed);
ClassDB::bind_method("_on_isolevel_brush_channel_select_sb_changed", &TerrainWorldEditor::_on_isolevel_brush_channel_select_sb_changed);
} }
void TerrainWorldEditorPlugin::_notification(int p_what) { void TerrainWorldEditorPlugin::_notification(int p_what) {

View File

@ -35,13 +35,14 @@
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "editor/editor_plugin.h" #include "editor/editor_plugin.h"
#include "scene/gui/box_container.h"
#include "scene/gui/flow_container.h"
#include "scene/gui/panel_container.h" #include "scene/gui/panel_container.h"
class TerrainWorld; class TerrainWorld;
class SpatialEditorPlugin; class SpatialEditorPlugin;
class HSlider; class HSlider;
class BoxContainer;
class HFlowContainer;
class SpinBox;
class TerrainWorldEditor : public PanelContainer { class TerrainWorldEditor : public PanelContainer {
GDCLASS(TerrainWorldEditor, PanelContainer); GDCLASS(TerrainWorldEditor, PanelContainer);
@ -79,6 +80,7 @@ protected:
void _on_isolevel_brush_tool_button_pressed(); void _on_isolevel_brush_tool_button_pressed();
void _on_isolevel_brush_size_slider_changed(float value); void _on_isolevel_brush_size_slider_changed(float value);
void _on_isolevel_brush_smoothness_slider_changed(float value); void _on_isolevel_brush_smoothness_slider_changed(float value);
void _on_isolevel_brush_channel_select_sb_changed(int value);
private: private:
//enum BrushType { //enum BrushType {
@ -97,6 +99,7 @@ private:
bool _isolevel_picker_mode; bool _isolevel_picker_mode;
int _isolevel_brush_channel;
float _isolevel_brush_size; float _isolevel_brush_size;
float _isolevel_brush_smoothness; float _isolevel_brush_smoothness;
//BrushType _brush_type; //BrushType _brush_type;
@ -139,6 +142,7 @@ private:
ToolButton *_isolevel_brush_type_smooth_button; ToolButton *_isolevel_brush_type_smooth_button;
HSlider *_isolevel_brush_size_slider; HSlider *_isolevel_brush_size_slider;
HSlider *_isolevel_brush_smoothness_slider; HSlider *_isolevel_brush_smoothness_slider;
SpinBox *_isolevel_brush_channel_select_sb;
VBoxContainer *_paint_brush_tool_container; VBoxContainer *_paint_brush_tool_container;