public override bool Raycast(RayCastOutput output, RayCastInput input, Transform transform, int childIndex)
{
Vec2 position = pool1;
Vec2 s = pool2;
Vec2 r = pool3;
Rot.MulToOutUnsafe(transform.Q, P, position);
position.AddLocal(transform.P);
s.Set(input.P1).SubLocal(position);
float b = Vec2.Dot(s, s) - Radius * Radius;
// Solve quadratic equation.
r.Set(input.P2).SubLocal(input.P1);
float c = Vec2.Dot(s, r);
float rr = Vec2.Dot(r, r);
float sigma = c * c - rr * b;
// Check for negative discriminant and short segment.
if (sigma < 0.0f || rr < Settings.EPSILON)
{
return false;
}
// Find the point of intersection of the line with the circle.
float a = -(c + MathUtils.Sqrt(sigma));
// Is the intersection point on the segment?
if (0.0f <= a && a <= input.MaxFraction * rr)
{
a /= rr;
output.Fraction = a;
output.Normal.Set(r).MulLocal(a);
output.Normal.AddLocal(s);
output.Normal.Normalize();
return true;
}
return false;
}