TileSet Editor: Check polygon size before indexing

Fixes #39722.
This commit is contained in:
Rémi Verschelde 2020-07-21 08:05:51 +02:00
parent fa3ac7deae
commit 6f428f2494
1 changed files with 10 additions and 12 deletions

View File

@ -1977,7 +1977,7 @@ void TileSetEditor::_set_edited_shape_points(const Vector<Vector2> &points) {
if (convex.is_valid()) { if (convex.is_valid()) {
undo_redo->add_do_method(convex.ptr(), "set_points", points); undo_redo->add_do_method(convex.ptr(), "set_points", points);
undo_redo->add_undo_method(convex.ptr(), "set_points", _get_edited_shape_points()); undo_redo->add_undo_method(convex.ptr(), "set_points", _get_edited_shape_points());
} else if (concave.is_valid()) { } else if (concave.is_valid() && points.size() > 1) {
PackedVector2Array segments; PackedVector2Array segments;
for (int i = 0; i < points.size() - 1; i++) { for (int i = 0; i < points.size() - 1; i++) {
segments.push_back(points[i]); segments.push_back(points[i]);
@ -2669,7 +2669,7 @@ void TileSetEditor::draw_polygon_shapes() {
workspace->draw_polygon(polygon, colors); workspace->draw_polygon(polygon, colors);
if (coord == edited_shape_coord || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) { if (coord == edited_shape_coord || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
if (!creating_shape) { if (!creating_shape && polygon.size() > 1) {
for (int j = 0; j < polygon.size() - 1; j++) { for (int j = 0; j < polygon.size() - 1; j++) {
workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1); workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
} }
@ -2706,13 +2706,11 @@ void TileSetEditor::draw_polygon_shapes() {
} }
workspace->draw_polygon(polygon, colors); workspace->draw_polygon(polygon, colors);
if (!creating_shape) { if (!creating_shape && polygon.size() > 1) {
if (polygon.size() > 1) { for (int j = 0; j < polygon.size() - 1; j++) {
for (int j = 0; j < polygon.size() - 1; j++) { workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
}
workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1);
} }
workspace->draw_line(polygon[polygon.size() - 1], polygon[0], c_border, 1);
} }
if (shape == edited_occlusion_shape) { if (shape == edited_occlusion_shape) {
draw_handles = true; draw_handles = true;
@ -2756,7 +2754,7 @@ void TileSetEditor::draw_polygon_shapes() {
workspace->draw_polygon(polygon, colors); workspace->draw_polygon(polygon, colors);
if (coord == edited_shape_coord) { if (coord == edited_shape_coord) {
if (!creating_shape) { if (!creating_shape && polygon.size() > 1) {
for (int j = 0; j < polygon.size() - 1; j++) { for (int j = 0; j < polygon.size() - 1; j++) {
workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1); workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
} }
@ -2796,7 +2794,7 @@ void TileSetEditor::draw_polygon_shapes() {
} }
workspace->draw_polygon(polygon, colors); workspace->draw_polygon(polygon, colors);
if (!creating_shape) { if (!creating_shape && polygon.size() > 1) {
for (int j = 0; j < polygon.size() - 1; j++) { for (int j = 0; j < polygon.size() - 1; j++) {
workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1); workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
} }
@ -2845,7 +2843,7 @@ void TileSetEditor::draw_polygon_shapes() {
workspace->draw_polygon(polygon, colors); workspace->draw_polygon(polygon, colors);
if (coord == edited_shape_coord) { if (coord == edited_shape_coord) {
if (!creating_shape) { if (!creating_shape && polygon.size() > 1) {
for (int j = 0; j < polygon.size() - 1; j++) { for (int j = 0; j < polygon.size() - 1; j++) {
workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1); workspace->draw_line(polygon[j], polygon[j + 1], c_border, 1);
} }
@ -2863,7 +2861,7 @@ void TileSetEditor::draw_polygon_shapes() {
} }
} }
if (creating_shape) { if (creating_shape && current_shape.size() > 1) {
for (int j = 0; j < current_shape.size() - 1; j++) { for (int j = 0; j < current_shape.size() - 1; j++) {
workspace->draw_line(current_shape[j], current_shape[j + 1], Color(0, 1, 1), 1); workspace->draw_line(current_shape[j], current_shape[j + 1], Color(0, 1, 1), 1);
} }