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 5varregion
							parent
							
								
									f127e4b4ee
								
							
						
					
					
						commit
						dd6db72939
					
				|  | @ -1484,8 +1484,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>(); |                     IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>(); | ||||||
|  |                     Vector3 displacement = new Vector3(0f, 0f, 0f); | ||||||
|                     if (archiver != null) |                     if (archiver != null) | ||||||
|                         archiver.DearchiveRegion(filename, mergeOar, skipAssets, Guid.Empty); |                         archiver.DearchiveRegion(filename, mergeOar, skipAssets, displacement, Guid.Empty); | ||||||
|                     else |                     else | ||||||
|                         throw new Exception("Archiver module not present for scene"); |                         throw new Exception("Archiver module not present for scene"); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -266,10 +266,11 @@ namespace OpenSim | ||||||
|                                           SavePrimsXml2); |                                           SavePrimsXml2); | ||||||
| 
 | 
 | ||||||
|             m_console.Commands.AddCommand("Archiving", false, "load oar", |             m_console.Commands.AddCommand("Archiving", false, "load oar", | ||||||
|                                           "load oar [--merge] [--skip-assets] [<OAR path>]", |                                           "load oar [--merge] [--skip-assets] [--displacement \"<x,y,z>\"] [<OAR path>]", | ||||||
|                                           "Load a region's data from an OAR archive.", |                                           "Load a region's data from an OAR archive.", | ||||||
|                                           "--merge will merge the OAR with the existing scene." + Environment.NewLine |                                           "--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." |                                           + "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.", |                                           + "  If this is not given then the command looks for an OAR named region.oar in the current directory.", | ||||||
|                                           LoadOar); |                                           LoadOar); | ||||||
|  |  | ||||||
|  | @ -104,6 +104,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver | ||||||
|         /// </value> |         /// </value> | ||||||
|         protected bool m_skipAssets; |         protected bool m_skipAssets; | ||||||
| 
 | 
 | ||||||
|  |         /// <value> | ||||||
|  |         /// Displacement added to each object as it is added to the world | ||||||
|  |         /// </value> | ||||||
|  |         protected Vector3 m_displacement = new Vector3(0f, 0f, 0f); | ||||||
|  | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Used to cache lookups for valid uuids. |         /// Used to cache lookups for valid uuids. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|  | @ -132,7 +137,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | ||||||
|         private IAssetService m_assetService = null; |         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; |             m_rootScene = scene; | ||||||
| 
 | 
 | ||||||
|  | @ -153,6 +158,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | ||||||
|             m_merge = merge; |             m_merge = merge; | ||||||
|             m_skipAssets = skipAssets; |             m_skipAssets = skipAssets; | ||||||
|             m_requestId = requestId; |             m_requestId = requestId; | ||||||
|  |             m_displacement = displacement; | ||||||
| 
 | 
 | ||||||
|             // Zero can never be a valid user id |             // Zero can never be a valid user id | ||||||
|             m_validUserUuids[UUID.Zero] = false; |             m_validUserUuids[UUID.Zero] = false; | ||||||
|  | @ -445,6 +451,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver | ||||||
| 
 | 
 | ||||||
|                 SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); |                 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); |                 bool isTelehub = (sceneObject.UUID == oldTelehubUUID) && (oldTelehubUUID != UUID.Zero); | ||||||
| 
 | 
 | ||||||
|                 // For now, give all incoming scene objects new uuids.  This will allow scenes to be cloned |                 // 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<ITerrainModule>(); |             ITerrainModule terrainModule = scene.RequestModuleInterface<ITerrainModule>(); | ||||||
| 
 | 
 | ||||||
|             MemoryStream ms = new MemoryStream(data); |             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(); |             ms.Close(); | ||||||
| 
 | 
 | ||||||
|             m_log.DebugFormat("[ARCHIVER]: Restored terrain {0}", terrainPath); |             m_log.DebugFormat("[ARCHIVER]: Restored terrain {0}", terrainPath); | ||||||
|  |  | ||||||
|  | @ -33,11 +33,14 @@ using log4net; | ||||||
| using NDesk.Options; | using NDesk.Options; | ||||||
| using Nini.Config; | using Nini.Config; | ||||||
| using Mono.Addins; | using Mono.Addins; | ||||||
|  | 
 | ||||||
| using OpenSim.Framework; | using OpenSim.Framework; | ||||||
| using OpenSim.Framework.Console; | using OpenSim.Framework.Console; | ||||||
| using OpenSim.Region.Framework.Interfaces; | using OpenSim.Region.Framework.Interfaces; | ||||||
| using OpenSim.Region.Framework.Scenes; | using OpenSim.Region.Framework.Scenes; | ||||||
| 
 | 
 | ||||||
|  | using OpenMetaverse; | ||||||
|  | 
 | ||||||
