namespace VRTK.Prefabs.Interactions.Controllables { using UnityEngine; using Malimbe.BehaviourStateRequirementMethod; using Zinnia.Data.Type; /// /// The basis to drive a control in a linear direction. /// public abstract class DirectionalDrive : Drive { /// /// Calculates the limits of the drive. /// /// The maximum local space limit the drive can reach. /// The minimum and maximum local space limit the drive can reach. public virtual FloatRange CalculateDriveLimits(float newLimit) { if (!isActiveAndEnabled) { return FloatRange.MinMax; } float motionLimit = Mathf.Abs(newLimit * 0.5f); return new FloatRange(-motionLimit, motionLimit); } /// protected override FloatRange CalculateDriveLimits(DirectionalDriveFacade facade) { return CalculateDriveLimits(facade.DriveLimit); } /// [RequiresBehaviourState] protected override float CalculateValue(DriveAxis.Axis axis, FloatRange limits) { float result = 0f; switch (axis) { case DriveAxis.Axis.XAxis: result = GetDriveTransform().localPosition.x; break; case DriveAxis.Axis.YAxis: result = GetDriveTransform().localPosition.y; break; case DriveAxis.Axis.ZAxis: result = GetDriveTransform().localPosition.z; break; } return Mathf.Clamp(result, limits.minimum, limits.maximum); } /// [RequiresBehaviourState] public override void ConfigureAutoDrive(bool autoDrive) { ProcessDriveSpeed(Facade.DriveSpeed, Facade.MoveToTargetValue); } } }