From 180cd61521e5df09cca4bf3c6de1a0d651becd1c Mon Sep 17 00:00:00 2001 From: Bastiaan Olij Date: Fri, 9 Oct 2026 01:51:38 +1100 Subject: [PATCH] Upgrade to Godot XR Tools v4.5.2 --- VERSIONS.md | 4 +- addons/godot-xr-tools/VERSIONS.md | 7 + .../movement_desktop_crouch.gd | 6 +- .../movement_desktop_direct.gd | 6 +- .../movement_desktop_flight.gd | 8 +- .../desktop-support/movement_desktop_jump.gd | 6 +- .../movement_desktop_sprint.gd | 6 +- .../desktop-support/movement_desktop_turn.gd | 6 +- addons/godot-xr-tools/examples/fall_damage.gd | 8 +- .../functions/function_teleport.gd | 4 +- .../animations/left/hand_blend_tree.tres | 4 +- .../animations/right/hand_blend_tree.tres | 4 +- .../godot-xr-tools/materials/highlight.tres | 38 ++++- .../misc/hold_button_visualshader.tres | 155 +++++++++++++++++- .../objects/viewport_2d_in_3d.gd | 4 +- addons/godot-xr-tools/plugin.cfg | 2 +- .../loading_screen/loading_screen_shader.tres | 91 +++++++++- 17 files changed, 330 insertions(+), 29 deletions(-) diff --git a/VERSIONS.md b/VERSIONS.md index 357a0fa..bdb2135 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -1,7 +1,9 @@ # 4.5.1 -- Fix broken link + - Fix broken link - Upgrade to using Godot 4.7.2 and Vendor plugin 5.1.0 - Update CI accordingly + - Upgrade Godot XR Tools to 4.5.2 + - Upgrade to using Godot 4.7 # 4.5.0 - Upgrade Godot XR Tools to 4.5.1 diff --git a/addons/godot-xr-tools/VERSIONS.md b/addons/godot-xr-tools/VERSIONS.md index e743707..39c489b 100644 --- a/addons/godot-xr-tools/VERSIONS.md +++ b/addons/godot-xr-tools/VERSIONS.md @@ -1,3 +1,10 @@ +# 4.5.2 +- Fix _property_get_revert() throwing error +- Change physics_movement() return type to bool + +# 4.5.1 +- Fix export issue + # 4.5.0 - Minimum Godot version changed to 4.4 - Added UIDs for all classes diff --git a/addons/godot-xr-tools/desktop-support/movement_desktop_crouch.gd b/addons/godot-xr-tools/desktop-support/movement_desktop_crouch.gd index d5e9505..a2fad07 100644 --- a/addons/godot-xr-tools/desktop-support/movement_desktop_crouch.gd +++ b/addons/godot-xr-tools/desktop-support/movement_desktop_crouch.gd @@ -52,10 +52,10 @@ func is_xr_class(xr_name: String) -> bool: # Perform jump movement -func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: bool): +func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: bool) -> bool: # Skip if the controller isn't active if !player_body.enabled or xr_start_node.is_xr_active(): - return + return false # Detect crouch button down and pressed states var crouch_button_down := Input.is_action_pressed(crouch_button_action) @@ -81,3 +81,5 @@ func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: player_body.override_player_height(self, crouch_height) else: player_body.override_player_height(self) + + return false diff --git a/addons/godot-xr-tools/desktop-support/movement_desktop_direct.gd b/addons/godot-xr-tools/desktop-support/movement_desktop_direct.gd index edcf9e0..4e824c7 100644 --- a/addons/godot-xr-tools/desktop-support/movement_desktop_direct.gd +++ b/addons/godot-xr-tools/desktop-support/movement_desktop_direct.gd @@ -41,10 +41,10 @@ func is_xr_class(xr_name: String) -> bool: # Perform jump movement -func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: bool): +func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: bool) -> bool: # Skip if the controller isn't active if !player_body.enabled or xr_start_node.is_xr_active(): - return + return false #Calculate input vector var input_dir = Input.get_vector(input_left, input_right, input_backward, input_forward) @@ -61,6 +61,8 @@ func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: if length > max_speed: player_body.ground_control_velocity *= max_speed / length + return false + ## Find the right [XRToolsDesktopMovementDirect] node. ## ## This function searches from the specified node for the right controller diff --git a/addons/godot-xr-tools/desktop-support/movement_desktop_flight.gd b/addons/godot-xr-tools/desktop-support/movement_desktop_flight.gd index 461e121..1d95127 100644 --- a/addons/godot-xr-tools/desktop-support/movement_desktop_flight.gd +++ b/addons/godot-xr-tools/desktop-support/movement_desktop_flight.gd @@ -89,11 +89,11 @@ func _ready(): # Process physics movement for flight -func physics_movement(delta: float, player_body: XRToolsPlayerBody, disabled: bool): +func physics_movement(delta: float, player_body: XRToolsPlayerBody, disabled: bool) -> bool: # Disable flying if requested, or if no controller if disabled or !enabled or !player_body.enabled or xr_start_node.is_xr_active(): set_flying(false) - return + return false # Detect press of flight button var old_flight_button = _flight_button @@ -103,7 +103,7 @@ func physics_movement(delta: float, player_body: XRToolsPlayerBody, disabled: bo # Skip if not flying if !is_active: - return + return false # Select the pitch vector var pitch_vector: Vector3 @@ -144,7 +144,7 @@ func physics_movement(delta: float, player_body: XRToolsPlayerBody, disabled: bo # Update velocity and return for additional effects player_body.velocity = flight_velocity - return + return false func set_flying(active: bool) -> void: diff --git a/addons/godot-xr-tools/desktop-support/movement_desktop_jump.gd b/addons/godot-xr-tools/desktop-support/movement_desktop_jump.gd index 84654db..8d63fb1 100644 --- a/addons/godot-xr-tools/desktop-support/movement_desktop_jump.gd +++ b/addons/godot-xr-tools/desktop-support/movement_desktop_jump.gd @@ -33,11 +33,13 @@ func is_xr_class(xr_name: String) -> bool: # Perform jump movement -func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: bool): +func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: bool) -> bool: # Skip if the jump controller isn't active if !player_body.enabled or xr_start_node.is_xr_active(): - return + return false # Request jump if the button is pressed if Input.is_action_pressed(jump_button_action): player_body.request_jump() + + return false diff --git a/addons/godot-xr-tools/desktop-support/movement_desktop_sprint.gd b/addons/godot-xr-tools/desktop-support/movement_desktop_sprint.gd index ade07ae..95589e7 100644 --- a/addons/godot-xr-tools/desktop-support/movement_desktop_sprint.gd +++ b/addons/godot-xr-tools/desktop-support/movement_desktop_sprint.gd @@ -70,11 +70,11 @@ func _ready(): # Perform sprinting -func physics_movement(_delta: float, player_body: XRToolsPlayerBody, disabled: bool): +func physics_movement(_delta: float, player_body: XRToolsPlayerBody, disabled: bool) -> bool: # Skip if the controller isn't active or is not enabled if !player_body.enabled or xr_start_node.is_xr_active() or disabled == true or !enabled: set_sprinting(false) - return + return false # Detect sprint button down and pressed states var sprint_button_down := Input.is_action_pressed(sprint_button) @@ -97,6 +97,8 @@ func physics_movement(_delta: float, player_body: XRToolsPlayerBody, disabled: b if sprinting != is_active: set_sprinting(sprinting) + return false + # Public function used to set sprinting active or not active func set_sprinting(active: bool) -> void: diff --git a/addons/godot-xr-tools/desktop-support/movement_desktop_turn.gd b/addons/godot-xr-tools/desktop-support/movement_desktop_turn.gd index 83aed22..5ce796c 100644 --- a/addons/godot-xr-tools/desktop-support/movement_desktop_turn.gd +++ b/addons/godot-xr-tools/desktop-support/movement_desktop_turn.gd @@ -84,7 +84,7 @@ func _process(_delta: float) -> void: # Perform jump movement -func physics_movement(delta: float, player_body: XRToolsPlayerBody, _disabled: bool): +func physics_movement(delta: float, player_body: XRToolsPlayerBody, _disabled: bool) -> bool: # Skip if the player body isn't active plr_body=player_body if !player_body.enabled or xr_start_node.is_xr_active(): @@ -92,7 +92,7 @@ func physics_movement(delta: float, player_body: XRToolsPlayerBody, _disabled: b mouse_move_vector=Vector2.ZERO #if clear_cam_x_when_body_not_active: # player_body.camera_node.rotation_degrees.x=0 - return + return false var deadzone = 0.1 # if _snap_turning(): @@ -114,7 +114,7 @@ func physics_movement(delta: float, player_body: XRToolsPlayerBody, _disabled: b -89.999, 89.999) mouse_move_vector=Vector2.ZERO - return + return false diff --git a/addons/godot-xr-tools/examples/fall_damage.gd b/addons/godot-xr-tools/examples/fall_damage.gd index aec2589..fcef237 100644 --- a/addons/godot-xr-tools/examples/fall_damage.gd +++ b/addons/godot-xr-tools/examples/fall_damage.gd @@ -61,11 +61,11 @@ func _ready(): is_active = true -func physics_movement(_delta: float, player_body: XRToolsPlayerBody, disabled: bool): +func physics_movement(_delta: float, player_body: XRToolsPlayerBody, disabled: bool) -> bool: # Skip if not enabled if disabled or !enabled: _previous_velocity = player_body.velocity - return + return false # Calculate the instantaneous acceleration var accel_vec := player_body.velocity - _previous_velocity @@ -81,7 +81,7 @@ func physics_movement(_delta: float, player_body: XRToolsPlayerBody, disabled: b if ground_only: # Ignore if not on ground if not player_body.on_ground: - return + return false # Only consider vertical acceleration accel_vec *= Vector3.UP @@ -90,3 +90,5 @@ func physics_movement(_delta: float, player_body: XRToolsPlayerBody, disabled: b var accel := accel_vec.length() if accel > damage_threshold: emit_signal("player_fall_damage", accel) + + return false diff --git a/addons/godot-xr-tools/functions/function_teleport.gd b/addons/godot-xr-tools/functions/function_teleport.gd index 01ce5dc..fd3295d 100644 --- a/addons/godot-xr-tools/functions/function_teleport.gd +++ b/addons/godot-xr-tools/functions/function_teleport.gd @@ -379,10 +379,12 @@ func _property_can_revert(property : StringName) -> bool: # Provide revert values for custom properties -func _property_get_revert(property : StringName): # Variant +func _property_get_revert(property : StringName) -> Variant: if property == "player_material": return _DefaultMaterial + return null + # Set enabled property func set_enabled(new_value : bool) -> void: diff --git a/addons/godot-xr-tools/hands/animations/left/hand_blend_tree.tres b/addons/godot-xr-tools/hands/animations/left/hand_blend_tree.tres index 8df1832..011abdb 100644 --- a/addons/godot-xr-tools/hands/animations/left/hand_blend_tree.tres +++ b/addons/godot-xr-tools/hands/animations/left/hand_blend_tree.tres @@ -1,4 +1,4 @@ -[gd_resource type="AnimationNodeBlendTree" format=3 uid="uid://dl8yf7ipqotd1"] +[gd_resource type="AnimationNodeBlendTree" load_steps=6 format=3 uid="uid://dl8yf7ipqotd1"] [sub_resource type="AnimationNodeAnimation" id="1"] animation = &"Grip" @@ -29,4 +29,4 @@ nodes/OpenHand/node = SubResource("4") nodes/OpenHand/position = Vector2(-600, 100) nodes/Trigger/node = SubResource("5") nodes/Trigger/position = Vector2(-360, 20) -node_connections = [&"output", 0, &"Grip", &"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1"] +node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] diff --git a/addons/godot-xr-tools/hands/animations/right/hand_blend_tree.tres b/addons/godot-xr-tools/hands/animations/right/hand_blend_tree.tres index c7016b7..f1d41a1 100644 --- a/addons/godot-xr-tools/hands/animations/right/hand_blend_tree.tres +++ b/addons/godot-xr-tools/hands/animations/right/hand_blend_tree.tres @@ -1,4 +1,4 @@ -[gd_resource type="AnimationNodeBlendTree" format=3 uid="uid://m85b1gogdums"] +[gd_resource type="AnimationNodeBlendTree" load_steps=6 format=3 uid="uid://m85b1gogdums"] [sub_resource type="AnimationNodeAnimation" id="1"] animation = &"Grip" @@ -29,4 +29,4 @@ nodes/OpenHand/node = SubResource("3") nodes/OpenHand/position = Vector2(-600, 100) nodes/Trigger/node = SubResource("5") nodes/Trigger/position = Vector2(-360, 40) -node_connections = [&"output", 0, &"Grip", &"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1"] +node_connections = [&"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1", &"output", 0, &"Grip"] diff --git a/addons/godot-xr-tools/materials/highlight.tres b/addons/godot-xr-tools/materials/highlight.tres index 6213abb..0480f11 100644 --- a/addons/godot-xr-tools/materials/highlight.tres +++ b/addons/godot-xr-tools/materials/highlight.tres @@ -1,4 +1,4 @@ -[gd_resource type="ShaderMaterial" format=3 uid="uid://dyuaw57o8y3i"] +[gd_resource type="ShaderMaterial" load_steps=7 format=3 uid="uid://dyuaw57o8y3i"] [sub_resource type="VisualShaderNodeColorParameter" id="VisualShaderNodeColorParameter_nl6jr"] parameter_name = "Color" @@ -16,6 +16,42 @@ constant = 0.1 operator = 2 [sub_resource type="VisualShader" id="VisualShader_wb0u4"] +code = "shader_type spatial; +render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_lambert, specular_schlick_ggx; + +uniform vec4 Color : source_color; + + + +void fragment() { +// ColorParameter:2 + vec4 n_out2p0 = Color; + + +// FloatConstant:4 + float n_out4p0 = 0.100000; + + +// VectorOp:3 + vec3 n_out3p0 = vec3(n_out2p0.xyz) * vec3(n_out4p0); + + +// Fresnel:5 + float n_in5p3 = 1.00000; + float n_out5p0 = pow(1.0 - clamp(dot(NORMAL, VIEW), 0.0, 1.0), n_in5p3); + + +// VectorOp:6 + vec3 n_out6p0 = vec3(n_out2p0.xyz) * vec3(n_out5p0); + + +// Output:0 + ALBEDO = n_out3p0; + EMISSION = n_out6p0; + + +} +" nodes/fragment/0/position = Vector2(660, 60) nodes/fragment/2/node = SubResource("VisualShaderNodeColorParameter_nl6jr") nodes/fragment/2/position = Vector2(40, 40) diff --git a/addons/godot-xr-tools/misc/hold_button_visualshader.tres b/addons/godot-xr-tools/misc/hold_button_visualshader.tres index 244c5b7..084664c 100644 --- a/addons/godot-xr-tools/misc/hold_button_visualshader.tres +++ b/addons/godot-xr-tools/misc/hold_button_visualshader.tres @@ -1,4 +1,4 @@ -[gd_resource type="VisualShader" format=3 uid="uid://c6okm2ay0fkjf"] +[gd_resource type="VisualShader" load_steps=28 format=3 uid="uid://c6okm2ay0fkjf"] [sub_resource type="VisualShaderNodeFloatOp" id="1"] output_port_for_preview = 0 @@ -101,6 +101,159 @@ output_port_for_preview = 0 function = 12 [resource] +code = "shader_type spatial; +render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_lambert, specular_schlick_ggx, unshaded; + +uniform vec4 albedo : source_color; +uniform float value; +uniform float fade; +uniform float radius; +uniform float width; + + + +void fragment() { +// ColorParameter:2 + vec4 n_out2p0 = albedo; + + +// Input:3 + vec2 n_out3p0 = UV; + + +// VectorOp:4 + vec3 n_in4p1 = vec3(2.00000, 2.00000, 0.00000); + vec3 n_out4p0 = vec3(n_out3p0, 0.0) * n_in4p1; + + +// VectorOp:5 + vec3 n_in5p1 = vec3(-1.00000, -1.00000, 0.00000); + vec3 n_out5p0 = n_out4p0 + n_in5p1; + + +// VectorFunc:17 + vec3 n_out17p0 = normalize(n_out5p0); + + +// VectorOp:19 + vec3 n_in19p1 = vec3(0.00000, -1.00000, 0.00000); + vec3 n_out19p0 = cross(n_out17p0, n_in19p1); + + +// VectorDecompose:20 + float n_out20p0 = n_out19p0.x; + float n_out20p1 = n_out19p0.y; + float n_out20p2 = n_out19p0.z; + + +// DotProduct:18 + vec3 n_in18p1 = vec3(0.00000, -1.00000, 0.00000); + float n_out18p0 = dot(n_out17p0, n_in18p1); + + +// FloatFunc:24 + float n_out24p0 = acos(n_out18p0); + + +// FloatOp:23 + float n_in23p0 = 6.28319; + float n_out23p0 = n_in23p0 - n_out24p0; + + + vec3 n_out22p0; +// If:22 + float n_in22p1 = 0.00000; + float n_in22p2 = 0.00001; + if(abs(n_out20p2 - n_in22p1) < n_in22p2) + { + n_out22p0 = vec3(n_out24p0); + } + else if(n_out20p2 < n_in22p1) + { + n_out22p0 = vec3(n_out24p0); + } + else + { + n_out22p0 = vec3(n_out23p0); + } + + +// FloatOp:25 + float n_in25p1 = 6.28319; + float n_out25p0 = n_out22p0.x / n_in25p1; + + +// FloatParameter:26 + float n_out26p0 = value; + + +// FloatOp:27 + float n_out27p0 = n_out25p0 - n_out26p0; + + +// FloatParameter:14 + float n_out14p0 = fade; + + +// FloatOp:30 + float n_in30p1 = 6.28319; + float n_out30p0 = n_out14p0 / n_in30p1; + + +// FloatOp:28 + float n_out28p0 = n_out27p0 / n_out30p0; + + +// VectorLen:6 + float n_out6p0 = length(n_out5p0); + + +// FloatParameter:8 + float n_out8p0 = radius; + + +// FloatOp:7 + float n_out7p0 = n_out6p0 - n_out8p0; + + +// FloatFunc:9 + float n_out9p0 = abs(n_out7p0); + + +// FloatParameter:11 + float n_out11p0 = width; + + +// FloatOp:15 + float n_in15p1 = 2.00000; + float n_out15p0 = n_out11p0 / n_in15p1; + + +// FloatOp:13 + float n_out13p0 = n_out9p0 - n_out15p0; + + +// FloatOp:10 + float n_out10p0 = n_out13p0 / n_out14p0; + + +// FloatOp:29 + float n_out29p0 = max(n_out28p0, n_out10p0); + + +// FloatOp:12 + float n_in12p0 = 1.00000; + float n_out12p0 = n_in12p0 - n_out29p0; + + +// Output:0 + ALBEDO = vec3(n_out2p0.xyz); + ALPHA = n_out12p0; + + +} +" +graph_offset = Vector2(652.664, 119.317) flags/unshaded = true nodes/fragment/0/position = Vector2(1800, -40) nodes/fragment/2/node = SubResource("3") diff --git a/addons/godot-xr-tools/objects/viewport_2d_in_3d.gd b/addons/godot-xr-tools/objects/viewport_2d_in_3d.gd index e9a40a9..c9751c0 100644 --- a/addons/godot-xr-tools/objects/viewport_2d_in_3d.gd +++ b/addons/godot-xr-tools/objects/viewport_2d_in_3d.gd @@ -256,7 +256,7 @@ func _property_can_revert(property : StringName) -> bool: # Provide revert values for custom properties -func _property_get_revert(property : StringName): # Variant +func _property_get_revert(property : StringName) -> Variant: match property: "alpha_scissor_threshold": return 0.25 @@ -264,6 +264,8 @@ func _property_get_revert(property : StringName): # Variant return false "filter": return true + _: + return null # When the scene_node changes, update the property list diff --git a/addons/godot-xr-tools/plugin.cfg b/addons/godot-xr-tools/plugin.cfg index ca0310f..fa5ec7d 100644 --- a/addons/godot-xr-tools/plugin.cfg +++ b/addons/godot-xr-tools/plugin.cfg @@ -3,5 +3,5 @@ name="Godot XR Tools" description="Godot XR Tools plugin" author="Bastiaan Olij and Contributors" -version="4.5.1" +version="4.5.2" script="plugin.gd" diff --git a/addons/godot-xr-tools/staging/loading_screen/loading_screen_shader.tres b/addons/godot-xr-tools/staging/loading_screen/loading_screen_shader.tres index 4c40ec3..2d83f5f 100644 --- a/addons/godot-xr-tools/staging/loading_screen/loading_screen_shader.tres +++ b/addons/godot-xr-tools/staging/loading_screen/loading_screen_shader.tres @@ -1,4 +1,4 @@ -[gd_resource type="VisualShader" format=3 uid="uid://4i0pwdtfmtsv"] +[gd_resource type="VisualShader" load_steps=16 format=3 uid="uid://4i0pwdtfmtsv"] [sub_resource type="VisualShaderNodeCompare" id="5"] output_port_for_preview = 0 @@ -62,6 +62,95 @@ function = 2 condition = 1 [resource] +code = "shader_type spatial; +render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_lambert, specular_schlick_ggx, unshaded; + +uniform vec4 bar_color : source_color; +uniform sampler2D bar_texture : source_color; +uniform vec3 cutout = vec3(4.850000, 0.330000, 0.000000); +uniform float progress; + + + +void fragment() { +// ColorParameter:15 + vec4 n_out15p0 = bar_color; + + + vec4 n_out19p0; +// Texture2D:19 + n_out19p0 = texture(bar_texture, UV); + float n_out19p4 = n_out19p0.a; + + +// VectorOp:17 + vec3 n_out17p0 = vec3(n_out15p0.xyz) * vec3(n_out19p0.xyz); + + +// Input:3 + vec2 n_out3p0 = UV; + + +// VectorOp:4 + vec3 n_in4p1 = vec3(10.00000, 1.00000, 0.00000); + vec3 n_out4p0 = vec3(n_out3p0, 0.0) * n_in4p1; + + +// VectorOp:5 + vec3 n_in5p1 = vec3(5.00000, 0.50000, 0.00000); + vec3 n_out5p0 = n_out4p0 - n_in5p1; + + +// VectorFunc:6 + vec3 n_out6p0 = abs(n_out5p0); + + +// Vector3Parameter:20 + vec3 n_out20p0 = cutout; + + + bool n_out8p0; +// Compare:8 + { + bvec2 _bv = greaterThan(vec2(n_out6p0.xy), vec2(n_out20p0.xy)); + n_out8p0 = any(_bv); + } + + +// FloatParameter:12 + float n_out12p0 = progress; + + +// VectorCompose:13 + float n_in13p1 = 0.00000; + float n_in13p2 = 0.00000; + vec3 n_out13p0 = vec3(n_out12p0, n_in13p1, n_in13p2); + + + bool n_out11p0; +// Compare:11 + { + bvec2 _bv = lessThan(n_out3p0, vec2(n_out13p0.xy)); + n_out11p0 = any(_bv); + } + + +// FloatOp:14 + float n_out14p0 = max((n_out8p0 ? 1.0 : 0.0), (n_out11p0 ? 1.0 : 0.0)); + + +// FloatOp:18 + float n_out18p0 = n_out19p4 * n_out14p0; + + +// Output:0 + ALBEDO = n_out17p0; + ALPHA = n_out18p0; + + +} +" +graph_offset = Vector2(-744.269, 307.118) flags/unshaded = true nodes/fragment/0/position = Vector2(1220, 440) nodes/fragment/3/node = SubResource("10")