// Start is called before the first frame update

    public void CreateModel(Vector3 _sizesMaxCube, float _sizeCube)
    {
        sizeMaxCubeX            = (int)_sizesMaxCube.x;
        sizeMaxCubeY            = (int)_sizesMaxCube.y;
        sizeMaxCubeZ            = (int)_sizesMaxCube.z;
        sizeCube                = _sizeCube;
        mesh                    = GetComponent <MeshFilter>().mesh;
        meshCollider            = GetComponent <MeshCollider>();
        meshCollider.sharedMesh = mesh;
        cubes                   = new Cube[sizeMaxCubeX, sizeMaxCubeY, sizeMaxCubeZ];
        cubeVertices            = new CubeVertice[sizeMaxCubeX + 1, sizeMaxCubeY + 1, sizeMaxCubeZ + 1];

        for (int k = 0; k < (sizeMaxCubeZ + 1); k++)
        {
            for (int j = 0; j < (sizeMaxCubeY + 1); j++)
            {
                for (int i = 0; i < (sizeMaxCubeX + 1); i++)
                {
                    CubeVertice vertice = cubeVertices[i, j, k];
                    vertice.gridPosition = new Vector3(i, j, k);
                    //vertice.worldPosition = transform.position + vertice.gridPosition * sizeCube;
                    vertice.localPosition = (vertice.gridPosition) * sizeCube;

                    vertice.isDestroyed = false;
                    vertice.value       = 0;
                    if (vertice.gridPosition.x == 0 || vertice.gridPosition.x == sizeMaxCubeX ||
                        vertice.gridPosition.y == 0 || vertice.gridPosition.y == sizeMaxCubeY ||
                        vertice.gridPosition.z == 0 || vertice.gridPosition.z == sizeMaxCubeZ)
                    {
                        vertice.isDestroyed = true;
                    }
                    cubeVertices[i, j, k] = vertice;
                }
            }
        }
        for (int k = 0; k < sizeMaxCubeZ; k++)
        {
            for (int j = 0; j < sizeMaxCubeY; j++)
            {
                for (int i = 0; i < sizeMaxCubeX; i++)
                {
                    Cube cube = cubes[i, j, k];
                    cube.configuration = 0;
                    for (int verticeIndex = 0; verticeIndex < 8; verticeIndex++)
                    {
                        Vector3     relativePosition = GetCubeVerticePositionRelativeByIndex(verticeIndex);
                        CubeVertice vertice          = cubeVertices[i + (int)relativePosition.x, j + (int)relativePosition.y, k + (int)relativePosition.z];
                        if (!vertice.isDestroyed)
                        {
                            cube.configuration |= (1 << verticeIndex);
                        }
                    }
                    cubes[i, j, k] = cube;
                }
            }
        }
        RebuildMesh();
    }
    public void Destruction(Vector3 impact, float radiusImpact)
    {
        for (int k = 0; k < (sizeMaxCubeZ + 1); k++)
        {
            for (int j = 0; j < (sizeMaxCubeY + 1); j++)
            {
                for (int i = 0; i < (sizeMaxCubeX + 1); i++)
                {
                    CubeVertice vertice = cubeVertices[i, j, k];

                    if (Vector3.Distance(impact, vertice.GetWorldPosition(transform.position)) < radiusImpact)
                    {
                        vertice.isDestroyed = true;
                    }
                    cubeVertices[i, j, k] = vertice;
                }
            }
        }
        for (int k = 0; k < sizeMaxCubeZ; k++)
        {
            for (int j = 0; j < sizeMaxCubeY; j++)
            {
                for (int i = 0; i < sizeMaxCubeX; i++)
                {
                    Cube cube = cubes[i, j, k];
                    cube.configuration = 0;
                    for (int verticeIndex = 0; verticeIndex < 8; verticeIndex++)
                    {
                        Vector3     relativePosition = GetCubeVerticePositionRelativeByIndex(verticeIndex);
                        CubeVertice vertice          = cubeVertices[i + (int)relativePosition.x, j + (int)relativePosition.y, k + (int)relativePosition.z];
                        if (!vertice.isDestroyed)
                        {
                            cube.configuration |= (1 << verticeIndex);
                        }
                    }
                    cubes[i, j, k] = cube;
                }
            }
        }

        RebuildMesh();
    }
    public void RebuildMesh()
    {
        List <Vector3> verticesMesh  = new List <Vector3>();
        List <int>     trianglesMesh = new List <int>();

        for (int k = 0; k < sizeMaxCubeZ; k++)
        {
            for (int j = 0; j < sizeMaxCubeY; j++)
            {
                for (int i = 0; i < sizeMaxCubeX; i++)
                {
                    Cube cube = cubes[i, j, k];

                    int edgeMask = GetCubeEdgesConfigurationByIndex(cube.configuration);

                    if (edgeMask == 0)
                    {
                        continue;
                    }

                    int[] edges = new int[12];

                    for (int edgeIndex = 0; edgeIndex < 12; edgeIndex++)
                    {
                        if ((edgeMask & (1 << edgeIndex)) == 0)
                        {
                            continue;
                        }

                        int[]       verticesEdgeIndex = GetVerticePairsByEdgeIndex(edgeIndex);
                        Vector3     p0     = GetCubeVerticePositionRelativeByIndex(verticesEdgeIndex[0]);
                        Vector3     p1     = GetCubeVerticePositionRelativeByIndex(verticesEdgeIndex[1]);
                        CubeVertice origin = cubeVertices[i + (int)p0.x, j + (int)p0.y, k + (int)p0.z];
                        CubeVertice end    = cubeVertices[i + (int)p1.x, j + (int)p1.y, k + (int)p1.z];

                        Vector3 midPoint = ((end.localPosition - origin.localPosition) * 0.5f) + origin.localPosition;

                        edges[edgeIndex] = verticesMesh.Count;
                        verticesMesh.Add(midPoint);
                    }

                    int[] trianglesIndexes = GetCubeTrianglesConfigurationByIndex(cube.configuration);
                    for (int n = 0; n < trianglesIndexes.Length; n += 3)
                    {
                        trianglesMesh.Add(edges[trianglesIndexes[n + 2]]);
                        trianglesMesh.Add(edges[trianglesIndexes[n + 1]]);
                        trianglesMesh.Add(edges[trianglesIndexes[n]]);
                    }
                }
            }
        }

        mesh.Clear();
        mesh.vertices  = verticesMesh.ToArray();
        mesh.triangles = trianglesMesh.ToArray();


        mesh.RecalculateBounds();
        mesh.RecalculateNormals();
        mesh.RecalculateTangents();

        meshCollider.sharedMesh = mesh;
    }