using UnityEngine;
|
using System.Collections;
|
using UnityEngine.UI;
|
using System;
|
using System.Collections.Generic;
|
|
[DisallowMultipleComponent]
|
public class MirrorImage:BaseMeshEffect {
|
|
[SerializeField]
|
Align m_Align = Align.Right;
|
public Align align { get { return m_Align; } }
|
|
public override void ModifyMesh(VertexHelper vh) {
|
if(!IsActive() || vh.currentVertCount == 0) {
|
return;
|
}
|
|
var vertexs = new List<UIVertex>();
|
vh.GetUIVertexStream(vertexs);
|
var min = CalculateMin(vertexs);
|
var max = CalculateMax(vertexs);
|
|
if(align == Align.Orthogon) {
|
vertexs.AddRange(Copy(Align.Right,min,max,vertexs));
|
vertexs.AddRange(Copy(Align.Bottom,min,max,vertexs));
|
}
|
else {
|
vertexs.AddRange(Copy(align,min,max,vertexs));
|
}
|
|
vh.Clear();
|
vh.AddUIVertexTriangleStream(vertexs);
|
}
|
|
private List<UIVertex> Copy(Align _align,Vector2 _min,Vector2 _max,List<UIVertex> _originalVertexs) {
|
var copyVertexs = new List<UIVertex>();
|
|
var reversal = _align == Align.Top || _align == Align.Right;
|
var axis = _align == Align.Left || _align == Align.Right ? 0 : 1;
|
var count = _originalVertexs.Count;
|
for(int i = 0;i < count;i++) {
|
var vertex = _originalVertexs[i];
|
vertex = _originalVertexs[i];
|
var position = vertex.position;
|
if(reversal) {
|
position[axis] = _max[axis] - position[axis] + _max[axis];
|
}
|
else {
|
position[axis] = _min[axis] - position[axis] + _min[axis];
|
}
|
|
vertex.position = position;
|
copyVertexs.Add(vertex);
|
}
|
|
return copyVertexs;
|
}
|
|
|
Vector2 CalculateMin(List<UIVertex> _vertexs) {
|
var count = _vertexs.Count;
|
var min = _vertexs[0].position;
|
|
for(int i = 1;i < count;i++) {
|
var vertex = _vertexs[i];
|
if(vertex.position[0] < min[0]) {
|
min[0] = vertex.position[0];
|
}
|
else if(vertex.position[1] < min[1]) {
|
min[1] = vertex.position[1];
|
}
|
}
|
|
return min;
|
}
|
|
Vector2 CalculateMax(List<UIVertex> _vertexs) {
|
var count = _vertexs.Count;
|
var max = _vertexs[0].position;
|
|
for(int i = 1;i < count;i++) {
|
var vertex = _vertexs[i];
|
if(vertex.position[0] > max[0]) {
|
max[0] = vertex.position[0];
|
}
|
else if(vertex.position[1] > max[1]) {
|
max[1] = vertex.position[1];
|
}
|
}
|
|
return max;
|
}
|
|
public enum Align {
|
Left,
|
Right,
|
Bottom,
|
Top,
|
Orthogon,
|
}
|
|
}
|