TransitionModifierDefinition.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
  2. using System;
  3. using UnityEngine;
  4. namespace Animancer.TransitionLibraries
  5. {
  6. /// <summary>[<see cref="SerializableAttribute"/>]
  7. /// Details about how to modify a transition when it comes from a specific source.
  8. /// </summary>
  9. /// <remarks>
  10. /// Multiple of these can be used to build a <see cref="TransitionModifierGroup"/> at runtime.
  11. /// <para></para>
  12. /// <strong>Documentation:</strong>
  13. /// <see href="https://kybernetik.com.au/animancer/docs/manual/transitions/libraries">
  14. /// Transition Libraries</see>
  15. /// </remarks>
  16. /// https://kybernetik.com.au/animancer/api/Animancer.TransitionLibraries/TransitionModifierDefinition
  17. [Serializable]
  18. public struct TransitionModifierDefinition :
  19. IEquatable<TransitionModifierDefinition>
  20. {
  21. /************************************************************************************************************************/
  22. [SerializeField]
  23. private int _From;
  24. /// <summary>The index of the source transition in the <see cref="TransitionLibraryDefinition"/>.</summary>
  25. public readonly int FromIndex
  26. => _From;
  27. /************************************************************************************************************************/
  28. [SerializeField]
  29. private int _To;
  30. /// <summary>The index of the destination transition in the <see cref="TransitionLibraryDefinition"/>.</summary>
  31. public readonly int ToIndex
  32. => _To;
  33. /************************************************************************************************************************/
  34. [SerializeField]
  35. private float _Fade;
  36. /// <summary>The fade duration for this override to use.</summary>
  37. public readonly float FadeDuration
  38. => _Fade;
  39. /************************************************************************************************************************/
  40. /// <summary>Creates a new <see cref="TransitionModifierDefinition"/>.</summary>
  41. public TransitionModifierDefinition(
  42. int fromIndex,
  43. int toIndex,
  44. float fadeDuration)
  45. {
  46. _From = fromIndex;
  47. _To = toIndex;
  48. _Fade = fadeDuration;
  49. }
  50. /************************************************************************************************************************/
  51. /// <summary>Creates a copy of this override with the specified <see cref="FadeDuration"/>.</summary>
  52. public readonly TransitionModifierDefinition WithFadeDuration(float fadeDuration)
  53. => new(_From, _To, fadeDuration);
  54. /// <summary>Creates a copy of this override with the specified <see cref="FromIndex"/> and <see cref="ToIndex"/>.</summary>
  55. public readonly TransitionModifierDefinition WithIndices(int fromIndex, int toIndex)
  56. => new(fromIndex, toIndex, _Fade);
  57. /************************************************************************************************************************/
  58. /// <summary>Creates a new string describing this override.</summary>
  59. public override readonly string ToString()
  60. => $"{nameof(TransitionModifierDefinition)}({_From}->{_To}={_Fade})";
  61. /************************************************************************************************************************/
  62. #region Equality
  63. /************************************************************************************************************************/
  64. /// <summary>Are all fields in this object equal to the equivalent in `obj`?</summary>
  65. public override readonly bool Equals(object obj)
  66. => obj is TransitionModifierDefinition value
  67. && Equals(value);
  68. /// <summary>Are all fields in this object equal to the equivalent fields in `other`?</summary>
  69. public readonly bool Equals(TransitionModifierDefinition other)
  70. => _From == other._From
  71. && _To == other._To
  72. && _Fade.IsEqualOrBothNaN(other._Fade);
  73. /// <summary>Are all fields in `a` equal to the equivalent fields in `b`?</summary>
  74. public static bool operator ==(TransitionModifierDefinition a, TransitionModifierDefinition b)
  75. => a.Equals(b);
  76. /// <summary>Are any fields in `a` not equal to the equivalent fields in `b`?</summary>
  77. public static bool operator !=(TransitionModifierDefinition a, TransitionModifierDefinition b)
  78. => !(a == b);
  79. /************************************************************************************************************************/
  80. /// <summary>Returns a hash code based on the values of this object's fields.</summary>
  81. public override readonly int GetHashCode()
  82. => AnimancerUtilities.Hash(-871379578,
  83. _From.SafeGetHashCode(),
  84. _To.SafeGetHashCode(),
  85. _Fade.SafeGetHashCode());
  86. /************************************************************************************************************************/
  87. #endregion
  88. /************************************************************************************************************************/
  89. }
  90. }