FSO.LotView.Components.TerrainComponent.GenerateGrassStates C# (CSharp) Method

GenerateGrassStates() public method

public GenerateGrassStates ( ) : void
return void
        public void GenerateGrassStates()
        {
            //right now only works for square lots, but that's all tso has!
            var random = new Random();
            int width = Size.Width;
            float[] result = new float[width * width];
            int initial = width/4; //divide by more for less noisyness!
            float factor = 0.5f/((int)Math.Log(initial, 2));
            while (initial > 0)
            {
                var squared = initial * initial;
                var noise = new float[squared];
                for (int i = 0; i < squared; i++) noise[i] = (float)random.NextDouble()*factor;

                int offset = 0;
                for (int x = 0; x < width; x++)
                {
                    double xInt = (x / (double)(width-1)) * (initial-1);
                    for (int y = 0; y < width; y++)
                    {
                        double yInt = (y / (double)(width - 1)) * (initial - 1);
                        float tl = noise[(int)(Math.Floor(yInt)*initial+Math.Floor(xInt))];
                        float tr = noise[(int)(Math.Floor(yInt) * initial + Math.Ceiling(xInt))];
                        float bl = noise[(int)(Math.Ceiling(yInt) * initial + Math.Floor(xInt))];
                        float br = noise[(int)(Math.Ceiling(yInt) * initial + Math.Ceiling(xInt))];
                        float p = (float)(xInt%1.0);
                        float q = (float)(yInt%1.0);
                        result[offset++] += (tl * (1 - p) + tr * (p)) * (1 - q) + (bl * (1 - p) + br * (p)) * q; //don't you love 2 dimensional linear interpolation?? ;)
                    }
                }
                initial /= 2;
            }
            GrassState = result;
        }