private void Create(float radius, float height, bool inverted)
        {
            this.vertices   = new List <Vector3>();
            this.faces      = new List <int>();
            this.topDisk    = new List <Corner>();
            this.bottomDisk = new List <Corner>();
            this.walls      = new List <Corner>();

            CreateDisk(radius, height);
            CreateWalls();

            foreach (Corner corner in this.topDisk)
            {
                corner.AssignVertex(this.vertices);
            }
            foreach (Corner corner in this.bottomDisk)
            {
                corner.AssignVertex(this.vertices);
            }
            foreach (Corner corner in this.walls)
            {
                corner.AssignVertex(this.vertices);
            }

            for (int i = 1; i < this.topDisk.Count - 1; i++)
            {
                MeshUtility.AddTriangle(this.faces, this.topDisk[0].VertexIndex, this.topDisk[i].VertexIndex, this.topDisk[i + 1].VertexIndex, inverted);
                MeshUtility.AddTriangle(this.faces, this.bottomDisk[0].VertexIndex, this.bottomDisk[i].VertexIndex, this.bottomDisk[i + 1].VertexIndex, !inverted);
            }

            MeshUtility.AddTriangle(this.faces, this.topDisk[0].VertexIndex, this.topDisk[this.topDisk.Count - 1].VertexIndex, this.topDisk[1].VertexIndex, inverted);
            MeshUtility.AddTriangle(this.faces, this.bottomDisk[0].VertexIndex, this.bottomDisk[this.bottomDisk.Count - 1].VertexIndex, this.bottomDisk[1].VertexIndex, !inverted);

            int a, b, c, d;

            for (int i = 0; i < this.topDisk.Count - 2; i++)
            {
                a = this.walls[2 * i].VertexIndex;
                b = this.walls[2 * i + 1].VertexIndex;
                c = this.walls[2 * (i + 1)].VertexIndex;
                d = this.walls[2 * (i + 1) + 1].VertexIndex;
                MeshUtility.AddSquare(this.faces, b, d, c, a, inverted);
            }

            a = this.walls[2 * (this.topDisk.Count - 2)].VertexIndex;
            b = this.walls[2 * (this.topDisk.Count - 2) + 1].VertexIndex;
            c = this.walls[0].VertexIndex;
            d = this.walls[1].VertexIndex;
            MeshUtility.AddSquare(this.faces, b, d, c, a, inverted);

            Mesh mesh = new Mesh();

            mesh.vertices  = this.vertices.ToArray();
            mesh.triangles = this.faces.ToArray();
            mesh.RecalculateNormals();
            this.meshFilter.mesh = mesh;
        }