123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
- #if UNITY_EDITOR
- using System;
- using UnityEditor;
- using UnityEngine;
- namespace Animancer.Editor
- {
- /// <summary>[Editor-Only] A custom GUI for <see cref="FadeGroup"/>.</summary>
- /// https://kybernetik.com.au/animancer/api/Animancer.Editor/FadeGroupDrawer
- [CustomGUI(typeof(FadeGroup))]
- public class FadeGroupDrawer : CustomGUI<FadeGroup>
- {
- /************************************************************************************************************************/
- private bool _IsExpanded;
- private AnimationCurve _DisplayCurve;
- /************************************************************************************************************************/
- /// <inheritdoc/>
- public override void DoGUI()
- {
- _IsExpanded = EditorGUILayout.Foldout(_IsExpanded, "", true);
- var area = GUILayoutUtility.GetLastRect();
- InitializeDisplayCurve(ref _DisplayCurve);
- _DisplayCurve = EditorGUI.CurveField(area, TargetName, _DisplayCurve);
- if (_IsExpanded)
- DoDetailsGUI();
- }
- /************************************************************************************************************************/
- /// <summary>The display name of the target.</summary>
- protected virtual string TargetName
- {
- get
- {
- var name = Value.GetType().GetNameCS(false);
- if (!Value.IsValid)
- name += " (Cancelled)";
- return name;
- }
- }
- /************************************************************************************************************************/
- private static readonly Keyframe[] DisplayCurveKeyframes = new Keyframe[16];
- /// <summary>Initializes the `curve` to represent the target's fade values over normalized time.</summary>
- protected virtual void InitializeDisplayCurve(ref AnimationCurve curve)
- {
- curve ??= new();
- try
- {
- var increment = 1f / (DisplayCurveKeyframes.Length - 1);
- for (int i = 0; i < DisplayCurveKeyframes.Length; i++)
- {
- var progress = increment * i;
- var weight = Value.Easing != null
- ? Value.Easing(progress)
- : progress;
- DisplayCurveKeyframes[i] = new(progress, weight);
- }
- }
- catch (Exception exception)
- {
- Debug.LogException(exception);
- Array.Clear(DisplayCurveKeyframes, 0, DisplayCurveKeyframes.Length);
- }
- curve.keys = DisplayCurveKeyframes;
- }
- /************************************************************************************************************************/
- /// <summary>Draws the GUI for the target's fields.</summary>
- protected virtual void DoDetailsGUI()
- {
- EditorGUI.indentLevel++;
- EditorGUI.BeginChangeCheck();
- Value.NormalizedTime = EditorGUILayout.Slider("Normalized Time", Value.NormalizedTime, 0, 1);
- if (EditorGUI.EndChangeCheck())
- {
- Value.NormalizedTime = Mathf.Clamp(Value.NormalizedTime, 0, 0.99f);
- Value.ApplyWeights();
- }
- EditorGUI.BeginChangeCheck();
- var fadeDuration = EditorGUILayout.FloatField("Fade Duration", Value.FadeDuration);
- if (EditorGUI.EndChangeCheck())
- Value.FadeDuration = fadeDuration;
- EditorGUILayout.LabelField(
- Value.TargetWeight > 0 ? "Fade In" : "Fade Out",
- "To " + Value.TargetWeight);
- EditorGUI.indentLevel++;
- DoNodeWeightGUI(Value.FadeIn);
- EditorGUI.indentLevel--;
- var fadeOutCount = Value.FadeOut.Count;
- if (fadeOutCount > 0)
- {
- EditorGUILayout.LabelField("Fade Out", fadeOutCount.ToStringCached());
- EditorGUI.indentLevel++;
- for (int i = 0; i < fadeOutCount; i++)
- DoNodeWeightGUI(Value.FadeOut[i]);
- EditorGUI.indentLevel--;
- }
- EditorGUI.indentLevel--;
- }
- /************************************************************************************************************************/
- /// <summary>Draws the GUI for the given `nodeWeight`.</summary>
- private void DoNodeWeightGUI(NodeWeight nodeWeight)
- {
- EditorGUILayout.LabelField(nodeWeight.Node?.GetPath());
- }
- /************************************************************************************************************************/
- }
- }
- #endif
|