/// <summary> /// Split a mesh at a series of coplanar planes. /// </summary> /// <param name="mesh">The mesh to split faces on.</param> /// <param name="planeNormal">The plane normal of the planes to split on.</param> /// <param name="distancesFromOrigin">The series of coplanar planes to split the mash at.</param> /// <param name="onPlaneDistance">Any mesh edge that has a vertex at this distance or less from a cut plane /// should not be cut by that plane.</param> public static void SplitOnPlanes(this Mesh mesh, Vector3 planeNormal, List <double> distancesFromOrigin, double onPlaneDistance) { for (int i = 0; i < distancesFromOrigin.Count; i++) { mesh.Split(new Plane(planeNormal, distancesFromOrigin[i]), onPlaneDistance, (clipData) => { // if two distances are less than 0 if ((clipData.Dist[0] < 0 && clipData.Dist[1] < 0) || (clipData.Dist[1] < 0 && clipData.Dist[2] < 0) || (clipData.Dist[2] < 0 && clipData.Dist[0] < 0)) { return(true); } return(false); }); } for (int i = distancesFromOrigin.Count - 1; i >= 0; i--) { mesh.Split(new Plane(planeNormal, distancesFromOrigin[i]), .1); } return; }