MeshUtility.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using UnityEngine;
  6. namespace SplineMesh {
  7. public class MeshUtility {
  8. /// <summary>
  9. /// Returns a mesh with reserved triangles to turn back the face culling.
  10. /// This is usefull when a mesh needs to have a negative scale.
  11. /// </summary>
  12. /// <param name="mesh"></param>
  13. /// <returns></returns>
  14. public static int[] GetReversedTriangles(Mesh mesh) {
  15. var res = mesh.triangles.ToArray();
  16. var triangleCount = res.Length / 3;
  17. for (var i = 0; i < triangleCount; i++) {
  18. var tmp = res[i * 3];
  19. res[i * 3] = res[i * 3 + 1];
  20. res[i * 3 + 1] = tmp;
  21. }
  22. return res;
  23. }
  24. /// <summary>
  25. /// Returns a mesh similar to the given source plus given optionnal parameters.
  26. /// </summary>
  27. /// <param name="mesh"></param>
  28. /// <param name="source"></param>
  29. /// <param name="triangles"></param>
  30. /// <param name="vertices"></param>
  31. /// <param name="normals"></param>
  32. /// <param name="uv"></param>
  33. /// <param name="uv2"></param>
  34. /// <param name="uv3"></param>
  35. /// <param name="uv4"></param>
  36. /// <param name="uv5"></param>
  37. /// <param name="uv6"></param>
  38. /// <param name="uv7"></param>
  39. /// <param name="uv8"></param>
  40. public static void Update(Mesh mesh,
  41. Mesh source,
  42. IEnumerable<int> triangles = null,
  43. IEnumerable<Vector3> vertices = null,
  44. IEnumerable<Vector3> normals = null,
  45. IEnumerable<Vector2> uv = null,
  46. IEnumerable<Vector2> uv2 = null,
  47. IEnumerable<Vector2> uv3 = null,
  48. IEnumerable<Vector2> uv4 = null,
  49. IEnumerable<Vector2> uv5 = null,
  50. IEnumerable<Vector2> uv6 = null,
  51. IEnumerable<Vector2> uv7 = null,
  52. IEnumerable<Vector2> uv8 = null) {
  53. mesh.hideFlags = source.hideFlags;
  54. #if UNITY_2017_3_OR_NEWER
  55. mesh.indexFormat = source.indexFormat;
  56. #endif
  57. mesh.triangles = new int[0];
  58. mesh.vertices = vertices == null ? source.vertices : vertices.ToArray();
  59. mesh.normals = normals == null ? source.normals : normals.ToArray();
  60. mesh.uv = uv == null? source.uv : uv.ToArray();
  61. mesh.uv2 = uv2 == null ? source.uv2 : uv2.ToArray();
  62. mesh.uv3 = uv3 == null ? source.uv3 : uv3.ToArray();
  63. mesh.uv4 = uv4 == null ? source.uv4 : uv4.ToArray();
  64. #if UNITY_2018_2_OR_NEWER
  65. mesh.uv5 = uv5 == null ? source.uv5 : uv5.ToArray();
  66. mesh.uv6 = uv6 == null ? source.uv6 : uv6.ToArray();
  67. mesh.uv7 = uv7 == null ? source.uv7 : uv7.ToArray();
  68. mesh.uv8 = uv8 == null ? source.uv8 : uv8.ToArray();
  69. #endif
  70. mesh.triangles = triangles == null ? source.triangles : triangles.ToArray();
  71. mesh.RecalculateBounds();
  72. mesh.RecalculateTangents();
  73. }
  74. }
  75. }