Skip to content

Commit ca098ad

Browse files
committed
Skip drop-preview bounds offset when _snap_transform engages
1 parent 4ac09b1 commit ca098ad

1 file changed

Lines changed: 20 additions & 6 deletions

File tree

‎editor/scene/3d/node_3d_editor_plugin.cpp‎

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4148,14 +4148,17 @@ void Node3DEditorViewport::_notification(int p_what) {
41484148
return;
41494149
}
41504150
if (preview_node->is_inside_tree()) {
4151-
preview_node_pos = spatial_editor->snap_point(_get_instance_position(preview_node_viewport_pos, preview_node));
4152-
double snap = EDITOR_GET("interface/inspector/default_float_step");
4153-
int snap_step_decimals = Math::range_step_decimals(snap);
4154-
set_message(vformat(TTR("Instantiating: %s"), vformat("%.*v", snap_step_decimals, preview_node_pos)));
41554151
Basis preview_basis;
41564152
preview_basis.rotate(Vector3(0, 1, 0), preview_node_angle);
4157-
Transform3D preview_gl_transform = Transform3D(preview_basis, preview_node_pos);
4158-
preview_node->set_global_transform(preview_gl_transform);
4153+
4154+
CollisionResult cr = _get_instance_position_and_normal(preview_node_viewport_pos, preview_node);
4155+
Vector3 surface_pos = spatial_editor->snap_point(cr.has_collision ? cr.surface_point : cr.position);
4156+
Vector3 offset_pos = spatial_editor->snap_point(cr.position);
4157+
4158+
preview_node_pos = surface_pos;
4159+
preview_node->set_global_transform(Transform3D(preview_basis, preview_node_pos));
4160+
4161+
bool snap_engaged = false;
41594162
for (int i = 0; i < preview_node->get_child_count(); i++) {
41604163
Node3D *child = Object::cast_to<Node3D>(preview_node->get_child(i));
41614164
if (child && child->has_meta("_snap_transform")) {
@@ -4168,10 +4171,21 @@ void Node3DEditorViewport::_notification(int p_what) {
41684171
Basis compensated = snap_rot * child_local_rot.transposed();
41694172
preview_node->set_global_transform(Transform3D(compensated, snapped.origin));
41704173
preview_node_pos = snapped.origin;
4174+
snap_engaged = true;
41714175
}
41724176
break;
41734177
}
41744178
}
4179+
4180+
if (!snap_engaged) {
4181+
preview_node_pos = offset_pos;
4182+
preview_node->set_global_transform(Transform3D(preview_basis, preview_node_pos));
4183+
}
4184+
4185+
double snap = EDITOR_GET("interface/inspector/default_float_step");
4186+
int snap_step_decimals = Math::range_step_decimals(snap);
4187+
set_message(vformat(TTR("Instantiating: %s"), vformat("%.*v", snap_step_decimals, preview_node_pos)));
4188+
41754189
if (!preview_node->is_visible()) {
41764190
preview_node->show();
41774191
}

0 commit comments

Comments
 (0)