Пример #1
0
    void MapDataThread(float edgeSize, int subdivisions, Vector3 position, CustomImprovedNoise noise, Action <MapData> callback,
                       Dictionary <string, CellEdge> edgeDictionary,
                       Dictionary <string, CellEdge> edgeDictionaryOrphans
                       )
    {
        MapData mapData = GenerateTerrainData(edgeSize, subdivisions, position, noise, edgeDictionary, edgeDictionaryOrphans);

        lock (mapDataThreadInfoQueue) {
            mapDataThreadInfoQueue.Enqueue(new MapThreadInfo <MapData>(callback, mapData, edgeDictionary, edgeDictionaryOrphans));
        }
    }
Пример #2
0
    public void RequestMapData(float edgeSize, int subdivisions, Vector3 position, CustomImprovedNoise noise,
                               Action <MapData> callback, Dictionary <string, CellEdge> edgeDictionary,
                               Dictionary <string, CellEdge> edgeDictionaryXPlusNormalPatch,
                               Dictionary <string, CellEdge> edgeDictionaryYPlusNormalPatch,
                               Dictionary <string, CellEdge> edgeDictionaryZPlusNormalPatch

                               )
    {
        ThreadStart threadStart = delegate {
            MapDataThread(edgeSize, subdivisions, position, noise, callback, edgeDictionary,
                          edgeDictionaryXPlusNormalPatch, edgeDictionaryYPlusNormalPatch, edgeDictionaryZPlusNormalPatch);
        };

        new Thread(threadStart).Start();
    }
Пример #3
0
    void Start()
    {
        meshGenerator = gameObject.AddComponent <MeshGenerator>();

        int seed = 151178;

        //int seed = (int)UnityEngine.Random.value;
        perlinNoise1 = new Perlin(frequency, lacunarity, persistence, octaves, seed, quality);
        perlinNoise  = new Perlin(frequency, lacunarity, persistence, octaves, seed, quality);
        cnoise       = new CustomImprovedNoise(151178);

        root_cube = new GameObject();
        rootChunk = root_cube.AddComponent <Chunk>();
        rootChunk.transform.parent = gameObject.transform;
        rootChunk.createCube(null, this, radius, 0, 0, 0, 0, "root");
    }
Пример #4
0
    public MapData GenerateTerrainData(float size, int subdivisions, Vector3 position, CustomImprovedNoise noise,
                                       Dictionary <string, CellEdge> edgeDictionary,
                                       Dictionary <string, CellEdge> edgeDictionaryXPlusNormalPatch,
                                       Dictionary <string, CellEdge> edgeDictionaryYPlusNormalPatch,
                                       Dictionary <string, CellEdge> edgeDictionaryZPlusNormalPatch
                                       )
    {
        this.position = position;

        float increment = size / subdivisions;

        int flagIndex = 0;
        //float treshold = 0.4f;
        float   treshold = DCManager.radius * 0.55f;
        Vector3 centerPoint;
        int     i, x, y, z;

        Vector3[]       edgeVertex;
        List <CellEdge> edgeList = new List <CellEdge>();
        int             numEdgesWithIntersections = 0;

        MapData mapData = new MapData();

        Vector3[] cube;
        float[]   noiseCube;


        // spigoli interni
        for (x = 0; x < subdivisions; x++)
        {
            for (y = 0; y < subdivisions; y++)
            {
                for (z = 0; z < subdivisions; z++)
                {
                    edgeList.Clear();
                    cube       = new Vector3[8];
                    noiseCube  = new float[8];
                    edgeVertex = new Vector3[12];


                    numEdgesWithIntersections = 0;
                    flagIndex = 0;

                    Vector3 v0 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment);
                    Vector3 v1 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v2 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v3 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment);

                    Vector3 v4 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);
                    Vector3 v5 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v6 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v7 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);

                    cube[0] = v0;
                    cube[1] = v1;
                    cube[2] = v2;
                    cube[3] = v3;
                    cube[4] = v4;
                    cube[5] = v5;
                    cube[6] = v6;
                    cube[7] = v7;



                    for (i = 0; i < 8; i++)
                    {
                        noiseCube[i] = DCManager.radius - (cube[i] + position).magnitude;

                        if (noiseCube[i] <= treshold)
                        {
                            flagIndex |= 1 << i;
                        }
                    }

                    if (flagIndex == 0 || flagIndex == 255)
                    {
                        continue;
                    }


                    // prepara gli spigoli e ordinali in un dizionario
                    edgeList.Add(new CellEdge(v0, v1, noiseCube[0], noiseCube[1], position, treshold));
                    edgeList.Add(new CellEdge(v2, v3, noiseCube[2], noiseCube[3], position, treshold));
                    edgeList.Add(new CellEdge(v4, v5, noiseCube[4], noiseCube[5], position, treshold));
                    edgeList.Add(new CellEdge(v6, v7, noiseCube[6], noiseCube[7], position, treshold));

                    edgeList.Add(new CellEdge(v1, v5, noiseCube[1], noiseCube[5], position, treshold));
                    edgeList.Add(new CellEdge(v0, v4, noiseCube[0], noiseCube[4], position, treshold));
                    edgeList.Add(new CellEdge(v2, v6, noiseCube[2], noiseCube[6], position, treshold));
                    edgeList.Add(new CellEdge(v3, v7, noiseCube[3], noiseCube[7], position, treshold));

                    edgeList.Add(new CellEdge(v0, v3, noiseCube[0], noiseCube[3], position, treshold));
                    edgeList.Add(new CellEdge(v1, v2, noiseCube[1], noiseCube[2], position, treshold));
                    edgeList.Add(new CellEdge(v4, v7, noiseCube[4], noiseCube[7], position, treshold));
                    edgeList.Add(new CellEdge(v5, v6, noiseCube[5], noiseCube[6], position, treshold));


                    // per ogni cubo trova quanti spigoli hanno intersezioni
                    numEdgesWithIntersections = 0;
                    centerPoint = new Vector3();
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionary);
                            numEdgesWithIntersections++;
                            centerPoint += ce.intersectionPoint;
                        }
                    }
                    if (numEdgesWithIntersections == 0 || numEdgesWithIntersections == 8)
                    {
                        continue;
                    }
                    centerPoint = centerPoint / numEdgesWithIntersections;

                    // ora che sappiamo quanti spigoli hanno intersezioni calcola il punto medio tra loro e settalo come punto centrale della cella
                    // dual contour - per infighettarlo qua dovresti applicare la QEF, invece del punto medio tra gli spigoli che hanno intersezioni
                    int k = 0;
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionary);
                            c.cells[k] = centerPoint;
                        }
                        k++;
                        if (k > 3)
                        {
                            k = 0;
                        }
                    }
                }
            }
        } // fine del mega ciclo


        ///////////////

        // spigoli esterni X+
        for (x = subdivisions; x < subdivisions + 1; x++)
        {
            for (y = 0; y < subdivisions + 1; y++)
            {
                for (z = 0; z < subdivisions + 1; z++)
                {
                    edgeList.Clear();
                    cube       = new Vector3[8];
                    noiseCube  = new float[8];
                    edgeVertex = new Vector3[12];


                    numEdgesWithIntersections = 0;
                    flagIndex = 0;

                    Vector3 v0 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment);
                    Vector3 v1 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v2 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v3 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment);

                    Vector3 v4 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);
                    Vector3 v5 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v6 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v7 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);

                    cube[0] = v0;
                    cube[1] = v1;
                    cube[2] = v2;
                    cube[3] = v3;
                    cube[4] = v4;
                    cube[5] = v5;
                    cube[6] = v6;
                    cube[7] = v7;



                    for (i = 0; i < 8; i++)
                    {
                        noiseCube[i] = DCManager.radius - (cube[i] + position).magnitude;

                        if (noiseCube[i] <= treshold)
                        {
                            flagIndex |= 1 << i;                             // flagIndex = flagIndex | 1<<i
                        }
                        //if(cube[i])
                    }

                    if (flagIndex == 0 || flagIndex == 255)
                    {
                        continue;
                    }


                    // prepara gli spigoli e ordinali in un dizionario
                    edgeList.Add(new CellEdge(v0, v1, noiseCube[0], noiseCube[1], position, treshold));
                    edgeList.Add(new CellEdge(v2, v3, noiseCube[2], noiseCube[3], position, treshold));
                    edgeList.Add(new CellEdge(v4, v5, noiseCube[4], noiseCube[5], position, treshold));
                    edgeList.Add(new CellEdge(v6, v7, noiseCube[6], noiseCube[7], position, treshold));

                    edgeList.Add(new CellEdge(v1, v5, noiseCube[1], noiseCube[5], position, treshold));
                    edgeList.Add(new CellEdge(v0, v4, noiseCube[0], noiseCube[4], position, treshold));
                    edgeList.Add(new CellEdge(v2, v6, noiseCube[2], noiseCube[6], position, treshold));
                    edgeList.Add(new CellEdge(v3, v7, noiseCube[3], noiseCube[7], position, treshold));

                    edgeList.Add(new CellEdge(v0, v3, noiseCube[0], noiseCube[3], position, treshold));
                    edgeList.Add(new CellEdge(v1, v2, noiseCube[1], noiseCube[2], position, treshold));
                    edgeList.Add(new CellEdge(v4, v7, noiseCube[4], noiseCube[7], position, treshold));
                    edgeList.Add(new CellEdge(v5, v6, noiseCube[5], noiseCube[6], position, treshold));


                    // per ogni cubo trova quanti spigoli hanno intersezioni
                    numEdgesWithIntersections = 0;
                    centerPoint = new Vector3();
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionaryXPlusNormalPatch);
                            numEdgesWithIntersections++;
                            centerPoint += ce.intersectionPoint;
                        }
                    }
                    if (numEdgesWithIntersections == 0 || numEdgesWithIntersections == 8)
                    {
                        continue;
                    }
                    centerPoint = centerPoint / numEdgesWithIntersections;

                    // ora che sappiamo quanti spigoli hanno intersezioni calcola il punto medio tra loro e settalo come punto centrale della cella
                    // dual contour - per infighettarlo qua dovresti applicare la QEF, invece del punto medio tra gli spigoli che hanno intersezioni
                    int k = 0;
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionaryXPlusNormalPatch);
                            c.cells[k] = centerPoint;
                        }
                        k++;
                        if (k > 3)
                        {
                            k = 0;
                        }
                    }
                }
            }
        }

        /////////////////

        // spigoli esterni Y+
        for (x = 0; x < subdivisions; x++)
        {
            for (y = subdivisions; y < subdivisions + 1; y++)
            {
                for (z = 0; z < subdivisions; z++)
                {
                    edgeList.Clear();
                    cube       = new Vector3[8];
                    noiseCube  = new float[8];
                    edgeVertex = new Vector3[12];


                    numEdgesWithIntersections = 0;
                    flagIndex = 0;

                    Vector3 v0 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment);
                    Vector3 v1 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v2 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v3 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment);

                    Vector3 v4 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);
                    Vector3 v5 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v6 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v7 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);

                    cube[0] = v0;
                    cube[1] = v1;
                    cube[2] = v2;
                    cube[3] = v3;
                    cube[4] = v4;
                    cube[5] = v5;
                    cube[6] = v6;
                    cube[7] = v7;



                    for (i = 0; i < 8; i++)
                    {
                        noiseCube[i] = DCManager.radius - (cube[i] + position).magnitude;

                        if (noiseCube[i] <= treshold)
                        {
                            flagIndex |= 1 << i;                             // flagIndex = flagIndex | 1<<i
                        }
                        //if(cube[i])
                    }

                    if (flagIndex == 0 || flagIndex == 255)
                    {
                        continue;
                    }


                    // prepara gli spigoli e ordinali in un dizionario
                    edgeList.Add(new CellEdge(v0, v1, noiseCube[0], noiseCube[1], position, treshold));
                    edgeList.Add(new CellEdge(v2, v3, noiseCube[2], noiseCube[3], position, treshold));
                    edgeList.Add(new CellEdge(v4, v5, noiseCube[4], noiseCube[5], position, treshold));
                    edgeList.Add(new CellEdge(v6, v7, noiseCube[6], noiseCube[7], position, treshold));

                    edgeList.Add(new CellEdge(v1, v5, noiseCube[1], noiseCube[5], position, treshold));
                    edgeList.Add(new CellEdge(v0, v4, noiseCube[0], noiseCube[4], position, treshold));
                    edgeList.Add(new CellEdge(v2, v6, noiseCube[2], noiseCube[6], position, treshold));
                    edgeList.Add(new CellEdge(v3, v7, noiseCube[3], noiseCube[7], position, treshold));

                    edgeList.Add(new CellEdge(v0, v3, noiseCube[0], noiseCube[3], position, treshold));
                    edgeList.Add(new CellEdge(v1, v2, noiseCube[1], noiseCube[2], position, treshold));
                    edgeList.Add(new CellEdge(v4, v7, noiseCube[4], noiseCube[7], position, treshold));
                    edgeList.Add(new CellEdge(v5, v6, noiseCube[5], noiseCube[6], position, treshold));


                    // per ogni cubo trova quanti spigoli hanno intersezioni
                    numEdgesWithIntersections = 0;
                    centerPoint = new Vector3();
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionaryYPlusNormalPatch);
                            numEdgesWithIntersections++;
                            centerPoint += ce.intersectionPoint;
                        }
                    }
                    if (numEdgesWithIntersections == 0 || numEdgesWithIntersections == 8)
                    {
                        continue;
                    }
                    centerPoint = centerPoint / numEdgesWithIntersections;

                    // ora che sappiamo quanti spigoli hanno intersezioni calcola il punto medio tra loro e settalo come punto centrale della cella
                    // dual contour - per infighettarlo qua dovresti applicare la QEF, invece del punto medio tra gli spigoli che hanno intersezioni
                    int k = 0;
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionaryYPlusNormalPatch);
                            c.cells[k] = centerPoint;
                        }
                        k++;
                        if (k > 3)
                        {
                            k = 0;
                        }
                    }
                }
            }
        }

        /////////////////

        // spigoli esterni Z+
        for (x = 0; x < subdivisions; x++)
        {
            for (y = 0; y < subdivisions; y++)
            {
                for (z = subdivisions; z < subdivisions + 1; z++)
                {
                    edgeList.Clear();
                    cube       = new Vector3[8];
                    noiseCube  = new float[8];
                    edgeVertex = new Vector3[12];


                    numEdgesWithIntersections = 0;
                    flagIndex = 0;

                    Vector3 v0 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment);
                    Vector3 v1 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v2 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v3 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment);

                    Vector3 v4 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);
                    Vector3 v5 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v6 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v7 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);

                    cube[0] = v0;
                    cube[1] = v1;
                    cube[2] = v2;
                    cube[3] = v3;
                    cube[4] = v4;
                    cube[5] = v5;
                    cube[6] = v6;
                    cube[7] = v7;



                    for (i = 0; i < 8; i++)
                    {
                        noiseCube[i] = DCManager.radius - (cube[i] + position).magnitude;

                        if (noiseCube[i] <= treshold)
                        {
                            flagIndex |= 1 << i;                             // flagIndex = flagIndex | 1<<i
                        }
                        //if(cube[i])
                    }

                    if (flagIndex == 0 || flagIndex == 255)
                    {
                        continue;
                    }


                    // prepara gli spigoli e ordinali in un dizionario
                    edgeList.Add(new CellEdge(v0, v1, noiseCube[0], noiseCube[1], position, treshold));
                    edgeList.Add(new CellEdge(v2, v3, noiseCube[2], noiseCube[3], position, treshold));
                    edgeList.Add(new CellEdge(v4, v5, noiseCube[4], noiseCube[5], position, treshold));
                    edgeList.Add(new CellEdge(v6, v7, noiseCube[6], noiseCube[7], position, treshold));

                    edgeList.Add(new CellEdge(v1, v5, noiseCube[1], noiseCube[5], position, treshold));
                    edgeList.Add(new CellEdge(v0, v4, noiseCube[0], noiseCube[4], position, treshold));
                    edgeList.Add(new CellEdge(v2, v6, noiseCube[2], noiseCube[6], position, treshold));
                    edgeList.Add(new CellEdge(v3, v7, noiseCube[3], noiseCube[7], position, treshold));

                    edgeList.Add(new CellEdge(v0, v3, noiseCube[0], noiseCube[3], position, treshold));
                    edgeList.Add(new CellEdge(v1, v2, noiseCube[1], noiseCube[2], position, treshold));
                    edgeList.Add(new CellEdge(v4, v7, noiseCube[4], noiseCube[7], position, treshold));
                    edgeList.Add(new CellEdge(v5, v6, noiseCube[5], noiseCube[6], position, treshold));


                    // per ogni cubo trova quanti spigoli hanno intersezioni
                    numEdgesWithIntersections = 0;
                    centerPoint = new Vector3();
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionaryZPlusNormalPatch);
                            numEdgesWithIntersections++;
                            centerPoint += ce.intersectionPoint;
                        }
                    }
                    if (numEdgesWithIntersections == 0 || numEdgesWithIntersections == 8)
                    {
                        continue;
                    }
                    centerPoint = centerPoint / numEdgesWithIntersections;

                    // ora che sappiamo quanti spigoli hanno intersezioni calcola il punto medio tra loro e settalo come punto centrale della cella
                    // dual contour - per infighettarlo qua dovresti applicare la QEF, invece del punto medio tra gli spigoli che hanno intersezioni
                    int k = 0;
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionaryZPlusNormalPatch);
                            c.cells[k] = centerPoint;
                        }
                        k++;
                        if (k > 3)
                        {
                            k = 0;
                        }
                    }
                }
            }
        }

        /////////////////


        mapData.edgeDictionary = edgeDictionary;
        mapData.edgeDictionaryXPlusNormalPatch = edgeDictionaryXPlusNormalPatch;
        //mapData.edgeDictionaryYPlusNormalPatch = edgeDictionaryYPlusNormalPatch;
        //mapData.edgeDictionaryZPlusNormalPatch = edgeDictionaryZPlusNormalPatch;


        return(mapData);
    }
Пример #5
0
    public MapData GenerateTerrainData(float size, int subdivisions, Vector3 position, CustomImprovedNoise noise,
                                       Dictionary <string, CellEdge> edgeDictionary,
                                       Dictionary <string, CellEdge> edgeDictionaryOrphans

                                       )
    {
        this.position     = position;
        this.subdivisions = subdivisions;
        float increment = size / subdivisions;

        int flagIndex = 0;
        //float treshold = 0.4f;
        float   treshold = DCManager.radius * 0.55f;
        Vector3 centerPoint;
        int     i, x, y, z;

        Vector3[]       edgeVertex;
        List <CellEdge> edgeList = new List <CellEdge>();
        int             numEdgesWithIntersections = 0;

        MapData mapData = new MapData();

        Vector3[] cube;
        float[]   noiseCube;


        // trova gli spigoli che hanno intersezioni e dove: quando li trovi salvali in edgeDictionary
        // con nome [punto fuori + "|"+ punto dentro], valore la cellEdge(che contiene i 4 centerPoints)
        for (x = 0; x < subdivisions; x++)
        {
            for (y = 0; y < subdivisions; y++)
            {
                for (z = 0; z < subdivisions; z++)
                {
                    edgeList.Clear();
                    cube       = new Vector3[8];
                    noiseCube  = new float[8];
                    edgeVertex = new Vector3[12];


                    numEdgesWithIntersections = 0;
                    flagIndex = 0;

                    Vector3 v0 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment);
                    Vector3 v1 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v2 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment + increment);
                    Vector3 v3 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment, -size / 2 + z * increment);

                    Vector3 v4 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);
                    Vector3 v5 = new Vector3(-size / 2 + x * increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v6 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment + increment);
                    Vector3 v7 = new Vector3(-size / 2 + x * increment + increment, -size / 2 + y * increment + increment, -size / 2 + z * increment);

                    cube[0] = v0;
                    cube[1] = v1;
                    cube[2] = v2;
                    cube[3] = v3;
                    cube[4] = v4;
                    cube[5] = v5;
                    cube[6] = v6;
                    cube[7] = v7;



                    for (i = 0; i < 8; i++)
                    {
                        noiseCube[i] = DCManager.radius - (cube[i] + position).magnitude;

                        if (noiseCube[i] <= treshold)
                        {
                            flagIndex |= 1 << i;
                        }
                    }

                    if (flagIndex == 0 || flagIndex == 255)
                    {
                        continue;
                    }


                    // prepara gli spigoli e ordinali in un dizionario
                    edgeList.Add(new CellEdge(v0, v1, noiseCube[0], noiseCube[1], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });
                    edgeList.Add(new CellEdge(v2, v3, noiseCube[2], noiseCube[3], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });
                    edgeList.Add(new CellEdge(v4, v5, noiseCube[4], noiseCube[5], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });
                    edgeList.Add(new CellEdge(v6, v7, noiseCube[6], noiseCube[7], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });

                    edgeList.Add(new CellEdge(v1, v5, noiseCube[1], noiseCube[5], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });
                    edgeList.Add(new CellEdge(v0, v4, noiseCube[0], noiseCube[4], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });
                    edgeList.Add(new CellEdge(v2, v6, noiseCube[2], noiseCube[6], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });
                    edgeList.Add(new CellEdge(v3, v7, noiseCube[3], noiseCube[7], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });

                    edgeList.Add(new CellEdge(v0, v3, noiseCube[0], noiseCube[3], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });
                    edgeList.Add(new CellEdge(v1, v2, noiseCube[1], noiseCube[2], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });
                    edgeList.Add(new CellEdge(v4, v7, noiseCube[4], noiseCube[7], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });
                    edgeList.Add(new CellEdge(v5, v6, noiseCube[5], noiseCube[6], position, treshold)
                    {
                        px = x, py = y, pz = z
                    });


                    // per ogni cubo trova quanti spigoli hanno intersezioni
                    numEdgesWithIntersections = 0;
                    centerPoint = new Vector3();
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionaryOrphans);
                            numEdgesWithIntersections++;
                            centerPoint += ce.intersectionPoint;
                        }
                    }

                    //salta le celle tutte piene e quelle tutte vuote
                    if (numEdgesWithIntersections == 0 || numEdgesWithIntersections == 8)
                    {
                        continue;
                    }

                    // ora che sappiamo quanti spigoli hanno intersezioni calcola il punto medio tra loro e settalo come punto centrale della cella
                    // dual contour - per infighettarlo qua dovresti applicare la QEF, invece del punto medio tra gli spigoli che hanno intersezioni
                    centerPoint = centerPoint / numEdgesWithIntersections;


                    int k = 0;
                    foreach (CellEdge ce in edgeList)
                    {
                        if (ce.hasIntersection)
                        {
                            CellEdge c = getOrAdd(ce, edgeDictionaryOrphans);

                            //if (numEdgesWithIntersections == 4) {
                            // c = getOrAdd(ce, edgeDictionary);
                            //if (c.cells[k] != Vector3.zero) Debug.Log("ERROR"); //TODO: check why I would possibly overwrite a preesisting(?) [k] value
                            c.cells[k] = centerPoint; //questa cosa della k, vista dopo anni, sembra funzionare per caso...
                        }
                        k++;
                        if (k > 3)
                        {
                            k = 0;
                        }
                    }

                    //Debug.Log("edgeDictionaryOrphans:" + edgeDictionaryOrphans.Count());
                }
            }
        } // fine del mega ciclo



        List <String> edgesKeysToMove = new List <String>();//edgeDictionaryOrphans.Keys.Except(keysToInclude).ToList();

        foreach (CellEdge ce in edgeDictionaryOrphans.Values)
        {
            if (ce.cells.Count(v => v != Vector3.zero) == 4)
            {
                edgesKeysToMove.Add(ce.name);
            }
        }

        foreach (String key in edgesKeysToMove)
        {
            CellEdge ce = edgeDictionaryOrphans[key];
            getOrAdd(ce, edgeDictionary);
            edgeDictionaryOrphans.Remove(ce.name);
        }

        mapData.edgeDictionary        = edgeDictionary;
        mapData.edgeDictionaryOrphans = edgeDictionaryOrphans;



        return(mapData);
    }