96 lines
2.8 KiB
C#
96 lines
2.8 KiB
C#
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT License.
|
|
|
|
using UnityEngine;
|
|
|
|
namespace Microsoft.MixedReality.Toolkit.Utilities
|
|
{
|
|
/// <summary>
|
|
/// Generates a parabolic line between two points.
|
|
/// </summary>
|
|
[AddComponentMenu("Scripts/MRTK/Core/ParabolaConstrainedLineDataProvider")]
|
|
public class ParabolaConstrainedLineDataProvider : ParabolaLineDataProvider
|
|
{
|
|
[SerializeField]
|
|
[Tooltip("The point where this line will end.")]
|
|
private MixedRealityPose endPoint = MixedRealityPose.ZeroIdentity;
|
|
|
|
/// <summary>
|
|
/// The point where this line will end.
|
|
/// </summary>
|
|
public MixedRealityPose EndPoint
|
|
{
|
|
get { return endPoint; }
|
|
set { endPoint = value; }
|
|
}
|
|
|
|
[SerializeField]
|
|
[Vector3Range(-1f, 1f)]
|
|
private Vector3 upDirection = Vector3.up;
|
|
|
|
public Vector3 UpDirection
|
|
{
|
|
get { return upDirection; }
|
|
set
|
|
{
|
|
upDirection.x = Mathf.Clamp(value.x, -1f, 1f);
|
|
upDirection.y = Mathf.Clamp(value.y, -1f, 1f);
|
|
upDirection.z = Mathf.Clamp(value.z, -1f, 1f);
|
|
}
|
|
}
|
|
|
|
[SerializeField]
|
|
[Range(0.01f, 10f)]
|
|
private float height = 1f;
|
|
|
|
public float Height
|
|
{
|
|
get { return height; }
|
|
set { height = Mathf.Clamp(value, 0.01f, 10f); }
|
|
}
|
|
|
|
#region Line Data Provider Implementation
|
|
|
|
/// <inheritdoc />
|
|
public override int PointCount => 2;
|
|
|
|
/// <inheritdoc />
|
|
protected override Vector3 GetPointInternal(int pointIndex)
|
|
{
|
|
switch (pointIndex)
|
|
{
|
|
case 0:
|
|
return StartPoint.Position;
|
|
case 1:
|
|
return endPoint.Position;
|
|
default:
|
|
Debug.LogError("Invalid point index!");
|
|
return Vector3.zero;
|
|
}
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override void SetPointInternal(int pointIndex, Vector3 point)
|
|
{
|
|
switch (pointIndex)
|
|
{
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
endPoint.Position = point;
|
|
break;
|
|
default:
|
|
Debug.LogError("Invalid point index!");
|
|
break;
|
|
}
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override Vector3 GetPointInternal(float normalizedDistance)
|
|
{
|
|
return LineUtility.GetPointAlongConstrainedParabola(StartPoint.Position, endPoint.Position, upDirection, height, normalizedDistance);
|
|
}
|
|
|
|
#endregion Line Data Provider Implementation
|
|
}
|
|
} |