123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469 |
- using UnityEngine;
- using UnityEngine.Assertions;
- using UnityEditor;
- using UnityEditorInternal;
- using UnityEditor.SceneManagement;
- using System;
- using System.IO;
- using System.Linq;
- using System.Collections;
- using System.Collections.Generic;
- #if UNITY_2018_3_OR_NEWER
- using UnityEditor.Experimental.SceneManagement;
- #endif
- namespace VoxelImporter
- {
- public abstract class VoxelBaseExplosionEditor : EditorCommon
- {
- public VoxelBaseExplosion explosionBase { get; protected set; }
- public VoxelBaseExplosionCore explosionCore { get; protected set; }
- #region Textures
- private Texture2D playIcon;
- #endregion
- #region GUIStyle
- protected GUIStyle guiStyleMagentaBold;
- protected GUIStyle guiStyleRedBold;
- protected GUIStyle guiStyleFoldoutBold;
- protected GUIStyle guiStylePlayButton;
- protected GUIStyle guiStylePlayButtonActive;
- #endregion
- #region Prefab
- #if UNITY_2018_3_OR_NEWER
- protected PrefabAssetType prefabType { get { return PrefabUtility.GetPrefabAssetType(explosionBase.gameObject); } }
- protected bool prefabEnable { get { return prefabType == PrefabAssetType.Regular || isPrefabEditMode; } }
- protected bool isPrefab { get { return false; } }
- protected bool isPrefabEditMode { get { return PrefabStageUtility.GetCurrentPrefabStage() != null && PrefabStageUtility.GetCurrentPrefabStage().prefabContentsRoot != null; } }
- #else
- protected PrefabType prefabType { get { return PrefabUtility.GetPrefabType(explosionBase.gameObject); } }
- protected bool prefabEnable { get { var type = prefabType; return type == PrefabType.Prefab || type == PrefabType.PrefabInstance || type == PrefabType.DisconnectedPrefabInstance; } }
- protected bool isPrefab { get { return prefabType == PrefabType.Prefab; } }
- #endif
- #endregion
- protected virtual void OnEnable()
- {
- explosionBase = target as VoxelBaseExplosion;
- if (explosionBase == null) return;
- #region Textures
- playIcon = EditorGUIUtility.Load("icons/animation.play.png") as Texture2D;
- #endregion
- EditorApplication.update -= Update;
- EditorApplication.update += Update;
- }
- protected virtual void OnDisable()
- {
- if (explosionBase == null) return;
- ForceRepaint();
- explosionBase.edit_explosionDraw = false;
- EditorApplication.update -= Update;
- }
- protected virtual void OnEnableInitializeSet()
- {
- #region Auto Generate
- if (explosionBase.edit_autoGenerate && explosionCore.voxelBaseCore.IsVoxelFileExists())
- {
- if (explosionBase.edit_fileRefreshLastTimeTicks != explosionCore.voxelBase.fileRefreshLastTimeTicks)
- {
- explosionCore.Generate();
- }
- }
- #endregion
- }
- protected virtual void GUIStyleReady()
- {
- if (guiStyleMagentaBold == null)
- guiStyleMagentaBold = new GUIStyle(EditorStyles.boldLabel);
- guiStyleMagentaBold.normal.textColor = Color.magenta;
- if (guiStyleRedBold == null)
- guiStyleRedBold = new GUIStyle(EditorStyles.boldLabel);
- guiStyleRedBold.normal.textColor = Color.red;
- if (guiStyleFoldoutBold == null)
- guiStyleFoldoutBold = new GUIStyle(EditorStyles.foldout);
- if (guiStyleFoldoutBold == null)
- guiStyleFoldoutBold = new GUIStyle(EditorStyles.foldout);
- guiStyleFoldoutBold.fontStyle = FontStyle.Bold;
- if (guiStylePlayButton == null)
- guiStylePlayButton = new GUIStyle(GUI.skin.button);
- guiStylePlayButton.padding = new RectOffset();
- if (guiStylePlayButtonActive == null)
- guiStylePlayButtonActive = new GUIStyle(GUI.skin.button);
- guiStylePlayButtonActive.padding = new RectOffset();
- guiStylePlayButtonActive.normal = guiStylePlayButtonActive.active;
- }
- public override void OnInspectorGUI()
- {
- if (explosionBase == null || explosionCore == null)
- {
- DrawDefaultInspector();
- return;
- }
- #if UNITY_2018_3_OR_NEWER
- {
- if (prefabType == PrefabAssetType.Regular && !isPrefabEditMode)
- {
- EditorGUILayout.HelpBox("Prefab can only be edited in Prefab mode.", MessageType.Info);
- EditorGUI.BeginDisabledGroup(true);
- }
- }
- #endif
- GUIStyleReady();
- serializedObject.Update();
- #region Generate
- {
- explosionBase.edit_generateFoldout = EditorGUILayout.Foldout(explosionBase.edit_generateFoldout, "Generate", guiStyleFoldoutBold);
- if (explosionBase.edit_generateFoldout)
- {
- EditorGUILayout.BeginHorizontal(GUI.skin.box);
- EditorGUILayout.BeginVertical();
- {
- #region Settings
- {
- EditorGUILayout.LabelField("Settings", EditorStyles.boldLabel);
- {
- EditorGUI.indentLevel++;
- #region BirthRate
- {
- EditorGUI.BeginChangeCheck();
- var edit_birthRate = EditorGUILayout.Slider("Birth Rate", explosionBase.edit_birthRate, 0f, 1f);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- explosionBase.edit_birthRate = edit_birthRate;
- if (explosionBase.edit_autoGenerate)
- {
- explosionCore.Generate();
- ForceRepaint();
- }
- }
- }
- #endregion
- #region VisibleOnly
- {
- EditorGUI.BeginChangeCheck();
- var edit_visibleOnly = EditorGUILayout.Toggle("Visible Only", explosionBase.edit_visibleOnly);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- explosionBase.edit_visibleOnly = edit_visibleOnly;
- if (explosionBase.edit_autoGenerate)
- {
- explosionCore.Generate();
- ForceRepaint();
- }
- }
- }
- #endregion
- #region Velocity
- {
- {
- var min = explosionBase.edit_velocityMin;
- var max = explosionBase.edit_velocityMax;
- EditorGUI.BeginChangeCheck();
- EditorGUILayout.MinMaxSlider(new GUIContent("Velocity"), ref min, ref max, 0f, 300f);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- explosionBase.edit_velocityMin = min;
- explosionBase.edit_velocityMax = max;
- if (explosionBase.edit_autoGenerate)
- {
- explosionCore.Generate();
- ForceRepaint();
- }
- }
- }
- EditorGUI.indentLevel++;
- {
- EditorGUI.BeginChangeCheck();
- var edit_velocityMin = EditorGUILayout.FloatField("Min", explosionBase.edit_velocityMin);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- edit_velocityMin = Mathf.Clamp(edit_velocityMin, 0f, 300f);
- edit_velocityMin = Mathf.Min(edit_velocityMin, explosionBase.edit_velocityMax);
- explosionBase.edit_velocityMin = edit_velocityMin;
- if (explosionBase.edit_autoGenerate)
- {
- explosionCore.Generate();
- ForceRepaint();
- }
- }
- }
- {
- EditorGUI.BeginChangeCheck();
- var edit_velocityMax = EditorGUILayout.FloatField("Max", explosionBase.edit_velocityMax);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- edit_velocityMax = Mathf.Clamp(edit_velocityMax, 0f, 300f);
- edit_velocityMax = Mathf.Max(edit_velocityMax, explosionBase.edit_velocityMin);
- explosionBase.edit_velocityMax = edit_velocityMax;
- if (explosionBase.edit_autoGenerate)
- {
- explosionCore.Generate();
- ForceRepaint();
- }
- }
- }
- EditorGUI.indentLevel--;
- }
- #endregion
- EditorGUI.indentLevel--;
- }
- }
- #endregion
- Inspector_MeshMaterial();
- EditorGUILayout.Space();
- #region Generate
- {
- EditorGUILayout.BeginHorizontal();
- if (GUILayout.Button("Generate"))
- {
- Undo.RecordObject(explosionBase, "Generate Voxel Explosion");
- explosionCore.Generate();
- ForceRepaint();
- }
- {
- EditorGUI.BeginChangeCheck();
- var edit_autoGenerate = EditorGUILayout.ToggleLeft("Auto", explosionBase.edit_autoGenerate, GUILayout.Width(48f));
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- explosionBase.edit_autoGenerate = edit_autoGenerate;
- if (explosionBase.edit_autoGenerate)
- {
- explosionCore.Generate();
- ForceRepaint();
- }
- }
- }
- EditorGUILayout.EndHorizontal();
- }
- #endregion
- }
- EditorGUILayout.EndVertical();
- EditorGUILayout.EndHorizontal();
- }
- }
- #endregion
- #region Bake
- Inspector_Bake();
- #endregion
- #region Settings
- {
- explosionBase.edit_settingsFoldout = EditorGUILayout.Foldout(explosionBase.edit_settingsFoldout, "Settings", guiStyleFoldoutBold);
- if (explosionBase.edit_settingsFoldout)
- {
- EditorGUILayout.BeginHorizontal(GUI.skin.box);
- EditorGUILayout.BeginVertical();
- {
- #region Auto Set Explosion Center
- {
- EditorGUI.BeginChangeCheck();
- var edit_autoSetExplosionCenter = EditorGUILayout.Toggle("Auto Set Explosion Center", explosionBase.edit_autoSetExplosionCenter);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- explosionBase.edit_autoSetExplosionCenter = edit_autoSetExplosionCenter;
- explosionCore.SetExplosionCenter();
- ForceRepaint();
- }
- }
- #endregion
- #region Explosion Center
- if (!explosionBase.edit_autoSetExplosionCenter)
- {
- EditorGUI.indentLevel++;
- EditorGUI.BeginChangeCheck();
- var explosionCenter = EditorGUILayout.Vector3Field("Explosion Center", explosionBase.explosionCenter);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- explosionBase.explosionCenter = explosionCenter;
- explosionCore.SetExplosionCenter();
- ForceRepaint();
- }
- EditorGUI.indentLevel--;
- }
- #endregion
- #region Explosion Rotate
- {
- EditorGUI.BeginChangeCheck();
- var explosionRotate = EditorGUILayout.Slider("Explosion Rotate", explosionBase.explosionRotate, 0f, 10f);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- explosionBase.explosionRotate = explosionRotate;
- explosionBase.SetExplosionRotate(explosionBase.explosionRotate);
- ForceRepaint();
- }
- }
- #endregion
- }
- EditorGUILayout.EndVertical();
- EditorGUILayout.EndHorizontal();
- }
- }
- #endregion
- #if UNITY_2018_3_OR_NEWER
- {
- if (prefabType == PrefabAssetType.Regular && !isPrefabEditMode)
- {
- EditorGUI.EndDisabledGroup();
- }
- }
- #endif
- #region Preview
- #if UNITY_2018_3_OR_NEWER
- EditorGUI.BeginDisabledGroup(isPrefabEditMode); //Is Graphics.DrawMesh not displayed in Prefab Mode? (at Unity2018.2.0b7)
- #else
- EditorGUI.BeginDisabledGroup(isPrefab);
- #endif
- {
- explosionBase.edit_previewFoldout = EditorGUILayout.Foldout(explosionBase.edit_previewFoldout, "Preview", guiStyleFoldoutBold);
- if (explosionBase.edit_previewFoldout)
- {
- EditorGUI.BeginDisabledGroup(EditorApplication.isPlaying);
- EditorGUILayout.BeginHorizontal(GUI.skin.box);
- EditorGUILayout.BeginVertical();
- {
- EditorGUI.BeginChangeCheck();
- var edit_explosionLifeTime = EditorGUILayout.Slider("Life Time", explosionBase.edit_explosionLifeTime, 0f, 10f);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- explosionBase.edit_explosionLifeTime = edit_explosionLifeTime;
- explosionBase.edit_explosionPlay = false;
- explosionBase.SetExplosionRate(explosionBase.edit_explosionRate);
- ForceRepaint();
- }
- }
- {
- EditorGUILayout.BeginHorizontal();
- {
- EditorGUI.BeginChangeCheck();
- var edit_explosionTime = EditorGUILayout.Slider("Time Line", explosionBase.edit_explosionTime, 0f, explosionBase.edit_explosionLifeTime);
- if (EditorGUI.EndChangeCheck())
- {
- Undo.RecordObject(explosionBase, "Inspector");
- explosionBase.edit_explosionTime = edit_explosionTime;
- explosionBase.edit_explosionPlay = false;
- ForceRepaint();
- }
- }
- {
- if (GUILayout.Button(playIcon, explosionBase.edit_explosionPlay ? guiStylePlayButtonActive : guiStylePlayButton))
- {
- explosionBase.edit_explosionPlay = !explosionBase.edit_explosionPlay;
- }
- }
- EditorGUILayout.EndHorizontal();
- }
- EditorGUILayout.EndVertical();
- EditorGUILayout.EndHorizontal();
- EditorGUI.EndDisabledGroup();
- }
- if (!EditorApplication.isPlaying)
- {
- explosionBase.SetExplosionRate(explosionBase.edit_explosionRate);
- }
- }
- EditorGUI.EndDisabledGroup();
- #endregion
- serializedObject.ApplyModifiedProperties();
- }
- protected virtual void Inspector_MeshMaterial() { }
- protected virtual void Inspector_Bake() { }
- protected virtual void OnSceneGUI()
- {
- if (explosionBase == null || explosionCore == null) return;
- #region Play
- if (explosionBase.edit_explosionPlay)
- {
- if (explosionBase.edit_explosionTime < explosionBase.edit_explosionLifeTime)
- {
- explosionBase.edit_explosionTime += Time.fixedDeltaTime;
- explosionBase.edit_explosionTime = Mathf.Min(explosionBase.edit_explosionTime, explosionBase.edit_explosionLifeTime);
- }
- else
- {
- explosionBase.edit_explosionTime = 0f;
- explosionBase.edit_explosionPlay = false;
- explosionBase.edit_explosionDraw = false;
- }
- }
- #endregion
- #region Draw
- if (explosionBase.edit_explosionPlay || explosionBase.edit_explosionDraw)
- {
- explosionCore.SetExplosionCenter();
- explosionBase.SetExplosionRate(explosionBase.edit_explosionRate);
- explosionBase.DrawMesh();
- }
- #endregion
- }
- private void Update()
- {
- if (explosionBase == null || explosionCore == null) return;
- #region Auto Generate
- if (explosionBase.edit_autoGenerate && explosionCore.voxelBaseCore.IsVoxelFileExists())
- {
- if (explosionBase.edit_fileRefreshLastTimeTicks != explosionCore.voxelBase.fileRefreshLastTimeTicks)
- {
- explosionCore.Generate();
- }
- }
- #endregion
- #region Draw
- if (explosionBase.edit_explosionPlay)
- {
- Repaint();
- }
- if (explosionBase.edit_explosionPlay || explosionBase.edit_explosionDraw)
- {
- ForceRepaint();
- }
- #endregion
- }
- protected void ForceRepaint()
- {
- if (explosionBase == null) return;
- explosionBase.enabled = !explosionBase.enabled;
- explosionBase.enabled = !explosionBase.enabled;
- explosionBase.edit_explosionDraw = true;
- }
- }
- }
|