|  |  | @ -4332,45 +4332,34 @@ inline void gcode_G28() { | 
			
		
	
		
		
			
				
					
					|  |  |  |         // Correct the current XYZ position based on the tilted plane.
 |  |  |  |         // Correct the current XYZ position based on the tilted plane.
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         //
 |  |  |  |         //
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // 1. Get the distance from the current position to the reference point.
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         float x_dist = RAW_CURRENT_POSITION(X_AXIS) - X_TILT_FULCRUM, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |               y_dist = RAW_CURRENT_POSITION(Y_AXIS) - Y_TILT_FULCRUM, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |               z_real = current_position[Z_AXIS], |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |               z_zero = 0; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         #if ENABLED(DEBUG_LEVELING_FEATURE) |  |  |  |         #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
		
			
				
					
					|  |  |  |           if (DEBUGGING(LEVELING)) DEBUG_POS("G29 uncorrected XYZ", current_position); |  |  |  |           if (DEBUGGING(LEVELING)) DEBUG_POS("G29 uncorrected XYZ", current_position); | 
			
		
	
		
		
			
				
					
					|  |  |  |         #endif |  |  |  |         #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         matrix_3x3 inverse = matrix_3x3::transpose(planner.bed_level_matrix); |  |  |  |         float converted[XYZ]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |         memcpy(converted, current_position, sizeof(converted)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         // 2. Apply the inverse matrix to the distance
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         //    from the reference point to X, Y, and zero.
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         apply_rotation_xyz(inverse, x_dist, y_dist, z_zero); |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // 3. Get the matrix-based corrected Z.
 |  |  |  |         planner.abl_enabled = true; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         //    (Even if not used, get it for comparison.)
 |  |  |  |         planner.unapply_leveling(converted); // use conversion machinery
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         float new_z = z_real + z_zero; |  |  |  |         planner.abl_enabled = false; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // 4. Use the last measured distance to the bed, if possible
 |  |  |  |         // Use the last measured distance to the bed, if possible
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         if ( NEAR(current_position[X_AXIS], xProbe - (X_PROBE_OFFSET_FROM_EXTRUDER)) |  |  |  |         if ( NEAR(current_position[X_AXIS], xProbe - (X_PROBE_OFFSET_FROM_EXTRUDER)) | 
			
		
	
		
		
			
				
					
					|  |  |  |           && NEAR(current_position[Y_AXIS], yProbe - (Y_PROBE_OFFSET_FROM_EXTRUDER)) |  |  |  |           && NEAR(current_position[Y_AXIS], yProbe - (Y_PROBE_OFFSET_FROM_EXTRUDER)) | 
			
		
	
		
		
			
				
					
					|  |  |  |         ) { |  |  |  |         ) { | 
			
		
	
		
		
			
				
					
					|  |  |  |           float simple_z = z_real - (measured_z - (-zprobe_zoffset)); |  |  |  |           float simple_z = current_position[Z_AXIS] - (measured_z - (-zprobe_zoffset)); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |           #if ENABLED(DEBUG_LEVELING_FEATURE) |  |  |  |           #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (DEBUGGING(LEVELING)) { |  |  |  |             if (DEBUGGING(LEVELING)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |               SERIAL_ECHOPAIR("Z from Probe:", simple_z); |  |  |  |               SERIAL_ECHOPAIR("Z from Probe:", simple_z); | 
			
		
	
		
		
			
				
					
					|  |  |  |               SERIAL_ECHOPAIR("  Matrix:", new_z); |  |  |  |               SERIAL_ECHOPAIR("  Matrix:", converted[Z_AXIS]); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |               SERIAL_ECHOLNPAIR("  Discrepancy:", simple_z - new_z); |  |  |  |               SERIAL_ECHOLNPAIR("  Discrepancy:", simple_z - converted[Z_AXIS]); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |           #endif |  |  |  |           #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |           new_z = simple_z; |  |  |  |           converted[Z_AXIS] = simple_z; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         // 5. The rotated XY and corrected Z are now current_position
 |  |  |  |         // The rotated XY and corrected Z are now current_position
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         current_position[X_AXIS] = LOGICAL_X_POSITION(x_dist) + X_TILT_FULCRUM; |  |  |  |         memcpy(current_position, converted, sizeof(converted)); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         current_position[Y_AXIS] = LOGICAL_Y_POSITION(y_dist) + Y_TILT_FULCRUM; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         current_position[Z_AXIS] = new_z; |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         #if ENABLED(DEBUG_LEVELING_FEATURE) |  |  |  |         #if ENABLED(DEBUG_LEVELING_FEATURE) | 
			
		
	
		
		
			
				
					
					|  |  |  |           if (DEBUGGING(LEVELING)) DEBUG_POS("G29 corrected XYZ", current_position); |  |  |  |           if (DEBUGGING(LEVELING)) DEBUG_POS("G29 corrected XYZ", current_position); | 
			
		
	
	
		
		
			
				
					|  |  | 
 |