Use InputEventMouseMotion.screen_relative where relevant in all demos (#1232)

This provides mouse sensitivity that is independent of the viewport
size, without needing to query for project settings.

This also inverts the mouse motion direction in the 3D navigation demo
to better match expectations, and increases mouse sensitivity in the
Window Management demo to be closer to other demos.
This commit is contained in:
Hugo Locurcio
2025-10-02 03:54:19 +02:00
committed by GitHub
parent bdc33d1568
commit 5f4a9e409f
21 changed files with 38 additions and 51 deletions

View File

@@ -8,7 +8,7 @@ var glow_map := preload("res://glow_map.webp")
func _unhandled_input(event: InputEvent) -> void: func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseMotion and event.button_mask > 0: if event is InputEventMouseMotion and event.button_mask > 0:
cave.position.x = clampf(cave.position.x + event.relative.x, -CAVE_LIMIT, 0) cave.position.x = clampf(cave.position.x + event.screen_relative.x, -CAVE_LIMIT, 0)
if event.is_action_pressed("toggle_glow_map"): if event.is_action_pressed("toggle_glow_map"):
if $WorldEnvironment.environment.glow_map: if $WorldEnvironment.environment.glow_map:

View File

@@ -8,7 +8,6 @@ var tester_index := 0
var rot_x := -TAU / 16 # This must be kept in sync with RotationX. var rot_x := -TAU / 16 # This must be kept in sync with RotationX.
var rot_y := TAU / 8 # This must be kept in sync with CameraHolder. var rot_y := TAU / 8 # This must be kept in sync with CameraHolder.
var camera_distance := 2.0 var camera_distance := 2.0
var base_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var testers: Node3D = $Testers @onready var testers: Node3D = $Testers
@onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y. @onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y.
@@ -40,8 +39,8 @@ func _unhandled_input(event: InputEvent) -> void:
camera_distance = clamp(camera_distance, 1.5, 6) camera_distance = clamp(camera_distance, 1.5, 6)
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED
rot_x = clamp(rot_x, -1.57, 0) rot_x = clamp(rot_x, -1.57, 0)

View File

@@ -8,7 +8,6 @@ var tester_index := 0
var rot_x := -TAU / 16 # This must be kept in sync with RotationX. var rot_x := -TAU / 16 # This must be kept in sync with RotationX.
var rot_y := TAU / 8 # This must be kept in sync with CameraHolder. var rot_y := TAU / 8 # This must be kept in sync with CameraHolder.
var camera_distance := 4.0 var camera_distance := 4.0
var base_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var testers: Node3D = $Testers @onready var testers: Node3D = $Testers
@onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y. @onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y.
@@ -35,8 +34,8 @@ func _unhandled_input(event: InputEvent) -> void:
camera_distance = clamp(camera_distance, 1.5, 6) camera_distance = clamp(camera_distance, 1.5, 6)
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED
rot_x = clamp(rot_x, -1.57, 0) rot_x = clamp(rot_x, -1.57, 0)

View File

@@ -8,7 +8,6 @@ var tester_index := 0
var rot_x := deg_to_rad(-22.5) # This must be kept in sync with RotationX. var rot_x := deg_to_rad(-22.5) # This must be kept in sync with RotationX.
var rot_y := deg_to_rad(90) # This must be kept in sync with CameraHolder. var rot_y := deg_to_rad(90) # This must be kept in sync with CameraHolder.
var zoom := 1.5 var zoom := 1.5
var base_height: = int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var testers: Node3D = $Testers @onready var testers: Node3D = $Testers
@onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y. @onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y.
@@ -49,8 +48,8 @@ func _unhandled_input(event: InputEvent) -> void:
zoom = clampf(zoom, 1.5, 4) zoom = clampf(zoom, 1.5, 4)
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED
rot_x = clampf(rot_x, deg_to_rad(-90), 0) rot_x = clampf(rot_x, deg_to_rad(-90), 0)

View File

@@ -14,9 +14,9 @@ func _input(event: InputEvent) -> void:
# Mouse look (only if the mouse is captured). # Mouse look (only if the mouse is captured).
if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
# Horizontal mouse look. # Horizontal mouse look.
rot.y -= event.relative.x * MOUSE_SENSITIVITY rot.y -= event.screen_relative.x * MOUSE_SENSITIVITY
# Vertical mouse look. # Vertical mouse look.
rot.x = clamp(rot.x - event.relative.y * MOUSE_SENSITIVITY, -1.57, 1.57) rot.x = clamp(rot.x - event.screen_relative.y * MOUSE_SENSITIVITY, -1.57, 1.57)
transform.basis = Basis.from_euler(rot) transform.basis = Basis.from_euler(rot)
if event.is_action_pressed("toggle_mouse_capture"): if event.is_action_pressed("toggle_mouse_capture"):

View File

@@ -204,8 +204,8 @@ func process_movement(delta):
# Mouse based camera movement # Mouse based camera movement
func _input(event): func _input(event):
if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
rotate_y(deg_to_rad(event.relative.x * MOUSE_SENSITIVITY * -1)) rotate_y(deg_to_rad(event.screen_relative.x * MOUSE_SENSITIVITY * -1))
camera_holder.rotate_x(deg_to_rad(event.relative.y * MOUSE_SENSITIVITY)) camera_holder.rotate_x(deg_to_rad(event.screen_relative.y * MOUSE_SENSITIVITY))
# We need to clamp the camera's rotation so we cannot rotate ourselves upside down # We need to clamp the camera's rotation so we cannot rotate ourselves upside down
var camera_rot = camera_holder.rotation_degrees var camera_rot = camera_holder.rotation_degrees

View File

@@ -8,7 +8,6 @@ var tester_index := 0
var rot_x := -TAU / 16 # This must be kept in sync with RotationX. var rot_x := -TAU / 16 # This must be kept in sync with RotationX.
var rot_y := TAU / 8 # This must be kept in sync with CameraHolder. var rot_y := TAU / 8 # This must be kept in sync with CameraHolder.
var camera_distance := 2.0 var camera_distance := 2.0
var base_height: = int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var testers: Node3D = $Testers @onready var testers: Node3D = $Testers
@onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y. @onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y.
@@ -36,8 +35,8 @@ func _unhandled_input(event: InputEvent) -> void:
camera_distance = clamp(camera_distance, 1.5, 6) camera_distance = clamp(camera_distance, 1.5, 6)
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED
rot_x = clamp(rot_x, -1.57, 0) rot_x = clamp(rot_x, -1.57, 0)

View File

@@ -8,7 +8,6 @@ var tester_index := 0
var rot_x := deg_to_rad(-22.5) # This must be kept in sync with RotationX. var rot_x := deg_to_rad(-22.5) # This must be kept in sync with RotationX.
var rot_y := deg_to_rad(90) # This must be kept in sync with CameraHolder. var rot_y := deg_to_rad(90) # This must be kept in sync with CameraHolder.
var zoom := 2.5 var zoom := 2.5
var base_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var testers: Node3D = $Testers @onready var testers: Node3D = $Testers
@onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y. @onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y.
@@ -36,8 +35,8 @@ func _unhandled_input(event: InputEvent) -> void:
zoom = clamp(zoom, 1.5, 4) zoom = clamp(zoom, 1.5, 4)
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED
rot_x = clamp(rot_x, deg_to_rad(-90), 0) rot_x = clamp(rot_x, deg_to_rad(-90), 0)

View File

@@ -10,7 +10,6 @@ var tester_index := 0
var rot_x := -0.5 # This must be kept in sync with RotationX. var rot_x := -0.5 # This must be kept in sync with RotationX.
var rot_y := -0.5 # This must be kept in sync with CameraHolder. var rot_y := -0.5 # This must be kept in sync with CameraHolder.
var zoom := 5.0 var zoom := 5.0
var base_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
var backgrounds: Array[Dictionary] = [ var backgrounds: Array[Dictionary] = [
{ path = "res://backgrounds/schelde.hdr", name = "Riverside" }, { path = "res://backgrounds/schelde.hdr", name = "Riverside" },
@@ -49,8 +48,8 @@ func _unhandled_input(event: InputEvent) -> void:
camera.position.z = zoom camera.position.z = zoom
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_y = clamp(rot_y, -1.95, 1.95) rot_y = clamp(rot_y, -1.95, 1.95)
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED

View File

@@ -24,5 +24,5 @@ func _unhandled_input(event: InputEvent) -> void:
elif event is InputEventMouseMotion: elif event is InputEventMouseMotion:
if event.button_mask & (MOUSE_BUTTON_MASK_MIDDLE + MOUSE_BUTTON_MASK_RIGHT): if event.button_mask & (MOUSE_BUTTON_MASK_MIDDLE + MOUSE_BUTTON_MASK_RIGHT):
_cam_rotation += event.relative.x * 0.005 _cam_rotation -= event.screen_relative.x * 0.005
$CameraBase.set_rotation(Vector3.UP * _cam_rotation) $CameraBase.set_rotation(Vector3.UP * _cam_rotation)

View File

@@ -14,9 +14,9 @@ func _input(event: InputEvent) -> void:
# Mouse look (only if the mouse is captured). # Mouse look (only if the mouse is captured).
if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
# Horizontal mouse look. # Horizontal mouse look.
rot.y -= event.relative.x * MOUSE_SENSITIVITY rot.y -= event.screen_relative.x * MOUSE_SENSITIVITY
# Vertical mouse look. # Vertical mouse look.
rot.x = clamp(rot.x - event.relative.y * MOUSE_SENSITIVITY, -1.57, 1.57) rot.x = clamp(rot.x - event.screen_relative.y * MOUSE_SENSITIVITY, -1.57, 1.57)
transform.basis = Basis.from_euler(rot) transform.basis = Basis.from_euler(rot)
if event.is_action_pressed("toggle_mouse_capture"): if event.is_action_pressed("toggle_mouse_capture"):

View File

@@ -8,7 +8,6 @@ var tester_index := 0
var rot_x := deg_to_rad(-22.5) # This must be kept in sync with RotationX. var rot_x := deg_to_rad(-22.5) # This must be kept in sync with RotationX.
var rot_y := deg_to_rad(90) # This must be kept in sync with CameraHolder. var rot_y := deg_to_rad(90) # This must be kept in sync with CameraHolder.
var zoom := 2.5 var zoom := 2.5
var base_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var testers: Node3D = $Testers @onready var testers: Node3D = $Testers
@onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y. @onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y.
@@ -35,8 +34,8 @@ func _unhandled_input(event: InputEvent) -> void:
zoom = clamp(zoom, 1.5, 4) zoom = clamp(zoom, 1.5, 4)
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED
rot_x = clamp(rot_x, deg_to_rad(-90), 0) rot_x = clamp(rot_x, deg_to_rad(-90), 0)

View File

@@ -20,7 +20,7 @@ func _unhandled_input(event: InputEvent) -> void:
return return
if event is InputEventMouseMotion: if event is InputEventMouseMotion:
var rotation_delta: float = event.relative.x var rotation_delta: float = event.screen_relative.x
_rotation_pivot.rotate(Vector3.UP, -rotation_delta * ROTATION_COEFF) _rotation_pivot.rotate(Vector3.UP, -rotation_delta * ROTATION_COEFF)

View File

@@ -8,7 +8,6 @@ var tester_index := 0
var rot_x := deg_to_rad(-22.5) # This must be kept in sync with RotationX. var rot_x := deg_to_rad(-22.5) # This must be kept in sync with RotationX.
var rot_y := deg_to_rad(90) # This must be kept in sync with CameraHolder. var rot_y := deg_to_rad(90) # This must be kept in sync with CameraHolder.
var zoom := 2.5 var zoom := 2.5
var base_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var testers: Node3D = $Testers @onready var testers: Node3D = $Testers
@onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y. @onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y.
@@ -35,8 +34,8 @@ func _unhandled_input(event: InputEvent) -> void:
zoom = clampf(zoom, 1.5, 4) zoom = clampf(zoom, 1.5, 4)
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED
rot_x = clampf(rot_x, deg_to_rad(-90), 0) rot_x = clampf(rot_x, deg_to_rad(-90), 0)

View File

@@ -8,7 +8,6 @@ var tester_index := 0
var rot_x := -TAU / 16 # This must be kept in sync with RotationX. var rot_x := -TAU / 16 # This must be kept in sync with RotationX.
var rot_y := TAU / 6 # This must be kept in sync with CameraHolder. var rot_y := TAU / 6 # This must be kept in sync with CameraHolder.
var camera_distance := 3.4 var camera_distance := 3.4
var base_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var testers: Node3D = $Testers @onready var testers: Node3D = $Testers
@onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y. @onready var camera_holder: Node3D = $CameraHolder # Has a position and rotates on Y.
@@ -36,8 +35,8 @@ func _unhandled_input(event: InputEvent) -> void:
camera_distance = clamp(camera_distance, 1.5, 6) camera_distance = clamp(camera_distance, 1.5, 6)
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED
rot_x = clamp(rot_x, -1.57, 0) rot_x = clamp(rot_x, -1.57, 0)

View File

@@ -36,9 +36,9 @@ func _input(event: InputEvent) -> void:
# Mouse look (only if the mouse is captured). # Mouse look (only if the mouse is captured).
if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
# Horizontal mouse look. # Horizontal mouse look.
rot.y -= event.relative.x * MOUSE_SENSITIVITY rot.y -= event.screen_relative.x * MOUSE_SENSITIVITY
# Vertical mouse look. # Vertical mouse look.
rot.x = clamp(rot.x - event.relative.y * MOUSE_SENSITIVITY, -1.57, 1.57) rot.x = clamp(rot.x - event.screen_relative.y * MOUSE_SENSITIVITY, -1.57, 1.57)
transform.basis = Basis.from_euler(rot) transform.basis = Basis.from_euler(rot)
if event.is_action_pressed("toggle_mouse_capture"): if event.is_action_pressed("toggle_mouse_capture"):

View File

@@ -112,7 +112,7 @@ func _physics_process(delta: float) -> void:
func _input(event: InputEvent) -> void: func _input(event: InputEvent) -> void:
if event is InputEventMouseMotion: if event is InputEventMouseMotion:
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
_mouse_motion += event.relative _mouse_motion += event.screen_relative
func chunk_pos() -> Vector3i: func chunk_pos() -> Vector3i:

View File

@@ -14,9 +14,9 @@ func _input(event: InputEvent) -> void:
# Mouse look (only if the mouse is captured). # Mouse look (only if the mouse is captured).
if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
# Horizontal mouse look. # Horizontal mouse look.
rot.y -= event.relative.x * MOUSE_SENSITIVITY rot.y -= event.screen_relative.x * MOUSE_SENSITIVITY
# Vertical mouse look. # Vertical mouse look.
rot.x = clamp(rot.x - event.relative.y * MOUSE_SENSITIVITY, -1.57, 1.57) rot.x = clamp(rot.x - event.screen_relative.y * MOUSE_SENSITIVITY, -1.57, 1.57)
transform.basis = Basis.from_euler(rot) transform.basis = Basis.from_euler(rot)
if event.is_action_pressed(&"toggle_mouse_capture"): if event.is_action_pressed(&"toggle_mouse_capture"):

View File

@@ -11,8 +11,6 @@ const MAIN_BUTTONS = MOUSE_BUTTON_MASK_LEFT | MOUSE_BUTTON_MASK_MIDDLE | MOUSE_B
@export var rigid_body: RigidBody3D @export var rigid_body: RigidBody3D
@onready var zoom := camera.position.z @onready var zoom := camera.position.z
var base_height: int = ProjectSettings.get_setting("display/window/size/viewport_height")
@onready var rot_x := rotation_x.rotation.x @onready var rot_x := rotation_x.rotation.x
@onready var rot_y := camera_holder.rotation.y @onready var rot_y := camera_holder.rotation.y
@@ -42,8 +40,8 @@ func _input(event: InputEvent) -> void:
camera.position.z = zoom camera.position.z = zoom
if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS: if event is InputEventMouseMotion and event.button_mask & MAIN_BUTTONS:
# Compensate motion speed to be resolution-independent (based on the window height). # Use `screen_relative` to make mouse sensitivity independent of viewport resolution.
var relative_motion: Vector2 = event.relative * DisplayServer.window_get_size().y / base_height var relative_motion: Vector2 = event.screen_relative
rot_y -= relative_motion.x * ROT_SPEED rot_y -= relative_motion.x * ROT_SPEED
rot_x -= relative_motion.y * ROT_SPEED rot_x -= relative_motion.y * ROT_SPEED
rot_x = clampf(rot_x, -1.4, 0.16) rot_x = clampf(rot_x, -1.4, 0.16)

View File

@@ -5,11 +5,11 @@ enum State {
GRAB, GRAB,
} }
const MOUSE_SENSITIVITY = 3.0
var r_pos := Vector2() var r_pos := Vector2()
var state := State.MENU var state := State.MENU
var initial_viewport_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
@onready var camera: Camera3D = $Camera3D @onready var camera: Camera3D = $Camera3D
func _process(delta: float) -> void: func _process(delta: float) -> void:
@@ -32,9 +32,8 @@ func _process(delta: float) -> void:
func _input(event: InputEvent) -> void: func _input(event: InputEvent) -> void:
if event is InputEventMouseMotion: if event is InputEventMouseMotion:
# Scale mouse sensitivity according to resolution, so that effective mouse sensitivity # Use `screen_relative` to make sensitivity independent of the viewport resolution.
# doesn't change depending on the viewport size. r_pos = -event.screen_relative * MOUSE_SENSITIVITY
r_pos = -event.relative * (get_viewport().size.y / initial_viewport_height)
if event.is_action("ui_cancel") and event.is_pressed() and not event.is_echo(): if event.is_action("ui_cancel") and event.is_pressed() and not event.is_echo():
if state == State.GRAB: if state == State.GRAB:

View File

@@ -31,7 +31,6 @@ extends Node3D
@onready var camera1: Camera3D = viewport1.get_node(^"Camera1") @onready var camera1: Camera3D = viewport1.get_node(^"Camera1")
@onready var camera2: Camera3D = viewport2.get_node(^"Camera2") @onready var camera2: Camera3D = viewport2.get_node(^"Camera2")
var viewport_base_height := int(ProjectSettings.get_setting("display/window/size/viewport_height"))
func _ready() -> void: func _ready() -> void:
_on_size_changed() _on_size_changed()