// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using UnityEngine;
namespace Microsoft.MixedReality.Toolkit.Utilities
{
///
/// Creates a parabolic line based on physics.
///
[AddComponentMenu("Scripts/MRTK/Core/ParabolaPhysicalLineDataProvider")]
public class ParabolaPhysicalLineDataProvider : ParabolaLineDataProvider
{
[SerializeField]
[Vector3Range(-1f, 1f)]
private Vector3 direction = Vector3.forward;
public Vector3 Direction
{
get { return direction; }
set
{
direction.x = Mathf.Clamp(value.x, -1f, 1f);
direction.y = Mathf.Clamp(value.y, -1f, 1f);
direction.z = Mathf.Clamp(value.z, -1f, 1f);
}
}
[SerializeField]
private float velocity = 2f;
public float Velocity
{
get { return velocity; }
set { velocity = value; }
}
[SerializeField]
private float distanceMultiplier = 1f;
public float DistanceMultiplier
{
get { return distanceMultiplier; }
set { distanceMultiplier = value; }
}
[SerializeField]
private bool useCustomGravity = false;
public bool UseCustomGravity
{
get { return useCustomGravity; }
set { useCustomGravity = value; }
}
[SerializeField]
private Vector3 gravity = Vector3.down * 9.8f;
public Vector3 Gravity
{
get { return gravity; }
set { gravity = value; }
}
#region Line Data Provider Implementation
///
public override int PointCount => 2;
///
protected override Vector3 GetPointInternal(int pointIndex)
{
switch (pointIndex)
{
case 0:
return StartPoint.Position;
case 1:
return GetPointInternal(1f);
default:
Debug.LogError("Invalid point index!");
return Vector3.zero;
}
}
///
/// Sets the point at index.
///
///
/// This specific override doesn't set any points.
///
protected override void SetPointInternal(int pointIndex, Vector3 point)
{
// Intentionally does nothing. StartPoint is always the base.FirstPoint and EndPoint is always calculated by the physics.
}
///
protected override Vector3 GetPointInternal(float normalizedDistance)
{
return LineUtility.GetPointAlongPhysicalParabola(StartPoint.Position, direction, velocity, useCustomGravity ? gravity : UnityEngine.Physics.gravity, normalizedDistance * distanceMultiplier);
}
///
protected override Vector3 GetUpVectorInternal(float normalizedLength)
{
return Vector3.up;
}
#endregion Line Data Provider Implementation
}
}