]> purplebirdman git - frog-ninja.git/commitdiff
Added shaders to projectile
authorClifton Palmer <clifton.james.palmer@protonmail.com>
Sat, 7 Jun 2025 14:24:37 +0000 (17:24 +0300)
committerClifton Palmer <clifton.james.palmer@protonmail.com>
Sat, 7 Jun 2025 14:28:32 +0000 (17:28 +0300)
asset/character/model/state/dashing_state.gd
asset/map/test.tscn
asset/projectile/projectile.gd
asset/projectile/projectile.tscn
asset/projectile/projectile_inner_shader.tres [new file with mode: 0644]
asset/projectile/projectile_outer_shader.tres [new file with mode: 0644]
asset/projectile/projectile_trail_shader.tres [new file with mode: 0644]

index 2931f967c098606fdff6cc53bd57d0641c9b0d31..0c6ea9e8b24dd44d2ea18f843f5f31b21a3a55be 100644 (file)
@@ -29,7 +29,7 @@ func update(input: InputPacket, delta: float):
                if input.player_movement_direction == Vector2.ZERO:
                        dir = Vector2(player.last_movement_vector.x, player.last_movement_vector.z)
                else:
                if input.player_movement_direction == Vector2.ZERO:
                        dir = Vector2(player.last_movement_vector.x, player.last_movement_vector.z)
                else:
-                       dir = input.player_movement_direction
+                       dir = input.player_movement_direction.normalized()
                new_position = player.global_position + Vector3(dir.x, 0, dir.y) * dash_length
                rotate_skin(new_position)
 
                new_position = player.global_position + Vector3(dir.x, 0, dir.y) * dash_length
                rotate_skin(new_position)
 
index b3524dad6394a864565db3fedf5ec793961a68a0..8c45a22ae523eedaf0d0f352bd441f3f0f90920e 100644 (file)
@@ -65,6 +65,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.92252, 0.5, 9.21799)
 [node name="Player" parent="." instance=ExtResource("1_37kl0")]
 transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
 input_is_relative_to_camera = true
 [node name="Player" parent="." instance=ExtResource("1_37kl0")]
 transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
 input_is_relative_to_camera = true
+energy_points = 10.0
 
 [node name="Robot" parent="." instance=ExtResource("8_415ew")]
 transform = Transform3D(-0.709448, 0, 0.704758, 0, 1, 0, -0.704758, 0, -0.709448, -4.55426, 9.53674e-07, 3.62123)
 
 [node name="Robot" parent="." instance=ExtResource("8_415ew")]
 transform = Transform3D(-0.709448, 0, 0.704758, 0, 1, 0, -0.704758, 0, -0.709448, -4.55426, 9.53674e-07, 3.62123)
@@ -82,6 +83,22 @@ script = ExtResource("7_y18ei")
 target = NodePath("../../Player")
 metadata/_custom_type_script = "uid://b6bncm81voh5s"
 
 target = NodePath("../../Player")
 metadata/_custom_type_script = "uid://b6bncm81voh5s"
 
+[node name="Robot3" parent="." instance=ExtResource("8_415ew")]
+transform = Transform3D(-0.709448, 0, 0.704758, 0, 1, 0, -0.704758, 0, -0.709448, 12.3299, 9.53674e-07, 10.0307)
+
+[node name="Input" type="Node" parent="Robot3" node_paths=PackedStringArray("target")]
+script = ExtResource("7_y18ei")
+target = NodePath("../../Player")
+metadata/_custom_type_script = "uid://b6bncm81voh5s"
+
+[node name="Robot4" parent="." instance=ExtResource("8_415ew")]
+transform = Transform3D(-0.709448, 0, 0.704758, 0, 1, 0, -0.704758, 0, -0.709448, 12.3299, 9.53674e-07, 18.3525)
+
+[node name="Input" type="Node" parent="Robot4" node_paths=PackedStringArray("target")]
+script = ExtResource("7_y18ei")
+target = NodePath("../../Player")
+metadata/_custom_type_script = "uid://b6bncm81voh5s"
+
 [node name="CameraHandler" parent="." node_paths=PackedStringArray("tracking_node") instance=ExtResource("4_f4bcd")]
 tracking_node = NodePath("../Player")
 tracking_lock = 0.821
 [node name="CameraHandler" parent="." node_paths=PackedStringArray("tracking_node") instance=ExtResource("4_f4bcd")]
 tracking_node = NodePath("../Player")
 tracking_lock = 0.821
