diff options
author | Adam Frisby | 2008-03-14 13:37:39 +0000 |
---|---|---|
committer | Adam Frisby | 2008-03-14 13:37:39 +0000 |
commit | 53e8d91c06b3fc5cf61ba767930fa733a6efb232 (patch) | |
tree | 28db1d0e7e96c737da680bef72de527e2dacfb8f /OpenSim/Region/Environment/Modules/Terrain/FloodBrushes | |
parent | * Added proper handling of llSetStatus(STATUS_PHYSICS,BOOL) (diff) | |
download | opensim-SC_OLD-53e8d91c06b3fc5cf61ba767930fa733a6efb232.zip opensim-SC_OLD-53e8d91c06b3fc5cf61ba767930fa733a6efb232.tar.gz opensim-SC_OLD-53e8d91c06b3fc5cf61ba767930fa733a6efb232.tar.bz2 opensim-SC_OLD-53e8d91c06b3fc5cf61ba767930fa733a6efb232.tar.xz |
* 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.
Diffstat (limited to 'OpenSim/Region/Environment/Modules/Terrain/FloodBrushes')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/FlattenArea.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/NoiseArea.cs | 67 |
2 files changed, 6 insertions, 65 deletions
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 | |||
58 | 58 | ||
59 | avg = sum / steps; | 59 | avg = sum / steps; |
60 | 60 | ||
61 | double str = 0.1 * strength; // == 0.2 in the default client | ||
62 | |||
61 | for (x = 0; x < map.Width; x++) | 63 | for (x = 0; x < map.Width; x++) |
62 | { | 64 | { |
63 | for (y = 0; y < map.Height; y++) | 65 | for (y = 0; y < map.Height; y++) |
64 | { | 66 | { |
65 | if (fillArea[x, y] == true) | 67 | if (fillArea[x, y] == true) |
66 | map[x, y] = avg; | 68 | map[x, y] = (map[x, y] * (1.0 - str)) + (avg * str); |
67 | } | 69 | } |
68 | } | 70 | } |
69 | } | 71 | } |
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 | |||
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 | |||
93 | #region ITerrainFloodEffect Members | 34 | #region ITerrainFloodEffect Members |
94 | 35 | ||
95 | public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength) | 36 | public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength) |
@@ -101,11 +42,9 @@ namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes | |||
101 | { | 42 | { |
102 | if (fillArea[x, y] == true) | 43 | if (fillArea[x, y] == true) |
103 | { | 44 | { |
104 | lock (OpenSim.Framework.Util.RandomClass) | 45 | double noise = TerrainUtil.PerlinNoise2D((double)x / (double)Framework.Constants.RegionSize, (double)y / (double)Framework.Constants.RegionSize, 8, 1.0); |
105 | { | 46 | |
106 | double noise = PerlinNoise2D(x, y);//OpenSim.Framework.Util.RandomClass.NextDouble(); | 47 | map[x, y] += noise * strength; |
107 | map[x, y] += (noise /*- 0.5*/) * strength; | ||
108 | } | ||
109 | } | 48 | } |
110 | } | 49 | } |
111 | } | 50 | } |