public IBVHNode GetIntersectedNode(ref Ray ray) { var dist = float.PositiveInfinity; IBVHNode bestNode = null; for (int i = 0; i < _nodes.Count;) { var node = _nodes[i]; var isIntersecting = node.Bounds.Intersects(ref ray); if (node.IsLeaf && isIntersecting) { var t = node.Triangle; float tmp; if (ray.Intersects(ref t.A, ref t.B, ref t.C, out tmp) && tmp < dist) { dist = tmp; bestNode = node; } } if (node.IsLeaf || isIntersecting) { ++i; } else { i += node.ChildCount; } } return(bestNode); }
/// <summary> Create a bounding volume hierarchy tree, splitting into smaller nodes if beneficial </summary> /// <param name="primitives">The primitives to build the tree with</param> public BVHTree(List <Primitive> primitives) { Root = new BVHNode(primitives); }
/// <summary> Create an empty bounding volume hierarchy tree </summary> public BVHTree() { Root = new BVHNode(); }