public static async Task <double[, ]> GenerateHeatmap(NoiseGen noise, int yin, int xin, double[,] heightMap = null) { Task[] tasks = new Task[yin]; double[,] heatmap = new double[yin, xin]; for (int y = 0; y < yin; y++) { double gradient = GenerateGradient((double)y / yin); int yCopy = y; tasks[y] = Task.Factory.StartNew(() => { for (int x = 0; x < xin; x++) { heatmap[yCopy, x] = Lerp(noise.FractalFBM(4, 2, x, yCopy), gradient, .85) * (heightMap != null ? 1 - ((heightMap[yCopy, x] + 1) / 2) : 1); } }); } await Task.WhenAll(tasks); return(heatmap); }