Skip to content

Commit

Permalink
Implemented the paint picker tool in TerrainWorldEditor. Also improve…
Browse files Browse the repository at this point in the history
…d the editor's Button signal setup.
  • Loading branch information
Relintai committed Feb 8, 2025
1 parent a096f65 commit b264a83
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 38 deletions.
96 changes: 65 additions & 31 deletions modules/terraman/editor/terrain_world_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ EditorPlugin::AfterGUIInput TerrainWorldEditor::forward_spatial_input_event(Came
}
} break;
case TOOL_MODE_PAINT_PICKER: {
// Ignore
} break;
case TOOL_MODE_SPAWN_BRUSH: {
} break;
Expand Down Expand Up @@ -154,6 +155,7 @@ EditorPlugin::AfterGUIInput TerrainWorldEditor::forward_spatial_input_event(Came
}
} break;
case TOOL_MODE_PAINT_PICKER: {
// Ignore
} break;
case TOOL_MODE_SPAWN_BRUSH: {
} break;
Expand Down Expand Up @@ -217,9 +219,9 @@ EditorPlugin::AfterGUIInput TerrainWorldEditor::forward_spatial_input_event(Came

return EditorPlugin::AFTER_GUI_INPUT_PASS;
}

} break;
case TOOL_MODE_PAINT_PICKER: {
_mouse_down = true;
} break;
case TOOL_MODE_SPAWN_BRUSH: {
} break;
Expand All @@ -241,6 +243,12 @@ EditorPlugin::AfterGUIInput TerrainWorldEditor::forward_spatial_input_event(Came
create_undo_point(_current_action, _paint_brush_channel, _paint_brush_allow_creating_chunks_button);
} break;
case TOOL_MODE_PAINT_PICKER: {
Vector3 position;
Vector3 normal;

if (get_draw_world_coordinate(p_camera, Point2(mb->get_position().x, mb->get_position().y), position, normal)) {
paint_pick(position);
}
} break;
case TOOL_MODE_SPAWN_BRUSH: {
} break;
Expand Down Expand Up @@ -408,6 +416,40 @@ void TerrainWorldEditor::paint_brush_draw(const Vector3 &p_world_position) {
_world->set_voxels_at_world_data_position(draw_data, _paint_brush_channel, true, _paint_brush_allow_create_chunks, true);
}

void TerrainWorldEditor::paint_pick(const Vector3 &p_world_position) {
Vector2i wdp = _world->world_position_to_world_data_position(p_world_position);

uint8_t val = 0;

if (_previous_tool_mode == TOOL_MODE_ISOLEVEL_BRUSH) {
val = _world->get_voxel_at_world_data_position(wdp, _isolevel_brush_channel);

_isolevel_brush_strength_slider->set_value((float)val / 255.0);
_isolevel_brush_type_set_button->set_pressed(true);
_isolevel_brush_button->set_pressed(true);
} else {
val = _world->get_voxel_at_world_data_position(wdp, _paint_brush_channel);

int index = (int)val - 1;

for (int i = 0; i < _surfaces_vbox_container->get_child_count(); ++i) {
Button *b = Object::cast_to<Button>(_surfaces_vbox_container->get_child(i));

if (!b) {
continue;
}

int bindex = b->get_meta("index");

if (bindex == index) {
b->set_pressed(true);
_paint_brush_button->set_pressed(true);
return;
}
}
}
}

