diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index 68cc3e538d9..03bc95e2118 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -3684,6 +3684,35 @@ AABB SpatialEditorViewport::_calculate_spatial_bounds(const Spatial *p_parent, b return bounds; } +Node *SpatialEditorViewport::_sanitize_preview_node(Node *p_node) const { + Spatial *spatial = Object::cast_to(p_node); + if (spatial == nullptr) { + Spatial *replacement_node = memnew(Spatial); + replacement_node->set_name(p_node->get_name()); + p_node->replace_by(replacement_node); + memdelete(p_node); + p_node = replacement_node; + } else { + VisualInstance *visual_instance = Object::cast_to(spatial); + if (visual_instance == nullptr) { + Spatial *replacement_node = memnew(Spatial); + replacement_node->set_name(spatial->get_name()); + replacement_node->set_visible(spatial->is_visible()); + replacement_node->set_transform(spatial->get_transform()); + replacement_node->set_as_toplevel(spatial->is_set_as_toplevel()); + p_node->replace_by(replacement_node); + memdelete(p_node); + p_node = replacement_node; + } + } + + for (int i = 0; i < p_node->get_child_count(); i++) { + _sanitize_preview_node(p_node->get_child(i)); + } + + return p_node; +} + void SpatialEditorViewport::_create_preview(const Vector &files) const { for (int i = 0; i < files.size(); i++) { String path = files[i]; @@ -3700,6 +3729,7 @@ void SpatialEditorViewport::_create_preview(const Vector &files) const { if (scene.is_valid()) { Node *instance = scene->instance(); if (instance) { + instance = _sanitize_preview_node(instance); preview_node->add_child(instance); } } diff --git a/editor/plugins/spatial_editor_plugin.h b/editor/plugins/spatial_editor_plugin.h index b32aea59e76..39245b73dc1 100644 --- a/editor/plugins/spatial_editor_plugin.h +++ b/editor/plugins/spatial_editor_plugin.h @@ -446,6 +446,9 @@ private: Vector3 _get_instance_position(const Point2 &p_pos) const; static AABB _calculate_spatial_bounds(const Spatial *p_parent, bool p_exclude_toplevel_transform = true); + + Node *_sanitize_preview_node(Node *p_node) const; + void _create_preview(const Vector &files) const; void _remove_preview(); bool _cyclical_dependency_exists(const String &p_target_scene_path, Node *p_desired_node);