private void Split()
    {
        NDPlane plane = new NDPlane();

        plane.ComputePlane((mpta + mptb + mptc) / 3, RandomVector3());

        List <Vector3> upper        = new List <Vector3>();
        List <Vector3> lower        = new List <Vector3>();
        List <Vector3> intersection = new List <Vector3>();

        plane.IntersectTriangleHull(mpta, mptb, mptc, upper, lower, intersection);

        upper.AddRange(intersection);
        lower.AddRange(intersection);

        List <int> indices = new List <int>();

        // UPPER HULL
        Triangulator.TriangulateNDSlice(upper, indices);

        for (int i = 0; i < indices.Count; i += 3)
        {
            RenderTriangle tri = new RenderTriangle();

            Vector3 pta = upper[indices[i]];
            Vector3 ptb = upper[indices[i + 1]];
            Vector3 ptc = upper[indices[i + 2]];

            Vector2 uva = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref pta);
            Vector2 uvb = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptb);
            Vector2 uvc = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptc);

            tri.SetPoints(pta, ptb, ptc);
            tri.SetUV(uva, uvb, uvc);

            splits.Add(tri);
        }

        indices.Clear();

        // LOWER HULL
        Triangulator.TriangulateNDSlice(lower, indices);

        for (int i = 0; i < indices.Count; i += 3)
        {
            RenderTriangle tri = new RenderTriangle();

            Vector3 pta = lower[indices[i]];
            Vector3 ptb = lower[indices[i + 1]];
            Vector3 ptc = lower[indices[i + 2]];

            Vector2 uva = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref pta);
            Vector2 uvb = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptb);
            Vector2 uvc = Triangulator.GenerateUVCoords(ref mpta, ref mptb, ref mptc, ref muva, ref muvb, ref muvc, ref ptc);

            tri.SetPoints(pta, ptb, ptc);
            tri.SetUV(uva, uvb, uvc);

            splits.Add(tri);
        }
    }