123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #if UNITY_EDITOR
- using UnityEngine;
- using System.Collections.Generic;
- namespace O3DWB
- {
- public static class ProceduralMeshGeneration
- {
- #region Public Static Properties
- public static float MinAllowedDimensionValue { get { return 1e-5f; } }
- #endregion
- #region Public Static Functions
- public static Mesh CreateXYRectangleMesh(float rectangleWidth, float rectangleHeight, Color rectangleColor)
- {
- if (!ValidateXYRectangleDimensions(rectangleWidth, rectangleHeight)) return null;
- var vertexPositions = Vector3Extensions.Get3DRectangleCircumferencePoints(rectangleWidth, rectangleHeight, Vector3.right, Vector3.up, Vector3.zero);
- var vertexColors = ListExtensions.GetFilledList(rectangleColor, 4);
- var vertexNormals = ListExtensions.GetFilledList(-Vector3.forward, 4);
- var vertexIndices = GenerateXYRectangleVertexIndices();
- return ProceduralMeshFactory.CreateTriangleMesh(vertexPositions.ToArray(), vertexIndices, vertexColors.ToArray(), vertexNormals.ToArray());
- }
- public static Mesh CreateXZRectangleMesh(float rectangleWidth, float rectangleDepth, Color rectangleColor)
- {
- if (!ValidateXYRectangleDimensions(rectangleWidth, rectangleDepth)) return null;
- var vertexPositions = Vector3Extensions.Get3DRectangleCircumferencePoints(rectangleWidth, rectangleDepth, Vector3.right, Vector3.forward, Vector3.zero);
- var vertexColors = ListExtensions.GetFilledList(rectangleColor, 4);
- var vertexNormals = ListExtensions.GetFilledList(Vector3.up, 4);
- var vertexIndices = GenerateXZRectangleVertexIndices();
- return ProceduralMeshFactory.CreateTriangleMesh(vertexPositions.ToArray(), vertexIndices, vertexColors.ToArray(), vertexNormals.ToArray());
- }
- public static Mesh CreateXYCircleMesh(float circleRadius, int numberOfCircleSlices, Color circleColor)
- {
- if (!ValidateXYCircleRadiusAndSlices(circleRadius, numberOfCircleSlices)) return null;
- var vertexPositions = GenerateXYCircleVertexPositions(circleRadius, numberOfCircleSlices);
- var vertexColors = ListExtensions.GetFilledList(circleColor, vertexPositions.Count);
- var vertexNormals = ListExtensions.GetFilledList(-Vector3.forward, vertexPositions.Count);
- var vertexIndices = GenerateXYCircleVertexIndices(numberOfCircleSlices);
- return ProceduralMeshFactory.CreateTriangleMesh(vertexPositions.ToArray(), vertexIndices, vertexColors.ToArray(), vertexNormals.ToArray());
- }
- #endregion
- #region Private Static Functions
- private static bool ValidateXYRectangleDimensions(float rectangleWidth, float rectangleHeight)
- {
- return rectangleWidth >= MinAllowedDimensionValue && rectangleHeight >+ MinAllowedDimensionValue;
- }
- private static int[] GenerateXYRectangleVertexIndices()
- {
- return new int[] { 0, 1, 2, 0, 2, 3 };
- }
- private static int[] GenerateXZRectangleVertexIndices()
- {
- return new int[] { 0, 1, 2, 0, 2, 3 };
- }
- private static bool ValidateXYCircleRadiusAndSlices(float circleRadius, int numberOfCircleSlices)
- {
- return circleRadius >= MinAllowedDimensionValue && numberOfCircleSlices >= 4;
- }
- private static List<Vector3> GenerateXYCircleVertexPositions(float circleRadius, int numberOfCircleSlices)
- {
- int numberOfCircumferenceVerts = numberOfCircleSlices + 1;
- int totalNumberOfVerts = numberOfCircumferenceVerts + 1;
- var vertexPositions = new List<Vector3>(totalNumberOfVerts);
- vertexPositions.Add(Vector3.zero);
- vertexPositions.AddRange(Vector3Extensions.Get3DEllipseCircumferencePoints(circleRadius, circleRadius, Vector3.right, Vector3.up, Vector3.zero, numberOfCircleSlices));
- return vertexPositions;
- }
- private static int[] GenerateXYCircleVertexIndices(int numberOfCircleSlices)
- {
- int numberOfTriangles = numberOfCircleSlices;
- int numberOfVertexIndices = numberOfTriangles * 3;
- var vertexIndices = new int[numberOfVertexIndices];
- for (int triangleIndex = 0; triangleIndex < numberOfTriangles; ++triangleIndex)
- {
- vertexIndices[triangleIndex * 3] = 0;
- vertexIndices[triangleIndex * 3 + 1] = triangleIndex + 1;
- vertexIndices[triangleIndex * 3 + 2] = triangleIndex + 2;
- }
- return vertexIndices;
- }
- #endregion
- }
- }
- #endif
|