// -------------------------------------------------------------------------------------------------------------------- // // Copyright (c) VRMADA, All rights reserved. // // -------------------------------------------------------------------------------------------------------------------- using System; using System.Collections.Generic; using UltimateXR.Core; using UltimateXR.Core.Math; using UnityEngine; namespace UltimateXR.Avatar.Rig { /// /// /// Stores information about the rig to facilitate transformations no matter the coordinate system used by /// the avatar hierarchy (See ). /// /// It also stores lengths and sizes that can facilitate operations such as Inverse Kinematics, calibration, etc. /// [Serializable] public class UxrAvatarRigInfo { #region Inspector Properties/Serialized Fields [SerializeField] private int _version; [SerializeField] private UxrAvatar _avatar; [SerializeField] private UxrAvatarArmInfo _leftArmInfo = new UxrAvatarArmInfo(); [SerializeField] private UxrAvatarArmInfo _rightArmInfo = new UxrAvatarArmInfo(); #endregion #region Public Types & Data /// /// Enumerates the arm information. /// public IEnumerable Arms { get { yield return _leftArmInfo; yield return _rightArmInfo; } } #endregion #region Internal Types & Data internal const int CurrentVersion = 1; /// /// Gets the version this data was serialized for. It allows to control if new data needs to be computed. /// internal int SerializedVersion => _version; #endregion #region Public Methods /// /// Gets the arm information. /// /// Which side to retrieve /// Arm information public UxrAvatarArmInfo GetArmInfo(UxrHandSide side) { return side == UxrHandSide.Left ? _leftArmInfo : _rightArmInfo; } #endregion #region Internal Methods /// /// Computes the information of an avatar's rig. /// /// Avatar whose rig to compute the information of internal void Compute(UxrAvatar avatar) { _version = CurrentVersion; _avatar = avatar; _leftArmInfo.Compute(avatar, UxrHandSide.Left); _rightArmInfo.Compute(avatar, UxrHandSide.Right); } /// /// Updates information to the current frame. /// internal void UpdateInfo() { GetArmInfo(UxrHandSide.Left).WristTorsionInfo.UpdateInfo(_avatar.AvatarRig.LeftArm.Forearm, _avatar.LeftHandBone, GetArmInfo(UxrHandSide.Left)); GetArmInfo(UxrHandSide.Right).WristTorsionInfo.UpdateInfo(_avatar.AvatarRig.RightArm.Forearm, _avatar.RightHandBone, GetArmInfo(UxrHandSide.Right)); } #endregion } }