From 5bed055cdd5180b4c5d07f07a2a58644a3d1ffc2 Mon Sep 17 00:00:00 2001 From: Ricardo Buring Date: Thu, 23 Mar 2023 19:13:24 +0100 Subject: [PATCH] Port robust signal (dis)connection to ShapeCast2D Ported from ShapeCast3D. --- scene/2d/shape_cast_2d.cpp | 13 ++++++++++--- scene/2d/shape_cast_2d.h | 2 +- scene/3d/shape_cast_3d.cpp | 6 ++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/scene/2d/shape_cast_2d.cpp b/scene/2d/shape_cast_2d.cpp index bafb83361a54..5b743e0b3194 100644 --- a/scene/2d/shape_cast_2d.cpp +++ b/scene/2d/shape_cast_2d.cpp @@ -151,11 +151,18 @@ bool ShapeCast2D::is_enabled() const { } void ShapeCast2D::set_shape(const Ref &p_shape) { + if (p_shape == shape) { + return; + } + if (shape.is_valid()) { + shape->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &ShapeCast2D::_shape_changed)); + } shape = p_shape; - if (p_shape.is_valid()) { - shape->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &ShapeCast2D::_redraw_shape)); + if (shape.is_valid()) { + shape->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &ShapeCast2D::_shape_changed)); shape_rid = shape->get_rid(); } + update_configuration_warnings(); queue_redraw(); } @@ -186,7 +193,7 @@ bool ShapeCast2D::get_exclude_parent_body() const { return exclude_parent_body; } -void ShapeCast2D::_redraw_shape() { +void ShapeCast2D::_shape_changed() { queue_redraw(); } diff --git a/scene/2d/shape_cast_2d.h b/scene/2d/shape_cast_2d.h index 8a62b799f8ab..a577c351fd7a 100644 --- a/scene/2d/shape_cast_2d.h +++ b/scene/2d/shape_cast_2d.h @@ -61,7 +61,7 @@ class ShapeCast2D : public Node2D { real_t collision_unsafe_fraction = 1.0; Array _get_collision_result() const; - void _redraw_shape(); + void _shape_changed(); protected: void _notification(int p_what); diff --git a/scene/3d/shape_cast_3d.cpp b/scene/3d/shape_cast_3d.cpp index d880e422f07b..602eb664dd0a 100644 --- a/scene/3d/shape_cast_3d.cpp +++ b/scene/3d/shape_cast_3d.cpp @@ -331,16 +331,14 @@ void ShapeCast3D::set_shape(const Ref &p_shape) { if (p_shape == shape) { return; } - if (!shape.is_null()) { + if (shape.is_valid()) { shape->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &ShapeCast3D::_shape_changed)); shape->unregister_owner(this); } shape = p_shape; - if (!shape.is_null()) { + if (shape.is_valid()) { shape->register_owner(this); shape->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &ShapeCast3D::_shape_changed)); - } - if (p_shape.is_valid()) { shape_rid = shape->get_rid(); }