Files
BH3/Assets/Scripts/Assembly-CSharp/MoleMole/UIQuad.cs
2025-08-13 09:26:42 +08:00

200 lines
6.2 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace MoleMole
{
public class UIQuad
{
public Vector2 min;
public Vector2 max;
public Vector2[] uvMin;
public Vector2[] uvMax;
public static readonly int MAX_UV_COUNT = 4;
public UIQuad()
{
Vector2 vector = -Vector2.one;
Set(Vector2.zero, Vector2.zero, vector, vector, vector, vector, vector, vector, vector, vector);
}
public UIQuad(Vector2 min, Vector2 max, Vector2 uvMin0, Vector2 uvMax0, Vector2 uvMin1, Vector2 uvMax1)
{
Vector2 vector = -Vector2.one;
Set(min, max, uvMin0, uvMax0, uvMin1, uvMax1, vector, vector, vector, vector);
}
public UIQuad(Vector2 min, Vector2 max, Vector2 uvMin0, Vector2 uvMax0, Vector2 uvMin1, Vector2 uvMax1, Vector2 uvMin2, Vector2 uvMax2, Vector2 uvMin3, Vector2 uvMax3)
{
Set(min, max, uvMin0, uvMax0, uvMin1, uvMax1, uvMin2, uvMax2, uvMin3, uvMax3);
}
public UIQuad(UIQuad quad)
{
Set(quad.min, quad.max, quad.uvMin[0], quad.uvMax[0], quad.uvMin[1], quad.uvMax[1], quad.uvMin[2], quad.uvMax[2], quad.uvMin[3], quad.uvMax[3]);
}
public void Set(Vector2 min, Vector2 max, Vector2 uvMin0, Vector2 uvMax0, Vector2 uvMin1, Vector2 uvMax1, Vector2 uvMin2, Vector2 uvMax2, Vector2 uvMin3, Vector2 uvMax3)
{
this.min = min;
this.max = max;
uvMin = new Vector2[4] { uvMin0, uvMin1, uvMin2, uvMin3 };
uvMax = new Vector2[4] { uvMax0, uvMax1, uvMax2, uvMax3 };
}
public UIVertex[] ToUIQuad(UIVertex template)
{
UIVertex[] array = new UIVertex[4] { template, template, template, template };
array[0].position = new Vector3(min.x, min.y, 0f);
array[1].position = new Vector3(min.x, max.y, 0f);
array[2].position = new Vector3(max.x, max.y, 0f);
array[3].position = new Vector3(max.x, min.y, 0f);
array[0].uv0 = new Vector3(uvMin[0].x, uvMin[0].y);
array[1].uv0 = new Vector3(uvMin[0].x, uvMax[0].y);
array[2].uv0 = new Vector3(uvMax[0].x, uvMax[0].y);
array[3].uv0 = new Vector3(uvMax[0].x, uvMin[0].y);
array[0].uv1 = new Vector3(uvMin[1].x, uvMin[1].y);
array[1].uv1 = new Vector3(uvMin[1].x, uvMax[1].y);
array[2].uv1 = new Vector3(uvMax[1].x, uvMax[1].y);
array[3].uv1 = new Vector3(uvMax[1].x, uvMin[1].y);
array[0].normal = new Vector3(uvMin[2].x, 0f, uvMin[2].y);
array[1].normal = new Vector3(uvMin[2].x, 0f, uvMax[2].y);
array[2].normal = new Vector3(uvMax[2].x, 0f, uvMax[2].y);
array[3].normal = new Vector3(uvMax[2].x, 0f, uvMin[2].y);
array[0].tangent = new Vector3(uvMin[3].x, 0f, uvMin[3].y);
array[1].tangent = new Vector3(uvMin[3].x, 0f, uvMax[3].y);
array[2].tangent = new Vector3(uvMax[3].x, 0f, uvMax[3].y);
array[3].tangent = new Vector3(uvMax[3].x, 0f, uvMin[3].y);
return array;
}
public UIQuad Split(UIQuad another, int anotherUIid = 1, List<UIQuad> unOverlappedList = null, bool revertUVid = false)
{
UIQuad result = null;
UIQuad uIQuad = Split(another, anotherUIid, unOverlappedList, 0, revertUVid);
if (uIQuad != null)
{
result = uIQuad.Split(another, anotherUIid, unOverlappedList, 1, revertUVid);
}
return result;
}
private UIQuad Split(UIQuad another, int anotherUIid, List<UIQuad> unOverlappedList, int dir, bool revertUVid)
{
float num = Mathf.Max(min[dir], another.min[dir]);
float num2 = Mathf.Min(max[dir], another.max[dir]);
if (min[dir] < num && unOverlappedList != null)
{
unOverlappedList.Add(GetLowerPart(num, dir, anotherUIid, revertUVid));
}
if (num2 < max[dir] && unOverlappedList != null)
{
unOverlappedList.Add(GetHigherPart(num2, dir, anotherUIid, revertUVid));
}
UIQuad uIQuad = null;
if (num < num2)
{
uIQuad = GetMiddlePart(num, num2, anotherUIid, dir);
if (!revertUVid)
{
uIQuad.uvMin[anotherUIid][dir] = Mathf.Lerp(another.uvMin[anotherUIid][dir], another.uvMax[anotherUIid][dir], (num - another.min[dir]) / (another.max[dir] - another.min[dir]));
uIQuad.uvMax[anotherUIid][dir] = Mathf.Lerp(another.uvMin[anotherUIid][dir], another.uvMax[anotherUIid][dir], (num2 - another.min[dir]) / (another.max[dir] - another.min[dir]));
}
}
return uIQuad;
}
private UIQuad GetLowerPart(float splitPoint, int dir, int anotherUIid, bool revertUIid)
{
splitPoint = Mathf.Min(max[dir], splitPoint);
UIQuad uIQuad = new UIQuad(this);
uIQuad.max[dir] = splitPoint;
float t = (splitPoint - min[dir]) / (max[dir] - min[dir]);
if (!revertUIid)
{
for (int i = 0; i < MAX_UV_COUNT; i++)
{
if (i != anotherUIid)
{
uIQuad.uvMax[i][dir] = Mathf.Lerp(uvMin[i][dir], uvMax[i][dir], t);
}
else
{
uIQuad.uvMax[i][dir] = -1f;
}
}
}
else
{
for (int j = 0; j < MAX_UV_COUNT; j++)
{
if (j != anotherUIid)
{
uIQuad.uvMax[j][dir] = -1f;
}
else
{
uIQuad.uvMax[j][dir] = Mathf.Lerp(uvMin[j][dir], uvMax[j][dir], t);
}
}
}
return uIQuad;
}
private UIQuad GetHigherPart(float splitPoint, int dir, int anotherUIid, bool revertUIid)
{
splitPoint = Mathf.Max(min[dir], splitPoint);
UIQuad uIQuad = new UIQuad(this);
uIQuad.min[dir] = splitPoint;
float t = (splitPoint - min[dir]) / (max[dir] - min[dir]);
if (!revertUIid)
{
for (int i = 0; i < MAX_UV_COUNT; i++)
{
if (i != anotherUIid)
{
uIQuad.uvMin[i][dir] = Mathf.Lerp(uvMin[i][dir], uvMax[i][dir], t);
}
else
{
uIQuad.uvMin[i][dir] = -1f;
}
}
}
else
{
for (int j = 0; j < MAX_UV_COUNT; j++)
{
if (j != anotherUIid)
{
uIQuad.uvMin[j][dir] = -1f;
}
else
{
uIQuad.uvMin[j][dir] = Mathf.Lerp(uvMin[j][dir], uvMax[j][dir], t);
}
}
}
return uIQuad;
}
private UIQuad GetMiddlePart(float splitPoint1, float splitPoint2, int anotherUIid, int dir)
{
UIQuad uIQuad = new UIQuad(this);
uIQuad.min[dir] = splitPoint1;
uIQuad.max[dir] = splitPoint2;
float t = (splitPoint1 - min[dir]) / (max[dir] - min[dir]);
float t2 = (splitPoint2 - min[dir]) / (max[dir] - min[dir]);
for (int i = 0; i < MAX_UV_COUNT; i++)
{
uIQuad.uvMin[i][dir] = Mathf.Lerp(uvMin[i][dir], uvMax[i][dir], t);
uIQuad.uvMax[i][dir] = Mathf.Lerp(uvMin[i][dir], uvMax[i][dir], t2);
}
return uIQuad;
}
}
}