From f64611862a46c91f416134146cb53fa720a96ec5 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Wed, 5 Mar 2008 00:52:35 +0000 Subject: * New Terrain Module (disabled, search for 'usingTerrainModule = false' to reenable) * *Much* faster terraforming (woot!) * New "Brushes" design, so you can create custom terraforming brushes then apply those inplace of the standard tools. (ie an Erode Brush for example) * New specialised "Flood Brushes" to do large area effects, ie, raise-area, now takes a bitmap rather than repeats the ordinary raise brush a thousand times. * New modular file Load/Save systems -- write importers/exporters for multiple formats without having to hard code the whole thing in. * Coming soon - effects system, ie the old Erosion functions, etc. for one-shot effects. --- .../Environment/Interfaces/ITerrainChannel.cs | 1 + .../Modules/Terrain/PaintBrushes/FlattenSphere.cs | 4 +-- .../Modules/Terrain/PaintBrushes/LowerSphere.cs | 4 +-- .../Modules/Terrain/PaintBrushes/NoiseSphere.cs | 4 +-- .../Modules/Terrain/PaintBrushes/RaiseSphere.cs | 4 +-- .../Modules/Terrain/PaintBrushes/SmoothSphere.cs | 4 +-- .../Environment/Modules/Terrain/TerrainModule.cs | 40 +++++++++++++++++++--- OpenSim/Region/Environment/Scenes/Scene.cs | 2 +- OpenSim/Region/Environment/Scenes/SceneBase.cs | 2 +- .../Region/Terrain.BasicTerrain/TerrainEngine.cs | 9 +++-- 10 files changed, 56 insertions(+), 18 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Environment/Interfaces/ITerrainChannel.cs b/OpenSim/Region/Environment/Interfaces/ITerrainChannel.cs index f0d600a..62074cb 100644 --- a/OpenSim/Region/Environment/Interfaces/ITerrainChannel.cs +++ b/OpenSim/Region/Environment/Interfaces/ITerrainChannel.cs @@ -34,5 +34,6 @@ namespace OpenSim.Region.Environment.Interfaces double this[int x, int y] { get; set; } int Width { get; } float[] GetFloatsSerialised(); + bool Tainted(int x, int y); } } diff --git a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/FlattenSphere.cs b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/FlattenSphere.cs index c1ef9d6..0e98111 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/FlattenSphere.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/FlattenSphere.cs @@ -72,7 +72,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes #region ITerrainPaintableEffect Members - public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength) + public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) { int x, y; double[,] tweak = new double[map.Width, map.Height]; @@ -106,7 +106,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes { for (y = 0; y < map.Height; y++) { - double z = SphericalFactor(x, y, rx, ry, strength); + double z = SphericalFactor(x, y, rx, ry, strength) * duration; if (z > 0) // add in non-zero amount { diff --git a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/LowerSphere.cs b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/LowerSphere.cs index b6696a9..2201584 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/LowerSphere.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/LowerSphere.cs @@ -34,7 +34,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes { #region ITerrainPaintableEffect Members - public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength) + public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) { int x, y; for (x = 0; x < map.Width; x++) @@ -55,7 +55,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); if (z > 0.0) - map[x, y] -= z; + map[x, y] -= z * duration; } } } diff --git a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/NoiseSphere.cs b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/NoiseSphere.cs index 0471408..776e31f 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/NoiseSphere.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/NoiseSphere.cs @@ -35,7 +35,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes { #region ITerrainPaintableEffect Members - public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength) + public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) { int x, y; for (x = 0; x < map.Width; x++) @@ -63,7 +63,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes } if (z > 0.0) - map[x, y] += (noise - 0.5) * z; + map[x, y] += (noise - 0.5) * z * duration; } } } diff --git a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs index b0fda8e..5b9f410 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/RaiseSphere.cs @@ -34,7 +34,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes { #region ITerrainPaintableEffect Members - public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength) + public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) { int x, y; for (x = 0; x < map.Width; x++) @@ -55,7 +55,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes z -= ((x - rx) * (x - rx)) + ((y - ry) * (y - ry)); if (z > 0.0) - map[x, y] += z; + map[x, y] += z * duration; } } } diff --git a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/SmoothSphere.cs b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/SmoothSphere.cs index d3ae73e..90bbafc 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/SmoothSphere.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/PaintBrushes/SmoothSphere.cs @@ -72,7 +72,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes #region ITerrainPaintableEffect Members - public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength) + public void PaintEffect(ITerrainChannel map, double rx, double ry, double strength, double duration) { int x, y; double[,] tweak = new double[map.Width, map.Height]; @@ -116,7 +116,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain.PaintBrushes { double da = z; double a = (map[x, y] - tweak[x, y]) * da; - double newz = map[x, y] - a; + double newz = map[x, y] - (a * duration); if (newz > 0.0) map[x, y] = newz; diff --git a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs index 1542230..2cf77ff 100644 --- a/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs +++ b/OpenSim/Region/Environment/Modules/Terrain/TerrainModule.cs @@ -38,7 +38,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain { public interface ITerrainPaintableEffect { - void PaintEffect(ITerrainChannel map, double x, double y, double strength); + void PaintEffect(ITerrainChannel map, double x, double y, double strength, double duration); } public interface ITerrainFloodEffect @@ -63,6 +63,7 @@ namespace OpenSim.Region.Environment.Modules.Terrain public class TerrainChannel : ITerrainChannel { private double[,] map; + private bool[,] taint; public int Width { @@ -103,29 +104,41 @@ namespace OpenSim.Region.Environment.Modules.Terrain } set { + taint[x / 16, y / 16] = true; map[x, y] = value; } } + public bool Tainted(int x, int y) + { + return taint[x / 16, y / 16]; + } + public TerrainChannel() { map = new double[Constants.RegionSize, Constants.RegionSize]; + taint = new bool[Constants.RegionSize / 16, Constants.RegionSize / 16]; } public TerrainChannel(double[,] import) { map = import; + taint = new bool[import.GetLength(0), import.GetLength(1)]; } public TerrainChannel(bool createMap) { if (createMap) + { map = new double[Constants.RegionSize, Constants.RegionSize]; + taint = new bool[Constants.RegionSize / 16, Constants.RegionSize / 16]; + } } public TerrainChannel(int w, int h) { map = new double[w, h]; + taint = new bool[w / 16, h / 16]; } } @@ -246,7 +259,14 @@ namespace OpenSim.Region.Environment.Modules.Terrain if (m_painteffects.ContainsKey((StandardTerrainEffects)action)) { m_painteffects[(StandardTerrainEffects)action].PaintEffect( - m_channel, west, south, Math.Pow(size, 2.0)); + m_channel, west, south, Math.Pow(size, 2.0), seconds); + + bool usingTerrainModule = false; + + if (usingTerrainModule) + { + remoteClient.SendLayerData(m_channel.GetFloatsSerialised()); + } } else { @@ -258,20 +278,32 @@ namespace OpenSim.Region.Environment.Modules.Terrain if (m_floodeffects.ContainsKey((StandardTerrainEffects)action)) { bool[,] fillArea = new bool[m_channel.Width, m_channel.Height]; - fillArea.Initialize(); int x, y; + for (x = 0; x < m_channel.Width; x++) { for (y = 0; y < m_channel.Height; y++) { - fillArea[x, y] = true; + if (x < east && x > west) + { + if (y < south && y > north) + { + fillArea[x, y] = true; + } + } } } m_floodeffects[(StandardTerrainEffects)action].FloodEffect( m_channel, fillArea, Math.Pow(size, 2.0)); + bool usingTerrainModule = false; + + if (usingTerrainModule) + { + remoteClient.SendLayerData(m_channel.GetFloatsSerialised()); + } } else { diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 1b1549e..ccdd096 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -869,7 +869,7 @@ namespace OpenSim.Region.Environment.Scenes public void SendTerrainUpdate(bool checkForTainted) { - float[] terData = Terrain.GetHeights1D(); + float[] terData = Heightmap.GetFloatsSerialised(); Broadcast(delegate(IClientAPI client) { diff --git a/OpenSim/Region/Environment/Scenes/SceneBase.cs b/OpenSim/Region/Environment/Scenes/SceneBase.cs index 9ee5e0e..2a2dea1 100644 --- a/OpenSim/Region/Environment/Scenes/SceneBase.cs +++ b/OpenSim/Region/Environment/Scenes/SceneBase.cs @@ -112,7 +112,7 @@ namespace OpenSim.Region.Environment.Scenes /// Client to send to public virtual void SendLayerData(IClientAPI RemoteClient) { - bool usingTerrainModule = true; + bool usingTerrainModule = false; if (usingTerrainModule) { diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs index b34ca5e..c6feb03 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs @@ -297,9 +297,14 @@ namespace OpenSim.Region.Terrain { for (int y = 0; y < 16; y++) { - if (IsTainted(x*16, y*16)) + if (IsTainted(x * 16, y * 16)) { - remoteUser.SendLayerData(x, y, GetHeights1D()); + bool usingTerrainModule = false; + + if (!usingTerrainModule) + { + remoteUser.SendLayerData(x, y, GetHeights1D()); + } } } } -- cgit v1.1