public void GenerateTerrain(Terrain curTerrain, TerrainArchetype Terrain)
    {
        LibNoise.Perlin Temp = new LibNoise.Perlin();
        noiseCombine = Temp;
        noiseCombine = GenerateNoise(Terrain, noiseCombine);
        // Procedural Generate a terrain heightmap and apply it to a terrain on a gameobject
        TerrainData tdata = Terrain.C_Terrain.terrainData;

        tdata.heightmapResolution = Terrain.C_tResolution * Terrain.C_tResolution;
        int        xRes       = tdata.heightmapWidth;
        int        yRes       = tdata.heightmapHeight;
        GameObject terrainObj = curTerrain.gameObject;

        tdata.size = new Vector3(xRes * Terrain.C_tScale, Terrain.C_tHeight * Terrain.C_tScale, yRes * Terrain.C_tScale);

        float[,] tHeights = tdata.GetHeights(0, 0, xRes, yRes);

        int fillx;
        int filly;
        int Startx = System.Convert.ToInt32(Terrain.C_Axes.x);
        int Startz = System.Convert.ToInt32(Terrain.C_Axes.y);



        for (int x = Startx; x < (xRes + Startx); x++)
        {
            for (int z = Startz; z < (yRes + Startz); z++)
            {
                // Set up fill numbers to compensate for negative shifts.
                fillx = x - Startx;
                filly = z - Startz;

                double Value = noiseCombine.GetValue(x, z, 0);

                if (Value < 0)
                {
                    double tempvalue = (Value * -1);
                    tHeights[fillx, filly] = System.Convert.ToSingle(tempvalue);
                }
            }
        }

        if (Terrain.C_tMaterial != null)
        {
            SplatPrototype[] splatData = new SplatPrototype[1];
            splatData[0]            = new SplatPrototype();
            splatData[0].texture    = Terrain.C_tMaterial;
            splatData[0].tileOffset = new Vector2(0, 0);
            splatData[0].tileSize   = new Vector2(15, 15);

            tdata.splatPrototypes = splatData;
        }
        curTerrain.terrainData = tdata;
        curTerrain.gameObject.GetComponent <TerrainCollider>().terrainData = tdata;

        curTerrain.terrainData.SetHeights(0, 0, tHeights);
        terrainObj.transform.position = new Vector3(Terrain.C_Axes.x, 0, Terrain.C_Axes.y);

        Terrain.C_TerrainObj = PrefabUtility.CreatePrefab("Assets/TerrainGenerator/Resources/Archetypes/" + Terrain.C_Name + "/Terrain.prefab", terrainObj);
    }
    public LibNoise.IModule GenerateNoise(TerrainArchetype curTerrain, LibNoise.IModule noiseCombine)
    {
        LibNoise.Perlin Temp = new LibNoise.Perlin();
        tempnoise = Temp; noise = Temp; noise1 = Temp; noise2 = Temp; noiseCombine = Temp;
        // Apply Noise Values
        for (int i = 0; i < curTerrain.C_nNoiseList.Length; i++)
        {
            switch (curTerrain.C_nNoiseList[i])
            {
            case SetNoise.Perlin:
                LibNoise.Perlin perlin = new LibNoise.Perlin();
                perlin.Frequency    = curTerrain.C_nFrequency;
                perlin.Lacunarity   = curTerrain.C_nLacunarity;
                perlin.NoiseQuality = curTerrain.C_nQuality;
                perlin.OctaveCount  = curTerrain.C_nOctaves;
                perlin.Persistence  = curTerrain.C_nPersistence;
                perlin.Seed         = curTerrain.C_nSeed;
                tempnoise           = perlin;
                break;

            case SetNoise.Billow:
                LibNoise.Billow billow = new LibNoise.Billow();
                billow.Frequency    = curTerrain.C_nFrequency;
                billow.Lacunarity   = curTerrain.C_nLacunarity;
                billow.NoiseQuality = curTerrain.C_nQuality;
                billow.OctaveCount  = curTerrain.C_nOctaves;
                billow.Persistence  = curTerrain.C_nPersistence;
                billow.Seed         = curTerrain.C_nSeed;
                tempnoise           = billow;
                break;

            case SetNoise.MultiFractal:
                LibNoise.RidgedMultifractal MultiFrac = new LibNoise.RidgedMultifractal();
                MultiFrac.Frequency    = curTerrain.C_nFrequency;
                MultiFrac.Lacunarity   = curTerrain.C_nLacunarity;
                MultiFrac.NoiseQuality = curTerrain.C_nQuality;
                MultiFrac.OctaveCount  = curTerrain.C_nOctaves;
                //MultiFrac.Persistence = Persistence;
                MultiFrac.Seed = curTerrain.C_nSeed;
                tempnoise      = MultiFrac;
                break;
            }
            switch (i)
            {
            case 0:
                noise = tempnoise;
                break;

            case 1:
                noise1 = tempnoise;
                break;

            case 2:
                noise2 = tempnoise;
                break;
            }
        }

        //selector = new LibNoise.Modifiers.Select(noise,noise1,noise2);
        LibNoise.IModule tempNoise1 = new LibNoise.Modifiers.Add(noise, noise1);
        LibNoise.IModule tempNoise2 = new LibNoise.Modifiers.Add(tempNoise1, noise2);
        noiseCombine = tempNoise2;
        return(noiseCombine);
    }