Advertisement
Guest User

Untitled

a guest
Aug 2nd, 2019
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.49 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. #if UNITY_EDITOR
  4. using UnityEditor;
  5. #endif
  6. using UnityEngine;
  7. using UnityEngine.UI;
  8.  
  9. namespace MaterialUI
  10. {
  11.     [ExecuteInEditMode]
  12.    
  13.     public class VectorImage : Text
  14.     {
  15.         public enum SizeMode
  16.         {
  17.             Manual,
  18.             MatchWidth,
  19.             MatchHeight,
  20.             MatchMin,
  21.             MatchMax
  22.         }
  23.  
  24.         [SerializeField]
  25.         private float m_Size = 48;
  26.         public float size
  27.         {
  28.             get { return m_Size; }
  29.             set
  30.             {
  31.                 m_Size = value;
  32.                 RefreshScale();
  33.             }
  34.         }
  35.  
  36.         [SerializeField]
  37.         private float m_ScaledSize;
  38.         public float scaledSize
  39.         {
  40.             get { return m_ScaledSize; }
  41.         }
  42.  
  43.        
  44.  
  45.         [SerializeField]
  46.         private SizeMode m_SizeMode = SizeMode.MatchMin;
  47.         public SizeMode sizeMode
  48.         {
  49.             get { return m_SizeMode; }
  50.             set
  51.             {
  52.                 m_SizeMode = value;
  53.                 m_Tracker.Clear();
  54.                 RefreshScale();
  55.                 SetLayoutDirty();
  56.             }
  57.         }
  58.  
  59.         [SerializeField]
  60.         private MaterialUIScaler m_MaterialUiScaler;
  61.         public MaterialUIScaler materialUiScaler
  62.         {
  63.             get
  64.             {
  65.                 if (m_MaterialUiScaler == null)
  66.                 {
  67.                     m_MaterialUiScaler = MaterialUIScaler.GetParentScaler(transform);
  68.                 }
  69.                 return m_MaterialUiScaler;
  70.             }
  71.         }
  72.  
  73.         [SerializeField]
  74.         private VectorImageData m_VectorImageData = new VectorImageData();
  75.         public VectorImageData vectorImageData
  76.         {
  77.             get { return m_VectorImageData; }
  78.             set
  79.             {
  80.                 m_VectorImageData = value;
  81.                 updateFontAndText();
  82.  
  83.                 RefreshScale();
  84.  
  85.                 #if UNITY_EDITOR
  86.                 EditorUtility.SetDirty(gameObject);
  87.                 #endif
  88.             }
  89.         }
  90.  
  91.         private bool m_DisableDirty;
  92.         private float m_LocalScaleFactor;
  93.         #if !UNITY_5_2_0 && !UNITY_5_2_1
  94.         private readonly UIVertex[] m_TempVerts = new UIVertex[4];
  95.         #endif
  96.         private DrivenRectTransformTracker m_Tracker = new DrivenRectTransformTracker();
  97.  
  98.         public void Refresh()
  99.         {
  100.             updateFontAndText();
  101.             RefreshScale();
  102.  
  103.             #if UNITY_EDITOR
  104.             EditorUtility.SetDirty(gameObject);
  105.             #endif
  106.         }
  107.  
  108.         #if UNITY_EDITOR
  109.         public VectorImage()
  110.         {
  111.             EditorUpdate.Init();
  112.             EditorUpdate.onEditorUpdate += OnEditorUpdate;
  113.         }
  114.         #endif
  115.  
  116.         #region TextUnicode
  117.  
  118.  
  119.         #if UNITY_5_2_0 || UNITY_5_2_1
  120.         protected override void OnPopulateMesh(Mesh toFill)
  121.         {
  122.             if (fontSize == 0)
  123.             {
  124.                 return;
  125.             }
  126.  
  127.             string cache = text;
  128.             m_DisableDirty = true;
  129.             text = IconDecoder.Decode(text);
  130.             base.OnPopulateMesh(toFill);
  131.             text = cache;
  132.             m_DisableDirty = false;
  133.         }
  134.         #else
  135.         protected override void OnPopulateMesh(VertexHelper toFill)
  136.         {
  137.             if (fontSize == 0)
  138.             {
  139.                 toFill.Clear();
  140.                 return;
  141.             }
  142.  
  143.             m_DisableDirty = true;
  144.  
  145.             if (font != null)
  146.             {
  147.                 m_DisableFontTextureRebuiltCallback = true;
  148.                 cachedTextGenerator.Populate(IconDecoder.Decode(text), GetGenerationSettings(rectTransform.rect.size));
  149.                 Rect rect = rectTransform.rect;
  150.                 Vector2 textAnchorPivot = GetTextAnchorPivot(alignment);
  151.                 Vector2 zero = Vector2.zero;
  152.                 zero.x = textAnchorPivot.x != 1.0 ? rect.xMin : rect.xMax;
  153.                 zero.y = textAnchorPivot.y != 0.0 ? rect.yMax : rect.yMin;
  154.                 Vector2 vector2 = PixelAdjustPoint(zero) - zero;
  155.                 IList<UIVertex> verts = cachedTextGenerator.verts;
  156.                 float num1 = 1f / pixelsPerUnit;
  157.                 int num2 = verts.Count - 4;
  158.                 toFill.Clear();
  159.  
  160.                 if (vector2 != Vector2.zero)
  161.                 {
  162.                     for (int index1 = 0; index1 < num2; ++index1)
  163.                     {
  164.                         int index2 = index1 & 3;
  165.                         m_TempVerts[index2] = verts[index1];
  166.                         m_TempVerts[index2].position *= num1;
  167.                         m_TempVerts[index2].position.x += vector2.x;
  168.                         m_TempVerts[index2].position.y += vector2.y;
  169.  
  170.                         if (index2 == 3)
  171.                         {
  172.                             toFill.AddUIVertexQuad(m_TempVerts);
  173.                         }
  174.                     }
  175.                 }
  176.                 else
  177.                 {
  178.                     for (int index1 = 0; index1 < num2; ++index1)
  179.                     {
  180.                         int index2 = index1 & 3;
  181.                         m_TempVerts[index2] = verts[index1];
  182.                         m_TempVerts[index2].position *= num1;
  183.  
  184.                         if (index2 == 3)
  185.                         {
  186.                             toFill.AddUIVertexQuad(m_TempVerts);
  187.                         }
  188.                     }
  189.                 }
  190.                 m_DisableFontTextureRebuiltCallback = false;
  191.             }
  192.  
  193.             m_DisableDirty = false;
  194.         }
  195.         #endif
  196.  
  197.         public override void SetLayoutDirty()
  198.         {
  199.             if (m_DisableDirty) return;
  200.  
  201.             base.SetLayoutDirty();
  202.         }
  203.  
  204.         public override void SetVerticesDirty()
  205.         {
  206.             if (m_DisableDirty) return;
  207.  
  208.             base.SetVerticesDirty();
  209.         }
  210.  
  211.         public override void SetMaterialDirty()
  212.         {
  213.             if (m_DisableDirty) return;
  214.  
  215.             base.SetMaterialDirty();
  216.         }
  217.  
  218.         #endregion
  219.  
  220.         protected override void OnEnable()
  221.         {
  222.             base.OnEnable();
  223.  
  224.             alignment = TextAnchor.MiddleCenter;
  225.             horizontalOverflow = HorizontalWrapMode.Overflow;
  226.             verticalOverflow = VerticalWrapMode.Overflow;
  227.  
  228.             updateFontAndText();
  229.  
  230.             SetAllDirty();
  231.         }
  232.  
  233.         protected override void OnDisable()
  234.         {
  235.             base.OnDisable();
  236.  
  237.             m_Tracker.Clear();
  238.         }
  239.  
  240.         #if UNITY_EDITOR
  241.         public void OnEditorUpdate()
  242.         {
  243.             if (IsDestroyed())
  244.             {
  245.                 EditorUpdate.onEditorUpdate -= OnEditorUpdate;
  246.                 return;
  247.             }
  248.  
  249.             if (!enabled)
  250.             {
  251.                 EditorUpdate.onEditorUpdate -= OnEditorUpdate;
  252.                 return;
  253.             }
  254.  
  255.             if (vectorImageData == null || vectorImageData.glyph == null) return;
  256.  
  257.             updateFontAndText();
  258.  
  259.             RefreshScale();
  260.         }
  261.         #endif
  262.  
  263.         protected override void Start()
  264.         {
  265.             alignment = TextAnchor.MiddleCenter;
  266.             horizontalOverflow = HorizontalWrapMode.Overflow;
  267.             verticalOverflow = VerticalWrapMode.Overflow;
  268.  
  269.             updateFontAndText();
  270.  
  271.             SetAllDirty();
  272.             UpdateMaterial();
  273.             UpdateGeometry();
  274.         }
  275.  
  276.         private void updateFontAndText()
  277.         {
  278.             if (vectorImageData != null)
  279.             {
  280.                 font = vectorImageData.font;
  281.                 text = vectorImageData.glyph.unicode;
  282.             }
  283.         }
  284.  
  285.         private void RefreshScale()
  286.         {
  287.             if (materialUiScaler == null) // When instantiating the icon for the first time
  288.             {
  289.                 return;
  290.             }
  291.  
  292.             if (!enabled) return;
  293.  
  294.             if (size == 0 && sizeMode == SizeMode.Manual)
  295.             {
  296.                 fontSize = 0;
  297.                 return;
  298.             }
  299.  
  300.             float tempSize = size;
  301.            
  302.             if (sizeMode == SizeMode.Manual)
  303.             {
  304.                 m_ScaledSize = tempSize * materialUiScaler.scaleFactor;
  305.             }
  306.             else if (sizeMode == SizeMode.MatchWidth)
  307.             {
  308.                 m_ScaledSize = rectTransform.rect.width;
  309.                 tempSize = m_ScaledSize;
  310.                 m_ScaledSize *= materialUiScaler.scaleFactor;
  311.             }
  312.             else if (sizeMode == SizeMode.MatchHeight)
  313.             {
  314.                 m_ScaledSize = rectTransform.rect.height;
  315.                 tempSize = m_ScaledSize;
  316.                 m_ScaledSize *= materialUiScaler.scaleFactor;
  317.             }
  318.             else if (sizeMode == SizeMode.MatchMin)
  319.             {
  320.                 Vector2 tempVector2 = new Vector2(rectTransform.rect.width, rectTransform.rect.height);
  321.  
  322.                 m_ScaledSize = Mathf.Min(tempVector2.x, tempVector2.y);
  323.                 tempSize = m_ScaledSize;
  324.                 m_ScaledSize *= materialUiScaler.scaleFactor;
  325.             }
  326.             else if (sizeMode == SizeMode.MatchMax)
  327.             {
  328.                 Vector2 tempVector2 = new Vector2(rectTransform.rect.width, rectTransform.rect.height);
  329.  
  330.                 m_ScaledSize = Mathf.Max(tempVector2.x, tempVector2.y);
  331.                 tempSize = m_ScaledSize;
  332.                 m_ScaledSize *= materialUiScaler.scaleFactor;
  333.             }
  334.  
  335.             if (m_ScaledSize > 500)
  336.             {
  337.                 m_LocalScaleFactor = m_ScaledSize / 500;
  338.             }
  339.             else
  340.             {
  341.                 m_LocalScaleFactor = 1f;
  342.             }
  343.  
  344.             tempSize *= m_LocalScaleFactor;
  345.  
  346.             fontSize = Mathf.RoundToInt(tempSize);
  347.  
  348.             #if UNITY_EDITOR
  349.             if (!Application.isPlaying)
  350.             {
  351.                 EditorUtility.SetDirty(this);
  352.             }
  353.             #endif
  354.  
  355.             m_LocalScaleFactor *= (size / Mathf.Max(size));
  356.  
  357.             if (m_LocalScaleFactor != float.NaN && new Vector3(m_LocalScaleFactor, m_LocalScaleFactor, m_LocalScaleFactor) != rectTransform.localScale)
  358.             {
  359.                 m_Tracker.Add(this, rectTransform, DrivenTransformProperties.Scale);
  360.                 rectTransform.localScale = new Vector3(m_LocalScaleFactor, m_LocalScaleFactor, m_LocalScaleFactor);
  361.             }
  362.         }
  363.  
  364.         public override void CalculateLayoutInputHorizontal()
  365.         {
  366.             RefreshScale();
  367.         }
  368.  
  369.         public override void CalculateLayoutInputVertical()
  370.         {
  371.             RefreshScale();
  372.         }
  373.  
  374.         #if UNITY_EDITOR
  375.         protected override void OnValidate()
  376.         {
  377.             m_Tracker.Clear();
  378.             RefreshScale();
  379.             base.OnValidate();
  380.             SetLayoutDirty();
  381.  
  382.             updateFontAndText();
  383.         }
  384.         #endif
  385.  
  386.         protected override void OnRectTransformDimensionsChange()
  387.         {
  388.             base.OnRectTransformDimensionsChange();
  389.             RefreshScale();
  390.         }
  391.  
  392.         public override float preferredWidth { get { return size; } }
  393.         public override float minWidth { get { return -1; } }
  394.         public override float flexibleWidth { get { return -1; } }
  395.         public override float preferredHeight { get { return size; } }
  396.         public override float minHeight { get { return -1; } }
  397.         public override float flexibleHeight { get { return -1; } }
  398.     }
  399. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement