From 53e8d91c06b3fc5cf61ba767930fa733a6efb232 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Fri, 14 Mar 2008 13:37:39 +0000 Subject: * Fixed 'flatten area' brush, so it now has a 'force' instead of instantly flattening the selected area. * Noise, and Noise-Area brushes now use Perlin noise, more closely simulating the method LL uses officially. * TerrainModule has been cleaned up slightly. * TerrainUtil class has several new functions related to seeded noise generation. * Extracted ITerrainEffect, ITerrainFloodEffect, ITerrainLoader, ITerrainPaintableEffect, TerrainChannel to seperate files. --- .../Modules/Terrain/FloodBrushes/FlattenArea.cs | 4 +- .../Modules/Terrain/FloodBrushes/NoiseArea.cs | 67 +--------------------- 2 files changed, 6 insertions(+), 65 deletions(-) (limited to 'OpenSim/Region/Environment/Modules/Terrain/FloodBrushes') diff --git a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/FlattenArea.cs b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/FlattenArea.cs index 4551f53..007d37e 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/FlattenArea.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/FlattenArea.cs @@ -58,12 +58,14 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes avg = sum / steps; + double str = 0.1 * strength; // == 0.2 in the default client + for (x = 0; x < map.Width; x++) { for (y = 0; y < map.Height; y++) { if (fillArea[x, y] == true) - map[x, y] = avg; + map[x, y] = (map[x, y] * (1.0 - str)) + (avg * str); } } } diff --git a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs index 6063b2f..95ad57d 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs @@ -31,65 +31,6 @@ 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) @@ -101,11 +42,9 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes { if (fillArea[x, y] == true) { - lock (OpenSim.Framework.Util.RandomClass) - { - double noise = PerlinNoise2D(x, y);//OpenSim.Framework.Util.RandomClass.NextDouble(); - map[x, y] += (noise /*- 0.5*/) * strength; - } + double noise = TerrainUtil.PerlinNoise2D((double)x / (double)Framework.Constants.RegionSize, (double)y / (double)Framework.Constants.RegionSize, 8, 1.0); + + map[x, y] += noise * strength; } } } -- cgit v1.1