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; }
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; }