mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 21:51:22 +00:00 
			
		
		
		
	Add an editor setting to invert 3D pan/orbit on the X axis
This also makes the invert Y axis option apply to 3D panning.
This closes #28082.
(cherry picked from commit 2c9d4ef961)
			
			
This commit is contained in:
		
							parent
							
								
									42dca43c50
								
							
						
					
					
						commit
						336bc03d66
					
				
					 2 changed files with 25 additions and 10 deletions
				
			
		|  | @ -2073,7 +2073,12 @@ void SpatialEditorViewport::_nav_pan(Ref<InputEventWithModifiers> p_event, const | |||
| 	camera_transform.translate(cursor.pos); | ||||
| 	camera_transform.basis.rotate(Vector3(1, 0, 0), -cursor.x_rot); | ||||
| 	camera_transform.basis.rotate(Vector3(0, 1, 0), -cursor.y_rot); | ||||
| 	Vector3 translation(-p_relative.x * pan_speed, p_relative.y * pan_speed, 0); | ||||
| 	const bool invert_x_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_x_axis"); | ||||
| 	const bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); | ||||
| 	Vector3 translation( | ||||
| 			(invert_x_axis ? -1 : 1) * -p_relative.x * pan_speed, | ||||
| 			(invert_y_axis ? -1 : 1) * p_relative.y * pan_speed, | ||||
| 			0); | ||||
| 	translation *= cursor.distance / DISTANCE_DEFAULT; | ||||
| 	camera_transform.translate(translation); | ||||
| 	cursor.pos = camera_transform.origin; | ||||
|  | @ -2113,17 +2118,24 @@ void SpatialEditorViewport::_nav_orbit(Ref<InputEventWithModifiers> p_event, con | |||
| 		_menu_option(VIEW_PERSPECTIVE); | ||||
| 	} | ||||
| 
 | ||||
| 	real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity"); | ||||
| 	real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); | ||||
| 	bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); | ||||
| 	const real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity"); | ||||
| 	const real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); | ||||
| 	const bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); | ||||
| 	const bool invert_x_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_x_axis"); | ||||
| 
 | ||||
| 	if (invert_y_axis) { | ||||
| 		cursor.x_rot -= p_relative.y * radians_per_pixel; | ||||
| 	} else { | ||||
| 		cursor.x_rot += p_relative.y * radians_per_pixel; | ||||
| 	} | ||||
| 	cursor.y_rot += p_relative.x * radians_per_pixel; | ||||
| 	// Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented.
 | ||||
| 	cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57); | ||||
| 
 | ||||
| 	if (invert_x_axis) { | ||||
| 		cursor.y_rot -= p_relative.x * radians_per_pixel; | ||||
| 	} else { | ||||
| 		cursor.y_rot += p_relative.x * radians_per_pixel; | ||||
| 	} | ||||
| 	name = ""; | ||||
| 	_update_name(); | ||||
| } | ||||
|  | @ -2139,21 +2151,23 @@ void SpatialEditorViewport::_nav_look(Ref<InputEventWithModifiers> p_event, cons | |||
| 		_menu_option(VIEW_PERSPECTIVE); | ||||
| 	} | ||||
| 
 | ||||
| 	real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity"); | ||||
| 	real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); | ||||
| 	bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); | ||||
| 	const real_t degrees_per_pixel = EditorSettings::get_singleton()->get("editors/3d/navigation_feel/orbit_sensitivity"); | ||||
| 	const real_t radians_per_pixel = Math::deg2rad(degrees_per_pixel); | ||||
| 	const bool invert_y_axis = EditorSettings::get_singleton()->get("editors/3d/navigation/invert_y_axis"); | ||||
| 
 | ||||
| 	// Note: do NOT assume the camera has the "current" transform, because it is interpolated and may have "lag".
 | ||||
| 	Transform prev_camera_transform = to_camera_transform(cursor); | ||||
| 	const Transform prev_camera_transform = to_camera_transform(cursor); | ||||
| 
 | ||||
| 	if (invert_y_axis) { | ||||
| 		cursor.x_rot -= p_relative.y * radians_per_pixel; | ||||
| 	} else { | ||||
| 		cursor.x_rot += p_relative.y * radians_per_pixel; | ||||
| 	} | ||||
| 	cursor.y_rot += p_relative.x * radians_per_pixel; | ||||
| 	// Clamp the Y rotation to roughly -90..90 degrees so the user can't look upside-down and end up disoriented.
 | ||||
| 	cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57); | ||||
| 
 | ||||
| 	cursor.y_rot += p_relative.x * radians_per_pixel; | ||||
| 
 | ||||
| 	// Look is like the opposite of Orbit: the focus point rotates around the camera
 | ||||
| 	Transform camera_transform = to_camera_transform(cursor); | ||||
| 	Vector3 pos = camera_transform.xform(Vector3(0, 0, 0)); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Hugo Locurcio
						Hugo Locurcio