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);
}
}
}