76 lines
2 KiB
GDScript
76 lines
2 KiB
GDScript
@tool
|
|
@icon("res://addons/godot-xr-tools/editor/icons/rumble.svg")
|
|
class_name XRToolsRumbler
|
|
extends Node
|
|
|
|
## XR Tools Rumbler
|
|
##
|
|
## A node you attach to handle (contain and make easy to activate/cancel)
|
|
## a particular rumble event.
|
|
|
|
## The details of this rumbler
|
|
@export var event: XRToolsRumbleEvent : set = _set_event
|
|
|
|
@export var target: XRNode3D
|
|
|
|
## Activate the event
|
|
func rumble() -> void:
|
|
if is_instance_valid(target):
|
|
XRToolsRumbleManager.add(self, event, [target.tracker])
|
|
|
|
|
|
## Cancel the event
|
|
func cancel() -> void:
|
|
XRToolsRumbleManager.clear(self)
|
|
|
|
|
|
## Rumble on the hand which owns the node
|
|
func rumble_hand(hand_child: Node3D) -> void:
|
|
var hand: XRNode3D = XRHelpers.get_xr_controller(hand_child)
|
|
if is_instance_valid(hand):
|
|
XRToolsRumbleManager.add(self, event, [hand.tracker])
|
|
|
|
|
|
## Cancel rumble for the hand which owns the node
|
|
func cancel_hand(hand_child: Node3D) -> void:
|
|
var hand: XRNode3D = XRHelpers.get_xr_controller(hand_child)
|
|
if is_instance_valid(hand):
|
|
XRToolsRumbleManager.clear(self, [hand.tracker])
|
|
|
|
|
|
## Activate the event, if provided the XR player body
|
|
func rumble_if_player_body(body: Node3D) -> void:
|
|
if is_instance_valid(body) and body is XRToolsPlayerBody:
|
|
rumble()
|
|
|
|
|
|
## Cancel rumble for the event, if provided the XR player body
|
|
func cancel_if_player_body(body: Node3D) -> void:
|
|
if is_instance_valid(body) and body is XRToolsPlayerBody:
|
|
cancel()
|
|
|
|
|
|
## Activate the event during an active pointer event
|
|
func rumble_pointer(event : XRToolsPointerEvent) -> void:
|
|
if event.event_type == XRToolsPointerEvent.Type.PRESSED:
|
|
rumble_hand(event.pointer)
|
|
elif event.event_type == XRToolsPointerEvent.Type.RELEASED:
|
|
cancel_hand(event.pointer)
|
|
|
|
|
|
func _set_event(p_event: XRToolsRumbleEvent) -> void:
|
|
event = p_event
|
|
update_configuration_warnings()
|
|
|
|
|
|
# This method verifies the hand has a valid configuration.
|
|
func _get_configuration_warnings() -> PackedStringArray:
|
|
var warnings := PackedStringArray()
|
|
|
|
# Check hand for animation player
|
|
if not event:
|
|
warnings.append("Rumbler must have a rumble event")
|
|
|
|
# Return warnings
|
|
return warnings
|
|
|