mirror of
https://codeberg.org/Melon-Bread/Comets.gd.git
synced 2025-02-17 14:33:03 -05:00
46 lines
1.4 KiB
Plaintext
46 lines
1.4 KiB
Plaintext
shader_type canvas_item;
|
|
|
|
uniform sampler2D noise_tex_normal;
|
|
uniform sampler2D noise_tex;
|
|
uniform float progress : hint_range(0.0, 1.0);
|
|
uniform float strength = 1.0;
|
|
|
|
// If your sprite doesn't have enough space and the explosion gets clipped,
|
|
// you can uncomment this and adjust the scale
|
|
//void vertex() {
|
|
// float scale = 3.0;
|
|
// VERTEX *= scale;
|
|
//
|
|
// UV *= scale;
|
|
// UV -= (scale - 1.0) / 2.0;
|
|
//}
|
|
|
|
void fragment() {
|
|
vec2 direction = texture(noise_tex_normal, UV).xy; // We're using normal map as direction
|
|
direction -= 0.5; // Since our normal map is a texture, it ranges from 0.0 to 1.0...
|
|
direction *= 2.0; // ...so we're going to make it range from -1.0 to 1.0.
|
|
direction = direction * strength * progress;
|
|
|
|
// UV for exploded texture
|
|
vec2 tex_size = 1.0 / TEXTURE_PIXEL_SIZE; // Real texture size in pixels
|
|
vec2 uv = floor(UV * tex_size) / (tex_size - 1.0); // Pixelate UV to snap pixels
|
|
uv = uv - direction; // Distort UV
|
|
|
|
// Texture with exploded UV
|
|
vec4 tex = texture(TEXTURE, uv);
|
|
|
|
// Dissolve alpha
|
|
float dissolve = texture(noise_tex, UV).x;
|
|
dissolve = step(progress, dissolve);
|
|
tex.a *= dissolve;
|
|
|
|
// Border (in case the edge of your sprite stretches, otherwise you can remove this block)
|
|
vec2 border_uv = uv * 2.0 - 1.0;
|
|
border_uv = clamp(abs(border_uv), 0.0, 1.0);
|
|
float border = max(border_uv.x, border_uv.y);
|
|
border = ceil(1.0 - border);
|
|
tex.a *= border;
|
|
|
|
COLOR = tex;
|
|
}
|