65 lines
2.0 KiB
C#
65 lines
2.0 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace That_One_Nerd.Unity.Games.ArcadeManiac.Misc.Extensions
|
|
{
|
|
public static class GetPointAlongExtension
|
|
{
|
|
public static Vector2 GetPointAlong(this Rect r, float percent)
|
|
{
|
|
percent %= 1;
|
|
|
|
Vector2 percentOfWhole = GetPercentOfWhole();
|
|
Vector2[] keyVerts = GetKeyVerts();
|
|
|
|
bool secondQuarter = percent > percentOfWhole.x;
|
|
Vector2[] keyLine = GetKeyLine();
|
|
|
|
if (secondQuarter) percent -= percentOfWhole.x;
|
|
percent /= secondQuarter ? percentOfWhole.y : percentOfWhole.x;
|
|
|
|
return Vector2.Lerp(keyLine[0], keyLine[1], percent);
|
|
|
|
Vector2[] GetKeyVerts()
|
|
{
|
|
Vector2[] verts = new Vector2[4]
|
|
{
|
|
new Vector2(r.min.x, r.min.y),
|
|
new Vector2(r.max.x, r.min.y),
|
|
new Vector2(r.max.x, r.max.y),
|
|
new Vector2(r.min.x, r.max.y)
|
|
};
|
|
|
|
bool secondHalf = percent > 0.5f;
|
|
if (secondHalf)
|
|
{
|
|
percent -= 0.5f;
|
|
percentOfWhole = new Vector2(percentOfWhole.y, percentOfWhole.x);
|
|
}
|
|
|
|
return new Vector2[3]
|
|
{
|
|
verts[0],
|
|
verts[Convert.ToInt32(secondHalf) * 2 + 1],
|
|
verts[2]
|
|
};
|
|
}
|
|
Vector2 GetPercentOfWhole()
|
|
{
|
|
Vector2 lengths = new Vector2(Mathf.Abs(r.max.x - r.min.x), Mathf.Abs(r.max.y - r.min.y));
|
|
float lineLength = lengths.x * 2 + lengths.y * 2;
|
|
return new Vector2(lengths.x / lineLength, lengths.y / lineLength);
|
|
}
|
|
Vector2[] GetKeyLine()
|
|
{
|
|
int index = Convert.ToInt32(secondQuarter);
|
|
return new Vector2[2]
|
|
{
|
|
keyVerts[index],
|
|
keyVerts[index + 1]
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|