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

(cherry picked from commit 52f6e0b5ad)
This commit is contained in:
jeffuntildeath 2020-12-09 11:40:30 -06:00 committed by Rémi Verschelde
parent 979e5b36da
commit de7b5006cc
No known key found for this signature in database
GPG Key ID: C3336907360768E1

View File

@ -5803,13 +5803,25 @@ void SpatialEditor::snap_selected_nodes_to_floor() {
Set<CollisionShape *> cs = _get_child_nodes<CollisionShape>(sp);
if (cs.size()) {
AABB aabb = sp->get_global_transform().xform(cs.front()->get()->get_shape()->get_debug_mesh()->get_aabb());
for (Set<CollisionShape *>::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()));
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<CollisionShape *>::Element *I = cs.front(); I; I = I->next()) {
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<VisualInstance *>::Element *I = vi.front(); I; I = I->next()) {