Stand and holder

This commit is contained in:
Rendo 2026-01-30 12:35:41 +05:00
commit b7ce36ffd0
15 changed files with 408 additions and 1 deletions

View file

@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="Draggable" format=3 uid="uid://cm2is1qooywkf"]
[ext_resource type="PackedScene" uid="uid://c6yoaffdq7w8k" path="res://scenes/flask_holder.tscn" id="1_7g7il"]
[ext_resource type="Script" uid="uid://b3i73cilpra74" path="res://src/resources/draggable.gd" id="2_51n86"]
[resource]
script = ExtResource("2_51n86")
scene_to_spawn = ExtResource("1_7g7il")
metadata/_custom_type_script = "uid://b3i73cilpra74"

View file

@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="Draggable" format=3 uid="uid://dnxpw2metn0oq"]
[ext_resource type="PackedScene" uid="uid://bfsrx0q56c0n6" path="res://scenes/flask_stand.tscn" id="1_fqoq4"]
[ext_resource type="Script" uid="uid://b3i73cilpra74" path="res://src/resources/draggable.gd" id="2_3vd4e"]
[resource]
script = ExtResource("2_3vd4e")
scene_to_spawn = ExtResource("1_fqoq4")
metadata/_custom_type_script = "uid://b3i73cilpra74"

Binary file not shown.

View file

@ -0,0 +1,70 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bd2rhbj1dbxlt"
path="res://.godot/imported/FlaskStand.glb-3207a77396b6f22697e88ff46fdeec6c.scn"
[deps]
source_file="res://assets/models/FlaskStand.glb"
dest_files=["res://.godot/imported/FlaskStand.glb-3207a77396b6f22697e88ff46fdeec6c.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={
"materials": {
"mat_metal": {
"use_external/enabled": true,
"use_external/fallback_path": "res://assets/materials/mat_metal.tres",
"use_external/path": "uid://b2h6brwubdafv"
}
},
"nodes": {
"PATH:Cube_001": {
"import/skip_import": true
},
"PATH:Cube_003": {
"import/skip_import": true
},
"PATH:FlashHolder": {
"import/skip_import": true
},
"PATH:Flask": {
"import/skip_import": true
},
"PATH:FlaskInside": {
"import/skip_import": true
},
"PATH:Sphere_001": {
"import/skip_import": true
}
}
}
gltf/naming_version=2
gltf/embedded_image_handling=1

View file

@ -0,0 +1,19 @@
[gd_scene format=3 uid="uid://npbjtos2xjqh"]
[ext_resource type="Script" uid="uid://dc4qhmcjwi568" path="res://src/flask_hold_area.gd" id="1_p5tus"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_ig37s"]
height = 0.9719238
radius = 0.09082031
[node name="FlaskHoldArea" type="Area3D" unique_id=1519161328]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 0, 0, 0)
script = ExtResource("1_p5tus")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=565290681]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.046020508, 0)
shape = SubResource("CylinderShape3D_ig37s")
debug_color = Color(0, 0.5950001, 0.7, 1)
[connection signal="area_entered" from="." to="." method="_on_area_entered"]
[connection signal="area_exited" from="." to="." method="_on_area_exited"]

33
scenes/flask_holder.tscn Normal file
View file

@ -0,0 +1,33 @@
[gd_scene format=3 uid="uid://c6yoaffdq7w8k"]
[ext_resource type="Script" uid="uid://bjnv2g1ni0525" path="res://src/drag/draggable_object.gd" id="1_ewrbt"]
[ext_resource type="PackedScene" uid="uid://dwtaqdacgcysa" path="res://assets/models/FlaskHolder.glb" id="1_twixx"]
[ext_resource type="PackedScene" uid="uid://npbjtos2xjqh" path="res://scenes/flask_hold_area.tscn" id="2_ewrbt"]
[sub_resource type="BoxShape3D" id="BoxShape3D_a7l4b"]
size = Vector3(1.0390625, 0.6665039, 0.28515625)
[node name="FlaskHolder" type="Area3D" unique_id=297421419]
script = ExtResource("1_ewrbt")
[node name="FlaskHolder2" parent="." unique_id=947584784 instance=ExtResource("1_twixx")]
transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0.5777259, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=2062784805]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.32885742, 0)
shape = SubResource("BoxShape3D_a7l4b")
[node name="FlaskHoldArea" parent="." unique_id=1519161328 instance=ExtResource("2_ewrbt")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -0.41687107, 0.45590642, 0.0024570525)
[node name="FlaskHoldArea2" parent="." unique_id=456473283 instance=ExtResource("2_ewrbt")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -0.21569425, 0.45590642, 0.0024570525)
[node name="FlaskHoldArea3" parent="." unique_id=1702091089 instance=ExtResource("2_ewrbt")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 0.0042236447, 0.45590642, 0.0024570525)
[node name="FlaskHoldArea4" parent="." unique_id=939138817 instance=ExtResource("2_ewrbt")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 0.21210945, 0.45590642, 0.0024570525)
[node name="FlaskHoldArea5" parent="." unique_id=568099085 instance=ExtResource("2_ewrbt")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 0.4127617, 0.45590642, 0.0024570525)

