shader_type canvas_item; uniform vec2 sprite_scale = vec2(1.0, 1.0); uniform float distortion : hint_range(0.1, 100.0) = 8.0; uniform vec4 liquid_color_main : hint_color = vec4(0.1, 0.2, 0.8, 0.25); uniform vec4 liquid_color_surface : hint_color = vec4(0.1, 0.2, 1.0, 0.5); uniform float liquid_surface_thickness : hint_range(0.0, 1.0) = 0.2; uniform float wave_amp : hint_range(-1.0, 1.0) = 0.25; uniform float wave_freq : hint_range(0.0, 1.0) = 1.0; uniform float wave_scale :hint_range(0.0, 10.0) = 1.0; float rand(vec2 p){ return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453123); } float noise(vec2 p){ vec2 i = floor(p); vec2 f = fract(p); float a = rand(i); float b = rand(i + vec2(1.0, 0.0)); float c = rand(i + vec2(0.0, 1.0)); float d = rand(i + vec2(1.0, 1.0)); vec2 cubic = f * f * (3.0 - (2.0 * f)); return mix(a, b, cubic.x) + (c - a) * cubic.y * (1.0 - cubic.x) + (d - b) * cubic.x * cubic.y; } float ramp(float v, float f_min, float f_max){ float res = (v - f_min) / (f_max - f_min); return max(0.0, min(1.0, res)); } vec2 wavey_y(vec2 p, float time) { float dy = wave_amp * sin(wave_freq * (p.x * liquid_surface_thickness) * time); //return vec2(dx, dy); return vec2(p.x, p.y + dy); } void fragment(){ vec2 noise1 = UV * sprite_scale * distortion; vec2 noise2 = UV * (sprite_scale * distortion) + 4.0; vec2 motion1 = vec2(TIME * 0.3, TIME * -0.4); vec2 motion2 = vec2(TIME * 0.1, TIME * 0.5); vec2 distort1 = vec2(noise(noise1 + motion1), noise(noise2 + motion1)) - vec2(0.5); vec2 distort2 = vec2(noise(noise1 + motion2), noise(noise2 + motion2)) - vec2(0.5); vec2 dsum = (distort1 + distort2) / 60.0; vec4 color = texture(SCREEN_TEXTURE, SCREEN_UV + dsum); color = mix(color, liquid_color_main, 0.3); color.rgb = mix(vec3(0.5), color.rgb, 1.4); float near_top = 1.0 - clamp((UV.y + dsum.y) / (liquid_surface_thickness / sprite_scale.y), 0.0, 1.0); color = mix(color, liquid_color_surface, near_top); float tedge_lower = 0.6; float tedge_upper = tedge_lower + 0.1; if (near_top > tedge_lower){ color.a = 0.0; if (near_top < tedge_upper){ color.a = (tedge_upper - near_top) / (tedge_upper - tedge_lower); } } COLOR = color; }