using StereoKit; using System; namespace snake; static class VFX { public static Particle[] particles = new Particle[32]; static int index = 0; public static void Init() { for (int i = 0; i < particles.Length; i++) { particles[i] = new(); } } public static void Play(XYZi pos) { for (int i = 0; i < 8; i++) { index = (index + 1) % particles.Length; Particle particle = particles[index]; particle.pos = pos.ToVec3; particle.vel = Quat.FromAngles(Random.Shared.NextSingle() * 360, 0, 0) * Quat.FromAngles(0, Random.Shared.NextSingle() * 360, 0) * Vec3.Forward * 6.0f; particle.ori = Quat.Identity; particle.scl = (1.0f / 8) * Maths.smooth_stop(Random.Shared.NextSingle()); } } public static void Frame() { for (int i = 0; i < particles.Length; i++) { Particle particle = particles[i]; if (particle.vel.MagnitudeSq > float.Epsilon) { particle.pos += particle.vel * Time.Stepf; float scl_rad = particle.scl * 0.5f * 0.333f; Vec3 next_pos = V.XYZ( Maths.s_clamp(particle.pos.x, Mono.SD_X - 0.5f - scl_rad), Maths.s_clamp(particle.pos.y, Mono.SD_Y - 0.5f - scl_rad), Maths.s_clamp(particle.pos.z, Mono.SD_Z - 0.5f - scl_rad) ); if (next_pos.x != particle.pos.x || next_pos.y != particle.pos.y || next_pos.z != particle.pos.z) { particle.pos = next_pos; particle.vel = Vec3.Zero; } } } } } public class Particle { public Vec3 pos, vel; public Quat ori; public float scl; public Particle() { this.pos = Vec3.Zero; this.vel = Vec3.Zero; this.ori = Quat.Identity; this.scl = 0.0f; } }