69 lines
No EOL
2 KiB
C#
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;
|
|
}
|
|
} |