void Generate()
    {
        vertices.Clear();
        triangles.Clear();
        int triangleNum = 0;

        for (int x = 0; x < resolution; x++)
        {
            for (int y = 0; y < resolution; y++)
            {
                for (int z = 0; z < resolution; z++)
                {
                    int caseNum = 0;
                    for (int i = 0; i < 8; i++)
                    {
                        float value = densityData[x + cubeVertOffsets[i].x, y + cubeVertOffsets[i].y, z + cubeVertOffsets[i].z];
                        if (invert ? value <surfaceLevel : value> surfaceLevel)
                        {
                            caseNum += (int)Mathf.Pow(2, i);
                        }
                    }

                    int[] triangulationCase = triangulation[caseNum];
                    foreach (int edgeIndex in triangulationCase)
                    {
                        if (edgeIndex == -1)
                        {
                            break;
                        }

                        int indexA = cornerIndexAFromEdge[edgeIndex];
                        int indexB = cornerIndexBFromEdge[edgeIndex];

                        if (smooth)
                        {
                            Int3 v3IndexA = new Int3(x, y, z) + cubeVertOffsets[indexA];
                            Int3 v3IndexB = new Int3(x, y, z) + cubeVertOffsets[indexB];

                            float densityA = densityData[v3IndexA.x, v3IndexA.y, v3IndexA.z];
                            float densityB = densityData[v3IndexB.x, v3IndexB.y, v3IndexB.z];
                            float lerp     = (surfaceLevel - densityB) / (densityA - densityB);

                            Vector3 vertPos = Vector3.Lerp(v3IndexB.ToV3(), v3IndexA.ToV3(), lerp);

                            vertices.Add(vertPos);
                            triangles.Add(triangleNum++);
                        }
                        else
                        {
                            Vector3 vertA   = cubeVertOffsets[indexA].ToV3();
                            Vector3 vertB   = cubeVertOffsets[indexB].ToV3();
                            Vector3 vertPos = (vertA + vertB) / 2;

                            vertices.Add(new Vector3(x, y, z) + vertPos);
                            triangles.Add(triangleNum++);
                        }
                    }
                }
            }
        }
    }