From 867ef8d05815a60209b22af3cf995df537552530 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tobias=20Sch=C3=B6ner?= <tobias.stonehead@gmail.com>
Date: Tue, 21 Feb 2023 18:03:40 +0100
Subject: [PATCH] refactor: simplify ShapeGenerator mesh assignment

---
 .../Scripts/MeshGenerator/CircleGenerator.cs  |  9 +--------
 Assets/Scripts/MeshGenerator/ConeGenerator.cs | 19 +++----------------
 .../Scripts/MeshGenerator/ShapeGenerator.cs   | 14 ++++++++++++--
 .../Scripts/MeshGenerator/TorusGenerator.cs   |  7 +------
 4 files changed, 17 insertions(+), 32 deletions(-)

diff --git a/Assets/Scripts/MeshGenerator/CircleGenerator.cs b/Assets/Scripts/MeshGenerator/CircleGenerator.cs
index 58c30285..4eed28f0 100644
--- a/Assets/Scripts/MeshGenerator/CircleGenerator.cs
+++ b/Assets/Scripts/MeshGenerator/CircleGenerator.cs
@@ -20,14 +20,7 @@ public class CircleGenerator : ShapeGenerator
     #region Implementation
     protected override void GenerateShape()
     {
-        var circle = CreateCircle(radius, sideCount);
-
-        if (circleMesh.sharedMesh != null)
-            circleMesh.sharedMesh.Clear();
-        circleMesh.mesh = CreateMesh(circle);
-
-        if (circleMesh.transform.TryGetComponent(out MeshCollider meshCol))
-            meshCol.sharedMesh = circleMesh.sharedMesh;
+        AssignMesh(circleMesh, CreateCircle(radius, sideCount));
     }
 
     /// <summary>
diff --git a/Assets/Scripts/MeshGenerator/ConeGenerator.cs b/Assets/Scripts/MeshGenerator/ConeGenerator.cs
index 717cd56f..cbbd01e4 100644
--- a/Assets/Scripts/MeshGenerator/ConeGenerator.cs
+++ b/Assets/Scripts/MeshGenerator/ConeGenerator.cs
@@ -29,22 +29,9 @@ protected override void GenerateShape()
         Vector3[] bottomCircle = GetCirclePoints(bottomRadius, sideCount);
         Vector3[] topCircle = GetCirclePoints(topRadius, sideCount, topPosition);
 
-        //side
-        if (sideMesh.sharedMesh != null)
-            sideMesh.sharedMesh.Clear();
-        sideMesh.mesh = CreateMesh(CreateConeSide(sideCount, bottomCircle, topCircle));
-
-        //top
-        if (topMesh.sharedMesh != null)
-            topMesh.sharedMesh.Clear();
-        if (generateTop)
-            topMesh.mesh = CreateMesh(CreatePlane(topCircle, false));
-
-        //bottom
-        if (bottomMesh.sharedMesh != null)
-            bottomMesh.sharedMesh.Clear();
-        if (generateBottom)
-            bottomMesh.mesh = CreateMesh(CreatePlane(bottomCircle, true));
+        AssignMesh(sideMesh, CreateConeSide(sideCount, bottomCircle, topCircle));
+        AssignMesh(topMesh, generateTop ? CreatePlane(topCircle, false) : null);
+        AssignMesh(bottomMesh, generateBottom ? CreatePlane(bottomCircle, true) : null);
     }
 
     private static (Vector3[], int[]) CreateConeSide(int sideCount, Vector3[] bottomCircle, Vector3[] topCircle)
diff --git a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
index 7bcddfc8..619c6575 100644
--- a/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
+++ b/Assets/Scripts/MeshGenerator/ShapeGenerator.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Linq;
 using UnityEngine;
 
@@ -12,9 +13,18 @@ public abstract class ShapeGenerator : MonoBehaviour
     protected abstract void GenerateShape();
 
     #region Helper
-    protected static Mesh CreateMesh((Vector3[] vertices, int[] triangles) meshValues)
+    protected static void AssignMesh(MeshFilter meshFilter, (Vector3[] vertices, int[] triangles)? meshValues)
     {
-        Mesh mesh = new Mesh();
+        if (meshFilter.sharedMesh != null)
+            meshFilter.sharedMesh.Clear();
+        if (meshValues is (Vector3[], int[]) _mv)
+            meshFilter.mesh = CreateMesh(_mv);
+        if (meshFilter.transform.TryGetComponent(out MeshCollider meshCol))
+            meshCol.sharedMesh = meshFilter.sharedMesh;
+    }
+    private static Mesh CreateMesh((Vector3[] vertices, int[] triangles) meshValues)
+    {
+        Mesh mesh = new();
         (mesh.vertices, mesh.triangles) = (meshValues.vertices, meshValues.triangles);
         mesh.RecalculateNormals(); //fix lighting
         return mesh;
diff --git a/Assets/Scripts/MeshGenerator/TorusGenerator.cs b/Assets/Scripts/MeshGenerator/TorusGenerator.cs
index 95ef7746..f867a1a5 100644
--- a/Assets/Scripts/MeshGenerator/TorusGenerator.cs
+++ b/Assets/Scripts/MeshGenerator/TorusGenerator.cs
@@ -22,12 +22,7 @@ public class TorusGenerator : ShapeGenerator
     #region Implementation
     protected override void GenerateShape()
     {
-        if (torusMesh.sharedMesh != null)
-            torusMesh.sharedMesh.Clear();
-        torusMesh.mesh = CreateMesh(CreateTorus(torusRadius, ringRadius, ringSegmentCount, segmentSideCount));
-
-        if (torusMesh.transform.TryGetComponent(out MeshCollider meshCol))
-            meshCol.sharedMesh = torusMesh.sharedMesh;
+        AssignMesh(torusMesh, CreateTorus(torusRadius, ringRadius, ringSegmentCount, segmentSideCount));
     }
 
     private static (Vector3[] vertices, int[] triangles) CreateTorus(float torusRadius, float ringRadius, int ringSegmentCount, int segmentSideCount)
-- 
GitLab