* Switched Noise 'Flood Area' brush to use Perlin rather than random noise.
* Fixed a bug with the Smooth Area brush.0.6.0-stable
parent
d626125825
commit
be6d8f6d9a
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue