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