protected override bool ConfigureTriangle(int i, out TriangleIndices indices)
{
MeshBoundingBoxTreeData data = mesh.Shape.TriangleMesh.Data;
int triangleIndex = overlappedTriangles.Elements[i];
data.GetTriangle(triangleIndex, out localTriangleShape.vA, out localTriangleShape.vB, out localTriangleShape.vC);
AffineTransform transform;
AffineTransform.CreateFromRigidTransform(ref mesh.worldTransform, out transform);
AffineTransform.Transform(ref localTriangleShape.vA, ref transform, out localTriangleShape.vA);
AffineTransform.Transform(ref localTriangleShape.vB, ref transform, out localTriangleShape.vB);
AffineTransform.Transform(ref localTriangleShape.vC, ref transform, out localTriangleShape.vC);
//In instanced meshes, the bounding box we found in local space could collect more triangles than strictly necessary.
//By doing a second pass, we should be able to prune out quite a few of them.
BoundingBox triangleAABB;
Toolbox.GetTriangleBoundingBox(ref localTriangleShape.vA, ref localTriangleShape.vB, ref localTriangleShape.vC, out triangleAABB);
bool toReturn;
triangleAABB.Intersects(ref convex.boundingBox, out toReturn);
if (!toReturn)
{
indices = new TriangleIndices();
return false;
}
TriangleSidedness sidedness;
switch (mesh.Shape.solidity)
{
case MobileMeshSolidity.Clockwise:
sidedness = TriangleSidedness.Clockwise;
break;
case MobileMeshSolidity.Counterclockwise:
sidedness = TriangleSidedness.Counterclockwise;
break;
case MobileMeshSolidity.DoubleSided:
sidedness = TriangleSidedness.DoubleSided;
break;
default:
sidedness = mesh.Shape.solidSidedness;
break;
}
localTriangleShape.sidedness = sidedness;
localTriangleShape.collisionMargin = 0;
indices = new TriangleIndices()
{
A = data.indices[triangleIndex],
B = data.indices[triangleIndex + 1],
C = data.indices[triangleIndex + 2]
};
return true;
}