diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 2e89bb470614..45592848ee45 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -4381,8 +4381,11 @@ void Node3DEditorViewport::assign_pending_data_pointers(Node3D *p_preview_node, void _insert_rid_recursive(Node *node, HashSet<RID> &rids) { CollisionObject3D *co = Object::cast_to<CollisionObject3D>(node); + if (co) { rids.insert(co->get_rid()); + } else if (node->is_class("CSGShape3D")) { // HACK: We should avoid referencing module logic. + rids.insert(node->call("_get_root_collision_instance")); } for (int i = 0; i < node->get_child_count(); i++) { diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index b9f33dc7571a..12d807be46b4 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -166,6 +166,16 @@ bool CSGShape3D::get_collision_mask_value(int p_layer_number) const { return get_collision_mask() & (1 << (p_layer_number - 1)); } +RID CSGShape3D::_get_root_collision_instance() const { + if (root_collision_instance.is_valid()) { + return root_collision_instance; + } else if (parent_shape) { + return parent_shape->_get_root_collision_instance(); + } + + return RID(); +} + void CSGShape3D::set_collision_priority(real_t p_priority) { collision_priority = p_priority; if (root_collision_instance.is_valid()) { @@ -982,6 +992,8 @@ void CSGShape3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_collision_mask_value", "layer_number", "value"), &CSGShape3D::set_collision_mask_value); ClassDB::bind_method(D_METHOD("get_collision_mask_value", "layer_number"), &CSGShape3D::get_collision_mask_value); + ClassDB::bind_method(D_METHOD("_get_root_collision_instance"), &CSGShape3D::_get_root_collision_instance); + ClassDB::bind_method(D_METHOD("set_collision_layer_value", "layer_number", "value"), &CSGShape3D::set_collision_layer_value); ClassDB::bind_method(D_METHOD("get_collision_layer_value", "layer_number"), &CSGShape3D::get_collision_layer_value); diff --git a/modules/csg/csg_shape.h b/modules/csg/csg_shape.h index 39b42afc085b..2331bce48594 100644 --- a/modules/csg/csg_shape.h +++ b/modules/csg/csg_shape.h @@ -156,6 +156,8 @@ class CSGShape3D : public GeometryInstance3D { void set_collision_mask_value(int p_layer_number, bool p_value); bool get_collision_mask_value(int p_layer_number) const; + RID _get_root_collision_instance() const; + void set_collision_priority(real_t p_priority); real_t get_collision_priority() const;