|  |  | @ -104,6 +104,11 @@ float Planner::min_feedrate_mm_s, | 
			
		
	
		
		
			
				
					
					|  |  |  |   matrix_3x3 Planner::bed_level_matrix; // Transform to compensate for bed level
 |  |  |  |   matrix_3x3 Planner::bed_level_matrix; // Transform to compensate for bed level
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   float Planner::z_fade_height = 0.0, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         Planner::inverse_z_fade_height = 0.0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | #if ENABLED(AUTOTEMP) |  |  |  | #if ENABLED(AUTOTEMP) | 
			
		
	
		
		
			
				
					
					|  |  |  |   float Planner::autotemp_max = 250, |  |  |  |   float Planner::autotemp_max = 250, | 
			
		
	
		
		
			
				
					
					|  |  |  |         Planner::autotemp_min = 210, |  |  |  |         Planner::autotemp_min = 210, | 
			
		
	
	
		
		
			
				
					|  |  | @ -531,10 +536,24 @@ void Planner::check_axes_activity() { | 
			
		
	
		
		
			
				
					
					|  |  |  |       if (!abl_enabled) return; |  |  |  |       if (!abl_enabled) return; | 
			
		
	
		
		
			
				
					
					|  |  |  |     #endif |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       static float z_fade_factor = 1.0, last_raw_lz = -999.0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       if (z_fade_height) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         const float raw_lz = RAW_Z_POSITION(lz); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (raw_lz >= z_fade_height) return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (last_raw_lz != raw_lz) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           last_raw_lz = raw_lz; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           z_fade_factor = 1.0 - raw_lz * inverse_z_fade_height; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         z_fade_factor = 1.0; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #if ENABLED(MESH_BED_LEVELING) |  |  |  |     #if ENABLED(MESH_BED_LEVELING) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       if (mbl.active()) |  |  |  |       if (mbl.active()) | 
			
		
	
		
		
			
				
					
					|  |  |  |         lz += mbl.get_z(RAW_X_POSITION(lx), RAW_Y_POSITION(ly)); |  |  |  |         lz += mbl.get_z(RAW_X_POSITION(lx), RAW_Y_POSITION(ly)) * z_fade_factor; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #elif ABL_PLANAR |  |  |  |     #elif ABL_PLANAR | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -551,7 +570,7 @@ void Planner::check_axes_activity() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) |  |  |  |     #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       float tmp[XYZ] = { lx, ly, 0 }; |  |  |  |       float tmp[XYZ] = { lx, ly, 0 }; | 
			
		
	
		
		
			
				
					
					|  |  |  |       lz += bilinear_z_offset(tmp); |  |  |  |       lz += bilinear_z_offset(tmp) * z_fade_factor; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #endif |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
	
		
		
			
				
					|  |  | @ -562,10 +581,20 @@ void Planner::check_axes_activity() { | 
			
		
	
		
		
			
				
					
					|  |  |  |       if (!abl_enabled) return; |  |  |  |       if (!abl_enabled) return; | 
			
		
	
		
		
			
				
					
					|  |  |  |     #endif |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       if (z_fade_height && RAW_Z_POSITION(logical[Z_AXIS]) >= z_fade_height) return; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #if ENABLED(MESH_BED_LEVELING) |  |  |  |     #if ENABLED(MESH_BED_LEVELING) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       if (mbl.active()) |  |  |  |       if (mbl.active()) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           const float c = mbl.get_z(RAW_X_POSITION(logical[X_AXIS]), RAW_Y_POSITION(logical[Y_AXIS])); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           logical[Z_AXIS] = (z_fade_height * (RAW_Z_POSITION(logical[Z_AXIS]) - c)) / (z_fade_height - c); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         #else | 
			
		
	
		
		
			
				
					
					|  |  |  |           logical[Z_AXIS] -= mbl.get_z(RAW_X_POSITION(logical[X_AXIS]), RAW_Y_POSITION(logical[Y_AXIS])); |  |  |  |           logical[Z_AXIS] -= mbl.get_z(RAW_X_POSITION(logical[X_AXIS]), RAW_Y_POSITION(logical[Y_AXIS])); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #elif ABL_PLANAR |  |  |  |     #elif ABL_PLANAR | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -583,7 +612,12 @@ void Planner::check_axes_activity() { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) |  |  |  |     #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         const float c = bilinear_z_offset(logical); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         logical[Z_AXIS] = (z_fade_height * (RAW_Z_POSITION(logical[Z_AXIS]) - c)) / (z_fade_height - c); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       #else | 
			
		
	
		
		
			
				
					
					|  |  |  |         logical[Z_AXIS] -= bilinear_z_offset(logical); |  |  |  |         logical[Z_AXIS] -= bilinear_z_offset(logical); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     #endif |  |  |  |     #endif | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |