protected override void ProcessCandidates(RawValueList<ContactData> candidates)
{
//If the candidates list is empty, then let's see if the convex is in the 'thickness' of the terrain.
if (candidates.Count == 0 & terrain.thickness > 0)
{
RayHit rayHit;
Ray ray = new Ray() { Position = convex.worldTransform.Position, Direction = terrain.worldTransform.LinearTransform.Up };
ray.Direction.Normalize();
//The raycast has to use doublesidedness, since we're casting from the bottom up.
if (terrain.Shape.RayCast(ref ray, terrain.thickness, ref terrain.worldTransform, TriangleSidedness.DoubleSided, out rayHit))
{
//Found a hit!
rayHit.Normal.Normalize();
float dot;
Vector3.Dot(ref ray.Direction, ref rayHit.Normal, out dot);
ContactData newContact = new ContactData()
{
Normal = rayHit.Normal,
Position = convex.worldTransform.Position,
Id = 2,
PenetrationDepth = -rayHit.T * dot + convex.Shape.minimumRadius
};
bool found = false;
for (int i = 0; i < contacts.Count; i++)
{
if (contacts.Elements[i].Id == 2)
{
//As set above, an id of 2 corresponds to a contact created from this raycast process.
contacts.Elements[i].Normal = newContact.Normal;
contacts.Elements[i].Position = newContact.Position;
contacts.Elements[i].PenetrationDepth = newContact.PenetrationDepth;
supplementData.Elements[i].BasePenetrationDepth = newContact.PenetrationDepth;
supplementData.Elements[i].LocalOffsetA = new Vector3();
supplementData.Elements[i].LocalOffsetB = ray.Position; //convex local position in mesh.
found = true;
break;
}
}
if (!found)
candidates.Add(ref newContact);
}
}
}