using StereoKit; using System; namespace slash; static class VFX { public static Particle[] particles = new Particle[64]; static int index = 0; public static void Init() { for (int i = 0; i < particles.Length; i++) { particles[i] = new(); } } public static void Play(Vec3 pos) { for (int i = 0; i < 8; i++) { index = (index + 1) % particles.Length; Particle particle = particles[index]; particle.pos = pos; 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 / 3) * Maths.smooth_start(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; particle.vel *= 1 - (3 * Time.Stepf); particle.scl *= 1 - (3 * Time.Stepf); // float scl_rad = particle.scl * 0.5f * 0.333f; // Vec3 next_pos = V.XYZ( // Maths.s_clamp(particle.pos.x, 2 - scl_rad), // Maths.s_clamp(particle.pos.y, 2 - scl_rad), // Maths.s_clamp(particle.pos.z, 2 - 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; } }