using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
namespace MoreMountains.Tools
{
///
/// Custom editor for the ShaderController, conditional hiding
///
[CustomEditor(typeof(ShaderController), true)]
[CanEditMultipleObjects]
public class ShaderControllerEditor : Editor
{
protected SerializedProperty _TargetRenderer;
protected SerializedProperty _Curve;
protected SerializedProperty _MinValue;
protected SerializedProperty _MaxValue;
protected SerializedProperty _Duration;
protected SerializedProperty _PingPongPauseDuration;
protected SerializedProperty _Amplitude;
protected SerializedProperty _Frequency;
protected SerializedProperty _Shift;
protected SerializedProperty _RemapNoiseValues;
protected SerializedProperty _RemapNoiseZero;
protected SerializedProperty _RemapNoiseOne;
protected SerializedProperty _OneTimeDuration;
protected SerializedProperty _OneTimeAmplitude;
protected SerializedProperty _OneTimeRemapMin;
protected SerializedProperty _OneTimeRemapMax;
protected SerializedProperty _OneTimeCurve;
protected SerializedProperty _OneTimeButton;
protected SerializedProperty _DisableAfterOneTime;
protected SerializedProperty _DisableGameObjectAfterOneTime;
protected SerializedProperty _DrivenLevel;
protected SerializedProperty _AudioAnalyzer;
protected SerializedProperty _BeatID;
protected SerializedProperty _AudioAnalyzerMultiplier;
protected SerializedProperty _AudioAnalyzerOffset;
protected SerializedProperty _AudioAnalyzerLerp;
protected SerializedProperty _ToDestinationValue;
protected SerializedProperty _ToDestinationDuration;
protected SerializedProperty _ToDestinationCurve;
protected SerializedProperty _ToDestinationButton;
protected SerializedProperty _DisableAfterToDestination;
protected SerializedProperty _InitialValue;
protected SerializedProperty _CurrentValue;
protected SerializedProperty _CurrentValueNormalized;
protected SerializedProperty _InitialColor;
protected SerializedProperty _PropertyID;
protected SerializedProperty _PropertyFound;
protected SerializedProperty _TargetMaterial;
protected SerializedProperty _FromColor;
protected SerializedProperty _ToColor;
public override bool RequiresConstantRepaint()
{
return true;
}
///
/// On enable we grab our properties
///
protected virtual void OnEnable()
{
ShaderController myTarget = (ShaderController)target;
_TargetRenderer = serializedObject.FindProperty("TargetRenderer");
_Curve = serializedObject.FindProperty("Curve");
_MinValue = serializedObject.FindProperty("MinValue");
_MaxValue = serializedObject.FindProperty("MaxValue");
_Duration = serializedObject.FindProperty("Duration");
_PingPongPauseDuration = serializedObject.FindProperty("PingPongPauseDuration");
_Amplitude = serializedObject.FindProperty("Amplitude");
_Frequency = serializedObject.FindProperty("Frequency");
_Shift = serializedObject.FindProperty("Shift");
_RemapNoiseValues = serializedObject.FindProperty("RemapNoiseValues");
_RemapNoiseZero = serializedObject.FindProperty("RemapNoiseZero");
_RemapNoiseOne = serializedObject.FindProperty("RemapNoiseOne");
_OneTimeDuration = serializedObject.FindProperty("OneTimeDuration");
_OneTimeAmplitude = serializedObject.FindProperty("OneTimeAmplitude");
_OneTimeRemapMin = serializedObject.FindProperty("OneTimeRemapMin");
_OneTimeRemapMax = serializedObject.FindProperty("OneTimeRemapMax");
_OneTimeCurve = serializedObject.FindProperty("OneTimeCurve");
_DisableAfterOneTime = serializedObject.FindProperty("DisableAfterOneTime");
_DisableGameObjectAfterOneTime = serializedObject.FindProperty("DisableGameObjectAfterOneTime");
_OneTimeButton = serializedObject.FindProperty("OneTimeButton");
_AudioAnalyzer = serializedObject.FindProperty("AudioAnalyzer");
_BeatID = serializedObject.FindProperty("BeatID");
_AudioAnalyzerMultiplier = serializedObject.FindProperty("AudioAnalyzerMultiplier");
_AudioAnalyzerOffset = serializedObject.FindProperty("AudioAnalyzerOffset");
_AudioAnalyzerLerp = serializedObject.FindProperty("AudioAnalyzerLerp");
_ToDestinationValue = serializedObject.FindProperty("ToDestinationValue");
_ToDestinationDuration = serializedObject.FindProperty("ToDestinationDuration");
_ToDestinationCurve = serializedObject.FindProperty("ToDestinationCurve");
_DisableAfterToDestination = serializedObject.FindProperty("DisableAfterToDestination");
_ToDestinationButton = serializedObject.FindProperty("ToDestinationButton");
_InitialValue = serializedObject.FindProperty("InitialValue");
_CurrentValue = serializedObject.FindProperty("CurrentValue");
_CurrentValueNormalized = serializedObject.FindProperty("CurrentValueNormalized");
_InitialColor = serializedObject.FindProperty("InitialColor");
_PropertyID = serializedObject.FindProperty("PropertyID");
_PropertyFound = serializedObject.FindProperty("PropertyFound");
_TargetMaterial = serializedObject.FindProperty("TargetMaterial");
_DrivenLevel = serializedObject.FindProperty("DrivenLevel");
_FromColor = serializedObject.FindProperty("FromColor");
_ToColor = serializedObject.FindProperty("ToColor");
}
///
/// Draws a conditional inspector
///
public override void OnInspectorGUI()
{
serializedObject.Update();
Undo.RecordObject(target, "Modified ShaderController");
ShaderController myTarget = (ShaderController)target;
Editor.DrawPropertiesExcluding(serializedObject, new string[] { "m_Script", "Curve", "MinValue", "MaxValue", "Duration", "PingPongPauseDuration",
"Amplitude", "Frequency", "Shift", "OneTimeDuration", "OneTimeAmplitude", "OneTimeRemapMin",
"OneTimeRemapMax", "OneTimeCurve", "DisableAfterOneTime", "DisableGameObjectAfterOneTime", "OneTimeButton", "AudioAnalyzer",
"BeatID", "AudioAnalyzerMultiplier", "AudioAnalyzerOffset",
"AudioAnalyzerLerp", "ToDestinationValue", "RemapNoiseValues","RemapNoiseZero","RemapNoiseOne",
"ToDestinationDuration", "ToDestinationCurve", "DisableAfterToDestination", "ToDestinationButton", "DrivenLevel", "FromColor", "ToColor",
"InitialValue","CurrentValue", "CurrentValueNormalized","InitialColor","PropertyID","PropertyFound","TargetMaterial"});
if (myTarget.PropertyType == ShaderController.PropertyTypes.Color)
{
EditorGUILayout.PropertyField(_FromColor);
EditorGUILayout.PropertyField(_ToColor);
}
if (myTarget.ControlMode == ShaderController.ControlModes.PingPong)
{
EditorGUILayout.PropertyField(_Curve);
EditorGUILayout.PropertyField(_MinValue);
EditorGUILayout.PropertyField(_MaxValue);
EditorGUILayout.PropertyField(_Duration);
EditorGUILayout.PropertyField(_PingPongPauseDuration);
}
else if (myTarget.ControlMode == ShaderController.ControlModes.Random)
{
EditorGUILayout.PropertyField(_Amplitude);
EditorGUILayout.PropertyField(_Frequency);
EditorGUILayout.PropertyField(_Shift);
EditorGUILayout.PropertyField(_RemapNoiseValues);
EditorGUILayout.PropertyField(_RemapNoiseZero);
EditorGUILayout.PropertyField(_RemapNoiseOne);
}
else if (myTarget.ControlMode == ShaderController.ControlModes.OneTime)
{
EditorGUILayout.PropertyField(_OneTimeDuration);
EditorGUILayout.PropertyField(_OneTimeAmplitude);
EditorGUILayout.PropertyField(_OneTimeRemapMin);
EditorGUILayout.PropertyField(_OneTimeRemapMax);
EditorGUILayout.PropertyField(_OneTimeCurve);
EditorGUILayout.PropertyField(_DisableAfterOneTime);
EditorGUILayout.PropertyField(_DisableGameObjectAfterOneTime);
EditorGUILayout.PropertyField(_OneTimeButton);
}
else if (myTarget.ControlMode == ShaderController.ControlModes.AudioAnalyzer)
{
EditorGUILayout.PropertyField(_AudioAnalyzer);
EditorGUILayout.PropertyField(_BeatID);
EditorGUILayout.PropertyField(_AudioAnalyzerMultiplier);
EditorGUILayout.PropertyField(_AudioAnalyzerOffset);
EditorGUILayout.PropertyField(_AudioAnalyzerLerp);
}
else if (myTarget.ControlMode == ShaderController.ControlModes.Driven)
{
EditorGUILayout.PropertyField(_DrivenLevel);
}
else if (myTarget.ControlMode == ShaderController.ControlModes.ToDestination)
{
EditorGUILayout.PropertyField(_ToDestinationValue);
EditorGUILayout.PropertyField(_ToDestinationDuration);
EditorGUILayout.PropertyField(_ToDestinationCurve);
EditorGUILayout.PropertyField(_DisableAfterToDestination);
EditorGUILayout.PropertyField(_ToDestinationButton);
}
EditorGUILayout.PropertyField(_InitialValue);
EditorGUILayout.PropertyField(_CurrentValue);
EditorGUILayout.PropertyField(_CurrentValueNormalized);
EditorGUILayout.PropertyField(_InitialColor);
EditorGUILayout.PropertyField(_PropertyID);
EditorGUILayout.PropertyField(_PropertyFound);
EditorGUILayout.PropertyField(_TargetMaterial);
serializedObject.ApplyModifiedProperties();
if (Application.isPlaying)
{
_barRect = EditorGUILayout.GetControlRect();
DrawLevelProgressBar(_barRect, myTarget.CurrentValueNormalized, _mmYellow, _mmRed);
}
}
protected Rect _barRect;
protected Color _mmYellow = new Color(1f, 0.7686275f, 0f);
protected Color _mmRed = MMColors.Orangered;
protected const int _lineHeight = 20;
protected const int _lineMargin = 2;
protected const int _numberOfLines = 1;
protected Color _progressBarBackground = new Color(0, 0, 0, 0.5f);
protected virtual void DrawLevelProgressBar(Rect position, float level, Color frontColor, Color negativeColor)
{
Rect levelLabelRect = new Rect(position.x, position.y + (_lineHeight + _lineMargin) * (_numberOfLines - 1), position.width, _lineHeight);
Rect levelValueRect = new Rect(position.x - 15 + EditorGUIUtility.labelWidth + 4, position.y + (_lineHeight + _lineMargin) * (_numberOfLines - 1), position.width, _lineHeight);
float progressX = position.x - 5 + EditorGUIUtility.labelWidth + 60;
float progressY = position.y + (_lineHeight + _lineMargin) * (_numberOfLines - 1) + 6;
float progressHeight = 10f;
float fullProgressWidth = position.width - EditorGUIUtility.labelWidth - 60 + 5;
bool negative = false;
float displayLevel = level;
if (level < 0f)
{
negative = true;
level = -level;
}
float progressLevel = Mathf.Clamp01(level);
Rect levelProgressBg = new Rect(progressX, progressY, fullProgressWidth, progressHeight);
float progressWidth = MMMaths.Remap(progressLevel, 0f, 1f, 0f, fullProgressWidth);
Rect levelProgressFront = new Rect(progressX, progressY, progressWidth, progressHeight);
EditorGUI.LabelField(levelLabelRect, new GUIContent("Level"));
EditorGUI.LabelField(levelValueRect, new GUIContent(displayLevel.ToString("F4")));
EditorGUI.DrawRect(levelProgressBg, _progressBarBackground);
if (negative)
{
EditorGUI.DrawRect(levelProgressFront, negativeColor);
}
else
{
EditorGUI.DrawRect(levelProgressFront, frontColor);
}
}
}
}