void BuildRecursivly(BinNode <List <Triangle3D> > node) { if (node.data.Count <= 1) { return; } Triangle3D main = node.data[0]; Plane plane = new Plane(main.a, main.normal); for (int i = 1; i < node.data.Count; i++) { Triangle3D go = node.data[i]; float fa = Helper.SnapToZero(plane.Point(go.a)); float fb = Helper.SnapToZero(plane.Point(go.b)); float fc = Helper.SnapToZero(plane.Point(go.c)); if (fa >= 0 && fb >= 0 && fc >= 0) { if (node.right == null) { node.right = new BinNode <List <Triangle3D> >(new List <Triangle3D>()); node.right.data = new List <Triangle3D>(); } node.right.data.Add(go); } else if (fa <= 0 && fb <= 0 && fc <= 0) { if (node.left == null) { node.left = new BinNode <List <Triangle3D> >(new List <Triangle3D>()); node.left.data = new List <Triangle3D>(); } node.left.data.Add(go); } else { List <Triangle3D> ts = Rasterizer.ClipTriangle(go, plane); node.data.AddRange(ts); node.data.RemoveAt(i); i--; } } node.data.RemoveRange(1, node.data.Count - 1); if (node.left != null) { BuildRecursivly(node.left); } if (node.right != null) { BuildRecursivly(node.right); } }