void CreateSnappedPlanes() { firstSnappedPlanes = new CSGPlane[firstSnappedEdges.Length / 2]; for (int i = 0; i < firstSnappedEdges.Length; i += 2) { var point0 = firstSnappedEdges[i + 0]; var point1 = firstSnappedEdges[i + 1]; var binormal = (point1 - point0).normalized; var tangent = buildPlane.normal; var normal = Vector3.Cross(binormal, tangent); var worldPlane = new CSGPlane(normal, point0); // note, we use 'inverse' of the worldToLocalMatrix because to transform a plane we'd need to do an inverse, // and using the already inversed matrix we don't need to do a costly inverse. var localPlane = GeometryUtility.InverseTransformPlane(firstSnappedBrush.transform.localToWorldMatrix, worldPlane); var vertices = firstSnappedBrush.ControlMesh.Vertices; var planeIsInversed = false; for (int v = 0; v < vertices.Length; v++) { if (localPlane.Distance(vertices[v]) > MathConstants.DistanceEpsilon) { planeIsInversed = true; break; } } if (planeIsInversed) firstSnappedPlanes[i / 2] = worldPlane.Negated(); else firstSnappedPlanes[i / 2] = worldPlane; } }