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, 
 | 
    } 
 | 
  
 | 
} 
 |