From a839f200d97af8debf4afd5278b428f050d32b95 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tobias=20Sch=C3=B6ner?= <tobias.stonehead@gmail.com>
Date: Fri, 10 Jun 2022 11:14:21 +0200
Subject: [PATCH] Improved CircleGenerator

CircleGenerator now generates triangles around midPoint instead of using CreatePlane of ShapeGenerator
---
 .../Scripts/MeshGenerator/CircleGenerator.cs  | 27 +++++++++++++++++--
 .../Scripts/MeshGenerator/ShapeGenerator.cs   |  6 +++++
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/Assets/Scripts/MeshGenerator/CircleGenerator.cs b/Assets/Scripts/MeshGenerator/CircleGenerator.cs
index a7ae7362..34dd152c 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 95df8996..7bcddfc8 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;
-- 
GitLab