TriangleSidedness ComputeSolidSidednessHelper(Ray ray)
{
TriangleSidedness toReturn;
var hitList = CommonResources.GetIntList();
if (triangleMesh.Tree.GetOverlaps(ray, hitList))
{
Vector3 vA, vB, vC;
var hits = CommonResources.GetRayHitList();
//Identify the first and last hits.
int minimum = 0;
int maximum = 0;
float minimumT = float.MaxValue;
float maximumT = -1;
for (int i = 0; i < hitList.Count; i++)
{
triangleMesh.Data.GetTriangle(hitList[i], out vA, out vB, out vC);
RayHit hit;
if (Toolbox.FindRayTriangleIntersection(ref ray, float.MaxValue, TriangleSidedness.DoubleSided, ref vA, ref vB, ref vC, out hit) &&
IsHitUnique(hits, ref hit))
{
if (hit.T < minimumT)
{
minimumT = hit.T;
minimum = hitList[i];
}
if (hit.T > maximumT)
{
maximumT = hit.T;
maximum = hitList[i];
}
}
}
if (hits.Count % 2 == 0)
{
//Since we were outside, the first hit triangle should be calibrated
//such that it faces towards us.
triangleMesh.Data.GetTriangle(minimum, out vA, out vB, out vC);
var normal = Vector3.Cross(vA - vB, vA - vC);
if (Vector3.Dot(normal, ray.Direction) < 0)
toReturn = TriangleSidedness.Clockwise;
else
toReturn = TriangleSidedness.Counterclockwise;
}
else
{
//Since we were inside, the last hit triangle should be calibrated
//such that it faces away from us.
triangleMesh.Data.GetTriangle(maximum, out vA, out vB, out vC);
var normal = Vector3.Cross(vA - vB, vA - vC);
if (Vector3.Dot(normal, ray.Direction) < 0)
toReturn = TriangleSidedness.Counterclockwise;
else
toReturn = TriangleSidedness.Clockwise;
}
CommonResources.GiveBack(hits);
}
else
toReturn = TriangleSidedness.DoubleSided; //This is a problem...
CommonResources.GiveBack(hitList);
return toReturn;
}