nearest raycast hit across enemy cols
This commit is contained in:
parent
bc79d08bbd
commit
8113b3c567
1 changed files with 24 additions and 9 deletions
33
src/Arts.cs
33
src/Arts.cs
|
@ -165,26 +165,41 @@ static class Arts
|
||||||
|
|
||||||
if (true) // hit test
|
if (true) // hit test
|
||||||
{
|
{
|
||||||
Vec3 hit_delta = rvolv_ori.Inverse * (enemy_pos - rvolv_pos);
|
Matrix enemy_m4 = enemy_test.pose.ToMatrix();
|
||||||
float flat_z = hit_delta.z;
|
Ray local_ray = enemy_m4.Inverse.Transform(ray);
|
||||||
hit_delta.z = 0;
|
bool hit = false;
|
||||||
float hit_mag = hit_delta.Magnitude;
|
float min_dist = float.MaxValue;
|
||||||
bool hit = hit_mag < enemy_rad;
|
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)
|
if (hit)
|
||||||
{
|
{
|
||||||
float hit_dist = flat_z + (Maths.smooth_stop((enemy_rad - hit_mag) / enemy_rad) * enemy_rad);
|
|
||||||
Vec3 hit_pos = rvolv_pos + rvolv_ori * V.XYZ(0, 0, hit_dist);
|
|
||||||
Mesh.Sphere.Draw(
|
Mesh.Sphere.Draw(
|
||||||
mat_unlit,
|
mat_unlit,
|
||||||
Matrix.TS(
|
Matrix.TS(
|
||||||
hit_pos,
|
min_hit_pos,
|
||||||
4 * U.cm
|
4 * U.cm
|
||||||
),
|
),
|
||||||
Color.White
|
Color.White
|
||||||
);
|
);
|
||||||
if (Rig.btn_select.delta == +1)
|
if (Rig.btn_select.delta == +1)
|
||||||
{
|
{
|
||||||
VFX.Play(hit_pos);
|
VFX.Play(min_hit_pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue