Browse Source

Merge pull request #68409 from Jasuse/shapecast3d_dbg_shape_fix

Fix debug shape of `ShapeCast3D` not updating on `Shape` change
Rémi Verschelde 2 years ago
parent
commit
d20ebe98c4
2 changed files with 14 additions and 2 deletions
  1. 13 2
      scene/3d/shape_cast_3d.cpp
  2. 1 0
      scene/3d/shape_cast_3d.h

+ 13 - 2
scene/3d/shape_cast_3d.cpp

@@ -30,6 +30,7 @@
 
 #include "shape_cast_3d.h"
 
+#include "core/core_string_names.h"
 #include "collision_object_3d.h"
 #include "mesh_instance_3d.h"
 #include "scene/resources/concave_polygon_shape_3d.h"
@@ -318,25 +319,35 @@ void ShapeCast3D::resource_changed(Ref<Resource> p_res) {
 	update_gizmos();
 }
 
+void ShapeCast3D::_shape_changed() {
+	update_gizmos();
+	bool is_editor = Engine::get_singleton()->is_editor_hint();
+	if (is_inside_tree() && (is_editor || get_tree()->is_debugging_collisions_hint())) {
+		_update_debug_shape();
+	}
+}
+
 void ShapeCast3D::set_shape(const Ref<Shape3D> &p_shape) {
 	if (p_shape == shape) {
 		return;
 	}
 	if (!shape.is_null()) {
+		shape->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &ShapeCast3D::_shape_changed));
 		shape->unregister_owner(this);
 	}
 	shape = p_shape;
 	if (!shape.is_null()) {
 		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();
 	}
 
-	if (is_inside_tree() && get_tree()->is_debugging_collisions_hint()) {
+	bool is_editor = Engine::get_singleton()->is_editor_hint();
+	if (is_inside_tree() && (is_editor || get_tree()->is_debugging_collisions_hint())) {
 		_update_debug_shape();
 	}
-
 	update_gizmos();
 	update_configuration_warnings();
 }

+ 1 - 0
scene/3d/shape_cast_3d.h

@@ -77,6 +77,7 @@ class ShapeCast3D : public Node3D {
 protected:
 	void _notification(int p_what);
 	void _update_shapecast_state();
+	void _shape_changed();
 	static void _bind_methods();
 
 public: