// --------------------------------------------------------------------------------------------------------------------
//
// 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
}
}