Found out that my original mouse wrapping code was not working:
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
handle_input_mouse_motion(event as InputEventMouseMotion)
func handle_input_mouse_motion(event: InputEventMouseMotion) -> void:
var window := get_window()
var xform := get_viewport().get_final_transform()
var new_position := get_viewport().get_mouse_position() * xform + event.relative
const margin := 10
var warp := false
if new_position.x < margin:
= true
warp += window.size.x - margin
new_position.x if new_position.x > window.size.x - margin:
= true
warp -= window.size.x - margin
new_position.x if new_position.y < margin:
= true
warp += window.size.y - margin
new_position.y if new_position.y > window.size.y - margin:
= true
warp -= window.size.y - margin
new_position.y
if warp:
warp_mouse(new_position)
Input.= true just_warped
However, if your Viewport
is
letterboxed this would stop working because the
coordinate spaces were not the same. Trying to fix
the existing code wasn't particularly desirable, as
the coordinate spaces were relative to the
Viewport
and I wanted to work in the
space of the window. I was able to do this by using
the DisplayServer
directly:
func handle_input_mouse_motion(event: InputEventMouseMotion) -> void:
var window := Rect2i(
window_get_position(),
DisplayServer.window_get_size()
DisplayServer.
)var new_position := DisplayServer.mouse_get_position()
const margin := 10
var warp := false
if new_position.x < window.position.x + margin:
= true
warp += window.size.x - (margin * 2)
new_position.x elif new_position.x > window.end.x - margin:
= true
warp -= window.size.x - (margin * 2)
new_position.x elif new_position.y < window.position.y + margin:
= true
warp += window.size.y - (margin * 2)
new_position.y elif new_position.y > window.end.y - margin:
= true
warp -= window.size.y - (margin * 2)
new_position.y if warp:
warp_mouse(new_position - window.position)
DisplayServer.= true just_warped