rabidus-test/Assets/Dreamteck/Splines/Core/SplineSample.cs

104 lines
3.4 KiB
C#
Raw Permalink Normal View History

2023-07-24 16:38:13 +03:00
using UnityEngine;
using Dreamteck;
namespace Dreamteck.Splines{
[System.Serializable]
public struct SplineSample {
public Vector3 position;
public Vector3 up;
public Vector3 forward;
public Color color;
public float size;
public double percent;
public void FastCopy(ref SplineSample sample)
{
position = sample.position;
up = sample.up;
forward = sample.forward;
color = sample.color;
size = sample.size;
percent = sample.percent;
}
public Quaternion rotation
{
get {
if (up == forward)
{
if (up == Vector3.up) return Quaternion.LookRotation(Vector3.up, Vector3.back);
else return Quaternion.LookRotation(forward, Vector3.up);
}
return Quaternion.LookRotation(forward, up); }
}
public Vector3 right
{
get {
if(up == forward)
{
if (up == Vector3.up) return Vector3.right;
else return Vector3.Cross(Vector3.up, forward).normalized;
}
return Vector3.Cross(up, forward).normalized; }
}
public static SplineSample Lerp(ref SplineSample a, ref SplineSample b, float t)
{
SplineSample result = new SplineSample();
Lerp(ref a, ref b, t, ref result);
return result;
}
public static SplineSample Lerp(ref SplineSample a, ref SplineSample b, double t)
{
SplineSample result = new SplineSample();
Lerp(ref a, ref b, t, ref result);
return result;
}
public static void Lerp(ref SplineSample a, ref SplineSample b, double t, ref SplineSample target)
{
float ft = (float)t;
DMath.LerpVector3NonAlloc(a.position, b.position, t, ref target.position);
target.forward = Vector3.Slerp(a.forward, b.forward, ft);
target.up = Vector3.Slerp(a.up, b.up, ft);
target.color = Color.Lerp(a.color, b.color, ft);
target.size = Mathf.Lerp(a.size, b.size, ft);
target.percent = DMath.Lerp(a.percent, b.percent, t);
}
public static void Lerp(ref SplineSample a, ref SplineSample b, float t, ref SplineSample target)
{
DMath.LerpVector3NonAlloc(a.position, b.position, t, ref target.position);
target.forward = Vector3.Slerp(a.forward, b.forward, t);
target.up = Vector3.Slerp(a.up, b.up, t);
target.color = Color.Lerp(a.color, b.color, t);
target.size = Mathf.Lerp(a.size, b.size, t);
target.percent = DMath.Lerp(a.percent, b.percent, t);
}
public void Lerp(ref SplineSample b, double t)
{
Lerp(ref this, ref b, t, ref this);
}
public void Lerp(ref SplineSample b, float t)
{
Lerp(ref this, ref b, t, ref this);
}
public SplineSample(Vector3 position, Vector3 up, Vector3 forward, Color color, float size, double percent)
{
this.position = position;
this.up = up;
this.forward = forward;
this.color = color;
this.size = size;
this.percent = percent;
}
}
}