CompassBarMeshModifier.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. namespace CompassNavigatorPro {
  6. public class CompassBarMeshModifier : BaseMeshEffect {
  7. public override void ModifyMesh (VertexHelper vh) {
  8. if (!IsActive () || vh == null || vh.currentVertCount < 1)
  9. return;
  10. const float maxWidth = 50;
  11. Mesh m = new Mesh ();
  12. vh.FillMesh (m);
  13. List<Vector3> positions = new List<Vector3> ();
  14. List<int> tris = new List<int> ();
  15. List<Vector2> uv = new List<Vector2> ();
  16. m.GetVertices (positions);
  17. m.GetTriangles (tris, 0);
  18. m.GetUVs (0, uv);
  19. List<Vector3> newPositions = new List<Vector3> ();
  20. List<int> newTris = new List<int> ();
  21. List<Vector2> newUVs = new List<Vector2> ();
  22. int triCount = tris.Count;
  23. int vertexCount = 0;
  24. for (int t = 0; t < triCount; t += 6) {
  25. int idx0 = tris [t];
  26. int idx1 = tris [t + 1];
  27. int idx2 = tris [t + 2];
  28. int idx3 = tris [t + 4];
  29. Vector3 p0 = positions [idx0];
  30. Vector3 p1 = positions [idx1];
  31. Vector3 p2 = positions [idx2];
  32. Vector3 p3 = positions [idx3];
  33. if (p0.x == p3.x || p0.y == p1.y) {
  34. continue;
  35. }
  36. Vector2 uv0 = uv [idx0];
  37. Vector2 uv1 = uv [idx1];
  38. Vector2 uv2 = uv [idx2];
  39. Vector2 uv3 = uv [idx3];
  40. float width = p3.x - p0.x;
  41. float uvWidth = uv3.x - uv0.x;
  42. int divisions = (int)(width / maxWidth);
  43. float segmentWidth = width / (divisions + 1);
  44. float uvSegmentWidth = uvWidth / (divisions + 1);
  45. for (int k = 0; k < divisions; k++) {
  46. float midX = p0.x + segmentWidth;
  47. float midUV = uv0.x + uvSegmentWidth;
  48. Vector3 midPositionTop = new Vector3 (midX, p1.y, 0);
  49. Vector2 midUVTop = new Vector2 (midUV, uv1.y);
  50. Vector3 midPositionBottom = new Vector3 (midX, p0.y, 0);
  51. Vector2 midUVBottom = new Vector2 (midUV, uv0.y);
  52. newPositions.Add (p0);
  53. newPositions.Add (p1);
  54. newPositions.Add (midPositionTop);
  55. newPositions.Add (midPositionBottom);
  56. newUVs.Add (uv0);
  57. newUVs.Add (uv1);
  58. newUVs.Add (midUVTop);
  59. newUVs.Add (midUVBottom);
  60. // 1st triangle
  61. newTris.Add (vertexCount);
  62. newTris.Add (vertexCount + 1);
  63. newTris.Add (vertexCount + 2);
  64. // 2nd triangle
  65. newTris.Add (vertexCount);
  66. newTris.Add (vertexCount + 2);
  67. newTris.Add (vertexCount + 3);
  68. vertexCount += 4;
  69. p0 = midPositionBottom;
  70. p1 = midPositionTop;
  71. uv0 = midUVBottom;
  72. uv1 = midUVTop;
  73. }
  74. // Add last quad
  75. newPositions.Add (p0);
  76. newPositions.Add (p1);
  77. newPositions.Add (p2);
  78. newPositions.Add (p3);
  79. newUVs.Add (uv0);
  80. newUVs.Add (uv1);
  81. newUVs.Add (uv2);
  82. newUVs.Add (uv3);
  83. // 1st triangle
  84. newTris.Add (vertexCount);
  85. newTris.Add (vertexCount + 1);
  86. newTris.Add (vertexCount + 2);
  87. // 2nd triangle
  88. newTris.Add (vertexCount);
  89. newTris.Add (vertexCount + 2);
  90. newTris.Add (vertexCount + 3);
  91. vertexCount += 4;
  92. }
  93. int newPositionsCount = newPositions.Count;
  94. List<UIVertex> newVertices = new List<UIVertex> (newPositionsCount);
  95. UIVertex vx = new UIVertex ();
  96. vh.PopulateUIVertex (ref vx, 0);
  97. for (int k = 0; k < newPositionsCount; k++) {
  98. vx.position = newPositions [k];
  99. vx.uv0 = newUVs [k];
  100. newVertices.Add (vx);
  101. }
  102. vh.Clear ();
  103. vh.AddUIVertexStream (newVertices, newTris);
  104. }
  105. }
  106. }