Files
mod_interface/shaders/scene_transition.gdshader
T
2026-09-10 10:59:37 +03:00

81 lines
2.2 KiB
Plaintext

shader_type canvas_item;
render_mode blend_premul_alpha;
uniform vec4 tint : source_color = vec4(1.0, 1.0, 1.0, 1.0);
uniform float noise_scale : hint_range(1.0, 100.0) = 20.0;
uniform float smoothness : hint_range(0.0, 0.5) = 0.1;
uniform float progress : hint_range(0.0, 1.0) = 0.0;
uniform bool invert_direction = false;
uniform float distortion : hint_range(0.0, 0.5) = 0.05;
uniform float hue_shift : hint_range(0.0, 1.0) = 0.2;
uniform float glow_intensity : hint_range(0.0, 1.0) = 0.3;
float random(vec2 uv) {
return fract(sin(dot(uv, vec2(12.9898, 78.233))) * 43758.5453);
}
float perlin_noise(vec2 uv) {
vec2 i = floor(uv);
vec2 f = fract(uv);
vec2 u = f * f * (3.0 - 2.0 * f);
float a = random(i);
float b = random(i + vec2(1.0, 0.0));
float c = random(i + vec2(0.0, 1.0));
float d = random(i + vec2(1.0, 1.0));
return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
}
float fractal_noise(vec2 uv, int octaves) {
float value = 0.0;
float amplitude = 0.5;
float frequency = 1.0;
for (int i = 0; i < 8; i++) {
if (i >= octaves)
break;
value += perlin_noise(uv * frequency) * amplitude;
amplitude *= 0.5;
frequency *= 2.0;
}
return value;
}
vec3 hue_shift_func(vec3 color, float hue) {
const vec3 k = vec3(0.57735, 0.57735, 0.57735);
float cos_angle = cos(hue);
return color * cos_angle + cross(k, color) * sin(hue) + k * dot(k, color) * (1.0 - cos_angle);
}
void fragment() {
vec2 noise_uv = UV * noise_scale;
float noise = fractal_noise(noise_uv, 3);
float distorted_progress = progress + noise * distortion;
float transition_mask;
if (invert_direction)
transition_mask = step(distorted_progress, noise);
else
transition_mask = step(noise, distorted_progress);
float edge = smoothstep(0.0, smoothness, abs(noise - progress));
float alpha = mix(transition_mask, 1.0 - transition_mask, edge);
if (invert_direction)
alpha = 1.0 - alpha;
vec4 col = texture(TEXTURE, UV) * COLOR * tint;
float glow = clamp(abs(noise - progress) / smoothness, 0.0, 1.0) * glow_intensity;
col.rgb += glow * vec3(1.0, 0.8, 0.5) * col.a;
if (abs(noise - progress) < smoothness * 2.0) {
col.rgb = hue_shift_func(col.rgb, hue_shift);
}
col.a *= alpha;
COLOR = col;
}