shader_type spatial; render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley, specular_schlick_ggx; uniform float wave_strength : hint_range(0.0, 0.5) = 0.08; uniform float wave_speed : hint_range(0.0, 5.0) = 0.8; uniform float flow_speed : hint_range(0.0, 3.0) = 0.6; uniform vec3 deep_color : source_color = vec3(0.06, 0.24, 0.38); uniform vec3 shallow_color : source_color = vec3(0.18, 0.44, 0.58); uniform vec3 foam_color : source_color = vec3(0.82, 0.88, 0.86); uniform float rim_power : hint_range(0.5, 5.0) = 2.5; uniform float sparkle_strength : hint_range(0.0, 1.0) = 0.12; global uniform vec3 sun_direction = vec3(0.4, 0.8, 0.4); void vertex() { vec3 pos = VERTEX; float wave_a = sin(pos.x * 0.35 + pos.z * 0.25 + TIME * wave_speed) * wave_strength; float wave_b = cos(pos.x * 0.45 - pos.z * 0.55 + TIME * wave_speed * 0.7) * wave_strength * 0.6; float wave_c = sin(pos.z * 0.7 + TIME * wave_speed * 1.3) * wave_strength * 0.35; pos.y += wave_a + wave_b + wave_c; VERTEX = pos; } void fragment() { vec3 view_dir = VIEW; vec3 normal = NORMAL; vec3 view_norm = normalize(view_dir); float rim = 1.0 - abs(dot(normal, view_norm)); rim = pow(rim, rim_power); rim = smoothstep(0.15, 0.7, rim); vec2 uv = UV; uv.x += TIME * flow_speed * 0.4; uv.y += TIME * flow_speed * 0.3; float flow_a = sin(uv.x * 8.0 + uv.y * 5.0) * 0.5 + 0.5; float flow_b = cos(uv.y * 6.0 - uv.x * 4.0 + TIME * 0.25) * 0.5 + 0.5; float flow = mix(flow_a, flow_b, 0.5); vec3 water_color = mix(deep_color, shallow_color, flow * 0.6 + 0.2); water_color = mix(water_color, foam_color, rim * 0.65); vec3 half_vec = normalize(view_norm + normalize(sun_direction)); float specular = pow(max(dot(normal, half_vec), 0.0), 120.0); specular *= smoothstep(0.4, 0.85, rim); float sparkle = specular * sparkle_strength; ALBEDO = water_color; METALLIC = 0.08; ROUGHNESS = 0.22; EMISSION = water_color * 0.04 + foam_color * sparkle; ALPHA = 0.76; ALPHA_SCISSOR_THRESHOLD = 0.0; }