30 lines
1.0 KiB
GLSL
30 lines
1.0 KiB
GLSL
shader_type canvas_item;
|
|
render_mode blend_mix;
|
|
uniform int particles_anim_h_frames;
|
|
uniform int particles_anim_v_frames;
|
|
uniform bool particles_anim_loop;
|
|
void vertex() {
|
|
float h_frames = float(particles_anim_h_frames);
|
|
float v_frames = float(particles_anim_v_frames);
|
|
VERTEX.xy /= vec2(h_frames, v_frames);
|
|
float particle_total_frames = float(particles_anim_h_frames * particles_anim_v_frames);
|
|
float particle_frame = floor(INSTANCE_CUSTOM.z * float(particle_total_frames));
|
|
if (!particles_anim_loop) {
|
|
particle_frame = clamp(particle_frame, 0.0, particle_total_frames - 1.0);
|
|
} else {
|
|
particle_frame = mod(particle_frame, particle_total_frames);
|
|
} UV /= vec2(h_frames, v_frames);
|
|
UV += vec2(mod(particle_frame, h_frames) / h_frames, floor(particle_frame / h_frames) / v_frames);
|
|
}
|
|
|
|
void fragment() {
|
|
float b = texture(TEXTURE, UV).w;
|
|
float n = texture(NORMAL_TEXTURE, UV).w;
|
|
if(b == 0f && n >= 1f) {
|
|
//COLOR.xyz = vec3(1, 1, 1) - texture(SCREEN_TEXTURE, SCREEN_UV).xyz;
|
|
COLOR = vec4(0, 0, 0, 0.9f);
|
|
} else {
|
|
COLOR = texture(TEXTURE, UV);
|
|
}
|
|
}
|