diff --git a/Assets/Scripts/MeshGenerator/CircleGenerator.cs b/Assets/Scripts/MeshGenerator/CircleGenerator.cs index a7ae73621c7c1814f3649ef3cb920c7d952baede..34dd152c59c69f8486739673340754355b2f41de 100644 --- a/Assets/Scripts/MeshGenerator/CircleGenerator.cs +++ b/Assets/Scripts/MeshGenerator/CircleGenerator.cs @@ -21,11 +21,34 @@ public class CircleGenerator : ShapeGenerator #region Implementation protected override void GenerateShape() { - Vector3[] circle = GetCirclePoints(radius, sideCount, Vector3.zero); + var circle = CreateCircle(radius, sideCount); if (circleMesh.sharedMesh != null) circleMesh.sharedMesh.Clear(); - circleMesh.mesh = CreateMesh(CreatePlane(circle)); + circleMesh.mesh = CreateMesh(circle); + + if (circleMesh.transform.TryGetComponent(out MeshCollider meshCol)) + meshCol.sharedMesh = circleMesh.sharedMesh; + } + + /// <summary> + /// Creates circle vertecies and triangles around the midPoint at (0,0,0) + /// </summary> + /// <param name="points"></param> + /// <param name="invert"></param> + /// <returns></returns> + static (Vector3[], int[]) CreateCircle(float radius, int sideCount, bool invert = false) + { + Vector3[] vertices = GetCirclePoints(radius, sideCount).Union(new Vector3[] { Vector3.zero }).ToArray(); + int[] triangles = new int[(vertices.Length - 1) * 3]; + int vertLen = vertices.Length; + for (int i = 0; i < vertLen-1; i++) + { + triangles[i * 3 + 0] = vertLen-1; // midPoint + triangles[i * 3 + 1] = i; + triangles[i * 3 + 2] = (i + 1) % (vertLen-1); + } + return (vertices, invert ? triangles.Reverse().ToArray() : triangles); } #endregion Implementation } diff --git a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs index 95df89967b37667505a2d157decf2a8c03b7c6f5..7bcddfc85be4f0d415d98016f6bc46114129cb28 100644 --- a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs +++ b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs @@ -33,6 +33,12 @@ protected static Vector3[] GetCirclePoints(float circleRadius, int pointCount, V return circle; } + /// <summary> + /// Creates triangles for a set of vertecies of a flat, convex shape + /// </summary> + /// <param name="points"></param> + /// <param name="invert"></param> + /// <returns></returns> protected static (Vector3[], int[]) CreatePlane(Vector3[] points, bool invert = false) { Vector3[] vertices = points;