From 49b09b9bb805914c66569f34fac5a8e7b7f6a652 Mon Sep 17 00:00:00 2001 From: Rendo Date: Mon, 29 Jun 2026 00:20:57 +0500 Subject: [PATCH] bubbles --- .~lock.Работы по химии TODO.docx# | 2 +- assets/textures/bubble.png.import | 13 ++++++----- project.godot | 2 +- scenes/bubbles.gd | 18 +++++++++++++++ scenes/bubbles.gd.uid | 1 + scenes/flask.tscn | 36 +++++++++++++++++++++++++++++- src/inventory.gd | 15 ++++++++++--- src/substance_display.gd | 2 ++ Работы по химии TODO.docx | Bin 9806 -> 9807 bytes 9 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 scenes/bubbles.gd create mode 100644 scenes/bubbles.gd.uid diff --git a/.~lock.Работы по химии TODO.docx# b/.~lock.Работы по химии TODO.docx# index 083cc6b..26b004b 100644 --- a/.~lock.Работы по химии TODO.docx# +++ b/.~lock.Работы по химии TODO.docx# @@ -1 +1 @@ -,rendo,kompikrendo,29.05.2026 16:54,file:///home/rendo/.config/libreoffice/4; \ No newline at end of file +,rendo,kompikrendo,28.06.2026 19:23,file:///home/rendo/.config/libreoffice/4; \ No newline at end of file diff --git a/assets/textures/bubble.png.import b/assets/textures/bubble.png.import index 07769dc..46d3ca3 100644 --- a/assets/textures/bubble.png.import +++ b/assets/textures/bubble.png.import @@ -3,19 +3,20 @@ importer="texture" type="CompressedTexture2D" uid="uid://bkuxwtxum1r4x" -path="res://.godot/imported/bubble.png-a4e9df5e78917cd4475ee7b84b1534f0.ctex" +path.s3tc="res://.godot/imported/bubble.png-a4e9df5e78917cd4475ee7b84b1534f0.s3tc.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc"], +"vram_texture": true } [deps] source_file="res://assets/textures/bubble.png" -dest_files=["res://.godot/imported/bubble.png-a4e9df5e78917cd4475ee7b84b1534f0.ctex"] +dest_files=["res://.godot/imported/bubble.png-a4e9df5e78917cd4475ee7b84b1534f0.s3tc.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/uastc_level=0 @@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=false +mipmaps/generate=true mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -37,4 +38,4 @@ 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 +detect_3d/compress_to=0 diff --git a/project.godot b/project.godot index 78618d2..fcca46e 100644 --- a/project.godot +++ b/project.godot @@ -16,7 +16,7 @@ compatibility/default_parent_skeleton_in_mesh_instance_3d=true config/name="lab-electrolyte" run/main_scene="uid://c2ciwyjf7au6l" -config/features=PackedStringArray("4.6", "Mobile") +config/features=PackedStringArray("4.7", "Mobile") config/icon="res://icon.svg" [autoload] diff --git a/scenes/bubbles.gd b/scenes/bubbles.gd new file mode 100644 index 0000000..227b91f --- /dev/null +++ b/scenes/bubbles.gd @@ -0,0 +1,18 @@ +extends GPUParticles3D + + +@export var inventory: Inventory +@export var particles: GPUParticles3D +var tween: Tween + +func _on_inventory_reacted_with_gasses(gasses: Array[RuntimeSubstanceData]) -> void: + if tween: + tween.kill() + tween = create_tween() + particles.emitting = true + tween.tween_interval(2.) + tween.tween_callback(func(): + particles.emitting = false + for gas in gasses: + inventory.extract_substance(gas.substance.get_formula(),gas.amount) + ) diff --git a/scenes/bubbles.gd.uid b/scenes/bubbles.gd.uid new file mode 100644 index 0000000..1e475bc --- /dev/null +++ b/scenes/bubbles.gd.uid @@ -0,0 +1 @@ +uid://8jd32taaq5yy diff --git a/scenes/flask.tscn b/scenes/flask.tscn index 19c3a85..d04cc86 100644 --- a/scenes/flask.tscn +++ b/scenes/flask.tscn @@ -7,7 +7,9 @@ [ext_resource type="Script" uid="uid://bl0ojhc0thk1p" path="res://src/interactible/interactible.gd" id="4_dbm1u"] [ext_resource type="Texture2D" uid="uid://cw3jw8qbvj3fv" path="res://assets/textures/solid.png" id="4_h7awq"] [ext_resource type="Script" uid="uid://duirfi4j26g2i" path="res://src/interactible/flask_interaction.gd" id="5_pmegg"] +[ext_resource type="Texture2D" uid="uid://bkuxwtxum1r4x" path="res://assets/textures/bubble.png" id="6_rqua0"] [ext_resource type="Script" uid="uid://82ettbegollp" path="res://src/inventory.gd" id="7_h7awq"] +[ext_resource type="Script" uid="uid://8jd32taaq5yy" path="res://scenes/bubbles.gd" id="7_wadb5"] [ext_resource type="Script" uid="uid://mqch4ruivbg8" path="res://src/position_resetter.gd" id="9_kkw7a"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_vcwhe"] @@ -74,6 +76,24 @@ bottom_radius = 0.772 radial_segments = 16 rings = 0 +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_u7u8q"] +emission_shape_scale = Vector3(0.755, 0.93, 0.755) +emission_shape = 1 +emission_sphere_radius = 1.0 +gravity = Vector3(0, 1, 0) +collision_mode = 1 +collision_friction = 0.0 +collision_bounce = 0.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_t5c10"] +transparency = 1 +albedo_texture = ExtResource("6_rqua0") +billboard_mode = 1 + +[sub_resource type="QuadMesh" id="QuadMesh_iuc1c"] +material = SubResource("StandardMaterial3D_t5c10") +size = Vector2(0.05, 0.05) + [node name="Flask" type="Area3D" unique_id=516093165 node_paths=PackedStringArray("interactible") groups=["flask"]] collision_layer = 5 script = ExtResource("1_0xufn") @@ -89,12 +109,13 @@ transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0.1, 0) mesh = SubResource("ArrayMesh_nvewc") skeleton = NodePath("") -[node name="FillLiquid" type="MeshInstance3D" parent="Flash" unique_id=439339804] +[node name="FillLiquid" type="MeshInstance3D" parent="Flash" unique_id=439339804 node_paths=PackedStringArray("particle_collision")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.8061247, 0) material_override = SubResource("ShaderMaterial_ailwx") mesh = SubResource("CylinderMesh_h7awq") skeleton = NodePath("") script = ExtResource("3_0xufn") +particle_collision = NodePath("../GPUParticlesCollisionBox3D") [node name="FillSolid" type="MeshInstance3D" parent="Flash" unique_id=390551675] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.8061155, 0) @@ -105,6 +126,18 @@ skeleton = NodePath("") script = ExtResource("3_0xufn") display_type = 1 +[node name="GPUParticlesCollisionBox3D" type="GPUParticlesCollisionBox3D" parent="Flash" unique_id=330053589] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5932534, 0) +size = Vector3(2.7734375, 1.1738281, 3.2333984) + +[node name="GPUParticles3D" type="GPUParticles3D" parent="Flash" unique_id=2054685714] +emitting = false +lifetime = 3.0 +local_coords = true +process_material = SubResource("ParticleProcessMaterial_u7u8q") +draw_pass_1 = SubResource("QuadMesh_iuc1c") +script = ExtResource("7_wadb5") + [node name="Inventory" type="Node" parent="." unique_id=1748297338] unique_name_in_owner = true script = ExtResource("7_h7awq") @@ -147,5 +180,6 @@ script = ExtResource("9_kkw7a") [connection signal="drag_started" from="." to="PositionResetter" method="_on_flask_drag_started"] [connection signal="inventory_changed" from="Inventory" to="Flash/FillLiquid" method="update_material_unfiltered"] [connection signal="inventory_changed" from="Inventory" to="Flash/FillSolid" method="update_material_unfiltered"] +[connection signal="reacted_with_gasses" from="Inventory" to="Flash/GPUParticles3D" method="_on_inventory_reacted_with_gasses"] [connection signal="interacted" from="Interactible" to="Interactible/Interaction" method="_on_interactible_interacted"] [connection signal="value_changed" from="Interactible/HBoxContainer/HSlider" to="Interactible/Interaction" method="_on_h_slider_value_changed"] diff --git a/src/inventory.gd b/src/inventory.gd index 897c283..5a95666 100644 --- a/src/inventory.gd +++ b/src/inventory.gd @@ -23,6 +23,7 @@ var total_amount: float: return result signal inventory_changed(substances: Array[RuntimeSubstanceData], capacity: float) +signal reacted_with_gasses(gasses: Array[RuntimeSubstanceData]) signal temperature_changed(to: float) func _ready() -> void: @@ -179,15 +180,23 @@ func check_for_reactions() -> void: add_substance_no_callback(data) check_for_reactions() recalculate_temperature() + + var gasses = find_gases() + if gasses != []: + reacted_with_gasses.emit(gasses) + update_solutions() inventory_changed.emit(inventory.values(),capacity) GuiSignalBus.push("Произошла реакция") if len(find_odor()) > 0: GuiSignalBus.push("Появился запах") -#func find_gases() -> Array[RuntimeSubstanceData]: -# for key in inventory: -# if inventory[key].substance in [preload("H")] +func find_gases() -> Array[RuntimeSubstanceData]: + var gasses: Array[RuntimeSubstanceData] = [] + for key in inventory: + if inventory[key].substance.boiling_point < mean_temperature: + gasses.append(inventory[key]) + return gasses func find_odor() -> Array[RuntimeSubstanceData]: var result = [] diff --git a/src/substance_display.gd b/src/substance_display.gd index 51805bc..a9f3b60 100644 --- a/src/substance_display.gd +++ b/src/substance_display.gd @@ -11,6 +11,7 @@ enum DisplayType{ var tween = create_tween() material_override.set_shader_parameter("wave_intensity",1.) tween.tween_property(material_override,"shader_parameter/wave_intensity",0.0,2.0) +@export var particle_collision: GPUParticlesCollisionBox3D func update_fluid_material(substances: Array[RuntimeSubstanceData],capacity: float) -> void: var mat: ShaderMaterial = material_override @@ -53,6 +54,7 @@ func update_fluid_material(substances: Array[RuntimeSubstanceData],capacity: flo mat.set_shader_parameter("albedo_color", color / total_color) mat.set_shader_parameter("fill",total_weight/capacity) + particle_collision.position.y = + particle_collision.size.y/2 + position.y - 4 + 8 * total_weight/capacity func update_solid_material(substances: Array[RuntimeSubstanceData]) -> void: var mat: StandardMaterial3D = material_override diff --git a/Работы по химии TODO.docx b/Работы по химии TODO.docx index d22917cddf1148672e87415b0c196fe606d59afd..4f3ad2f804515383b65f3f162f03fddbfdf6d81f 100644 GIT binary patch delta 2941 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 Rt_pBqVdq$=?g$-s{sXg<8s`82