public override void DoInspectorGUI() { using (new NamedVerticalScope("Group")) { GroupBrush group = (GroupBrush)target; GUILayout.BeginHorizontal(); if (GUILayout.Button("Select Brushes")) { // select all of the child brush objects. List <Object> objects = Selection.objects.ToList(); objects.Remove(group.gameObject); foreach (Transform child in group.transform) { if (child.GetComponent <BrushBase>()) { objects.Add(child.gameObject); } } Selection.objects = objects.ToArray(); } if (GUILayout.Button("Ungroup Brushes")) { TransformHelper.UngroupSelection(); } GUILayout.EndHorizontal(); } }
public static void GroupSelection() { if (Selection.activeTransform != null) { List <Transform> selectedTransforms = Selection.transforms.ToList(); selectedTransforms.Sort((x, y) => x.GetSiblingIndex().CompareTo(y.GetSiblingIndex())); Transform rootTransform = Selection.activeTransform.parent; int earliestSiblingIndex = Selection.activeTransform.GetSiblingIndex(); // Make sure we use the earliest sibling index for grouping, as they may select in reverse order up the hierarchy for (int i = 0; i < selectedTransforms.Count; i++) { if (selectedTransforms[i].parent == rootTransform) { int siblingIndex = selectedTransforms[i].GetSiblingIndex(); if (siblingIndex < earliestSiblingIndex) { earliestSiblingIndex = siblingIndex; } } } // Create group GameObject groupObject = new GameObject(""); GroupBrush groupBrush = groupObject.AddComponent <GroupBrush>(); Undo.RegisterCreatedObjectUndo(groupObject, "Group"); Undo.SetTransformParent(groupObject.transform, rootTransform, "Group"); groupObject.transform.position = Selection.activeTransform.position; groupObject.transform.rotation = Selection.activeTransform.rotation; groupObject.transform.localScale = Selection.activeTransform.localScale; // Ensure correct sibling index groupObject.transform.SetSiblingIndex(earliestSiblingIndex); // Renachor for (int i = 0; i < selectedTransforms.Count; i++) { Undo.SetTransformParent(selectedTransforms[i], groupObject.transform, "Group"); } // Ensure it gets a correct name in the hierarchy. groupBrush.UpdateGeneratedHierarchyName(); Selection.activeGameObject = groupObject; // EditorApplication.RepaintHierarchyWindow(); // SceneView.RepaintAll(); } }
public List <BrushBase> ExtractBrushBases(List <Brush> sourceBrushes) { // Generate a list of editable brushes (in the case of compound brush's child brushes this would be the root controller) List <BrushBase> brushBases = new List <BrushBase>(); for (int i = 0; i < sourceBrushes.Count; i++) { if (sourceBrushes[i].GetType() == typeof(PrimitiveBrush)) { // Get any group this brush is a child of. GroupBrush group = null; if (sourceBrushes[i].transform.parent) { group = sourceBrushes[i].transform.parent.GetComponent <GroupBrush>(); } // Get any controller (e.g. compound brush) that is driving the selected brush BrushBase controller = ((PrimitiveBrush)sourceBrushes[i]).BrushController; if (group != null) { // Group with 'always select group' found, add it instead if it's not already in the list if (!brushBases.Contains(group)) { brushBases.Add(group); } } else if (controller != null) { // Controller found, add it instead if it's not already in the list if (!brushBases.Contains(controller)) { brushBases.Add(controller); } } else { // No controller found just add the brush brushBases.Add(sourceBrushes[i]); } } else { // Not a primitive brush, so just add it brushBases.Add(sourceBrushes[i]); } } return(brushBases); }
public sealed override void OnInspectorGUI() { // group editing: if (ShowGroupInspector) { using (new NamedVerticalScope("Group")) { GUILayout.BeginHorizontal(); // find whether we are currently inside of a group: GroupBrush group = null; if (BrushTarget.transform.parent) { group = BrushTarget.transform.parent.GetComponent <GroupBrush>(); } // we are in a group: if (group != null) { if (GUILayout.Button("Select Group")) { // select the group. Selection.objects = new Object[] { BrushTarget.transform.parent.gameObject }; } } if (GUILayout.Button("Create Group")) { // create a group. TransformHelper.GroupSelection(); } GUILayout.EndHorizontal(); } } // volume editing: if (BrushTargets.Any(b => b.Mode == CSGMode.Volume)) { using (new NamedVerticalScope("Volume")) { // find all of the volume types in the project: List <System.Type> volumeTypes = Volume.FindAllInAssembly(); if (volumeTypes.Count == 0) { EditorGUILayout.LabelField("No volume types could be found!"); } else { // find all of the volume brushes that are currently selected. BrushBase[] volumeBrushes = BrushTargets.Where(b => b.Mode == CSGMode.Volume).ToArray(); BrushBase volumeTarget = volumeBrushes.Contains(BrushTarget) ? BrushTarget : volumeBrushes.Last(); // make sure all volume brushes are of the same type (for multi-editing). object brushTargetVolumeType = volumeTarget.Volume ? volumeTarget.Volume.GetType() : null; if (volumeBrushes.Length > 1 && !volumeBrushes.All(b => b.Volume.GetType() == brushTargetVolumeType)) { EditorGUILayout.LabelField("Cannot multi-edit volumes of different types!"); } else { // let the user pick a volume type: int selected = 0; if (volumeTarget.Volume != null) { for (int i = 0; i < volumeTypes.Count; i++) { selected = i; if (volumeTarget.Volume.GetType() == volumeTypes[i]) { break; } } } selected = EditorGUILayout.Popup("Volume Type", selected, volumeTypes.Select(v => v.Name + " (" + v.Namespace + ")").ToArray()); // set the brush volume type: for (int i = 0; i < volumeBrushes.Length; i++) { BrushBase target = volumeBrushes[i]; // if the brush does not have a volume yet or the wrong one, create the selected type now: if (target.Volume == null || target.Volume.GetType() != volumeTypes[selected]) { target.Volume = (Volume)ScriptableObject.CreateInstance(volumeTypes[selected]); if (serializedObject.targetObject != null) { serializedObject.ApplyModifiedProperties(); System.Array.ForEach(volumeBrushes, item => item.Invalidate(true)); } } } // custom volume inspector: if (volumeTarget.Volume.OnInspectorGUI(volumeBrushes.Select(b => b.Volume).ToArray())) { if (serializedObject.targetObject != null) { serializedObject.ApplyModifiedProperties(); System.Array.ForEach(volumeBrushes, item => item.Invalidate(true)); } } } } } } // custom inspector: DoInspectorGUI(); // generic brush editing: using (new NamedVerticalScope("Order")) { List <BrushBase> orderedTargets = BrushTargets.ToList(); orderedTargets.RemoveAll(item => (item == null)); orderedTargets.Sort((x, y) => x.transform.GetSiblingIndex().CompareTo(y.transform.GetSiblingIndex())); if (GUILayout.Button("Set As First")) { for (int i = 0; i < orderedTargets.Count; i++) { // REVERSED BrushBase thisBrush = orderedTargets[orderedTargets.Count - 1 - i]; Undo.SetTransformParent(thisBrush.transform, thisBrush.transform.parent, "Change Order"); thisBrush.transform.SetAsFirstSibling(); } // Force all the brushes to recalculate their intersections and get ready for rebuilding for (int i = 0; i < orderedTargets.Count; i++) { if (orderedTargets[i] is PrimitiveBrush) { ((PrimitiveBrush)orderedTargets[i]).RecalculateIntersections(); ((PrimitiveBrush)orderedTargets[i]).BrushCache.SetUnbuilt(); } } } if (GUILayout.Button("Send Earlier")) { for (int i = 0; i < orderedTargets.Count; i++) { BrushBase thisBrush = orderedTargets[i]; int siblingIndex = thisBrush.transform.GetSiblingIndex(); if (siblingIndex > 0) { Undo.SetTransformParent(thisBrush.transform, thisBrush.transform.parent, "Change Order"); siblingIndex--; thisBrush.transform.SetSiblingIndex(siblingIndex); } } // Force all the brushes to recalculate their intersections and get ready for rebuilding for (int i = 0; i < orderedTargets.Count; i++) { if (orderedTargets[i] is PrimitiveBrush) { ((PrimitiveBrush)orderedTargets[i]).RecalculateIntersections(); ((PrimitiveBrush)orderedTargets[i]).BrushCache.SetUnbuilt(); } } } if (GUILayout.Button("Send Later")) { for (int i = 0; i < orderedTargets.Count; i++) { // REVERSED BrushBase thisBrush = orderedTargets[orderedTargets.Count - 1 - i]; int siblingIndex = thisBrush.transform.GetSiblingIndex(); Undo.SetTransformParent(thisBrush.transform, thisBrush.transform.parent, "Change Order"); siblingIndex++; thisBrush.transform.SetSiblingIndex(siblingIndex); } // Force all the brushes to recalculate their intersections and get ready for rebuilding for (int i = 0; i < orderedTargets.Count; i++) { if (orderedTargets[i] is PrimitiveBrush) { ((PrimitiveBrush)orderedTargets[i]).RecalculateIntersections(); ((PrimitiveBrush)orderedTargets[i]).BrushCache.SetUnbuilt(); } } } if (GUILayout.Button("Set As Last")) { for (int i = 0; i < orderedTargets.Count; i++) { BrushBase thisBrush = orderedTargets[i]; Undo.SetTransformParent(thisBrush.transform, thisBrush.transform.parent, "Change Order"); thisBrush.transform.SetAsLastSibling(); } // Force all the brushes to recalculate their intersections and get ready for rebuilding for (int i = 0; i < orderedTargets.Count; i++) { if (orderedTargets[i] is PrimitiveBrush) { ((PrimitiveBrush)orderedTargets[i]).RecalculateIntersections(); ((PrimitiveBrush)orderedTargets[i]).BrushCache.SetUnbuilt(); } } } if (serializedObject.targetObject != null) { serializedObject.ApplyModifiedProperties(); } } }
public sealed override void OnInspectorGUI() { // group editing: if (ShowGroupInspector) { using (new NamedVerticalScope("Group")) { GUILayout.BeginHorizontal(); // find whether we are currently inside of a group: GroupBrush group = null; if (BrushTarget.transform.parent) { group = BrushTarget.transform.parent.GetComponent <GroupBrush>(); } // we are in a group: if (group != null) { if (GUILayout.Button("Select Group")) { // select the group. Selection.objects = new Object[] { BrushTarget.transform.parent.gameObject }; } } if (GUILayout.Button("Create Group")) { // create a group. TransformHelper.GroupSelection(); } GUILayout.EndHorizontal(); } } // custom inspector: DoInspectorGUI(); // generic brush editing: using (new NamedVerticalScope("Order")) { List <BrushBase> orderedTargets = BrushTargets.ToList(); orderedTargets.RemoveAll(item => (item == null)); orderedTargets.Sort((x, y) => x.transform.GetSiblingIndex().CompareTo(y.transform.GetSiblingIndex())); if (GUILayout.Button("Set As First")) { for (int i = 0; i < orderedTargets.Count; i++) { // REVERSED BrushBase thisBrush = orderedTargets[orderedTargets.Count - 1 - i]; Undo.SetTransformParent(thisBrush.transform, thisBrush.transform.parent, "Change Order"); thisBrush.transform.SetAsFirstSibling(); } // Force all the brushes to recalculate their intersections and get ready for rebuilding for (int i = 0; i < orderedTargets.Count; i++) { if (orderedTargets[i] is PrimitiveBrush) { ((PrimitiveBrush)orderedTargets[i]).RecalculateIntersections(); ((PrimitiveBrush)orderedTargets[i]).BrushCache.SetUnbuilt(); } } } if (GUILayout.Button("Send Earlier")) { for (int i = 0; i < orderedTargets.Count; i++) { BrushBase thisBrush = orderedTargets[i]; int siblingIndex = thisBrush.transform.GetSiblingIndex(); if (siblingIndex > 0) { Undo.SetTransformParent(thisBrush.transform, thisBrush.transform.parent, "Change Order"); siblingIndex--; thisBrush.transform.SetSiblingIndex(siblingIndex); } } // Force all the brushes to recalculate their intersections and get ready for rebuilding for (int i = 0; i < orderedTargets.Count; i++) { if (orderedTargets[i] is PrimitiveBrush) { ((PrimitiveBrush)orderedTargets[i]).RecalculateIntersections(); ((PrimitiveBrush)orderedTargets[i]).BrushCache.SetUnbuilt(); } } } if (GUILayout.Button("Send Later")) { for (int i = 0; i < orderedTargets.Count; i++) { // REVERSED BrushBase thisBrush = orderedTargets[orderedTargets.Count - 1 - i]; int siblingIndex = thisBrush.transform.GetSiblingIndex(); Undo.SetTransformParent(thisBrush.transform, thisBrush.transform.parent, "Change Order"); siblingIndex++; thisBrush.transform.SetSiblingIndex(siblingIndex); } // Force all the brushes to recalculate their intersections and get ready for rebuilding for (int i = 0; i < orderedTargets.Count; i++) { if (orderedTargets[i] is PrimitiveBrush) { ((PrimitiveBrush)orderedTargets[i]).RecalculateIntersections(); ((PrimitiveBrush)orderedTargets[i]).BrushCache.SetUnbuilt(); } } } if (GUILayout.Button("Set As Last")) { for (int i = 0; i < orderedTargets.Count; i++) { BrushBase thisBrush = orderedTargets[i]; Undo.SetTransformParent(thisBrush.transform, thisBrush.transform.parent, "Change Order"); thisBrush.transform.SetAsLastSibling(); } // Force all the brushes to recalculate their intersections and get ready for rebuilding for (int i = 0; i < orderedTargets.Count; i++) { if (orderedTargets[i] is PrimitiveBrush) { ((PrimitiveBrush)orderedTargets[i]).RecalculateIntersections(); ((PrimitiveBrush)orderedTargets[i]).BrushCache.SetUnbuilt(); } } } if (serializedObject.targetObject != null) { serializedObject.ApplyModifiedProperties(); } } }