From 4c8d69f264459a9b8b72fa7ffe8a972e821af1a1 Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Sun, 4 Feb 2024 02:47:44 -0600 Subject: [PATCH] Fix crash when importing a GLTF file with a skeleton as the root --- modules/gltf/gltf_document.cpp | 15 ++++++++++----- modules/gltf/gltf_document.h | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index f2dccf6d6850..73e26fbef5fc 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -5982,8 +5982,13 @@ void GLTFDocument::_generate_skeleton_bone_node(Ref p_state, const GL p_scene_parent = bone_attachment; } if (skeleton->get_parent() == nullptr) { - p_scene_parent->add_child(skeleton, true); - skeleton->set_owner(p_scene_root); + if (p_scene_root) { + p_scene_parent->add_child(skeleton, true); + skeleton->set_owner(p_scene_root); + } else { + p_scene_parent = skeleton; + p_scene_root = skeleton; + } } } @@ -6582,7 +6587,7 @@ float GLTFDocument::get_max_component(const Color &p_color) { return MAX(MAX(r, g), b); } -void GLTFDocument::_process_mesh_instances(Ref p_state) { +void GLTFDocument::_process_mesh_instances(Ref p_state, Node *p_scene_root) { for (GLTFNodeIndex node_i = 0; node_i < p_state->nodes.size(); ++node_i) { Ref node = p_state->nodes[node_i]; @@ -6607,7 +6612,7 @@ void GLTFDocument::_process_mesh_instances(Ref p_state) { mi->get_parent()->remove_child(mi); skeleton->add_child(mi, true); - mi->set_owner(skeleton->get_owner()); + mi->set_owner(p_scene_root); mi->set_skin(p_state->skins.write[skin_i]->godot_skin); mi->set_skeleton_path(mi->get_path_to(skeleton)); @@ -7461,7 +7466,7 @@ Node *GLTFDocument::generate_scene(Ref p_state, float p_bake_fps, boo Error err = OK; Node *root = _generate_scene_node_tree(p_state); ERR_FAIL_NULL_V(root, nullptr); - _process_mesh_instances(p_state); + _process_mesh_instances(p_state, root); if (p_state->get_create_animations() && p_state->animations.size()) { AnimationPlayer *ap = memnew(AnimationPlayer); root->add_child(ap, true); diff --git a/modules/gltf/gltf_document.h b/modules/gltf/gltf_document.h index f321bb711105..04c85f3b076d 100644 --- a/modules/gltf/gltf_document.h +++ b/modules/gltf/gltf_document.h @@ -326,7 +326,7 @@ class GLTFDocument : public Resource { Error _parse_gltf_state(Ref p_state, const String &p_search_path); Error _parse_asset_header(Ref p_state); Error _parse_gltf_extensions(Ref p_state); - void _process_mesh_instances(Ref p_state); + void _process_mesh_instances(Ref p_state, Node *p_scene_root); Node *_generate_scene_node_tree(Ref p_state); void _generate_scene_node(Ref p_state, const GLTFNodeIndex p_node_index, Node *p_scene_parent, Node *p_scene_root); void _generate_skeleton_bone_node(Ref p_state, const GLTFNodeIndex p_node_index, Node *p_scene_parent, Node *p_scene_root);