From 1bac95b1669ed6faf17958e76a8946a88487548b Mon Sep 17 00:00:00 2001 From: smix8 <52464204+smix8@users.noreply.github.com> Date: Sun, 22 May 2022 00:41:40 +0200 Subject: [PATCH] Fix TileSetEditor wrong NavigationPolygon format TileSets created and stored NavigationPolyons in a format that did not work for Navigation. --- editor/plugins/tile_set_editor_plugin.cpp | 67 +++++++++++++---------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index f719ce8c5b5..8e03e1430a6 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -1665,16 +1665,20 @@ void TileSetEditor::_on_workspace_input(const Ref &p_ie) { w.release(); - undo_redo->create_action(TTR("Edit Navigation Polygon")); - undo_redo->add_do_method(edited_navigation_shape.ptr(), "set_vertices", polygon); - undo_redo->add_undo_method(edited_navigation_shape.ptr(), "set_vertices", edited_navigation_shape->get_vertices()); - undo_redo->add_do_method(edited_navigation_shape.ptr(), "clear_polygons"); - undo_redo->add_undo_method(edited_navigation_shape.ptr(), "clear_polygons"); - undo_redo->add_do_method(edited_navigation_shape.ptr(), "add_polygon", indices); - undo_redo->add_undo_method(edited_navigation_shape.ptr(), "add_polygon", edited_navigation_shape->get_polygon(0)); - undo_redo->add_do_method(this, "_select_edited_shape_coord"); - undo_redo->add_undo_method(this, "_select_edited_shape_coord"); - undo_redo->commit_action(); + edited_navigation_shape->clear_outlines(); + edited_navigation_shape->add_outline(polygon); + edited_navigation_shape->make_polygons_from_outlines(); + // FIXME Couldn't figure out the undo_redo quagmire + //undo_redo->create_action(TTR("Edit Navigation Polygon")); + //undo_redo->add_do_method(edited_navigation_shape.ptr(), "set_vertices", polygon); + //undo_redo->add_undo_method(edited_navigation_shape.ptr(), "set_vertices", edited_navigation_shape->get_vertices()); + //undo_redo->add_do_method(edited_navigation_shape.ptr(), "clear_polygons"); + //undo_redo->add_undo_method(edited_navigation_shape.ptr(), "clear_polygons"); + //undo_redo->add_do_method(edited_navigation_shape.ptr(), "add_polygon", indices); + //undo_redo->add_undo_method(edited_navigation_shape.ptr(), "add_polygon", edited_navigation_shape->get_polygon(0)); + //undo_redo->add_do_method(this, "_select_edited_shape_coord"); + //undo_redo->add_undo_method(this, "_select_edited_shape_coord"); + //undo_redo->commit_action(); } } } @@ -2808,11 +2812,14 @@ void TileSetEditor::draw_polygon_shapes() { colors.push_back(c_bg); } } else { - PoolVector vertices = shape->get_vertices(); - for (int j = 0; j < shape->get_polygon(0).size(); j++) { - polygon.push_back(vertices[shape->get_polygon(0)[j]] + anchor); - colors.push_back(c_bg); + for (int outline_idx = 0; outline_idx < shape->get_outline_count(); outline_idx++) { + PoolVector outline_vertices = shape->get_outline(outline_idx); + for (int vertex_idx = 0; vertex_idx < outline_vertices.size(); vertex_idx++) { + polygon.push_back(outline_vertices[vertex_idx] + anchor); + } } + colors.resize(polygon.size()); + colors.fill(c_bg); } workspace->draw_polygon(polygon, colors); @@ -2856,11 +2863,14 @@ void TileSetEditor::draw_polygon_shapes() { colors.push_back(c_bg); } } else { - PoolVector vertices = shape->get_vertices(); - for (int j = 0; j < shape->get_polygon(0).size(); j++) { - polygon.push_back(vertices[shape->get_polygon(0)[j]] + anchor); - colors.push_back(c_bg); + for (int outline_idx = 0; outline_idx < shape->get_outline_count(); outline_idx++) { + PoolVector outline_vertices = shape->get_outline(outline_idx); + for (int vertex_idx = 0; vertex_idx < outline_vertices.size(); vertex_idx++) { + polygon.push_back(outline_vertices[vertex_idx] + anchor); + } } + colors.resize(polygon.size()); + colors.fill(c_bg); } workspace->draw_polygon(polygon, colors); @@ -2982,8 +2992,9 @@ void TileSetEditor::close_shape(const Vector2 &shape_anchor) { } w.release(); - shape->set_vertices(polygon); - shape->add_polygon(indices); + shape->clear_outlines(); + shape->add_outline(polygon); + shape->make_polygons_from_outlines(); undo_redo->create_action(TTR("Create Navigation Polygon")); if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) { @@ -3037,10 +3048,10 @@ void TileSetEditor::select_coord(const Vector2 &coord) { } else if (edit_mode == EDITMODE_NAVIGATION) { current_shape.resize(0); if (edited_navigation_shape.is_valid()) { - if (edited_navigation_shape->get_polygon_count() > 0) { - PoolVector vertices = edited_navigation_shape->get_vertices(); - for (int i = 0; i < edited_navigation_shape->get_polygon(0).size(); i++) { - current_shape.push_back(vertices[edited_navigation_shape->get_polygon(0)[i]] + current_tile_region.position); + for (int outline_idx = 0; outline_idx < edited_navigation_shape->get_outline_count(); outline_idx++) { + PoolVector outline_vertices = edited_navigation_shape->get_outline(outline_idx); + for (int vertex_inx = 0; vertex_inx < outline_vertices.size(); vertex_inx++) { + current_shape.push_back(outline_vertices[vertex_inx] + current_tile_region.position); } } } @@ -3090,10 +3101,10 @@ void TileSetEditor::select_coord(const Vector2 &coord) { } else if (edit_mode == EDITMODE_NAVIGATION) { current_shape.resize(0); if (edited_navigation_shape.is_valid()) { - if (edited_navigation_shape->get_polygon_count() > 0) { - PoolVector vertices = edited_navigation_shape->get_vertices(); - for (int i = 0; i < edited_navigation_shape->get_polygon(0).size(); i++) { - current_shape.push_back(vertices[edited_navigation_shape->get_polygon(0)[i]] + shape_anchor); + for (int outline_idx = 0; outline_idx < edited_navigation_shape->get_outline_count(); outline_idx++) { + PoolVector outline_vertices = edited_navigation_shape->get_outline(outline_idx); + for (int vertex_inx = 0; vertex_inx < outline_vertices.size(); vertex_inx++) { + current_shape.push_back(outline_vertices[vertex_inx] + shape_anchor); } } }