public static SimpleTuple <ProBuilderMesh, Face> CreateCubeWithNonContiguousMergedFace() { var cube = ShapeGenerator.CreateShape(ShapeType.Cube); Assume.That(cube, Is.Not.Null); int index = 1; Face a = cube.faces[0], b = cube.faces[index++]; Assume.That(a, Is.Not.Null); Assume.That(b, Is.Not.Null); while (FacesAreAdjacent(cube, a, b) && index < cube.faceCount) { b = cube.faces[index++]; } Assume.That(FacesAreAdjacent(cube, a, b), Is.False); var res = MergeElements.Merge(cube, new Face[] { a, b }); return(new SimpleTuple <ProBuilderMesh, Face>(cube, res)); }
public override ActionResult DoAction() { if (MeshSelection.selectedObjectCount < 1) { return(ActionResult.NoSelection); } UndoUtility.RecordSelection("Merge Faces"); int success = 0; foreach (ProBuilderMesh pb in MeshSelection.topInternal) { if (pb.selectedFaceCount > 1) { success += pb.selectedFaceCount; Face face = MergeElements.Merge(pb, pb.selectedFacesInternal); pb.ToMesh(); pb.Refresh(); pb.Optimize(); pb.SetSelectedFaces(new Face[] { face }); } } ProBuilderEditor.Refresh(); if (success > 0) { return(new ActionResult(ActionResult.Status.Success, "Merged " + success + " Faces")); } return(new ActionResult(ActionResult.Status.Failure, "Merge Faces\nNo Faces Selected")); }
/// <summary> /// Return a pb_ActionResult indicating the success/failure of action. /// </summary> /// <returns></returns> protected override ActionResult PerformActionImplementation() { var selection = MeshSelection.top.ToArray(); Undo.RecordObjects(selection, "Removing Edges"); List <Face> edgeFaces = new List <Face>(); Dictionary <Face, int> faceToMergeGroup = new Dictionary <Face, int>(); HashSet <int> mergeGroupIDs = new HashSet <int>(); List <List <Face> > mergeGroups = new List <List <Face> >(); foreach (ProBuilderMesh pbMesh in selection) { if (pbMesh.selectedEdgeCount > 0) { var selectedEdges = pbMesh.selectedEdges; faceToMergeGroup.Clear(); foreach (var edge in selectedEdges) { edgeFaces.Clear(); mergeGroupIDs.Clear(); //Retrieving impacted faces from edge ElementSelection.GetNeighborFaces(pbMesh, edge, edgeFaces); //Chacking all edges status foreach (var face in edgeFaces) { if (faceToMergeGroup.ContainsKey(face)) { mergeGroupIDs.Add(faceToMergeGroup[face]); } else { faceToMergeGroup.Add(face, -1); } } //These faces haven't been seen before if (mergeGroupIDs.Count == 0) { foreach (var face in edgeFaces) { faceToMergeGroup[face] = mergeGroups.Count; } mergeGroups.Add(new List <Face>(edgeFaces)); } //If only a face should already be merge, add other faces to the same merge group else if (mergeGroupIDs.Count == 1) { foreach (var face in edgeFaces) { if (faceToMergeGroup[face] == -1) { int index = mergeGroupIDs.First(); faceToMergeGroup[face] = index; mergeGroups[index].Add(face); } } } //If more than a face already belongs to a merge group, merge these groups together else { //Group the different mergeGroups together List <Face> facesToMerge = new List <Face>(); foreach (var groupID in mergeGroupIDs) { facesToMerge.AddRange(mergeGroups[groupID]); mergeGroups[groupID] = null; } foreach (var face in edgeFaces) { if (!facesToMerge.Contains(face)) { facesToMerge.Add(face); } } //Remove unnecessary groups mergeGroups.RemoveAll(group => group == null); //Add newly created one mergeGroups.Add(facesToMerge); //Update groups references for (int i = 0; i < mergeGroups.Count; i++) { foreach (var face in mergeGroups[i]) { faceToMergeGroup[face] = i; } } } } foreach (var mergeGroup in mergeGroups) { MergeElements.Merge(pbMesh, mergeGroup); } pbMesh.ToMesh(); pbMesh.Refresh(); pbMesh.Optimize(); } } MeshSelection.ClearElementSelection(); // Rebuild the pb_Editor caches ProBuilderEditor.Refresh(); return(new ActionResult(ActionResult.Status.Success, "Edges Removed")); }