slash/src/VFX.cs

69 lines
No EOL
2 KiB
C#

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;
}
}