diff --git a/src/Arts.cs b/src/Arts.cs index dae8b4f..b53b887 100644 --- a/src/Arts.cs +++ b/src/Arts.cs @@ -89,9 +89,30 @@ static class Arts ); Mesh.Cube.Draw( - mat_mono, - Stretch.cursor.ToMatrix(3 * U.cm) + mat_justcolor, + Stretch.cursor.ToMatrix(V.XYZ(-1, 1, 1) * 1.2f * U.cm), + Color.Hex(0x000000FF).ToLinear() ); + Mesh.Cube.Draw( + mat_mono, + Stretch.cursor.ToMatrix(1 * U.cm) + ); + + // particles + Particle[] particles = Stretch.particles; + for (int i = 0; i < particles.Length; i++) + { + Particle particle = particles[i]; + Mesh.Sphere.Draw( + mat_unlit, + Matrix.TRS( + particle.pos, + particle.ori, + particle.scl + ), + Color.Hex(0xFFFFFFFF).ToLinear() + ); + } } // color_cube diff --git a/src/Dofs.cs b/src/Dofs.cs index b728760..0f3606e 100644 --- a/src/Dofs.cs +++ b/src/Dofs.cs @@ -12,10 +12,21 @@ static class Stretch public static float stretch = 0.0f; public static Pose cursor; + // vfx + public static Particle[] particles = new Particle[64]; + static int index = 0; + static float trail_dist = 3 * U.cm; + static Vec3 last_particle_pos = Vec3.Zero; + public static void Init() { to_grab = new(-0.3f, -0.25f, -0.5f, true); from_grab = new(-0.3f, -0.25f, -0.4f, true); + + for (int i = 0; i < particles.Length; i++) + { + particles[i] = new(); + } } public static void Frame() @@ -25,6 +36,29 @@ static class Stretch Vec3 dir = delta.Normalized; cursor.position = to_grab.pose.position + dir * stretch * strength; + + if (Vec3.Distance(cursor.position, last_particle_pos) > trail_dist) + { + index = (index + 1) % particles.Length; + Particle particle = particles[index]; + particle.pos = last_particle_pos + Vec3.Direction(cursor.position, last_particle_pos) * trail_dist; + // 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 = 3 * U.mm; + + last_particle_pos = particle.pos; + } + + 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.0f - (3 * Time.Stepf); + } } // design