// -------------------------------------------------------------------------------------------------------------------- // // Copyright (c) VRMADA, All rights reserved. // // -------------------------------------------------------------------------------------------------------------------- using UltimateXR.Animation; using UltimateXR.Animation.Materials; using UnityEditor; using UnityEngine; namespace UltimateXR.Editor.Animation.Materials { /// /// Custom inspector for . /// [CustomEditor(typeof(UxrAnimatedMaterial))] [CanEditMultipleObjects] public class UxrAnimatedMaterialEditor : UnityEditor.Editor { #region Unity /// /// Caches serialized properties. /// private void OnEnable() { _propertyAnimationMode = serializedObject.FindProperty("_animationMode"); _propertyAnimateSelf = serializedObject.FindProperty("_animateSelf"); _propertyTargetGameObject = serializedObject.FindProperty("_targetGameObject"); _propertyMaterialSlot = serializedObject.FindProperty("_materialSlot"); _propertyMaterialMode = serializedObject.FindProperty("_materialMode"); _propertyRestoreWhenFinished = serializedObject.FindProperty("_restoreWhenFinished"); _propertyParameterType = serializedObject.FindProperty("_parameterType"); _propertyParameterName = serializedObject.FindProperty("_parameterName"); _propertyValueSpeed = serializedObject.FindProperty("_valueSpeed"); _propertyValueSpeedDuration = serializedObject.FindProperty("_valueSpeedDurationSeconds"); _propertyValueStart = serializedObject.FindProperty("_valueStart"); _propertyValueEnd = serializedObject.FindProperty("_valueEnd"); _propertyValueDisabled = serializedObject.FindProperty("_valueDisabled"); _propertyInterpolationSettings = serializedObject.FindProperty("_interpolationSettings"); _propertyValueNoiseTimeStart = serializedObject.FindProperty("_valueNoiseTimeStart"); _propertyValueNoiseDuration = serializedObject.FindProperty("_valueNoiseDuration"); _propertyValueNoiseValueStart = serializedObject.FindProperty("_valueNoiseValueStart"); _propertyValueNoiseValueEnd = serializedObject.FindProperty("_valueNoiseValueEnd"); _propertyValueNoiseValueMin = serializedObject.FindProperty("_valueNoiseValueMin"); _propertyValueNoiseValueMax = serializedObject.FindProperty("_valueNoiseValueMax"); _propertyValueNoiseFrequency = serializedObject.FindProperty("_valueNoiseFrequency"); _propertyValueNoiseOffset = serializedObject.FindProperty("_valueNoiseOffset"); _propertyUseUnscaledTime = serializedObject.FindProperty("_useUnscaledTime"); } /// /// Draws the inspector UI. /// public override void OnInspectorGUI() { serializedObject.Update(); UxrAnimatedMaterial animatedMaterial = (UxrAnimatedMaterial)serializedObject.targetObject; if (animatedMaterial == null) { return; } EditorGUILayout.Space(); if (animatedMaterial.HasFinished == false) { EditorGUILayout.PropertyField(_propertyAnimationMode, ContentAnimationMode); EditorGUILayout.PropertyField(_propertyAnimateSelf, ContentAnimateSelf); if (!_propertyAnimateSelf.boolValue) { EditorGUILayout.PropertyField(_propertyTargetGameObject, ContentTargetGameObject); } } else { EditorGUILayout.LabelField("Curve finished"); } if (_propertyAnimationMode.enumValueIndex == (int)UxrAnimationMode.None) { serializedObject.ApplyModifiedProperties(); return; } EditorGUILayout.PropertyField(_propertyMaterialSlot, ContentMaterialSlot); EditorGUILayout.PropertyField(_propertyMaterialMode, ContentMaterialMode); if (_propertyMaterialMode.enumValueIndex == (int)UxrMaterialMode.InstanceOnly) { EditorGUILayout.PropertyField(_propertyRestoreWhenFinished, ContentRestoreWhenFinished); } EditorGUILayout.PropertyField(_propertyParameterType, ContentParameterType); EditorGUILayout.PropertyField(_propertyParameterName, ContentParameterName); if (_propertyAnimationMode.enumValueIndex == (int)UxrAnimationMode.Speed) { ParameterPropertyField(ContentValueSpeed, _propertyValueSpeed); EditorGUILayout.PropertyField(_propertyValueSpeedDuration, ContentValueSpeedDuration); EditorGUILayout.PropertyField(_propertyUseUnscaledTime, ContentUseUnscaledTime); } else if (_propertyAnimationMode.enumValueIndex == (int)UxrAnimationMode.Interpolate) { ParameterPropertyField(ContentValueStart, _propertyValueStart, true); ParameterPropertyField(ContentValueEnd, _propertyValueEnd, true); ParameterPropertyField(ContentValueDisabled, _propertyValueDisabled, true); EditorGUILayout.PropertyField(_propertyInterpolationSettings, ContentInterpolationSettings, true); } else if (_propertyAnimationMode.enumValueIndex == (int)UxrAnimationMode.Noise) { EditorGUILayout.PropertyField(_propertyValueNoiseTimeStart, ContentValueNoiseTimeStart); EditorGUILayout.PropertyField(_propertyValueNoiseDuration, ContentValueNoiseDuration); ParameterPropertyField(ContentValueNoiseValueStart, _propertyValueNoiseValueStart, true); ParameterPropertyField(ContentValueNoiseValueEnd, _propertyValueNoiseValueEnd, true); ParameterPropertyField(ContentValueNoiseValueMin, _propertyValueNoiseValueMin, true); ParameterPropertyField(ContentValueNoiseValueMax, _propertyValueNoiseValueMax, true); ParameterPropertyField(ContentValueNoiseFrequency, _propertyValueNoiseFrequency); ParameterPropertyField(ContentValueNoiseOffset, _propertyValueNoiseOffset); EditorGUILayout.PropertyField(_propertyUseUnscaledTime, ContentUseUnscaledTime); } EditorGUILayout.Space(); serializedObject.ApplyModifiedProperties(); } #endregion #region Private Methods /// /// Draws an inspector property field depending on the material parameter type. /// /// The label and tooltip to show in the inspector /// The serialized property /// /// When using colors, Whether to force to show the field as a vector4 instead of a color /// picker /// private void ParameterPropertyField(GUIContent guiContent, SerializedProperty property, bool isParameterValue = false) { switch (_propertyParameterType.enumValueIndex) { case (int)UxrMaterialParameterType.Int: property.vector4Value = new Vector4(EditorGUILayout.IntField(guiContent, Mathf.RoundToInt(property.vector4Value.x)), 0, 0, 0); break; case (int)UxrMaterialParameterType.Float: property.vector4Value = new Vector4(EditorGUILayout.FloatField(guiContent, property.vector4Value.x), 0, 0, 0); break; case (int)UxrMaterialParameterType.Vector2: property.vector4Value = EditorGUILayout.Vector2Field(guiContent, new Vector2(property.vector4Value.x, property.vector4Value.y)); break; case (int)UxrMaterialParameterType.Vector3: property.vector4Value = EditorGUILayout.Vector3Field(guiContent, new Vector3(property.vector4Value.x, property.vector4Value.y, property.vector4Value.z)); break; case (int)UxrMaterialParameterType.Vector4: property.vector4Value = EditorGUILayout.Vector4Field(guiContent, property.vector4Value); break; case (int)UxrMaterialParameterType.Color: if (!isParameterValue) { property.vector4Value = EditorGUILayout.Vector4Field(guiContent, property.vector4Value); } else { property.vector4Value = EditorGUILayout.ColorField(guiContent, property.vector4Value); } break; } } #endregion #region Private Types & Data private GUIContent ContentAnimationMode { get; } = new GUIContent("Animation Mode"); private GUIContent ContentAnimateSelf { get; } = new GUIContent("Animate Self"); private GUIContent ContentTargetGameObject { get; } = new GUIContent("Target GameObject"); private GUIContent ContentMaterialSlot { get; } = new GUIContent("Material Slot"); private GUIContent ContentMaterialMode { get; } = new GUIContent("Material Mode"); private GUIContent ContentRestoreWhenFinished { get; } = new GUIContent("Restore When Finished", "Restores the original material when the instance animation finished. Use this for performance since shared materials can save draw calls and render state changes"); private GUIContent ContentParameterType { get; } = new GUIContent("Parameter Type"); private GUIContent ContentParameterName { get; } = new GUIContent("Parameter Name"); private GUIContent ContentValueSpeed { get; } = new GUIContent("Speed"); private GUIContent ContentValueSpeedDuration { get; } = new GUIContent("Duration (seconds)"); private GUIContent ContentValueStart { get; } = new GUIContent("Start Value"); private GUIContent ContentValueEnd { get; } = new GUIContent("End Value"); private GUIContent ContentValueDisabled { get; } = new GUIContent("Value When Disabled"); private GUIContent ContentInterpolationSettings { get; } = new GUIContent("Interpolation Settings"); private GUIContent ContentValueNoiseTimeStart { get; } = new GUIContent("Noise Time Start"); private GUIContent ContentValueNoiseDuration { get; } = new GUIContent("Noise Duration"); private GUIContent ContentValueNoiseValueStart { get; } = new GUIContent("Value Start"); private GUIContent ContentValueNoiseValueEnd { get; } = new GUIContent("Value End"); private GUIContent ContentValueNoiseValueMin { get; } = new GUIContent("Noise Value Min"); private GUIContent ContentValueNoiseValueMax { get; } = new GUIContent("Noise Value Max"); private GUIContent ContentValueNoiseFrequency { get; } = new GUIContent("Noise Frequency"); private GUIContent ContentValueNoiseOffset { get; } = new GUIContent("Noise Offset"); private GUIContent ContentUseUnscaledTime { get; } = new GUIContent("Use Unscaled Time"); private SerializedProperty _propertyAnimationMode; private SerializedProperty _propertyAnimateSelf; private SerializedProperty _propertyTargetGameObject; private SerializedProperty _propertyMaterialSlot; private SerializedProperty _propertyMaterialMode; private SerializedProperty _propertyRestoreWhenFinished; private SerializedProperty _propertyParameterType; private SerializedProperty _propertyParameterName; private SerializedProperty _propertyValueSpeed; private SerializedProperty _propertyValueSpeedDuration; private SerializedProperty _propertyValueStart; private SerializedProperty _propertyValueEnd; private SerializedProperty _propertyValueDisabled; private SerializedProperty _propertyInterpolationSettings; private SerializedProperty _propertyValueNoiseTimeStart; private SerializedProperty _propertyValueNoiseDuration; private SerializedProperty _propertyValueNoiseValueStart; private SerializedProperty _propertyValueNoiseValueEnd; private SerializedProperty _propertyValueNoiseValueMin; private SerializedProperty _propertyValueNoiseValueMax; private SerializedProperty _propertyValueNoiseFrequency; private SerializedProperty _propertyValueNoiseOffset; private SerializedProperty _propertyUseUnscaledTime; #endregion } }