using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
[ExecuteAlways] 
 | 
[RequireComponent(typeof(RectTransform))] 
 | 
public class Datumline : MonoBehaviour { 
 | 
  
 | 
    [System.NonSerialized] RectTransform m_Rect; 
 | 
    public RectTransform rectTransform 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_Rect ?? (m_Rect = GetComponent<RectTransform>()); 
 | 
        } 
 | 
    } 
 | 
    [System.NonSerialized] Canvas m_Canva; 
 | 
    public Canvas canvas 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_Canva ?? (m_Canva = GetComponentInParent<Canvas>()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public List<DatumlineData> datumlines { get; private set; } 
 | 
    private List<DatumlineData> horizonlines = new List<DatumlineData>(); 
 | 
    private List<DatumlineData> verticallins = new List<DatumlineData>(); 
 | 
  
 | 
    private int m_SelectDatumline = 0; 
 | 
    public int SelectDatumline 
 | 
    { 
 | 
        get 
 | 
        { 
 | 
            return m_SelectDatumline; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void Awake() 
 | 
    { 
 | 
        datumlines = new List<DatumlineData>(); 
 | 
    } 
 | 
  
 | 
    private void OnEnable() 
 | 
    { 
 | 
        if (datumlines == null) 
 | 
        { 
 | 
            datumlines = new List<DatumlineData>(); 
 | 
        } 
 | 
        if (datumlines.Count == 0) 
 | 
        { 
 | 
            Add(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void OnDisable() 
 | 
    { 
 | 
         
 | 
    } 
 | 
  
 | 
    public void Add() 
 | 
    { 
 | 
        var _datumline = new DatumlineData(); 
 | 
        _datumline.type = HorizonOrVertical.Vertical; 
 | 
        _datumline.from = new Vector3(0, rectTransform.rect.height / 2, 0); 
 | 
        _datumline.to = new Vector3(0, -rectTransform.rect.height / 2, 0); 
 | 
        _datumline.color = Color.white; 
 | 
        datumlines.Add(_datumline); 
 | 
    } 
 | 
  
 | 
    public DatumlineData Add(DatumlineData _line) 
 | 
    { 
 | 
        var _datumline = new DatumlineData(); 
 | 
        _datumline.type = _line.type; 
 | 
        _datumline.from = _line.from; 
 | 
        _datumline.to = _line.to; 
 | 
        _datumline.color = _line.color; 
 | 
        datumlines.Add(_datumline); 
 | 
        return _datumline; 
 | 
    } 
 | 
  
 | 
    public void ChangeVector(int _index) 
 | 
    { 
 | 
        var _datumline = datumlines[_index]; 
 | 
        _datumline.type = 1 - _datumline.type; 
 | 
        if (_datumline.type == HorizonOrVertical.Horizon) 
 | 
        { 
 | 
            _datumline.from = new Vector3(-rectTransform.rect.width / 2, _datumline.from.x, 0); 
 | 
            _datumline.to = new Vector3(rectTransform.rect.width / 2, _datumline.from.x, 0); 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            _datumline.from = new Vector3(_datumline.from.y, rectTransform.rect.height / 2, 0); 
 | 
            _datumline.to = new Vector3(_datumline.from.y, -rectTransform.rect.height / 2, 0); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void Remove(int _index) 
 | 
    { 
 | 
        if (datumlines.Count == 1) 
 | 
        { 
 | 
            return; 
 | 
        } 
 | 
        datumlines.RemoveAt(_index); 
 | 
    } 
 | 
  
 | 
    public Vector3 ToWorldValue(Vector3 _pos) 
 | 
    { 
 | 
        return _pos * canvas.transform.localScale.x; 
 | 
    } 
 | 
  
 | 
    public float ToScenceValue(float _value) 
 | 
    { 
 | 
        return _value / canvas.transform.localScale.x; 
 | 
    } 
 | 
  
 | 
    public void SetSelect(int _index) 
 | 
    { 
 | 
        if (_index < datumlines.Count) 
 | 
        { 
 | 
            m_SelectDatumline = _index; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public List<DatumlineData> GetLines(HorizonOrVertical _type) 
 | 
    { 
 | 
        var _list = datumlines.FindAll((x) => 
 | 
        { 
 | 
            return x.type == _type; 
 | 
        }); 
 | 
        if (_list != null) 
 | 
        { 
 | 
            switch (_type) 
 | 
            { 
 | 
                case HorizonOrVertical.Horizon: 
 | 
                    horizonlines.Clear(); 
 | 
                    horizonlines.AddRange(_list); 
 | 
                    horizonlines.Sort(Compare); 
 | 
                    break; 
 | 
                case HorizonOrVertical.Vertical: 
 | 
                    verticallins.Clear(); 
 | 
                    verticallins.AddRange(_list); 
 | 
                    verticallins.Sort(Compare); 
 | 
                    break; 
 | 
            } 
 | 
        } 
 | 
        return _type == HorizonOrVertical.Horizon ? horizonlines : verticallins; 
 | 
    } 
 | 
  
 | 
    private int Compare(DatumlineData x, DatumlineData y) 
 | 
    { 
 | 
        return x.type == HorizonOrVertical.Horizon ? x.from.y.CompareTo(y.from.y) : x.from.x.CompareTo(y.from.x); 
 | 
    } 
 | 
  
 | 
    public class DatumlineData 
 | 
    { 
 | 
        public Vector3 from { get; set; } 
 | 
        public Vector3 to { get; set; } 
 | 
        public HorizonOrVertical type { get; set; } 
 | 
        public Color color { get; set; } 
 | 
    } 
 | 
  
 | 
    public enum HorizonOrVertical 
 | 
    { 
 | 
        Horizon, 
 | 
        Vertical, 
 | 
    } 
 | 
} 
 |