public override void GetBoundingBox(ref RigidTransform shapeTransform, out BoundingBox boundingBox)
{
#if !WINDOWS
boundingBox = new BoundingBox();
#endif
Matrix3x3 o;
Matrix3x3.CreateFromQuaternion(ref shapeTransform.Orientation, out o);
float minX, maxX;
float minY, maxY;
float minZ, maxZ;
var right = new Vector3(o.M11, o.M21, o.M31);
var up = new Vector3(o.M12, o.M22, o.M32);
var backward = new Vector3(o.M13, o.M23, o.M33);
Vector3.Dot(ref vertices.Elements[0], ref right, out maxX);
minX = maxX;
Vector3.Dot(ref vertices.Elements[0], ref up, out maxY);
minY = maxY;
Vector3.Dot(ref vertices.Elements[0], ref backward, out maxZ);
minZ = maxZ;
int minXIndex = 0;
int maxXIndex = 0;
int minYIndex = 0;
int maxYIndex = 0;
int minZIndex = 0;
int maxZIndex = 0;
for (int i = 1; i < vertices.Count; i++)
{
float dot;
Vector3.Dot(ref vertices.Elements[i], ref right, out dot);
if (dot < minX)
{
minX = dot;
minXIndex = i;
}
else if (dot > maxX)
{
maxX = dot;
maxXIndex = i;
}
Vector3.Dot(ref vertices.Elements[i], ref up, out dot);
if (dot < minY)
{
minY = dot;
minYIndex = i;
}
else if (dot > maxY)
{
maxY = dot;
maxYIndex = i;
}
Vector3.Dot(ref vertices.Elements[i], ref backward, out dot);
if (dot < minZ)
{
minZ = dot;
minZIndex = i;
}
else if (dot > maxZ)
{
maxZ = dot;
maxZIndex = i;
}
}
Vector3 minXpoint, maxXpoint, minYpoint, maxYpoint, minZpoint, maxZpoint;
Matrix3x3.Transform(ref vertices.Elements[minXIndex], ref o, out minXpoint);
Matrix3x3.Transform(ref vertices.Elements[maxXIndex], ref o, out maxXpoint);
Matrix3x3.Transform(ref vertices.Elements[minYIndex], ref o, out minYpoint);
Matrix3x3.Transform(ref vertices.Elements[maxYIndex], ref o, out maxYpoint);
Matrix3x3.Transform(ref vertices.Elements[minZIndex], ref o, out minZpoint);
Matrix3x3.Transform(ref vertices.Elements[maxZIndex], ref o, out maxZpoint);
boundingBox.Max.X = shapeTransform.Position.X + collisionMargin + maxXpoint.X;
boundingBox.Max.Y = shapeTransform.Position.Y + collisionMargin + maxYpoint.Y;
boundingBox.Max.Z = shapeTransform.Position.Z + collisionMargin + maxZpoint.Z;
boundingBox.Min.X = shapeTransform.Position.X - collisionMargin + minXpoint.X;
boundingBox.Min.Y = shapeTransform.Position.Y - collisionMargin + minYpoint.Y;
boundingBox.Min.Z = shapeTransform.Position.Z - collisionMargin + minZpoint.Z;
}