diff --git a/src/Arts.cs b/src/Arts.cs index ba8bfa9..028bfe4 100644 --- a/src/Arts.cs +++ b/src/Arts.cs @@ -153,8 +153,8 @@ static class Arts // enemy Enemy enemy_test = Mono.enemy_types[(int)(Time.Totalf % Mono.enemy_types.Length)]; - Quat enemy_orbit = Quat.FromAngles(0, 0, 45) * Quat.FromAngles(0, (Time.Totalf * 90) % 360, 0); - enemy_test.pose.position = V.XYZ(0, 0, -3.0f) + enemy_orbit * V.XYZ(0, 0, -2); + Quat enemy_orbit = Quat.FromAngles(0, 0, 45) * Quat.FromAngles(0, (Time.Totalf * 30) % 360, 0); + enemy_test.pose.position = V.XYZ(0, 0, -3.0f) + enemy_orbit * V.XYZ(0, 0, -3); // V.XYZ(SKMath.Sin(Time.Totalf * 1f) * 1.0f, 0.666f, -3.0f); for (int i = 0; i < enemy_test.cols.Count; i++) { @@ -196,8 +196,51 @@ static class Arts Matrix.Identity, Color.Hex(0xF9BF05FF).ToLinear() ); + Ray slash_ray = new Ray(tip_pos, Vec3.Direction(tip_pos, last_tip_pos)); + float ray_dist = Vec3.Distance(tip_pos, last_tip_pos); last_tip_pos = Vec3.Lerp(last_tip_pos, tip_pos, Time.Stepf / 0.1f); + if (true) // hit test + { + Matrix enemy_m4 = enemy_test.pose.ToMatrix(); + Ray local_ray = enemy_m4.Inverse.Transform(slash_ray); + bool hit = false; + float min_dist = ray_dist; + Vec3 min_hit_pos = Vec3.Zero; + for (int i = 0; i < enemy_test.cols.Count; i++) + { + Sphere col = enemy_test.cols[i]; + Vec3 hit_pos = Vec3.Zero; + if (col.Intersect(local_ray, out hit_pos)) + { + float hit_dist = Vec3.Distance(hit_pos, local_ray.position); + if (hit_dist < min_dist) + { + hit = true; + min_dist = hit_dist; + min_hit_pos = hit_pos; + } + } + } + min_hit_pos = enemy_m4.Transform(min_hit_pos); + + if (hit) + { + Mesh.Sphere.Draw( + mat_unlit, + Matrix.TS( + min_hit_pos, + 4 * U.cm + ), + Color.White + ); + if (Rig.btn_select.state) + { + VFX.Play(min_hit_pos); + } + } + } + // revolver Quat rvolv_ori = Rig.l_aim.orientation; Vec3 rvolv_pos = Rig.l_aim.position; diff --git a/src/Rig.cs b/src/Rig.cs index 9aae333..bac163e 100644 --- a/src/Rig.cs +++ b/src/Rig.cs @@ -37,7 +37,7 @@ static class Rig Quat.FromAngles(0, 0, 45) * Quat.FromAngles(0, SKMath.Sin(Time.Totalf * 6f) * 60f, 0) ); l_aim = new Pose( - V.XYZ(0.0f, 0.5f, 0.5f), // V.XYZ(SKMath.Sin(Time.Totalf * 2f) * 0.6f, 0.5f, 0.5f), + V.XYZ(1.0f, 0.5f, 0.5f), // V.XYZ(SKMath.Sin(Time.Totalf * 2f) * 0.6f, 0.5f, 0.5f), Quat.Identity );