You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-06 12:20:30 +00:00
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
(cherry picked from commit 4f171afecc)
This commit is contained in:
committed by
Rémi Verschelde
parent
49646383f1
commit
64cbff7e7d
@@ -5823,17 +5823,20 @@ void SpatialEditor::snap_selected_nodes_to_floor() {
|
||||
// Priorities for snapping to floor are CollisionShapes, VisualInstances and then origin
|
||||
Set<VisualInstance *> vi = _get_child_nodes<VisualInstance>(sp);
|
||||
Set<CollisionShape *> cs = _get_child_nodes<CollisionShape>(sp);
|
||||
bool found_valid_shape = false;
|
||||
|
||||
if (cs.size()) {
|
||||
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());
|
||||
Set<CollisionShape *>::Element *I = cs.front();
|
||||
if (I->get()->get_shape().is_valid()) {
|
||||
CollisionShape *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;
|
||||
}
|
||||
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()));
|
||||
for (I = I->next(); I; I = I->next()) {
|
||||
CollisionShape *col_shape = I->get();
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -5841,10 +5844,9 @@ void SpatialEditor::snap_selected_nodes_to_floor() {
|
||||
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;
|
||||
}
|
||||
} else if (vi.size()) {
|
||||
}
|
||||
if (!found_valid_shape && vi.size()) {
|
||||
AABB aabb = vi.front()->get()->get_transformed_aabb();
|
||||
for (Set<VisualInstance *>::Element *I = vi.front(); I; I = I->next()) {
|
||||
aabb.merge_with(I->get()->get_transformed_aabb());
|
||||
@@ -5852,7 +5854,7 @@ void SpatialEditor::snap_selected_nodes_to_floor() {
|
||||
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 {
|
||||
} else if (!found_valid_shape) {
|
||||
from = sp->get_global_transform().origin;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user