123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- #if UNITY_EDITOR
- using UnityEngine;
- using System.Collections.Generic;
- namespace O3DWB
- {
- public static class ObjectSelectionActions
- {
- #region Public Static Functions
- public static void AlignSelectionToAxis(Axis axis)
- {
- int axisIndex = (int)axis;
- List<GameObject> allSelectedObjects = ObjectSelection.Get().GetAllSelectedGameObjects();
- List<GameObject> selectedParents = GameObjectExtensions.GetParents(allSelectedObjects);
- if (selectedParents.Count == 0) return;
- float average = 0.0f;
- foreach(var parent in selectedParents)
- {
- average += parent.transform.position[axisIndex];
- }
- average /= selectedParents.Count;
- GameObjectExtensions.RecordObjectTransformsForUndo(selectedParents);
- foreach (var parent in selectedParents)
- {
- Transform parentTransform = parent.transform;
- Vector3 alignedPosition = parentTransform.position;
- alignedPosition[axisIndex] = average;
- parentTransform.position = alignedPosition;
- }
- }
- public static void DuplicateSelection()
- {
- if (ObjectSelection.Get().NumberOfSelectedObjects == 0) return;
- ObjectSelection objectSelection = ObjectSelection.Get();
- List<GameObject> allSelectedObjects = objectSelection.GetAllSelectedGameObjects();
- List<GameObject> selectedParents = GameObjectExtensions.GetParents(allSelectedObjects);
- var clonedObjects = new List<GameObject>();
- var clonedParents = new List<GameObject>();
- foreach(GameObject parent in selectedParents)
- {
- GameObject prefab = parent.GetSourcePrefab();
- Transform parentTransform = parent.transform;
- if(prefab == null)
- {
- GameObject clonedParent = parent.CloneAsWorkingObject(parentTransform.parent);
- //clonedParent.transform.parent = parent.transform.parent;
- clonedObjects.AddRange(clonedParent.GetAllChildrenIncludingSelf());
- Octave3DScene.Get().RegisterObjectHierarchy(clonedParent);
- clonedParents.Add(clonedParent);
- }
- else
- {
- GameObject clonedParent = ObjectInstantiation.InstantiateObjectHierarchyFromPrefab(prefab, parentTransform.position, parentTransform.rotation, parentTransform.lossyScale);
- clonedObjects.AddRange(clonedParent.GetAllChildrenIncludingSelf());
- Octave3DScene.Get().RegisterObjectHierarchy(clonedParent);
- clonedParents.Add(clonedParent);
- }
- }
- if(clonedObjects.Count != 0)
- {
- objectSelection.Clear();
- objectSelection.AddGameObjectCollectionToSelection(clonedObjects);
- objectSelection.ObjectSelectionGizmos.OnObjectSelectionUpdated();
- }
- if(clonedParents.Count != 0)
- {
- ObjectHierarchyRootsWerePlacedInSceneMessage.SendToInterestedListeners(clonedParents, ObjectHierarchyRootsWerePlacedInSceneMessage.PlacementType.Selection);
- }
- SceneViewCamera.Instance.SetObjectVisibilityDirty();
- }
- public static void InvertSelection()
- {
- List<GameObject> allWorkingObjects = Octave3DWorldBuilder.ActiveInstance.GetAllWorkingObjects();
- List<GameObject> objectsToSelect = new List<GameObject>();
- ObjectSelection objectSelection = ObjectSelection.Get();
- foreach(var gameObject in allWorkingObjects)
- {
- if (!objectSelection.IsGameObjectSelected(gameObject)) objectsToSelect.Add(gameObject);
- }
- objectSelection.Clear();
- objectSelection.AddGameObjectCollectionToSelection(objectsToSelect);
- objectSelection.ObjectSelectionGizmos.OnObjectSelectionUpdated();
- }
- public static List<GameObject> ReplaceSelectedObjectsPrefabOnMouseClick()
- {
- MouseCursorRayHit cursorRayHit = ObjectSelection.Get().GetObjectPickedByCursor();
- if (cursorRayHit.WasAnObjectHit && !ObjectSelection.Get().IsGameObjectSelected(cursorRayHit.ClosestObjectRayHit.HitObject))
- {
- GameObject hitObject = cursorRayHit.ClosestObjectRayHit.HitObject;
- hitObject = Octave3DWorldBuilder.ActiveInstance.GetRoot(hitObject);
- if (hitObject == null) return new List<GameObject>();
- GameObject newPrefabForSelectedObjects = hitObject.GetSourcePrefab();
- if (newPrefabForSelectedObjects == null)
- {
- List<GameObject> allSelectedObjects = ObjectSelection.Get().GetAllSelectedGameObjects();
- ObjectSelection.Get().RemoveGameObjectCollectionFromSelection(allSelectedObjects);
- List<GameObject> selectedRoots = Octave3DWorldBuilder.ActiveInstance.GetRoots(allSelectedObjects);
- var newObjects = new List<GameObject>();
- foreach(var root in selectedRoots)
- {
- Transform rootTransform = root.transform;
- GameObject newObject = GameObjectExtensions.CloneAsWorkingObject(hitObject, hitObject.transform.parent, true);
- if(newObject != null)
- {
- Transform objectTransform = newObject.transform;
- objectTransform.position = rootTransform.position;
- objectTransform.rotation = rootTransform.rotation;
- objectTransform.SetWorldScale(rootTransform.lossyScale);
- UndoEx.DestroyObjectImmediate(root);
- newObjects.Add(newObject);
- }
- }
- return newObjects;
- }
- else
- {
- List<GameObject> allSelectedObjects = ObjectSelection.Get().GetAllSelectedGameObjects();
- ObjectSelection.Get().RemoveGameObjectCollectionFromSelection(allSelectedObjects);
- List<GameObject> newObjects = ObjectActions.ReplaceGameObjectHierarchyCollectionPrefab(allSelectedObjects, newPrefabForSelectedObjects);
- newObjects.RemoveAll(item => item == null);
- return newObjects;
- }
- }
- return new List<GameObject>();
- }
- public static List<GameObject> ReplaceSelectedObjectsWithPrefab(GameObject prefab)
- {
- List<GameObject> allSelectedObjects = ObjectSelection.Get().GetAllSelectedGameObjects();
- ObjectSelection.Get().RemoveGameObjectCollectionFromSelection(allSelectedObjects);
- List<GameObject> newObjects = ObjectActions.ReplaceGameObjectHierarchyCollectionPrefab(allSelectedObjects, prefab);
- newObjects.RemoveAll(item => item == null);
- return newObjects;
- }
- public static void SelectAllObjectsWithSamePrefabAsCurrentSelection()
- {
- ObjectSelection objectSelection = ObjectSelection.Get();
- List<GameObject> allSelectedObjects = objectSelection.GetAllSelectedGameObjects();
- Dictionary<GameObject, GameObject> prefabToObjectMappings = ObjectQueries.GetPrefabToObjectConnectionMappings(allSelectedObjects);
- List<GameObject> workingObjects = Octave3DWorldBuilder.ActiveInstance.GetAllWorkingObjects();
- foreach(GameObject gameObject in workingObjects)
- {
- GameObject sourcePrefab = gameObject.GetSourcePrefab();
- if(sourcePrefab != null)
- {
- if (prefabToObjectMappings.ContainsKey(sourcePrefab)) objectSelection.AddGameObjectToSelection(gameObject);
- }
- }
- }
- public static void SelectAllObjectsWithSamePrefabAsObject(GameObject gameObject)
- {
- GameObject root = Octave3DWorldBuilder.ActiveInstance.GetRoot(gameObject);
- if (root == null) return;
- GameObject sourcePrefab = root.GetSourcePrefab();
- if (sourcePrefab == null) return;
- ObjectSelection objectSelection = ObjectSelection.Get();
- List<GameObject> workingObjects = Octave3DWorldBuilder.ActiveInstance.GetAllWorkingObjects();
- foreach (GameObject workingObject in workingObjects)
- {
- GameObject workingObjectRoot = Octave3DWorldBuilder.ActiveInstance.GetRoot(workingObject);
- if (workingObjectRoot == null) continue;
- GameObject workingObjectSourcePrefab = workingObjectRoot.GetSourcePrefab();
- if (workingObjectSourcePrefab != null &&
- workingObjectSourcePrefab == sourcePrefab)
- {
- objectSelection.AddGameObjectCollectionToSelection(workingObjectRoot.GetAllChildrenIncludingSelf());
- }
- }
- }
- public static void AssignSelectedObjectsToLayer(int objectLayer)
- {
- List<GameObject> allSelectedGameObjects = ObjectSelection.Get().GetAllSelectedGameObjects();
- ObjectLayerDatabase.Get().AssignObjectsToLayer(allSelectedGameObjects, objectLayer);
- }
- public static void SelectAllObjectsInActiveLayer()
- {
- SelectAllObjectsInLayer(ObjectLayerDatabase.Get().ActiveLayer);
- }
- public static void SelectAllObjectsInAllLayers()
- {
- ObjectSelection objectSelection = ObjectSelection.Get();
- objectSelection.Clear();
- List<int> allLayers = ObjectLayerDatabase.Get().GetAllObjectLayers();
- foreach (int objectLayer in allLayers)
- {
- objectSelection.AddGameObjectCollectionToSelection(ObjectLayerDatabase.Get().GetAllGameObjectsInLayer(objectLayer));
- }
- ObjectSelection.Get().ObjectSelectionGizmos.OnObjectSelectionUpdated();
- }
- public static void SelectAllObjectsInLayer(int objectLayer)
- {
- List<GameObject> allObjectsInLayer = ObjectLayerDatabase.Get().GetAllGameObjectsInLayer(objectLayer);
- ObjectSelection objectSelection = ObjectSelection.Get();
- objectSelection.Clear();
- objectSelection.AddGameObjectCollectionToSelection(allObjectsInLayer);
- ObjectSelection.Get().ObjectSelectionGizmos.OnObjectSelectionUpdated();
- }
- public static void DeselectAllObjectsInActiveLayer()
- {
- DeselectAllObjectsInLayer(ObjectLayerDatabase.Get().ActiveLayer);
- }
- public static void DeselectAllObjectsInAllLayers()
- {
- List<int> allLayers = ObjectLayerDatabase.Get().GetAllObjectLayers();
- foreach (int objectLayer in allLayers)
- {
- DeselectAllObjectsInLayer(objectLayer);
- }
- }
- public static void AppendAllObjectsInActiveLayerToSelection()
- {
- AppendAllObjectsInLayerToSelection(ObjectLayerDatabase.Get().ActiveLayer);
- }
- public static void AppendAllObjectsInLayerToSelection(int objectLayer)
- {
- List<GameObject> allObjectsInLayer = ObjectLayerDatabase.Get().GetAllGameObjectsInLayer(objectLayer);
- ObjectSelection objectSelection = ObjectSelection.Get();
- objectSelection.AddGameObjectCollectionToSelection(allObjectsInLayer);
- ObjectSelection.Get().ObjectSelectionGizmos.OnObjectSelectionUpdated();
- }
- public static void DeselectAllObjectsInLayer(int objectLayer)
- {
- List<GameObject> allObjectsInLayer = ObjectLayerDatabase.Get().GetAllGameObjectsInLayer(objectLayer);
- ObjectSelection.Get().RemoveGameObjectCollectionFromSelection(allObjectsInLayer);
- ObjectSelection.Get().ObjectSelectionGizmos.OnObjectSelectionUpdated();
- }
- #endregion
- }
- }
- #endif
|