diff options
Diffstat (limited to 'editor/plugins/navigation_polygon_editor_plugin.cpp')
-rw-r--r-- | editor/plugins/navigation_polygon_editor_plugin.cpp | 88 |
1 files changed, 80 insertions, 8 deletions
diff --git a/editor/plugins/navigation_polygon_editor_plugin.cpp b/editor/plugins/navigation_polygon_editor_plugin.cpp index 957a520d8a..48335f3b94 100644 --- a/editor/plugins/navigation_polygon_editor_plugin.cpp +++ b/editor/plugins/navigation_polygon_editor_plugin.cpp @@ -32,6 +32,8 @@ #include "editor/editor_node.h" #include "editor/editor_undo_redo_manager.h" +#include "scene/2d/navigation_region_2d.h" +#include "scene/gui/dialogs.h" Ref<NavigationPolygon> NavigationPolygonEditor::_ensure_navpoly() const { Ref<NavigationPolygon> navpoly = node->get_navigation_polygon(); @@ -71,7 +73,6 @@ Variant NavigationPolygonEditor::_get_polygon(int p_idx) const { void NavigationPolygonEditor::_set_polygon(int p_idx, const Variant &p_polygon) const { Ref<NavigationPolygon> navpoly = _ensure_navpoly(); navpoly->set_outline(p_idx, p_polygon); - navpoly->make_polygons_from_outlines(); } void NavigationPolygonEditor::_action_add_polygon(const Variant &p_polygon) { @@ -79,8 +80,6 @@ void NavigationPolygonEditor::_action_add_polygon(const Variant &p_polygon) { EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); undo_redo->add_do_method(navpoly.ptr(), "add_outline", p_polygon); undo_redo->add_undo_method(navpoly.ptr(), "remove_outline", navpoly->get_outline_count()); - undo_redo->add_do_method(navpoly.ptr(), "make_polygons_from_outlines"); - undo_redo->add_undo_method(navpoly.ptr(), "make_polygons_from_outlines"); } void NavigationPolygonEditor::_action_remove_polygon(int p_idx) { @@ -88,8 +87,6 @@ void NavigationPolygonEditor::_action_remove_polygon(int p_idx) { EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); undo_redo->add_do_method(navpoly.ptr(), "remove_outline", p_idx); undo_redo->add_undo_method(navpoly.ptr(), "add_outline_at_index", navpoly->get_outline(p_idx), p_idx); - undo_redo->add_do_method(navpoly.ptr(), "make_polygons_from_outlines"); - undo_redo->add_undo_method(navpoly.ptr(), "make_polygons_from_outlines"); } void NavigationPolygonEditor::_action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) { @@ -97,8 +94,6 @@ void NavigationPolygonEditor::_action_set_polygon(int p_idx, const Variant &p_pr EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); undo_redo->add_do_method(navpoly.ptr(), "set_outline", p_idx, p_polygon); undo_redo->add_undo_method(navpoly.ptr(), "set_outline", p_idx, p_previous); - undo_redo->add_do_method(navpoly.ptr(), "make_polygons_from_outlines"); - undo_redo->add_undo_method(navpoly.ptr(), "make_polygons_from_outlines"); } bool NavigationPolygonEditor::_has_resource() const { @@ -119,7 +114,84 @@ void NavigationPolygonEditor::_create_resource() { _menu_option(MODE_CREATE); } -NavigationPolygonEditor::NavigationPolygonEditor() {} +NavigationPolygonEditor::NavigationPolygonEditor() { + bake_hbox = memnew(HBoxContainer); + add_child(bake_hbox); + + button_bake = memnew(Button); + button_bake->set_flat(true); + bake_hbox->add_child(button_bake); + button_bake->set_toggle_mode(true); + button_bake->set_text(TTR("Bake NavigationPolygon")); + button_bake->set_tooltip_text(TTR("Bakes the NavigationPolygon by first parsing the scene for source geometry and then creating the navigation polygon vertices and polygons.")); + button_bake->connect("pressed", callable_mp(this, &NavigationPolygonEditor::_bake_pressed)); + + button_reset = memnew(Button); + button_reset->set_flat(true); + bake_hbox->add_child(button_reset); + button_reset->set_text(TTR("Clear NavigationPolygon")); + button_reset->set_tooltip_text(TTR("Clears the internal NavigationPolygon outlines, vertices and polygons.")); + button_reset->connect("pressed", callable_mp(this, &NavigationPolygonEditor::_clear_pressed)); + + bake_info = memnew(Label); + bake_hbox->add_child(bake_info); + + err_dialog = memnew(AcceptDialog); + add_child(err_dialog); + node = nullptr; +} + +void NavigationPolygonEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + button_bake->set_icon(get_theme_icon(SNAME("Bake"), SNAME("EditorIcons"))); + button_reset->set_icon(get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); + } break; + } +} + +void NavigationPolygonEditor::_bake_pressed() { + button_bake->set_pressed(false); + + ERR_FAIL_NULL(node); + Ref<NavigationPolygon> navigation_polygon = node->get_navigation_polygon(); + if (!navigation_polygon.is_valid()) { + err_dialog->set_text(TTR("A NavigationPolygon resource must be set or created for this node to work.")); + err_dialog->popup_centered(); + return; + } + + node->bake_navigation_polygon(true); + + node->queue_redraw(); +} + +void NavigationPolygonEditor::_clear_pressed() { + if (node) { + if (node->get_navigation_polygon().is_valid()) { + node->get_navigation_polygon()->clear(); + } + } + + button_bake->set_pressed(false); + bake_info->set_text(""); + + if (node) { + node->queue_redraw(); + } +} + +void NavigationPolygonEditor::_update_polygon_editing_state() { + if (!_get_node()) { + return; + } + + if (node != nullptr && node->get_navigation_polygon().is_valid()) { + bake_hbox->show(); + } else { + bake_hbox->hide(); + } +} NavigationPolygonEditorPlugin::NavigationPolygonEditorPlugin() : AbstractPolygon2DEditorPlugin(memnew(NavigationPolygonEditor), "NavigationRegion2D") { |