Skip to content
Snippets Groups Projects
TorusGenerator.cs 2.58 KiB
Newer Older
  • Learn to ignore specific revisions
  • using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System.Linq;
    using System;
    
    public class TorusGenerator : ShapeGenerator
    {
        #region InspectorVariables
        [Header("Torus values")]
        [Range(0, 100)] public float torusRadius = 1f;
        [Range(0, 10)]  public float ringRadius = 0.1f;
    
        [Header("Technical")]
        [Range(8, 150)] public int ringSegmentCount = 50;
        [Range(3, 100)] public int segmentSideCount = 30;
    
        [Header("Parts")]
        public MeshFilter torusMesh;
        #endregion InspectorVariables
    
        #region Implementation
        protected override void GenerateShape()
        {
            if (torusMesh.sharedMesh != null)
                torusMesh.sharedMesh.Clear();
            torusMesh.mesh = CreateMesh(CreateTorus(torusRadius, ringRadius, ringSegmentCount, segmentSideCount));
        }
    
        private static (Vector3[] vertices, int[] triangles) CreateTorus(float torusRadius, float ringRadius, int ringSegmentCount, int segmentSideCount)
        {
            Vector3[] vertices = new Vector3[ringSegmentCount * segmentSideCount * 4];
            int[] triangles = new int[ringSegmentCount * segmentSideCount * 6];
    
            //generate vertices
            float iStep = (2f * Mathf.PI) / ringSegmentCount;
            float jStep = (2f * Mathf.PI) / segmentSideCount;
            for (int i = 0; i < ringSegmentCount; i++)
            {
                for (int j = 0; j < segmentSideCount; j++)
                {
                    vertices[(i * segmentSideCount + j) * 4]     = GetPointOnTorus(torusRadius, ringRadius, i * iStep, j * jStep);
                    vertices[(i * segmentSideCount + j) * 4 + 1] = GetPointOnTorus(torusRadius, ringRadius, i * iStep, (j + 1) * jStep);
                    vertices[(i * segmentSideCount + j) * 4 + 2] = GetPointOnTorus(torusRadius, ringRadius, (i + 1) * iStep, j * jStep);
                    vertices[(i * segmentSideCount + j) * 4 + 3] = GetPointOnTorus(torusRadius, ringRadius, (i + 1) * iStep, (j + 1) * jStep);
                }
            }
    
            //generate triangles
            for (int t = 0, i = 0; t < triangles.Length; t += 6, i += 4)
            {
                triangles[t]   = i;
                triangles[t+1] = i + 1;
                triangles[t+2] = i + 2;
    
                triangles[t+3] = i + 1;
                triangles[t+4] = i + 3;
                triangles[t+5] = i + 2;
            }
    
            return (vertices, triangles);
        }
    
        private static Vector3 GetPointOnTorus(float torusRadius, float ringRadius, float u, float v)
        {
            float r = (torusRadius + ringRadius * Mathf.Sin(v));
            return new Vector3(r * Mathf.Sin(u), ringRadius * Mathf.Cos(v), r * Mathf.Cos(u));
        }
        #endregion Implementation
    }