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);
                }
            }
        }
Exemple #2
0
        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
        }