Example #1
0
        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);
        }
Example #2
0
 /// <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);
 }
Example #3
0
 /// <summary> Create an empty bounding volume hierarchy tree </summary>
 public BVHTree()
 {
     Root = new BVHNode();
 }