Inheritance: IModule
Example #1
0
 public PerlinGenerator()
 {
     var r = new Random();
     _basis = new Perlin();
     Seed = r.Next();
     Init();
 }
    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);
    }
Example #3
0
        public DefaultMapGenerator(long seed)
        {
            Frequency = 0.03;
            Lacunarity = 0.01;
            Persistance = 0.01;
            OctaveCount = 1;

            Seed = seed;
            CaveNoise = new Perlin();
            TreeNoise = new Perlin();
            CaveNoise.Seed = (int)Seed + 3;
            TreeNoise.Seed = (int)Seed + 4;
            rand = new Random((int)Seed);

            CaveNoise.Frequency = Frequency;
            CaveNoise.NoiseQuality = NoiseQuality;
            CaveNoise.OctaveCount = OctaveCount+2;
            CaveNoise.Lacunarity = Lacunarity;
            CaveNoise.Persistence = Persistance;

            TreeNoise.Frequency = Frequency+2;
            TreeNoise.NoiseQuality = NoiseQuality;
            TreeNoise.OctaveCount = OctaveCount;
            TreeNoise.Lacunarity = Lacunarity;
            TreeNoise.Persistence = Persistance;
        }
Example #4
0
        /// <summary>
        /// Creates a new terrain object.
        /// </summary>
        /// <param name="seed">The seed to use for terrain generation.</param>
        private Terrain( int seed )
        {
            _densities = new TerrainDensityCollection();
            _currentBlocks = new BlockType[ ChunkData.SizeXZ + 2, ChunkData.SizeY, ChunkData.SizeXZ + 2 ];

            _noiseSeed = seed;
            _noiseModule = CreateNoiseModule( _noiseSeed );
            _perlin = new Perlin() { Seed = _noiseSeed + 1 };

            _hBias = 1.0f / 127;
            _vBias = 1.0f / 51;
        }
Example #5
0
        public Turbulence(IModule sourceModule)
        {
            SourceModule = sourceModule;

            XDistort = new Perlin();
            YDistort = new Perlin();
            ZDistort = new Perlin();

            Frequency = 1.0;
            Power = 1.0;
            Roughness = 3;
            Seed = 0;
        }
Example #6
0
        public HillGenerator(long seed)
        {
            Frequency = 0.03;
            Lacunarity = 0.01;
            Persistance = 0.01;
            OctaveCount = 1;

            Seed = seed;
            TerrainNoise = new FastNoise();
            ContinentNoise = new FastNoise();
            CaveNoise = new Perlin();
            GravelNoise = new Perlin();
            TreeNoise = new Perlin();
            TerrainNoise.Seed = (int)Seed;
            ContinentNoise.Seed = (int)Seed + 2;
            CaveNoise.Seed = (int)Seed + 3;
            GravelNoise.Seed = (int)Seed + 4;
            TreeNoise.Seed = (int)Seed + 4;
            rand = new Random((int)Seed);

            TerrainNoise.Frequency = Frequency;
            TerrainNoise.NoiseQuality = NoiseQuality;
            TerrainNoise.OctaveCount = OctaveCount;
            TerrainNoise.Lacunarity = Lacunarity;
            TerrainNoise.Persistence = Persistance;

            ContinentNoise.Frequency = ContinentNoiseFrequency;
            ContinentNoise.NoiseQuality = NoiseQuality;
            ContinentNoise.OctaveCount = OctaveCount;
            ContinentNoise.Lacunarity = Lacunarity;
            ContinentNoise.Persistence = Persistance;

            CaveNoise.Frequency = Frequency;
            CaveNoise.NoiseQuality = NoiseQuality;
            CaveNoise.OctaveCount = OctaveCount + 2;
            CaveNoise.Lacunarity = Lacunarity;
            CaveNoise.Persistence = Persistance;

            GravelNoise.Frequency = Frequency;
            GravelNoise.NoiseQuality = NoiseQuality;
            GravelNoise.OctaveCount = OctaveCount;
            GravelNoise.Lacunarity = Lacunarity;
            GravelNoise.Persistence = Persistance;

            TreeNoise.Frequency = Frequency + 2;
            TreeNoise.NoiseQuality = NoiseQuality;
            TreeNoise.OctaveCount = OctaveCount;
            TreeNoise.Lacunarity = Lacunarity;
            TreeNoise.Persistence = Persistance;
        }
Example #7
0
        public Turbulence(IModule sourceModule)
        {
            if (sourceModule == null)
                throw new ArgumentNullException();

            SourceModule = sourceModule;

            XDistort = new Perlin();
            YDistort = new Perlin();
            ZDistort = new Perlin();

            Frequency = 1.0;
            Power = 1.0;
            Roughness = 3;
            Seed = 0;
        }
 public override void Setup()
 {
     double xoff = 0;
     Perlin rnd = new Perlin();
     for (int i = 0; i < 100; i++)
     {
         double yoff = 0;
         for (int j = 0; j <100; j++)
         {
             circ.Add(new Circle(new Point3d(i, j, 0), rnd.GetValue(xoff, yoff, 0) * -1));
             //RhinoApp.WriteLine(String.Format("{0}", circ[j].Radius));
             yoff += 0.01;
         }
         xoff += 0.01;
     }
 }
