From cf61c74e90324e07cb4b15f9c597fef00c047c75 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 24 Mar 2012 02:16:44 +0000 Subject: [PATCH 1/4] Give feedback when "terrain save-tile" is not successfully invoked. --- OpenSim/Framework/RegionInfo.cs | 6 ++ .../World/Terrain/ITerrainLoader.cs | 15 ++++ .../World/Terrain/TerrainModule.cs | 73 ++++++++++--------- 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/OpenSim/Framework/RegionInfo.cs b/OpenSim/Framework/RegionInfo.cs index 5ba3863529..a5055247c7 100644 --- a/OpenSim/Framework/RegionInfo.cs +++ b/OpenSim/Framework/RegionInfo.cs @@ -421,12 +421,18 @@ namespace OpenSim.Framework set { m_internalEndPoint = value; } } + /// + /// The x co-ordinate of this region in map tiles (e.g. 1000). + /// public uint RegionLocX { get { return m_regionLocX.Value; } set { m_regionLocX = value; } } + /// + /// The y co-ordinate of this region in map tiles (e.g. 1000). + /// public uint RegionLocY { get { return m_regionLocY.Value; } diff --git a/OpenSim/Region/CoreModules/World/Terrain/ITerrainLoader.cs b/OpenSim/Region/CoreModules/World/Terrain/ITerrainLoader.cs index 7237f90a38..d407617ec5 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/ITerrainLoader.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/ITerrainLoader.cs @@ -38,6 +38,21 @@ namespace OpenSim.Region.CoreModules.World.Terrain ITerrainChannel LoadStream(Stream stream); void SaveFile(string filename, ITerrainChannel map); void SaveStream(Stream stream, ITerrainChannel map); + + /// + /// Save a number of map tiles to a single big image file. + /// + /// + /// If the image file already exists then the tiles saved will replace those already in the file - other tiles + /// will be untouched. + /// + /// The terrain file to save + /// The map x co-ordinate at which to begin the save. + /// The may y co-ordinate at which to begin the save. + /// The number of tiles to save along the X axis. + /// The number of tiles to save along the Y axis. + /// The width of a map tile. + /// The height of a map tile. void SaveFile(ITerrainChannel map, string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int regionSizeX, int regionSizeY); } } \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index 9cd8f2beb3..7c5ea2975a 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -561,49 +561,56 @@ namespace OpenSim.Region.CoreModules.World.Terrain } /// - /// Saves the terrain to a larger terrain file. + /// Save a number of map tiles to a single big image file. /// + /// + /// If the image file already exists then the tiles saved will replace those already in the file - other tiles + /// will be untouched. + /// /// The terrain file to save - /// The width of the file in units - /// The height of the file in units - /// Where to begin our slice - /// Where to begin our slice + /// The number of tiles to save along the X axis. + /// The number of tiles to save along the Y axis. + /// The map x co-ordinate at which to begin the save. + /// The may y co-ordinate at which to begin the save. public void SaveToFile(string filename, int fileWidth, int fileHeight, int fileStartX, int fileStartY) { int offsetX = (int)m_scene.RegionInfo.RegionLocX - fileStartX; int offsetY = (int)m_scene.RegionInfo.RegionLocY - fileStartY; - if (offsetX >= 0 && offsetX < fileWidth && offsetY >= 0 && offsetY < fileHeight) + if (offsetX < 0 || offsetX >= fileWidth || offsetY < 0 || offsetY >= fileHeight) { - // this region is included in the tile request - foreach (KeyValuePair loader in m_loaders) - { - if (filename.EndsWith(loader.Key)) - { - lock (m_scene) - { - loader.Value.SaveFile(m_channel, filename, offsetX, offsetY, - fileWidth, fileHeight, - (int)Constants.RegionSize, - (int)Constants.RegionSize); + MainConsole.Instance.OutputFormat( + "ERROR: file width + minimum X tile and file height + minimum Y tile must incorporate the current region at ({0},{1}). File width {2} from {3} and file height {4} from {5} does not.", + m_scene.RegionInfo.RegionLocX, m_scene.RegionInfo.RegionLocY, fileWidth, fileStartX, fileHeight, fileStartY); - m_log.InfoFormat("[TERRAIN]: Saved terrain from {0} to {1}", m_scene.RegionInfo.RegionName, filename); - } - - return; - } - } - - m_log.ErrorFormat( - "[TERRAIN]: Could not save terrain from {0} to {1}. Valid file extensions are {2}", - m_scene.RegionInfo.RegionName, filename, m_supportedFileExtensions); + return; } -// else -// { -// m_log.ErrorFormat( -// "[TERRAIN]: Could not save terrain from {0} to {1}. {2} {3} {4} {5} {6} {7}", -// m_scene.RegionInfo.RegionName, filename, fileWidth, fileHeight, fileStartX, fileStartY, offsetX, offsetY); -// } + + // this region is included in the tile request + foreach (KeyValuePair loader in m_loaders) + { + if (filename.EndsWith(loader.Key)) + { + lock (m_scene) + { + loader.Value.SaveFile(m_channel, filename, offsetX, offsetY, + fileWidth, fileHeight, + (int)Constants.RegionSize, + (int)Constants.RegionSize); + + MainConsole.Instance.OutputFormat( + "Saved terrain from ({0},{1}) to ({2},{3}) from {4} to {5}", + fileStartX, fileStartY, fileStartX + fileWidth - 1, fileStartY + fileHeight - 1, + m_scene.RegionInfo.RegionName, filename); + } + + return; + } + } + + MainConsole.Instance.OutputFormat( + "ERROR: Could not save terrain from {0} to {1}. Valid file extensions are {2}", + m_scene.RegionInfo.RegionName, filename, m_supportedFileExtensions); } /// From f53c6b25940a51fce208b3dae21fad49ab8d1efe Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 24 Mar 2012 02:30:21 +0000 Subject: [PATCH 2/4] Use system provided temporary file in "terrain save-tile" to avoid problems with drive letters on windows Thanks to Garmin Kawaguichi for picking up on this and providing an initial solution (which I adapted). --- .../World/Terrain/FileLoaders/GenericSystemDrawing.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs index 21a9999ba0..58925fd624 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs @@ -132,13 +132,13 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders { // We need to do this because: // "Saving the image to the same file it was constructed from is not allowed and throws an exception." - string tempName = offsetX + "_ " + offsetY + "_" + filename; + string tempName = Path.GetTempFileName(); Bitmap entireBitmap = null; Bitmap thisBitmap = null; if (File.Exists(filename)) { - File.Copy(filename, tempName); + File.Copy(filename, tempName, true); entireBitmap = new Bitmap(tempName); if (entireBitmap.Width != fileWidth * regionSizeX || entireBitmap.Height != fileHeight * regionSizeY) { @@ -152,7 +152,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders } thisBitmap = CreateGrayscaleBitmapFromMap(m_channel); - Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY); +// Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY); for (int x = 0; x < regionSizeX; x++) for (int y = 0; y < regionSizeY; y++) entireBitmap.SetPixel(x + offsetX * regionSizeX, y + (fileHeight - 1 - offsetY) * regionSizeY, thisBitmap.GetPixel(x, y)); From f03c3c062e7829309d76ac76d5d2b2e7bc8b62dc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 24 Mar 2012 02:41:45 +0000 Subject: [PATCH 3/4] Hack example on to "terrain save-tile" extended help. Thanks to Garmin Kawaguichi for the initially suggested text. --- OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index 7c5ea2975a..17e97372b0 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -1199,6 +1199,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain "Integer"); saveToTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first section on the file", "Integer"); + saveToTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first tile on the file\n" + + "= Example =\n" + + "To save a PNG file for a set of map tiles 2 regions wide and 3 regions high from map co-ordinate (9910,10234)\n" + + " # terrain save-tile ST06.png 2 3 9910 10234\n", + "Integer"); + // Terrain adjustments Command fillRegionCommand = new Command("fill", CommandIntentions.COMMAND_HAZARDOUS, InterfaceFillTerrain, "Fills the current heightmap with a specified value."); From 4f17537555856823cd3c3cc80708cc1d8bc574b4 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Sat, 24 Mar 2012 03:07:01 +0000 Subject: [PATCH 4/4] Allow the user to enter help topics in upper or lowercase. Forcing uppercase (e.g. help Assets) is too annoying. Thanks to WhiteStar for pointing this out. --- OpenSim/Framework/Console/CommandConsole.cs | 22 +++++++++++---------- OpenSim/Region/Application/OpenSimBase.cs | 11 ++++++----- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs index 2bb7de1cae..c5d6b78686 100644 --- a/OpenSim/Framework/Console/CommandConsole.cs +++ b/OpenSim/Framework/Console/CommandConsole.cs @@ -188,19 +188,21 @@ namespace OpenSim.Framework.Console { lock (m_modulesCommands) { - if (m_modulesCommands.ContainsKey(moduleName)) + foreach (string key in m_modulesCommands.Keys) { - List commands = m_modulesCommands[moduleName]; - var ourHelpText = commands.ConvertAll(c => string.Format("{0} - {1}", c.help_text, c.long_help)); - ourHelpText.Sort(); - helpText.AddRange(ourHelpText); + // Allow topic help requests to succeed whether they are upper or lowercase. + if (moduleName.ToLower() == key.ToLower()) + { + List commands = m_modulesCommands[key]; + var ourHelpText = commands.ConvertAll(c => string.Format("{0} - {1}", c.help_text, c.long_help)); + ourHelpText.Sort(); + helpText.AddRange(ourHelpText); - return true; - } - else - { - return false; + return true; + } } + + return false; } } diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 484159ce15..5de3f25b7d 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -248,15 +248,16 @@ namespace OpenSim { string capitalizedTopic = char.ToUpper(topic[0]) + topic.Substring(1); + // This is a hack to allow the user to enter the help command in upper or lowercase. This will go + // away at some point. + m_console.Commands.AddCommand(capitalizedTopic, false, "help " + topic, + "help " + capitalizedTopic, + "Get help on plugin command '" + topic + "'", + HandleCommanderHelp); m_console.Commands.AddCommand(capitalizedTopic, false, "help " + capitalizedTopic, "help " + capitalizedTopic, "Get help on plugin command '" + topic + "'", HandleCommanderHelp); -// -// m_console.Commands.AddCommand("General", false, topic, -// topic, -// "Execute subcommand for plugin '" + topic + "'", -// null); ICommander commander = null;