From 6ec9c2d7068bd7b9da0cb32b6f0847d8fc6b0a53 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Mon, 27 Oct 2008 17:06:47 +0000 Subject: [PATCH] * Apply http://opensimulator.org/mantis/view.php?id=2468 * This time there are accompanying changes to the unit test to adapt it to the changes * Thanks tglion --- .../World/Terrain/PaintBrushes/LowerSphere.cs | 44 ++++++++++++++----- .../World/Terrain/PaintBrushes/RaiseSphere.cs | 32 ++++++++++---- .../World/Terrain/Tests/TerrainTest.cs | 40 ++++++++++++----- 3 files changed, 85 insertions(+), 31 deletions(-) diff --git a/OpenSim/Region/Environment/Modules/World/Terrain/PaintBrushes/LowerSphere.cs b/OpenSim/Region/Environment/Modules/World/Terrain/PaintBrushes/LowerSphere.cs index fe82396538..745d3da89d 100644 --- a/OpenSim/Region/Environment/Modules/World/Terrain/PaintBrushes/LowerSphere.cs +++ b/OpenSim/Region/Environment/Modules/World/Terrain/PaintBrushes/LowerSphere.cs @@ -36,29 +36,49 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes public void PaintEffect(ITerrainChannel map, bool[,] mask, double rx, double ry, double rz, double strength, double duration) { - strength = TerrainUtil.MetersToSphericalStrength(strength); - duration = 0.03; //MCP Should be read from ini file - + int s = (int) (Math.Pow(2, strength) + 0.5); + int x; - for (x = 0; x < map.Width; x++) + int xFrom = (int)(rx-s+0.5); + int xTo = (int)(rx+s+0.5) + 1; + int yFrom = (int)(ry-s+0.5); + int yTo = (int)(ry+s+0.5) + 1; + + if (xFrom < 0) + xFrom = 0; + + if (yFrom < 0) + yFrom = 0; + + if (xTo > map.Width) + xTo = map.Width; + + if (yTo > map.Width) + yTo = map.Width; + + for (x = xFrom; x < xTo; x++) { int y; - for (y = 0; y < map.Height; y++) + for (y = yFrom; y < yTo; y++) { if (!mask[x,y]) continue; - // Calculate a sphere and add it to the heighmap - double z = strength; - z *= z; - z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); - + // Calculate a cos-sphere and add it to the heighmap + double r = Math.Sqrt((x-rx) * (x-rx) + ((y-ry) * (y-ry))); + double z = Math.Cos(r * Math.PI / (s * 2)); if (z > 0.0) - map[x, y] -= z * duration; + { + double newz = map[x, y] - z * duration; + if (newz < 0.0) + map[x, y] = 0.0; + else + map[x, y] = newz; + } } } - } + } #endregion } } diff --git a/OpenSim/Region/Environment/Modules/World/Terrain/PaintBrushes/RaiseSphere.cs b/OpenSim/Region/Environment/Modules/World/Terrain/PaintBrushes/RaiseSphere.cs index 92bac63294..56813ab40a 100644 --- a/OpenSim/Region/Environment/Modules/World/Terrain/PaintBrushes/RaiseSphere.cs +++ b/OpenSim/Region/Environment/Modules/World/Terrain/PaintBrushes/RaiseSphere.cs @@ -37,23 +37,37 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.PaintBrushes public void PaintEffect(ITerrainChannel map, bool[,] mask, double rx, double ry, double rz, double strength, double duration) { - duration = 0.03; //MCP Should be read from ini file - strength = TerrainUtil.MetersToSphericalStrength(strength); + int s = (int) (Math.Pow(2, strength) + 0.5); int x; - for (x = 0; x < map.Width; x++) + int xFrom = (int)(rx-s+0.5); + int xTo = (int)(rx+s+0.5) + 1; + int yFrom = (int)(ry-s+0.5); + int yTo = (int)(ry+s+0.5) + 1; + + if (xFrom < 0) + xFrom = 0; + + if (yFrom < 0) + yFrom = 0; + + if (xTo > map.Width) + xTo = map.Width; + + if (yTo > map.Width) + yTo = map.Width; + + for (x = xFrom; x < xTo; x++) { int y; - for (y = 0; y < map.Height; y++) + for (y = yFrom; y < yTo; y++) { if (!mask[x,y]) continue; - // Calculate a sphere and add it to the heighmap - double z = strength; - z *= z; - z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); - + // Calculate a cos-sphere and add it to the heighmap + double r = Math.Sqrt((x-rx) * (x-rx) + ((y-ry) * (y-ry))); + double z = Math.Cos(r * Math.PI / (s * 2)); if (z > 0.0) map[x, y] += z * duration; } diff --git a/OpenSim/Region/Environment/Modules/World/Terrain/Tests/TerrainTest.cs b/OpenSim/Region/Environment/Modules/World/Terrain/Tests/TerrainTest.cs index 5b4bc8c4d2..3511988bdd 100644 --- a/OpenSim/Region/Environment/Modules/World/Terrain/Tests/TerrainTest.cs +++ b/OpenSim/Region/Environment/Modules/World/Terrain/Tests/TerrainTest.cs @@ -37,30 +37,50 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain.Tests [Test] public void BrushTest() { - TerrainChannel map = new TerrainChannel(256, 256); - bool[,] allowMask = new bool[map.Width,map.Height]; + bool[,] allowMask = new bool[256, 256]; int x; int y; - for (x=0; x 0.0, "Raise brush not raising values."); - Assert.That(map[0, 128] > 0.0, "Raise brush lowering edge values."); + effect.PaintEffect(map, allowMask, 128.0, 128.0, -1.0, 2, 0.1); + Assert.That(map[127, 128] > 0.0, "Raise brush should raising value at this point (127,128)."); + Assert.That(map[124, 128] > 0.0, "Raise brush should raising value at this point (124,128)."); + Assert.That(map[123, 128] == 0.0, "Raise brush should not change value at this point (123,128)."); + Assert.That(map[128, 128] == 0.0, "Raise brush should not change value at this point (128,128)."); + Assert.That(map[0, 128] == 0.0, "Raise brush should not change value at this point (0,128)."); + // + // Test LowerSphere + // map = new TerrainChannel(256, 256); + for (x=0; x= 0.0, "Lower should not lowering value below 0.0 at this point (127,128)."); + Assert.That(map[127, 128] == 0.0, "Lower brush should lowering value to 0.0 at this point (127,128)."); + Assert.That(map[124, 128] < 1.0, "Lower brush should lowering value at this point (124,128)."); + Assert.That(map[123, 128] == 1.0, "Lower brush should not change value at this point (123,128)."); + Assert.That(map[128, 128] == 1.0, "Lower brush should not change value at this point (128,128)."); + Assert.That(map[0, 128] == 1.0, "Lower brush should not change value at this point (0,128)."); } [Test]