void TerrainWorldEditor::edit(TerrainWorld *p_world) {
if (_world == p_world) {
return;
Expand Down Expand Up @@ -491,7 +533,6 @@ void TerrainWorldEditor::edit(TerrainWorld *p_world) {
button->set_button_group(_surfaces_button_group);
button->set_h_size_flags(SIZE_EXPAND_FILL);
button->set_pressed(true);
button->connect("button_up", this, "_on_surface_button_pressed");

_surfaces_vbox_container->add_child(button);

Expand All @@ -513,8 +554,6 @@ void TerrainWorldEditor::edit(TerrainWorld *p_world) {
button->set_button_group(_surfaces_button_group);
button->set_h_size_flags(SIZE_EXPAND_FILL);

button->connect("button_up", this, "_on_surface_button_pressed");

_surfaces_vbox_container->add_child(button);

if (!f) {
Expand Down Expand Up @@ -594,46 +633,42 @@ TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {
main_container->add_child(_tool_button_container);

_tool_button_group.instance();
_tool_button_group->connect("pressed", this, "_on_tool_button_pressed");

// Main buttons
_isolevel_brush_button = memnew(ToolButton);
_isolevel_brush_button->set_toggle_mode(true);
_isolevel_brush_button->set_pressed(true);
_isolevel_brush_button->set_button_group(_tool_button_group);
_isolevel_brush_button->set_meta("tool_mode", TOOL_MODE_ISOLEVEL_BRUSH);
_isolevel_brush_button->connect("button_up", this, "_on_tool_button_pressed");
_isolevel_brush_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/isolevel_brush", "Isolevel Brush", KEY_I));
_tool_button_container->add_child(_isolevel_brush_button);

_paint_brush_button = memnew(ToolButton);
_paint_brush_button->set_toggle_mode(true);
_paint_brush_button->set_button_group(_tool_button_group);
_paint_brush_button->set_meta("tool_mode", TOOL_MODE_PAINT_BRUSH);
_paint_brush_button->connect("button_up", this, "_on_tool_button_pressed");
_paint_brush_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/paint_brush", "Paint Brush", KEY_P));
_tool_button_container->add_child(_paint_brush_button);

_paint_picker_button = memnew(ToolButton);
_paint_picker_button->set_toggle_mode(true);
_paint_picker_button->set_button_group(_tool_button_group);
_paint_picker_button->set_meta("tool_mode", TOOL_MODE_PAINT_PICKER);
_paint_picker_button->connect("button_up", this, "_on_tool_button_pressed");
_paint_picker_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/paint_picker", "Paint Picker", KEY_L));
_tool_button_container->add_child(_paint_picker_button);

_spawn_brush_button = memnew(ToolButton);
_spawn_brush_button->set_toggle_mode(true);
_spawn_brush_button->set_button_group(_tool_button_group);
_spawn_brush_button->set_meta("tool_mode", TOOL_MODE_SPAWN_BRUSH);
_spawn_brush_button->connect("button_up", this, "_on_tool_button_pressed");
_spawn_brush_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/spawn_brush", "Spawn Brush", KEY_M));
_tool_button_container->add_child(_spawn_brush_button);

_chunk_remove_button = memnew(ToolButton);
_chunk_remove_button->set_toggle_mode(true);
_chunk_remove_button->set_button_group(_tool_button_group);
_chunk_remove_button->set_meta("tool_mode", TOOL_MODE_CHUNK_REMOVE);
_chunk_remove_button->connect("button_up", this, "_on_tool_button_pressed");
_chunk_remove_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/chunk_remove", "Chunk Remove", KEY_U));
_tool_button_container->add_child(_chunk_remove_button);

Expand All @@ -644,6 +679,7 @@ TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {
main_container->add_child(_isolevel_brush_tool_container);

_isolevel_brush_tool_button_group.instance();
_isolevel_brush_tool_button_group->connect("pressed", this, "_on_isolevel_brush_tool_button_pressed");

Label *isolevel_brush_label = memnew(Label);
isolevel_brush_label->set_text(TTR("Isolevel Brush"));
Expand All @@ -657,7 +693,6 @@ TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {
_isolevel_brush_type_add_button->set_toggle_mode(true);
_isolevel_brush_type_add_button->set_button_group(_isolevel_brush_tool_button_group);
_isolevel_brush_type_add_button->set_meta("type", ISOLEVEL_BRUSH_TYPE_ADD);
_isolevel_brush_type_add_button->connect("button_up", this, "_on_isolevel_brush_tool_button_pressed");
_isolevel_brush_type_add_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/isolevel_brush_type_add", "Isolevel Brush Type Add", KEY_G));
_isolevel_brush_type_add_button->set_pressed(true);
isolevel_brush_flow_container->add_child(_isolevel_brush_type_add_button);
Expand All @@ -666,35 +701,33 @@ TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {
_isolevel_brush_type_substract_button->set_toggle_mode(true);
_isolevel_brush_type_substract_button->set_button_group(_isolevel_brush_tool_button_group);
_isolevel_brush_type_substract_button->set_meta("type", ISOLEVEL_BRUSH_TYPE_SUBSTRACT);
_isolevel_brush_type_substract_button->connect("button_up", this, "_on_isolevel_brush_tool_button_pressed");
_isolevel_brush_type_substract_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/isolevel_brush_type_substract", "Isolevel Brush Type Substract", KEY_H));
isolevel_brush_flow_container->add_child(_isolevel_brush_type_substract_button);

_isolevel_brush_type_set_button = memnew(ToolButton);
_isolevel_brush_type_set_button->set_toggle_mode(true);
_isolevel_brush_type_set_button->set_button_group(_isolevel_brush_tool_button_group);
_isolevel_brush_type_set_button->set_meta("type", ISOLEVEL_BRUSH_TYPE_SET);
_isolevel_brush_type_set_button->connect("button_up", this, "_on_isolevel_brush_tool_button_pressed");
_isolevel_brush_type_set_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/isolevel_brush_type_set", "Isolevel Brush Type Set", KEY_J));
isolevel_brush_flow_container->add_child(_isolevel_brush_type_set_button);

//_isolevel_brush_type_smooth_button = memnew(ToolButton);
//_isolevel_brush_type_smooth_button->set_toggle_mode(true);
//_isolevel_brush_type_smooth_button->set_button_group(_isolevel_brush_tool_button_group);
//_isolevel_brush_type_smooth_button->set_meta("type", ISOLEVEL_BRUSH_TYPE_SMOOTH);
//_isolevel_brush_type_smooth_button->connect("button_up", this, "_on_isolevel_brush_tool_button_pressed");
//_isolevel_brush_type_smooth_button->connect("pressed", this, "_on_isolevel_brush_tool_button_pressed");
//_isolevel_brush_type_smooth_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/isolevel_brush_type_smooth", "Isolevel Brush Type Smooth", KEY_K));
//isolevel_brush_flow_container->add_child(_isolevel_brush_type_smooth_button);

_isolevel_brush_liquid_mode_button = memnew(ToolButton);
_isolevel_brush_liquid_mode_button->set_toggle_mode(true);
_isolevel_brush_liquid_mode_button->connect("button_up", this, "_on_isolevel_brush_liquid_mode_selected");
_isolevel_brush_liquid_mode_button->connect("toggled", this, "_on_isolevel_brush_liquid_mode_selected");
_isolevel_brush_liquid_mode_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/isolevel_brush_liquid_mode", "Isolevel Brush Liquid Mode", KEY_L));
isolevel_brush_flow_container->add_child(_isolevel_brush_liquid_mode_button);

_isolevel_brush_allow_creating_chunks_button = memnew(ToolButton);
_isolevel_brush_allow_creating_chunks_button->set_toggle_mode(true);
_isolevel_brush_allow_creating_chunks_button->connect("button_up", this, "_on_isolevel_brush_allow_creating_chunks_selected");
_isolevel_brush_allow_creating_chunks_button->connect("toggled", this, "_on_isolevel_brush_allow_creating_chunks_selected");
_isolevel_brush_allow_creating_chunks_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/isolevel_brush_allow_creating_chunks", "Isolevel Brush Allow Chunk Creation", KEY_N));
isolevel_brush_flow_container->add_child(_isolevel_brush_allow_creating_chunks_button);

Expand Down Expand Up @@ -765,13 +798,13 @@ TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {

_paint_brush_liquid_mode_button = memnew(ToolButton);
_paint_brush_liquid_mode_button->set_toggle_mode(true);
_paint_brush_liquid_mode_button->connect("button_up", this, "_on_paint_brush_liquid_mode_selected");
_paint_brush_liquid_mode_button->connect("toggled", this, "_on_paint_brush_liquid_mode_selected");
_paint_brush_liquid_mode_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/paint_brush_liquid_mode", "Paint Brush Liquid Mode", KEY_L));
paint_brush_flow_container->add_child(_paint_brush_liquid_mode_button);

_paint_brush_allow_creating_chunks_button = memnew(ToolButton);
_paint_brush_allow_creating_chunks_button->set_toggle_mode(true);
_paint_brush_allow_creating_chunks_button->connect("button_up", this, "_on_paint_brush_allow_creating_chunks_selected");
_paint_brush_allow_creating_chunks_button->connect("toggled", this, "_on_paint_brush_allow_creating_chunks_selected");
_paint_brush_allow_creating_chunks_button->set_shortcut(ED_SHORTCUT("terrain_world_editor/paint_brush_allow_creating_chunks", "Paint Brush Allow Chunk Creation", KEY_L));
paint_brush_flow_container->add_child(_paint_brush_allow_creating_chunks_button);

Expand Down Expand Up @@ -840,6 +873,7 @@ TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {
_surfaces_vbox_container->set_h_size_flags(SIZE_EXPAND_FILL);

_surfaces_button_group.instance();
_surfaces_button_group->connect("pressed", this, "_on_surface_button_pressed");
}
TerrainWorldEditor::~TerrainWorldEditor() {
_world = NULL;
Expand Down Expand Up @@ -962,16 +996,16 @@ void TerrainWorldEditor::create_undo_point(const String &p_action, const int p_c
_current_data.clear();
}

void TerrainWorldEditor::_on_surface_button_pressed() {
BaseButton *button = _surfaces_button_group->get_pressed_button();
void TerrainWorldEditor::_on_surface_button_pressed(Object *p_button) {
BaseButton *button = Object::cast_to<BaseButton>(p_button);

if (button) {
_selected_type = button->get_meta("index");
}
}

void TerrainWorldEditor::_on_tool_button_pressed() {
BaseButton *button = _tool_button_group->get_pressed_button();
void TerrainWorldEditor::_on_tool_button_pressed(Object *p_button) {
BaseButton *button = Object::cast_to<BaseButton>(p_button);

if (!button) {
return;
Expand Down Expand Up @@ -1042,8 +1076,8 @@ void TerrainWorldEditor::_on_tool_button_pressed() {
}
}

void TerrainWorldEditor::_on_isolevel_brush_tool_button_pressed() {
BaseButton *button = _isolevel_brush_tool_button_group->get_pressed_button();
void TerrainWorldEditor::_on_isolevel_brush_tool_button_pressed(Object *p_button) {
BaseButton *button = Object::cast_to<BaseButton>(p_button);

if (button) {
_isolevel_brush_type = static_cast<IsolevelBrushType>(static_cast<int>(button->get_meta("type")));
Expand All @@ -1068,12 +1102,12 @@ void TerrainWorldEditor::_on_isolevel_brush_channel_select_sb_changed(int value)
_isolevel_brush_channel = value;
}

void TerrainWorldEditor::_on_isolevel_brush_allow_creating_chunks_selected() {
_isolevel_brush_allow_create_chunks = _isolevel_brush_allow_creating_chunks_button->is_pressed();
void TerrainWorldEditor::_on_isolevel_brush_allow_creating_chunks_selected(bool p_on) {
_isolevel_brush_allow_create_chunks = p_on;
}

void TerrainWorldEditor::_on_isolevel_brush_liquid_mode_selected() {
_isolevel_brush_liquid_mode = _isolevel_brush_liquid_mode_button->is_pressed();
void TerrainWorldEditor::_on_isolevel_brush_liquid_mode_selected(bool p_on) {
_isolevel_brush_liquid_mode = p_on;

if (_world) {
if (_isolevel_brush_liquid_mode) {
Expand All @@ -1087,8 +1121,8 @@ void TerrainWorldEditor::_on_isolevel_brush_liquid_mode_selected() {
}
}

void TerrainWorldEditor::_on_paint_brush_liquid_mode_selected() {
_paint_brush_liquid_mode = _paint_brush_liquid_mode_button->is_pressed();
void TerrainWorldEditor::_on_paint_brush_liquid_mode_selected(bool p_on) {
_paint_brush_liquid_mode = p_on;

if (_world) {
if (_paint_brush_liquid_mode) {
Expand All @@ -1102,8 +1136,8 @@ void TerrainWorldEditor::_on_paint_brush_liquid_mode_selected() {
}
}

void TerrainWorldEditor::_on_paint_brush_allow_creating_chunks_selected() {
_paint_brush_allow_create_chunks = _paint_brush_allow_creating_chunks_button->is_pressed();
void TerrainWorldEditor::_on_paint_brush_allow_creating_chunks_selected(bool p_on) {
_paint_brush_allow_create_chunks = p_on;
}
void TerrainWorldEditor::_on_paint_brush_size_slider_changed(float value) {
_paint_brush_size = value;
Expand Down
15 changes: 8 additions & 7 deletions modules/terraman/editor/terrain_world_editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class TerrainWorldEditor : public PanelContainer {
bool get_draw_world_coordinate(Camera *p_camera, const Point2 &p_point, Vector3 &r_position, Vector3 &r_normal);
void isolevel_brush_draw(const Vector3 &p_world_position);
void paint_brush_draw(const Vector3 &p_world_position);
void paint_pick(const Vector3 &p_world_position);

TerrainWorldEditor();
TerrainWorldEditor(EditorNode *p_editor);
Expand All @@ -88,19 +89,19 @@ class TerrainWorldEditor : public PanelContainer {
void _notification(int p_what);
void _node_removed(Node *p_node);

void _on_surface_button_pressed();
void _on_tool_button_pressed();
void _on_surface_button_pressed(Object *p_button);
void _on_tool_button_pressed(Object *p_button);

void _on_isolevel_brush_tool_button_pressed();
void _on_isolevel_brush_tool_button_pressed(Object *p_button);
void _on_isolevel_brush_size_slider_changed(float value);
void _on_isolevel_brush_strength_slider_changed(float value);
void _on_isolevel_brush_smoothness_slider_changed(float value);
void _on_isolevel_brush_channel_select_sb_changed(int value);
void _on_isolevel_brush_allow_creating_chunks_selected();
void _on_isolevel_brush_liquid_mode_selected();
void _on_isolevel_brush_allow_creating_chunks_selected(bool p_on);
void _on_isolevel_brush_liquid_mode_selected(bool p_on);

void _on_paint_brush_liquid_mode_selected();
void _on_paint_brush_allow_creating_chunks_selected();
void _on_paint_brush_liquid_mode_selected(bool p_on);
void _on_paint_brush_allow_creating_chunks_selected(bool p_on);
void _on_paint_brush_size_slider_changed(float value);
void _on_paint_brush_channel_select_sb_changed(int value);

Expand Down

0 comments on commit b264a83

Please sign in to comment.