Example #9
0
    public void Initiaiise()
    {
        this.internalWidth = ( displayWidth * 3 ) / 2;
        this.tileTable = new List<List<HexTile>>( this.displayHeight );

        for ( int y = 0; y < this.displayHeight; ++y )
        {
            this.tileTable.Add( new List<HexTile>( this.internalWidth ) );

            for ( int x = 0; x < this.internalWidth; ++x )
            {
                if ( this.IsValidDisplayableTile( x, y ) )
                {
                    HexTile hex = this.CreateTile( x, y );
                    this.tileTable[y].Add( hex );
                }
                else
                {
                    this.tileTable[y].Add( null );
                }
            }
        }

        this.availableTiles = this.GetAvailableTiles();
        this.BuildNeighbourConnections();

        LibNoise.Perlin perlin = new LibNoise.Perlin();
        perlin.Frequency *= 5.0f;
        Debug.Log( perlin.Frequency + " : " + perlin.Lacunarity + " : " + perlin.NoiseQuality + " : " + perlin.OctaveCount + " : " + perlin.Persistence + " : " + perlin.Seed );
        perlin.Seed = UnityEngine.Random.Range( 0, 1000 );

        float min = float.MaxValue;
        float max = float.MinValue;
        foreach ( HexTile tile in this.availableTiles )
        {
            tile.terrainData.fuelLoad = ((float)perlin.GetValue( (double)tile.x/(double)this.internalWidth, (double)tile.y/(double)this.displayHeight, 0.0 ) + 1.0f) / 2.0f;

            tile.tileOverlay.SetFuelOverlay();
            min = Mathf.Min( min, tile.terrainData.fuelLoad );
            max = Mathf.Max( max, tile.terrainData.fuelLoad );
        }
        Debug.Log( "Min: " + min + " max: " + max );
    }
        public GenStandard()
        {
            random = new Random();

            perlin = new Perlin();
            perlin.Frequency = 0.009;
            perlin.Persistence = 0.3;
            perlin.Seed = (int)( DateTime.Now.Ticks & 0xffffffff );

            perlin2 = new Perlin();
            perlin2.Frequency = 0.007;
            perlin2.Persistence = 0.6;
            perlin2.Lacunarity = 0.1;
            perlin2.Seed = perlin.Seed - 7;

            caves = new RidgedMultifractal();
            caves.Frequency = 0.0089;
            caves.Seed = perlin2.Seed + 99;

            voronoi = new Voronoi();
            voronoi.Frequency = 0.008;
            voronoi.Seed = perlin.Seed + 2;

            desertSelector = new Perlin();
            desertSelector.Frequency = 0.01;
            desertSelector.Persistence = 0.4;
            desertSelector.Lacunarity = 0.14;
            desertSelector.Seed = perlin.Seed + 245;

            mountains = new RidgedMultifractal();
            mountains.Frequency = 0.021;
            mountains.NoiseQuality = NoiseQuality.Low;
            mountains.Seed = perlin.Seed + 41;

            mountains2 = new Perlin();
            mountains2.Frequency = 0.025;
            mountains2.NoiseQuality = NoiseQuality.Low;
            mountains2.Seed = perlin.Seed + 41;
        }
Example #11
0
        public PerlinGenerator( int seed = 0 )
            : base(seed)
        {
            myHillyNoise = new Perlin
            {
                Seed = Seed,
                OctaveCount = 6,
                Frequency = 1.0,
                Lacunarity = 2.0,
                Persistence = 0.5
            };

            myPlainsNoise = new Perlin
            {
                Seed = Seed,
                OctaveCount = 6,
                Frequency = 8.0,
                Lacunarity = 2.0,
                Persistence = 1.0
            };

            myTransNoise = new Perlin
            {
                Seed = Seed,
                OctaveCount = 6,
                Frequency = 1.0 / 32.0,
                Lacunarity = 2.0,
                Persistence = 1.0
            };

            myMinHilly = 768;
            myMaxHilly = 896;

            myMinPlains = 768;
            myMaxPlains = 776;
        }
Example #12
0
        private void InitGenerators()
        {
            //prepare noise generators
              perlinLeft = new Perlin() { Frequency = RiverShapeFrequency, NoiseQuality = NoiseQuality.Standard, Seed = Seed + 1, OctaveCount = 6, Lacunarity = RiverShapeLacunarity, Persistence = RiverShapePersistence };
              perlinRight = new Perlin() { Frequency = RiverShapeFrequency, NoiseQuality = NoiseQuality.Standard, Seed = Seed + 2, OctaveCount = 6, Lacunarity = RiverShapeLacunarity, Persistence = RiverShapePersistence };
              perlinLeftWidth = new Perlin() { Frequency = RiverWidthFrequency, NoiseQuality = NoiseQuality.Standard, Seed = Seed + 3, OctaveCount = 6, Lacunarity = RiverWidthLacunarity, Persistence = RiverWidthPersistence };
              perlinRightWidth = new Perlin() { Frequency = RiverWidthFrequency, NoiseQuality = NoiseQuality.Standard, Seed = Seed + 4, OctaveCount = 6, Lacunarity = RiverWidthLacunarity, Persistence = RiverWidthPersistence };

              Perlin terrainPerlin = new Perlin() { Frequency = TerrainPerlinFrequency, NoiseQuality = NoiseQuality.Standard, Seed = Seed, OctaveCount = 6, Lacunarity = TerrainPerlinLacunarity, Persistence = TerrainPerlinPersistence };
              RidgedMultifractal terrainRMF = new RidgedMultifractal() { Frequency = TerrainRMFFrequency, NoiseQuality = NoiseQuality.High, Seed = Seed - 1, OctaveCount = 6, Lacunarity = TerrainRMFLacunarity };
              ScaleOutput scaledRMF = new ScaleOutput(terrainRMF, TerrainRMFScale);
              Add terrainAdd = new Add(terrainPerlin, new BiasOutput(scaledRMF, TerrainRMFBias));
              terrainScaledModule = new ScaleOutput(terrainAdd, HeightScale);

              biomesPerlin = new Perlin() { Frequency = BiomesFrequency, NoiseQuality = NoiseQuality.Low, Seed = Seed - 10, OctaveCount = 6, Lacunarity = BiomesLacunarity, Persistence = BiomesPersistence };
        }
