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;
}