// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2026 Kybernetik // using System.Collections.Generic; namespace Animancer.TransitionLibraries { /// /// An and a dictionary to modify it based on the previous state. /// /// /// Documentation: /// /// Transition Libraries /// /// https://kybernetik.com.au/animancer/api/Animancer.TransitionLibraries/TransitionModifierGroup public class TransitionModifierGroup : ICloneable, ICopyable { /************************************************************************************************************************/ /// The index at which this group was added to its . public readonly int Index; /************************************************************************************************************************/ private ITransition _Transition; /// The target transition of this group. /// Can't be null. public ITransition Transition { get => _Transition; set { AnimancerUtilities.Assert( value != null, $"{nameof(TransitionModifierGroup)}.{nameof(Transition)} can't be null."); _Transition = value; } } /************************************************************************************************************************/ /// /// Custom modifiers to use when playing a /// depending on the of the source state it is coming from. /// /// This is null by default until adds something. public Dictionary FromKeyToModifier; /************************************************************************************************************************/ /// Creates a new . public TransitionModifierGroup( int index, ITransition transition) { Index = index; Transition = transition; } /************************************************************************************************************************/ /// Sets the `modifier` to use when transitioning from `from` to the . public void SetModifier(object from, TransitionDetails modifier) { FromKeyToModifier ??= new(); FromKeyToModifier[from] = modifier; } /// Removes the fade duration modifier set for transitioning from `from` to the . public void ResetModifier(object from) => FromKeyToModifier?.Remove(from); /************************************************************************************************************************/ /// /// Sets the /// to use when transitioning from `from` to the . /// public void SetFadeDuration(object from, float fadeDuration) { FromKeyToModifier ??= new(); if (!FromKeyToModifier.TryGetValue(from, out var modifier)) modifier = TransitionDetails.NaN; modifier.FadeDuration = fadeDuration; FromKeyToModifier[from] = modifier; } /// /// Sets the /// to use when transitioning from `from` to the . /// public void SetNormalizedStartTime(object from, float normalizedStartTime) { FromKeyToModifier ??= new(); if (!FromKeyToModifier.TryGetValue(from, out var modifier)) modifier = TransitionDetails.NaN; modifier.NormalizedStartTime = normalizedStartTime; FromKeyToModifier[from] = modifier; } /************************************************************************************************************************/ /// Returns the fade duration to use when transitioning from `from` to the . public TransitionDetails GetDetails(object from) { if (FromKeyToModifier != null && from != null) { from = AnimancerUtilities.GetRootKey(from); if (FromKeyToModifier.TryGetValue(from, out var details)) { if (float.IsNaN(details.FadeDuration)) details.FadeDuration = Transition.FadeDuration; if (float.IsNaN(details.NormalizedStartTime)) details.NormalizedStartTime = Transition.NormalizedStartTime; return details; } } return new(Transition); } /************************************************************************************************************************/ /// Returns the fade duration to use when transitioning from `from` to the . public float GetFadeDuration(object from) => FromKeyToModifier != null && FromKeyToModifier.TryGetValue(AnimancerUtilities.GetRootKey(from), out var modifier) ? modifier.FadeDuration : Transition.FadeDuration; /************************************************************************************************************************/ /// public TransitionModifierGroup Clone(CloneContext context) { var clone = new TransitionModifierGroup(Index, null); clone.CopyFrom(this); return clone; } /************************************************************************************************************************/ /// public void CopyFrom(TransitionModifierGroup copyFrom, CloneContext context) { Transition = copyFrom.Transition; if (copyFrom.FromKeyToModifier == null) { FromKeyToModifier?.Clear(); } else { FromKeyToModifier ??= new(); foreach (var item in copyFrom.FromKeyToModifier) FromKeyToModifier[item.Key] = item.Value; } } /************************************************************************************************************************/ /// Describes this object. public override string ToString() => $"{nameof(TransitionModifierGroup)}([{Index}] {AnimancerUtilities.ToStringOrNull(Transition)})"; /************************************************************************************************************************/ } }