diff --git a/app/content/ui/components/slider/slider.gd b/app/content/ui/components/slider/slider.gd index 435d79c..9c4969e 100644 --- a/app/content/ui/components/slider/slider.gd +++ b/app/content/ui/components/slider/slider.gd @@ -65,6 +65,9 @@ class_name Slider3D @onready var cutout_end_right: CSGCylinder3D = $Rod/Cutout/EndRight @onready var label: Label3D = $Label +@onready var body_collision_shape: CollisionShape3D = $CollisionBody/CollisionShape3D +@onready var area_collision_shape: CollisionShape3D = $Area3D/CollisionShape3D + @onready var slider_knob: MeshInstance3D = $Knob signal on_value_changed(value: float) @@ -84,6 +87,9 @@ func _on_press_down(event: EventPointer): func _on_press_move(event: EventPointer): _handle_press(event) +func _on_touch_enter(event: EventTouch): + _handle_touch(event) + func _get_slider_min_max(): var cutout_radius = (size.z - cutout_border * 2) / 2 @@ -109,6 +115,18 @@ func _handle_press(event: EventPointer): value = lerp(min, max, click_percent) +func _handle_touch(event: EventTouch): + + var click_pos = to_local(event.fingers[0].area.global_position) + + var min_max = _get_slider_min_max() + + var pos_x = clamp(click_pos.x, min_max.x, min_max.y) + + var click_percent = inverse_lerp(min_max.x, min_max.y, pos_x) + + value = lerp(min, max, click_percent) + func _update_slider(): var min_max = _get_slider_min_max() @@ -119,6 +137,10 @@ func _update_slider(): func _update_shape(): outside_rod.size = size + body_collision_shape.shape.size = size * 0.01 + area_collision_shape.shape.size = Vector3(size.x, size.y * 2, size.z) * 0.01 + area_collision_shape.position = Vector3(0, size.y, 0) * 0.01 + var cutout_width = size.z - cutout_border * 2 cutout_box.size = Vector3( diff --git a/app/content/ui/components/slider/slider.tscn b/app/content/ui/components/slider/slider.tscn index d20d16c..84a9e0f 100644 --- a/app/content/ui/components/slider/slider.tscn +++ b/app/content/ui/components/slider/slider.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=6 format=3 uid="uid://pk5k1q8bx0rj"] +[gd_scene load_steps=7 format=3 uid="uid://pk5k1q8bx0rj"] [ext_resource type="Script" path="res://content/ui/components/slider/slider.gd" id="1_ylune"] @@ -19,6 +19,9 @@ height = 0.005 [sub_resource type="BoxShape3D" id="BoxShape3D_h1mn1"] size = Vector3(0.2, 0.004, 0.01) +[sub_resource type="BoxShape3D" id="BoxShape3D_s64dk"] +size = Vector3(0.2, 0.008, 0.01) + [node name="Slider" type="Node3D"] script = ExtResource("1_ylune") size = Vector3(20, 0.4, 1) @@ -79,3 +82,11 @@ text = "0.2 " font_size = 10 outline_size = 4 horizontal_alignment = 0 + +[node name="Area3D" type="Area3D" parent="."] +collision_layer = 4 +collision_mask = 4 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.004, 0) +shape = SubResource("BoxShape3D_s64dk")