183
scenes/flask_stand.tscn Normal file

File diff suppressed because one or more lines are too long

View file

@ -8,6 +8,8 @@
[ext_resource type="Resource" uid="uid://cay05wpketmny" path="res://assets/draggables/flask.tres" id="4_gdt2y"]
[ext_resource type="Resource" uid="uid://6vpr6n7yruie" path="res://assets/draggables/spoon.tres" id="5_wm3ai"]
[ext_resource type="Resource" uid="uid://kg34c4105ssp" path="res://assets/draggables/burner.tres" id="6_p7vwb"]
[ext_resource type="Resource" uid="uid://dnxpw2metn0oq" path="res://assets/draggables/stand.tres" id="8_7dvkv"]
[ext_resource type="Resource" uid="uid://cm2is1qooywkf" path="res://assets/draggables/holder.tres" id="9_vdcm2"]
[node name="UserInterface" type="Control" unique_id=1780432093]
layout_mode = 3
@ -109,7 +111,18 @@ layout_mode = 2
text = "Спиртовка"
draggable = ExtResource("6_p7vwb")
[node name="Spoon" parent="Intruments/ScrollContainer/VBoxContainer" index="2" unique_id=1377215067 instance=ExtResource("3_yev5y")]
[node name="Stand" parent="Intruments/ScrollContainer/VBoxContainer" index="2" unique_id=653836695 instance=ExtResource("3_yev5y")]
layout_mode = 2
text = "Штатив"
draggable = ExtResource("8_7dvkv")
[node name="Holder" parent="Intruments/ScrollContainer/VBoxContainer" index="3" unique_id=878085834 instance=ExtResource("3_yev5y")]
layout_mode = 2
text = "Держатель пробирок"
autowrap_mode = 2
draggable = ExtResource("9_vdcm2")
[node name="Spoon" parent="Intruments/ScrollContainer/VBoxContainer" index="4" unique_id=1377215067 instance=ExtResource("3_yev5y")]
layout_mode = 2
text = "Ложка"
draggable = ExtResource("5_wm3ai")

View file

@ -0,0 +1,23 @@
extends ButtonGenerator
func get_buttons() -> Control:
var vbox: VBoxContainer = VBoxContainer.new()
var position_label: Label = Label.new()
position_label.text = "Позиция"
vbox.add_child(position_label)
var position_slider: HSlider = HSlider.new()
position_slider.min_value = 0
position_slider.max_value = 1
position_slider.step = 0.01
position_slider.set_value_no_signal(($"../Holder/Cylinder_001".position.y - 5.491)/5)
position_slider.value_changed.connect(on_value_set)
vbox.add_child(position_slider)
return vbox
func on_value_set(value: float) -> void:
$"../Holder/Cylinder_001".position.y = lerp(5.491,10.491,value)

View file

@ -0,0 +1 @@
uid://60nyr4sq6k60

View file

@ -4,6 +4,8 @@ class_name DraggableObject
signal drag_started
signal drag_ended
signal drag_started_on(obj: DraggableObject)
signal drag_ended_on(obj: DraggableObject)
var mouse_in: bool = false
var dragged: bool = false:
@ -11,12 +13,14 @@ var dragged: bool = false:
if dragged != value:
if value:
drag_started.emit()
drag_started_on.emit(self)
GuiSignalBus.clear_buttons.emit()
get_viewport().get_camera_3d().start_interaction_seeking(self)
if button_generator:
GuiSignalBus.add_buttons.emit(button_generator.get_buttons())
else:
drag_ended.emit()
drag_ended_on.emit(self)
dragged = value
@export var interactible: Interactible

30
src/flask_hold_area.gd Normal file
View file

@ -0,0 +1,30 @@
extends Area3D
var held_flask: DraggableObject
var flask_parent: Node
func _on_area_entered(area: Area3D) -> void:
if held_flask:
return
if area.is_in_group("flask"):
area.drag_ended_on.connect(snap_flask)
func _on_area_exited(area: Area3D) -> void:
if held_flask:
return
if area.is_in_group("flask") and area.drag_ended_on.is_connected(snap_flask):
area.drag_ended_on.disconnect(snap_flask)
func snap_flask(flask: DraggableObject) -> void:
flask_parent = flask.get_parent()
flask.reparent(self)
held_flask = flask
flask.drag_ended_on.disconnect(snap_flask)
flask.position = Vector3.ZERO
flask.drag_ended_on.connect(unsnap_flask)
func unsnap_flask(flask: DraggableObject) -> void:
held_flask = null
flask.reparent(flask_parent)
flask.drag_ended_on.disconnect(unsnap_flask)

View file

@ -0,0 +1 @@
uid://dc4qhmcjwi568

11
src/return_to_start.gd Normal file
View file

@ -0,0 +1,11 @@
extends Node
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass

View file

@ -0,0 +1 @@
uid://b6oj0pctnkn0t