diff --git a/addons/godot-xr-tools/functions/function_pickup.gd b/addons/godot-xr-tools/functions/function_pickup.gd index 3452457..0d0d1bd 100644 --- a/addons/godot-xr-tools/functions/function_pickup.gd +++ b/addons/godot-xr-tools/functions/function_pickup.gd @@ -41,6 +41,9 @@ class CopiedCollision extends RefCounted: ## Grip controller axis @export var pickup_axis_action : String = "grip" +## Trigger Controller axis +@export var pickup_axis_action_trigger : String = "trigger" + ## Action controller button @export var action_button_action : String = "trigger_click" @@ -76,6 +79,8 @@ var closest_object : Node3D = null var picked_up_object : Node3D = null var picked_up_ranged : bool = false var grip_pressed : bool = false +var trigger_value : float = 0 +var grip_value_public : float = 0 #Used to trick the movement_world_grab # Private fields var _object_in_grab_area := Array() @@ -162,8 +167,12 @@ func _process(delta): if !enabled or !_controller.get_is_active(): return + #Apply the public values to trick the movement script + grip_value_public = _controller.get_float(pickup_axis_action) + # Handle our grip - var grip_value = _controller.get_float(pickup_axis_action) + #var grip_value = grip_value_public + var grip_value = _controller.get_float(pickup_axis_action_trigger) if (grip_pressed and grip_value < (_grip_threshold - 0.1)): grip_pressed = false _on_grip_release() diff --git a/addons/godot-xr-tools/functions/movement_world_grab.gd b/addons/godot-xr-tools/functions/movement_world_grab.gd index 7b63c1a..22b917a 100644 --- a/addons/godot-xr-tools/functions/movement_world_grab.gd +++ b/addons/godot-xr-tools/functions/movement_world_grab.gd @@ -31,6 +31,17 @@ signal player_world_grab_end @export var world_scale_max := 2.0 +## Grip controller axis +#@export var pickup_axis_action : String = "grip" + +##GPT stuff +var _left_grab_origin : Vector3 = Vector3.ZERO +var _right_grab_origin : Vector3 = Vector3.ZERO +var _is_left_grabbing : bool = false +var _is_right_grabbing : bool = false + + + # Left world-grab handle var _left_handle : Node3D @@ -87,35 +98,61 @@ func physics_movement(delta: float, player_body: XRToolsPlayerBody, disabled: bo player_body.velocity = Vector3.ZERO # Check for world-grab handles being deleted while held - if not is_instance_valid(_left_handle): - _left_handle = null - if not is_instance_valid(_right_handle): - _right_handle = null + #if not is_instance_valid(_left_handle): + #_left_handle = null + #if not is_instance_valid(_right_handle): + #_right_handle = null - # Disable world-grab movement if not holding the world - if not _left_handle and not _right_handle: + if _left_pickup_node.grip_value_public < 0.8: + _is_left_grabbing = false + + if _right_pickup_node.grip_value_public < 0.8: + _is_right_grabbing = false + if (not _right_pickup_node.grip_value_public > 0.9 and not _left_pickup_node.grip_value_public > 0.9): _set_world_grab_moving(false) return + # Disable world-grab movement if not holding the world + #if not _left_handle and not _right_handle: + # _set_world_grab_moving(false) + # return + # World grabbed _set_world_grab_moving(true) + + #GPT welcome to shity code + #Replacing the left and right world handles with the positions when the controller is grabbed + if _left_pickup_node.grip_value_public > 0.9 and not _is_left_grabbing: + _left_grab_origin = _left_controller.global_position + _is_left_grabbing = true + if _right_pickup_node.grip_value_public > 0.9 and not _is_right_grabbing: + _right_grab_origin = _right_controller.global_position + _is_right_grabbing = true + + # Handle world-grab movement var offset := Vector3.ZERO - if _left_handle and not _right_handle: + #if _left_handle and not _right_handle: + if _is_left_grabbing and not _is_right_grabbing: # Left-hand movement only var left_pickup_pos := _left_controller.global_position - var left_grab_pos := _left_handle.global_position + #var left_grab_pos := _left_handle.global_position + var left_grab_pos := _left_grab_origin offset = left_pickup_pos - left_grab_pos - elif _right_handle and not _left_handle: + #if _right_handle and not _left_handle: + elif _is_right_grabbing and not _is_left_grabbing: # Right-hand movement only var right_pickup_pos := _right_controller.global_position - var right_grab_pos := _right_handle.global_position + #var right_grab_pos := _right_handle.global_position + var right_grab_pos := _right_grab_origin offset = right_pickup_pos - right_grab_pos else: # Get the world-grab handle positions - var left_grab_pos := _left_handle.global_position - var right_grab_pos := _right_handle.global_position + #var left_grab_pos := _left_handle.global_position + #var right_grab_pos := _right_handle.global_position + var left_grab_pos := _left_grab_origin + var right_grab_pos := _right_grab_origin var grab_l2r := (right_grab_pos - left_grab_pos).slide(player_body.up_player) var grab_mid := (left_grab_pos + right_grab_pos) * 0.5 @@ -168,6 +205,7 @@ func _set_world_grab_moving(active: bool) -> void: ## Handler for left controller picked up func _on_left_picked_up(what : Node3D) -> void: # Get the world-grab area + return var world_grab_area = what as XRToolsWorldGrabArea if not world_grab_area: return @@ -181,6 +219,7 @@ func _on_left_picked_up(what : Node3D) -> void: ## Handler for right controller picked up func _on_right_picked_up(what : Node3D) -> void: # Get the world-grab area + return var world_grab_area = what as XRToolsWorldGrabArea if not world_grab_area: return