@@ -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