/// <summary> /// Classify faces as being inside, outside or on boundary of other object /// </summary> /// <param name="otherObject">object 3d used for the comparison</param> public void ClassifyFaces(CsgObject3D otherObject, CancellationToken cancellationToken, Action <CsgFace> classifyFaces = null) { var otherBounds = otherObject.Bounds; foreach (var vertex in vertices) { cancellationToken.ThrowIfCancellationRequested(); if (!otherBounds.Contains(vertex.Position) && vertex.Status != FaceStatus.Outside) { vertex.Status = FaceStatus.Outside; } } //calculate adjacency information Faces.All(); foreach (var face in Faces.QueryResults) { cancellationToken.ThrowIfCancellationRequested(); face.v1.AddAdjacentVertex(face.v2); face.v1.AddAdjacentVertex(face.v3); face.v2.AddAdjacentVertex(face.v1); face.v2.AddAdjacentVertex(face.v3); face.v3.AddAdjacentVertex(face.v1); face.v3.AddAdjacentVertex(face.v2); } // for each face foreach (var face in Faces.QueryResults) { cancellationToken.ThrowIfCancellationRequested(); // If the face vertices can't be classified with the simple classify if (face.SimpleClassify() == false) { //makes the ray trace classification face.RayTraceClassify(otherObject); //mark the vertices if (face.v1.Status == FaceStatus.Unknown) { face.v1.Mark(face.Status); } if (face.v2.Status == FaceStatus.Unknown) { face.v2.Mark(face.Status); } if (face.v3.Status == FaceStatus.Unknown) { face.v3.Mark(face.Status); } } classifyFaces?.Invoke(face); } }