ProceduralMeshGeneration.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #if UNITY_EDITOR
  2. using UnityEngine;
  3. using System.Collections.Generic;
  4. namespace O3DWB
  5. {
  6. public static class ProceduralMeshGeneration
  7. {
  8. #region Public Static Properties
  9. public static float MinAllowedDimensionValue { get { return 1e-5f; } }
  10. #endregion
  11. #region Public Static Functions
  12. public static Mesh CreateXYRectangleMesh(float rectangleWidth, float rectangleHeight, Color rectangleColor)
  13. {
  14. if (!ValidateXYRectangleDimensions(rectangleWidth, rectangleHeight)) return null;
  15. var vertexPositions = Vector3Extensions.Get3DRectangleCircumferencePoints(rectangleWidth, rectangleHeight, Vector3.right, Vector3.up, Vector3.zero);
  16. var vertexColors = ListExtensions.GetFilledList(rectangleColor, 4);
  17. var vertexNormals = ListExtensions.GetFilledList(-Vector3.forward, 4);
  18. var vertexIndices = GenerateXYRectangleVertexIndices();
  19. return ProceduralMeshFactory.CreateTriangleMesh(vertexPositions.ToArray(), vertexIndices, vertexColors.ToArray(), vertexNormals.ToArray());
  20. }
  21. public static Mesh CreateXZRectangleMesh(float rectangleWidth, float rectangleDepth, Color rectangleColor)
  22. {
  23. if (!ValidateXYRectangleDimensions(rectangleWidth, rectangleDepth)) return null;
  24. var vertexPositions = Vector3Extensions.Get3DRectangleCircumferencePoints(rectangleWidth, rectangleDepth, Vector3.right, Vector3.forward, Vector3.zero);
  25. var vertexColors = ListExtensions.GetFilledList(rectangleColor, 4);
  26. var vertexNormals = ListExtensions.GetFilledList(Vector3.up, 4);
  27. var vertexIndices = GenerateXZRectangleVertexIndices();
  28. return ProceduralMeshFactory.CreateTriangleMesh(vertexPositions.ToArray(), vertexIndices, vertexColors.ToArray(), vertexNormals.ToArray());
  29. }
  30. public static Mesh CreateXYCircleMesh(float circleRadius, int numberOfCircleSlices, Color circleColor)
  31. {
  32. if (!ValidateXYCircleRadiusAndSlices(circleRadius, numberOfCircleSlices)) return null;
  33. var vertexPositions = GenerateXYCircleVertexPositions(circleRadius, numberOfCircleSlices);
  34. var vertexColors = ListExtensions.GetFilledList(circleColor, vertexPositions.Count);
  35. var vertexNormals = ListExtensions.GetFilledList(-Vector3.forward, vertexPositions.Count);
  36. var vertexIndices = GenerateXYCircleVertexIndices(numberOfCircleSlices);
  37. return ProceduralMeshFactory.CreateTriangleMesh(vertexPositions.ToArray(), vertexIndices, vertexColors.ToArray(), vertexNormals.ToArray());
  38. }
  39. #endregion
  40. #region Private Static Functions
  41. private static bool ValidateXYRectangleDimensions(float rectangleWidth, float rectangleHeight)
  42. {
  43. return rectangleWidth >= MinAllowedDimensionValue && rectangleHeight >+ MinAllowedDimensionValue;
  44. }
  45. private static int[] GenerateXYRectangleVertexIndices()
  46. {
  47. return new int[] { 0, 1, 2, 0, 2, 3 };
  48. }
  49. private static int[] GenerateXZRectangleVertexIndices()
  50. {
  51. return new int[] { 0, 1, 2, 0, 2, 3 };
  52. }
  53. private static bool ValidateXYCircleRadiusAndSlices(float circleRadius, int numberOfCircleSlices)
  54. {
  55. return circleRadius >= MinAllowedDimensionValue && numberOfCircleSlices >= 4;
  56. }
  57. private static List<Vector3> GenerateXYCircleVertexPositions(float circleRadius, int numberOfCircleSlices)
  58. {
  59. int numberOfCircumferenceVerts = numberOfCircleSlices + 1;
  60. int totalNumberOfVerts = numberOfCircumferenceVerts + 1;
  61. var vertexPositions = new List<Vector3>(totalNumberOfVerts);
  62. vertexPositions.Add(Vector3.zero);
  63. vertexPositions.AddRange(Vector3Extensions.Get3DEllipseCircumferencePoints(circleRadius, circleRadius, Vector3.right, Vector3.up, Vector3.zero, numberOfCircleSlices));
  64. return vertexPositions;
  65. }
  66. private static int[] GenerateXYCircleVertexIndices(int numberOfCircleSlices)
  67. {
  68. int numberOfTriangles = numberOfCircleSlices;
  69. int numberOfVertexIndices = numberOfTriangles * 3;
  70. var vertexIndices = new int[numberOfVertexIndices];
  71. for (int triangleIndex = 0; triangleIndex < numberOfTriangles; ++triangleIndex)
  72. {
  73. vertexIndices[triangleIndex * 3] = 0;
  74. vertexIndices[triangleIndex * 3 + 1] = triangleIndex + 1;
  75. vertexIndices[triangleIndex * 3 + 2] = triangleIndex + 2;
  76. }
  77. return vertexIndices;
  78. }
  79. #endregion
  80. }
  81. }
  82. #endif