World_Mesh.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /*
  2. ------------------- Code Monkey -------------------
  3. Thank you for downloading the Code Monkey Utilities
  4. I hope you find them useful in your projects
  5. If you have any questions use the contact form
  6. Cheers!
  7. unitycodemonkey.com
  8. --------------------------------------------------
  9. */
  10. using UnityEngine;
  11. namespace CodeMonkey.Utils {
  12. /*
  13. * Mesh in the World
  14. * */
  15. public class World_Mesh {
  16. private const int sortingOrderDefault = 5000;
  17. public GameObject gameObject;
  18. public Transform transform;
  19. private Material material;
  20. private Vector3[] vertices;
  21. private Vector2[] uv;
  22. private int[] triangles;
  23. private Mesh mesh;
  24. public static World_Mesh CreateEmpty(Vector3 position, float eulerZ, Material material, int sortingOrderOffset = 0) {
  25. return new World_Mesh(null, position, Vector3.one, eulerZ, material, new Vector3[0], new Vector2[0], new int[0], sortingOrderOffset);
  26. }
  27. public static World_Mesh Create(Vector3 position, float eulerZ, Material material, Vector3[] vertices, Vector2[] uv, int[] triangles, int sortingOrderOffset = 0) {
  28. return new World_Mesh(null, position, Vector3.one, eulerZ, material, vertices, uv, triangles, sortingOrderOffset);
  29. }
  30. public static World_Mesh Create(Vector3 position, float eulerZ, float meshWidth, float meshHeight, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) {
  31. return new World_Mesh(null, position, Vector3.one, eulerZ, meshWidth, meshHeight, material, uvCoords, sortingOrderOffset);
  32. }
  33. public static World_Mesh Create(Vector3 lowerLeftCorner, float width, float height, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) {
  34. return Create(lowerLeftCorner, lowerLeftCorner + new Vector3(width, height), material, uvCoords, sortingOrderOffset);
  35. }
  36. public static World_Mesh Create(Vector3 lowerLeftCorner, Vector3 upperRightCorner, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) {
  37. float width = upperRightCorner.x - lowerLeftCorner.x;
  38. float height = upperRightCorner.y - lowerLeftCorner.y;
  39. Vector3 localScale = upperRightCorner - lowerLeftCorner;
  40. Vector3 position = lowerLeftCorner + localScale * .5f;
  41. return new World_Mesh(null, position, Vector3.one, 0f, width, height, material, uvCoords, sortingOrderOffset);
  42. }
  43. private static int GetSortingOrder(Vector3 position, int offset, int baseSortingOrder = sortingOrderDefault) {
  44. return (int)(baseSortingOrder - position.y) + offset;
  45. }
  46. public class UVCoords {
  47. public int x, y, width, height;
  48. public UVCoords(int x, int y, int width, int height) {
  49. this.x = x;
  50. this.y = y;
  51. this.width = width;
  52. this.height = height;
  53. }
  54. }
  55. public World_Mesh(Transform parent, Vector3 localPosition, Vector3 localScale, float eulerZ, float meshWidth, float meshHeight, Material material, UVCoords uvCoords, int sortingOrderOffset) {
  56. this.material = material;
  57. vertices = new Vector3[4];
  58. uv = new Vector2[4];
  59. triangles = new int[6];
  60. /* 0,1
  61. * 1,1
  62. * 0,0
  63. * 1,0
  64. */
  65. float meshWidthHalf = meshWidth / 2f;
  66. float meshHeightHalf = meshHeight / 2f;
  67. vertices[0] = new Vector3(-meshWidthHalf, meshHeightHalf);
  68. vertices[1] = new Vector3( meshWidthHalf, meshHeightHalf);
  69. vertices[2] = new Vector3(-meshWidthHalf, -meshHeightHalf);
  70. vertices[3] = new Vector3( meshWidthHalf, -meshHeightHalf);
  71. if (uvCoords == null) {
  72. uvCoords = new UVCoords(0, 0, material.mainTexture.width, material.mainTexture.height);
  73. }
  74. Vector2[] uvArray = GetUVRectangleFromPixels(uvCoords.x, uvCoords.y, uvCoords.width, uvCoords.height, material.mainTexture.width, material.mainTexture.height);
  75. ApplyUVToUVArray(uvArray, ref uv);
  76. triangles[0] = 0;
  77. triangles[1] = 1;
  78. triangles[2] = 2;
  79. triangles[3] = 2;
  80. triangles[4] = 1;
  81. triangles[5] = 3;
  82. mesh = new Mesh();
  83. mesh.vertices = vertices;
  84. mesh.uv = uv;
  85. mesh.triangles = triangles;
  86. gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer));
  87. gameObject.transform.parent = parent;
  88. gameObject.transform.localPosition = localPosition;
  89. gameObject.transform.localScale = localScale;
  90. gameObject.transform.localEulerAngles = new Vector3(0, 0, eulerZ);
  91. gameObject.GetComponent<MeshFilter>().mesh = mesh;
  92. gameObject.GetComponent<MeshRenderer>().material = material;
  93. transform = gameObject.transform;
  94. SetSortingOrderOffset(sortingOrderOffset);
  95. }
  96. public World_Mesh(Transform parent, Vector3 localPosition, Vector3 localScale, float eulerZ, Material material, Vector3[] vertices, Vector2[] uv, int[] triangles, int sortingOrderOffset) {
  97. this.material = material;
  98. this.vertices = vertices;
  99. this.uv = uv;
  100. this.triangles = triangles;
  101. mesh = new Mesh();
  102. mesh.vertices = vertices;
  103. mesh.uv = uv;
  104. mesh.triangles = triangles;
  105. gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer));
  106. gameObject.transform.parent = parent;
  107. gameObject.transform.localPosition = localPosition;
  108. gameObject.transform.localScale = localScale;
  109. gameObject.transform.localEulerAngles = new Vector3(0, 0, eulerZ);
  110. gameObject.GetComponent<MeshFilter>().mesh = mesh;
  111. gameObject.GetComponent<MeshRenderer>().material = material;
  112. transform = gameObject.transform;
  113. SetSortingOrderOffset(sortingOrderOffset);
  114. }
  115. private Vector2 ConvertPixelsToUVCoordinates(int x, int y, int textureWidth, int textureHeight) {
  116. return new Vector2((float)x / textureWidth, (float)y / textureHeight);
  117. }
  118. private Vector2[] GetUVRectangleFromPixels(int x, int y, int width, int height, int textureWidth, int textureHeight) {
  119. /* 0, 1
  120. * 1, 1
  121. * 0, 0
  122. * 1, 0
  123. * */
  124. return new Vector2[] {
  125. ConvertPixelsToUVCoordinates(x, y + height, textureWidth, textureHeight),
  126. ConvertPixelsToUVCoordinates(x + width, y + height, textureWidth, textureHeight),
  127. ConvertPixelsToUVCoordinates(x, y, textureWidth, textureHeight),
  128. ConvertPixelsToUVCoordinates(x + width, y, textureWidth, textureHeight)
  129. };
  130. }
  131. private void ApplyUVToUVArray(Vector2[] uv, ref Vector2[] mainUV) {
  132. if (uv == null || uv.Length < 4 || mainUV == null || mainUV.Length < 4) throw new System.Exception();
  133. mainUV[0] = uv[0];
  134. mainUV[1] = uv[1];
  135. mainUV[2] = uv[2];
  136. mainUV[3] = uv[3];
  137. }
  138. public void SetUVCoords(UVCoords uvCoords) {
  139. Vector2[] uvArray = GetUVRectangleFromPixels(uvCoords.x, uvCoords.y, uvCoords.width, uvCoords.height, material.mainTexture.width, material.mainTexture.height);
  140. ApplyUVToUVArray(uvArray, ref uv);
  141. mesh.uv = uv;
  142. }
  143. public void SetSortingOrderOffset(int sortingOrderOffset) {
  144. SetSortingOrder(GetSortingOrder(gameObject.transform.position, sortingOrderOffset));
  145. }
  146. public void SetSortingOrder(int sortingOrder) {
  147. gameObject.GetComponent<Renderer>().sortingOrder = sortingOrder;
  148. }
  149. public void SetLocalScale(Vector3 localScale) {
  150. transform.localScale = localScale;
  151. }
  152. public void SetPosition(Vector3 localPosition) {
  153. transform.localPosition = localPosition;
  154. }
  155. public void AddPosition(Vector3 addPosition) {
  156. transform.localPosition += addPosition;
  157. }
  158. public Vector3 GetPosition() {
  159. return transform.localPosition;
  160. }
  161. public int GetSortingOrder() {
  162. return gameObject.GetComponent<Renderer>().sortingOrder;
  163. }
  164. public Mesh GetMesh() {
  165. return mesh;
  166. }
  167. public void Show() {
  168. gameObject.SetActive(true);
  169. }
  170. public void Hide() {
  171. gameObject.SetActive(false);
  172. }
  173. public void DestroySelf() {
  174. Object.Destroy(gameObject);
  175. }
  176. public static void CreateMesh() {
  177. }
  178. }
  179. }