public static unsafe void TestBoxRayCorrectness()
{
//Test random rays.
Random random = new Random(5);
int intersectionCount = 0;
for (int i = 0; i < 1000000; ++i)
{
Ray simdRay;
BoundingBox simdBox;
simdRay.Position = 20 * (new Vector3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble()) - new Vector3(0.5f));
var boxPosition = 5 * (new Vector3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble()) - new Vector3(0.5f));
var target = 5 * (new Vector3((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble()) - new Vector3(0.5f));
simdRay.Direction = target - simdRay.Position;
var width = new Vector3(3 * (float)random.NextDouble());
simdBox.Min = boxPosition - width;
simdBox.Max = boxPosition + width;
TestIntersection(simdRay, simdBox, ref intersectionCount);
}
//Test corner cases.
{
Ray simdRay;
BoundingBox simdBox;
simdBox.Min = new Vector3(0);
simdBox.Max = new Vector3(1);
//Inside
simdRay.Position = new Vector3(0.5f);
simdRay.Direction = new Vector3(1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
simdRay.Position = new Vector3(0.5f);
simdRay.Direction = new Vector3(-1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
//Perpendicular to surface
simdRay.Position = new Vector3(0.5f, 0.5f, 0);
simdRay.Direction = new Vector3(-1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
simdRay.Position = new Vector3(0.5f, 0.5f, 1);
simdRay.Direction = new Vector3(1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
//Corner and edge
simdRay.Position = new Vector3(0);
simdRay.Direction = new Vector3(1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
simdRay.Position = new Vector3(-1, 0, 0);
simdRay.Direction = new Vector3(1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
simdRay.Position = new Vector3(0, 0.5f, 0);
simdRay.Direction = new Vector3(1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
simdRay.Position = new Vector3(0, 0.5f, 0.5f);
simdRay.Direction = new Vector3(1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
//Reversed
simdRay.Position = new Vector3(1);
simdRay.Direction = new Vector3(-1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
simdRay.Position = new Vector3(2, 0, 0);
simdRay.Direction = new Vector3(-1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
simdRay.Position = new Vector3(1, 0.5f, 0);
simdRay.Direction = new Vector3(-1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
simdRay.Position = new Vector3(1, 0.5f, 0.5f);
simdRay.Direction = new Vector3(-1, 0, 0);
TestIntersection(simdRay, simdBox, ref intersectionCount);
}
Console.WriteLine($"intersectionCount: {intersectionCount}");
}