mirror of
https://github.com/Cuteminded/jellyframe.git
synced 2026-10-17 18:00:32 +02:00
This change makes VR pointer input detect horizontal stick movement and emit horizontal mouse-wheel events while preserving vertical scrolling behavior. It also adds a regression test covering carousel scrolling with right and left joystick input.
75 lines
2.2 KiB
GDScript
75 lines
2.2 KiB
GDScript
class_name PointerInput
|
|
extends RefCounted
|
|
|
|
var viewport: SubViewport
|
|
var trigger_down := false
|
|
var just_pressed := false
|
|
var mouse_down := false
|
|
var previous := Vector2(-1, -1)
|
|
var hovering := false
|
|
|
|
func sample_trigger(value: float) -> void:
|
|
var next := value > 0.15 if trigger_down else value >= 0.35
|
|
just_pressed = next and not trigger_down
|
|
trigger_down = next
|
|
|
|
func aim(point: Vector2, inside: bool) -> void:
|
|
if not inside:
|
|
cancel()
|
|
return
|
|
if not hovering:
|
|
hovering = true
|
|
viewport.notify_mouse_entered()
|
|
_move(point)
|
|
if just_pressed:
|
|
if OS.is_debug_build() and OS.get_name() == "Android":
|
|
var hovered := viewport.gui_get_hovered_control()
|
|
print("Jellyframe input: press at ", point.round(), " target=", hovered.get_class() if hovered else "none")
|
|
mouse_down = true
|
|
_button(true)
|
|
elif mouse_down and not trigger_down:
|
|
mouse_down = false
|
|
_button(false)
|
|
|
|
func scroll(point: Vector2, amount: float, horizontal: bool = false) -> void:
|
|
var wheel := InputEventMouseButton.new()
|
|
if horizontal:
|
|
wheel.button_index = MOUSE_BUTTON_WHEEL_RIGHT if amount > 0 else MOUSE_BUTTON_WHEEL_LEFT
|
|
else:
|
|
wheel.button_index = MOUSE_BUTTON_WHEEL_UP if amount > 0 else MOUSE_BUTTON_WHEEL_DOWN
|
|
wheel.pressed = true
|
|
wheel.position = point
|
|
wheel.global_position = point
|
|
wheel.factor = absf(amount)
|
|
viewport.push_input(wheel, true)
|
|
var release := wheel.duplicate() as InputEventMouseButton
|
|
release.pressed = false
|
|
viewport.push_input(release, true)
|
|
|
|
func cancel() -> void:
|
|
if previous != Vector2(-1, -1): _move(Vector2(-1, -1))
|
|
if mouse_down:
|
|
mouse_down = false
|
|
_button(false)
|
|
if hovering:
|
|
hovering = false
|
|
viewport.notify_mouse_exited()
|
|
|
|
func _move(point: Vector2) -> void:
|
|
var motion := InputEventMouseMotion.new()
|
|
motion.position = point
|
|
motion.global_position = point
|
|
motion.relative = point - previous
|
|
motion.button_mask = MOUSE_BUTTON_MASK_LEFT if mouse_down else 0
|
|
previous = point
|
|
viewport.push_input(motion, true)
|
|
|
|
func _button(pressed: bool) -> void:
|
|
var event := InputEventMouseButton.new()
|
|
event.button_index = MOUSE_BUTTON_LEFT
|
|
event.pressed = pressed
|
|
event.button_mask = MOUSE_BUTTON_MASK_LEFT if pressed else 0
|
|
event.position = previous
|
|
event.global_position = previous
|
|
viewport.push_input(event, true)
|