public void CutMesh(Submesh mesh, RHVector3 normal, RHVector3 point,int defaultFaceColor) { TopoPlane plane = new TopoPlane(normal, point); bool drawEdges = Main.threeDSettings.ShowEdges; foreach (TopoEdge e in edges) e.algHelper = 0; // Mark drawn edges, so we insert them only once foreach (TopoTriangle t in triangles) { int side = plane.testTriangleSideFast(t); if (side == -1) { mesh.AddTriangle(t.vertices[0].pos, t.vertices[1].pos, t.vertices[2].pos, (t.bad ? Submesh.MESHCOLOR_ERRORFACE : defaultFaceColor)); if (drawEdges) { if (t.edges[0].algHelper == 0) { mesh.AddEdge(t.vertices[0].pos, t.vertices[1].pos, t.edges[0].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); t.edges[0].algHelper = 1; } if (t.edges[1].algHelper == 0) { mesh.AddEdge(t.vertices[1].pos, t.vertices[2].pos, t.edges[1].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); t.edges[1].algHelper = 1; } if (t.edges[2].algHelper == 0) { mesh.AddEdge(t.vertices[2].pos, t.vertices[0].pos, t.edges[2].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); t.edges[2].algHelper = 1; } } else { if (t.edges[0].algHelper == 0 && t.edges[0].connectedFaces != 2) { mesh.AddEdge(t.vertices[0].pos, t.vertices[1].pos, Submesh.MESHCOLOR_ERROREDGE); t.edges[0].algHelper = 1; } if (t.edges[1].algHelper == 0 && t.edges[1].connectedFaces != 2) { mesh.AddEdge(t.vertices[1].pos, t.vertices[2].pos, Submesh.MESHCOLOR_ERROREDGE); t.edges[1].algHelper = 1; } if (t.edges[2].algHelper == 0 && t.edges[2].connectedFaces != 2) { mesh.AddEdge(t.vertices[2].pos, t.vertices[0].pos, Submesh.MESHCOLOR_ERROREDGE); t.edges[2].algHelper = 1; } } } else if (side == 0) { plane.addIntersectionToSubmesh(mesh, t, drawEdges, (t.bad ? Submesh.MESHCOLOR_ERRORFACE : defaultFaceColor)); } } }