Skip to content

Commit

Permalink
Merge pull request #56671 from Rgtemze/warn_if_concave
Browse files Browse the repository at this point in the history
Warn when a concave polygon is assigned to ConvexPolygonShape2D
  • Loading branch information
YuriSizov authored Apr 7, 2023
2 parents a13635c + 6fb113f commit b5f5320
Showing 1 changed file with 30 additions and 0 deletions.
30 changes: 30 additions & 0 deletions scene/resources/convex_polygon_shape_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,41 @@ bool ConvexPolygonShape2D::_edit_is_selected_on_click(const Point2 &p_point, dou
return Geometry2D::is_point_in_polygon(p_point, points);
}

#ifdef DEBUG_ENABLED
// Check if point p3 is to the left of [p1, p2] segment or on it.
bool left_test(const Vector2 &p1, const Vector2 &p2, const Vector2 &p3) {
Vector2 p12 = p2 - p1;
Vector2 p13 = p3 - p1;
// If the value of the cross product is positive or zero; p3 is to the left or on the segment, respectively.
return p12.cross(p13) >= 0;
}

bool is_convex(const Vector<Vector2> &p_points) {
// Pre-condition: Polygon is in counter-clockwise order.
int polygon_size = p_points.size();
for (int i = 0; i < polygon_size && polygon_size > 3; i++) {
int j = (i + 1) % polygon_size;
int k = (j + 1) % polygon_size;
// If any consecutive three points fail left-test, then there is a concavity.
if (!left_test(p_points[i], p_points[j], p_points[k])) {
return false;
}
}

return true;
}
#endif

void ConvexPolygonShape2D::_update_shape() {
Vector<Vector2> final_points = points;
if (Geometry2D::is_polygon_clockwise(final_points)) { //needs to be counter clockwise
final_points.reverse();
}
#ifdef DEBUG_ENABLED
if (!is_convex(final_points)) {
WARN_PRINT("Concave polygon is assigned to ConvexPolygonShape2D.");
}
#endif
PhysicsServer2D::get_singleton()->shape_set_data(get_rid(), final_points);
emit_changed();
}
Expand Down

0 comments on commit b5f5320

Please sign in to comment.