// creation
        public static EdgeLoop CreateEdgeLoop(ref int baseID, bool isClosed, int segmentCount)
        {
            EdgeLoop newLoop = new EdgeLoop()
            {
                IsClosed     = true,
                VertCount    = segmentCount,
                VertexBaseID = baseID
            };

            baseID += segmentCount;

            return(newLoop);
        }
        public static EdgeBridge CreateExtrustion(ref int baseID, EdgeLoop loopA, EdgeLoop loopB)
        {
            EdgeBridge bridge = new EdgeBridge()
            {
                LoopA          = loopA,
                LoopB          = loopB,
                TriangleBaseID = baseID
            };

            baseID += bridge.GetTriangleIndexCount();

            return(bridge);
        }
        // visualization
        public static void DrawEdgeLoopGizmo(Vector3[] verts, EdgeLoop loop)
        {
            for (int i = 0; i < loop.VertCount; i++)
            {
                int currentIndex = loop.VertexBaseID + i;
                int nextIndex    = currentIndex + 1;

                if (loop.IsClosed && i == (loop.VertCount - 1))
                {
                    nextIndex = loop.VertexBaseID;
                }

                Vector3 currentVert, nextVert;
                currentVert = verts[currentIndex];
                nextVert    = verts[nextIndex];

                Gizmos.DrawLine(currentVert, nextVert);
            }
        }
        void GenerateMesh()
        {
            int baseID = 0;

            backLoop = ModelUtils.CreateEdgeLoop(ref baseID, closeLoop,
                                                 edgeLoopVertCount);

            frontLoop = ModelUtils.CreateEdgeLoop(ref baseID, closeLoop,
                                                  edgeLoopVertCount);

            vertices = new Vector3[backLoop.VertCount + frontLoop.VertCount];

            SetVertices();

            int triangleBaseID = 0;

            backFrontBridge = ModelUtils.CreateExtrustion(ref triangleBaseID,
                                                          frontLoop, backLoop);

            triangles = new int[backFrontBridge.GetTriangleIndexCount()];
            backFrontBridge.TriangulateBridge(ref triangles, false);
        }