From eae7be1e36733580f67da742403147701f8a8d08 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Tue, 26 Feb 2008 14:51:13 +0000 Subject: [PATCH] * Reimplementing Terrain as Region Modules * New method involves interfaces for ** Terrain Paint Brushes (ie raise brush, lower brush, etc) ** Terrain Flood Brushes (ie raise area, lower area, etc) ** Terrain Effects (ie erosion, etc) [= W.I.P, not committed] * Provided sample implementation for Raise Paint and Raise Area brushes. --- .../Modules/Terrain/FloodBrushes/RaiseArea.cs | 30 ++++++++++++++ .../Terrain/PaintBrushes/RaiseSphere.cs | 41 +++++++++++++++++++ .../Modules/Terrain/TerrainModule.cs | 10 +++++ 3 files changed, 81 insertions(+) create mode 100644 OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/RaiseArea.cs create mode 100644 OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs diff --git a/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/RaiseArea.cs b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/RaiseArea.cs new file mode 100644 index 0000000000..ce83a4caf4 --- /dev/null +++ b/OpenSim/Region/Environment/Modules/Terrain/FloodBrushes/RaiseArea.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Region.Environment.Modules.Terrain; +using OpenSim.Region.Environment.Interfaces; + +namespace OpenSim.Region.Environment.Modules.Terrain.FloodBrushes +{ + class RaiseArea : ITerrainFloodEffect + { + #region ITerrainFloodEffect Members + + public void FloodEffect(ITerrainChannel map, bool[,] fillArea, double strength) + { + int x, y; + for (x = 0; x < map.Width; x++) + { + for (y = 0; y < map.Height; y++) + { + if (fillArea[x, y] == true) + { + map[x, y] += strength; + } + } + } + } + + #endregion + } +} diff --git a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs new file mode 100644 index 0000000000..cf95f3fb2e --- /dev/null +++ b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; +using OpenSim.Region.Environment.Modules.Terrain; +using OpenSim.Region.Environment.Interfaces; + +namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes +{ + class RaiseSphere : ITerrainPaintableEffect + { + #region ITerrainPaintableEffect Members + + public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength) + { + int x, y; + for (x = 0; x < map.Width; x++) + { + // Skip everything unlikely to be affected + if (Math.Abs(x - rx) > strength * 1.1) + continue; + + for (y = 0; y < map.Height; y++) + { + // Skip everything unlikely to be affected + if (Math.Abs(y - ry) > strength * 1.1) + continue; + + // Calculate a sphere and add it to the heighmap + double z = strength; + z *= z; + z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); + + if (z > 0.0) + map[x, y] += z; + } + } + } + + #endregion + } +} diff --git a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs index 1b765eb63b..4f8b377eda 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs @@ -39,6 +39,16 @@ using libsecondlife; namespace OpenSim.Region.Environment.Modules.Terrain { + public interface ITerrainPaintableEffect + { + void PaintEffect(ITerrainChannel map, double x, double y, double strength); + } + + public interface ITerrainFloodEffect + { + void FloodEffect(ITerrainChannel map, Boolean[,] fillArea, double strength); + } + /// /// A new version of the old Channel class, simplified ///