From d7302501f0a1e2dce9db8d5bf11f8208c5a513f6 Mon Sep 17 00:00:00 2001 From: Rendo Date: Wed, 12 Nov 2025 11:44:16 +0500 Subject: [PATCH] Initial commit --- .editorconfig | 4 +++ .gitattributes | 2 ++ .gitignore | 3 ++ assets/materials/glass.tres | 7 +++++ assets/materials/glass_std.tres | 7 +++++ assets/models/flask.glb | Bin 0 -> 6556 bytes assets/models/flask.glb.import | 49 ++++++++++++++++++++++++++++++++ icon.svg | 1 + icon.svg.import | 43 ++++++++++++++++++++++++++++ project.godot | 28 ++++++++++++++++++ scenes/draggable_object.tscn | 27 ++++++++++++++++++ scenes/lab.tscn | 22 ++++++++++++++ src/draggable_camera.gd | 7 +++++ src/draggable_camera.gd.uid | 1 + src/draggable_object.gd | 23 +++++++++++++++ src/draggable_object.gd.uid | 1 + 16 files changed, 225 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 assets/materials/glass.tres create mode 100644 assets/materials/glass_std.tres create mode 100644 assets/models/flask.glb create mode 100644 assets/models/flask.glb.import create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot create mode 100644 scenes/draggable_object.tscn create mode 100644 scenes/lab.tscn create mode 100644 src/draggable_camera.gd create mode 100644 src/draggable_camera.gd.uid create mode 100644 src/draggable_object.gd create mode 100644 src/draggable_object.gd.uid diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/assets/materials/glass.tres b/assets/materials/glass.tres new file mode 100644 index 0000000..36e5646 --- /dev/null +++ b/assets/materials/glass.tres @@ -0,0 +1,7 @@ +[gd_resource type="ORMMaterial3D" format=3 uid="uid://glk2rfkn4vcu"] + +[resource] +transparency = 4 +cull_mode = 2 +albedo_color = Color(1, 1, 1, 0.3882353) +clearcoat_enabled = true diff --git a/assets/materials/glass_std.tres b/assets/materials/glass_std.tres new file mode 100644 index 0000000..cf4e45e --- /dev/null +++ b/assets/materials/glass_std.tres @@ -0,0 +1,7 @@ +[gd_resource type="StandardMaterial3D" format=3 uid="uid://be2l68by8md8t"] + +[resource] +transparency = 4 +cull_mode = 2 +albedo_color = Color(1, 1, 1, 0.2784314) +clearcoat_enabled = true diff --git a/assets/models/flask.glb b/assets/models/flask.glb new file mode 100644 index 0000000000000000000000000000000000000000..9ef369cdba165a064bb226089091f8fb64ef35f3 GIT binary patch literal 6556 zcmdT|eQ;FO6+b`}`3ixM7(gIC1OjftCc9aaXx<|U1Og$6Br4xw6El3g|n5ds7W z&}r$Y|8z!eXS7ZS?R45Y60F+cJu9^%ttdKLZDEE^r*%eWs#Yy^tdrN@@9ur()plC_ z)6Lv-&OP^hpL6f-q`RlBe!Pf$f40bT6GYawHa86#(fwBX8yA8_lM5&C~O74oK zVu&D_iucCT@qPL@nog(U9edN<4jL`ZtqpAr%}vT`Q}c%PHH}79X~1Y(wXv?bdBe)~ zpixzZsN;P*M=`E39d3j~9B2ZBht}G3eg~MgxTf(78d0D^{ z3RYHxDkGs_X^7dzQP3^L-kHxpacSUlb|@67C=FLs1jA5Ct5A$PSJj2kg+ap~GV=Yu zA^$J^vah6H_8kclZyC)!9T2BdqgsNTr&4Y^y@9ugt=q(O!UcS?mt4mFrP~I zDfEr^fx0h327Pj<`yBdq759O;<=^zTm& zuz$*?$P*)e`UBXeee(S@`l@`1w2b&^-eLOXT=;1l_n9%k&S^jW)V^wqF`U^~?Ywnz zK+zw~ykI}{$#F$rPG^Tb{-=odNiF|#;P-U=m!OxPacqQk9)#W~^hv)7{}!i zY4%CvgD`D!9?8FW-6=b|ET!msNv$bIIDPre`x#O%i21CTo>x*78i+8sY+u3XHHCI3v*e*JgXZ{ts!1QO)FZ|o^ zXVEYG+wf=6FZ|o^r~Jad4Sy#6!v9(1W-&+Rdhk0DD;K(?k*CFcNh42_`I1JSCi5lj z^K1J2nm)g#&#&q8TkXr&^5tv!@-=<=n!bEZU!5&qoh@ITEnl5YU!B$4u6t@R2j;BTOt@}&Aw(c+e+Pc5=YwP~f?^)enWk-LH&=o%F`z1qu4QS4#o=^76 z(eufE*?K0??P~j$uWr28Ufp=Fy}I#Udv)Wz_Ud+)HPW$} zteqE|pZ3YvKEEm-ug>pHI%B{0r*n4T*k(tpCC<10jNj3~+>_7qBgcE3m&wP+Py1#@ zy=A^P&6^p%Y2M86P4i|(`P24IpI^%tkE$X4!YBErj?;p?rQ@^^r{&q9oEN8$uij1H zyY1a;^=|s!ZSP+5-S+M^YvK8Fd@-mw(6K36zcZj$SgyMqv9G{tQP_3c6&@!^;Gi`Q zi#Q`g+@kgwIi4r6FVu2{T8@}ltYj_Ce#&;D~y%n#>)IS`A`9`_kcdD^8sG3O}=oS7&0 z^Le?V>h1O0Mc*hl)~`%IynJ0Zq3nz*%$O6f$^Imi-wb~&Z^q@%V@$tY+iCs+&hS0C zFY1pX$4q?0E8v$o(?4gtU15LSy|~BbYDnjs$#X34E1K^r?A2-1^~cA2o3+1Y?T_dF z`g;A#^b>wnoa0f2Yh^svM413gI8m;X+kmf=6G$@)FiWn1+zAD*f$X)QCIe2EDUiNa z!6`Bo8WR`{jUa0o)>6p;s^K0oO~j z9F#+{5pbhyf{oSStiifnc1w@M0ps!w*jocm16C`n49aG}&9Jl5yTZHv%@wUD5_#2VjSELUT8~9LHKGcY@am*eN@uR}#_< z*e$!@^&lb~#M&$?aK00955vwOtc}tKZ!y4_bjjVwax36g*@hf?q1%HMM;uME18@go z$;RXl0}ew!2~ICyFXRpb6ZRmYCFuTs!2Pflg-jAKDSN=3hx`q!{fIsaP6t*B_ezjM z7S=ID-vLf1RzEytfinqf7*ThEvlA40seer! zMm&Ob9GWR``myf8^yi`~1z3a7=m#f_bri8Sp>jL0dX??%fZNdx6X!<}eF5a>VI4pO zOW-+xHGr9@fm}V-Uf9h>Wpc3&B90^~vIlDj6H|}V^;mt_9Y#z;SSJw8kb)=hD&2z} T;W)frM}Y~) diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..39e33cb --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdyc1cwthn845" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..0e074f1 --- /dev/null +++ b/project.godot @@ -0,0 +1,28 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="lab-electrolyte" +run/main_scene="uid://c7r4rhgj3ucao" +config/features=PackedStringArray("4.5", "Mobile") +config/icon="res://icon.svg" + +[input] + +drag_camera={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":2,"position":Vector2(641, 3),"global_position":Vector2(650, 51),"factor":1.0,"button_index":2,"canceled":false,"pressed":true,"double_click":false,"script":null) +] +} + +[rendering] + +renderer/rendering_method="mobile" diff --git a/scenes/draggable_object.tscn b/scenes/draggable_object.tscn new file mode 100644 index 0000000..f003b23 --- /dev/null +++ b/scenes/draggable_object.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=5 format=3 uid="uid://bjxjcx2qu16q5"] + +[ext_resource type="Script" uid="uid://bjnv2g1ni0525" path="res://src/draggable_object.gd" id="1_vcwhe"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_vcwhe"] +radius = 0.49570328 + +[sub_resource type="SphereShape3D" id="SphereShape3D_18ddp"] +radius = 0.25 + +[sub_resource type="SphereMesh" id="SphereMesh_18ddp"] +radius = 0.25 +height = 0.5 + +[node name="DraggableObject" type="Area3D"] +script = ExtResource("1_vcwhe") + +[node name="DragShape" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_vcwhe") + +[node name="DragArea" type="Area3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="DragArea"] +shape = SubResource("SphereShape3D_18ddp") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("SphereMesh_18ddp") diff --git a/scenes/lab.tscn b/scenes/lab.tscn new file mode 100644 index 0000000..9b87706 --- /dev/null +++ b/scenes/lab.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://c7r4rhgj3ucao"] + +[ext_resource type="PackedScene" uid="uid://bjxjcx2qu16q5" path="res://scenes/draggable_object.tscn" id="1_bb6uc"] +[ext_resource type="Script" uid="uid://crjao0jjv5yqs" path="res://src/draggable_camera.gd" id="1_hem3r"] + +[sub_resource type="BoxMesh" id="BoxMesh_cbcd7"] +size = Vector3(3.535, 1, 1) + +[node name="Lab" type="Node3D"] + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_cbcd7") + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.236948, 0.9448395, 1.8294222) +script = ExtResource("1_hem3r") + +[node name="DraggableObject" parent="." instance=ExtResource("1_bb6uc")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.236948, 0.9448395, 0.0039073825) + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.8403207, 0.5420896, 0, -0.5420896, 0.8403207, 0, 1.9293891, 0) diff --git a/src/draggable_camera.gd b/src/draggable_camera.gd new file mode 100644 index 0000000..2564f07 --- /dev/null +++ b/src/draggable_camera.gd @@ -0,0 +1,7 @@ +extends Camera3D + +const SENSITIVITY = 0.05 + +func _input(event: InputEvent) -> void: + if Input.is_action_pressed("drag_camera") and event is InputEventMouseMotion: + global_position += get_ * Vector3(event.relative.x,event.relative.y,0) diff --git a/src/draggable_camera.gd.uid b/src/draggable_camera.gd.uid new file mode 100644 index 0000000..3c32899 --- /dev/null +++ b/src/draggable_camera.gd.uid @@ -0,0 +1 @@ +uid://crjao0jjv5yqs diff --git a/src/draggable_object.gd b/src/draggable_object.gd new file mode 100644 index 0000000..5f25b4b --- /dev/null +++ b/src/draggable_object.gd @@ -0,0 +1,23 @@ +extends Area3D + + +var mouse_in: bool = false +var dragged: bool = false + +func _mouse_enter() -> void: + mouse_in = true + +func _mouse_exit() -> void: + mouse_in = false + dragged = false + +func _process(delta: float) -> void: + if dragged == false: + return + var camera: Camera3D = get_viewport().get_camera_3d() + var new_position: Vector3 = camera.project_position(get_viewport().get_mouse_position(),(-camera.basis.z).dot(camera.to_local(global_position))) + global_position = new_position + +func _input(event: InputEvent) -> void: + if mouse_in and event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT: + dragged = true if event.pressed else false diff --git a/src/draggable_object.gd.uid b/src/draggable_object.gd.uid new file mode 100644 index 0000000..cb4f9d3 --- /dev/null +++ b/src/draggable_object.gd.uid @@ -0,0 +1 @@ +uid://bjnv2g1ni0525