| namespace OpenSim.Region.CoreModules.World.Archiver | namespace OpenSim.Region.CoreModules.World.Archiver | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|  | @ -101,9 +104,22 @@ namespace OpenSim.Region.CoreModules.World.Archiver | ||||||
|         { |         { | ||||||
|             bool mergeOar = false; |             bool mergeOar = false; | ||||||
|             bool skipAssets = false; |             bool skipAssets = false; | ||||||
|  |             Vector3 displacement = new Vector3(0f, 0f, 0f); | ||||||
|              |              | ||||||
|             OptionSet options = new OptionSet().Add("m|merge", delegate (string v) { mergeOar = v != null; }); |             OptionSet options = new OptionSet(); | ||||||
|             options.Add("s|skip-assets", delegate (string v) { skipAssets = v != null; }); |             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 |             // Send a message to the region ready module | ||||||
|             /* bluewall* Disable this for the time being |             /* bluewall* Disable this for the time being | ||||||
|  | @ -124,11 +140,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver | ||||||
| 
 | 
 | ||||||
|             if (mainParams.Count > 2) |             if (mainParams.Count > 2) | ||||||
|             { |             { | ||||||
|                 DearchiveRegion(mainParams[2], mergeOar, skipAssets, Guid.Empty); |                 DearchiveRegion(mainParams[2], mergeOar, skipAssets, displacement, Guid.Empty); | ||||||
|             } |             } | ||||||
|             else |             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) |         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( |             m_log.InfoFormat( | ||||||
|                 "[ARCHIVER]: Loading archive to region {0} from {1}", Scene.RegionInfo.RegionName, loadPath); |                 "[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) |         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(); |             new ArchiveReadRequest(Scene, loadStream, merge, skipAssets, requestId).DearchiveRegion(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -752,7 +752,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests | ||||||
|                 byte[] archive = archiveWriteStream.ToArray(); |                 byte[] archive = archiveWriteStream.ToArray(); | ||||||
|                 MemoryStream archiveReadStream = new MemoryStream(archive); |                 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); |                 SceneObjectPart object1Existing = m_scene.GetSceneObjectPart(part1.Name); | ||||||
|                 Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge"); |                 Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge"); | ||||||
|  |  | ||||||
|  | @ -314,12 +314,18 @@ namespace OpenSim.Region.CoreModules.World.Terrain | ||||||
|             LoadFromStream(filename, URIFetch(pathToTerrainHeightmap)); |             LoadFromStream(filename, URIFetch(pathToTerrainHeightmap)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         public void LoadFromStream(string filename, Stream stream) | ||||||
|  |         { | ||||||
|  |             Vector2 defaultDisplacement = new Vector2(0f, 0f); | ||||||
|  |             LoadFromStream(filename, defaultDisplacement, stream); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Loads a terrain file from a stream and installs it in the scene. |         /// Loads a terrain file from a stream and installs it in the scene. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="filename">Filename to terrain file. Type is determined by extension.</param> |         /// <param name="filename">Filename to terrain file. Type is determined by extension.</param> | ||||||
|         /// <param name="stream"></param> |         /// <param name="stream"></param> | ||||||
|         public void LoadFromStream(string filename, Stream stream) |         public void LoadFromStream(string filename, Vector2 displacement, Stream stream) | ||||||
|         { |         { | ||||||
|             foreach (KeyValuePair<string, ITerrainLoader> loader in m_loaders) |             foreach (KeyValuePair<string, ITerrainLoader> loader in m_loaders) | ||||||
|             { |             { | ||||||
|  | @ -330,8 +336,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain | ||||||
|                         try |                         try | ||||||
|                         { |                         { | ||||||
|                             ITerrainChannel channel = loader.Value.LoadStream(stream); |                             ITerrainChannel channel = loader.Value.LoadStream(stream); | ||||||
|                             m_scene.Heightmap = channel; |                             MergeTerrainIntoExisting(channel, displacement); | ||||||
|                             m_channel = channel; |  | ||||||
|                             UpdateRevertMap(); |                             UpdateRevertMap(); | ||||||
|                         } |                         } | ||||||
|                         catch (NotImplementedException) |                         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)); |             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) |         private static Stream URIFetch(Uri uri) | ||||||
|         { |         { | ||||||
|             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); |             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); | ||||||
|  |  | ||||||
|  | @ -29,6 +29,8 @@ using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.IO; | using System.IO; | ||||||
| 
 | 
 | ||||||
|  | using OpenMetaverse; | ||||||
|  | 
 | ||||||
| namespace OpenSim.Region.Framework.Interfaces | namespace OpenSim.Region.Framework.Interfaces | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|  | @ -109,7 +111,7 @@ namespace OpenSim.Region.Framework.Interfaces | ||||||
|         /// assets are already known to be present in the grid's asset service. |         /// assets are already known to be present in the grid's asset service. | ||||||
|         /// </param> |         /// </param> | ||||||
|         /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> |         /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> | ||||||
|         void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId); |         void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Vector3 displacement, Guid requestId); | ||||||
|          |          | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Dearchive a region from a stream.  This replaces the existing scene.  |         /// 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. |         /// assets are already known to be present in the grid's asset service. | ||||||
|         /// </param |         /// </param | ||||||
|         /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> |         /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> | ||||||
|         void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId); |         void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Vector3 displacement, Guid requestId); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -51,6 +51,7 @@ namespace OpenSim.Region.Framework.Interfaces | ||||||
|         /// </param> |         /// </param> | ||||||
|         /// <param name="stream"></param> |         /// <param name="stream"></param> | ||||||
|         void LoadFromStream(string filename, Stream stream); |         void LoadFromStream(string filename, Stream stream); | ||||||
|  |         void LoadFromStream(string filename, Vector2 displacement, Stream stream); | ||||||
|         void LoadFromStream(string filename, System.Uri pathToTerrainHeightmap); |         void LoadFromStream(string filename, System.Uri pathToTerrainHeightmap); | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Save a terrain to a stream. |         /// Save a terrain to a stream. | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Robert Adams
						Robert Adams