diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2020-12-10 10:52:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-10 10:52:24 +0100 |
commit | 47538ef9a48d5fed2a5470dda2f92e7b436655ae (patch) | |
tree | 8b9803fda49bae476bb3d8f06fe646bc1a995d21 /editor | |
parent | a20a32cb44f5b1bb8c9bf15011f7874c4562d4c5 (diff) | |
parent | 52f6e0b5ada0baaa91f00cdb045a32872d969ac1 (diff) |
Merge pull request #44234 from jeffuntildeath/master
fix for snap to floor editor crash bug
Diffstat (limited to 'editor')
-rw-r--r-- | editor/plugins/node_3d_editor_plugin.cpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index 8f2fc968e3..6493e0f953 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -5826,13 +5826,25 @@ void Node3DEditor::snap_selected_nodes_to_floor() { Set<CollisionShape3D *> cs = _get_child_nodes<CollisionShape3D>(sp); if (cs.size()) { - AABB aabb = sp->get_global_transform().xform(cs.front()->get()->get_shape()->get_debug_mesh()->get_aabb()); + AABB aabb; + bool found_valid_shape = false; + if (cs.front()->get()->get_shape().is_valid()) { + aabb = sp->get_global_transform().xform(cs.front()->get()->get_shape()->get_debug_mesh()->get_aabb()); + found_valid_shape = true; + } for (Set<CollisionShape3D *>::Element *I = cs.front(); I; I = I->next()) { - aabb.merge_with(sp->get_global_transform().xform(I->get()->get_shape()->get_debug_mesh()->get_aabb())); + if (I->get()->get_shape().is_valid()) { + aabb.merge_with(sp->get_global_transform().xform(I->get()->get_shape()->get_debug_mesh()->get_aabb())); + found_valid_shape = true; + } + } + if (found_valid_shape) { + Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5); + from = aabb.position + size; + position_offset.y = from.y - sp->get_global_transform().origin.y; + } else { + from = sp->get_global_transform().origin; } - Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5); - from = aabb.position + size; - position_offset.y = from.y - sp->get_global_transform().origin.y; } else if (vi.size()) { AABB aabb = vi.front()->get()->get_transformed_aabb(); for (Set<VisualInstance3D *>::Element *I = vi.front(); I; I = I->next()) { |