Example #13
0
        /// <summary>
        /// Generates a new world and then sets the tiles in the TileSystem to it.
        /// </summary>
        /// <param name="seed"></param>
        /// <param name="threaded">If true, the world will generate on another thread.</param>
        public void GenerateWorld(int? seed, bool threaded)
        {
            this.SetSeed(seed);

            if (threaded)
            {
                new Thread(() => this.GenerateWorld(this.Seed, false)).Start();

                return;
            }
            var sw = new Stopwatch();
            sw.Start();

            tileSystem.ClearTiles();

            var perlin = new Perlin() { Seed = this.Seed };

            Console.WriteLine("[WorldGeneration]: Generating terrain...");

            // First part: Generate landscape
            for (int y = 0; y < Height; y++)
            {
                for (int x = 0; x < Width; x++)
                {
                    double pVal = perlin.GetValue(x / 500d, y / 500d, 0);
                    double cpVal = (pVal + 1.975) / 2;
                    cpVal = MathHelper.Clamp((float)cpVal, 0f, 1f);
                    var color = new Color((byte)(cpVal * 255), (byte)(cpVal * 255), (byte)(cpVal * 255), 255);

                    if (pVal > 0.00)
                    {
                        tileSystem.Tiles[0][x, y] = new Tile(Tile.TileId.Grass, Tile.Solidity.NonSolid, SourceRects.Grass, Color.White, Tile.TileSide.Middle);

                        if (rand.NextDouble() <= 0.0005)
                        {
                            seeds.Add(new BigTree(x, y, ref tileSystem));
                        }
                    }
                    else if (pVal <= 0.00 && pVal >= -0.10)
                    {
                        tileSystem.Tiles[0][x, y] = new Tile(
                            Tile.TileId.Sand, Tile.Solidity.NonSolid, SourceRects.SandMiddle, Color.White, Tile.TileSide.Middle);
                    }
                    else if(pVal >= -0.15)
                    {
                        tileSystem.Tiles[0][x, y] = new Tile(
                            Tile.TileId.ShallowWater, Tile.Solidity.NonSolid, SourceRects.ShallowWaterMiddle, Color.White, Tile.TileSide.Middle);
                    }
                    else
                    {
                        color = new Color((byte)(color.R / 1.5f), (byte)(color.G / 1.5f), (byte)(color.B / 1.5f), 255);
                        tileSystem.Tiles[0][x, y] = new Tile(Tile.TileId.Water, Tile.Solidity.NonSolid, SourceRects.Water, color, Tile.TileSide.Middle);
                    }
                }
            }

            // Grow seeds

            foreach (Seed seed1 in seeds)
            {
                seed1.Grow();
            }

            Console.WriteLine("[WorldGeneration]: Finished terrain, smoothing terrain...");

            // Last part: Polish up terrain a bit
            for (int y = 0; y < Height; y++)
            {
                for (int x = 0; x < Width; x++)
                {
                    tileSystem.PolishTile(y, x);
                }
            }

            Console.WriteLine("[WorldGeneration]: Finished edges. Doing inner edges...");

            // Has to be done after doing edges, else it won't be correct in some cases.
            for (int y = 0; y < Height; y++)
                for (int x = 0; x < Width; x++)
                {
                    tileSystem.PolishInnerGrass(
                        x,
                        y,
                        SourceRects.SandToGrassInnerTopLeft,
                        SourceRects.SandToGrassInnerTopRight,
                        SourceRects.SandToGrassInnerBottomLeft,
                        SourceRects.SandToGrassInnerBottomRight);
                }

            sw.Stop();
            Console.WriteLine("Generation time: " + sw.ElapsedMilliseconds + "ms");
        }
Example #14
0
        public void Initialize(MaterialMap matmap, long seed)
        {
            mMap = matmap;
            this.Seed = seed;

            Frequency = 0.03;
            ContinentNoiseFrequency = Frequency / 2.0;
            Lacunarity = 0.01;
            Persistance = 0.01;
            OctaveCount = 1;

            Seed = seed;
            TerrainNoise = new FastNoise();
            ContinentNoise = new FastNoise();
            CaveNoise = new Perlin();
            GravelNoise = new Perlin();
            TreeNoise = new Perlin();
            TerrainNoise.Seed = (int)Seed;
            ContinentNoise.Seed = (int)Seed + 2;
            CaveNoise.Seed = (int)Seed + 3;
            GravelNoise.Seed = (int)Seed + 4;
            TreeNoise.Seed = (int)Seed + 4;
            rand = new Random((int)Seed);


            TerrainNoise.Frequency = Frequency;
            TerrainNoise.NoiseQuality = NoiseQuality;
            TerrainNoise.OctaveCount = OctaveCount;
            TerrainNoise.Lacunarity = Lacunarity;
            TerrainNoise.Persistence = Persistance;

            ContinentNoise.Frequency = ContinentNoiseFrequency;
            ContinentNoise.NoiseQuality = NoiseQuality;
            ContinentNoise.OctaveCount = OctaveCount;
            ContinentNoise.Lacunarity = Lacunarity;
            ContinentNoise.Persistence = Persistance;

            CaveNoise.Frequency = Frequency;
            CaveNoise.NoiseQuality = NoiseQuality;
            CaveNoise.OctaveCount = OctaveCount + 2;
            CaveNoise.Lacunarity = Lacunarity;
            CaveNoise.Persistence = Persistance;

            GravelNoise.Frequency = Frequency;
            GravelNoise.NoiseQuality = NoiseQuality;
            GravelNoise.OctaveCount = OctaveCount;
            GravelNoise.Lacunarity = Lacunarity;
            GravelNoise.Persistence = Persistance;

            TreeNoise.Frequency = Frequency + 2;
            TreeNoise.NoiseQuality = NoiseQuality;
            TreeNoise.OctaveCount = OctaveCount;
            TreeNoise.Lacunarity = Lacunarity;
            TreeNoise.Persistence = Persistance;
        }
