shader_type spatial; render_mode blend_mix, depth_prepass_alpha, cull_disabled, diffuse_burley, specular_schlick_ggx; uniform float scroll_speed : hint_range(0.0, 4.0) = 1.35; uniform vec3 shadow_color : source_color = vec3(0.075, 0.33, 0.34); uniform vec3 water_color : source_color = vec3(0.31, 0.68, 0.64); uniform vec3 light_color : source_color = vec3(0.78, 0.94, 0.83); uniform vec3 foam_color : source_color = vec3(0.91, 0.97, 0.9); void vertex() { float edge_weight = 1.0 - abs(UV.x * 2.0 - 1.0); float curtain_wobble = sin(UV.y * 13.0 - TIME * 2.2 + UV.x * 8.0) * 0.05; VERTEX.z += curtain_wobble * edge_weight; } void fragment() { vec2 flow_uv = UV; flow_uv.y += TIME * scroll_speed; float long_thread = sin(flow_uv.x * 32.0 + sin(flow_uv.y * 3.1) * 2.4) * 0.5 + 0.5; float soft_thread = sin(flow_uv.x * 13.0 - flow_uv.y * 7.0) * 0.5 + 0.5; float falling_detail = sin(flow_uv.y * 27.0 + flow_uv.x * 7.0) * 0.5 + 0.5; float thread = smoothstep(0.36, 0.9, long_thread * 0.6 + soft_thread * 0.4); float broken_foam = smoothstep(0.72, 0.98, falling_detail * thread); float base_foam = smoothstep(0.58, 1.0, UV.y); float edge_fade = smoothstep(0.0, 0.08, UV.x) * smoothstep(1.0, 0.92, UV.x); vec3 color = mix(shadow_color, water_color, 0.5 + thread * 0.35); color = mix(color, light_color, broken_foam * 0.5); color = mix(color, foam_color, base_foam * (0.38 + broken_foam * 0.42)); ALBEDO = color; ROUGHNESS = mix(0.16, 0.32, broken_foam); SPECULAR = 0.65; EMISSION = light_color * (broken_foam * 0.07 + base_foam * 0.04); ALPHA = edge_fade * mix(0.62, 0.9, thread * 0.56 + base_foam * 0.3); }