/* Triangulate Edge Terraces */
        private void TriangulateEdgeTerraces(Vector3 beginLeft, Vector3 beginRight, HexCell beginCell, Vector3 endLeft, Vector3 endRight, HexCell endCell)
        {
            Vector3 v3 = HexMeshUtility.TerraceLerp(beginLeft, endLeft, 1);
            Vector3 v4 = HexMeshUtility.TerraceLerp(beginRight, endRight, 1);

            Color c2;


            if (HexMeshUtility.UseTextures)
            {
                c2 = HexMeshUtility.TerraceLerp(m_red, m_green, 1);
                m_terrainMesh.AddQuadColor(m_red, c2);
                AddQuadType(beginCell.TerrainTypeIndex, endCell.TerrainTypeIndex);
            }
            else
            {
                c2 = HexMeshUtility.TerraceLerp(beginCell.Color, endCell.Color, 1);
                m_terrainMesh.AddQuadColor(beginCell.Color, c2);
            }

            m_terrainMesh.AddQuad(beginLeft, beginRight, v3, v4);


            for (int i = 2; i < HexMeshUtility.TerraceSteps; i++)
            {
                Vector3 v1 = v3;
                Vector3 v2 = v4;
                Color   c1 = c2;
                v3 = HexMeshUtility.TerraceLerp(beginLeft, endLeft, i);
                v4 = HexMeshUtility.TerraceLerp(beginRight, endRight, i);
                if (HexMeshUtility.UseTextures)
                {
                    c2 = HexMeshUtility.TerraceLerp(m_red, m_green, i);
                    AddQuadType(beginCell.TerrainTypeIndex, endCell.TerrainTypeIndex);
                }
                else
                {
                    c2 = HexMeshUtility.TerraceLerp(beginCell.Color, endCell.Color, i);
                }

                m_terrainMesh.AddQuad(v1, v2, v3, v4);
                m_terrainMesh.AddQuadColor(c1, c2);
            }



            if (HexMeshUtility.UseTextures)
            {
                m_terrainMesh.AddQuadColor(c2, m_green);
                AddQuadType(beginCell.TerrainTypeIndex, endCell.TerrainTypeIndex);
            }
            else
            {
                m_terrainMesh.AddQuadColor(c2, endCell.Color);
            }

            m_terrainMesh.AddQuad(v3, v4, endLeft, endRight);
        }
        /* Triangulate Boundary Triangle (using Color) */
        private void TriangulateBoundaryTriangle(Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 boundary, Color boundaryColor)
        {
            Vector3 v2 = HexMeshUtility.TerraceLerp(begin, left, 1);
            Color   c2 = HexMeshUtility.TerraceLerp(beginCell.Color, leftCell.Color, 1);

            m_terrainMesh.AddTriangle(begin, v2, boundary);
            m_terrainMesh.AddTriangleColor(beginCell.Color, c2, boundaryColor);

            for (int i = 2; i < HexMeshUtility.TerraceSteps; i++)
            {
                Vector3 v1 = v2;
                Color   c1 = c2;
                v2 = HexMeshUtility.TerraceLerp(begin, left, i);
                c2 = HexMeshUtility.TerraceLerp(beginCell.Color, leftCell.Color, i);
                m_terrainMesh.AddTriangle(v1, v2, boundary);
                m_terrainMesh.AddTriangleColor(c1, c2, boundaryColor);
            }

            m_terrainMesh.AddTriangle(v2, left, boundary);
            m_terrainMesh.AddTriangleColor(c2, leftCell.Color, boundaryColor);
        }
        /* Triangulate Corner Terraces */
        private void TriangulateCornerTerraces(Vector3 begin, HexCell beginCell, Vector3 left, HexCell leftCell, Vector3 right, HexCell rightCell)
        {
            Vector3 v3 = HexMeshUtility.TerraceLerp(begin, left, 1);
            Vector3 v4 = HexMeshUtility.TerraceLerp(begin, right, 1);
            Color   c3, c4;

            Vector3 types;

            types.x = beginCell.TerrainTypeIndex;
            types.y = leftCell.TerrainTypeIndex;
            types.z = rightCell.TerrainTypeIndex;


            if (HexMeshUtility.UseTextures)
            {
                c3 = HexMeshUtility.TerraceLerp(m_red, m_green, 1);
                c4 = HexMeshUtility.TerraceLerp(m_red, m_blue, 1);
                m_terrainMesh.AddTriangleTerrainTypes(types);
            }
            else
            {
                c3 = HexMeshUtility.TerraceLerp(beginCell.Color, leftCell.Color, 1);
                c4 = HexMeshUtility.TerraceLerp(beginCell.Color, rightCell.Color, 1);
            }


            m_terrainMesh.AddTriangle(begin, v3, v4);
            m_terrainMesh.AddTriangleColor(beginCell.Color, c3, c4);

            for (int i = 2; i < HexMeshUtility.TerraceSteps; i++)
            {
                Vector3 v1 = v3;
                Vector3 v2 = v4;
                Color   c1 = c3;
                Color   c2 = c4;
                v3 = HexMeshUtility.TerraceLerp(begin, left, i);
                v4 = HexMeshUtility.TerraceLerp(begin, right, i);

                if (HexMeshUtility.UseTextures)
                {
                    c3 = HexMeshUtility.TerraceLerp(m_red, m_green, i);
                    c4 = HexMeshUtility.TerraceLerp(m_red, m_blue, i);
                    m_terrainMesh.AddQuadTerrainTypes(types);
                }
                else
                {
                    c3 = HexMeshUtility.TerraceLerp(beginCell.Color, leftCell.Color, i);
                    c4 = HexMeshUtility.TerraceLerp(beginCell.Color, rightCell.Color, i);
                }

                m_terrainMesh.AddQuad(v1, v2, v3, v4);
                m_terrainMesh.AddQuadColor(c1, c2, c3, c4);
            }



            if (HexMeshUtility.UseTextures)
            {
                m_terrainMesh.AddQuadColor(c3, c4, m_green, m_blue);
                m_terrainMesh.AddQuadTerrainTypes(types);
            }
            else
            {
                m_terrainMesh.AddQuadColor(c3, c4, leftCell.Color, rightCell.Color);
            }

            m_terrainMesh.AddQuad(v3, v4, left, right);
        }