public void EnumerateBvh() { // create a bvh hierarchy var level4_a = new TriangleShape(new Vector3(0, 0, 1), new Vector3(0, 0, 3), new Vector3(0, 1, 2), null); var level4_b = new TriangleShape(new Vector3(0, 0, 11), new Vector3(0, 0, 13), new Vector3(0, 1, 12), null); var level4_c = new TriangleShape(new Vector3(3, 0, 1), new Vector3(3, 0, 3), new Vector3(3, 1, 2), null); var level3_a = new UnboundCollection(new List <ITraceable>() { level4_a, level4_b, level4_c }); var level3_b = new TriangleShape(new Vector3(43, 0, 1), new Vector3(43, 0, 3), new Vector3(43, 1, 2), null); var level2_a = new Transform(level3_a, Matrix4X4.CreateTranslation(0, 0, 40)); var level2_b = new Transform(level3_b, Matrix4X4.CreateTranslation(0, 40, 0)); var level1 = new UnboundCollection(new List <ITraceable>() { level2_a, level2_b }); var root = new Transform(level1); // enumerate it and check it Assert.AreEqual(9, new BvhIterator(root).Count()); int count = 0; foreach (var item in new BvhIterator(root)) { switch (count++) { case 0: Assert.IsTrue(item.Bvh is Transform); Assert.AreEqual(0, item.Depth); Assert.AreEqual(Matrix4X4.CreateTranslation(0, 0, 0), item.TransformToWorld); break; case 1: Assert.IsTrue(item.Bvh is UnboundCollection); Assert.AreEqual(1, item.Depth); Assert.AreEqual(Matrix4X4.CreateTranslation(0, 0, 0), item.TransformToWorld); break; case 2: Assert.IsTrue(item.Bvh is Transform); Assert.AreEqual(2, item.Depth); Assert.AreEqual(Matrix4X4.CreateTranslation(0, 0, 0), item.TransformToWorld); break; case 3: Assert.IsTrue(item.Bvh is UnboundCollection); Assert.AreEqual(3, item.Depth); Assert.AreEqual(Matrix4X4.CreateTranslation(0, 0, 40), item.TransformToWorld); break; case 4: Assert.IsTrue(item.Bvh is TriangleShape); Assert.AreEqual(4, item.Depth); Assert.AreEqual(Matrix4X4.CreateTranslation(0, 0, 40), item.TransformToWorld); break; case 5: Assert.IsTrue(item.Bvh is TriangleShape); Assert.AreEqual(4, item.Depth); Assert.AreEqual(Matrix4X4.CreateTranslation(0, 0, 40), item.TransformToWorld); break; case 6: Assert.IsTrue(item.Bvh is TriangleShape); Assert.AreEqual(4, item.Depth); Assert.AreEqual(Matrix4X4.CreateTranslation(0, 0, 40), item.TransformToWorld); break; case 7: Assert.IsTrue(item.Bvh is Transform); Assert.AreEqual(2, item.Depth); Assert.AreEqual(Matrix4X4.CreateTranslation(0, 0, 0), item.TransformToWorld); break; case 8: Assert.IsTrue(item.Bvh is TriangleShape); Assert.AreEqual(3, item.Depth); Assert.AreEqual(Matrix4X4.CreateTranslation(0, 40, 0), item.TransformToWorld); break; } } }
public void RenderRecursive(UnboundCollection objectToProcess, int level = 0) { RenderBounds(objectToProcess.GetAxisAlignedBoundingBox()); foreach (var child in objectToProcess.Items) { RenderRecursive((dynamic)child, level + 1); } }