示例#1
0
        private Node BuildSubTree(RenderableCollection primitives, int start, int end)
        {
            if (start - end == 0)
                return null;
            AABB bound = primitives.GetRange(start, end - start).Select(prim => prim.WorldBound(sceneVertices)).Aggregate((b1, b2) => b1.Union(b2));
            var node = new Node() { Bound = bound, SplitAxis = (Axis)bound.MaximumExtent() };
            bvhNodesCount++;
            if ((end - start) <= PrimitivesInNode)
            {
                node.StartOffset = start;
                node.nPrims = end - start;
                //node.Primitives = primitives.GetRange(start, (end - start));
                return node;
            }


            //float pmid;
            int axis = bound.MaximumExtent();
            Comparison<Triangle> tc = (t1, t2) => CompareTriangles(t1, t2, (Axis)bound.MaximumExtent());

            primitives.PartialSort(tc, start, end);

            //FindBestSplit(primitives, start, end, out pmid, out axis);



            //var pmid = .5f * (bound.Min[axis] + bound.Max[axis]);
            //FindBestSplit(primitives.GetRange(start, end-start), start, end, out pmid, out axis);
            //var cmp = new MidComparer() { dim = axis, pMid = pmid, vertices = sceneVertices};
            node.SplitAxis = (Axis)axis;

            var mid =
                //start+Algorithms.Partition(primitives.GetRange(start, end - start), cmp.Compare);
                (start + end) / 2;
            node.Left = this.BuildSubTree(primitives, start, mid);
            node.Right = this.BuildSubTree(primitives, mid, end);
            return node;
        }