@ -411,12 +411,19 @@
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    // We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic,
 
 
					 
					 
					 
					    // We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic,
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    // so we call buffer_segment directly here.  Per-segmented leveling and kinematics performed first.
 
 
					 
					 
					 
					    // so we call buffer_segment directly here.  Per-segmented leveling and kinematics performed first.
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    inline  void  _O2  ubl_buffer_segment_raw ( const  float  ( & raw ) [ XYZE ] ,  const  float  & fr )  { 
 
					 
					 
					 
					    inline  void  _O2  ubl_buffer_segment_raw ( const  float  ( & in_raw ) [ XYZE ] ,  const  float  & fr )  { 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      # if ENABLED(SKEW_CORRECTION) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        float  raw [ XYZE ]  =  {  in_raw [ X_AXIS ] ,  in_raw [ Y_AXIS ] ,  in_raw [ Z_AXIS ] ,  in_raw [ E_AXIS ]  } ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        planner . skew ( raw [ X_AXIS ] ,  raw [ Y_AXIS ] ,  raw [ Z_AXIS ] ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      # else 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        const  float  ( & raw ) [ XYZE ]  =  in_raw ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					      # endif 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # if ENABLED(DELTA)   // apply delta inverse_kinematics
 
 
					 
					 
					 
					      # if ENABLED(DELTA)   // apply delta inverse_kinematics
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        DELTA_RAW_IK ( ) ; 
 
					 
					 
					 
					        DELTA_RAW_IK ( ) ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        planner . buffer_segment ( delta [ A_AXIS ] ,  delta [ B_AXIS ] ,  delta [ C_AXIS ] ,  raw [ E_AXIS ] ,  fr ,  active_extruder ) ; 
 
					 
					 
					 
					        planner . buffer_segment ( delta [ A_AXIS ] ,  delta [ B_AXIS ] ,  delta [ C_AXIS ] ,  in_ raw[ E_AXIS ] ,  fr ,  active_extruder ) ; 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # elif IS_SCARA   // apply scara inverse_kinematics (should be changed to save raw->logical->raw)
 
 
					 
					 
					 
					      # elif IS_SCARA   // apply scara inverse_kinematics (should be changed to save raw->logical->raw)
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -429,11 +436,11 @@
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        scara_oldB  =  delta [ B_AXIS ] ; 
 
					 
					 
					 
					        scara_oldB  =  delta [ B_AXIS ] ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        float  s_feedrate  =  max ( adiff ,  bdiff )  *  scara_feed_factor ; 
 
					 
					 
					 
					        float  s_feedrate  =  max ( adiff ,  bdiff )  *  scara_feed_factor ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        planner . buffer_segment ( delta [ A_AXIS ] ,  delta [ B_AXIS ] ,  delta [ C_AXIS ] ,   raw[ E_AXIS ] ,  s_feedrate ,  active_extruder ) ; 
 
					 
					 
					 
					        planner . buffer_segment ( delta [ A_AXIS ] ,  delta [ B_AXIS ] ,  delta [ C_AXIS ] ,  in_ raw[ E_AXIS ] ,  s_feedrate ,  active_extruder ) ; 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # else  // CARTESIAN
 
 
					 
					 
					 
					      # else  // CARTESIAN
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        planner . buffer_segment ( raw [ X_AXIS ] ,  raw [ Y_AXIS ] ,  raw [ Z_AXIS ] ,   raw[ E_AXIS ] ,  fr ,  active_extruder ) ; 
 
					 
					 
					 
					        planner . buffer_segment ( raw [ X_AXIS ] ,  raw [ Y_AXIS ] ,  raw [ Z_AXIS ] ,  in_ raw[ E_AXIS ] ,  fr ,  active_extruder ) ; 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # endif 
 
					 
					 
					 
					      # endif 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    } 
 
					 
					 
					 
					    } 
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -456,19 +463,11 @@
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					     *  Returns  true  if  did  NOT  move ,  false  if  moved  ( requires  current_position  update ) . 
 
					 
					 
					 
					     *  Returns  true  if  did  NOT  move ,  false  if  moved  ( requires  current_position  update ) . 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					     */ 
 
					 
					 
					 
					     */ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    bool  _O2  unified_bed_leveling : : prepare_segmented_line_to ( const  float  ( & in_ target) [ XYZE ] ,  const  float  & feedrate )  { 
 
					 
					 
					 
					    bool  _O2  unified_bed_leveling : : prepare_segmented_line_to ( const  float  ( & r target) [ XYZE ] ,  const  float  & feedrate )  { 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      if  ( ! position_is_reachable ( in_target[ X_AXIS ] ,  in_  target[ Y_AXIS ] ) )   // fail if moving outside reachable boundary
 
 
					 
					 
					 
					      if  ( ! position_is_reachable ( rtarget[ X_AXIS ] ,  r  target[ Y_AXIS ] ) )   // fail if moving outside reachable boundary
 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					        return  true ;  // did not move, so current_position still accurate
 
 
					 
					 
					 
					        return  true ;  // did not move, so current_position still accurate
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # if ENABLED(SKEW_CORRECTION) 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        // For skew correction just adjust the destination point and we're done
 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        float  rtarget [ XYZE ]  =  {  in_target [ X_AXIS ] ,  in_target [ Y_AXIS ] ,  in_target [ Z_AXIS ] ,  in_target [ E_AXIS ]  } ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        planner . skew ( rtarget [ X_AXIS ] ,  rtarget [ Y_AXIS ] ,  rtarget [ Z_AXIS ] ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # else 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        const  float  ( & rtarget ) [ XYZE ]  =  in_target ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # endif 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      const  float  total [ XYZE ]  =  { 
 
					 
					 
					 
					      const  float  total [ XYZE ]  =  { 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        rtarget [ X_AXIS ]  -  current_position [ X_AXIS ] , 
 
					 
					 
					 
					        rtarget [ X_AXIS ]  -  current_position [ X_AXIS ] , 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        rtarget [ Y_AXIS ]  -  current_position [ Y_AXIS ] , 
 
					 
					 
					 
					        rtarget [ Y_AXIS ]  -  current_position [ Y_AXIS ] , 
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -513,10 +512,6 @@
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        current_position [ E_AXIS ] 
 
					 
					 
					 
					        current_position [ E_AXIS ] 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      } ; 
 
					 
					 
					 
					      } ; 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # if ENABLED(SKEW_CORRECTION) 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        planner . skew ( raw [ X_AXIS ] ,  raw [ Y_AXIS ] ,  raw [ Z_AXIS ] ) ; 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      # endif 
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      // Only compute leveling per segment if ubl active and target below z_fade_height.
 
 
					 
					 
					 
					      // Only compute leveling per segment if ubl active and target below z_fade_height.
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					      if  ( ! planner . leveling_active  | |  ! planner . leveling_active_at_z ( rtarget [ Z_AXIS ] ) )  {    // no mesh leveling
 
 
					 
					 
					 
					      if  ( ! planner . leveling_active  | |  ! planner . leveling_active_at_z ( rtarget [ Z_AXIS ] ) )  {    // no mesh leveling
 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        while  ( - - segments )  { 
 
					 
					 
					 
					        while  ( - - segments )  {