index 376ebb00333520e9abc94fa8cd73bc1c17638c80..772732090a98548dcc294703ec9abfaaca23e490 100644 (file)
@@ -16,13 +16,20 @@ var _origin: Vector3
 
 
 func _ready() -> void:
 
 
 func _ready() -> void:
-       if not last_movement_direction:
-               last_movement_direction = Vector3.BACK.rotated(Vector3.UP, rotation.y)
+       if last_movement_direction:
+               last_movement_direction = last_movement_direction.normalized()
+       else:
+               last_movement_direction = Vector3.BACK.rotated(Vector3.UP, global_rotation.y)
+               
        hurtbox.weapon = weapon
        hurtbox.is_attacking = true
        hurtbox.set_collision_layer(collision_layer)
        hurtbox.set_collision_mask(collision_mask)
        _origin = global_position
        hurtbox.weapon = weapon
        hurtbox.is_attacking = true
        hurtbox.set_collision_layer(collision_layer)
        hurtbox.set_collision_mask(collision_mask)
        _origin = global_position
+       
+       # TODO: if projectile gets reflected, this must be recalculated!
+       var target_angle := Vector3.BACK.signed_angle_to(last_movement_direction, Vector3.UP)
+       global_rotate(Vector3.UP, target_angle)
 
 
 func _process(delta: float) -> void:
 
 
 func _process(delta: float) -> void:
@@ -31,6 +38,6 @@ func _process(delta: float) -> void:
        else:
                global_position = lerp(
                        global_position, 
        else:
                global_position = lerp(
                        global_position, 
-                       global_position + speed * last_movement_direction.normalized()
+                       global_position + speed * last_movement_direction, 
                        delta
                        )
                        delta
                        )
index 48dd9fea399c2565b92b03c52872fb695e7216c7..94df55417e24c55cf9c5517db18dff895549936b 100644 (file)
@@ -1,18 +1,96 @@
-[gd_scene load_steps=6 format=3 uid="uid://dxmuwbdsw1cux"]
+[gd_scene load_steps=22 format=3 uid="uid://dxmuwbdsw1cux"]
 
 [ext_resource type="Script" uid="uid://dhljelflbvhq0" path="res://asset/projectile/projectile.gd" id="1_a85iw"]
 [ext_resource type="Script" uid="uid://bfwn8qkon3k0y" path="res://asset/character/model/hurtbox.gd" id="2_qxf0c"]
 
 [ext_resource type="Script" uid="uid://dhljelflbvhq0" path="res://asset/projectile/projectile.gd" id="1_a85iw"]
 [ext_resource type="Script" uid="uid://bfwn8qkon3k0y" path="res://asset/character/model/hurtbox.gd" id="2_qxf0c"]
+[ext_resource type="Shader" uid="uid://cb1uqpepu0fu8" path="res://asset/projectile/projectile_outer_shader.tres" id="3_eos0u"]
+[ext_resource type="Shader" uid="uid://bl8vglcme53cn" path="res://asset/projectile/projectile_inner_shader.tres" id="4_k4v71"]
+[ext_resource type="Shader" uid="uid://w1pxn1nolx5n" path="res://asset/projectile/projectile_trail_shader.tres" id="5_4ycb3"]
 
 [sub_resource type="SphereShape3D" id="SphereShape3D_a85iw"]
 
 [sub_resource type="SphereShape3D" id="SphereShape3D_a85iw"]
