From d8997b59d30b63218f594d840d924a10287ce509 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Tue, 24 Jul 2007 05:22:33 +0000 Subject: * Terrain should now send just updated patches. --- .../Region/Terrain.BasicTerrain/TerrainEngine.cs | 16 +++++++++++ .../libTerrainBSD/Channel/Channel.cs | 3 ++ .../libTerrainBSD/Channel/Common.cs | 33 ++++++++++++++++++++++ .../libTerrainBSD/Channel/Editing/Flatten.cs | 2 +- .../libTerrainBSD/Channel/Editing/Raise.cs | 6 ++-- .../libTerrainBSD/Channel/File.cs | 2 ++ .../libTerrainBSD/Channel/Generators/Fracture.cs | 2 ++ .../libTerrainBSD/Channel/Generators/Gradient.cs | 2 ++ .../Channel/Generators/HillPlanter.cs | 8 ++++++ .../libTerrainBSD/Channel/Generators/Noise.cs | 2 ++ .../libTerrainBSD/Channel/Generators/Spiral.cs | 9 +++++- .../libTerrainBSD/Channel/Generators/Voronoi.cs | 7 ++++- .../libTerrainBSD/Channel/Generators/Worms.cs | 2 ++ .../libTerrainBSD/Channel/Grid.cs | 18 ++++++++++-- .../Channel/Manipulators/AerobicErosion.cs | 4 +-- .../Channel/Manipulators/HydraulicErosion.cs | 2 ++ .../Channel/Manipulators/ThermalWeathering.cs | 2 ++ .../libTerrainBSD/Channel/Operators.cs | 25 ++++++++++++++++ 18 files changed, 134 insertions(+), 11 deletions(-) (limited to 'OpenSim/Region/Terrain.BasicTerrain') diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs index 9c58874..a609623 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs @@ -99,6 +99,22 @@ namespace OpenSim.Region.Terrain tainted++; } + public bool Tainted() + { + return (tainted != 0); + } + + public bool Tainted(int x, int y) + { + return (heightmap.diff[x / 16, y / 16] != 0); + } + + public void ResetTaint() + { + tainted = 0; + heightmap.diff = new int[w / 16, h / 16]; + } + /// /// Checks to make sure the terrain is within baked values +/- maxRaise/minLower /// diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Channel.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Channel.cs index 53fb6b2..6dfee1f 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Channel.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Channel.cs @@ -40,6 +40,7 @@ namespace libTerrain partial class Channel { public double[,] map; + public int[,] diff; public int w; public int h; @@ -50,6 +51,7 @@ namespace libTerrain w = 256; h = 256; map = new double[w, h]; + diff = new int[(int)(w / 16), (int)(h / 16)]; } public Channel(int width, int height) @@ -57,6 +59,7 @@ namespace libTerrain w = width; h = height; map = new double[w, h]; + diff = new int[(int)(w / 16), (int)(h / 16)]; } } diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Common.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Common.cs index 0d6d0fc..5715c70 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Common.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Common.cs @@ -51,8 +51,31 @@ namespace libTerrain return x; } + public void SetDiff() + { + SetDiff(1); + } + + public void SetDiff(int val) + { + for (int x = 0; x < w / 16; x++) + { + for (int y = 0; y < h / 16; y++) + { + diff[x, y] = val; + } + } + } + + public void SetDiff(int x, int y) + { + diff[x / 16, y / 16]++; + } + public void Set(int x, int y, double val) { + SetDiff(x, y); + if (x >= w) throw new Exception("Bounds error while setting pixel (width)"); if (y >= h) @@ -67,6 +90,8 @@ namespace libTerrain public void SetClip(int x, int y, double val) { + SetDiff(x, y); + if (x >= w) throw new Exception("Bounds error while setting pixel (width)"); if (y >= h) @@ -129,11 +154,15 @@ namespace libTerrain public void SetWrap(int x, int y, double val) { + SetDiff(x, y); + map[x % w, y % h] = val; } public void SetWrapClip(int x, int y, double val) { + SetDiff(x, y); + if (val > 1.0) val = 1.0; if (val < 0.0) @@ -144,6 +173,8 @@ namespace libTerrain public void Fill(double val) { + SetDiff(); + int x, y; for (x = 0; x < w; x++) { @@ -156,6 +187,8 @@ namespace libTerrain public void Fill(double min, double max, double val) { + SetDiff(); + int x, y; for (x = 0; x < w; x++) { diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs index 03b88a4..ef7a6a7 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs @@ -115,7 +115,7 @@ namespace libTerrain if (z < 0) z = 0; - map[x, y] = Tools.linearInterpolate(map[x, y], height, z); + Set(x, y, Tools.linearInterpolate(map[x, y], height, z)); } } } diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs index 7bccef3..1d04a4f 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Raise.cs @@ -68,7 +68,7 @@ namespace libTerrain if (z < 0) z = 0; - map[x, y] += z * amount; + Set(x, y, map[x, y] + (z * amount)); } } } @@ -93,7 +93,7 @@ namespace libTerrain if (z < 0) z = 0; - map[x, y] += z * amount; + Set(x, y, map[x, y] + (z * amount)); } } } @@ -131,7 +131,7 @@ namespace libTerrain if (z < 0) z = 0; - map[x, y] -= z * amount; + Set(x, y, map[x, y] - (z * amount)); } } } diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/File.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/File.cs index e09dc5a..b147004 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/File.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/File.cs @@ -37,6 +37,8 @@ namespace libTerrain { public Channel LoadImage(string filename) { + SetDiff(); + Bitmap bit = new Bitmap(filename); Channel chan = new Channel(bit.Width, bit.Height); diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs index 8427eab..13dd1bc 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs @@ -82,6 +82,8 @@ namespace libTerrain public void Fracture(int number, double scalemin, double scalemax) { + SetDiff(); + Random rand = new Random(seed); for (int i = 0; i < number; i++) diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Gradient.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Gradient.cs index 0c9b3c3..47b7a66 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Gradient.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Gradient.cs @@ -37,6 +37,8 @@ namespace libTerrain public void GradientCube() { + SetDiff(); + int x, y; for (x = 0; x < w; x++) { diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/HillPlanter.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/HillPlanter.cs index 3b8e963..5a697b1 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/HillPlanter.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/HillPlanter.cs @@ -46,6 +46,8 @@ namespace libTerrain /// Generates hill-shaped noise instead of consistent hills public void HillsSpheres(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) { + SetDiff(); + Random random = new Random(seed); int x, y; @@ -110,6 +112,8 @@ namespace libTerrain /// Generates hill-shaped noise instead of consistent hills public void HillsCones(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) { + SetDiff(); + Random random = new Random(seed); int x, y; @@ -163,6 +167,8 @@ namespace libTerrain public void HillsBlocks(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) { + SetDiff(); + Random random = new Random(seed); int x, y; @@ -217,6 +223,8 @@ namespace libTerrain public void HillsSquared(int number, double scale_min, double scale_range, bool island, bool additive, bool noisy) { + SetDiff(); + Random random = new Random(seed); int x, y; diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Noise.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Noise.cs index ebb1771..3cefcfe 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Noise.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Noise.cs @@ -40,6 +40,8 @@ namespace libTerrain /// 3-Clause BSD Licensed public void Noise() { + SetDiff(); + Random rand = new Random(seed); int x, y; for (x = 0; x < w; x++) diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Spiral.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Spiral.cs index aeff730..80abfe5 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Spiral.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Spiral.cs @@ -36,7 +36,6 @@ namespace libTerrain { private double[] CoordinatesToPolar(int x, int y) { - double theta = Math.Atan2(x - (w / 2), y - (h / 2)); double rx = (double)x - ((double)w / 2); double ry = (double)y - ((double)h / 2); @@ -78,6 +77,8 @@ namespace libTerrain public void Polar() { + SetDiff(); + Channel n = this.Copy(); int x, y; @@ -97,6 +98,8 @@ namespace libTerrain public void SpiralPlanter(int steps, double incAngle, double incRadius, double offsetRadius, double offsetAngle) { + SetDiff(); + int i; double r = offsetRadius; double theta = offsetAngle; @@ -112,6 +115,8 @@ namespace libTerrain public void SpiralCells(int steps, double incAngle, double incRadius, double offsetRadius, double offsetAngle, double[] c) { + SetDiff(); + List points = new List(); int i; @@ -131,6 +136,8 @@ namespace libTerrain public void Spiral(double wid, double hig, double offset) { + SetDiff(); + int x, y, z; z = 0; for (x = 0; x < w; x++) diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Voronoi.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Voronoi.cs index e973d14..eb8f7ba 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Voronoi.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Voronoi.cs @@ -44,6 +44,8 @@ namespace libTerrain /// The Voronoi diagram type. Usually an array with values consisting of [-1,1]. Experiment with the chain, you can have as many values as you like. public void VoronoiDiagram(int pointsPerBlock, int blockSize, double[] c) { + SetDiff(); + List points = new List(); Random generator = new Random(seed); @@ -103,7 +105,8 @@ namespace libTerrain public void VoronoiDiagram(List points, double[] c) { - + SetDiff(); + Random generator = new Random(seed); int x, y, i; double[] distances = new double[points.Count]; @@ -146,6 +149,8 @@ namespace libTerrain public void VoroflatDiagram(int pointsPerBlock, int blockSize) { + SetDiff(); + List points = new List(); Random generator = new Random(seed); diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Worms.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Worms.cs index 38a8023..ce36daf 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Worms.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Worms.cs @@ -44,6 +44,8 @@ namespace libTerrain /// Do worms start in the middle, or randomly? public void Worms(int number, int rounds, double movement, double size, bool centerspawn) { + SetDiff(); + Random random = new Random(seed); int i, j; diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs index a9106b4..a39db50 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs @@ -36,6 +36,8 @@ namespace libTerrain { public Channel Normalise() { + SetDiff(); + double max = FindMax(); double min = FindMin(); @@ -54,6 +56,8 @@ namespace libTerrain public Channel Normalise(double minv, double maxv) { + SetDiff(); + double max = FindMax(); double min = FindMin(); @@ -99,7 +103,8 @@ namespace libTerrain double val = map[x, y]; if (val > max) val = max; if (val < min) val = min; - map[x, y] = val; + + Set(x, y, val); } } return this; @@ -132,6 +137,8 @@ namespace libTerrain public Channel AddClip(Channel other) { + SetDiff(); + int x, y; for (x = 0; x < w; x++) { @@ -149,6 +156,8 @@ namespace libTerrain public void Smooth(double amount) { + SetDiff(); + double area = amount; double step = amount / 4.0; @@ -179,6 +188,8 @@ namespace libTerrain public void Pertubation(double amount) { + SetDiff(); + // Simple pertubation filter double[,] manipulated = new double[w, h]; Random generator = new Random(seed); // Seeds FTW! @@ -227,6 +238,7 @@ namespace libTerrain double p = GetBilinearInterpolate(offset_x, offset_y); manipulated[x, y] = p; + SetDiff(x, y); } } map = manipulated; @@ -239,7 +251,7 @@ namespace libTerrain { for (y = 0; y < h; y++) { - map[x, y] = Tools.linearInterpolate(map[x,y],other.map[x,y],amount); + Set(x, y, Tools.linearInterpolate(map[x, y], other.map[x, y], amount)); } } return this; @@ -252,7 +264,7 @@ namespace libTerrain { for (y = 0; y < h; y++) { - map[x, y] = Tools.linearInterpolate(map[x, y], other.map[x, y], amount.map[x,y]); + Set(x, y, Tools.linearInterpolate(map[x, y], other.map[x, y], amount.map[x, y])); } } return this; diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/AerobicErosion.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/AerobicErosion.cs index 198c337..f4dfe1d 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/AerobicErosion.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/AerobicErosion.cs @@ -118,7 +118,7 @@ namespace libTerrain if (surfacearea > pickupTalusMinimum) { - this.map[x, y] -= amount; + Set(x, y, map[x, y] - amount); sediment.map[x, y] += amount; } } @@ -168,7 +168,7 @@ namespace libTerrain if (surfacearea > dropTalusMinimum) { - this.map[x + minside[0], y + minside[1]] += amount; + Set(x + minside[0], y + minside[1], map[x + minside[0], y + minside[1]] + amount); sediment.map[x, y] -= amount; } } diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/HydraulicErosion.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/HydraulicErosion.cs index 5ace241..36da77c 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/HydraulicErosion.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/HydraulicErosion.cs @@ -36,6 +36,8 @@ namespace libTerrain { public void HydraulicErosion(Channel rain, double evaporation, double solubility, int frequency, int rounds) { + SetDiff(); + Channel water = new Channel(w, h); Channel sediment = new Channel(w, h); Channel terrain = this; diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/ThermalWeathering.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/ThermalWeathering.cs index 449bf85..07c7d66 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/ThermalWeathering.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Manipulators/ThermalWeathering.cs @@ -42,6 +42,8 @@ namespace libTerrain /// The amount of rock to carry each round public Channel ThermalWeathering(double talus, int rounds, double c) { + SetDiff(); + double[,] lastFrame; double[,] thisFrame; diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Operators.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Operators.cs index 623c85c..3199ddc 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Operators.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Operators.cs @@ -49,6 +49,9 @@ namespace libTerrain { for (y = 0; y < A.h; y++) { + if (B.map[x, y] != 0) + A.SetDiff(x, y); + A.map[x, y] += B.map[x, y]; } } @@ -73,6 +76,8 @@ namespace libTerrain } } + A.SetDiff(); + return A; } @@ -89,6 +94,8 @@ namespace libTerrain { for (y = 0; y < A.h; y++) { + if (B.map[x, y] != 0) + A.SetDiff(x, y); A.map[x, y] -= B.map[x, y]; } } @@ -113,6 +120,8 @@ namespace libTerrain } } + A.SetDiff(); + return A; } @@ -133,6 +142,8 @@ namespace libTerrain } } + A.SetDiff(); + return A; } @@ -151,6 +162,9 @@ namespace libTerrain } } + if (B != 0) + A.SetDiff(); + return A; } @@ -166,6 +180,9 @@ namespace libTerrain } } + if (B != 0) + A.SetDiff(); + return A; } @@ -181,6 +198,9 @@ namespace libTerrain } } + if (B != 1) + A.SetDiff(); + return A; } @@ -196,6 +216,9 @@ namespace libTerrain } } + if (B != 1) + A.SetDiff(); + return A; } @@ -211,6 +234,8 @@ namespace libTerrain } } + A.SetDiff(); + return A; } -- cgit v1.1