protected override bool ConfigureTriangle(int i, out TriangleIndices indices)
{
indices = overlappedTriangles.Elements[i];
terrain.Shape.GetTriangle(ref indices, ref terrain.worldTransform, out localTriangleShape.vA, out localTriangleShape.vB, out localTriangleShape.vC);
localTriangleShape.collisionMargin = 0;
//Calibrate the sidedness of the triangle such that it's always facing up.
//TODO: There's quite a bit of redundancy in here with other systems.
Vector3 AB, AC, normal;
Vector3.Subtract(ref localTriangleShape.vB, ref localTriangleShape.vA, out AB);
Vector3.Subtract(ref localTriangleShape.vC, ref localTriangleShape.vA, out AC);
Vector3.Cross(ref AB, ref AC, out normal);
Vector3 terrainUp = new Vector3(terrain.worldTransform.LinearTransform.M21, terrain.worldTransform.LinearTransform.M22, terrain.worldTransform.LinearTransform.M23);
float dot;
Vector3.Dot(ref terrainUp, ref normal, out dot);
if (dot > 0)
{
localTriangleShape.sidedness = TriangleSidedness.Clockwise;
}
else
{
localTriangleShape.sidedness = TriangleSidedness.Counterclockwise;
}
//Unlike other 'instanced' geometries, terrains are almost always axis aligned in some way and/or have low triangle density relative to what they are colliding with.
//Instead of performing additional tests, just assume that it's a fairly regular situation.
return true;
}