77 lines
2.0 KiB
GDScript
77 lines
2.0 KiB
GDScript
## Input representing the distance changes between two fingers.
|
|
@tool
|
|
class_name GUIDEInputTouchDistance
|
|
extends GUIDEInput
|
|
|
|
var _initial_distance:float = INF
|
|
|
|
# We use the reset call to calculate the distance for this frame
|
|
# so it can serve as reference for the next frame
|
|
func _needs_reset() -> bool:
|
|
return true
|
|
|
|
func _reset():
|
|
var distance = _calculate_distance()
|
|
# update initial distance when input is actuated or stops being actuated
|
|
if is_finite(_initial_distance) != is_finite(distance):
|
|
_initial_distance = distance
|
|
|
|
|
|
func _begin_usage() -> void:
|
|
# subscribe to relevant input events
|
|
_state.touch_state_changed.connect(_refresh)
|
|
_refresh()
|
|
|
|
func _end_usage() -> void:
|
|
# unsubscribe from input events
|
|
_state.touch_state_changed.disconnect(_refresh)
|
|
|
|
|
|
func _refresh() -> void:
|
|
var distance := _calculate_distance()
|
|
# if either current distance or initial distance is not set,
|
|
# we are zero
|
|
if not is_finite(distance) or not is_finite(_initial_distance):
|
|
_value = Vector3.ZERO
|
|
return
|
|
|
|
# we assume that _initial_distance is never 0 because
|
|
# you cannot have two fingers physically at the same place
|
|
# on a touch screen
|
|
_value = Vector3(distance / _initial_distance, 0, 0)
|
|
|
|
|
|
func _calculate_distance() -> float:
|
|
var pos1:Vector2 = _state.get_finger_position(0, 2)
|
|
# if we have no position for first finger, we can immediately abort
|
|
if not pos1.is_finite():
|
|
return INF
|
|
|
|
var pos2:Vector2 = _state.get_finger_position(1, 2)
|
|
# if there is no second finger, we can abort as well
|
|
if not pos2.is_finite():
|
|
return INF
|
|
|
|
# calculate distance for the fingers
|
|
return pos1.distance_to(pos2)
|
|
|
|
|
|
func is_same_as(other:GUIDEInput):
|
|
return other is GUIDEInputTouchDistance
|
|
|
|
|
|
func _to_string():
|
|
return "(GUIDEInputTouchDistance)"
|
|
|
|
|
|
func _editor_name() -> String:
|
|
return "Touch Distance"
|
|
|
|
|
|
func _editor_description() -> String:
|
|
return "Distance of two touching fingers."
|
|
|
|
|
|
func _native_value_type() -> GUIDEAction.GUIDEActionValueType:
|
|
return GUIDEAction.GUIDEActionValueType.AXIS_1D
|