diff options
author | Adam Frisby | 2008-03-12 13:49:38 +0000 |
---|---|---|
committer | Adam Frisby | 2008-03-12 13:49:38 +0000 |
commit | be6d8f6d9af396d541f10e6ec035711b629f17e8 (patch) | |
tree | 1c9edd39e5372d2574aab465e6d69bb1bf94b766 /OpenSim/Region | |
parent | * Fix for Smooth Area Flood Brush, now doesn't flood the entire sim. (diff) | |
download | opensim-SC-be6d8f6d9af396d541f10e6ec035711b629f17e8.zip opensim-SC-be6d8f6d9af396d541f10e6ec035711b629f17e8.tar.gz opensim-SC-be6d8f6d9af396d541f10e6ec035711b629f17e8.tar.bz2 opensim-SC-be6d8f6d9af396d541f10e6ec035711b629f17e8.tar.xz |
* Switched Noise 'Flood Area' brush to use Perlin rather than random noise.
* Fixed a bug with the Smooth Area brush.
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs | 63 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/SmoothArea.cs | 3 |
2 files changed, 64 insertions, 2 deletions
diff --git a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs index d2433c3..6063b2f 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs | |||
@@ -31,6 +31,65 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes | |||
31 | { | 31 | { |
32 | public class NoiseArea : ITerrainFloodEffect | 32 | public class NoiseArea : ITerrainFloodEffect |
33 | { | 33 | { |
34 | private double Noise(int x, int y) | ||
35 | { | ||
36 | // TODO: Seed | ||
37 | int n = x + y * 57; | ||
38 | n = (n<<13) ^ n; | ||
39 | return (1.0 - ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0); | ||
40 | } | ||
41 | |||
42 | private double SmoothedNoise1(int x, int y) | ||
43 | { | ||
44 | double corners = (Noise(x - 1, y - 1) + Noise(x + 1, y - 1) + Noise(x - 1, y + 1) + Noise(x + 1, y + 1)) / 16; | ||
45 | double sides = (Noise(x - 1, y) + Noise(x + 1, y) + Noise(x, y - 1) + Noise(x, y + 1)) / 8; | ||
46 | double center = Noise(x, y) / 4; | ||
47 | return corners + sides + center; | ||
48 | } | ||
49 | |||
50 | private double Interpolate(double x, double y, double z) | ||
51 | { | ||
52 | return (x * (1.0 - z)) + (y * z); | ||
53 | } | ||
54 | |||
55 | private double InterpolatedNoise(double x, double y) | ||
56 | { | ||
57 | int integer_X = (int)(x); | ||
58 | double fractional_X = x - integer_X; | ||
59 | |||
60 | int integer_Y = (int)y; | ||
61 | double fractional_Y = y - integer_Y; | ||
62 | |||
63 | double v1 = SmoothedNoise1(integer_X, integer_Y); | ||
64 | double v2 = SmoothedNoise1(integer_X + 1, integer_Y); | ||
65 | double v3 = SmoothedNoise1(integer_X, integer_Y + 1); | ||
66 | double v4 = SmoothedNoise1(integer_X + 1, integer_Y + 1); | ||
67 | |||
68 | double i1 = Interpolate(v1, v2, fractional_X); | ||
69 | double i2 = Interpolate(v3, v4, fractional_X); | ||
70 | |||
71 | return Interpolate(i1, i2, fractional_Y); | ||
72 | } | ||
73 | |||
74 | private double PerlinNoise2D(double x, double y) | ||
75 | { | ||
76 | int octaves = 1; | ||
77 | double persistence = 0.0005; | ||
78 | |||
79 | double frequency = 0.0; | ||
80 | double amplitude = 0.0; | ||
81 | double total = 0.0; | ||
82 | |||
83 | for (int i = 0; i < octaves; i++) | ||
84 | { | ||
85 | frequency = System.Math.Pow(2, i); | ||
86 | amplitude = System.Math.Pow(persistence, i); | ||
87 | |||
88 | total += InterpolatedNoise(x * frequency, y * frequency) * amplitude; | ||
89 | } | ||
90 | return total; | ||
91 | } | ||
92 | |||
34 | #region ITerrainFloodEffect Members | 93 | #region ITerrainFloodEffect Members |
35 | 94 | ||
36 | public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength) | 95 | public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength) |
@@ -44,8 +103,8 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes | |||
44 | { | 103 | { |
45 | lock (OpenSim.Framework.Util.RandomClass) | 104 | lock (OpenSim.Framework.Util.RandomClass) |
46 | { | 105 | { |
47 | double noise = OpenSim.Framework.Util.RandomClass.NextDouble(); | 106 | double noise = PerlinNoise2D(x, y);//OpenSim.Framework.Util.RandomClass.NextDouble(); |
48 | map[x, y] += (noise - 0.5) * strength; | 107 | map[x, y] += (noise /*- 0.5*/) * strength; |
49 | } | 108 | } |
50 | } | 109 | } |
51 | } | 110 | } |
diff --git a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/SmoothArea.cs b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/SmoothArea.cs index fd25a06..17f658d 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/SmoothArea.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/SmoothArea.cs | |||
@@ -100,6 +100,9 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes | |||
100 | { | 100 | { |
101 | for (y = 0; y < map.Height; y++) | 101 | for (y = 0; y < map.Height; y++) |
102 | { | 102 | { |
103 | if (!fillArea[x, y]) | ||
104 | continue; | ||
105 | |||
103 | map[x, y] = manipulate[x, y]; | 106 | map[x, y] = manipulate[x, y]; |
104 | } | 107 | } |
105 | } | 108 | } |