* Switched Noise 'Flood Area' brush to use Perlin rather than random noise.

* Fixed a bug with the Smooth Area brush.
0.6.0-stable
Adam Frisby 2008-03-12 13:49:38 +00:00
parent d626125825
commit be6d8f6d9a
2 changed files with 64 additions and 2 deletions

View File

@ -31,6 +31,65 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes
{
public class NoiseArea : ITerrainFloodEffect
{
private double Noise(int x, int y)
{
// TODO: Seed
int n = x + y * 57;
n = (n<<13) ^ n;
return (1.0 - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
}
private double SmoothedNoise1(int x, int y)
{
double corners = (Noise(x - 1, y - 1) + Noise(x + 1, y - 1) + Noise(x - 1, y + 1) + Noise(x + 1, y + 1)) / 16;
double sides = (Noise(x - 1, y) + Noise(x + 1, y) + Noise(x, y - 1) + Noise(x, y + 1)) / 8;
double center = Noise(x, y) / 4;
return corners + sides + center;
}
private double Interpolate(double x, double y, double z)
{
return (x * (1.0 - z)) + (y * z);
}
private double InterpolatedNoise(double x, double y)
{
int integer_X = (int)(x);
double fractional_X = x - integer_X;
int integer_Y = (int)y;
double fractional_Y = y - integer_Y;
double v1 = SmoothedNoise1(integer_X, integer_Y);
double v2 = SmoothedNoise1(integer_X + 1, integer_Y);
double v3 = SmoothedNoise1(integer_X, integer_Y + 1);
double v4 = SmoothedNoise1(integer_X + 1, integer_Y + 1);
double i1 = Interpolate(v1, v2, fractional_X);
double i2 = Interpolate(v3, v4, fractional_X);
return Interpolate(i1, i2, fractional_Y);
}
private double PerlinNoise2D(double x, double y)
{
int octaves = 1;
double persistence = 0.0005;
double frequency = 0.0;
double amplitude = 0.0;
double total = 0.0;
for (int i = 0; i < octaves; i++)
{
frequency = System.Math.Pow(2, i);
amplitude = System.Math.Pow(persistence, i);
total += InterpolatedNoise(x * frequency, y * frequency) * amplitude;
}
return total;
}
#region ITerrainFloodEffect Members
public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength)
@ -44,8 +103,8 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes
{
lock (OpenSim.Framework.Util.RandomClass)
{
double noise = OpenSim.Framework.Util.RandomClass.NextDouble();
map[x, y] += (noise - 0.5) * strength;
double noise = PerlinNoise2D(x, y);//OpenSim.Framework.Util.RandomClass.NextDouble();
map[x, y] += (noise /*- 0.5*/) * strength;
}
}
}

View File

@ -100,6 +100,9 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes
{
for (y = 0; y < map.Height; y++)
{
if (!fillArea[x, y])
continue;
map[x, y] = manipulate[x, y];
}
}