diff --git a/app/scenes/menu_body/world.tscn b/app/scenes/menu_body/world.tscn index f9a247a..86c802e 100644 --- a/app/scenes/menu_body/world.tscn +++ b/app/scenes/menu_body/world.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=40 format=3 uid="uid://kywrsqro3d5i"] +[gd_scene load_steps=42 format=3 uid="uid://kywrsqro3d5i"] [ext_resource type="Script" path="res://scripts/loading/gate_loader.gd" id="1_uxhy6"] [ext_resource type="Resource" uid="uid://b1xvdym0qh6td" path="res://resources/gate_events.res" id="2_q7cvi"] @@ -10,17 +10,17 @@ [ext_resource type="Resource" uid="uid://bo6qgr210aamc" path="res://resources/sandbox_env.tres" id="8_a6dvr"] [ext_resource type="Script" path="res://scripts/sandbox/sandbox_logger.gd" id="9_fikc8"] [ext_resource type="Resource" uid="uid://crjhix0osmtnf" path="res://resources/ui_events.res" id="9_ir58h"] -[ext_resource type="Script" path="res://scripts/ui/world/world_canvas.gd" id="9_ncfxj"] [ext_resource type="Shader" path="res://shaders/render_result.gdshader" id="10_2auwe"] [ext_resource type="Script" path="res://scripts/sandbox/command_sync.gd" id="10_cqo55"] [ext_resource type="Resource" uid="uid://cjcdum6fm4ta0" path="res://resources/api_settings.tres" id="10_vhc7k"] [ext_resource type="Script" path="res://scripts/sandbox/process_checker.gd" id="11_72cjp"] [ext_resource type="Script" path="res://scripts/ui/world/world_ui.gd" id="12_jdwjt"] -[ext_resource type="Script" path="res://scripts/ui/world/splash_screen.gd" id="13_3b6nd"] +[ext_resource type="Script" path="res://scripts/ui/world/foreground.gd" id="17_6e5v3"] [ext_resource type="PackedScene" uid="uid://c7571vjq7l0jp" path="res://scenes/components/not_responding.tscn" id="17_kwbm3"] [ext_resource type="Script" path="res://scripts/ui/world/gate_info.gd" id="18_q06xu"] [ext_resource type="Shader" uid="uid://dd1axtdlit6no" path="res://shaders/vignette_blur.tres" id="18_sat0u"] -[ext_resource type="Script" path="res://scripts/ui/fullscreen_animation.gd" id="18_sx3kr"] +[ext_resource type="Script" path="res://scripts/ui/ui_mode_animation.gd" id="18_sx3kr"] +[ext_resource type="Script" path="res://scripts/ui/world/vignette_blur.gd" id="19_415fa"] [ext_resource type="FontFile" uid="uid://do40418waa8w3" path="res://assets/fonts/Inter-Regular.otf" id="19_tkqw6"] [ext_resource type="FontFile" uid="uid://bjeupg0ikc2kv" path="res://assets/fonts/Monospace.ttf" id="20_hoet7"] [ext_resource type="LabelSettings" uid="uid://crt4elt055uhg" path="res://assets/styles/text_big.tres" id="20_v1648"] @@ -28,6 +28,7 @@ [ext_resource type="FontFile" uid="uid://tfj3o1e1wytn" path="res://assets/fonts/Inter-BoldItalic.otf" id="22_i5khx"] [ext_resource type="FontFile" uid="uid://c14w1y1r54wgi" path="res://assets/fonts/Inter-Bold.otf" id="23_t1gqo"] [ext_resource type="PackedScene" uid="uid://dr1hykfog1h85" path="res://scenes/components/gate_status.tscn" id="25_3436m"] +[ext_resource type="Script" path="res://scripts/ui/world/release_focus.gd" id="26_u6afs"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_be6ex"] resource_local_to_scene = true @@ -36,7 +37,7 @@ shader_parameter/ext_texture_is_bgra = null shader_parameter/show_render = null [sub_resource type="Curve" id="Curve_rju31"] -_data = [Vector2(0.0702341, 1), 0.0, -0.118897, 0, 0, Vector2(0.270903, 0.720054), -3.7783, -3.7783, 0, 0, Vector2(0.444816, 0.308883), -1.03045, -1.03045, 0, 0, Vector2(1, 0.160161), 0.0, 0.0, 0, 0] +_data = [Vector2(0.090301, 0.772544), 0.0, -0.118897, 0, 0, Vector2(0.307692, 0.510094), -2.18127, -2.18127, 0, 0, Vector2(0.605578, 0.0776294), -1.01166, -1.01166, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] point_count = 4 [sub_resource type="CurveTexture" id="CurveTexture_fomqh"] @@ -44,8 +45,9 @@ curve = SubResource("Curve_rju31") [sub_resource type="ShaderMaterial" id="ShaderMaterial_bspld"] shader = ExtResource("18_sat0u") -shader_parameter/BlurAmount = 3.0 -shader_parameter/VignetteColor = Color(0.0137093, 0.00449686, 0.0741505, 1) +shader_parameter/UVScale = Vector2(0.9, 0.9) +shader_parameter/BlurAmount = 2.5 +shader_parameter/VignetteColor = Color(0.126, 0.1719, 0.18, 1) shader_parameter/Vignette = SubResource("CurveTexture_fomqh") [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_axrau"] @@ -61,6 +63,8 @@ corner_radius_bottom_left = 25 [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jiaac"] bg_color = Color(0, 0, 0, 0.2) +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_tnu6q"] + [sub_resource type="Animation" id="Animation_beyyv"] length = 0.001 tracks/0/type = "value" @@ -77,7 +81,7 @@ tracks/0/keys = { } [sub_resource type="Animation" id="Animation_tper3"] -resource_name = "fullscreen" +resource_name = "focused" length = 0.25 step = 0.05 tracks/0/type = "value" @@ -113,7 +117,7 @@ tracks/0/keys = { [sub_resource type="AnimationLibrary" id="AnimationLibrary_sld6k"] _data = { "RESET": SubResource("Animation_beyyv"), -"fullscreen": SubResource("Animation_tper3"), +"focused": SubResource("Animation_tper3"), "initial": SubResource("Animation_77flb") } @@ -175,9 +179,6 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 size_flags_horizontal = 0 -script = ExtResource("9_ncfxj") -ui_events = ExtResource("9_ir58h") -interpolate = 1.0 [node name="RenderResult" type="TextureRect" parent="WorldCanvas"] texture_filter = 2 @@ -204,7 +205,7 @@ grow_horizontal = 2 grow_vertical = 2 focus_mode = 0 -[node name="Foreground" type="Control" parent="."] +[node name="Foreground" type="Control" parent="." node_paths=PackedStringArray("splash_screen", "vignette_blur", "click_anywhere")] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -212,8 +213,14 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 +script = ExtResource("17_6e5v3") +gate_events = ExtResource("2_q7cvi") +ui_events = ExtResource("9_ir58h") +splash_screen = NodePath("SplashScreen") +vignette_blur = NodePath("VignetteBlur") +click_anywhere = NodePath("ClickAnywhere") -[node name="SplashScreen" type="TextureRect" parent="Foreground" node_paths=PackedStringArray("render_result")] +[node name="SplashScreen" type="TextureRect" parent="Foreground"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -223,11 +230,6 @@ grow_vertical = 2 mouse_filter = 2 expand_mode = 1 stretch_mode = 6 -script = ExtResource("13_3b6nd") -gate_events = ExtResource("2_q7cvi") -command_events = ExtResource("6_18mgg") -ui_events = ExtResource("9_ir58h") -render_result = NodePath("../../WorldCanvas/RenderResult") [node name="VignetteBlur" type="Panel" parent="Foreground"] material = SubResource("ShaderMaterial_bspld") @@ -239,8 +241,24 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_axrau") +script = ExtResource("19_415fa") +blur_amount_game = 1.5 +uv_scale = Vector2(0.97, 0.97) -[node name="GateInfo" type="VBoxContainer" parent="Foreground" node_paths=PackedStringArray("image", "title", "description")] +[node name="ClickAnywhere" type="Label" parent="Foreground"] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -175.5 +offset_top = 50.0 +offset_right = 175.5 +offset_bottom = 75.0 +grow_horizontal = 2 +text = "Click Anywhere to Play → ESC to Exit" +label_settings = ExtResource("20_v1648") + +[node name="GateInfo" type="VBoxContainer" parent="Foreground" node_paths=PackedStringArray("image", "image_darken", "title", "description", "gate_status")] layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -250,20 +268,20 @@ offset_top = -90.0 offset_right = 562.0 offset_bottom = -50.0 grow_vertical = 0 -mouse_filter = 2 theme_override_constants/separation = 12 alignment = 2 script = ExtResource("18_q06xu") gate_events = ExtResource("2_q7cvi") image = NodePath("Image/TextureRect") +image_darken = NodePath("Image/Panel") title = NodePath("Title") description = NodePath("RichTextLabel") +gate_status = [NodePath("Space2"), NodePath("GateStatus")] [node name="Image" type="Panel" parent="Foreground/GateInfo"] clip_children = 1 custom_minimum_size = Vector2(0, 256) layout_mode = 2 -mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_vnx4g") [node name="TextureRect" type="TextureRect" parent="Foreground/GateInfo/Image"] @@ -288,15 +306,34 @@ theme_override_styles/panel = SubResource("StyleBoxFlat_jiaac") [node name="Space" type="Control" parent="Foreground/GateInfo"] custom_minimum_size = Vector2(0, 6) layout_mode = 2 -mouse_filter = 2 -[node name="Title" type="Label" parent="Foreground/GateInfo"] +[node name="Title" type="RichTextLabel" parent="Foreground/GateInfo"] layout_mode = 2 +focus_mode = 2 +mouse_default_cursor_shape = 1 +theme_override_colors/default_color = Color(0.831373, 0.831373, 0.831373, 1) +theme_override_colors/selection_color = Color(0.419608, 0.231373, 0.929412, 0.588235) +theme_override_fonts/normal_font = ExtResource("19_tkqw6") +theme_override_fonts/mono_font = ExtResource("20_hoet7") +theme_override_fonts/italics_font = ExtResource("21_lpegk") +theme_override_fonts/bold_italics_font = ExtResource("22_i5khx") +theme_override_fonts/bold_font = ExtResource("23_t1gqo") +theme_override_font_sizes/bold_italics_font_size = 20 +theme_override_font_sizes/italics_font_size = 20 +theme_override_font_sizes/mono_font_size = 20 +theme_override_font_sizes/normal_font_size = 20 +theme_override_font_sizes/bold_font_size = 15 +theme_override_styles/focus = SubResource("StyleBoxEmpty_tnu6q") text = "Welcome" -label_settings = ExtResource("20_v1648") +fit_content = true +context_menu_enabled = true +selection_enabled = true +script = ExtResource("26_u6afs") [node name="RichTextLabel" type="RichTextLabel" parent="Foreground/GateInfo"] layout_mode = 2 +focus_mode = 2 +mouse_default_cursor_shape = 1 theme_override_colors/default_color = Color(0.831373, 0.831373, 0.831373, 1) theme_override_colors/selection_color = Color(0.419608, 0.231373, 0.929412, 0.588235) theme_override_fonts/normal_font = ExtResource("19_tkqw6") @@ -309,9 +346,13 @@ theme_override_font_sizes/italics_font_size = 15 theme_override_font_sizes/mono_font_size = 15 theme_override_font_sizes/normal_font_size = 15 theme_override_font_sizes/bold_font_size = 15 +theme_override_styles/focus = SubResource("StyleBoxEmpty_tnu6q") bbcode_enabled = true -text = "A slot machine battler instead of money its points that you can use to heal and attack. upgrade your build and attack enemies and become the best on the leaderboard" +text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat" fit_content = true +context_menu_enabled = true +selection_enabled = true +script = ExtResource("26_u6afs") [node name="Space2" type="Control" parent="Foreground/GateInfo"] custom_minimum_size = Vector2(0, 26) diff --git a/app/scripts/resources/ui_events.gd b/app/scripts/resources/ui_events.gd index 43d6b71..5bad45b 100644 --- a/app/scripts/resources/ui_events.gd +++ b/app/scripts/resources/ui_events.gd @@ -7,7 +7,7 @@ signal ui_size_changed(size: Vector2) enum UiMode { INITIAL, - FULL_SCREEN + FOCUSED } var current_ui_size: Vector2 diff --git a/app/scripts/sandbox/input_sync.gd b/app/scripts/sandbox/input_sync.gd index 21279d8..3d2014d 100644 --- a/app/scripts/sandbox/input_sync.gd +++ b/app/scripts/sandbox/input_sync.gd @@ -26,7 +26,7 @@ func start_server() -> void: func on_ui_mode_changed(mode: UiEvents.UiMode) -> void: - should_send = mode == UiEvents.UiMode.FULL_SCREEN + should_send = mode == UiEvents.UiMode.FOCUSED func _input(_event: InputEvent) -> void: diff --git a/app/scripts/ui/fullscreen_animation.gd b/app/scripts/ui/ui_mode_animation.gd similarity index 62% rename from app/scripts/ui/fullscreen_animation.gd rename to app/scripts/ui/ui_mode_animation.gd index 5236b12..00232a8 100644 --- a/app/scripts/ui/fullscreen_animation.gd +++ b/app/scripts/ui/ui_mode_animation.gd @@ -5,9 +5,9 @@ extends AnimationPlayer const RESET := "RESET" const INITIAL := "initial" -const FULLSCREEN := "fullscreen" +const FOCUSED := "focused" -var fullscreen := false +var focused := false func _ready() -> void: @@ -16,10 +16,10 @@ func _ready() -> void: func on_ui_mode_changed(mode: UiEvents.UiMode) -> void: - if mode == UiEvents.UiMode.INITIAL and fullscreen: - fullscreen = false + if mode == UiEvents.UiMode.INITIAL and focused: + focused = false play(INITIAL) - if mode == UiEvents.UiMode.FULL_SCREEN and not fullscreen: - fullscreen = true - play(FULLSCREEN) + if mode == UiEvents.UiMode.FOCUSED and not focused: + focused = true + play(FOCUSED) diff --git a/app/scripts/ui/world/foreground.gd b/app/scripts/ui/world/foreground.gd new file mode 100644 index 0000000..33032a9 --- /dev/null +++ b/app/scripts/ui/world/foreground.gd @@ -0,0 +1,35 @@ +extends Control + +@export var gate_events: GateEvents +@export var ui_events: UiEvents +@export var splash_screen: TextureRect +@export var vignette_blur: VignetteBlur +@export var click_anywhere: Control + + +func _ready() -> void: + gate_events.gate_info_loaded.connect(show_thumbnail) + gate_events.first_frame.connect(on_first_frame) + ui_events.ui_mode_changed.connect(on_ui_mode_changed) + vignette_blur.hide() + click_anywhere.hide() + + +func show_thumbnail(gate: Gate, _is_cached: bool) -> void: + splash_screen.texture = FileTools.load_external_tex(gate.image) + vignette_blur.show() + + +func on_first_frame() -> void: + splash_screen.hide() + click_anywhere.show() + vignette_blur.gate_started_params() + + +func on_ui_mode_changed(mode: UiEvents.UiMode) -> void: + if mode == UiEvents.UiMode.INITIAL: + show() + + if mode == UiEvents.UiMode.FOCUSED: + click_anywhere.hide() + hide() diff --git a/app/scripts/ui/world/gate_info.gd b/app/scripts/ui/world/gate_info.gd index ac5b424..2e18f9c 100644 --- a/app/scripts/ui/world/gate_info.gd +++ b/app/scripts/ui/world/gate_info.gd @@ -3,15 +3,19 @@ extends Control @export var gate_events: GateEvents @export var image: TextureRect -@export var title: Label +@export var image_darken: Control +@export var title: RichTextLabel @export var description: RichTextLabel +@export var gate_status: Array[Control] var gate: Gate func _ready() -> void: gate_events.gate_info_loaded.connect(display_info) + gate_events.first_frame.connect(on_first_frame) gate_events.gate_error.connect(on_gate_error) + clear_info() func display_info(_gate: Gate, _is_cached: bool) -> void: @@ -19,6 +23,20 @@ func display_info(_gate: Gate, _is_cached: bool) -> void: title.text = "Unnamed" if gate.title.is_empty() else gate.title description.text = "No description" if gate.description.is_empty() else gate.description image.texture = FileTools.load_external_tex(gate.image) + if is_instance_valid(image.texture): image_darken.show() + + +func clear_info() -> void: + gate = null + title.text = "" + description.text = "" + image.texture = null + image_darken.hide() + + +func on_first_frame() -> void: + for node in gate_status: + node.hide() func on_gate_error(_code: GateEvents.GateError) -> void: diff --git a/app/scripts/ui/world/splash_screen.gd b/app/scripts/ui/world/splash_screen.gd deleted file mode 100644 index c4ce81c..0000000 --- a/app/scripts/ui/world/splash_screen.gd +++ /dev/null @@ -1,17 +0,0 @@ -extends TextureRect -class_name SplashScreen - -@export var gate_events: GateEvents -@export var command_events: CommandEvents -@export var ui_events: UiEvents -@export var render_result: RenderResult - - -func _ready(): - gate_events.gate_info_loaded.connect(show_thumbnail) - #gate_events.first_frame.connect(func(): hide()) - - -func show_thumbnail(gate: Gate, _is_cached: bool) -> void: - #if is_cached: return # Resource pack is already downloaded - texture = FileTools.load_external_tex(gate.image) diff --git a/app/scripts/ui/world/vignette_blur.gd b/app/scripts/ui/world/vignette_blur.gd new file mode 100644 index 0000000..f2c4c99 --- /dev/null +++ b/app/scripts/ui/world/vignette_blur.gd @@ -0,0 +1,17 @@ +extends Control +class_name VignetteBlur + +const BLUR_AMOUNT = "BlurAmount" +const UV_SCALE = "UVScale" + +@export var blur_amount_game: float +@export var uv_scale: Vector2 + + +func gate_started_params() -> void: + set_param(BLUR_AMOUNT, blur_amount_game) + set_param(UV_SCALE, uv_scale) + + +func set_param(param: StringName, value: Variant) -> void: + (material as ShaderMaterial).set_shader_parameter(param, value) diff --git a/app/scripts/ui/world/world_ui.gd b/app/scripts/ui/world/world_ui.gd index 69f46be..a3e5e0d 100644 --- a/app/scripts/ui/world/world_ui.gd +++ b/app/scripts/ui/world/world_ui.gd @@ -5,12 +5,14 @@ extends Control @export var command_events: CommandEvents @export var render_result: RenderResult +var gate_started: bool var mouse_mode: int = Input.MOUSE_MODE_VISIBLE var _visible: bool = true func _ready() -> void: command_events.set_mouse_mode.connect(set_mouse_mode) + gate_events.first_frame.connect(func(): gate_started = true) gate_events.not_responding.connect(func(): set_mouse_mode(Input.MOUSE_MODE_VISIBLE)) Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) @@ -38,9 +40,9 @@ func show_ui() -> void: func hide_ui() -> void: - if not _visible: return + if not _visible or not gate_started: return _visible = false Input.set_mouse_mode(mouse_mode) - ui_events.ui_mode_changed_emit(UiEvents.UiMode.FULL_SCREEN) + ui_events.ui_mode_changed_emit(UiEvents.UiMode.FOCUSED) render_result.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST diff --git a/app/shaders/vignette_blur.tres b/app/shaders/vignette_blur.tres index 77cb86f..bbedc18 100644 --- a/app/shaders/vignette_blur.tres +++ b/app/shaders/vignette_blur.tres @@ -1,4 +1,4 @@ -[gd_resource type="VisualShader" load_steps=16 format=3 uid="uid://dd1axtdlit6no"] +[gd_resource type="VisualShader" load_steps=17 format=3 uid="uid://dd1axtdlit6no"] [sub_resource type="VisualShaderNodeTexture2DParameter" id="VisualShaderNodeTexture2DParameter_t1tvu"] parameter_name = "Vignette" @@ -35,6 +35,9 @@ operator = 2 default_input_values = [0, Vector3(1, 1, 1), 1, Vector3(-1, -1, 0)] operator = 1 +[sub_resource type="VisualShaderNodeVec2Parameter" id="VisualShaderNodeVec2Parameter_ren8n"] +parameter_name = "UVScale" + [sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_24i63"] input_name = "screen_uv" @@ -55,6 +58,7 @@ max = 5.0 code = "shader_type canvas_item; render_mode blend_disabled; +uniform vec2 UVScale; uniform float BlurAmount : hint_range(0, 5, 0.10000000149012); uniform sampler2D ScreenTexture : filter_linear_mipmap, hint_screen_texture; uniform sampler2D Vignette : filter_linear_mipmap, repeat_enable; @@ -67,10 +71,13 @@ void fragment() { vec2 n_out4p0 = SCREEN_UV; +// Vector2Parameter:27 + vec2 n_out27p0 = UVScale; + + // UVFunc:21 - vec2 n_in21p1 = vec2(0.90000, 0.90000); vec2 n_in21p2 = vec2(0.50000, 0.50000); - vec2 n_out21p0 = (n_out4p0 - n_in21p2) * n_in21p1 + n_in21p2; + vec2 n_out21p0 = (n_out4p0 - n_in21p2) * n_out27p0 + n_in21p2; // FloatParameter:9 @@ -136,39 +143,41 @@ void fragment() { } " -graph_offset = Vector2(-281.758, 131.259) +graph_offset = Vector2(-708.833, 8.55267) mode = 1 modes/blend = 5 flags/light_only = false nodes/fragment/0/position = Vector2(680, 160) nodes/fragment/4/node = SubResource("VisualShaderNodeInput_24i63") -nodes/fragment/4/position = Vector2(-480, -540) +nodes/fragment/4/position = Vector2(-760, -620) nodes/fragment/7/node = SubResource("VisualShaderNodeTexture_le3j7") -nodes/fragment/7/position = Vector2(20, 40) +nodes/fragment/7/position = Vector2(20, -320) nodes/fragment/8/node = SubResource("VisualShaderNodeTexture2DParameter_u0lfa") nodes/fragment/8/position = Vector2(-480, -120) nodes/fragment/9/node = SubResource("VisualShaderNodeFloatParameter_383fa") nodes/fragment/9/position = Vector2(-420, -440) nodes/fragment/10/node = SubResource("VisualShaderNodeTexture2DParameter_t1tvu") -nodes/fragment/10/position = Vector2(-980, 560) +nodes/fragment/10/position = Vector2(-1140, 740) nodes/fragment/11/node = SubResource("VisualShaderNodeTexture_qsusy") -nodes/fragment/11/position = Vector2(-500, 440) +nodes/fragment/11/position = Vector2(-660, 620) nodes/fragment/15/node = SubResource("VisualShaderNodeMultiplyAdd_e4whf") -nodes/fragment/15/position = Vector2(-840, 320) +nodes/fragment/15/position = Vector2(-1000, 500) nodes/fragment/16/node = SubResource("VisualShaderNodeVec2Constant_4drcy") -nodes/fragment/16/position = Vector2(-1080, 400) +nodes/fragment/16/position = Vector2(-1240, 580) nodes/fragment/18/node = SubResource("VisualShaderNodeUVPolarCoord_0o2bh") -nodes/fragment/18/position = Vector2(-1120, 200) +nodes/fragment/18/position = Vector2(-1280, 380) nodes/fragment/20/node = SubResource("VisualShaderNodeColorParameter_juddb") -nodes/fragment/20/position = Vector2(-400, 860) +nodes/fragment/20/position = Vector2(-560, 1040) nodes/fragment/21/node = SubResource("VisualShaderNodeUVFunc_1ddw1") -nodes/fragment/21/position = Vector2(-20, -500) +nodes/fragment/21/position = Vector2(-380, -640) nodes/fragment/23/node = SubResource("VisualShaderNodeVectorOp_w3k0x") -nodes/fragment/23/position = Vector2(180, 420) +nodes/fragment/23/position = Vector2(20, 600) nodes/fragment/24/node = SubResource("VisualShaderNodeVectorOp_0a06v") nodes/fragment/24/position = Vector2(400, 180) nodes/fragment/25/node = SubResource("VisualShaderNodeVectorOp_g3bno") -nodes/fragment/25/position = Vector2(0, 660) +nodes/fragment/25/position = Vector2(-160, 840) nodes/fragment/26/node = SubResource("VisualShaderNodeVectorOp_4s8mp") -nodes/fragment/26/position = Vector2(-260, 600) -nodes/fragment/connections = PackedInt32Array(8, 0, 7, 2, 9, 0, 7, 1, 10, 0, 11, 2, 15, 0, 11, 0, 16, 0, 15, 2, 18, 0, 15, 0, 4, 0, 21, 0, 11, 0, 23, 0, 7, 0, 24, 0, 25, 0, 23, 1, 20, 0, 25, 1, 26, 0, 25, 0, 11, 0, 26, 1, 23, 0, 24, 1, 24, 0, 0, 0, 21, 0, 7, 0) +nodes/fragment/26/position = Vector2(-420, 780) +nodes/fragment/27/node = SubResource("VisualShaderNodeVec2Parameter_ren8n") +nodes/fragment/27/position = Vector2(-1060, -680) +nodes/fragment/connections = PackedInt32Array(8, 0, 7, 2, 9, 0, 7, 1, 10, 0, 11, 2, 15, 0, 11, 0, 16, 0, 15, 2, 18, 0, 15, 0, 4, 0, 21, 0, 11, 0, 23, 0, 7, 0, 24, 0, 25, 0, 23, 1, 20, 0, 25, 1, 26, 0, 25, 0, 11, 0, 26, 1, 23, 0, 24, 1, 24, 0, 0, 0, 21, 0, 7, 0, 27, 0, 21, 1)