shader_type spatial; render_mode unshaded; // --- PARAMETRI --- uniform float time_scale = 3.0; uniform float wave_amplitude = 0.5; // Quanto curva a destra/sinistra uniform float wave_frequency = 1.0; // Ogni quanto fa la curva void vertex() { // Creiamo un offset unico per ogni particella in modo che non si muovano tutte uguali float random_seed_offset = INSTANCE_CUSTOM.x * 100.0; float scaled_time = (TIME + random_seed_offset) * time_scale; // Applichiamo SOLO la curva morbida all'asse X (o Z, a seconda di come orienti la scena) // Usiamo VERTEX.y per far sì che la curva si propaghi lungo tutta la lunghezza della scia VERTEX.x += sin(VERTEX.y * wave_frequency + scaled_time) * wave_amplitude; // Niente più "VERTEX.y += t;", quindi niente più teletrasporti! } void fragment() { // Il colore e l'alpha (per lo spawn dolce e la morte lenta) // vengono comandati dalla Color Ramp del GPUParticles3D! ALBEDO = COLOR.rgb; ALPHA = COLOR.a; }