100 lines
2.2 KiB
GDScript
100 lines
2.2 KiB
GDScript
extends Node
|
|
## Logic for the raycast to interact with objects
|
|
|
|
const Initiator = preload ("./initiator.gd")
|
|
|
|
var initiator: Initiator
|
|
var ray: RayCast3D
|
|
|
|
var timespan_click = 400.0
|
|
|
|
var last_collided: Object = null
|
|
var is_pressed := false
|
|
var is_grabbed := false
|
|
var time_pressed := 0.0
|
|
var moved := false
|
|
var click_point := Vector3.ZERO
|
|
|
|
func _init(initiator: Initiator, ray: RayCast3D):
|
|
self.initiator = initiator
|
|
self.ray = ray
|
|
|
|
func _ready():
|
|
initiator.on_press.connect(_on_pressed)
|
|
initiator.on_release.connect(_on_released)
|
|
|
|
func _physics_process(_delta):
|
|
_handle_enter_leave()
|
|
_handle_move()
|
|
|
|
func _handle_move():
|
|
var time_passed = Time.get_ticks_msec() - time_pressed
|
|
if time_passed <= timespan_click||(is_pressed == false&&is_grabbed == false):
|
|
return
|
|
|
|
moved = true
|
|
|
|
# reset if last_collided gets deleted
|
|
if is_instance_valid(last_collided) == false:
|
|
last_collided = null
|
|
return
|
|
|
|
if is_pressed:
|
|
_emit_event("press_move", last_collided)
|
|
|
|
if is_grabbed:
|
|
_emit_event("grab_move", last_collided)
|
|
|
|
func _handle_enter_leave():
|
|
var collider = ray.get_collider()
|
|
|
|
if collider == last_collided||is_grabbed||is_pressed:
|
|
return
|
|
|
|
_emit_event("ray_enter", collider)
|
|
_emit_event("ray_leave", last_collided)
|
|
|
|
last_collided = collider
|
|
|
|
func _on_pressed(type: Initiator.EventType):
|
|
var collider = ray.get_collider()
|
|
|
|
if collider == null:
|
|
return
|
|
|
|
match type:
|
|
Initiator.EventType.TRIGGER:
|
|
is_pressed = true
|
|
time_pressed = Time.get_ticks_msec()
|
|
click_point = ray.get_collision_point()
|
|
_emit_event("press_down", collider)
|
|
Initiator.EventType.GRIP:
|
|
is_grabbed = true
|
|
click_point = ray.get_collision_point()
|
|
_emit_event("grab_down", collider)
|
|
|
|
func _on_released(type: Initiator.EventType):
|
|
match type:
|
|
Initiator.EventType.TRIGGER:
|
|
if is_pressed:
|
|
if moved == false:
|
|
_emit_event("click", last_collided)
|
|
_emit_event("press_up", last_collided)
|
|
is_pressed = false
|
|
last_collided = null
|
|
moved = false
|
|
Initiator.EventType.GRIP:
|
|
if is_grabbed:
|
|
_emit_event("grab_up", last_collided)
|
|
is_grabbed = false
|
|
last_collided = null
|
|
moved = false
|
|
|
|
func _emit_event(type: String, target):
|
|
var event = EventPointer.new()
|
|
event.initiator = initiator
|
|
event.target = target
|
|
event.ray = ray
|
|
|
|
EventSystem.emit(type, event)
|