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
---
.../World/Archiver/ArchiveReadRequest.cs | 22 +++++++++++--
.../CoreModules/World/Archiver/ArchiverModule.cs | 34 ++++++++++++++-----
.../World/Archiver/Tests/ArchiverTests.cs | 2 +-
.../CoreModules/World/Terrain/TerrainModule.cs | 38 ++++++++++++++++++++--
4 files changed, 81 insertions(+), 15 deletions(-)
(limited to 'OpenSim/Region/CoreModules')
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);
--
cgit v1.1