180 lines
8.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|