void RecursivePartition(List <int> triangles, int depth, Node parent)
        {
            TrianglesExtents extents          = GetTrianglesExtents(triangles);
            Vector3          extentsMagnitude = extents.HalfExtent();
            Vector3          partitionNormal  = Vector3.zero;

            if (extentsMagnitude.x >= extentsMagnitude.y && extentsMagnitude.x >= extentsMagnitude.z)
            {
                partitionNormal = Vector3.right;
            }
            else if (extentsMagnitude.y >= extentsMagnitude.x && extentsMagnitude.y >= extentsMagnitude.z)
            {
                partitionNormal = Vector3.up;
            }
            else
            {
                partitionNormal = Vector3.forward;
            }

            List <int> positiveTriangles;
            List <int> negativeTriangles;

            Split(triangles, extents.trianglesCenter, partitionNormal, out positiveTriangles, out negativeTriangles);

            parent.Set(extents);
            parent.positiveChild = new Node();
            parent.negativeChild = new Node();

            if (positiveTriangles.Count < triangles.Count && positiveTriangles.Count > maxTrianglesPerNode)
            {
                RecursivePartition(positiveTriangles, depth + 1, parent.positiveChild);
            }
            else
            {
                parent.positiveChild.triangles = positiveTriangles.ToArray();
                parent.positiveChild.Set(GetTrianglesExtents(positiveTriangles));
            }

            if (negativeTriangles.Count < triangles.Count && negativeTriangles.Count > maxTrianglesPerNode)
            {
                RecursivePartition(negativeTriangles, depth + 1, parent.negativeChild);
            }
            else
            {
                parent.negativeChild.triangles = negativeTriangles.ToArray();
                parent.negativeChild.Set(GetTrianglesExtents(negativeTriangles));
            }
        }
        TrianglesExtents GetTrianglesExtents(IList <int> triangles)
        {
            TrianglesExtents extents = TrianglesExtents.max;

            for (int i = 0; i < triangles.Count; i++)
            {
                int triangle = triangles[i];

                extents.trianglesCenter += (vertices[tris[triangle]] + vertices[tris[triangle + 1]] + vertices[tris[triangle + 2]]);

                extents.minExtent.x = Mathf.Min(extents.minExtent.x, vertices[tris[triangle]].x, vertices[tris[triangle + 1]].x, vertices[tris[triangle + 2]].x);
                extents.minExtent.y = Mathf.Min(extents.minExtent.y, vertices[tris[triangle]].y, vertices[tris[triangle + 1]].y, vertices[tris[triangle + 2]].y);
                extents.minExtent.z = Mathf.Min(extents.minExtent.z, vertices[tris[triangle]].z, vertices[tris[triangle + 1]].z, vertices[tris[triangle + 2]].z);

                extents.maxExtent.x = Mathf.Max(extents.maxExtent.x, vertices[tris[triangle]].x, vertices[tris[triangle + 1]].x, vertices[tris[triangle + 2]].x);
                extents.maxExtent.y = Mathf.Max(extents.maxExtent.y, vertices[tris[triangle]].y, vertices[tris[triangle + 1]].y, vertices[tris[triangle + 2]].y);
                extents.maxExtent.z = Mathf.Max(extents.maxExtent.z, vertices[tris[triangle]].z, vertices[tris[triangle + 1]].z, vertices[tris[triangle + 2]].z);
            }

            extents.trianglesCenter /= (triangles.Count * 3f);

            return(extents);
        }
 public void Set(TrianglesExtents extents)
 {
     Set(extents.Center(), extents.HalfExtent());
 }