123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622 |
- #if UNITY_EDITOR
- using UnityEngine;
- using UnityEditor;
- using System;
- using System.Collections.Generic;
- namespace O3DWB
- {
- [ExecuteInEditMode]
- public class Octave3DWorldBuilder : MonoBehaviour
- {
- #region Private Variables
- private static Octave3DWorldBuilder _lastActiveInstance;
- private ObjectPlacementSceneViewEventHandler _objectPlacementSceneViewHandler = new ObjectPlacementSceneViewEventHandler();
- private ObjectSelectionSceneViewEventHandler _objectSelectionSceneViewHandler = new ObjectSelectionSceneViewEventHandler();
- private ObjectEraserSceneViewEventHandler _objectEraseSceneViewHandler = new ObjectEraserSceneViewEventHandler();
- [SerializeField]
- private Transform _transform;
-
- [SerializeField]
- private bool _showGUIHints = true;
- [SerializeField]
- private Octave3DScene _octave3DScene = new Octave3DScene();
- private SceneRenderer _sceneRenderer = new SceneRenderer();
- private ToolSupervisor _toolSupervisor = new ToolSupervisor();
- private ToolResources _toolResources = new ToolResources();
- [SerializeField]
- private PrefabPreviewGenerator _prefabPreviewGenerator = new PrefabPreviewGenerator();
-
- private Octave3DConfigSaveLoadSettings _configSaveSettings;
- private Octave3DConfigSaveLoadSettings _configLoadSettings;
- [SerializeField]
- private EditorWindowPool _editorWindowPool;
- [SerializeField]
- private PrefabCategoryDatabase _prefabCategoryDatabase;
- [SerializeField]
- private ObjectLayerDatabase _objectLayerDatabase;
- [SerializeField]
- private PrefabTagDatabase _prefabTagDatabase;
- [SerializeField]
- private ObjectPlacementPathHeightPatternDatabase _objectPlacementPathHeightPatternDatabase;
- [SerializeField]
- private ObjectPlacementPathTileConnectionConfigurationDatabase _objectPlacementPathTileConnectionConfigurationDatabase;
- [SerializeField]
- private DecorPaintObjectPlacementBrushDatabase _decorPaintObjectPlacementBrushDatabase;
- [SerializeField]
- private ObjectGroupDatabase _placementObjectGroupDatabase;
- [SerializeField]
- private ObjectPlacement _objectPlacement;
- [SerializeField]
- private ObjectSnapping _objectSnapping;
- [SerializeField]
- private ObjectEraser _objectEraser;
- [SerializeField]
- private ObjectSelection _objectSelection;
- [SerializeField]
- private PrefabsToCategoryDropEventHandler _prefabsToCategoryDropEventHandler = new PrefabsToCategoryDropEventHandler();
- [SerializeField]
- private PrefabsToPathTileConectionDropEventHandler _prefabsToPathTileConnectionDropEventHandler = new PrefabsToPathTileConectionDropEventHandler();
- [SerializeField]
- private PrefabsToDecorPaintBrushEventHandler _prefabsToDecorPaintBrushEventHandler = new PrefabsToDecorPaintBrushEventHandler();
- [SerializeField]
- private FolderToPrefabCreationFolderField _folderToPrefabCreationFolderField = new FolderToPrefabCreationFolderField();
- [SerializeField]
- private Inspector _inspector;
- [SerializeField]
- private MeshCombineSettings _meshCombineSettings;
- [SerializeField]
- private ShaderPool _shaderPool = new ShaderPool();
- [SerializeField]
- private MaterialPool _materialPool = new MaterialPool();
- #endregion
- #region Public Properties
- public PrefabPreviewGenerator PrefabPreviewGenerator { get { return _prefabPreviewGenerator; } }
- public ShaderPool ShaderPool { get { return _shaderPool; } }
- public MaterialPool MaterialPool { get { return _materialPool; } }
- public EditorWindowPool EditorWindowPool
- {
- get
- {
- if (_editorWindowPool == null) CreateEditorWindowPool();
- return _editorWindowPool;
- }
- }
- public bool ShowGUIHints { get { return _showGUIHints; } set { _showGUIHints = value; } }
- public Octave3DScene Octave3DScene { get { return _octave3DScene; } }
- public Octave3DConfigSaveLoadSettings ConfigSaveSettings
- {
- get
- {
- if (_configSaveSettings == null) _configSaveSettings = Octave3DWorldBuilder.ActiveInstance.CreateScriptableObject<Octave3DConfigSaveLoadSettings>();
- return _configSaveSettings;
- }
- }
- public Octave3DConfigSaveLoadSettings ConfigLoadSettings
- {
- get
- {
- if (_configLoadSettings == null) _configLoadSettings = Octave3DWorldBuilder.ActiveInstance.CreateScriptableObject<Octave3DConfigSaveLoadSettings>();
- return _configLoadSettings;
- }
- }
- public Octave3DConfigSaveWindow ConfigSaveWindow { get { return EditorWindowPool.Octave3DConfigSaveWindow; } }
- public Octave3DConfigLoadWindow ConfigLoadWindow { get { return EditorWindowPool.Octave3DConfigLoadWindow; } }
- public SceneRenderer SceneRenderer { get { return _sceneRenderer; } }
- public ToolSupervisor ToolSupervisor { get { return _toolSupervisor; } }
- public ToolResources ToolResources { get { return _toolResources; } }
- public PrefabCategoryDatabase PrefabCategoryDatabase
- {
- get
- {
- if (_prefabCategoryDatabase == null) _prefabCategoryDatabase = CreateScriptableObject<PrefabCategoryDatabase>();
- return _prefabCategoryDatabase;
- }
- }
- public ObjectLayerDatabase ObjectLayerDatabase
- {
- get
- {
- if (_objectLayerDatabase == null) _objectLayerDatabase = CreateScriptableObject<ObjectLayerDatabase>();
- return _objectLayerDatabase;
- }
- }
- public PrefabTagDatabase PrefabTagDatabase
- {
- get
- {
- if (_prefabTagDatabase == null) _prefabTagDatabase = CreateScriptableObject<PrefabTagDatabase>();
- return _prefabTagDatabase;
- }
- }
- public ObjectPlacementPathHeightPatternDatabase ObjectPlacementPathHeightPatternDatabase
- {
- get
- {
- if (_objectPlacementPathHeightPatternDatabase == null) _objectPlacementPathHeightPatternDatabase = CreateScriptableObject<ObjectPlacementPathHeightPatternDatabase>();
- return _objectPlacementPathHeightPatternDatabase;
- }
- }
- public ObjectPlacementPathTileConnectionConfigurationDatabase ObjectPlacementPathTileConnectionConfigurationDatabase
- {
- get
- {
- if (_objectPlacementPathTileConnectionConfigurationDatabase == null) _objectPlacementPathTileConnectionConfigurationDatabase = CreateScriptableObject<ObjectPlacementPathTileConnectionConfigurationDatabase>();
- return _objectPlacementPathTileConnectionConfigurationDatabase;
- }
- }
- public DecorPaintObjectPlacementBrushDatabase DecorPaintObjectPlacementBrushDatabase
- {
- get
- {
- if (_decorPaintObjectPlacementBrushDatabase == null) _decorPaintObjectPlacementBrushDatabase = CreateScriptableObject<DecorPaintObjectPlacementBrushDatabase>();
- return _decorPaintObjectPlacementBrushDatabase;
- }
- }
- public ObjectGroupDatabase PlacementObjectGroupDatabase
- {
- get
- {
- if (_placementObjectGroupDatabase == null) _placementObjectGroupDatabase = CreateScriptableObject<ObjectGroupDatabase>();
- return _placementObjectGroupDatabase;
- }
- }
- public ObjectPlacement ObjectPlacement
- {
- get
- {
- if (_objectPlacement == null) _objectPlacement = CreateScriptableObject<ObjectPlacement>();
- return _objectPlacement;
- }
- }
- public ObjectSnapping ObjectSnapping
- {
- get
- {
- if (_objectSnapping == null) _objectSnapping = CreateScriptableObject<ObjectSnapping>();
- return _objectSnapping;
- }
- }
- public ObjectEraser ObjectEraser
- {
- get
- {
- if (_objectEraser == null) _objectEraser = CreateScriptableObject<ObjectEraser>();
- return _objectEraser;
- }
- }
- public ObjectSelection ObjectSelection
- {
- get
- {
- if (_objectSelection == null) _objectSelection = CreateScriptableObject<ObjectSelection>();
- return _objectSelection;
- }
- }
- public MeshCombineSettings MeshCombineSettings
- {
- get
- {
- if (_meshCombineSettings == null) _meshCombineSettings = CreateScriptableObject<MeshCombineSettings>();
- return _meshCombineSettings;
- }
- }
- public PrefabsToCategoryDropEventHandler PrefabsToCategoryDropEventHandler { get { return _prefabsToCategoryDropEventHandler; } }
- public PrefabsToPathTileConectionDropEventHandler PrefabsToPathTileConectionDropEventHandler { get { return _prefabsToPathTileConnectionDropEventHandler; } }
- public PrefabsToDecorPaintBrushEventHandler PrefabsToDecorPaintBrushEventHandler { get { return _prefabsToDecorPaintBrushEventHandler; } }
- public FolderToPrefabCreationFolderField FolderToPrefabCreationFolderField { get { return _folderToPrefabCreationFolderField; } }
- public PrefabsToCategoryDropSettingsWindow PrefabsToCategoryDropSettingsWindow { get { return EditorWindowPool.PrefabsToCategoryDropSettingsWindow; } }
- public ObjectPlacementSettingsWindow ObjectPlacementSettingsWindow { get { return EditorWindowPool.ObjectPlacementSettingsWindow; } }
- public PrefabManagementWindow PrefabManagementWindow { get { return EditorWindowPool.PrefabManagementWindow; } }
- public ActivePrefabCategoryView ActivePrefabCategoryView { get { return EditorWindowPool.ActivePrefabCategoryView; } }
- public ActivePrefabView ActivePrefabView { get { return EditorWindowPool.ActivePrefabView; } }
- public PrefabTagsWindow PrefabTagsWindow { get { return EditorWindowPool.PrefabTagsWindow; } }
- public ObjectLayersWindow ObjectLayersWindow { get { return EditorWindowPool.ObjectLayersWindow; } }
- public Inspector Inspector
- {
- get
- {
- if (_inspector == null)
- {
- _inspector = Octave3DWorldBuilder.ActiveInstance.CreateScriptableObject<Inspector>();
- _inspector.Initialize();
- }
- return _inspector;
- }
- }
- #endregion
- #region Public Static Properties
- public static Octave3DWorldBuilder ActiveInstance
- {
- get
- {
- GameObject activeGameObject = Selection.activeGameObject;
- if (activeGameObject == null) return _lastActiveInstance;
- if (_lastActiveInstance != null && activeGameObject == _lastActiveInstance.gameObject) return _lastActiveInstance;
-
- Octave3DWorldBuilder octave3D = activeGameObject.GetComponent<Octave3DWorldBuilder>();
- if (octave3D != null)
- {
- _lastActiveInstance = octave3D;
- return _lastActiveInstance;
- }
- else return _lastActiveInstance;
- }
- }
- public static int NumInstances
- {
- get
- {
- return FindObjectsOfType<Octave3DWorldBuilder>().Length;
- }
- }
- #endregion
- #region Public Methods
- public void RepaintAllEditorWindows()
- {
- EditorWindowPool.RepaintAll();
- }
- public T CreateScriptableObject<T>() where T : ScriptableObject
- {
- return ScriptableObject.CreateInstance<T>();
- }
- public void ShowGUIHint(string hint)
- {
- if(_showGUIHints) EditorGUILayout.HelpBox(hint, UnityEditor.MessageType.Info);
- }
- public List<GameObject> GetSceneObjects()
- {
- return new List<GameObject>(FindObjectsOfType<GameObject>());
- }
- public List<GameObject> GetSceneObjectsExceptPlacementGuide()
- {
- List<GameObject> sceneObjects = GetSceneObjects();
- if (ObjectPlacementGuide.ExistsInScene) sceneObjects.RemoveAll(item => ObjectPlacementGuide.Equals(item) || ObjectPlacementGuide.ContainsChild(item.transform));
- return sceneObjects;
- }
- public List<GameObject> GetImmediateChildrenExcludingPlacementGuide()
- {
- List<GameObject> immediateChildren = gameObject.GetImmediateChildren();
- if (ObjectPlacementGuide.ExistsInScene) immediateChildren.RemoveAll(item => ObjectPlacementGuide.Equals(item) || ObjectPlacementGuide.ContainsChild(item.transform));
- return immediateChildren;
- }
- public List<GameObject> GetAllWorkingObjects()
- {
- List<GameObject> allWorkingObjects = GetSceneObjectsExceptPlacementGuide();
- allWorkingObjects.RemoveAll(item => IsPivotWorkingObject(item));
- return allWorkingObjects;
- }
- public bool IsWorkingObject(GameObject gameObj)
- {
- if (gameObj == null) return false;
- if (ObjectQueries.IsGameObjectPartOfPlacementGuideHierarchy(gameObj)) return false;
- return true;
- }
- public GameObject GetRoot(GameObject workingObject)
- {
- if (!IsWorkingObject(workingObject)) return null;
- Transform workingObjectTransform = workingObject.transform;
- if (workingObjectTransform.parent == null) return workingObject;
- Transform currentTransform = workingObjectTransform;
- while(currentTransform != null)
- {
- if (currentTransform.parent != null && IsPivotWorkingObject(currentTransform.parent.gameObject)) return currentTransform.gameObject;
- currentTransform = currentTransform.parent;
- }
- return workingObjectTransform.root.gameObject;
- }
- public List<GameObject> GetRoots(IEnumerable<GameObject> sceneObjects)
- {
- var roots = new List<GameObject>(50);
- var rootHash = new HashSet<GameObject>();
- foreach (GameObject gameObject in sceneObjects)
- {
- var root = Octave3DWorldBuilder.ActiveInstance.GetRoot(gameObject);
- if (root == null || rootHash.Contains(root)) continue;
- roots.Add(root);
- rootHash.Add(root);
- }
- rootHash.Clear();
- return roots;
- }
- public bool IsPivotWorkingObject(GameObject workingObject)
- {
- List<Type> pivotWorkingObjectTypes = GetPivotWorkingObjectTypes();
- return workingObject.HasComponentsOfAnyType(pivotWorkingObjectTypes) || PlacementObjectGroupDatabase.ContainsObjectGroup(workingObject);
- }
- public List<Type> GetPivotWorkingObjectTypes()
- {
- return new List<Type> { typeof(Octave3DWorldBuilder), typeof(Terrain) };
- }
- public void SelectInSceneView()
- {
- List<UnityEngine.Object> selectedObjects = new List<UnityEngine.Object>();
- selectedObjects.Add(this.gameObject);
- Selection.objects = selectedObjects.ToArray();
- }
- public void OnInspectorEnabled()
- {
- _lastActiveInstance = this;
- }
- #endregion
- #region Private Static Functions
- [MenuItem("Tools/Octave3D/Deselect &D")]
- private static void DeselectObjectGrid3D()
- {
- if (Octave3DWorldBuilder.ActiveInstance != null)
- {
- Octave3DWorldBuilder.ActiveInstance.DeselectInSceneView();
- // Clear states. Otherwise, the 'D' button state will remain set to true.
- KeyboardButtonStates.Instance.ClearStates();
- }
- }
- [MenuItem("Tools/Octave3D/Select &R")]
- private static void SelectObjectGrid3D()
- {
- Octave3DWorldBuilder[] instances = FindObjectsOfType<Octave3DWorldBuilder>();
- if (instances.Length != 0) instances[0].SelectInSceneView();
- }
- [MenuItem("Tools/Octave3D/Focus #&F")]
- private static void FocusGameObject()
- {
- if (Octave3DWorldBuilder.ActiveInstance != null)
- {
- var currentActive = Selection.activeGameObject;
- Selection.activeGameObject = Octave3DWorldBuilder.ActiveInstance.ObjectSelection.GetLastSelectedGameObject();
- if (SceneView.lastActiveSceneView != null) SceneView.lastActiveSceneView.FrameSelected();
- Selection.activeGameObject = currentActive;
- Octave3DWorldBuilder.ActiveInstance.SelectInSceneView();
- }
- }
- [MenuItem("GameObject/Octave3D/Make group", false, 0)]
- private static void MakeGroup()
- {
- Octave3DWorldBuilder octave3D = Octave3DWorldBuilder.ActiveInstance;
- if (octave3D == null)
- {
- Debug.LogWarning("There is no Octave3D object in the scene. Please create an empty game object and attach the Octave3D World Builder script to it.");
- return;
- }
- octave3D.PlacementObjectGroupDatabase.CreateObjectGroup(Selection.activeGameObject);
- }
- [MenuItem("GameObject/Octave3D/Is not group", false, 0)]
- private static void SetNoLoLongerGroup()
- {
- Octave3DWorldBuilder octave3D = Octave3DWorldBuilder.ActiveInstance;
- if (octave3D == null)
- {
- Debug.LogWarning("There is no Octave3D object in the scene. Please create an empty game object and attach the Octave3D World Builder script to it.");
- return;
- }
- octave3D.PlacementObjectGroupDatabase.MakeNoLongerGroup(Selection.activeGameObject);
- }
- #endregion
- #region Private methods
- private void Awake()
- {
- _transform = transform;
- }
- private void Start()
- {
- ToolWasStartedMessage.SendToInterestedListeners();
- }
- private void OnSceneGUI(SceneView sceneView)
- {
- if (Selection.activeTransform == null) return;
- if (Selection.activeTransform.GetComponent<Octave3DWorldBuilder>() == null) return;
- switch(Inspector.ActiveInspectorGUIIdentifier)
- {
- case InspectorGUIIdentifier.ObjectPlacement:
- case InspectorGUIIdentifier.ObjectSnapping:
-
- _objectPlacementSceneViewHandler.HandleSceneViewEvent(Event.current);
- break;
- case InspectorGUIIdentifier.ObjectSelection:
-
- _objectSelectionSceneViewHandler.HandleSceneViewEvent(Event.current);
- break;
- case InspectorGUIIdentifier.ObjectErase:
- _objectEraseSceneViewHandler.HandleSceneViewEvent(Event.current);
- break;
- }
- }
- private void OnEnable()
- {
- UnityEngine.Random.InitState(System.DateTime.Now.Millisecond);
- #if UNITY_2019_1_OR_NEWER
- SceneView.duringSceneGui += OnSceneGUI;
- #else
- SceneView.onSceneGUIDelegate += OnSceneGUI;
- #endif
- EditorApplication.update += EditorUpdate;
- EditorWindowPool.RepaintAll();
- }
- private void Reset()
- {
- _transform = transform;
- DestroyPools();
- _prefabPreviewGenerator.DestroyData();
- }
- private void OnDisable()
- {
- #if UNITY_2019_1_OR_NEWER
- SceneView.duringSceneGui -= OnSceneGUI;
- #else
- SceneView.onSceneGUIDelegate -= OnSceneGUI;
- #endif
- EditorApplication.update -= EditorUpdate;
- }
- private void OnDestroy()
- {
- #if UNITY_2019_1_OR_NEWER
- SceneView.duringSceneGui -= OnSceneGUI;
- #else
- SceneView.onSceneGUIDelegate -= OnSceneGUI;
- #endif
- EditorApplication.update -= EditorUpdate;
- int numInstances = NumInstances;
- if (numInstances == 1)
- {
- MessageListenerDatabase.Instance.Clear();
- ToolResources.DisposeResources();
- }
- if (numInstances != 0) DestroyPools();
- _prefabPreviewGenerator.DestroyData();
- }
- private string GetScriptableObjectAssetFolderName()
- {
- return FileSystem.GetToolFolderName() + "/Scriptable Objects/Octave3D_" + this.GetHashCode();
- }
- private void DestroyPools()
- {
- EditorWindowPool[] editorWindowPools = gameObject.GetComponents<EditorWindowPool>();
- foreach (var comp in editorWindowPools)
- {
- if (comp != null)
- DestroyImmediate(comp);
- }
- }
- private void OnDrawGizmosSelected()
- {
- if(ActiveInstance != null)
- {
- _sceneRenderer.RenderGizmos();
- // _octave3DScene.RenderGizmosDebug();
- }
- }
- private void Update()
- {
- if(!Application.isPlaying)
- {
- if (ActiveInstance != null)
- {
- EnsureTransformDataIsCorrect();
- _octave3DScene.Update();
- }
- }
- }
- private void EnsureTransformDataIsCorrect()
- {
- EnsurePositionIsZero();
- EnsureRotationIsIdentity();
- EnsureScaleIsOne();
- }
- private void EnsurePositionIsZero()
- {
- if (_transform.position != Vector3.zero) _transform.position = Vector3.zero;
- }
- private void EnsureRotationIsIdentity()
- {
- if (_transform.rotation.eulerAngles != Vector3.zero) _transform.rotation = Quaternion.identity;
- }
- private void EnsureScaleIsOne()
- {
- if (_transform.localScale != Vector3.one) _transform.localScale = Vector3.one;
- }
- private void CreateEditorWindowPool()
- {
- _editorWindowPool = gameObject.AddComponent<EditorWindowPool>();
- _editorWindowPool.hideFlags = HideFlags.HideInInspector;
- }
- private void DeselectInSceneView()
- {
- List<UnityEngine.Object> selectedObjects = new List<UnityEngine.Object>(Selection.objects);
- selectedObjects.Remove(Octave3DWorldBuilder.ActiveInstance.gameObject);
- Selection.objects = selectedObjects.ToArray();
- }
- private double _lastCamFocusTime;
- private bool _camWasFocused;
- public void OnCamFocused()
- {
- _camWasFocused = true;
- _lastCamFocusTime = EditorApplication.timeSinceStartup;
- }
- private void EditorUpdate()
- {
- if (ObjectSelection.Get() != null) ObjectSelection.Get().RemoveNullObjects();
- if (_camWasFocused && (EditorApplication.timeSinceStartup - _lastCamFocusTime) > 0.6f)
- {
- _camWasFocused = false;
- _lastCamFocusTime = 0.0f;
- SelectInSceneView();
- }
- }
- #endregion
- }
- }
- #endif
|