From aacaad50665b5e8e5c16be61770afa32c69c80d6 Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Sun, 21 Feb 2021 17:55:54 +0100 Subject: [PATCH] Draw an outline for 2D debug collision shapes This makes them easier to distinguish, especially when used in a TileMap. The default color's opacity has been slightly decreased to account for the new outline. --- scene/main/scene_tree.cpp | 2 +- scene/resources/capsule_shape_2d.cpp | 3 +++ scene/resources/circle_shape_2d.cpp | 3 +++ scene/resources/convex_polygon_shape_2d.cpp | 3 +++ scene/resources/rectangle_shape_2d.cpp | 16 ++++++++++++++++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 02fbbd39279..3a6114cc28d 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -2032,7 +2032,7 @@ SceneTree::SceneTree() { debug_collisions_hint = false; debug_navigation_hint = false; #endif - debug_collisions_color = GLOBAL_DEF("debug/shapes/collision/shape_color", Color(0.0, 0.6, 0.7, 0.5)); + debug_collisions_color = GLOBAL_DEF("debug/shapes/collision/shape_color", Color(0.0, 0.6, 0.7, 0.42)); debug_collision_contact_color = GLOBAL_DEF("debug/shapes/collision/contact_color", Color(1.0, 0.2, 0.1, 0.8)); debug_navigation_color = GLOBAL_DEF("debug/shapes/navigation/geometry_color", Color(0.1, 1.0, 0.7, 0.4)); debug_navigation_disabled_color = GLOBAL_DEF("debug/shapes/navigation/disabled_geometry_color", Color(1.0, 0.7, 0.1, 0.4)); diff --git a/scene/resources/capsule_shape_2d.cpp b/scene/resources/capsule_shape_2d.cpp index ffdb6ce8a82..ff3639f30b3 100644 --- a/scene/resources/capsule_shape_2d.cpp +++ b/scene/resources/capsule_shape_2d.cpp @@ -89,6 +89,9 @@ void CapsuleShape2D::draw(const RID &p_to_rid, const Color &p_color) { Vector col; col.push_back(p_color); VisualServer::get_singleton()->canvas_item_add_polygon(p_to_rid, points, col); + VisualServer::get_singleton()->canvas_item_add_polyline(p_to_rid, points, col, 1.0, true); + // Draw the last segment as it's not drawn by `canvas_item_add_polyline()`. + VisualServer::get_singleton()->canvas_item_add_line(p_to_rid, points[points.size() - 1], points[0], p_color, 1.0, true); } Rect2 CapsuleShape2D::get_rect() const { diff --git a/scene/resources/circle_shape_2d.cpp b/scene/resources/circle_shape_2d.cpp index 22e461c9b35..6c73659aa75 100644 --- a/scene/resources/circle_shape_2d.cpp +++ b/scene/resources/circle_shape_2d.cpp @@ -81,6 +81,9 @@ void CircleShape2D::draw(const RID &p_to_rid, const Color &p_color) { Vector col; col.push_back(p_color); VisualServer::get_singleton()->canvas_item_add_polygon(p_to_rid, points, col); + VisualServer::get_singleton()->canvas_item_add_polyline(p_to_rid, points, col, 1.0, true); + // Draw the last segment as it's not drawn by `canvas_item_add_polyline()`. + VisualServer::get_singleton()->canvas_item_add_line(p_to_rid, points[points.size() - 1], points[0], p_color, 1.0, true); } CircleShape2D::CircleShape2D() : diff --git a/scene/resources/convex_polygon_shape_2d.cpp b/scene/resources/convex_polygon_shape_2d.cpp index 03116ae412f..bf2468d2f22 100644 --- a/scene/resources/convex_polygon_shape_2d.cpp +++ b/scene/resources/convex_polygon_shape_2d.cpp @@ -82,6 +82,9 @@ void ConvexPolygonShape2D::draw(const RID &p_to_rid, const Color &p_color) { Vector col; col.push_back(p_color); VisualServer::get_singleton()->canvas_item_add_polygon(p_to_rid, points, col); + VisualServer::get_singleton()->canvas_item_add_polyline(p_to_rid, points, col, 1.0, true); + // Draw the last segment as it's not drawn by `canvas_item_add_polyline()`. + VisualServer::get_singleton()->canvas_item_add_line(p_to_rid, points[points.size() - 1], points[0], p_color, 1.0, true); } Rect2 ConvexPolygonShape2D::get_rect() const { diff --git a/scene/resources/rectangle_shape_2d.cpp b/scene/resources/rectangle_shape_2d.cpp index b88c5bfc92c..85f3dc59d1d 100644 --- a/scene/resources/rectangle_shape_2d.cpp +++ b/scene/resources/rectangle_shape_2d.cpp @@ -51,7 +51,23 @@ Vector2 RectangleShape2D::get_extents() const { void RectangleShape2D::draw(const RID &p_to_rid, const Color &p_color) { + // Draw an outlined rectangle to make individual shapes easier to distinguish. + Vector stroke_points; + stroke_points.resize(5); + stroke_points.write[0] = -extents; + stroke_points.write[1] = Vector2(extents.x, -extents.y); + stroke_points.write[2] = extents; + stroke_points.write[3] = Vector2(-extents.x, extents.y); + stroke_points.write[4] = -extents; + + Vector stroke_colors; + stroke_colors.resize(5); + for (int i = 0; i < 5; i++) { + stroke_colors.write[i] = p_color; + } + VisualServer::get_singleton()->canvas_item_add_rect(p_to_rid, Rect2(-extents, extents * 2.0), p_color); + VisualServer::get_singleton()->canvas_item_add_polyline(p_to_rid, stroke_points, stroke_colors, 1.0, true); } Rect2 RectangleShape2D::get_rect() const {