protected internal override int FindOverlappingTriangles(float dt)
{
BoundingBox boundingBox;
AffineTransform transform = new AffineTransform(mesh.worldTransform.Orientation, mesh.worldTransform.Position);
convex.Shape.GetLocalBoundingBox(ref convex.worldTransform, ref transform, out boundingBox);
Vector3 transformedVelocity;
//Compute the relative velocity with respect to the mesh. The mesh's bounding tree is NOT expanded with velocity,
//so whatever motion there is between the two objects needs to be included in the convex's bounding box.
if (convex.entity != null)
transformedVelocity = convex.entity.linearVelocity;
else
transformedVelocity = new Vector3();
if (mesh.entity != null)
Vector3.Subtract(ref transformedVelocity, ref mesh.entity.linearVelocity, out transformedVelocity);
//The linear transform is known to be orientation only, so using the transpose is allowed.
Matrix3x3.TransformTranspose(ref transformedVelocity, ref transform.LinearTransform, out transformedVelocity);
Vector3.Multiply(ref transformedVelocity, dt, out transformedVelocity);
if (transformedVelocity.X > 0)
boundingBox.Max.X += transformedVelocity.X;
else
boundingBox.Min.X += transformedVelocity.X;
if (transformedVelocity.Y > 0)
boundingBox.Max.Y += transformedVelocity.Y;
else
boundingBox.Min.Y += transformedVelocity.Y;
if (transformedVelocity.Z > 0)
boundingBox.Max.Z += transformedVelocity.Z;
else
boundingBox.Min.Z += transformedVelocity.Z;
mesh.Shape.TriangleMesh.Tree.GetOverlaps(boundingBox, overlappedTriangles);
return overlappedTriangles.Count;
}