GameObject GenerateQuad(TileInds tile)
    {
        Vector3[] vertices = new Vector3[kNumQuadSideVertices * 2];
        Vector2[] uvs = new Vector2[kNumQuadSideVertices * 2];
        int[] triangles = new int[(kNumQuadSideVertices - 1) * 6];
        Vector3[] normals = new Vector3[kNumQuadSideVertices * 2];
        Vector4[] tangents = new Vector4[kNumQuadSideVertices	* 2];

        GenerateQuadVertices(tile.X, tile.Y, vertices, uvs, triangles, normals, tangents);

        GameObject newQuad = (GameObject) GameObject.Instantiate(meshPrefab);

        Mesh mesh = new Mesh();
        mesh.vertices = vertices;
        mesh.uv = uvs;
        mesh.triangles = triangles;
        mesh.normals = normals;
        mesh.tangents = tangents;
        mesh.RecalculateBounds();
        newQuad.GetComponent<MeshFilter>().mesh = mesh;

        newQuad.renderer.material = snowMaterial;

        // Create a new mesh for the mesh collider
        newQuad.GetComponent<MeshCollider>().sharedMesh = mesh;

        Vector3 position = new Vector3(tile.X * 100, 0, tile.Y * 100);
        newQuad.transform.position = position;
        return newQuad;
    }
    Terrain GenerateQuad(TileInds tile)
    {
        float tileSizeX = terrainPrefab.terrainData.size.x;
        float tileSizeZ = terrainPrefab.terrainData.size.z;

        Terrain newQuad = (Terrain)GameObject.Instantiate (terrainPrefab);
        Vector3 position = new Vector3 (tile.X * tileSizeX, 0, tile.Y * tileSizeZ);
        GenerateHeights (newQuad,
            tile.X * terrainPrefab.terrainData.heightmapWidth,
            tile.Y * terrainPrefab.terrainData.heightmapHeight,
            10,
            10);

        newQuad.transform.position = position;
        return newQuad;
    }
    void addObstacles(TileInds tile)
    {
        // Instantiate several rocks.
        Vector3 position = new Vector3 (tile.X * 100, 0, tile.Y * 100);

        for (int i = 0; i < Random.Range(1,10); i++) {
            GameObject newRock = (GameObject)GameObject.Instantiate (rock);
            float x = tile.X * 100 + Random.Range (0, 100);
            float z = tile.Y * 100 + Random.Range (0, 100);
            newRock.transform.position = (new Vector3 (x, HeightForXZ (x, z), z));
        }

        // Instance several trees.
        for (int i = 0; i < Random.Range(1,10); i++) {
            GameObject newTree = (GameObject)GameObject.Instantiate (tree);
            float x = tile.X * 100 + Random.Range (0, 100);
            float z = tile.Y * 100 + Random.Range (0, 100);
            newTree.transform.position = (new Vector3 (x, HeightForXZ (x, z), z));
        }
    }