summaryrefslogtreecommitdiff
path: root/editor
diff options
context:
space:
mode:
authorjeffuntildeath <jeffuntildeath@gmail.com>2020-12-09 11:40:30 -0600
committerjeffuntildeath <jeffuntildeath@gmail.com>2020-12-09 12:09:41 -0600
commit52f6e0b5ada0baaa91f00cdb045a32872d969ac1 (patch)
tree291d0b83ecc2670ded58af6b32cdad6be201e9b7 /editor
parent45d627a845dd991c2ea1a982dc028c591dd41e74 (diff)
fix for snap to floor editor crash bug
fix for issue #44231: snap_selected_nodes_to_floor() results in an editor crash when a child collisionshape has invalid shape object
Diffstat (limited to 'editor')
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp22
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 804a72bd1d..b0bb812312 100644
--- a/editor/plugins/node_3d_editor_plugin.cpp
+++ b/editor/plugins/node_3d_editor_plugin.cpp
@@ -5829,13 +5829,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()) {