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"));
        }
Exemple #3
0
        /// <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"));
        }