Example #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(ref 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, split;
            int axis = bound.MaximumExtent();

            //FindBestSplit(primitives, start, end, out split, 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 };
            var mid =
                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;
        }
Example #2
0
        private Node BuildSubTree(RenderableCollection primitives, int start, int end) {
            if (start - end == 0)
                return null;
            bvhNodesCount++;
            if ((end - start) <= PrimitivesInNode)
            {
                var lnode = new Node(){ Bound = primitives[start].WorldBound(sceneVertices)};
                lnode.StartOffset = start;
                lnode.nPrims = end - start;
                //node.Primitives = primitives.GetRange(start, (end - start));
                return lnode;
            }
            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() };
         

            float pmid;
            int axis = bound.MaximumExtent();

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

             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};
            Comparison<Triangle> tc = (t1, t2) => CompareTriangles(t1, t2, (Axis)bound.MaximumExtent());
            primitives.PartialSort(tc, start, end);
            var mid = 
                //Algorithms.Partition(primitives.GetRange(start, end - start), cmp.Compare) ;
                (start + end) / 2;
            node.Left = this.BuildSubTree(primitives, start, mid);
            node.Right = this.BuildSubTree(primitives, 1+mid, end);
            return node;
        }