namespace UnityEngine.Animations.Rigging { /// /// The TwistCorrection constraint data. /// [System.Serializable] public struct TwistCorrectionData : IAnimationJobData, ITwistCorrectionData { /// /// Axis type for TwistCorrection. /// public enum Axis { /// X Axis. X, /// Y Axis. Y, /// Z Axis. Z } [SyncSceneToStream, SerializeField] Transform m_Source; [NotKeyable, SerializeField] Axis m_TwistAxis; [SyncSceneToStream, SerializeField, WeightRange(-1f, 1f)] WeightedTransformArray m_TwistNodes; /// The source Transform that influences the twist nodes. public Transform sourceObject { get => m_Source; set => m_Source = value; } /// public WeightedTransformArray twistNodes { get => m_TwistNodes; set => m_TwistNodes = value; } /// public Axis twistAxis { get => m_TwistAxis; set => m_TwistAxis = value; } /// Transform ITwistCorrectionData.source => m_Source; /// Vector3 ITwistCorrectionData.twistAxis => Convert(m_TwistAxis); /// string ITwistCorrectionData.twistNodesProperty => ConstraintsUtils.ConstructConstraintDataPropertyName(nameof(m_TwistNodes)); static Vector3 Convert(Axis axis) { if (axis == Axis.X) return Vector3.right; if (axis == Axis.Y) return Vector3.up; return Vector3.forward; } /// bool IAnimationJobData.IsValid() { if (m_Source == null) return false; for (int i = 0; i < m_TwistNodes.Count; ++i) if (m_TwistNodes[i].transform == null) return false; return true; } /// void IAnimationJobData.SetDefaultValues() { m_Source = null; m_TwistAxis = Axis.Z; m_TwistNodes.Clear(); } } /// /// TwistCorrection constraint. /// [DisallowMultipleComponent, AddComponentMenu("Animation Rigging/Twist Correction")] [HelpURL("https://docs.unity3d.com/Packages/com.unity.animation.rigging@1.3/manual/constraints/TwistCorrection.html")] public class TwistCorrection : RigConstraint< TwistCorrectionJob, TwistCorrectionData, TwistCorrectionJobBinder > { /// protected override void OnValidate() { base.OnValidate(); var weights = m_Data.twistNodes; WeightedTransformArray.OnValidate(ref weights, -1f, 1f); m_Data.twistNodes = weights; } } }