Snap To Floor improperly offsets node
fix for issue #44282 AABB for collision geometry was being calculated based on parent nodes transform without consideration for collision geometries translation. Also hopefully clarified logic for selecting starting point for ray cast
This commit is contained in:
parent
32c06dfc8d
commit
4f171afecc
1 changed files with 12 additions and 10 deletions
|
@ -5824,17 +5824,20 @@ void Node3DEditor::snap_selected_nodes_to_floor() {
|
||||||
// Priorities for snapping to floor are CollisionShapes, VisualInstances and then origin
|
// Priorities for snapping to floor are CollisionShapes, VisualInstances and then origin
|
||||||
Set<VisualInstance3D *> vi = _get_child_nodes<VisualInstance3D>(sp);
|
Set<VisualInstance3D *> vi = _get_child_nodes<VisualInstance3D>(sp);
|
||||||
Set<CollisionShape3D *> cs = _get_child_nodes<CollisionShape3D>(sp);
|
Set<CollisionShape3D *> cs = _get_child_nodes<CollisionShape3D>(sp);
|
||||||
|
bool found_valid_shape = false;
|
||||||
|
|
||||||
if (cs.size()) {
|
if (cs.size()) {
|
||||||
AABB aabb;
|
AABB aabb;
|
||||||
bool found_valid_shape = false;
|
Set<CollisionShape3D *>::Element *I = cs.front();
|
||||||
if (cs.front()->get()->get_shape().is_valid()) {
|
if (I->get()->get_shape().is_valid()) {
|
||||||
aabb = sp->get_global_transform().xform(cs.front()->get()->get_shape()->get_debug_mesh()->get_aabb());
|
CollisionShape3D *collision_shape = cs.front()->get();
|
||||||
|
aabb = collision_shape->get_global_transform().xform(collision_shape->get_shape()->get_debug_mesh()->get_aabb());
|
||||||
found_valid_shape = true;
|
found_valid_shape = true;
|
||||||
}
|
}
|
||||||
for (Set<CollisionShape3D *>::Element *I = cs.front(); I; I = I->next()) {
|
for (I = I->next(); I; I = I->next()) {
|
||||||
if (I->get()->get_shape().is_valid()) {
|
CollisionShape3D *col_shape = I->get();
|
||||||
aabb.merge_with(sp->get_global_transform().xform(I->get()->get_shape()->get_debug_mesh()->get_aabb()));
|
if (col_shape->get_shape().is_valid()) {
|
||||||
|
aabb.merge_with(col_shape->get_global_transform().xform(col_shape->get_shape()->get_debug_mesh()->get_aabb()));
|
||||||
found_valid_shape = true;
|
found_valid_shape = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5842,10 +5845,9 @@ void Node3DEditor::snap_selected_nodes_to_floor() {
|
||||||
Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5);
|
Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5);
|
||||||
from = aabb.position + size;
|
from = aabb.position + size;
|
||||||
position_offset.y = from.y - sp->get_global_transform().origin.y;
|
position_offset.y = from.y - sp->get_global_transform().origin.y;
|
||||||
} else {
|
|
||||||
from = sp->get_global_transform().origin;
|
|
||||||
}
|
}
|
||||||
} else if (vi.size()) {
|
}
|
||||||
|
if (!found_valid_shape && vi.size()) {
|
||||||
AABB aabb = vi.front()->get()->get_transformed_aabb();
|
AABB aabb = vi.front()->get()->get_transformed_aabb();
|
||||||
for (Set<VisualInstance3D *>::Element *I = vi.front(); I; I = I->next()) {
|
for (Set<VisualInstance3D *>::Element *I = vi.front(); I; I = I->next()) {
|
||||||
aabb.merge_with(I->get()->get_transformed_aabb());
|
aabb.merge_with(I->get()->get_transformed_aabb());
|
||||||
|
@ -5853,7 +5855,7 @@ void Node3DEditor::snap_selected_nodes_to_floor() {
|
||||||
Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5);
|
Vector3 size = aabb.size * Vector3(0.5, 0.0, 0.5);
|
||||||
from = aabb.position + size;
|
from = aabb.position + size;
|
||||||
position_offset.y = from.y - sp->get_global_transform().origin.y;
|
position_offset.y = from.y - sp->get_global_transform().origin.y;
|
||||||
} else {
|
} else if (!found_valid_shape) {
|
||||||
from = sp->get_global_transform().origin;
|
from = sp->get_global_transform().origin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue