Esempio n. 1
0
    private Mesher.GridCell generateCell(int x, int y, int z)
    {
        Mesher.GridCell cell = new Mesher.GridCell();

        Vector3 point = new Vector3(x, y, z + 1);

        cell.cornerPoints[0] = point;
        point.x += 1;
        cell.cornerPoints[1] = point;
        point.z -= 1;
        cell.cornerPoints[2] = point;
        point.x -= 1;
        cell.cornerPoints[3] = point;

        point = new Vector3(x, y + 1, z + 1);
        cell.cornerPoints[4] = point;
        point.x += 1;
        cell.cornerPoints[5] = point;
        point.z -= 1;
        cell.cornerPoints[6] = point;
        point.x -= 1;
        cell.cornerPoints[7] = point;

        cell.cornerValues[0] = valuePoints[x, y, z + 1];
        cell.cornerValues[1] = valuePoints[x + 1, y, z + 1];
        cell.cornerValues[2] = valuePoints[x + 1, y, z];
        cell.cornerValues[3] = valuePoints[x, y, z];
        cell.cornerValues[4] = valuePoints[x, y + 1, z + 1];
        cell.cornerValues[5] = valuePoints[x + 1, y + 1, z + 1];
        cell.cornerValues[6] = valuePoints[x + 1, y + 1, z];
        cell.cornerValues[7] = valuePoints[x, y + 1, z];

        return(cell);
    }
Esempio n. 2
0
    // Use this for initialization
    void Start()
    {
        numValuePoints = chunkSize + 1;
        valuePoints    = new float[numValuePoints, numValuePoints, numValuePoints];
        for (int y = 0; y < numValuePoints; y++)
        {
            for (int z = 0; z < numValuePoints; z++)
            {
                for (int x = 0; x < numValuePoints; x++)
                {
                    Vector3 realPos = new Vector3(x + transform.position.x, y + transform.position.y, z + transform.position.z);
                    valuePoints[x, y, z] = Noise.Generate(realPos.x * 0.02f, realPos.y * 0.02f, realPos.z * 0.02f);
                }
            }
        }

        meshRenderer = gameObject.AddComponent <MeshRenderer>();
        meshFilter   = gameObject.AddComponent <MeshFilter>();
        mesh         = new Mesh();

        meshRenderer.sharedMaterial = chunkMaterial;

        int            initialSize = chunkSize * 5 * 3;
        List <Vector3> verts       = new List <Vector3>(initialSize);
        List <int>     indices     = new List <int>(initialSize);
        List <Vector2> uvs         = new List <Vector2>(initialSize);

        int numVerts = 0;

        cells = new Mesher.GridCell[chunkSize, chunkSize, chunkSize];
        for (int y = 0; y < chunkSize; y++)
        {
            for (int z = 0; z < chunkSize; z++)
            {
                for (int x = 0; x < chunkSize; x++)
                {
                    Mesher.GridCell currCell = generateCell(x, y, z);

                    Mesher.Triangle[] tris = new Mesher.Triangle[5];
                    int numTris            = Mesher.Polygonize(currCell, 0.1f, tris);

                    for (int i = 0; i < numTris; i++)
                    {
                        verts.Add(tris[i].triPoints[0]);
                        verts.Add(tris[i].triPoints[1]);
                        verts.Add(tris[i].triPoints[2]);

                        indices.Add(numVerts);
                        indices.Add(numVerts + 1);
                        indices.Add(numVerts + 2);

                        numVerts += 3;

                        // uvs dont matter right now
                        uvs.Add(Vector2.zero);
                        uvs.Add(Vector2.zero);
                        uvs.Add(Vector2.zero);
                    }
                }
            }
        }

        mesh.vertices  = verts.ToArray();
        mesh.triangles = indices.ToArray();
        mesh.uv        = uvs.ToArray();

        mesh.Optimize();
        mesh.RecalculateBounds();
        mesh.RecalculateNormals();

        meshFilter.sharedMesh = mesh;
    }