/Project/Assets/Scripts/ThirdParty/NGUI/Scripts/Internal/UIGeometry.cs

https://bitbucket.org/adiq94/villageposition · C# · 135 lines · 70 code · 22 blank · 43 comment · 15 complexity · 888e271f9d4dbec94e0068ed7a5c8b14 MD5 · raw file

  1. //----------------------------------------------
  2. // NGUI: Next-Gen UI kit
  3. // Copyright © 2011-2012 Tasharen Entertainment
  4. //----------------------------------------------
  5. using UnityEngine;
  6. using System.Collections.Generic;
  7. /// <summary>
  8. /// Generated geometry class. All widgets have one.
  9. /// This class separates the geometry creation into several steps, making it possible to perform
  10. /// actions selectively depending on what has changed. For example, the widget doesn't need to be
  11. /// rebuilt unless something actually changes, so its geometry can be cached. Likewise, the widget's
  12. /// transformed coordinates only change if the widget's transform moves relative to the panel,
  13. /// so that can be cached as well. In the end, using this class means using more memory, but at
  14. /// the same time it allows for significant performance gains, especially when using widgets that
  15. /// spit out a lot of vertices, such as UILabels.
  16. /// </summary>
  17. public class UIGeometry
  18. {
  19. /// <summary>
  20. /// Widget's vertices (before they get transformed).
  21. /// </summary>
  22. public BetterList<Vector3> verts = new BetterList<Vector3>();
  23. /// <summary>
  24. /// Widget's texture coordinates for the geometry's vertices.
  25. /// </summary>
  26. public BetterList<Vector2> uvs = new BetterList<Vector2>();
  27. /// <summary>
  28. /// Array of colors for the geometry's vertices.
  29. /// </summary>
  30. #if UNITY_3_5_4
  31. public BetterList<Color> cols = new BetterList<Color>();
  32. #else
  33. public BetterList<Color32> cols = new BetterList<Color32>();
  34. #endif
  35. // Relative-to-panel vertices, normal, and tangent
  36. BetterList<Vector3> mRtpVerts = new BetterList<Vector3>();
  37. Vector3 mRtpNormal;
  38. Vector4 mRtpTan;
  39. /// <summary>
  40. /// Whether the geometry contains usable vertices.
  41. /// </summary>
  42. public bool hasVertices { get { return (verts.size > 0); } }
  43. /// <summary>
  44. /// Whether the geometry has usable transformed vertex data.
  45. /// </summary>
  46. public bool hasTransformed { get { return (mRtpVerts != null) && (mRtpVerts.size > 0) && (mRtpVerts.size == verts.size); } }
  47. /// <summary>
  48. /// Step 1: Prepare to fill the buffers -- make them clean and valid.
  49. /// </summary>
  50. public void Clear ()
  51. {
  52. verts.Clear();
  53. uvs.Clear();
  54. cols.Clear();
  55. mRtpVerts.Clear();
  56. }
  57. /// <summary>
  58. /// Step 2: After the buffers have been filled, apply the specified pivot offset to the generated geometry.
  59. /// </summary>
  60. public void ApplyOffset (Vector3 pivotOffset)
  61. {
  62. for (int i = 0; i < verts.size; ++i) verts.buffer[i] += pivotOffset;
  63. }
  64. /// <summary>
  65. /// Step 3: Transform the vertices by the provided matrix.
  66. /// </summary>
  67. public void ApplyTransform (Matrix4x4 widgetToPanel, bool normals)
  68. {
  69. if (verts.size > 0)
  70. {
  71. mRtpVerts.Clear();
  72. for (int i = 0, imax = verts.size; i < imax; ++i) mRtpVerts.Add(widgetToPanel.MultiplyPoint3x4(verts[i]));
  73. // Calculate the widget's normal and tangent
  74. mRtpNormal = widgetToPanel.MultiplyVector(Vector3.back).normalized;
  75. Vector3 tangent = widgetToPanel.MultiplyVector(Vector3.right).normalized;
  76. mRtpTan = new Vector4(tangent.x, tangent.y, tangent.z, -1f);
  77. }
  78. else mRtpVerts.Clear();
  79. }
  80. /// <summary>
  81. /// Step 4: Fill the specified buffer using the transformed values.
  82. /// </summary>
  83. #if UNITY_3_5_4
  84. public void WriteToBuffers (BetterList<Vector3> v, BetterList<Vector2> u, BetterList<Color> c, BetterList<Vector3> n, BetterList<Vector4> t)
  85. #else
  86. public void WriteToBuffers (BetterList<Vector3> v, BetterList<Vector2> u, BetterList<Color32> c, BetterList<Vector3> n, BetterList<Vector4> t)
  87. #endif
  88. {
  89. if (mRtpVerts != null && mRtpVerts.size > 0)
  90. {
  91. if (n == null)
  92. {
  93. for (int i = 0; i < mRtpVerts.size; ++i)
  94. {
  95. v.Add(mRtpVerts.buffer[i]);
  96. u.Add(uvs.buffer[i]);
  97. c.Add(cols.buffer[i]);
  98. }
  99. }
  100. else
  101. {
  102. for (int i = 0; i < mRtpVerts.size; ++i)
  103. {
  104. v.Add(mRtpVerts.buffer[i]);
  105. u.Add(uvs.buffer[i]);
  106. c.Add(cols.buffer[i]);
  107. n.Add(mRtpNormal);
  108. t.Add(mRtpTan);
  109. }
  110. }
  111. }
  112. }
  113. }