-radius = 0.115693
+radius = 0.3
 
 
-[sub_resource type="SphereMesh" id="SphereMesh_qxf0c"]
-radius = 0.1
-height = 0.2
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_eos0u"]
+render_priority = 0
+shader = ExtResource("3_eos0u")
+shader_parameter/base_color = Color(2, 0.134, 0.709, 1)
+shader_parameter/rotation_speed = 0.83
+shader_parameter/speed = 1.4
 
 
-[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qxf0c"]
+[sub_resource type="CylinderMesh" id="CylinderMesh_eos0u"]
+top_radius = 0.0
+height = 1.0
+cap_top = false
+cap_bottom = false
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_4ycb3"]
+render_priority = 1
+shader = ExtResource("4_k4v71")
+shader_parameter/base_color = Color(4, 0.397, 2, 1)
+shader_parameter/fresnel_power = 4.0
+
+[sub_resource type="SphereMesh" id="SphereMesh_eos0u"]
+
+[sub_resource type="Gradient" id="Gradient_4ycb3"]
+offsets = PackedFloat32Array(0.4, 0.5, 0.6)
+colors = PackedColorArray(0.416952, 0.00912567, 0.0775737, 1, 3, 0, 2, 1, 0.416952, 0.00912567, 0.0775737, 1)
+metadata/_snap_enabled = true
+
+[sub_resource type="GradientTexture1D" id="GradientTexture1D_xofgy"]
+gradient = SubResource("Gradient_4ycb3")
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_xofgy"]
+render_priority = 0
+shader = ExtResource("5_4ycb3")
+shader_parameter/colors = SubResource("GradientTexture1D_xofgy")
+shader_parameter/speed = 1.0
+
+[sub_resource type="PlaneMesh" id="PlaneMesh_k4v71"]
+size = Vector2(0.77, 3)
+center_offset = Vector3(0, 0, -1.5)
+
+[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_4ycb3"]
+blend_mode = 1
+cull_mode = 2
 shading_mode = 0
 shading_mode = 0
-albedo_color = Color(1, 0, 1, 1)
+disable_ambient_light = true
+disable_fog = true
+vertex_color_use_as_albedo = true
+vertex_color_is_srgb = true
+
+[sub_resource type="Gradient" id="Gradient_xofgy"]
+colors = PackedColorArray(4, 1, 2, 1, 0.646777, 0, 0.300858, 1)
+
+[sub_resource type="GradientTexture1D" id="GradientTexture1D_e5gjc"]
+gradient = SubResource("Gradient_xofgy")
+use_hdr = true
+
+[sub_resource type="Curve" id="Curve_4ycb3"]
+_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
+point_count = 2
+
+[sub_resource type="CurveTexture" id="CurveTexture_xofgy"]
+curve = SubResource("Curve_4ycb3")
+
+[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_4ycb3"]
+lifetime_randomness = 0.46
+particle_flag_align_y = true
+emission_shape = 1
+emission_sphere_radius = 0.2
+direction = Vector3(0, 0, -2)
+spread = 34.315
+initial_velocity_min = 2.0
+initial_velocity_max = 10.0
+angular_velocity_min = -4.18002
+angular_velocity_max = 79.79
+gravity = Vector3(0, 0, 0)
+scale_curve = SubResource("CurveTexture_xofgy")
+color_ramp = SubResource("GradientTexture1D_e5gjc")
+hue_variation_min = -0.1
+hue_variation_max = 0.07
+
+[sub_resource type="QuadMesh" id="QuadMesh_xofgy"]
+size = Vector2(0.02, 0.06)
+orientation = 0
 
 [node name="Projectile" type="Node3D"]
 script = ExtResource("1_a85iw")
 
 [node name="Projectile" type="Node3D"]
 script = ExtResource("1_a85iw")
@@ -28,7 +106,29 @@ shape = SubResource("SphereShape3D_a85iw")
 debug_color = Color(1, 0.6, 0.701961, 0.419608)
 
 [node name="Visual" type="Node3D" parent="."]
 debug_color = Color(1, 0.6, 0.701961, 0.419608)
 
 [node name="Visual" type="Node3D" parent="."]
+transform = Transform3D(0.6, 0, 0, 0, 0.6, 0, 0, 0, 0.6, 0, 0, 0)
+
+[node name="OuterFlame" type="MeshInstance3D" parent="Visual"]
+transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, -0.0675984)
+material_override = SubResource("ShaderMaterial_eos0u")
+cast_shadow = 0
+mesh = SubResource("CylinderMesh_eos0u")
+
+[node name="InnerBall" type="MeshInstance3D" parent="Visual"]
+transform = Transform3D(0.35, 0, 0, 0, 0.35, 0, 0, 0, 0.35, 0.00562227, -0.000371352, 0.000506699)
+material_override = SubResource("ShaderMaterial_4ycb3")
+cast_shadow = 0
+mesh = SubResource("SphereMesh_eos0u")
+
+[node name="Trail" type="MeshInstance3D" parent="Visual"]
+material_override = SubResource("ShaderMaterial_xofgy")
+cast_shadow = 0
+mesh = SubResource("PlaneMesh_k4v71")
 
 
-[node name="MeshInstance3D" type="MeshInstance3D" parent="Visual"]
-mesh = SubResource("SphereMesh_qxf0c")
-surface_material_override/0 = SubResource("StandardMaterial3D_qxf0c")
+[node name="Sparks" type="GPUParticles3D" parent="Visual"]
+material_override = SubResource("StandardMaterial3D_4ycb3")
+cast_shadow = 0
+lifetime = 0.28
+explosiveness = 0.15
+process_material = SubResource("ParticleProcessMaterial_4ycb3")
+draw_pass_1 = SubResource("QuadMesh_xofgy")
diff --git a/asset/projectile/projectile_inner_shader.tres b/asset/projectile/projectile_inner_shader.tres
new file mode 100644 (file)
index 0000000..4c61167
--- /dev/null
@@ -0,0 +1,56 @@
+[gd_resource type="VisualShader" load_steps=4 format=3 uid="uid://bl8vglcme53cn"]
+
+[sub_resource type="VisualShaderNodeColorParameter" id="VisualShaderNodeColorParameter_l41o0"]
+parameter_name = "base_color"
+default_value_enabled = true
+default_value = Color(4, 0.397, 2, 1)
+
+[sub_resource type="VisualShaderNodeFresnel" id="VisualShaderNodeFresnel_l41o0"]
+default_input_values = [2, true, 3, 4.0]
+
+[sub_resource type="VisualShaderNodeFloatParameter" id="VisualShaderNodeFloatParameter_l41o0"]
+parameter_name = "fresnel_power"
+default_value_enabled = true
+default_value = 4.0
+
+[resource]
+code = "shader_type spatial;
+render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_lambert, specular_schlick_ggx, unshaded, shadows_disabled, ambient_light_disabled;
+
+uniform vec4 base_color : source_color = vec4(4.000000, 0.397000, 2.000000, 1.000000);
+uniform float fresnel_power = 4.0;
+
+
+
+void fragment() {
+// ColorParameter:2
+       vec4 n_out2p0 = base_color;
+
+
+// FloatParameter:4
+       float n_out4p0 = fresnel_power;
+
+
+// Fresnel:3
+       float n_out3p0 = pow(clamp(dot(NORMAL, VIEW), 0.0, 1.0), n_out4p0);
+
+
+// Output:0
+       ALBEDO = vec3(n_out2p0.xyz);
+       ALPHA = n_out3p0;
+
+
+}
+"
+graph_offset = Vector2(-597.218, -20.1925)
+flags/unshaded = true
+flags/shadows_disabled = true
+flags/ambient_light_disabled = true
+nodes/fragment/0/position = Vector2(400, 160)
+nodes/fragment/2/node = SubResource("VisualShaderNodeColorParameter_l41o0")
+nodes/fragment/2/position = Vector2(-420, 180)
+nodes/fragment/3/node = SubResource("VisualShaderNodeFresnel_l41o0")
+nodes/fragment/3/position = Vector2(-400, 700)
+nodes/fragment/4/node = SubResource("VisualShaderNodeFloatParameter_l41o0")
+nodes/fragment/4/position = Vector2(-1180, 860)
+nodes/fragment/connections = PackedInt32Array(2, 0, 0, 0, 3, 0, 0, 1, 4, 0, 3, 3)
diff --git a/asset/projectile/projectile_outer_shader.tres b/asset/projectile/projectile_outer_shader.tres
new file mode 100644 (file)
index 0000000..b297036
--- /dev/null
@@ -0,0 +1,171 @@
+[gd_resource type="VisualShader" load_steps=17 format=3 uid="uid://cb1uqpepu0fu8"]
+
+[sub_resource type="VisualShaderNodeFloatParameter" id="VisualShaderNodeFloatParameter_caymd"]
+parameter_name = "speed"
+default_value_enabled = true
+default_value = 1.0
+
+[sub_resource type="VisualShaderNodeVectorCompose" id="VisualShaderNodeVectorCompose_wi2x2"]
+op_type = 0
+
+[sub_resource type="VisualShaderNodeFloatOp" id="VisualShaderNodeFloatOp_wi2x2"]
+default_input_values = [0, 0.0, 1, -1.0]
+operator = 2
+
+[sub_resource type="VisualShaderNodeFloatParameter" id="VisualShaderNodeFloatParameter_wi2x2"]
+parameter_name = "rotation_speed"
+default_value_enabled = true
+default_value = 1.0
+
+[sub_resource type="VisualShaderNodeColorParameter" id="VisualShaderNodeColorParameter_caymd"]
+parameter_name = "base_color"
+default_value_enabled = true
+default_value = Color(3.3, 0, 0.577, 1)
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_caymd"]
+noise_type = 0
+frequency = 0.017
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_caymd"]
+width = 256
+height = 256
+seamless = true
+noise = SubResource("FastNoiseLite_caymd")
+
+[sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_wi2x2"]
+output_port_for_preview = 0
+texture = SubResource("NoiseTexture2D_caymd")
+texture_type = 1
+
+[sub_resource type="VisualShaderNodeFloatOp" id="VisualShaderNodeFloatOp_caymd"]
+output_port_for_preview = 0
+operator = 1
+
+[sub_resource type="Gradient" id="Gradient_caymd"]
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_wi2x2"]
+gradient = SubResource("Gradient_caymd")
+fill_from = Vector2(1, 0)
+fill_to = Vector2(1, 0.423077)
+
+[sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_3tmym"]
+output_port_for_preview = 0
+texture = SubResource("GradientTexture2D_wi2x2")
+texture_type = 1
+
+[sub_resource type="VisualShaderNodeUVFunc" id="VisualShaderNodeUVFunc_caymd"]
+
+[sub_resource type="VisualShaderNodeVectorOp" id="VisualShaderNodeVectorOp_caymd"]
+default_input_values = [0, Vector2(0, 0), 1, Vector2(0, -1)]
+op_type = 0
+operator = 2
+
+[sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_caymd"]
+input_name = "time"
+
+[sub_resource type="VisualShaderNodeClamp" id="VisualShaderNodeClamp_caymd"]
+default_input_values = [0, 0.0, 1, 0.0, 2, 0.5]
+
+[resource]
+code = "shader_type spatial;
+render_mode blend_mix, depth_draw_opaque, cull_disabled, diffuse_lambert, specular_schlick_ggx, unshaded, shadows_disabled, ambient_light_disabled;
+
+uniform vec4 base_color : source_color = vec4(3.300000, 0.000000, 0.577000, 1.000000);
+uniform float rotation_speed = 1.0;
+uniform float speed = 1.0;
+uniform sampler2D tex_frg_3 : source_color;
+uniform sampler2D tex_frg_5 : source_color;
+
+
+
+void fragment() {
+// ColorParameter:2
+       vec4 n_out2p0 = base_color;
+
+
+// Input:8
+       float n_out8p0 = TIME;
+
+
+// FloatParameter:13
+       float n_out13p0 = rotation_speed;
+
+
+// FloatParameter:10
+       float n_out10p0 = speed;
+
+
+// FloatOp:12
+       float n_in12p1 = -1.00000;
+       float n_out12p0 = n_out10p0 * n_in12p1;
+
+
+// VectorCompose:11
+       vec2 n_out11p0 = vec2(n_out13p0, n_out12p0);
+
+
+// VectorOp:7
+       vec2 n_out7p0 = vec2(n_out8p0) * n_out11p0;
+
+
+// UVFunc:6
+       vec2 n_in6p1 = vec2(1.00000, 1.00000);
+       vec2 n_out6p0 = n_out7p0 * n_in6p1 + UV;
+
+
+// Texture2D:3
+       vec4 n_out3p0 = texture(tex_frg_3, n_out6p0);
+
+
+// Texture2D:5
+       vec4 n_out5p0 = texture(tex_frg_5, UV);
+
+
+// FloatOp:4
+       float n_out4p0 = n_out3p0.x - n_out5p0.x;
+
+
+// Clamp:9
+       float n_in9p1 = 0.00000;
+       float n_in9p2 = 0.50000;
+       float n_out9p0 = clamp(n_out4p0, n_in9p1, n_in9p2);
+
+
+// Output:0
+       ALBEDO = vec3(n_out2p0.xyz);
+       ALPHA = n_out9p0;
+
+
+}
+"
+graph_offset = Vector2(-646.088, -139.978)
+modes/cull = 2
+flags/unshaded = true
+flags/shadows_disabled = true
+flags/ambient_light_disabled = true
+nodes/fragment/0/position = Vector2(1180, 160)
+nodes/fragment/2/node = SubResource("VisualShaderNodeColorParameter_caymd")
+nodes/fragment/2/position = Vector2(-680, -180)
+nodes/fragment/3/node = SubResource("VisualShaderNodeTexture_wi2x2")
+nodes/fragment/3/position = Vector2(-640, 300)
+nodes/fragment/4/node = SubResource("VisualShaderNodeFloatOp_caymd")
+nodes/fragment/4/position = Vector2(-20, 520)
+nodes/fragment/5/node = SubResource("VisualShaderNodeTexture_3tmym")
+nodes/fragment/5/position = Vector2(-640, 1260)
+nodes/fragment/6/node = SubResource("VisualShaderNodeUVFunc_caymd")
+nodes/fragment/6/position = Vector2(-1280, 500)
+nodes/fragment/7/node = SubResource("VisualShaderNodeVectorOp_caymd")
+nodes/fragment/7/position = Vector2(-1860, 520)
+nodes/fragment/8/node = SubResource("VisualShaderNodeInput_caymd")
+nodes/fragment/8/position = Vector2(-2700, 460)
+nodes/fragment/9/node = SubResource("VisualShaderNodeClamp_caymd")
+nodes/fragment/9/position = Vector2(500, 480)
+nodes/fragment/10/node = SubResource("VisualShaderNodeFloatParameter_caymd")
+nodes/fragment/10/position = Vector2(-3460, 880)
+nodes/fragment/11/node = SubResource("VisualShaderNodeVectorCompose_wi2x2")
+nodes/fragment/11/position = Vector2(-2380, 760)
+nodes/fragment/12/node = SubResource("VisualShaderNodeFloatOp_wi2x2")
+nodes/fragment/12/position = Vector2(-2860, 820)
+nodes/fragment/13/node = SubResource("VisualShaderNodeFloatParameter_wi2x2")
+nodes/fragment/13/position = Vector2(-3460, 360)
+nodes/fragment/connections = PackedInt32Array(2, 0, 0, 0, 3, 0, 4, 0, 5, 0, 4, 1, 6, 0, 3, 0, 7, 0, 6, 2, 8, 0, 7, 0, 4, 0, 9, 0, 9, 0, 0, 1, 11, 0, 7, 1, 10, 0, 12, 0, 12, 0, 11, 1, 13, 0, 11, 0)
diff --git a/asset/projectile/projectile_trail_shader.tres b/asset/projectile/projectile_trail_shader.tres
new file mode 100644 (file)
index 0000000..27b93cc
--- /dev/null
@@ -0,0 +1,202 @@
+[gd_resource type="VisualShader" load_steps=23 format=3 uid="uid://w1pxn1nolx5n"]
+
+[sub_resource type="VisualShaderNodeFloatParameter" id="VisualShaderNodeFloatParameter_baanr"]
+parameter_name = "speed"
+default_value_enabled = true
+default_value = 1.0
+
+[sub_resource type="VisualShaderNodeFloatOp" id="VisualShaderNodeFloatOp_baanr"]
+operator = 2
+
+[sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_2mh5s"]
+input_name = "time"
+
+[sub_resource type="Gradient" id="Gradient_2mh5s"]
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_baanr"]
+gradient = SubResource("Gradient_2mh5s")
+fill_from = Vector2(0.854701, 0.965812)
+fill_to = Vector2(0.433761, 1)
+
+[sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_baanr"]
+texture = SubResource("GradientTexture2D_baanr")
+
+[sub_resource type="VisualShaderNodeFloatOp" id="VisualShaderNodeFloatOp_2mh5s"]
+operator = 2
+
+[sub_resource type="VisualShaderNodeFloatOp" id="VisualShaderNodeFloatOp_4g5rp"]
+output_port_for_preview = 0
+operator = 2
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_luuak"]
+gradient = SubResource("Gradient_2mh5s")
+fill_from = Vector2(0.119658, 0.970085)
+fill_to = Vector2(0.529915, 1)
+
+[sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_1f1av"]
+texture = SubResource("GradientTexture2D_luuak")
+
+[sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_2mh5s"]
+source = 5
+
+[sub_resource type="VisualShaderNodeTexture2DParameter" id="VisualShaderNodeTexture2DParameter_4g5rp"]
+parameter_name = "colors"
+
+[sub_resource type="VisualShaderNodeUVFunc" id="VisualShaderNodeUVFunc_2mh5s"]
+expanded_output_ports = [0]
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_4g5rp"]
+gradient = SubResource("Gradient_2mh5s")
+fill_from = Vector2(0, 0.568376)
+fill_to = Vector2(0, 0)
+
+[sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_luuak"]
+output_port_for_preview = 0
+texture = SubResource("GradientTexture2D_4g5rp")
+
+[sub_resource type="FastNoiseLite" id="FastNoiseLite_baanr"]
+frequency = 0.0033
+
+[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_2mh5s"]
+seamless = true
+noise = SubResource("FastNoiseLite_baanr")
+
+[sub_resource type="VisualShaderNodeTexture" id="VisualShaderNodeTexture_4g5rp"]
+output_port_for_preview = 0
+texture = SubResource("NoiseTexture2D_2mh5s")
+
+[sub_resource type="VisualShaderNodeFloatOp" id="VisualShaderNodeFloatOp_luuak"]
+operator = 1
+
+[sub_resource type="VisualShaderNodeClamp" id="VisualShaderNodeClamp_baanr"]
+
+[sub_resource type="VisualShaderNodeUVFunc" id="VisualShaderNodeUVFunc_baanr"]
+
+[sub_resource type="VisualShaderNodeVectorCompose" id="VisualShaderNodeVectorCompose_baanr"]
+default_input_values = [0, 1.0, 1, 0.0, 2, 0.0]
+op_type = 0
+
+[resource]
+code = "shader_type spatial;
+render_mode blend_mix, depth_draw_opaque, cull_disabled, diffuse_lambert, specular_schlick_ggx;
+
+uniform sampler2D colors;
+uniform float speed = 1.0;
+uniform sampler2D tex_frg_4;
+uniform sampler2D tex_frg_3;
+uniform sampler2D tex_frg_13;
+uniform sampler2D tex_frg_18;
+
+
+
+void fragment() {
+// UVFunc:21
+       vec2 n_in21p1 = vec2(1.00000, 1.00000);
+       vec2 n_in21p2 = vec2(0.00000, 0.00000);
+       vec2 n_out21p0 = n_in21p2 * n_in21p1 + UV;
+
+
+       vec4 n_out19p0;
+// Texture2D:19
+       n_out19p0 = texture(colors, n_out21p0);
+
+
+// Input:12
+       float n_out12p0 = TIME;
+
+
+// FloatParameter:10
+       float n_out10p0 = speed;
+
+
+// FloatOp:11
+       float n_out11p0 = n_out12p0 * n_out10p0;
+
+
+// VectorCompose:8
+       float n_in8p0 = 1.00000;
+       vec2 n_out8p0 = vec2(n_in8p0, n_out11p0);
+
+
+// UVFunc:7
+       vec2 n_in7p1 = vec2(1.00000, 1.00000);
+       vec2 n_out7p0 = n_out8p0 * n_in7p1 + UV;
+
+
+// Texture2D:4
+       vec4 n_out4p0 = texture(tex_frg_4, n_out7p0);
+
+
+// Texture2D:3
+       vec4 n_out3p0 = texture(tex_frg_3, UV);
+
+
+// FloatOp:5
+       float n_out5p0 = n_out4p0.x - n_out3p0.x;
+
+
+// Texture2D:13
+       vec4 n_out13p0 = texture(tex_frg_13, UV);
+
+
+// Texture2D:18
+       vec4 n_out18p0 = texture(tex_frg_18, UV);
+
+
+// FloatOp:17
+       float n_out17p0 = n_out13p0.x * n_out18p0.x;
+
+
+// FloatOp:15
+       float n_out15p0 = n_out5p0 * n_out17p0;
+
+
+// Clamp:6
+       float n_in6p1 = 0.00000;
+       float n_in6p2 = 1.00000;
+       float n_out6p0 = clamp(n_out15p0, n_in6p1, n_in6p2);
+
+
+// Output:0
+       ALBEDO = vec3(n_out19p0.xyz);
+       ALPHA = n_out6p0;
+
+
+}
+"
+graph_offset = Vector2(-285.482, -150.426)
+modes/cull = 2
+nodes/fragment/0/position = Vector2(2860, 360)
+nodes/fragment/3/node = SubResource("VisualShaderNodeTexture_luuak")
+nodes/fragment/3/position = Vector2(-420, 1440)
+nodes/fragment/4/node = SubResource("VisualShaderNodeTexture_4g5rp")
+nodes/fragment/4/position = Vector2(-420, 500)
+nodes/fragment/5/node = SubResource("VisualShaderNodeFloatOp_luuak")
+nodes/fragment/5/position = Vector2(240, 700)
+nodes/fragment/6/node = SubResource("VisualShaderNodeClamp_baanr")
+nodes/fragment/6/position = Vector2(2320, 780)
+nodes/fragment/7/node = SubResource("VisualShaderNodeUVFunc_baanr")
+nodes/fragment/7/position = Vector2(-1100, 700)
+nodes/fragment/8/node = SubResource("VisualShaderNodeVectorCompose_baanr")
+nodes/fragment/8/position = Vector2(-1609.15, 727.385)
+nodes/fragment/10/node = SubResource("VisualShaderNodeFloatParameter_baanr")
+nodes/fragment/10/position = Vector2(-2920, 1220)
+nodes/fragment/11/node = SubResource("VisualShaderNodeFloatOp_baanr")
+nodes/fragment/11/position = Vector2(-2167.19, 791.113)
+nodes/fragment/12/node = SubResource("VisualShaderNodeInput_2mh5s")
+nodes/fragment/12/position = Vector2(-2900, 780)
+nodes/fragment/13/node = SubResource("VisualShaderNodeTexture_baanr")
+nodes/fragment/13/position = Vector2(580, 1120)
+nodes/fragment/15/node = SubResource("VisualShaderNodeFloatOp_2mh5s")
+nodes/fragment/15/position = Vector2(1660, 700)
+nodes/fragment/17/node = SubResource("VisualShaderNodeFloatOp_4g5rp")
+nodes/fragment/17/position = Vector2(1140, 1420)
+nodes/fragment/18/node = SubResource("VisualShaderNodeTexture_1f1av")
+nodes/fragment/18/position = Vector2(600, 1700)
+nodes/fragment/19/node = SubResource("VisualShaderNodeTexture_2mh5s")
+nodes/fragment/19/position = Vector2(1620, -140)
+nodes/fragment/20/node = SubResource("VisualShaderNodeTexture2DParameter_4g5rp")
+nodes/fragment/20/position = Vector2(20, -140)
+nodes/fragment/21/node = SubResource("VisualShaderNodeUVFunc_2mh5s")
+nodes/fragment/21/position = Vector2(900, -240)
+nodes/fragment/connections = PackedInt32Array(6, 0, 0, 1, 3, 0, 5, 1, 4, 0, 5, 0, 7, 0, 4, 0, 8, 0, 7, 2, 11, 0, 8, 1, 10, 0, 11, 1, 12, 0, 11, 0, 5, 0, 15, 0, 15, 0, 6, 0, 13, 0, 17, 0, 18, 0, 17, 1, 17, 0, 15, 1, 19, 0, 0, 0, 20, 0, 19, 2, 21, 0, 19, 0)