public override ActionResult DoAction() { if (MeshSelection.selectedObjectCount < 2) { return(new ActionResult(ActionResult.Status.Canceled, "Must Select 2+ Objects")); } var selected = MeshSelection.top.ToArray(); List <ProBuilderMesh> res = InternalMeshUtility.CombineObjects(MeshSelection.topInternal); if (res != null) { foreach (var mesh in res) { mesh.Optimize(); mesh.gameObject.name = "pb-MergedObject" + mesh.id; UndoUtility.RegisterCreatedObjectUndo(mesh.gameObject, "Merge Objects"); Selection.objects = res.Select(x => x.gameObject).ToArray(); } // Delete donor objects for (int i = 0; i < selected.Length; i++) { if (selected[i] != null) { UndoUtility.DestroyImmediate(selected[i].gameObject); } } } ProBuilderEditor.Refresh(); return(new ActionResult(ActionResult.Status.Success, "Merged Objects")); }
static bool ReProBuilderize(ProBuilderMesh pb) { try { GameObject go = pb.gameObject; pb.preserveMeshAssetOnDestroy = true; Undo.DestroyObjectImmediate(pb); // don't delete pb_Entity here because it won't // actually get removed till the next frame, and // probuilderize wants to add it if it's missing // (which it looks like it is from c# side but // is not) pb = Undo.AddComponent <ProBuilderMesh>(go); InternalMeshUtility.ResetPbObjectWithMeshFilter(pb, true); pb.ToMesh(); pb.Refresh(); pb.Optimize(); return(true); } catch { return(false); } }
static ActionResult MenuBooleanOperation(BooleanOperation operation, ProBuilderMesh lhs, ProBuilderMesh rhs) { if (lhs == null || rhs == null) { return(new ActionResult(ActionResult.Status.Failure, "Must Select 2 Objects")); } string op_string = operation == BooleanOperation.Union ? "Union" : (operation == BooleanOperation.Subtract ? "Subtract" : "Intersect"); ProBuilderMesh[] sel = new ProBuilderMesh[] { lhs, rhs }; UndoUtility.RecordSelection(sel, op_string); Mesh c; switch (operation) { case BooleanOperation.Union: c = CSG.Union(lhs.gameObject, rhs.gameObject); break; case BooleanOperation.Subtract: c = CSG.Subtract(lhs.gameObject, rhs.gameObject); break; default: c = CSG.Intersect(lhs.gameObject, rhs.gameObject); break; } GameObject go = new GameObject(); go.AddComponent <MeshRenderer>().sharedMaterial = EditorMaterialUtility.GetUserMaterial(); go.AddComponent <MeshFilter>().sharedMesh = c; ProBuilderMesh pb = InternalMeshUtility.CreateMeshWithTransform(go.transform, false); DestroyImmediate(go); Selection.objects = new Object[] { pb.gameObject }; return(new ActionResult(ActionResult.Status.Success, op_string)); }
static void ApplyMaterial(IEnumerable<ProBuilderMesh> selection, Material mat) { if (mat == null) return; UndoUtility.RecordSelection(selection.ToArray(), "Set Face Materials"); foreach (var mesh in selection) { var applyPerFace = ProBuilderEditor.selectMode.ContainsFlag(SelectMode.Face) && mesh.faceCount > 0; mesh.SetMaterial(applyPerFace ? mesh.GetSelectedFaces() : mesh.facesInternal, mat); InternalMeshUtility.FilterUnusedSubmeshIndexes(mesh); mesh.Rebuild(); mesh.Optimize(); } if (ProBuilderEditor.instance != null && MeshSelection.selectedFaceCount > 0) EditorUtility.ShowNotification("Set Material\n" + mat.name); }
static void OnSceneGUI(SceneView sceneView) { var evt = Event.current; if (evt.type == EventType.DragUpdated) { if (!s_IsSceneViewDragAndDrop) { s_IsSceneViewDragAndDrop = true; } int submeshIndex; GameObject go = HandleUtility.PickGameObject(evt.mousePosition, out submeshIndex); SetMeshPreview(go != null ? go.GetComponent <ProBuilderMesh>() : null); if (s_IsFaceDragAndDropOverrideEnabled) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; evt.Use(); } } else if (evt.type == EventType.DragExited) { if (s_IsFaceDragAndDropOverrideEnabled) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; evt.Use(); SetMeshPreview(null); } s_IsSceneViewDragAndDrop = false; } else if (evt.type == EventType.DragPerform) { s_IsSceneViewDragAndDrop = false; int submeshIndex; GameObject go = HandleUtility.PickGameObject(evt.mousePosition, out submeshIndex); SetMeshPreview(go != null ? go.GetComponent <ProBuilderMesh>() : null); if (s_CurrentPreview != null && s_IsFaceDragAndDropOverrideEnabled) { UndoUtility.RecordObject(s_CurrentPreview, "Set Face Material"); UndoUtility.RecordObject(s_CurrentPreview.renderer, "Set Face Material"); s_CurrentPreview.SetMaterial(s_CurrentPreview.selectedFacesInternal, s_PreviewMaterial); InternalMeshUtility.FilterUnusedSubmeshIndexes(s_CurrentPreview); s_CurrentPreview.ToMesh(); s_CurrentPreview.Refresh(); s_CurrentPreview.Optimize(); evt.Use(); } SetMeshPreview(null); } else if (evt.type == EventType.Repaint && s_IsFaceDragAndDropOverrideEnabled) { if (s_PreviewMaterial.SetPass(0)) { Graphics.DrawMeshNow(s_PreviewMesh, s_Matrix, 0); } } }