internal void computeVolume(SSBVHNodeAdaptor <GO> nAda) { box = nAda.boundingBox(gobjects[0]); for (int i = 1; i < gobjects.Count; i++) { expandVolume(nAda, nAda.boundingBox(gobjects[i])); } }
public void addObject(GO newOb) { SSAABB box = nAda.boundingBox(newOb); float boxSAH = ssBVHNode <GO> .SA(ref box); rootBVH.addObject(nAda, newOb, ref box, boxSAH); }
// TODO: will need to calculate center of AABB internal void splitNode(SSBVHNodeAdaptor <GO> nAda) { // second, decide which axis to split on, and sort.. List <GO> splitlist = gobjects; splitlist.ForEach(o => nAda.unmapObject(o)); int center = (int)(splitlist.Count / 2); // find the center object SplitAxisOpt <GO> bestSplit = eachAxis.Min((axis) => { var orderedlist = new List <GO>(splitlist); switch (axis) { case Axis.X: orderedlist.Sort(delegate(GO go1, GO go2) { return(nAda.boundingBox(go1).Center().X.CompareTo(nAda.boundingBox(go2).Center().X)); }); break; case Axis.Y: orderedlist.Sort(delegate(GO go1, GO go2) { return(nAda.boundingBox(go1).Center().Y.CompareTo(nAda.boundingBox(go2).Center().Y)); }); break; case Axis.Z: orderedlist.Sort(delegate(GO go1, GO go2) { return(nAda.boundingBox(go1).Center().Z.CompareTo(nAda.boundingBox(go2).Center().Z)); }); break; default: throw new NotImplementedException("unknown split axis: " + axis.ToString()); } var left_s = orderedlist.GetRange(0, center); var right_s = orderedlist.GetRange(center, splitlist.Count - center); float SAH = SAofList(nAda, left_s) * left_s.Count + SAofList(nAda, right_s) * right_s.Count; return(new SplitAxisOpt <GO>(SAH, axis, left_s, right_s)); }); // perform the split gobjects = null; this.left = new ssBVHNode <GO>(nAda.BVH, this, bestSplit.left, bestSplit.axis, this.depth + 1); // Split the Hierarchy to the left this.right = new ssBVHNode <GO>(nAda.BVH, this, bestSplit.right, bestSplit.axis, this.depth + 1); // Split the Hierarchy to the right }
internal static SSAABB AABBofOBJ(SSBVHNodeAdaptor <GO> nAda, GO obj) { return(nAda.boundingBox(obj)); }