2023-04-03 11:04:31 +08:00

180 lines
8.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace BF
{
//只有纵向拉伸, 后续完善
public class RawImageGrid : RawImage
{
private const int POINT_NUM = 8;
private const int RECT_NUM = 3;
private const float MAX_PADDING = 1f;
//保证在初始时候设置好比例
public float paddingTopSlice = 0.5f;
public float paddingBottomSlice = 0.5f;
// private List<Vector2> gridSlicePositions = new List<Vector2>();
// private List<Vector2> rectPositions = new List<Vector2>();
private float paddingTopDistance;
private float paddingBottomDistance;
private Vector3[] corners = new Vector3[4];
protected override void Awake()
{
base.Awake();
// gridSlicePositions.Add(new Vector2(0f, 0f));
// gridSlicePositions.Add(new Vector2(0f, paddingBottomSlice));
// gridSlicePositions.Add(new Vector2(0f, paddingTopSlice));
// gridSlicePositions.Add(new Vector2(0f, 1f));
// gridSlicePositions.Add(new Vector2(1f, 1f));
// gridSlicePositions.Add(new Vector2(1f, paddingTopSlice));
// gridSlicePositions.Add(new Vector2(1f, paddingBottomSlice));
// gridSlicePositions.Add(new Vector2(1f, 0f));
CalculateRectPos();
}
private void GetRectTransformBounds()
{
this.rectTransform.GetLocalCorners(corners);
}
private void CalculateRectPos()
{
if(paddingBottomSlice < paddingTopSlice)
return;
// rectPositions.Clear();
GetRectTransformBounds();
var rectWidth = corners[3].x - corners[0].x;
var rectHeight = corners[1].y - corners[0].y;
paddingTopDistance = Mathf.Min(MAX_PADDING, paddingTopSlice) * rectHeight;
paddingBottomDistance = Mathf.Min(MAX_PADDING, paddingBottomSlice) * rectHeight;
// var count = POINT_NUM;
// for (int i = 0; i < count; i++)
// {
// var slicePos = gridSlicePositions[i];
// var rectPosX = corners[0].x + slicePos.x * rectWidth;
// var rectPosY = corners[0].y + slicePos.y * rectHeight;
// rectPositions.Add(new Vector2(rectPosX, rectPosY));
// }
}
private void GetVertPosAndUV(VertexHelper vh, Vector4 vector4, int gridIdx, Vector2 uv)
{
//// var gridPos = Vector2.zero;//gridSlicePositions[gridIdx];
// float gridX = gridIdx < POINT_NUM / 2 ? corners[0].x : corners[3].x; //gridPos.x;
// float gridY = gridIdx < POINT_NUM / 2 ? corners[0].x : corners[3].x;
//
// Vector3 vert = new Vector3(vector4.x + (vector4.z - vector4.x) * gridX,
// vector4.y + (vector4.w - vector4.y) * gridY);
// uv.x *= (uvRect.xMin + (uvRect.xMax - uvRect.xMin) * gridX);
// uv.y *= (uvRect.yMin + (uvRect.yMax - uvRect.yMin) * gridY);
// vh.AddVert(vert, (Color32) this.color, uv);
// vertexHelper.AddVert(new Vector3(posMin.x, posMin.y, 0.0f), color, new Vector2(uvMin.x, uvMin.y));
// vertexHelper.AddVert(new Vector3(posMin.x, posMax.y, 0.0f), color, new Vector2(uvMin.x, uvMax.y));
// vertexHelper.AddVert(new Vector3(posMax.x, posMax.y, 0.0f), color, new Vector2(uvMax.x, uvMax.y));
// vertexHelper.AddVert(new Vector3(posMax.x, posMin.y, 0.0f), color, new Vector2(uvMax.x, uvMin.y));
// vertexHelper.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);
// vertexHelper.AddTriangle(currentVertCount + 2, currentVertCount + 3, currentVertCount);
}
private void AddQuad(VertexHelper vh, Vector2 posMin, Vector2 posMax, Color32 color, Vector2 uvMin, Vector2 uvMax)
{
vh.AddVert(new Vector3(posMin.x, posMin.y, 0.0f), color, new Vector2(uvMin.x, uvMin.y));
vh.AddVert(new Vector3(posMin.x, posMax.y, 0.0f), color, new Vector2(uvMin.x, uvMax.y));
vh.AddVert(new Vector3(posMax.x, posMax.y, 0.0f), color, new Vector2(uvMax.x, uvMax.y));
vh.AddVert(new Vector3(posMax.x, posMin.y, 0.0f), color, new Vector2(uvMax.x, uvMin.y));
// vh.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);
// vh.AddTriangle(currentVertCount + 2, currentVertCount + 3, currentVertCount);
}
protected override void OnPopulateMesh(VertexHelper vh)
{
Texture mainTexture = this.mainTexture;
vh.Clear();
if (!((Object) mainTexture != (Object) null))
return;
Rect pixelAdjustedRect = this.GetPixelAdjustedRect();
Vector4 vector4 = new Vector4(pixelAdjustedRect.x, pixelAdjustedRect.y, pixelAdjustedRect.x + pixelAdjustedRect.width, pixelAdjustedRect.y + pixelAdjustedRect.height);
float num1 = (float) mainTexture.width * mainTexture.texelSize.x;
float num2 = (float) mainTexture.height * mainTexture.texelSize.y;
GetRectTransformBounds();
var count = RECT_NUM;
var rectHeight = corners[1].y - corners[0].y;
var rectBottomSlice = paddingBottomDistance / rectHeight;
var rectTopSlice = (rectHeight - paddingTopDistance) / rectHeight;
// for (int i = 0; i < count; i++)
// {
var posSize = vector4.w - vector4.y;
Vector2 posMin = new Vector2(vector4.x, vector4.y);
Vector2 posMax = new Vector2(vector4.z, vector4.y + posSize * rectBottomSlice);
Vector2 uvMin = new Vector2(0, 0);
Vector2 uvMax = new Vector2(0.5f, 0.5f);
AddQuad(vh, posMin, posMax, color, uvMin, uvMax);
// posMin = new Vector2(vector4.x, vector4.y + posSize * rectBottomSlice);
// posMax = new Vector2(vector4.z, vector4.y + posSize * rectTopSlice);
// uvMin = new Vector2(0.5f, 0.5f);
// uvMax = new Vector2(0.5f, 0.5f);
// AddQuad(vh, posMin, posMax, color, uvMin, uvMax);
posMin = new Vector2(vector4.x, vector4.y + posSize * rectTopSlice);
posMax = new Vector2(vector4.z, vector4.w);
uvMin = new Vector2(0.5f, 0.5f);
uvMax = new Vector2(1, 1);
AddQuad(vh, posMin, posMax, color, uvMin, uvMax);
// }
// {
// GetVertPosAndUV(vh, vector4, i, new Vector2(num1, num2));
// }
count = (count - 2) / 2;
// for (int i = 0, j = 0; j < count; j++)
// {
//// if (i == 0)
// {
// vh.AddTriangle(i, i + 1, i + 3);
// vh.AddTriangle(i + 3, i + 1, i + 2);
// i++;
// }
//// else if (i == 1)
//// {
//// vh.AddTriangle(i, i + 3, i + 1);
//// vh.AddTriangle(i + 1, i + 3, i + 4);
//// i += 3;
//// }
//// else
//// {
//// vh.AddTriangle(i, i + 2, i + 1);
//// vh.AddTriangle(i + 1, i + 2, i + 3);
//// i += 2;
//// }
// }
// vh.AddVert(new Vector3(vector4.x, vector4.y), (Color32) color, new Vector2(uvRect.xMin * num1, uvRect.yMin * num2));
// vh.AddVert(new Vector3(vector4.x, vector4.w), (Color32) color, new Vector2(uvRect.xMin * num1, uvRect.yMax * num2));
// vh.AddVert(new Vector3(vector4.z, vector4.w), (Color32) color, new Vector2(uvRect.xMax * num1, uvRect.yMax * num2));
// vh.AddVert(new Vector3(vector4.z, vector4.y), (Color32) color, new Vector2(uvRect.xMax * num1, uvRect.yMin * num2));
// vh.AddTriangle(0, 1, 6);
// vh.AddTriangle(6, 7, 0);
// vh.AddTriangle(1, 2, 5);
// vh.AddTriangle(5, 6, 1);
// vh.AddTriangle(2, 3, 4);
// vh.AddTriangle(4, 5, 2);
vh.AddTriangle(0, 1, 2);
vh.AddTriangle(2, 3, 0);
vh.AddTriangle(1, 2, 3);
vh.AddTriangle(3, 2, 1);
}
}
}