public static idBounds BoundsForPointRotation(Vector3 start, idRotation rotation)
{
Vector3 end = /*TODO start * rotation*/ Vector3.Zero;
Vector3 axis = rotation.Vector;
Vector3 origin = rotation.Origin + axis * (axis * (start - rotation.Origin));
float radiusSqr = (start - origin).LengthSquared();
Vector3 v1 = Vector3.Cross(start - origin, axis);
Vector3 v2 = Vector3.Cross(end - origin, axis);
idBounds result = new idBounds();
// if the derivative changes sign along this axis during the rotation from start to end
if(((v1.X > 0.0f) && (v2.X < 0.0f)) || ((v1.X < 0.0f) && (v2.X > 0.0f)))
{
if((0.5f * (start.X + end.X) - origin.X) > 0.0f)
{
result.Min.X = idMath.Min(start.X, end.X);
result.Max.X = origin.X + idMath.Sqrt(radiusSqr * (1.0f - axis.X * axis.X));
}
else
{
result.Min.X = origin.X - idMath.Sqrt(radiusSqr * (1.0f - axis.X * axis.X));
result.Max.X = idMath.Max(start.X, end.X);
}
}
else if(start.X > end.X)
{
result.Min.X = end.X;
result.Max.X = start.X;
}
else
{
result.Min.X = start.X;
result.Max.X = end.X;
}
if(((v1.Y > 0.0f) && (v2.Y < 0.0f)) || ((v1.Y < 0.0f) && (v2.Y > 0.0f)))
{
if((0.5f * (start.Y + end.Y) - origin.Y) > 0.0f)
{
result.Min.Y = idMath.Min(start.Y, end.Y);
result.Max.Y = origin.Y + idMath.Sqrt(radiusSqr * (1.0f - axis.Y * axis.Y));
}
else
{
result.Min.Y = origin.Y - idMath.Sqrt(radiusSqr * (1.0f - axis.Y * axis.Y));
result.Max.Y = idMath.Max(start.Y, end.Y);
}
}
else if(start.Y > end.Y)
{
result.Min.Y = end.Y;
result.Max.Y = start.Y;
}
else
{
result.Min.Y = start.Y;
result.Max.Y = end.Y;
}
if(((v1.Z > 0.0f) && (v2.Z < 0.0f)) || ((v1.Z < 0.0f) && (v2.Z > 0.0f)))
{
if((0.5f * (start.Z + end.Z) - origin.Z) > 0.0f)
{
result.Min.Z = idMath.Min(start.Z, end.Z);
result.Max.Z = origin.Z + idMath.Sqrt(radiusSqr * (1.0f - axis.Z * axis.Z));
}
else
{
result.Min.Z = origin.Z - idMath.Sqrt(radiusSqr * (1.0f - axis.Z * axis.Z));
result.Max.Z = idMath.Max(start.Z, end.Z);
}
}
else if(start.Z > end.Z)
{
result.Min.Z = end.Z;
result.Max.Z = start.Z;
}
else
{
result.Min.Z = start.Z;
result.Max.Z = end.Z;
}
return result;
}