private void SplitNode(SSBVHNodeAdaptor <GO> nAda) { // second, decide which axis to split on, and sort.. List <GO> splitlist = ContainedObjects; splitlist.ForEach(nAda.UnmapObject); int center = 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((go1, go2) => nAda.GetObjectPosition(go1).x.CompareTo(nAda.GetObjectPosition(go2).x)); break; case Axis.Y: orderedlist.Sort((go1, go2) => nAda.GetObjectPosition(go1).y.CompareTo(nAda.GetObjectPosition(go2).y)); break; case Axis.Z: orderedlist.Sort((go1, go2) => nAda.GetObjectPosition(go1).z.CompareTo(nAda.GetObjectPosition(go2).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); double 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 ContainedObjects = null; Left = new ssBVHNode <GO>(nAda.BVH, this, bestSplit.left, Depth + 1); // Split the Hierarchy to the left Right = new ssBVHNode <GO>(nAda.BVH, this, bestSplit.right, Depth + 1); // Split the Hierarchy to the right }