private static BinarySpaceNode Subdivide(int maxdepth, int maxsize, BoundingBox bb, int depth, List<RenderItem> items, double total)
 {
     if(depth >= maxdepth || items.Count <= maxsize) {
         return new BinarySpaceNode(items.ToArray());
     }
     int dim;
     double sweep = CalculateOptimalSplit(items, depth%0x03, bb, out dim, total);
     BoundingBox bbleft, bbright;
     bb.SplitAt(sweep, dim, out bbleft, out bbright);
     List<RenderItem> left = new List<RenderItem>(), right = new List<RenderItem>();
     double leftsf, rightsf;
     Split(items, dim, sweep, left, right, bbleft, bbright, out leftsf, out rightsf);
     return new BinarySpaceNode(Subdivide(maxdepth, maxsize, bbleft, depth+0x01, left, leftsf), Subdivide(maxdepth, maxsize, bbright, depth+0x01, right, rightsf), sweep, dim);
 }