From 569ba9eb9acb9f024060a41ee4188a11aafa3fa7 Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Tue, 25 Sep 2007 11:48:43 +0000 Subject: Terrain: * Attempted fix for lag/pause when doing lots of updates. * Some naming fixes to libTerrain. * Refactored terrain bitmap generation into a common call for both world map and export. General: * Switched some calls to Console.WriteLine to use MainLog.Warn/Verbose/Notice. --- OpenSim/Region/Environment/Scenes/Scene.cs | 6 +- .../MonoSqliteDataStore.cs | 6 +- .../Region/Terrain.BasicTerrain/TerrainEngine.cs | 92 +++++++++++----------- .../libTerrainBSD/Channel/Editing/Flatten.cs | 2 +- .../libTerrainBSD/Channel/Generators/Fracture.cs | 10 +-- .../libTerrainBSD/Channel/Grid.cs | 4 +- .../libTerrainBSD/Tools/Tools.cs | 8 +- 7 files changed, 66 insertions(+), 62 deletions(-) diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 7381930..8ad8147 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -354,7 +354,7 @@ namespace OpenSim.Region.Environment.Scenes private void UpdateTerrain() { - if (Terrain.Tainted()) + if (Terrain.Tainted() && !Terrain.StillEditing()) { CreateTerrainTexture(); @@ -466,7 +466,7 @@ namespace OpenSim.Region.Environment.Scenes { if (string.IsNullOrEmpty(m_regInfo.estateSettings.terrainFile)) { - Console.WriteLine("No default terrain, procedurally generating..."); + MainLog.Instance.Verbose("TERRAIN", "No default terrain. Generating a new terrain."); Terrain.HillsGenerator(); storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD()); @@ -480,7 +480,7 @@ namespace OpenSim.Region.Environment.Scenes } catch { - Console.WriteLine("Unable to load default terrain, procedurally generating instead..."); + MainLog.Instance.Verbose("TERRAIN","No terrain found in database or default. Generating a new terrain."); Terrain.HillsGenerator(); } storageManager.DataStore.StoreTerrain(Terrain.GetHeights2DD()); diff --git a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs index a0d2399..d2bb106 100644 --- a/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs +++ b/OpenSim/Region/Storage/OpenSim.DataStore.MonoSqlite/MonoSqliteDataStore.cs @@ -141,8 +141,8 @@ namespace OpenSim.DataStore.MonoSqlite prim.Shape = buildShape(shapeRow); } else - { - Console.WriteLine("No shape found for prim in storage, so setting default box shape"); + { + MainLog.Instance.Notice("No shape found for prim in storage, so setting default box shape"); prim.Shape = BoxShape.Default; } group.AddPart(prim); @@ -161,7 +161,7 @@ namespace OpenSim.DataStore.MonoSqlite } else { - Console.WriteLine("No shape found for prim in storage, so setting default box shape"); + MainLog.Instance.Notice("No shape found for prim in storage, so setting default box shape"); prim.Shape = BoxShape.Default; } createdObjects[new LLUUID(objID)].AddPart(prim); diff --git a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs index c3c4935..d010a03 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/TerrainEngine.cs @@ -81,6 +81,11 @@ namespace OpenSim.Region.Terrain /// public double minLower = 500.0; + /// + /// The last time the terrain was edited + /// + public DateTime lastEdit = DateTime.Now; + /// /// Whether or not the terrain has been modified since it was last saved and sent to the Physics engine. @@ -120,6 +125,16 @@ namespace OpenSim.Region.Terrain return (tainted != 0); } + public bool StillEditing() + { + TimeSpan gap = DateTime.Now - lastEdit; + + if (gap.TotalSeconds <= 2.0) + return true; + + return false; + } + public bool Tainted(int x, int y) { return (heightmap.diff[x / 16, y / 16] != 0); @@ -197,6 +212,8 @@ namespace OpenSim.Region.Terrain } } + lastEdit = DateTime.Now; + return; } @@ -1172,28 +1189,7 @@ namespace OpenSim.Region.Terrain { try { - Bitmap gradientmapLd = new Bitmap(gradientmap); - - int pallete = gradientmapLd.Height; - - Bitmap bmp = new Bitmap(heightmap.w, heightmap.h); - Color[] colours = new Color[pallete]; - - for (int i = 0; i < pallete; i++) - { - colours[i] = gradientmapLd.GetPixel(0, i); - } - - Channel copy = heightmap.Copy(); - for (int y = 0; y < copy.h; y++) - { - for (int x = 0; x < copy.w; x++) - { - // 512 is the largest possible height before colours clamp - int colorindex = (int)(Math.Max(Math.Min(1.0, copy.Get(x, y) / 512.0), 0.0) * (pallete - 1)); - bmp.SetPixel(x, y, colours[colorindex]); - } - } + Bitmap bmp = TerrainToBitmap(gradientmap); bmp.Save(filename, ImageFormat.Png); } @@ -1212,30 +1208,8 @@ namespace OpenSim.Region.Terrain byte[] imageData = null; try { - Bitmap gradientmapLd = new Bitmap(gradientmap); - - int pallete = gradientmapLd.Height; - - Bitmap bmp = new Bitmap(heightmap.w, heightmap.h); - Color[] colours = new Color[pallete]; + Bitmap bmp = TerrainToBitmap(gradientmap); - for (int i = 0; i < pallete; i++) - { - colours[i] = gradientmapLd.GetPixel(0, i); - } - - Channel copy = heightmap.Copy(); - for (int y = 0; y < copy.h; y++) - { - for (int x = 0; x < copy.w; x++) - { - // 512 is the largest possible height before colours clamp - int colorindex = (int)(Math.Max(Math.Min(1.0, copy.Get(x, copy.h - y) / 512.0), 0.0) * (pallete - 1)); - bmp.SetPixel(x, y, colours[colorindex]); - } - } - - //bmp.Save(filename, System.Drawing.Imaging.ImageFormat.Png); imageData = OpenJPEG.EncodeFromImage(bmp, true ); } @@ -1246,5 +1220,33 @@ namespace OpenSim.Region.Terrain return imageData; } + + private Bitmap TerrainToBitmap(string gradientmap) + { + Bitmap gradientmapLd = new Bitmap(gradientmap); + + int pallete = gradientmapLd.Height; + + Bitmap bmp = new Bitmap(heightmap.w, heightmap.h); + Color[] colours = new Color[pallete]; + + for (int i = 0; i < pallete; i++) + { + colours[i] = gradientmapLd.GetPixel(0, i); + } + + Channel copy = heightmap.Copy(); + for (int y = 0; y < copy.h; y++) + { + for (int x = 0; x < copy.w; x++) + { + // 512 is the largest possible height before colours clamp + int colorindex = (int)(Math.Max(Math.Min(1.0, copy.Get(x, y) / 512.0), 0.0) * (pallete - 1)); + bmp.SetPixel(x, y, colours[colorindex]); + } + } + return bmp; + } + } } diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Editing/Flatten.cs index 8e894ab..45bb06b 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; - Set(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/Generators/Fracture.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs index 3e88aa9..3a9b7f7 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Generators/Fracture.cs @@ -100,7 +100,7 @@ namespace libTerrain { for (int y = 0; y < h; y++) { - double miny = Tools.linearInterpolate(a[1], b[1], (double)x / (double)w); + double miny = Tools.LinearInterpolate(a[1], b[1], (double)x / (double)w); if (v >= 0.5) { @@ -108,14 +108,14 @@ namespace libTerrain { if (y > miny) { - map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); + map[x, y] += Tools.LinearInterpolate(scalemin, scalemax, z); } } else { if (y < miny) { - map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); + map[x, y] += Tools.LinearInterpolate(scalemin, scalemax, z); } } } @@ -125,14 +125,14 @@ namespace libTerrain { if (x > miny) { - map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); + map[x, y] += Tools.LinearInterpolate(scalemin, scalemax, z); } } else { if (x < miny) { - map[x, y] += Tools.linearInterpolate(scalemin, scalemax, z); + map[x, y] += Tools.LinearInterpolate(scalemin, scalemax, z); } } } diff --git a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs index 0930a36..0155791 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Channel/Grid.cs @@ -341,7 +341,7 @@ namespace libTerrain { for (y = 0; y < h; y++) { - Set(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; @@ -354,7 +354,7 @@ namespace libTerrain { for (y = 0; y < h; y++) { - Set(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/Tools/Tools.cs b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Tools.cs index 60dbf62..13338a2 100644 --- a/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Tools.cs +++ b/OpenSim/Region/Terrain.BasicTerrain/libTerrainBSD/Tools/Tools.cs @@ -37,17 +37,19 @@ namespace libTerrain { class Tools { - public static double linearInterpolate(double a, double b, double amount) + public static double LinearInterpolate(double a, double b, double amount) { return a + ((b - a) * amount); } - public static double exponentialInterpolate(double a, double b, double amount) + + public static double ExponentialInterpolate(double a, double b, double amount) { a = Math.Pow(a, amount); b = Math.Pow(b - a, 1.0 - amount); return a+b; } - public static int powerOf2Log2(int n) { + + public static int PowerOf2Log2(int n) { for (int i = 0; i < 31; i++) { if ((n & 1) == 1) { return i; -- cgit v1.1