immersive-home/addons/godot-xr-tools/events/pointer_event.gd
2023-10-16 19:10:20 +02:00

135 lines
2.4 KiB
GDScript

class_name XRToolsPointerEvent
## Types of pointer events
enum Type {
## Pointer entered target
ENTERED,
## Pointer exited target
EXITED,
## Pointer pressed target
PRESSED,
## Pointer released target
RELEASED,
## Pointer moved on target
MOVED
}
## Type of pointer event
var event_type : Type
## Pointer generating event
var pointer : Node3D
## Target of pointer
var target : Node3D
## Point position
var position : Vector3
## Last point position
var last_position : Vector3
## Initialize a new instance of the XRToolsPointerEvent class
func _init(
p_event_type : Type,
p_pointer : Node3D,
p_target : Node3D,
p_position : Vector3,
p_last_position : Vector3) -> void:
event_type = p_event_type
pointer = p_pointer
target = p_target
position = p_position
last_position = p_last_position
## Report a pointer entered event
static func entered(
pointer : Node3D,
target : Node3D,
at : Vector3) -> void:
report(
XRToolsPointerEvent.new(
Type.ENTERED,
pointer,
target,
at,
at))
## Report pointer moved event
static func moved(
pointer : Node3D,
target : Node3D,
to : Vector3,
from : Vector3) -> void:
report(
XRToolsPointerEvent.new(
Type.MOVED,
pointer,
target,
to,
from))
## Report pointer pressed event
static func pressed(
pointer : Node3D,
target : Node3D,
at : Vector3) -> void:
report(
XRToolsPointerEvent.new(
Type.PRESSED,
pointer,
target,
at,
at))
## Report pointer released event
static func released(
pointer : Node3D,
target : Node3D,
at : Vector3) -> void:
report(
XRToolsPointerEvent.new(
Type.RELEASED,
pointer,
target,
at,
at))
## Report a pointer exited event
static func exited(
pointer : Node3D,
target : Node3D,
last : Vector3) -> void:
report(
XRToolsPointerEvent.new(
Type.EXITED,
pointer,
target,
last,
last))
## Report a pointer event
static func report(event : XRToolsPointerEvent) -> void:
# Fire event on pointer
if is_instance_valid(event.pointer):
if event.pointer.has_signal("pointing_event"):
event.pointer.emit_signal("pointing_event", event)
# Fire event/method on the target if it's valid
if is_instance_valid(event.target):
if event.target.has_signal("pointer_event"):
event.target.emit_signal("pointer_event", event)
elif event.target.has_method("pointer_event"):
event.target.pointer_event(event)