void GenerateHeightmap() { ReportProgress(10, "Heightmap: Priming"); heightmap = new float[args.MapWidth, args.MapLength]; noise.PerlinNoise(heightmap, args.FeatureScale, args.DetailScale, args.Roughness, 0, 0); if (args.UseBias && !args.DelayBias) { ReportProgress(2, "Heightmap: Biasing"); Noise.Normalize(heightmap); ApplyBias(); } Noise.Normalize(heightmap); if (args.LayeredHeightmap) { ReportProgress(10, "Heightmap: Layering"); // needs a new Noise object to randomize second map float[,] heightmap2 = new float[args.MapWidth, args.MapLength]; new Noise(rand.Next(), NoiseInterpolationMode.Bicubic).PerlinNoise(heightmap2, 0, args.DetailScale, args.Roughness, 0, 0); Noise.Normalize(heightmap2); // make a blendmap blendmap = new float[args.MapWidth, args.MapLength]; int blendmapDetailSize = (int)Math.Log(Math.Max(args.MapWidth, args.MapLength), 2) - 2; new Noise(rand.Next(), NoiseInterpolationMode.Cosine).PerlinNoise(blendmap, 3, blendmapDetailSize, 0.5f, 0, 0); Noise.Normalize(blendmap); float cliffSteepness = Math.Max(args.MapWidth, args.MapLength) / 6f; Noise.ScaleAndClip(blendmap, cliffSteepness); Noise.Blend(heightmap, heightmap2, blendmap); } if (args.MarbledHeightmap) { ReportProgress(1, "Heightmap: Marbling"); Noise.Marble(heightmap); } if (args.InvertHeightmap) { ReportProgress(1, "Heightmap: Inverting"); Noise.Invert(heightmap); } if (args.UseBias && args.DelayBias) { ReportProgress(2, "Heightmap: Biasing"); Noise.Normalize(heightmap); ApplyBias(); } Noise.Normalize(heightmap); }