private void OpenSimplexNoiseCalculation(object sender, DoWorkEventArgs e) { float octaveWeight = 1; float octaveMultiplier = 1; int sizeCompensator = TerrainUtilities.GetReversedSizeCompensator(TerrainSize); float[] helper = new float[TerrainPoints.Length]; for (int octaves = 0; octaves < OSNOctaves; octaves++) { for (int x = 0; x < TerrainSize; x++) { for (int z = 0; z < TerrainSize; z++) { float value = 0; float xValue = (float)((((0.00025f / OSNScale) / OSNScaleX) * (x * sizeCompensator) + OSNSeed) * octaveMultiplier); float zValue = (float)((((0.00025f / OSNScale) / OSNScaleZ) * (z * sizeCompensator) + OSNSeed) * octaveMultiplier); if (octaves == 0) { value = (float)(((_openSimplexNoise.Evaluate(xValue, zValue) * octaveWeight) + 1) / 2); } else { value = (float)((_openSimplexNoise.Evaluate(xValue, zValue) * octaveWeight) / 2); } helper[z + x * TerrainSize] += value * OSNStrength; } } octaveWeight /= 2.0f - (OSNOctaveWeight - 0.5f); octaveMultiplier = octaves * 2.0f; int progressPercentage = (int)(((float)octaves / (float)OSNOctaves) * 100); (sender as BackgroundWorker).ReportProgress(progressPercentage); } for (int x = 0; x < TerrainSize; x++) { for (int z = 0; z < TerrainSize; z++) { TerrainPoints[z + x * TerrainSize] = TerrainUtilities.Apply(TerrainPoints[z + x * TerrainSize], helper[z + x * TerrainSize], CurrentApplicationMode); } } }
public void ColorizeCalculate() { Color currentSelectedColor = GetCurrentColor(); #region ColorMap PixelFormat pixelFormat = PixelFormats.Bgr24; int rawStride = (TerrainSize * pixelFormat.BitsPerPixel + 7) / 8; ColorMap = new byte[rawStride * TerrainSize]; int count = 0; for (int x = 0; x < TerrainSize; x++) { for (int z = 0; z < TerrainSize; z++) { float randomizedHeight = TerrainPoints[z + x * TerrainSize] + (float)((osn.Evaluate(x * 0.2 * HeightNoiseScale, z * 0.2 * HeightNoiseScale) - 0.5) * HeightNoiseAmount * 0.15); if (randomizedHeight >= MinHeight && randomizedHeight <= MaxHeight) { byte randomColorOffset = (byte)_random.Next(16); byte[] BGR = new byte[3]; BGR[0] = currentSelectedColor.B; BGR[1] = currentSelectedColor.G; BGR[2] = currentSelectedColor.R; if (BGR[0] + (byte)(randomColorOffset * ColorNoise) < 255) { BGR[0] += (byte)(randomColorOffset * ColorNoise); } if (BGR[1] + (byte)(randomColorOffset * ColorNoise) < 255) { BGR[1] += (byte)(randomColorOffset * ColorNoise); } if (BGR[2] + (byte)(randomColorOffset * ColorNoise) < 255) { BGR[2] += (byte)(randomColorOffset * ColorNoise); } for (int i = 0; i < 3; i++) { ColorMap[count] = BGR[i]; count++; } } else { if (previousColorMap == null) { byte[] BGR = new byte[3]; BGR[0] = 155; BGR[1] = 155; BGR[2] = 155; for (int i = 0; i < 3; i++) { ColorMap[count] = BGR[i]; count++; } } else { for (int i = 0; i < 3; i++) { ColorMap[count] = previousColorMap[count]; count++; } } } } } BitmapSource bitmap = BitmapSource.Create(TerrainSize, TerrainSize, 96, 96, pixelFormat, null, ColorMap, rawStride); PngBitmapEncoder encoder = new PngBitmapEncoder(); TerrainMainColors = new MemoryStream(); encoder.Frames.Add(BitmapFrame.Create(bitmap)); encoder.Save(TerrainMainColors); TerrainMainColors.Position = 0; #endregion }