From 6c3260eaf105452331c318fa0ce0099a9a632241 Mon Sep 17 00:00:00 2001 From: betalars Date: Mon, 27 Mar 2023 19:18:48 +0200 Subject: [PATCH] created particle system to indicate missing objects --- design/particles.svg | 166 ++++++++++++ .../youth_room/youth_room.tscn | 254 +++++++++++++++++- src/dev-util/particles_tester.tscn | 174 ++++++++++++ src/dev-util/testing.tscn | 5 + src/vfx/collectable_particles.tscn | 30 +++ src/vfx/lens-flare-particle.png | Bin 0 -> 9555 bytes src/vfx/lens-flare-particle.png.import | 35 +++ src/vfx/particle_mixer.gdshader | 22 ++ 8 files changed, 681 insertions(+), 5 deletions(-) create mode 100644 design/particles.svg create mode 100644 src/dev-util/particles_tester.tscn create mode 100644 src/dev-util/testing.tscn create mode 100644 src/vfx/collectable_particles.tscn create mode 100644 src/vfx/lens-flare-particle.png create mode 100644 src/vfx/lens-flare-particle.png.import create mode 100644 src/vfx/particle_mixer.gdshader diff --git a/design/particles.svg b/design/particles.svg new file mode 100644 index 0000000..ec1cabe --- /dev/null +++ b/design/particles.svg @@ -0,0 +1,166 @@ + + + + diff --git a/src/base-environments/youth_room/youth_room.tscn b/src/base-environments/youth_room/youth_room.tscn index b8b8bd9..5e1293e 100644 --- a/src/base-environments/youth_room/youth_room.tscn +++ b/src/base-environments/youth_room/youth_room.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=34 format=3 uid="uid://b3b0gyvklqn50"] +[gd_scene load_steps=41 format=3 uid="uid://b3b0gyvklqn50"] [ext_resource type="Script" path="res://base-environments/youth_room/room_handle.gd" id="1_aitp0"] [ext_resource type="PackedScene" uid="uid://c0i4ydmxtxfho" path="res://base-environments/youth_room/import/youth_room.glb" id="1_jf3oi"] @@ -472,6 +472,44 @@ viewport_path = NodePath("Collectable/Collectable_ui/Sprite3D/SubViewport") radius = 0.342951 height = 1.08154 +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_f1g8m"] +radius = 0.156739 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_kewqg"] +radius = 0.787239 +height = 3.19663 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_k4x40"] +radius = 1.0352 +height = 2.55391 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_4q8vc"] +radius = 1.14469 +height = 3.78697 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_n20ff"] +radius = 1.73984 +height = 5.43669 + +[sub_resource type="GDScript" id="GDScript_uyt24"] +script/source = "extends StaticBody3D +var risen:bool = false +var start_position:Vector3 = position + +func raise(_discard): + if not risen: + var raiser = create_tween() + raiser.tween_property(self, \"position\", position + Vector3(0,1.1,0), 1) + risen = true + +func reset(_discard): + risen = false + position = start_position +" + +[sub_resource type="BoxShape3D" id="BoxShape3D_gim5a"] +size = Vector3(1, 0.305693, 0.775269) + [node name="youth room" type="Node3D"] script = ExtResource("1_aitp0") @@ -540,13 +578,89 @@ shadow_enabled = true spot_angle = 42.8718 script = SubResource("GDScript_xqa3d") -[node name="CSGCombiner3D" type="CSGCombiner3D" parent="."] +[node name="Blockout" type="CSGCombiner3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.811571, 0, 0) +visible = false use_collision = true -[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D"] +[node name="Floor" type="CSGBox3D" parent="Blockout"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.931684, -0.12195, 0.721855) size = Vector3(5.75304, 0.238875, 4.229) +[node name="Wall1" type="CSGBox3D" parent="Blockout/Floor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.09251, 1.18903, 2.10151) +size = Vector3(2.02493, 2.13981, 1) + +[node name="Wall2" type="CSGBox3D" parent="Blockout/Floor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.12438, 1.18903, 2.10151) +size = Vector3(1.11794, 2.13981, 1) + +[node name="Wall3" type="CSGBox3D" parent="Blockout/Floor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.692784, 1.18903, 2.51779) +size = Vector3(1.97467, 2.13981, 1) + +[node name="Wall4" type="CSGBox3D" parent="Blockout/Floor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0505961, 1.18903, -2.27114) +size = Vector3(5.49963, 2.13981, 1) + +[node name="Wall5" type="CSGBox3D" parent="Blockout/Floor"] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 2.41253, 1.18903, 1.10946) +size = Vector3(2.02493, 2.13981, 1) + +[node name="Wall6" type="CSGBox3D" parent="Blockout/Floor"] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 1.69649, 1.62974, -0.736064) +size = Vector3(2.02493, 1.06586, 1) + +[node name="Wall7" type="CSGBox3D" parent="Blockout/Floor"] +transform = Transform3D(-6.06896e-08, 0, 1, 0, 1, 0, -1.38842, 0, -4.37114e-08, 2.94248, 0.554825, -0.893607) +size = Vector3(2.02493, 1.06586, 1) + +[node name="Pillar" type="CSGBox3D" parent="Blockout/Floor"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.340459, 1.18903, 0.542746) +size = Vector3(0.25896, 2.51771, 0.244169) + +[node name="wardrobe" type="CSGBox3D" parent="Blockout"] +transform = Transform3D(0.998323, 0, -0.0578951, 0, 1, 0, 0.0578951, 0, 0.998323, -1.65267, 1.06708, -0.295834) +size = Vector3(0.690756, 2.51771, 1.74006) + +[node name="desk" type="CSGBox3D" parent="Blockout"] +transform = Transform3D(1.1474, 0, 0, 0, 1, 0, 0, 0, 1, -1.33503, 0.250741, 1.47367) +size = Vector3(0.690756, 1.04931, 1.74006) + +[node name="beanBag1" type="CSGSphere3D" parent="Blockout"] +transform = Transform3D(0.930761, 0, 0, 0, 0.811193, 0, 0, 0, 0.811193, -0.693896, 0.11103, 2.36695) + +[node name="beanBag2" type="CSGSphere3D" parent="Blockout"] +transform = Transform3D(0.930761, 0, 0, 0, 0.811193, 0, 0, 0, 0.811193, 1.4977, 0.222592, 0.667055) +radius = 0.442542 + +[node name="shelf" type="CSGBox3D" parent="Blockout"] +transform = Transform3D(1.50675, 0, 0.113429, 0, 1.21197, 0, -0.0247126, 0, 1.59021, 1.22435, 0.523912, -0.31202) +size = Vector3(0.334722, 1, 1) + +[node name="shelf2" type="CSGBox3D" parent="Blockout"] +transform = Transform3D(1.51977, 0, -0.268689, 0, 1.21197, 0, 0.299637, 0, 1.90867, 2.65587, 0.308069, 1.91858) +size = Vector3(0.334722, 1, 0.709023) + +[node name="bed" type="CSGBox3D" parent="Blockout"] +transform = Transform3D(3.88154, 0, 0.183517, 0, 1.21197, 0, -0.063662, 0, 2.5728, 2.04986, 0.939937, -0.31202) +size = Vector3(0.334722, 0.208577, 1) + +[node name="seat" type="CSGBox3D" parent="Blockout"] +transform = Transform3D(1.37974, 0, -0.560171, 0, 0.811194, 0, 0.605992, 0, 1.4926, 0.581465, 0.266536, -0.762094) +size = Vector3(0.548618, 1, 0.313878) + +[node name="CSGBox3D2" type="CSGBox3D" parent="Blockout/seat"] +transform = Transform3D(1, 0, 2.98023e-08, 0, 1, 0, -3.27826e-07, 0, 0.999999, 0.0905743, -0.552749, 0.233639) +size = Vector3(0.447724, 1, 0.329058) + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Blockout/seat"] +transform = Transform3D(1, 0, 5.96046e-08, 0, 1.34598, 0, -6.55651e-07, 0, 0.999999, 0.0164497, -0.711718, 0.294858) + +[node name="ladder" type="CSGBox3D" parent="Blockout"] +transform = Transform3D(0.629683, 0.289502, 0, -0.297919, 0.611894, 0, 0, 0, 1.8813, 1.23808, 0.491789, 0.746785) +size = Vector3(0.180483, 1.62661, 0.160638) + [node name="OmniLight3D2" type="OmniLight3D" parent="."] transform = Transform3D(-0.477862, -0.663484, 0.575705, -0.860239, 0.220753, -0.459626, 0.177866, -0.714882, -0.676245, 3.15688, 0.480778, 0.0648447) light_size = 0.1 @@ -559,7 +673,7 @@ libraries = { "": SubResource("AnimationLibrary_k8op5") } -[node name="PlayerController" parent="." instance=ExtResource("3_foj4y")] +[node name="PlayerController" parent="." groups=["camera_owner"] instance=ExtResource("3_foj4y")] transform = Transform3D(0.686123, 0, 0.727485, 0, 1, 0, -0.727485, 0, 0.686123, 1.14815, 1.19209e-07, 0.730062) active = false @@ -605,7 +719,7 @@ offset_right = 40.0 offset_bottom = 23.0 text = "n out of 3 Memories collected" -[node name="Collectable" type="Area3D" parent="."] +[node name="Collectable" type="Area3D" parent="." groups=["collectables"]] transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -0.940637, 1.34703, 0.817837) collision_layer = 16 @@ -634,6 +748,136 @@ render_target_update_mode = 4 [node name="DisplayMenu" type="CollisionShape3D" parent="Collectable"] shape = SubResource("CapsuleShape3D_72g2i") +[node name="Exit" type="Area3D" parent="." groups=["exit"]] +transform = Transform3D(1, 0, 1.06581e-14, 0, 1, 0, -1.06581e-14, 0, 1, 0.13754, 1.34703, -0.95778) +collision_layer = 16 + +[node name="Collectable_ui" type="Area3D" parent="Exit"] +transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -2.38419e-07, 0, 0.071894) +script = ExtResource("11_7uxd8") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Exit/Collectable_ui"] +transform = Transform3D(2.56, 0, 7.10543e-14, 0, 2.56, 0, -7.10543e-14, 0, 2.56, 0, 0, 0.238397) +shape = SubResource("BoxShape3D_cb3g8") + +[node name="Sprite3D" type="Sprite3D" parent="Exit/Collectable_ui"] +transform = Transform3D(1, 0, 2.4869e-14, 0, 1, 0, -2.4869e-14, 0, 1, 0, 0, 0.610758) +pixel_size = 0.015 +no_depth_test = true +texture = SubResource("ViewportTexture_gwx6q") + +[node name="SubViewport" type="SubViewport" parent="Exit/Collectable_ui/Sprite3D"] +transparent_bg = true +size = Vector2i(300, 350) +render_target_update_mode = 4 + +[node name="Label" type="Label" parent="Exit/Collectable_ui/Sprite3D/SubViewport"] +offset_right = 40.0 +offset_bottom = 23.0 +text = "you may not exit now, three are still things to pack." + +[node name="DisplayMenu" type="CollisionShape3D" parent="Exit"] +shape = SubResource("CapsuleShape3D_72g2i") + +[node name="Board" type="Area3D" parent="." groups=["exit"]] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, -0.995796, 1.30696, 1.71915) +collision_layer = 16 + +[node name="Collectable_ui" type="Area3D" parent="Board"] +transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, -2.38419e-07, 0, 0.071894) +script = ExtResource("11_7uxd8") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Board/Collectable_ui"] +transform = Transform3D(2.56, 0, 7.10543e-14, 0, 2.56, 0, -7.10543e-14, 0, 2.56, 0, 0, 0.238397) +shape = SubResource("BoxShape3D_cb3g8") + +[node name="Sprite3D" type="Sprite3D" parent="Board/Collectable_ui"] +transform = Transform3D(1, 0, 2.4869e-14, 0, 1, 0, -2.4869e-14, 0, 1, 0, 0, 0.610758) +pixel_size = 0.015 +no_depth_test = true +texture = SubResource("ViewportTexture_gwx6q") + +[node name="SubViewport" type="SubViewport" parent="Board/Collectable_ui/Sprite3D"] +transparent_bg = true +size = Vector2i(300, 350) +render_target_update_mode = 4 + +[node name="Label" type="Label" parent="Board/Collectable_ui/Sprite3D/SubViewport"] +offset_right = 40.0 +offset_bottom = 23.0 +text = "This is the Card Board." + +[node name="DisplayMenu" type="CollisionShape3D" parent="Board"] +shape = SubResource("CapsuleShape3D_72g2i") + +[node name="Bed and Ladders" type="Node3D" parent="."] + +[node name="ladder_trigger" type="Area3D" parent="Bed and Ladders"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.84538, 0, 0.803611) +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Bed and Ladders/ladder_trigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.170028, 0.244833, -0.0455775) +shape = SubResource("CapsuleShape3D_f1g8m") + +[node name="ladder_reset" type="Area3D" parent="Bed and Ladders"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.84538, 0, 0.803611) +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Bed and Ladders/ladder_reset"] +transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0.916567, 1.64525, -1.14479) +shape = SubResource("CapsuleShape3D_kewqg") + +[node name="bed_enter" type="Area3D" parent="Bed and Ladders"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.20255, 0, 0.547867) +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Bed and Ladders/bed_enter"] +transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0, 0, 0) +shape = SubResource("CapsuleShape3D_k4x40") + +[node name="bed_reset" type="Area3D" parent="Bed and Ladders"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.08894, 0, 0.00684631) +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Bed and Ladders/bed_reset"] +transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0.107988, 1.56575e-08, -0.358201) +shape = SubResource("CapsuleShape3D_4q8vc") + +[node name="reset_failover" type="Area3D" parent="Bed and Ladders"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.08894, 0, 0.272245) +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Bed and Ladders/reset_failover"] +transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0, 0, 0) +shape = SubResource("CapsuleShape3D_n20ff") + +[node name="ladder" type="StaticBody3D" parent="Bed and Ladders"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.77546, 0, 0.720878) +script = SubResource("GDScript_uyt24") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Bed and Ladders/ladder"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.336261, -0.199846, 0.0549462) +shape = SubResource("BoxShape3D_gim5a") + [connection signal="mouse_entered" from="Collectable" to="Collectable/Collectable_ui" method="show"] [connection signal="mouse_entered" from="Collectable" to="Collectable/DisplayMenu" method="set_disabled" binds= [true]] [connection signal="input_event" from="Collectable/Collectable_ui" to="Collectable/Collectable_ui" method="_on_input_event" flags=18] +[connection signal="mouse_entered" from="Exit" to="Exit/Collectable_ui" method="show"] +[connection signal="mouse_entered" from="Exit" to="Exit/DisplayMenu" method="set_disabled"] +[connection signal="input_event" from="Exit/Collectable_ui" to="Exit/Collectable_ui" method="_on_input_event" flags=18] +[connection signal="mouse_entered" from="Board" to="Board/Collectable_ui" method="show"] +[connection signal="mouse_entered" from="Board" to="Board/DisplayMenu" method="set_disabled"] +[connection signal="input_event" from="Board/Collectable_ui" to="Board/Collectable_ui" method="_on_input_event" flags=18] +[connection signal="body_entered" from="Bed and Ladders/ladder_trigger" to="PlayerController" method="_on_bed_enter"] +[connection signal="body_entered" from="Bed and Ladders/ladder_trigger" to="Bed and Ladders/ladder" method="raise"] +[connection signal="body_exited" from="Bed and Ladders/ladder_reset" to="PlayerController" method="_on_bed_exit"] +[connection signal="body_exited" from="Bed and Ladders/ladder_reset" to="Bed and Ladders/ladder" method="reset"] +[connection signal="body_entered" from="Bed and Ladders/bed_enter" to="PlayerController" method="_on_bed_enter"] +[connection signal="body_exited" from="Bed and Ladders/bed_reset" to="PlayerController" method="_on_bed_exit"] +[connection signal="body_exited" from="Bed and Ladders/reset_failover" to="PlayerController" method="_on_bed_exit"] diff --git a/src/dev-util/particles_tester.tscn b/src/dev-util/particles_tester.tscn new file mode 100644 index 0000000..cf94427 --- /dev/null +++ b/src/dev-util/particles_tester.tscn @@ -0,0 +1,174 @@ +[gd_scene load_steps=14 format=3 uid="uid://bj3tbkmppabfq"] + +[ext_resource type="Shader" path="res://vfx/particle_mixer.gdshader" id="1_g8u1t"] +[ext_resource type="Texture2D" uid="uid://dq7jm5ufknbb6" path="res://vfx/lens-flare-particle.png" id="2_mi0wa"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_lpenh"] +render_priority = 0 +shader = ExtResource("1_g8u1t") +shader_parameter/particle_color = null +shader_parameter/particle_texture = ExtResource("2_mi0wa") + +[sub_resource type="Gradient" id="Gradient_tjuvm"] +offsets = PackedFloat32Array(0, 0.50813, 1) +colors = PackedColorArray(1, 0.877403, 0.516545, 1, 0.94702, 0.505309, 0.59484, 1, 0.735853, 0.324231, 0.687053, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_d2t20"] +gradient = SubResource("Gradient_tjuvm") + +[sub_resource type="Gradient" id="Gradient_c8r4y"] +offsets = PackedFloat32Array(0, 0.00813008, 0.52439, 1) +colors = PackedColorArray(0, 0, 0, 1, 0.0284553, 0.0284553, 0.0284553, 1, 0.244776, 0.244776, 0.244776, 1, 0, 0, 0, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_2vogp"] +gradient = SubResource("Gradient_c8r4y") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_eegys"] +emission_shape = 1 +emission_sphere_radius = 0.3 +spread = 180.0 +gravity = Vector3(0, 0.02, 0) +initial_velocity_max = 0.2 +color_ramp = SubResource("GradientTexture1D_2vogp") +color_initial_ramp = SubResource("GradientTexture1D_d2t20") +turbulence_enabled = true +turbulence_noise_strength = 0.1 +turbulence_noise_scale = 2.0 +turbulence_noise_speed = Vector3(0.1, 0.3, 0.5) +turbulence_noise_speed_random = 0.3 +turbulence_influence_min = 0.01 +turbulence_influence_max = 0.03 +turbulence_initial_displacement_max = 1.0 + +[sub_resource type="Shader" id="Shader_p2314"] +code = "// NOTE: Shader automatically converted from Godot Engine 4.0.stable's StandardMaterial3D. + +shader_type spatial; +render_mode blend_mix,depth_draw_opaque,cull_back,diffuse_burley,specular_disabled; +uniform vec4 albedo : source_color; +uniform sampler2D texture_albedo : source_color,filter_linear_mipmap,repeat_enable; +uniform float point_size : hint_range(0,128); +uniform float roughness : hint_range(0,1); +uniform sampler2D texture_metallic : hint_default_white,filter_linear_mipmap,repeat_enable; +uniform vec4 metallic_texture_channel; +uniform sampler2D texture_roughness : hint_roughness_r,filter_linear_mipmap,repeat_enable; +uniform float specular; +uniform float metallic; +uniform int particles_anim_h_frames; +uniform int particles_anim_v_frames; +uniform bool particles_anim_loop; +uniform vec4 backlight : source_color; +uniform sampler2D texture_backlight : hint_default_black,filter_linear_mipmap,repeat_enable; +uniform vec3 uv1_scale; +uniform vec3 uv1_offset; +uniform vec3 uv2_scale; +uniform vec3 uv2_offset; + + +void vertex() { + UV=UV*uv1_scale.xy+uv1_offset.xy; + mat4 mat_world = mat4(normalize(INV_VIEW_MATRIX[0]), normalize(INV_VIEW_MATRIX[1]) ,normalize(INV_VIEW_MATRIX[2]), MODEL_MATRIX[3]); + mat_world = mat_world * mat4(vec4(cos(INSTANCE_CUSTOM.x), -sin(INSTANCE_CUSTOM.x), 0.0, 0.0), vec4(sin(INSTANCE_CUSTOM.x), cos(INSTANCE_CUSTOM.x), 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0)); + MODELVIEW_MATRIX = VIEW_MATRIX * mat_world; + MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX); + float h_frames = float(particles_anim_h_frames); + float v_frames = float(particles_anim_v_frames); + float particle_total_frames = float(particles_anim_h_frames * particles_anim_v_frames); + float particle_frame = floor(INSTANCE_CUSTOM.z * float(particle_total_frames)); + if (!particles_anim_loop) { + particle_frame = clamp(particle_frame, 0.0, particle_total_frames - 1.0); + } else { + particle_frame = mod(particle_frame, particle_total_frames); + } + UV /= vec2(h_frames, v_frames); + UV += vec2(mod(particle_frame, h_frames) / h_frames, floor((particle_frame + 0.5) / h_frames) / v_frames); +} + + + + + + +void fragment() { + vec2 base_uv = UV; + vec4 albedo_tex = texture(texture_albedo,base_uv); + albedo_tex *= COLOR; + ALBEDO = albedo.rgb * albedo_tex.rgb; + float metallic_tex = dot(texture(texture_metallic,base_uv),metallic_texture_channel); + METALLIC = metallic_tex * metallic; + vec4 roughness_texture_channel = vec4(1.0,0.0,0.0,0.0); + float roughness_tex = dot(texture(texture_roughness,base_uv),roughness_texture_channel); + ROUGHNESS = roughness_tex * roughness; + SPECULAR = specular; + vec3 backlight_tex = texture(texture_backlight,base_uv).rgb; + BACKLIGHT = (backlight.rgb+backlight_tex); +} +" + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_fgrmi"] +render_priority = 0 +shader = SubResource("Shader_p2314") +shader_parameter/albedo = Color(1, 1, 1, 1) +shader_parameter/point_size = 1.0 +shader_parameter/roughness = 1.0 +shader_parameter/metallic_texture_channel = Plane(1, 0, 0, 0) +shader_parameter/specular = 0.5 +shader_parameter/metallic = 0.0 +shader_parameter/particles_anim_h_frames = 1 +shader_parameter/particles_anim_v_frames = 1 +shader_parameter/particles_anim_loop = false +shader_parameter/backlight = Color(0, 0, 0, 1) +shader_parameter/uv1_scale = Vector3(1, 1, 1) +shader_parameter/uv1_offset = Vector3(0, 0, 0) +shader_parameter/uv2_scale = Vector3(1, 1, 1) +shader_parameter/uv2_offset = Vector3(0, 0, 0) +shader_parameter/texture_albedo = ExtResource("2_mi0wa") +shader_parameter/texture_backlight = ExtResource("2_mi0wa") + +[sub_resource type="QuadMesh" id="QuadMesh_ea2fp"] +material = SubResource("ShaderMaterial_fgrmi") +size = Vector2(0.1, 0.1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xd7ns"] +specular_mode = 2 +vertex_color_use_as_albedo = true +albedo_texture = ExtResource("2_mi0wa") +backlight_enabled = true +backlight_texture = ExtResource("2_mi0wa") +billboard_mode = 3 +particles_anim_h_frames = 1 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_coqla"] +blend_mode = 1 +albedo_color = Color(0, 0, 0, 1) +metallic_specular = 1.0 + +[node name="Node3D" type="Node3D"] + +[node name="collectable_particles" type="GPUParticles3D" parent="."] +material_override = SubResource("ShaderMaterial_lpenh") +material_overlay = SubResource("ShaderMaterial_lpenh") +cast_shadow = 0 +amount = 100 +lifetime = 10.0 +process_material = SubResource("ParticleProcessMaterial_eegys") +draw_pass_1 = SubResource("QuadMesh_ea2fp") + +[node name="CSGBox3D" type="CSGBox3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -2.66951) +size = Vector3(1, 1, 2.7375) +material = SubResource("StandardMaterial3D_xd7ns") + +[node name="CSGSphere3D" type="CSGSphere3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.81792, 0, 0) +material = SubResource("StandardMaterial3D_coqla") + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.157, -1.19209e-07, 0.894892) +material = SubResource("StandardMaterial3D_coqla") + +[node name="Camera3D" type="Camera3D" parent="CSGSphere3D2"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.61871) +fov = 33.6 diff --git a/src/dev-util/testing.tscn b/src/dev-util/testing.tscn new file mode 100644 index 0000000..2ead5fd --- /dev/null +++ b/src/dev-util/testing.tscn @@ -0,0 +1,5 @@ +[gd_scene format=3 uid="uid://bigr0lnen1xdh"] + +[node name="Node3D" type="Node3D"] + +[node name="Node3D" type="Node3D" parent="."] diff --git a/src/vfx/collectable_particles.tscn b/src/vfx/collectable_particles.tscn new file mode 100644 index 0000000..f75ebb7 --- /dev/null +++ b/src/vfx/collectable_particles.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=4 format=3 uid="uid://bdnesuqroi7ss"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_nbr3v"] +blend_mode = 1 +billboard_mode = 3 +particles_anim_h_frames = 1 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_d61lg"] +emission_shape = 1 +emission_sphere_radius = 1.0 +spread = 180.0 +gravity = Vector3(0, 1, 0) +initial_velocity_min = 0.2 +initial_velocity_max = 1.0 +turbulence_enabled = true +turbulence_noise_speed = Vector3(0.1, 0.3, 0.5) +turbulence_noise_speed_random = 0.3 +turbulence_influence_min = 0.05 +turbulence_initial_displacement_max = 1.0 + +[sub_resource type="QuadMesh" id="QuadMesh_ea2fp"] + +[node name="collectable_particles" type="GPUParticles3D"] +material_override = SubResource("StandardMaterial3D_nbr3v") +amount = 30 +lifetime = 10.0 +process_material = SubResource("ParticleProcessMaterial_d61lg") +draw_pass_1 = SubResource("QuadMesh_ea2fp") diff --git a/src/vfx/lens-flare-particle.png b/src/vfx/lens-flare-particle.png new file mode 100644 index 0000000000000000000000000000000000000000..cb52a884f89e95f055776aa775e7e1b595b70636 GIT binary patch literal 9555 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%0APIsyvTe7X9E?dlLT9d1 z2;b}Z>;L{iaD+Zd$n%5SKUm#17`hTWf6EiKAg+gt{Z{|K43Dj*P!_}0&m4xK1fn4^ zkST(D7q5nS;vzeLuIpKXtgkuGL{1Gl;4W!jBW6pp1nKRVy!VRI;6q7)D;zqmHj>QEtbpobn=X z9M)2$Jwiw?ah~l97MPn1rBzHBo0uK1_9W4!E}vXtFY#ONEHvk5?NX0qPKv;S3hsg8 zTg!KQ@z+glcOj#QTk+Uf-Wq;4i{i&yj8ozqOXR!8C)XOO$+1Mz_uX1wIb#hvkk~F! z_}yY$ooBr$+Q8+j;*%h~nDd-nGgYBM(8T>veU40m_Tsd1mT8?Jg(1v8yuJ(NFJ;e6#O5gnx9ZI1^ z1j6k8T9UbU;Je~3j1h_{!z|j0l7qPQXn9*P7~Exen~j;T*QnkDz_cM+U%#6nn^(Uq z8&~U_p|xgy)eHs!fEYPEt`=$~nk=p$h`lf^Es^xyIqq^>`Ru>%W}m2!_DqYtLK9S{ zFYebn2(qZ2Z*rpUHj_&Bcm;7YYw!JAOu$g18%}-TmeVgv{xoEyCzzLY=fEMKv4H#f zTv7FYG{?N!@tSjz=xa#T*icD`L9sh1viGfME7=k)8FMforf2AAcOz!j?$Ml2sc2oUp3O9xx<6ir5o7`Kvjy)R z9#2Vhdwabqy_+_0njXi+qN31@BPzD{YcUoUa$0ydWOL9Th1|k7feTpyn&Wd#J*j(- z+YI%ZzrPdCUu*jBQ#}7Ony>z@)5lq0^5%-T)`dCJLI~P-fSUL@Oa;sF1ZY5>W)S?l z(I%T4LfswN9HdC;E{zUoalW!xu6joN*&FlA)xX8Lc>ePJ9KwwjouO6#?HfJ|1{XbF zK8n{k623)d%>fY!dg$u90UFP}oo^M}5n1e@OmFz5&M@|B&2g$aM4&uXc2(C=KT*HoE{#~TmvjCn1-*EuNU=DnE6aD zE%1W?nbZil>^~iXvj+6&x;JSRL1f`L(5K=K6cK_TF$g^mQ{Xx!7b1%7xUpW#LIr z#>kD$k~3-R*JPkRuZ0>bz_o?JjnWY$1+2mQoW1uvJ(H_FlApaZyApnW7l*1NIsJpq z_*Ef!Q5#rcF!V$h6uy|fw&yAe$Bf5)aCXzPalHTd`OtC_^)vVf1c#Tk6%SpNZ)um` z%iXt!B6Yf44EURI8{;Ya*KlscJy*7Qy%%^eDnOi`SnnEtj8RYBJZR2u5Ox`n%-P?q+^Y9IByf2rgA^w>T_X^3RdE=nD5tB zIcWkEThPmU)1+k4<@)^n`P#`qumDMDzg z_)#17Sh4l?p5%7~XbVL_Sv!9|#aa)M)<0X9F*kK6f6pn_$AUeHa7D}@kIu1XF|T)% zf7N+n&gYp_0!I(qyqe(+mIXu^K3-uTk+u}Zn^;&8VUI_7gFe0S^l`k|;?Y){i}>V) z!7Ymt^H%`7R()I>ygJ|Ixfx>WDBY~=TPkNk7)~pELALbBk}&+4uuZo9h;V+eX!>_3 z(z{C(`fqmHH&AS{dO;qM;;=#pg?Y6+_doaOC~Px)NbZUZq2A{5&241gU8%UkhRav> z4lm%hYd_MR-`o;$-(V)z?M%4e@@$9%X#X-yHZFapH<;vaBdB0erX`xP*t%gmU$yA_ zfIIa)gwXZ9fcny)O18?iL6=Q758-E_`v%$7W={LE-2I!5EIa?#{)ehP(pR9lQ4azC zL$F`UB`?c`*LORAFaM|Qk5cVGuigJ&jB6yOg5FJI(JK96Aqt=@uOU}1Yaa4{fRk?x literal 0 HcmV?d00001 diff --git a/src/vfx/lens-flare-particle.png.import b/src/vfx/lens-flare-particle.png.import new file mode 100644 index 0000000..72161fe --- /dev/null +++ b/src/vfx/lens-flare-particle.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dq7jm5ufknbb6" +path.s3tc="res://.godot/imported/lens-flare-particle.png-977dfc4c080000604387722f4a049ecd.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://vfx/lens-flare-particle.png" +dest_files=["res://.godot/imported/lens-flare-particle.png-977dfc4c080000604387722f4a049ecd.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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=0 diff --git a/src/vfx/particle_mixer.gdshader b/src/vfx/particle_mixer.gdshader new file mode 100644 index 0000000..6f2f6c5 --- /dev/null +++ b/src/vfx/particle_mixer.gdshader @@ -0,0 +1,22 @@ +shader_type spatial; + +render_mode blend_add, specular_disabled; + +uniform sampler2D particle_texture; +uniform vec4 particle_color : source_color; + +void vertex() { + mat4 mat_world = mat4(normalize(INV_VIEW_MATRIX[0]), normalize(INV_VIEW_MATRIX[1]) ,normalize(INV_VIEW_MATRIX[2]), MODEL_MATRIX[3]); + mat_world = mat_world * mat4(vec4(cos(INSTANCE_CUSTOM.x), -sin(INSTANCE_CUSTOM.x), 0.0, 0.0), vec4(sin(INSTANCE_CUSTOM.x), cos(INSTANCE_CUSTOM.x), 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0)); + MODELVIEW_MATRIX = VIEW_MATRIX * mat_world; + MODELVIEW_NORMAL_MATRIX = mat3(MODELVIEW_MATRIX); + UV += vec2(float(INSTANCE_ID%2), float(INSTANCE_ID/2%2)); +} + +void fragment() { + ALBEDO = texture(particle_texture,UV/2.0).xyz * COLOR.xyz; + EMISSION = ALBEDO/8.0; + BACKLIGHT = ALBEDO; + SPECULAR = 0.0; +} +