From dd6db7293975bffc3693e0164dda8307a4e4bcf7 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Sun, 19 Jan 2014 10:09:43 -0800 Subject: varregion: add --displacement parameter to 'load oar'. Adds displacment to all objects and terrain loaded from the oar. As an example, if you have a 512x512 region and an old 256x256 oar, doing load oar --displacement "<128,128,0>" oarFile.oar will load the object (and terrain) into the middle of the 512x512 region. If displacement is not specified, 'load oar' works like it always has. If you have a 5 --- .../RemoteController/RemoteAdminPlugin.cs | 3 +- OpenSim/Region/Application/OpenSim.cs | 5 +-- .../World/Archiver/ArchiveReadRequest.cs | 22 +++++++++++-- .../CoreModules/World/Archiver/ArchiverModule.cs | 34 ++++++++++++++----- .../World/Archiver/Tests/ArchiverTests.cs | 2 +- .../CoreModules/World/Terrain/TerrainModule.cs | 38 ++++++++++++++++++++-- .../Framework/Interfaces/IRegionArchiverModule.cs | 6 ++-- .../Region/Framework/Interfaces/ITerrainModule.cs | 1 + 8 files changed, 91 insertions(+), 20 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 3cdf8d3..3cd6b3b 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -1484,8 +1484,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController } IRegionArchiverModule archiver = scene.RequestModuleInterface(); + Vector3 displacement = new Vector3(0f, 0f, 0f); if (archiver != null) - archiver.DearchiveRegion(filename, mergeOar, skipAssets, Guid.Empty); + archiver.DearchiveRegion(filename, mergeOar, skipAssets, displacement, Guid.Empty); else throw new Exception("Archiver module not present for scene"); diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 0a6ae98..a336178 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -266,10 +266,11 @@ namespace OpenSim SavePrimsXml2); m_console.Commands.AddCommand("Archiving", false, "load oar", - "load oar [--merge] [--skip-assets] []", + "load oar [--merge] [--skip-assets] [--displacement \"\"] []", "Load a region's data from an OAR archive.", "--merge will merge the OAR with the existing scene." + Environment.NewLine - + "--skip-assets will load the OAR but ignore the assets it contains." + Environment.NewLine + + "--skip-assets will load the OAR but ignore the assets it contains." + Environment.NewLine + + "--displacement will add this value to the position of every object loaded" + Environment.NewLine + "The path can be either a filesystem location or a URI." + " If this is not given then the command looks for an OAR named region.oar in the current directory.", LoadOar); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index d451b9e..d249129 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs @@ -104,6 +104,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver /// protected bool m_skipAssets; + /// + /// Displacement added to each object as it is added to the world + /// + protected Vector3 m_displacement = new Vector3(0f, 0f, 0f); + /// /// Used to cache lookups for valid uuids. /// @@ -132,7 +137,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver private IAssetService m_assetService = null; - public ArchiveReadRequest(Scene scene, string loadPath, bool merge, bool skipAssets, Guid requestId) + public ArchiveReadRequest(Scene scene, string loadPath, bool merge, bool skipAssets, Vector3 displacement, Guid requestId) { m_rootScene = scene; @@ -153,6 +158,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver m_merge = merge; m_skipAssets = skipAssets; m_requestId = requestId; + m_displacement = displacement; // Zero can never be a valid user id m_validUserUuids[UUID.Zero] = false; @@ -445,6 +451,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); + // Happily this does not do much to the object since it hasn't been added to the scene yet + sceneObject.AbsolutePosition += m_displacement; + + bool isTelehub = (sceneObject.UUID == oldTelehubUUID) && (oldTelehubUUID != UUID.Zero); // For now, give all incoming scene objects new uuids. This will allow scenes to be cloned @@ -809,7 +819,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver ITerrainModule terrainModule = scene.RequestModuleInterface(); MemoryStream ms = new MemoryStream(data); - terrainModule.LoadFromStream(terrainPath, ms); + if (m_displacement != Vector3.Zero) + { + Vector2 terrainDisplacement = new Vector2(m_displacement.X, m_displacement.Y); + terrainModule.LoadFromStream(terrainPath, terrainDisplacement, ms); + } + else + { + terrainModule.LoadFromStream(terrainPath, ms); + } ms.Close(); m_log.DebugFormat("[ARCHIVER]: Restored terrain {0}", terrainPath); diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs index 1be6386..fb694de 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs @@ -33,11 +33,14 @@ using log4net; using NDesk.Options; using Nini.Config; using Mono.Addins; + using OpenSim.Framework; using OpenSim.Framework.Console; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; +using OpenMetaverse; + namespace OpenSim.Region.CoreModules.World.Archiver { /// @@ -101,9 +104,22 @@ namespace OpenSim.Region.CoreModules.World.Archiver { bool mergeOar = false; bool skipAssets = false; + Vector3 displacement = new Vector3(0f, 0f, 0f); - OptionSet options = new OptionSet().Add("m|merge", delegate (string v) { mergeOar = v != null; }); - options.Add("s|skip-assets", delegate (string v) { skipAssets = v != null; }); + OptionSet options = new OptionSet(); + options.Add("m|merge", delegate (string v) { mergeOar = (v != null); }); + options.Add("s|skip-assets", delegate (string v) { skipAssets = (v != null); }); + options.Add("displacement=", delegate (string v) { + try + { + displacement = v == null ? new Vector3(0f, 0f, 0f) : Vector3.Parse(v); + } + catch (Exception e) + { + m_log.ErrorFormat("[ARCHIVER MODULE] failure parsing displacement"); + displacement = new Vector3(0f, 0f, 0f); + } + }); // Send a message to the region ready module /* bluewall* Disable this for the time being @@ -124,11 +140,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver if (mainParams.Count > 2) { - DearchiveRegion(mainParams[2], mergeOar, skipAssets, Guid.Empty); + DearchiveRegion(mainParams[2], mergeOar, skipAssets, displacement, Guid.Empty); } else { - DearchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, mergeOar, skipAssets, Guid.Empty); + DearchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, mergeOar, skipAssets, displacement, Guid.Empty); } } @@ -198,23 +214,23 @@ namespace OpenSim.Region.CoreModules.World.Archiver public void DearchiveRegion(string loadPath) { - DearchiveRegion(loadPath, false, false, Guid.Empty); + DearchiveRegion(loadPath, false, false, new Vector3(0f, 0f, 0f), Guid.Empty); } - public void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId) + public void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Vector3 displacement, Guid requestId) { m_log.InfoFormat( "[ARCHIVER]: Loading archive to region {0} from {1}", Scene.RegionInfo.RegionName, loadPath); - new ArchiveReadRequest(Scene, loadPath, merge, skipAssets, requestId).DearchiveRegion(); + new ArchiveReadRequest(Scene, loadPath, merge, skipAssets, displacement, requestId).DearchiveRegion(); } public void DearchiveRegion(Stream loadStream) { - DearchiveRegion(loadStream, false, false, Guid.Empty); + DearchiveRegion(loadStream, false, false, new Vector3(0f, 0f, 0f), Guid.Empty); } - public void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId) + public void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Vector3 displacement, Guid requestId) { new ArchiveReadRequest(Scene, loadStream, merge, skipAssets, requestId).DearchiveRegion(); } diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs index eec1cec..c412acb 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs @@ -752,7 +752,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests byte[] archive = archiveWriteStream.ToArray(); MemoryStream archiveReadStream = new MemoryStream(archive); - m_archiverModule.DearchiveRegion(archiveReadStream, true, false, Guid.Empty); + m_archiverModule.DearchiveRegion(archiveReadStream, true, false, new Vector3(0f, 0f, 0f), Guid.Empty); SceneObjectPart object1Existing = m_scene.GetSceneObjectPart(part1.Name); Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge"); diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index 9766bfe..7bc5e88 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -314,12 +314,18 @@ namespace OpenSim.Region.CoreModules.World.Terrain LoadFromStream(filename, URIFetch(pathToTerrainHeightmap)); } + public void LoadFromStream(string filename, Stream stream) + { + Vector2 defaultDisplacement = new Vector2(0f, 0f); + LoadFromStream(filename, defaultDisplacement, stream); + } + /// /// Loads a terrain file from a stream and installs it in the scene. /// /// Filename to terrain file. Type is determined by extension. /// - public void LoadFromStream(string filename, Stream stream) + public void LoadFromStream(string filename, Vector2 displacement, Stream stream) { foreach (KeyValuePair loader in m_loaders) { @@ -330,8 +336,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain try { ITerrainChannel channel = loader.Value.LoadStream(stream); - m_scene.Heightmap = channel; - m_channel = channel; + MergeTerrainIntoExisting(channel, displacement); UpdateRevertMap(); } catch (NotImplementedException) @@ -351,6 +356,33 @@ namespace OpenSim.Region.CoreModules.World.Terrain throw new TerrainException(String.Format("unable to load heightmap from file {0}: no loader available for that format", filename)); } + private void MergeTerrainIntoExisting(ITerrainChannel channel, Vector2 displacement) + { + if (displacement == Vector2.Zero) + { + // If there is no displacement, just use this channel as the new heightmap + m_scene.Heightmap = channel; + m_channel = channel; + } + else + { + // If there is a displacement, we copy the loaded heightmap into the overall region + for (int xx = 0; xx < channel.Width; xx++) + { + for (int yy = 0; yy < channel.Height; yy++) + { + int dispX = xx + (int)displacement.X; + int dispY = yy + (int)displacement.Y; + if (dispX >= 0 && dispX < m_channel.Width + && dispY >= 0 && dispY < m_channel.Height) + { + m_channel[dispX, dispY] = channel[xx, yy]; + } + } + } + } + } + private static Stream URIFetch(Uri uri) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); diff --git a/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs index 3fafc47..1c00b6c 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs @@ -29,6 +29,8 @@ using System; using System.Collections.Generic; using System.IO; +using OpenMetaverse; + namespace OpenSim.Region.Framework.Interfaces { /// @@ -109,7 +111,7 @@ namespace OpenSim.Region.Framework.Interfaces /// assets are already known to be present in the grid's asset service. /// /// If supplied, this request Id is later returned in the saved event - void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId); + void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Vector3 displacement, Guid requestId); /// /// Dearchive a region from a stream. This replaces the existing scene. @@ -136,6 +138,6 @@ namespace OpenSim.Region.Framework.Interfaces /// assets are already known to be present in the grid's asset service. /// If supplied, this request Id is later returned in the saved event - void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId); + void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Vector3 displacement, Guid requestId); } } diff --git a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs index 5947afb..189a30a 100644 --- a/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs +++ b/OpenSim/Region/Framework/Interfaces/ITerrainModule.cs @@ -51,6 +51,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// void LoadFromStream(string filename, Stream stream); + void LoadFromStream(string filename, Vector2 displacement, Stream stream); void LoadFromStream(string filename, System.Uri pathToTerrainHeightmap); /// /// Save a terrain to a stream. -- cgit v1.1