@tool class_name ControlPadLocation extends Node3D # Initial transform var _transform : Transform3D # Add support for is_xr_class on XRTools classes func is_xr_class(name : String) -> bool: return name == "ControlPadLocation" # Called when the node enters the scene tree for the first time. func _ready(): # Capture initial transform _transform = transform # Subscribe to world scaling events var hand := XRToolsHand.find_instance(self) if hand: hand.hand_scale_changed.connect(_on_hand_scale_changed) # Handle world scale changing func _on_hand_scale_changed(new_scale : float) -> void: # Scale ourselves (and our children) transform = _transform.scaled(Vector3.ONE * new_scale) ## Find a ControlPadLocation related to the specified node static func find_instance(node : Node) -> ControlPadLocation: return XRTools.find_xr_child( XRHelpers.get_xr_controller(node), "*", "ControlPadLocation") as ControlPadLocation ## Find the left ControlPadLocation related to the specified node static func find_left(node : Node) -> ControlPadLocation: return XRTools.find_xr_child( XRHelpers.get_left_controller(node), "*", "ControlPadLocation") as ControlPadLocation ## Find the right ControlPadLocation related to the specified node static func find_right(node : Node) -> ControlPadLocation: return XRTools.find_xr_child( XRHelpers.get_right_controller(node), "*", "ControlPadLocation") as ControlPadLocation