using UnityEditor; using UnityEditor.UI; using UnityEngine; using DesamplingRate = Assets.Scripts.UI.UIEffect.UIEffectCapturedImage.DesamplingRate; namespace Assets.Scripts.UI.UIEffect.Editors { /// /// UIEffectCapturedImage editor. /// [CustomEditor(typeof(UIEffectCapturedImage))] [CanEditMultipleObjects] public class UIEffectCapturedImageEditor : RawImageEditor { //################################ // Constant or Static Members. //################################ public enum QualityMode : int { Fast = (DesamplingRate.x2 << 0) + (DesamplingRate.x2 << 4) + (FilterMode.Bilinear << 8) + (2 << 10), Medium = (DesamplingRate.x1 << 0) + (DesamplingRate.x1 << 4) + (FilterMode.Bilinear << 8) + (3 << 10), Detail = (DesamplingRate.None << 0) + (DesamplingRate.x1 << 4) + (FilterMode.Bilinear << 8) + (5 << 10), Custom = -1, } //################################ // Public/Protected Members. //################################ /// /// This function is called when the object becomes enabled and active. /// protected override void OnEnable() { base.OnEnable(); _spTexture = serializedObject.FindProperty("m_Texture"); _spColor = serializedObject.FindProperty("m_Color"); _spRaycastTarget = serializedObject.FindProperty("m_RaycastTarget"); _spDesamplingRate = serializedObject.FindProperty("m_DesamplingRate"); _spReductionRate = serializedObject.FindProperty("m_ReductionRate"); _spFilterMode = serializedObject.FindProperty("m_FilterMode"); _spIterations = serializedObject.FindProperty("m_BlurIterations"); _spKeepSizeToRootCanvas = serializedObject.FindProperty("m_FitToScreen"); _spBlurMode = serializedObject.FindProperty("m_BlurMode"); _spCaptureOnEnable = serializedObject.FindProperty("m_CaptureOnEnable"); _customAdvancedOption = (qualityMode == QualityMode.Custom); } /// /// Implement this function to make a custom inspector. /// public override void OnInspectorGUI() { var graphic = (target as UIEffectCapturedImage); serializedObject.Update(); //================ // Basic properties. //================ EditorGUILayout.PropertyField(_spTexture); EditorGUILayout.PropertyField(_spColor); EditorGUILayout.PropertyField(_spRaycastTarget); //================ // Capture effect. //================ GUILayout.Space(10); EditorGUILayout.LabelField("Capture Effect", EditorStyles.boldLabel); UIEffectEditor.DrawEffectProperties(serializedObject, "m_EffectColor"); //================ // Advanced option. //================ GUILayout.Space(10); EditorGUILayout.LabelField("Advanced Option", EditorStyles.boldLabel); EditorGUILayout.PropertyField(_spCaptureOnEnable);// CaptureOnEnable. EditorGUILayout.PropertyField(_spKeepSizeToRootCanvas);// Keep Graphic Size To RootCanvas. EditorGUI.BeginChangeCheck(); QualityMode quality = qualityMode; quality = (QualityMode)EditorGUILayout.EnumPopup("Quality Mode", quality); if (EditorGUI.EndChangeCheck()) { _customAdvancedOption = (quality == QualityMode.Custom); qualityMode = quality; } // When qualityMode is `Custom`, show advanced option. if (_customAdvancedOption) { if (_spBlurMode.intValue != 0) { EditorGUILayout.PropertyField(_spIterations);// Iterations. } DrawDesamplingRate(_spReductionRate);// Reduction rate. EditorGUILayout.Space(); EditorGUILayout.LabelField("Result Texture Setting", EditorStyles.boldLabel); EditorGUILayout.PropertyField(_spFilterMode);// Filter Mode. DrawDesamplingRate(_spDesamplingRate);// Desampling rate. } serializedObject.ApplyModifiedProperties(); // Debug. using (new EditorGUILayout.HorizontalScope(EditorStyles.helpBox)) { GUILayout.Label("Debug"); if (GUILayout.Button("Capture", "ButtonLeft")) { graphic.Release(); EditorApplication.delayCall += graphic.Capture; } EditorGUI.BeginDisabledGroup(!(target as UIEffectCapturedImage).capturedTexture); if (GUILayout.Button("Release", "ButtonRight")) { graphic.Release(); } EditorGUI.EndDisabledGroup(); } } //################################ // Private Members. //################################ const int Bits4 = (1 << 4) - 1; const int Bits2 = (1 << 2) - 1; bool _customAdvancedOption = false; SerializedProperty _spTexture; SerializedProperty _spColor; SerializedProperty _spRaycastTarget; SerializedProperty _spDesamplingRate; SerializedProperty _spReductionRate; SerializedProperty _spFilterMode; SerializedProperty _spBlurMode; SerializedProperty _spIterations; SerializedProperty _spKeepSizeToRootCanvas; SerializedProperty _spCaptureOnEnable; QualityMode qualityMode { get { if (_customAdvancedOption) return QualityMode.Custom; int qualityValue = (_spDesamplingRate.intValue << 0) + (_spReductionRate.intValue << 4) + (_spFilterMode.intValue << 8) + (_spIterations.intValue << 10); return System.Enum.IsDefined(typeof(QualityMode), qualityValue) ? (QualityMode)qualityValue : QualityMode.Custom; } set { if (value != QualityMode.Custom) { int qualityValue = (int)value; _spDesamplingRate.intValue = (qualityValue >> 0) & Bits4; _spReductionRate.intValue = (qualityValue >> 4) & Bits4; _spFilterMode.intValue = (qualityValue >> 8) & Bits2; _spIterations.intValue = (qualityValue >> 10) & Bits4; } } } /// /// Draws the desampling rate. /// void DrawDesamplingRate(SerializedProperty sp) { using (new EditorGUILayout.HorizontalScope()) { EditorGUILayout.PropertyField(sp); int w, h; (target as UIEffectCapturedImage).GetDesamplingSize((UIEffectCapturedImage.DesamplingRate)sp.intValue, out w, out h); GUILayout.Label(string.Format("{0}x{1}", w, h), EditorStyles.miniLabel); } } } }