Example #15
0
        private Vector3[] generateUpperVertices(int upperVertCount, float frequencyMultiplier)
        {
            //block count == (height - 1) / 3
            //vertex count per block == 5
            //index count per block == 9

            int heightCount = upperVertCount; //height count should be (divisable by three) + 1
            Vector3[] height = new Vector3[heightCount]; //*2 + 1

            Perlin perlin = new Perlin();
            perlin.Seed = DateTime.Now.Millisecond;
            float x = 0;
            float multiplier = frequencyMultiplier;

            for (int i = 0; i < height.Length; i++)
            {
                float value = (float)perlin.GetValue(x + 0.005f * i, 0, 0);
                value += 1;
                value = value / 2;
                value += 0.3f;
                height[i] = new Vector3(x, value, 0);
                x += 1.5f / (multiplier + 500);
            }

            return height;
        }
Example #16
0
        private static void Run(int octaves, double persistence, double frequency, double lacunarity)
        {
            string fileName = string.Format("O{3}_P{0:N3}_F{1:N3}.png", persistence, frequency, lacunarity, octaves);
              Billow billow = new Billow();
              billow.Frequency = frequency;
              billow.NoiseQuality = NoiseQuality.High;
              billow.Seed = 0;
              billow.OctaveCount = octaves;
              billow.Lacunarity = lacunarity;
              billow.Persistence = persistence;

              ScaleBiasOutput scaledBillow = new ScaleBiasOutput(billow);
              scaledBillow.Bias = -0.75;
              scaledBillow.Scale = 0.125;

              RidgedMultifractal ridged = new RidgedMultifractal();
              ridged.Frequency = frequency;
              ridged.NoiseQuality = NoiseQuality.High;
              ridged.Seed = 0;
              ridged.OctaveCount = octaves;
              ridged.Lacunarity = lacunarity;

              Perlin perlin = new Perlin();
              perlin.Frequency = frequency;
              perlin.NoiseQuality = NoiseQuality.High;
              perlin.Seed = 0;
              perlin.OctaveCount = octaves;
              perlin.Lacunarity = lacunarity;
              perlin.Persistence = persistence;

              Select selector = new Select(perlin, ridged, scaledBillow);
              selector.SetBounds(0, 1000);
              selector.EdgeFalloff = 0.5;
              IModule module = selector;
              //RidgedMultifractal module = new RidgedMultifractal();
              //((RidgedMultifractal)module).Frequency = frequency;
              //((RidgedMultifractal)module).NoiseQuality = NoiseQuality.High;
              //((RidgedMultifractal)module).Seed = 0;
              //((RidgedMultifractal)module).OctaveCount = octaves;
              //((RidgedMultifractal)module).Lacunarity = lacunarity;
              //((RidgedMultifractal)module).Persistence = persistence;
              Pen blackPen = new Pen(Color.Black, 1);
              Font arialFont = new Font("Arial", 8);

              double min = double.MaxValue;
              double max = double.MinValue;
              double avg = 0;

              using (Bitmap b = new Bitmap(300, 2500))
              {
            using (Graphics g = Graphics.FromImage(b))
            {
              g.Clear(Color.White);
              for (int i = 0; i < 5000; i++)
              {
            var value = module.GetValue(i, 0, 0);
            avg += value;
            if (value < min)
            {
              min = value;
            }
            if (value > max)
            {
              max = value;
            }
            g.DrawRectangle(blackPen, 150 + (int)System.Math.Round(value * 100), i / 2, 1, 1);
              }
              avg /= 5000;
              g.DrawString(string.Format("Samples: {0:N3}\r\nMin: {1:N3}\r\nMax: {2:N3}\r\nAverage: {3:N3}", 5000, min, max, avg), arialFont, Brushes.DarkBlue, 5f, 60f);
              g.DrawString(string.Format("Frequency: {0:N3}\r\nPersistence: {1:N3}\r\nLacunarity: {2:N3}\r\nOctaves: {3:N3}", frequency, persistence, lacunarity, octaves), arialFont, Brushes.DarkGreen, 5f, 5f);
            }
            b.Save(@"Combined\" + fileName, ImageFormat.Png);
              }
        }
Example #17
0
 public PerlinGenerator(int seed)
 {
     _basis = new Perlin();
     Seed = seed;
     Init();
 }
Example #18
0
		public override bool Generate(long X, long Z, out double min, out double max)
        {
            min = 0;
            max = (double)ChunkY;
            if (treeNoise == null)
            {
                treeNoise = new Perlin();
                treeNoise.Seed = (int)this.RandomSeed + 4;
                treeNoise.Frequency = 1;
                treeNoise.Persistence = 0.5;
                treeNoise.OctaveCount = 1;
                dungeonNoise = new Random((int)RandomSeed);
                cavernNoise = new RidgedMultifractal();
                cavernNoise.Seed = (int)this.RandomSeed + 5;
                cavernNoise.Frequency = 0.025;
                //caveNoise.Persistence = 0.25;
                cavernNoise.OctaveCount = 1;
                caveNoise = new Perlin();
                caveNoise.Seed = (int)RandomSeed + 2;
                caveNoise.Frequency = 0.03;
                caveNoise.Lacunarity = 0.01;
                caveNoise.Persistence = 0.01;
                caveNoise.OctaveCount = 1;
            }
            if (_Generator == null)
            {
                return false;
            }
			string lockfile = Path.ChangeExtension(GetChunkFilename((int)X,(int)Z), "genlock");
			if (!_Generator.NoPreservation)
			{
				if (File.Exists(lockfile))
					return true;
			}
			else
			{
				if (File.Exists(lockfile))
					File.Delete(lockfile);
			}
            //Console.WriteLine("GEN");
            profGen.Start();
			double[,] hm = _Generator.Generate(this, X, Z,out min, out max);
            profGen.Stop();

            if (hm == null)
            {
                Console.WriteLine("ERROR: hm==null");
                return false;
            }

            // Erosion shit here.

            Chunk _c = NewChunk(X, Z);
            byte[, ,] blocks = _c.Blocks;

            //Console.WriteLine("BIOME");
            profBiome.Start();
            BiomeType[,] biomes = _Generator.DetermineBiomes(ChunkScale, X, Z);
            profBiome.Stop();

            IMapHandler mh = this;
            // These use the block array.

            profVoxelize.Start();
            HeightmapToVoxelspace(hm, ref blocks);                                       AssertBottomBarrierIntegrity(blocks, "HeightmapToVoxelspace");
            profVoxelize.Stop();

            profSoil.Start();
            _Generator.AddSoil(X,Z,cavernNoise, caveNoise, hm,ref blocks, biomes, 63, 6, _Generator.Materials);         AssertBottomBarrierIntegrity(blocks, "AddSoil");
            profSoil.Stop();

            //profDgn.Start();
            //_Generator.AddDungeons(ref blocks, ref mh, dungeonNoise, X, Z);              AssertBottomBarrierIntegrity(blocks, "AddDungeons");
            //profDgn.Stop();

            profPrecip.Start();
            _Generator.Precipitate(ref blocks, biomes, _Generator.Materials, X, Z);      AssertBottomBarrierIntegrity(blocks, "Precipitate");
            profPrecip.Stop();

            profSave.Start();
            mh.SaveAll();

            _c.Blocks = blocks;
            //_c.UpdateOverview();
            SetChunk(_c);
            File.WriteAllText(lockfile, _Generator.ToString());


            // These use SetBlockAt() and company.

            //Console.WriteLine("SAVE");
            SaveAll();
            profSave.Stop();

            string profres = profBiome.ToString();
            profres += "\r\n";
            profres += profDgn.ToString();
            profres += "\r\n";
            profres += profErode.ToString();
            profres += "\r\n";
            profres += profGen.ToString();
            profres += "\r\n";
            profres += profPrecip.ToString();
            profres += "\r\n";
            profres += profSave.ToString();
            profres += "\r\n";
            profres += profSoil.ToString();
            profres += "\r\n";
            profres += profVoxelize.ToString();

            File.WriteAllText("GEN_PROFILE.txt", profres);
            return true;
		}
Example #19
0
        private void button1_Click(object sender, EventArgs e)
        {
            panel2.Enabled = false;

            NoiseQuality quality = NoiseQuality.Standard;

            if (radiolow.Checked)
                quality = NoiseQuality.Low;
            if (radiostandard.Checked)
                quality = NoiseQuality.Standard;
            if (radiohigh.Checked)
                quality = NoiseQuality.High;

            int seed = 0;
            try
            {
                seed = Convert.ToInt32(textBox1.Text);
            }
            catch
            {
                seed = 0;
                textBox1.Text = "0";
            }

            int octaves = 0;
            try
            {
                octaves = Convert.ToInt32(textBox2.Text);
            }
            catch
            {
                octaves = 6;
                textBox2.Text = "6";
            }
            if (octaves > 30) octaves = 30;

            double frequency = 0;
            try
            {
                frequency = Convert.ToDouble(textBox3.Text);
            }
            catch
            {
                frequency = 0.05;
                textBox3.Text = "0.05";
            }

            double lacunarity = 0;
            try
            {
                lacunarity = Convert.ToDouble(textBox4.Text);
            }
            catch
            {
                lacunarity = 2.0;
                textBox4.Text = "2.0";
            }

            double persistence = 0;
            try
            {
                persistence = Convert.ToDouble(textBox5.Text);
            }
            catch
            {
                persistence = 0.5;
                textBox5.Text = "0.5";
            }

            bool mapToSphere = false;

            IModule module;
            switch (listBox1.SelectedItem.ToString())
            {
                case "Slow Perlin":
                    module = new Perlin();
                    ((Perlin)module).Frequency = frequency;
                    ((Perlin)module).NoiseQuality = quality;
                    ((Perlin)module).Seed = seed;
                    ((Perlin)module).OctaveCount = octaves;
                    ((Perlin)module).Lacunarity = lacunarity;
                    ((Perlin)module).Persistence = persistence;
                    break;
                case "Fast Perlin":
                    module = new FastNoise();
                    ((FastNoise)module).Frequency = frequency;
                    ((FastNoise)module).NoiseQuality = quality;
                    ((FastNoise)module).Seed = seed;
                    ((FastNoise)module).OctaveCount = octaves;
                    ((FastNoise)module).Lacunarity = lacunarity;
                    ((FastNoise)module).Persistence = persistence;
                    break;
                case "Slow Billow":
                    module = new Billow();
                    ((Billow)module).Frequency = frequency;
                    ((Billow)module).NoiseQuality = quality;
                    ((Billow)module).Seed = seed;
                    ((Billow)module).OctaveCount = octaves;
                    ((Billow)module).Lacunarity = lacunarity;
                    ((Billow)module).Persistence = persistence;
                    break;
                case "Fast Billow":
                    module = new FastBillow();
                    ((FastBillow)module).Frequency = frequency;
                    ((FastBillow)module).NoiseQuality = quality;
                    ((FastBillow)module).Seed = seed;
                    ((FastBillow)module).OctaveCount = octaves;
                    ((FastBillow)module).Lacunarity = lacunarity;
                    ((FastBillow)module).Persistence = persistence;
                    break;
                case "Slow Ridged Multifractal":
                    module = new RidgedMultifractal();
                    ((RidgedMultifractal)module).Frequency = frequency;
                    ((RidgedMultifractal)module).NoiseQuality = quality;
                    ((RidgedMultifractal)module).Seed = seed;
                    ((RidgedMultifractal)module).OctaveCount = octaves;
                    ((RidgedMultifractal)module).Lacunarity = lacunarity;
                    break;
                case "Fast Ridged Multifractal":
                    module = new FastRidgedMultifractal();
                    ((FastRidgedMultifractal)module).Frequency = frequency;
                    ((FastRidgedMultifractal)module).NoiseQuality = quality;
                    ((FastRidgedMultifractal)module).Seed = seed;
                    ((FastRidgedMultifractal)module).OctaveCount = octaves;
                    ((FastRidgedMultifractal)module).Lacunarity = lacunarity;
                    break;
                case "Slow Combined":
                    Billow billow = new Billow();
                    billow.Frequency = frequency;
                    billow.NoiseQuality = quality;
                    billow.Seed = seed;
                    billow.OctaveCount = octaves;
                    billow.Lacunarity = lacunarity;
                    billow.Persistence = persistence;

                    ScaleBiasOutput scaledBillow = new ScaleBiasOutput(billow);
                    scaledBillow.Bias = -0.75;
                    scaledBillow.Scale = 0.125;

                    RidgedMultifractal ridged = new RidgedMultifractal();
                    ridged.Frequency = frequency/2.0;
                    ridged.NoiseQuality = quality;
                    ridged.Seed = seed;
                    ridged.OctaveCount = octaves;
                    ridged.Lacunarity = lacunarity;

                    Perlin perlin = new Perlin();
                    perlin.Frequency = frequency/10.0;
                    perlin.NoiseQuality = quality;
                    perlin.Seed = seed;
                    perlin.OctaveCount = octaves;
                    perlin.Lacunarity = lacunarity;
                    perlin.Persistence = persistence;

                    Select selector = new Select(perlin, ridged, scaledBillow);
                    selector.SetBounds(0, 1000);
                    selector.EdgeFalloff = 0.5;

                    module = selector;
                    break;
                case "Fast Combined":
                    FastBillow fastbillow = new FastBillow();
                    fastbillow.Frequency = frequency;
                    fastbillow.NoiseQuality = quality;
                    fastbillow.Seed = seed;
                    fastbillow.OctaveCount = octaves;
                    fastbillow.Lacunarity = lacunarity;
                    fastbillow.Persistence = persistence;

                    ScaleBiasOutput fastscaledBillow = new ScaleBiasOutput(fastbillow);
                    fastscaledBillow.Bias = -0.75;
                    fastscaledBillow.Scale = 0.125;

                    FastRidgedMultifractal fastridged = new FastRidgedMultifractal();
                    fastridged.Frequency = frequency/2.0;
                    fastridged.NoiseQuality = quality;
                    fastridged.Seed = seed;
                    fastridged.OctaveCount = octaves;
                    fastridged.Lacunarity = lacunarity;

                    FastNoise fastperlin = new FastNoise();
                    fastperlin.Frequency = frequency/10.0;
                    fastperlin.NoiseQuality = quality;
                    fastperlin.Seed = seed;
                    fastperlin.OctaveCount = octaves;
                    fastperlin.Lacunarity = lacunarity;
                    fastperlin.Persistence = persistence;

                    Select fastselector = new Select(fastperlin, fastridged, fastscaledBillow);
                    fastselector.SetBounds(0, 1000);
                    fastselector.EdgeFalloff = 0.5;

                    module = fastselector;
                    break;
                case "Voronoi":
                    module = new Voronoi();
                    ((Voronoi)module).Frequency = frequency;
                    break;
                case "Slow Planet":
                    mapToSphere = true;

                    Perlin slowPlanetContinents = new Perlin();
                    slowPlanetContinents.Frequency = 1.5;

                    Billow slowPlanetLowlands = new Billow();
                    slowPlanetLowlands.Frequency = 4;
                    LibNoise.Modifiers.ScaleBiasOutput slowPlanetLowlandsScaled = new ScaleBiasOutput(slowPlanetLowlands);
                    slowPlanetLowlandsScaled.Scale = 0.2;
                    slowPlanetLowlandsScaled.Bias = 0.5;

                    RidgedMultifractal slowPlanetMountainsBase = new RidgedMultifractal();
                    slowPlanetMountainsBase.Frequency = 4;

                    ScaleBiasOutput slowPlanetMountainsScaled = new ScaleBiasOutput(slowPlanetMountainsBase);
                    slowPlanetMountainsScaled.Scale = 0.4;
                    slowPlanetMountainsScaled.Bias = 0.85;

                    FastTurbulence slowPlanetMountains = new FastTurbulence(slowPlanetMountainsScaled);
                    slowPlanetMountains.Power = 0.1;
                    slowPlanetMountains.Frequency = 50;

                    Perlin slowPlanetLandFilter = new Perlin();
                    slowPlanetLandFilter.Frequency = 6;

                    Select slowPlanetLand = new Select(slowPlanetLandFilter, slowPlanetLowlandsScaled, slowPlanetMountains);
                    slowPlanetLand.SetBounds(0, 1000);
                    slowPlanetLand.EdgeFalloff = 0.5;

                    Billow slowPlanetOceanBase = new Billow();
                    slowPlanetOceanBase.Frequency = 15;
                    ScaleOutput slowPlanetOcean = new ScaleOutput(slowPlanetOceanBase, 0.1);

                    Select slowPlanetFinal = new Select(slowPlanetContinents, slowPlanetOcean, slowPlanetLand);
                    slowPlanetFinal.SetBounds(0, 1000);
                    slowPlanetFinal.EdgeFalloff = 0.5;

                    module = slowPlanetFinal;
                    break;
                case "Fast Planet":
                    mapToSphere = true;

                    FastNoise fastPlanetContinents = new FastNoise(seed);
                    fastPlanetContinents.Frequency = 1.5;

                    FastBillow fastPlanetLowlands = new FastBillow();
                    fastPlanetLowlands.Frequency = 4;
                    LibNoise.Modifiers.ScaleBiasOutput fastPlanetLowlandsScaled = new ScaleBiasOutput(fastPlanetLowlands);
                    fastPlanetLowlandsScaled.Scale = 0.2;
                    fastPlanetLowlandsScaled.Bias = 0.5;

                    FastRidgedMultifractal fastPlanetMountainsBase = new FastRidgedMultifractal(seed);
                    fastPlanetMountainsBase.Frequency = 4;

                    ScaleBiasOutput fastPlanetMountainsScaled = new ScaleBiasOutput(fastPlanetMountainsBase);
                    fastPlanetMountainsScaled.Scale = 0.4;
                    fastPlanetMountainsScaled.Bias = 0.85;

                    FastTurbulence fastPlanetMountains = new FastTurbulence(fastPlanetMountainsScaled);
                    fastPlanetMountains.Power = 0.1;
                    fastPlanetMountains.Frequency = 50;

                    FastNoise fastPlanetLandFilter = new FastNoise(seed+1);
                    fastPlanetLandFilter.Frequency = 6;

                    Select fastPlanetLand = new Select(fastPlanetLandFilter, fastPlanetLowlandsScaled, fastPlanetMountains);
                    fastPlanetLand.SetBounds(0, 1000);
                    fastPlanetLand.EdgeFalloff = 0.5;

                    FastBillow fastPlanetOceanBase = new FastBillow(seed);
                    fastPlanetOceanBase.Frequency = 15;
                    ScaleOutput fastPlanetOcean = new ScaleOutput(fastPlanetOceanBase, 0.1);

                    Select fastPlanetFinal = new Select(fastPlanetContinents, fastPlanetOcean, fastPlanetLand);
                    fastPlanetFinal.SetBounds(0, 1000);
                    fastPlanetFinal.EdgeFalloff = 0.5;

                    module = fastPlanetFinal;
                    break;
                default:
                    module = new Constant(1.0);
                    break;
            }

            System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
            stopWatch.Start();

            LibNoise.Models.Sphere sphere = new LibNoise.Models.Sphere(module);

            for (int x = 0; x < pictureBox1.ClientSize.Width - 1; x++)
                for (int y = 0; y < pictureBox1.ClientSize.Height - 1; y++)
                {
                    double value;
                    if(mapToSphere)
                    {
                        int offsetX = -(x-512);
                        int offsetY = -(y-512);
                        double longitude = offsetY/5.6888888888;
                        if(longitude > 90.0) longitude = 90.0;
                        if(longitude < -90.0) longitude = -90.0;
                        double latitude = offsetX/2.844444444;
                        if(latitude > 180.0) latitude = 180.0;
                        if(latitude < -190.0) latitude = -180.0;
                        value = sphere.GetValue(longitude, latitude);
                    }
                    else
                        value = (module.GetValue(x, y, 10) + 1) / 2.0;
                    if (mapToSphere)
                    {
                        if (value < 0) value = 0;
                        if (value > 1.0) value = 1.0;
                        int index = (int)(value * earthLookupTable.Length);
                        if (index >= earthLookupTable.Length) index = earthLookupTable.Length - 1;
                        colors[x, y] = earthLookupTable[index];
                    }
                    else
                    {
                        if (value < 0) value = 0;
                        if (value > 1.0) value = 1.0;
                        byte intensity = (byte)(value * 255.0);
                        colors[x, y] = Color.FromArgb(255, intensity, intensity, intensity);
                    }
                }

            stopWatch.Stop();
            label2.Text = "Generation time for a 1024x1024 image, not including rendering: " + stopWatch.Elapsed.TotalMilliseconds + " ms";

            for (int x = 0; x < pictureBox1.ClientSize.Width - 1; x++)
                for (int y = 0; y < pictureBox1.ClientSize.Height - 1; y++)
                    bitmap.SetPixel(x, y, colors[x, y]);

            pictureBox1.Image = bitmap;

            panel2.Enabled = true;
        }
Example #20
0
 /// <summary>
 /// Creates the base noise module to be used for generating terrain.
 /// </summary>
 private static IModule CreateNoiseModule( int seed )
 {
     var landBase = new Perlin()
     {
         Seed = seed,
         OctaveCount = 4
     };
     var other = new Perlin()
     {
         Seed = seed - 1,
         OctaveCount = 2
     };
     return new Multiply( landBase, other );
 }
Example #21
0
        public HeightMap(int width, int length, int maxHeight)
        {
            this.heights = new float[width * length];

            // Init perlin noise library
            Perlin perlin = new Perlin();
            perlin.Seed = (new Random()).Next() % 1000;
            perlin.Frequency = 0.03f;
            perlin.OctaveCount = 5;
            perlin.Persistence = 0.05f;

            // Create the plane model
            Plane planeModel = new Plane(perlin);

            // Fill every point in the noise map with the output values from the model
            for (int z = 0; z < length; ++z)
            {
                for (int x = 0; x < width; ++x)
                {
                    float value = (float)planeModel.GetValue(x, z) * maxHeight;
                    heights[z * width + x] = System.Math.Max(0.0f, value);
                }
            }

            Width = width;
            Length = length;
            MaxHeight = maxHeight;
        }
Example #22
0
 public virtual void AddSoil(long X, long Z, RidgedMultifractal CavernNoise, Perlin CaveNoise, double[,] hm,ref byte[,,] b, BiomeType[,] biomes, int WaterHeight, int depth, MapGenMaterials mats)
 {
     int YH = b.GetLength(1) - 2;
     double xo = (double)(X * b.GetLength(0));
     double zo = (double)(Z * b.GetLength(2));
     for (int x = 0; x < b.GetLength(0); x++)
     {
         //Console.WriteLine();
         for (int z = 0; z < b.GetLength(2); z++)
         {
             double hmY=(double)(System.Math.Min(hm[x, z],1d) * (b.GetLength(1) - 3));
             bool HavePloppedGrass = false;
             bool HaveTouchedSoil = false;
             // Caves first
             if (GenerateCaves)
             {
                 for (int y = 0; y < b.GetLength(1); y++)
                 {
                     // If we're in rock, and CavernNoise value is under a threshold value calculated by height
                     //  or CaveNoise value is over threshold value, and the block we're removing won't fall on us...
                     if (
                         b[x, y, z] == 1
                         && (
                             ((CavernNoise.GetValue(x + xo, y, z + zo) / 2) + 1) < Utils.Lerp(CavernThresholdMax, CavernThresholdMin, (((double)y / (hmY + 1))))
                             || (Utils.FixLibnoiseOutput(CaveNoise.GetValue(x + xo, y, z + zo)) > CaveThreshold)
                         )
                         && !(b[x, y, z] == 9 || b[x, y, z] == 8 || b[x, y, z] == 12 || b[x, y, z] == 13))
                     {
                         // Remove it
                         b[x, y, z] = 0;
                     }
                 }
             }
             for (int y = (int)b.GetLength(1) - 1; y > 0; y--)
             {
                 byte supportBlock = b[x, y-1, z];
                 // Ensure there's going to be stuff holding us up.
                 if (b[x, y, z] == mats.Rock && supportBlock==mats.Rock)
                 {
                     HaveTouchedSoil = true;
                     if (y + depth >= YH)
                         continue;
                     byte ddt = b[x, y+depth, z];
                     switch (ddt)
                     {
                         case 0: // Air
                         case 8: // Water
                         case 9: // Water
                             BiomeType bt = biomes[x,z];
                             if (bt == BiomeType.Tundra)
                             {
                                 b[x, y, z] = mats.Sand;
                             }
                             else
                             {
                                 if (y - depth <= WaterHeight && GenerateWater)
                                 {
                                     if ((bt == BiomeType.Taiga || bt == BiomeType.TemperateForest || bt == BiomeType.Tundra) && y > WaterHeight)
                                     {
                                         b[x, y, z] = (HavePloppedGrass) ? mats.Soil : mats.Grass;
                                     }
                                     else
                                     {
                                         b[x, y, z] = mats.Sand;
                                     }
                                 }
                                 else
                                     b[x, y, z] = (HavePloppedGrass) ? mats.Soil : mats.Grass;
                             }
                             if (!HavePloppedGrass)
                                 HavePloppedGrass = true;
                             break;
                         default:
                             y = 0;
                             break;
                     }
                 }
                 else if (b[x, y, z] == 0 && y <= WaterHeight && !HaveTouchedSoil && GenerateWater)
                 {
                     b[x, y, z] = mats.Water;
                 }
             }
         }
     }
 }
Example #23
0
        private void Setup()
        {
            Frequency = 0.1;
            ContinentNoiseFrequency = 0.02;
            Lacunarity = 2; // 0.05
            Persistance = 0.5;
            OctaveCount = 3;
            mContinentNoiseOctaves = 6;

            TerrainNoise = new FastNoise();
            ContinentNoise = new Perlin();
            CaveNoise = new Perlin();
            TerrainNoise.Seed = (int)Seed;
            ContinentNoise.Seed = (int)Seed + 2;
            CaveNoise.Seed = (int)Seed + 3;

            TerrainNoise.Frequency = Frequency;
            TerrainNoise.NoiseQuality = NoiseQuality;
            TerrainNoise.OctaveCount = OctaveCount;
            TerrainNoise.Lacunarity = Lacunarity;

            ContinentNoise.Frequency = ContinentNoiseFrequency;
            ContinentNoise.NoiseQuality = NoiseQuality;
            ContinentNoise.OctaveCount = mContinentNoiseOctaves;
            ContinentNoise.Lacunarity = Lacunarity;
            ContinentNoise.Persistence = Persistance;

            CaveNoise.Frequency = Frequency;
            CaveNoise.NoiseQuality = NoiseQuality;
            CaveNoise.OctaveCount = OctaveCount + 2;
            CaveNoise.Lacunarity = Lacunarity;
            CaveNoise.Persistence = Persistance;
        }
    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);
    }