aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs257
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs41
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/DearchiveScenesGroup.cs12
3 files changed, 262 insertions, 48 deletions
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index 40589de..623671f 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
@@ -40,6 +40,7 @@ using OpenSim.Framework.Monitoring;
40using OpenSim.Framework.Serialization; 40using OpenSim.Framework.Serialization;
41using OpenSim.Framework.Serialization.External; 41using OpenSim.Framework.Serialization.External;
42using OpenSim.Region.CoreModules.World.Terrain; 42using OpenSim.Region.CoreModules.World.Terrain;
43using OpenSim.Region.CoreModules.World.Land;
43using OpenSim.Region.Framework.Interfaces; 44using OpenSim.Region.Framework.Interfaces;
44using OpenSim.Region.Framework.Scenes; 45using OpenSim.Region.Framework.Scenes;
45using OpenSim.Region.Framework.Scenes.Serialization; 46using OpenSim.Region.Framework.Scenes.Serialization;
@@ -131,7 +132,21 @@ namespace OpenSim.Region.CoreModules.World.Archiver
131 /// </value> 132 /// </value>
132 protected Vector3 m_rotationCenter = new Vector3(Constants.RegionSize / 2f, Constants.RegionSize / 2f, 0f); 133 protected Vector3 m_rotationCenter = new Vector3(Constants.RegionSize / 2f, Constants.RegionSize / 2f, 0f);
133 134
135 /// <value>
136 /// Corner 1 of a bounding cuboid which specifies which objects we load from the oar
137 /// </value>
138 protected Vector3 m_boundingOrigin = Vector3.Zero;
139
140 /// <value>
141 /// Size of a bounding cuboid which specifies which objects we load from the oar
142 /// </value>
143 protected Vector3 m_boundingSize = new Vector3(Constants.MaximumRegionSize, Constants.MaximumRegionSize, Constants.MaximumRegionSize);
144
134 protected bool m_noObjects = false; 145 protected bool m_noObjects = false;
146 protected bool m_boundingBox = false;
147 protected bool m_debug = false;
148
149 protected Vector3 m_incomingRegionSize = new Vector3(256f, 256f, 4096f);
135 150
136 /// <summary> 151 /// <summary>
137 /// Used to cache lookups for valid uuids. 152 /// Used to cache lookups for valid uuids.
@@ -202,6 +217,55 @@ namespace OpenSim.Region.CoreModules.World.Archiver
202 m_rotationCenter = options.ContainsKey("rotation-center") ? (Vector3)options["rotation-center"] 217 m_rotationCenter = options.ContainsKey("rotation-center") ? (Vector3)options["rotation-center"]
203 : new Vector3(scene.RegionInfo.RegionSizeX / 2f, scene.RegionInfo.RegionSizeY / 2f, 0f); 218 : new Vector3(scene.RegionInfo.RegionSizeX / 2f, scene.RegionInfo.RegionSizeY / 2f, 0f);
204 219
220 m_boundingOrigin = Vector3.Zero;
221 m_boundingSize = new Vector3(scene.RegionInfo.RegionSizeX, scene.RegionInfo.RegionSizeY, Constants.RegionHeight);
222
223 if (options.ContainsKey("bounding-origin"))
224 {
225 Vector3 boOption = (Vector3)options["bounding-origin"];
226 if (boOption.X >= 0 && boOption.X < m_boundingSize.X
227 && boOption.Y >= 0 && boOption.Y < m_boundingSize.Y
228 && boOption.Z >= 0 && boOption.Z < m_boundingSize.Z)
229 {
230 if (m_boundingOrigin != boOption)
231 {
232 m_boundingOrigin = boOption;
233 m_boundingBox = true;
234 }
235 }
236 else m_log.InfoFormat("[ARCHIVER]: The bounding cube origin must be within the destination region! Setting to {0}.", m_boundingOrigin.ToString());
237 }
238
239
240 if (options.ContainsKey("bounding-size"))
241 {
242 Vector3 bsOption = (Vector3)options["bounding-size"];
243 bool clip = false;
244 if (bsOption.X <= 0 && bsOption.X > (m_boundingSize.X - m_boundingOrigin.X))
245 {
246 bsOption.X = m_boundingSize.X - m_boundingOrigin.X;
247 clip = true;
248 }
249 if (bsOption.Y <= 0 && bsOption.Y > (m_boundingSize.Y - m_boundingOrigin.Y))
250 {
251 bsOption.Y = m_boundingSize.Y - m_boundingOrigin.Y;
252 clip = true;
253 }
254 if (bsOption.Z <= 0 && bsOption.Z > (m_boundingSize.Z - m_boundingOrigin.Z))
255 {
256 bsOption.Z = m_boundingSize.Y - m_boundingOrigin.Z;
257 clip = true;
258 }
259 if (m_boundingSize != bsOption)
260 {
261 m_boundingSize = bsOption;
262 m_boundingBox = true;
263 if (clip) m_log.InfoFormat("[ARCHIVER]: The bounding cube specified is larger than the destination region! Clipping to {0}.", m_boundingSize.ToString());
264 }
265 }
266
267 m_debug = options.ContainsKey("debug");
268
205 // Zero can never be a valid user id (or group) 269 // Zero can never be a valid user id (or group)
206 m_validUserUuids[UUID.Zero] = false; 270 m_validUserUuids[UUID.Zero] = false;
207 m_validGroupUuids[UUID.Zero] = false; 271 m_validGroupUuids[UUID.Zero] = false;
@@ -435,7 +499,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
435 // If the control file wasn't the first file then reset the read pointer 499 // If the control file wasn't the first file then reset the read pointer
436 if (!firstFile) 500 if (!firstFile)
437 { 501 {
438 m_log.Warn("Control file wasn't the first file in the archive"); 502 m_log.Warn("[ARCHIVER]: Control file wasn't the first file in the archive");
439 if (m_loadStream.CanSeek) 503 if (m_loadStream.CanSeek)
440 { 504 {
441 m_loadStream.Seek(0, SeekOrigin.Begin); 505 m_loadStream.Seek(0, SeekOrigin.Begin);
@@ -452,7 +516,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
452 else 516 else
453 { 517 {
454 // There isn't currently a scenario where this happens, but it's best to add a check just in case 518 // There isn't currently a scenario where this happens, but it's best to add a check just in case
455 throw new Exception("Error reading archive: control file wasn't the first file, and the input stream doesn't allow seeking"); 519 throw new Exception("[ARCHIVER]: Error reading archive: control file wasn't the first file, and the input stream doesn't allow seeking");
456 } 520 }
457 } 521 }
458 522
@@ -462,7 +526,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
462 firstFile = false; 526 firstFile = false;
463 } 527 }
464 528
465 throw new Exception("Control file not found"); 529 throw new Exception("[ARCHIVER]: Control file not found");
466 } 530 }
467 531
468 /// <summary> 532 /// <summary>
@@ -473,12 +537,16 @@ namespace OpenSim.Region.CoreModules.World.Archiver
473 // Reload serialized prims 537 // Reload serialized prims
474 m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count); 538 m_log.InfoFormat("[ARCHIVER]: Loading {0} scene objects. Please wait.", serialisedSceneObjects.Count);
475 539
476 OpenMetaverse.Quaternion rot = OpenMetaverse.Quaternion.CreateFromAxisAngle(0, 0, 1, m_rotation); 540 // Convert rotation to radians
541 double rotation = Math.PI * m_rotation / 180f;
542
543 OpenMetaverse.Quaternion rot = OpenMetaverse.Quaternion.CreateFromAxisAngle(0, 0, 1, (float)rotation);
477 544
478 UUID oldTelehubUUID = scene.RegionInfo.RegionSettings.TelehubObject; 545 UUID oldTelehubUUID = scene.RegionInfo.RegionSettings.TelehubObject;
479 546
480 IRegionSerialiserModule serialiser = scene.RequestModuleInterface<IRegionSerialiserModule>(); 547 IRegionSerialiserModule serialiser = scene.RequestModuleInterface<IRegionSerialiserModule>();
481 int sceneObjectsLoadedCount = 0; 548 int sceneObjectsLoadedCount = 0;
549 Vector3 boundingExtent = new Vector3(m_boundingOrigin.X + m_boundingSize.X, m_boundingOrigin.Y + m_boundingSize.Y, m_boundingOrigin.Z + m_boundingSize.Z);
482 550
483 foreach (string serialisedSceneObject in serialisedSceneObjects) 551 foreach (string serialisedSceneObject in serialisedSceneObjects)
484 { 552 {
@@ -498,30 +566,50 @@ namespace OpenSim.Region.CoreModules.World.Archiver
498 566
499 SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject); 567 SceneObjectGroup sceneObject = serialiser.DeserializeGroupFromXml2(serialisedSceneObject);
500 568
569 Vector3 pos = sceneObject.AbsolutePosition;
570
571 //fix the rotation center to the middle of the incoming region now as it's otherwise hopelessly confusing on varRegions
572 //as it only works with objects and terrain (using old Merge method) and not parcels
573 m_rotationCenter.X = m_incomingRegionSize.X / 2;
574 m_rotationCenter.Y = m_incomingRegionSize.Y / 2;
575
576 if (m_debug) m_log.DebugFormat("[ARCHIVER]: Loading object from OAR with original scene position {0}.", pos.ToString());
501 // Happily this does not do much to the object since it hasn't been added to the scene yet 577 // Happily this does not do much to the object since it hasn't been added to the scene yet
502 if (!sceneObject.IsAttachment) 578 if (!sceneObject.IsAttachment)
503 { 579 {
504 if (m_displacement != Vector3.Zero || m_rotation != 0f) 580 if (m_rotation != 0f)
505 { 581 {
506 Vector3 pos = sceneObject.AbsolutePosition; 582 // Rotate the object
507 if (m_rotation != 0f) 583 sceneObject.RootPart.RotationOffset = rot * sceneObject.GroupRotation;
508 { 584 // Get object position relative to rotation axis
509 // Rotate the object 585 Vector3 offset = pos - m_rotationCenter;
510 sceneObject.RootPart.RotationOffset = rot * sceneObject.GroupRotation; 586 // Rotate the object position
511 // Get object position relative to rotation axis 587 offset *= rot;
512 Vector3 offset = pos - m_rotationCenter; 588 // Restore the object position back to relative to the region
513 // Rotate the object position 589 pos = m_rotationCenter + offset;
514 offset *= rot; 590 if (m_debug) m_log.DebugFormat("[ARCHIVER]: After rotation, object from OAR is at scene position {0}.", pos.ToString());
515 // Restore the object position back to relative to the region 591 }
516 pos = m_rotationCenter + offset; 592 if (m_boundingBox)
517 } 593 {
518 if (m_displacement != Vector3.Zero) 594 if (pos.X < m_boundingOrigin.X || pos.X >= boundingExtent.X
595 || pos.Y < m_boundingOrigin.Y || pos.Y >= boundingExtent.Y
596 || pos.Z < m_boundingOrigin.Z || pos.Z >= boundingExtent.Z)
519 { 597 {
520 pos += m_displacement; 598 if (m_debug) m_log.DebugFormat("[ARCHIVER]: Skipping object from OAR in scene because it's position {0} is outside of bounding cube.", pos.ToString());
599 continue;
521 } 600 }
522 sceneObject.AbsolutePosition = pos; 601 //adjust object position to be relative to <0,0> so we can apply the displacement
602 pos.X -= m_boundingOrigin.X;
603 pos.Y -= m_boundingOrigin.Y;
523 } 604 }
605 if (m_displacement != Vector3.Zero)
606 {
607 pos += m_displacement;
608 if (m_debug) m_log.DebugFormat("[ARCHIVER]: After displacement, object from OAR is at scene position {0}.", pos.ToString());
609 }
610 sceneObject.AbsolutePosition = pos;
524 } 611 }
612 if (m_debug) m_log.DebugFormat("[ARCHIVER]: Placing object from OAR in scene at position {0}. ", pos.ToString());
525 613
526 bool isTelehub = (sceneObject.UUID == oldTelehubUUID) && (oldTelehubUUID != UUID.Zero); 614 bool isTelehub = (sceneObject.UUID == oldTelehubUUID) && (oldTelehubUUID != UUID.Zero);
527 615
@@ -553,11 +641,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
553 int ignoredObjects = serialisedSceneObjects.Count - sceneObjectsLoadedCount; 641 int ignoredObjects = serialisedSceneObjects.Count - sceneObjectsLoadedCount;
554 642
555 if (ignoredObjects > 0) 643 if (ignoredObjects > 0)
556 m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene", ignoredObjects); 644 m_log.WarnFormat("[ARCHIVER]: Ignored {0} scene objects that already existed in the scene or were out of bounds", ignoredObjects);
557 645
558 if (oldTelehubUUID != UUID.Zero) 646 if (oldTelehubUUID != UUID.Zero)
559 { 647 {
560 m_log.WarnFormat("Telehub object not found: {0}", oldTelehubUUID); 648 m_log.WarnFormat("[ARCHIVER]: Telehub object not found: {0}", oldTelehubUUID);
561 scene.RegionInfo.RegionSettings.TelehubObject = UUID.Zero; 649 scene.RegionInfo.RegionSettings.TelehubObject = UUID.Zero;
562 scene.RegionInfo.RegionSettings.ClearSpawnPoints(); 650 scene.RegionInfo.RegionSettings.ClearSpawnPoints();
563 } 651 }
@@ -645,15 +733,86 @@ namespace OpenSim.Region.CoreModules.World.Archiver
645 // Reload serialized parcels 733 // Reload serialized parcels
646 m_log.InfoFormat("[ARCHIVER]: Loading {0} parcels. Please wait.", serialisedParcels.Count); 734 m_log.InfoFormat("[ARCHIVER]: Loading {0} parcels. Please wait.", serialisedParcels.Count);
647 List<LandData> landData = new List<LandData>(); 735 List<LandData> landData = new List<LandData>();
736 ILandObject landObject = scene.RequestModuleInterface<ILandObject>();
737 List<ILandObject> parcels;
738 Vector3 parcelDisp = new Vector3(m_displacement.X, m_displacement.Y, 0f);
739 Vector2 displacement = new Vector2(m_displacement.X, m_displacement.Y);
740 Vector2 boundingOrigin = new Vector2(m_boundingOrigin.X, m_boundingOrigin.Y);
741 Vector2 boundingSize = new Vector2(m_boundingSize.X, m_boundingSize.Y);
742 Vector2 regionSize = new Vector2(scene.RegionInfo.RegionSizeX, scene.RegionInfo.RegionSizeY);
743
744 // Gather any existing parcels before we add any more. Later as we add parcels we can check if the new parcel
745 // data overlays any of the old data, and we can modify and remove (if empty) the old parcel so that there's no conflict
746 parcels = scene.LandChannel.AllParcels();
747
648 foreach (string serialisedParcel in serialisedParcels) 748 foreach (string serialisedParcel in serialisedParcels)
649 { 749 {
650 LandData parcel = LandDataSerializer.Deserialize(serialisedParcel); 750 LandData parcel = LandDataSerializer.Deserialize(serialisedParcel);
751 bool overrideRegionSize = true; //use the src land parcel data size not the dst region size
752 bool isEmptyNow;
753 Vector3 AABBMin;
754 Vector3 AABBMax;
755
756 // create a new LandObject that we can use to manipulate the incoming source parcel data
757 // this is ok, but just beware that some of the LandObject functions (that we haven't used here) still
758 // assume we're always using the destination region size
759 LandData ld = new LandData();
760 landObject = new LandObject(ld, scene);
761 landObject.LandData = parcel;
762
763 bool[,] srcLandBitmap = landObject.ConvertBytesToLandBitmap(overrideRegionSize);
764 if (landObject.IsLandBitmapEmpty(srcLandBitmap))
765 {
766 m_log.InfoFormat("[ARCHIVER]: Skipping source parcel {0} with GlobalID: {1} LocalID: {2} that has no claimed land.",
767 parcel.Name, parcel.GlobalID, parcel.LocalID);
768 continue;
769 }
770 //m_log.DebugFormat("[ARCHIVER]: Showing claimed land for source parcel: {0} with GlobalID: {1} LocalID: {2}.",
771 // parcel.Name, parcel.GlobalID, parcel.LocalID);
772 //landObject.DebugLandBitmap(srcLandBitmap);
651 773
652 if (m_displacement != Vector3.Zero) 774 bool[,] dstLandBitmap = landObject.RemapLandBitmap(srcLandBitmap, displacement, m_rotation, boundingOrigin, boundingSize, regionSize, out isEmptyNow, out AABBMin, out AABBMax);
775 if (isEmptyNow)
653 { 776 {
654 Vector3 parcelDisp = new Vector3(m_displacement.X, m_displacement.Y, 0f); 777 m_log.WarnFormat("[ARCHIVER]: Not adding destination parcel {0} with GlobalID: {1} LocalID: {2} because, after applying rotation, bounding and displacement, it has no claimed land.",
655 parcel.AABBMin += parcelDisp; 778 parcel.Name, parcel.GlobalID, parcel.LocalID);
656 parcel.AABBMax += parcelDisp; 779 continue;
780 }
781 //m_log.DebugFormat("[ARCHIVER]: Showing claimed land for destination parcel: {0} with GlobalID: {1} LocalID: {2} after applying rotation, bounding and displacement.",
782 // parcel.Name, parcel.GlobalID, parcel.LocalID);
783 //landObject.DebugLandBitmap(dstLandBitmap);
784
785 landObject.LandBitmap = dstLandBitmap;
786 parcel.Bitmap = landObject.ConvertLandBitmapToBytes();
787 parcel.AABBMin = AABBMin;
788 parcel.AABBMax = AABBMax;
789
790 if (m_merge)
791 {
792 // give the remapped parcel a new GlobalID, in case we're using the same OAR twice and a bounding cube, displacement and --merge
793 parcel.GlobalID = UUID.Random();
794
795 //now check if the area of this new incoming parcel overlays an area in any existing parcels
796 //and if so modify or lose the existing parcels
797 for (int i = 0; i < parcels.Count; i++)
798 {
799 if (parcels[i] != null)
800 {
801 bool[,] modLandBitmap = parcels[i].ConvertBytesToLandBitmap(overrideRegionSize);
802 modLandBitmap = parcels[i].RemoveFromLandBitmap(modLandBitmap, dstLandBitmap, out isEmptyNow, out AABBMin, out AABBMax);
803 if (isEmptyNow)
804 {
805 parcels[i] = null;
806 }
807 else
808 {
809 parcels[i].LandBitmap = modLandBitmap;
810 parcels[i].LandData.Bitmap = parcels[i].ConvertLandBitmapToBytes();
811 parcels[i].LandData.AABBMin = AABBMin;
812 parcels[i].LandData.AABBMax = AABBMax;
813 }
814 }
815 }
657 } 816 }
658 817
659 // Validate User and Group UUID's 818 // Validate User and Group UUID's
@@ -670,18 +829,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver
670 } 829 }
671 else 830 else
672 { 831 {
673 parcel.OwnerID = m_defaultUser; 832 parcel.OwnerID = m_rootScene.RegionInfo.EstateSettings.EstateOwner;
674 parcel.GroupID = UUID.Zero;
675 parcel.IsGroupOwned = false; 833 parcel.IsGroupOwned = false;
676 } 834 }
677 } 835 }
678 else 836 else
679 { 837 {
680 if (!ResolveUserUuid(scene, parcel.OwnerID)) 838 if (!ResolveUserUuid(scene, parcel.OwnerID))
681 parcel.OwnerID = m_defaultUser; 839 parcel.OwnerID = m_rootScene.RegionInfo.EstateSettings.EstateOwner;
682
683 if (!ResolveGroupUuid(parcel.GroupID))
684 parcel.GroupID = UUID.Zero;
685 } 840 }
686 841
687 List<LandAccessEntry> accessList = new List<LandAccessEntry>(); 842 List<LandAccessEntry> accessList = new List<LandAccessEntry>();
@@ -693,19 +848,23 @@ namespace OpenSim.Region.CoreModules.World.Archiver
693 } 848 }
694 parcel.ParcelAccessList = accessList; 849 parcel.ParcelAccessList = accessList;
695 850
696// m_log.DebugFormat( 851 if (m_debug) m_log.DebugFormat("[ARCHIVER]: Adding parcel {0}, local id {1}, owner {2}, group {3}, isGroupOwned {4}, area {5}",
697// "[ARCHIVER]: Adding parcel {0}, local id {1}, owner {2}, group {3}, isGroupOwned {4}, area {5}", 852 parcel.Name, parcel.LocalID, parcel.OwnerID, parcel.GroupID, parcel.IsGroupOwned, parcel.Area);
698// parcel.Name, parcel.LocalID, parcel.OwnerID, parcel.GroupID, parcel.IsGroupOwned, parcel.Area); 853
699
700 landData.Add(parcel); 854 landData.Add(parcel);
701 } 855 }
702 856
703 if (!m_merge) 857 if (m_merge)
704 { 858 {
705 bool setupDefaultParcel = (landData.Count == 0); 859 for (int i = 0; i < parcels.Count; i++) //if merging then we need to also add back in any existing parcels
706 scene.LandChannel.Clear(setupDefaultParcel); 860 {
861 if (parcels[i] != null) landData.Add(parcels[i].LandData);
862 }
707 } 863 }
708 864
865 m_log.InfoFormat("[ARCHIVER]: Clearing {0} parcels.", parcels.Count);
866 bool setupDefaultParcel = (landData.Count == 0);
867 scene.LandChannel.Clear(setupDefaultParcel);
709 scene.EventManager.TriggerIncomingLandDataFromStorage(landData); 868 scene.EventManager.TriggerIncomingLandDataFromStorage(landData);
710 m_log.InfoFormat("[ARCHIVER]: Restored {0} parcels.", landData.Count); 869 m_log.InfoFormat("[ARCHIVER]: Restored {0} parcels.", landData.Count);
711 } 870 }
@@ -934,10 +1093,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
934 ITerrainModule terrainModule = scene.RequestModuleInterface<ITerrainModule>(); 1093 ITerrainModule terrainModule = scene.RequestModuleInterface<ITerrainModule>();
935 using (MemoryStream ms = new MemoryStream(data)) 1094 using (MemoryStream ms = new MemoryStream(data))
936 { 1095 {
937 if (m_displacement != Vector3.Zero || m_rotation != 0f) 1096 if (m_displacement != Vector3.Zero || m_rotation != 0f || m_boundingBox)
938 { 1097 {
939 Vector2 rotationCenter = new Vector2(m_rotationCenter.X, m_rotationCenter.Y); 1098 Vector2 boundingOrigin = new Vector2(m_boundingOrigin.X, m_boundingOrigin.Y);
940 terrainModule.LoadFromStream(terrainPath, m_displacement, m_rotation, rotationCenter, ms); 1099 Vector2 boundingSize = new Vector2(m_boundingSize.X, m_boundingSize.Y);
1100 terrainModule.LoadFromStream(terrainPath, m_displacement, m_rotation, boundingOrigin, boundingSize, ms); ;
941 } 1101 }
942 else 1102 else
943 { 1103 {
@@ -1014,6 +1174,17 @@ namespace OpenSim.Region.CoreModules.World.Archiver
1014 { 1174 {
1015 dearchivedScenes.SetRegionDirectory(xtr.ReadElementContentAsString()); 1175 dearchivedScenes.SetRegionDirectory(xtr.ReadElementContentAsString());
1016 } 1176 }
1177 else if (xtr.Name.ToString() == "size_in_meters")
1178 {
1179 Vector3 value;
1180 string size = "<" + xtr.ReadElementContentAsString() + ",0>";
1181 if (Vector3.TryParse(size, out value))
1182 {
1183 m_incomingRegionSize = value;
1184 dearchivedScenes.SetRegionSize(m_incomingRegionSize);
1185 m_log.DebugFormat("[ARCHIVER]: Found region_size info {0}", m_incomingRegionSize.ToString());
1186 }
1187 }
1017 } 1188 }
1018 } 1189 }
1019 1190
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
index 4178a57..cdc605b 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
@@ -110,8 +110,10 @@ namespace OpenSim.Region.CoreModules.World.Archiver
110 Vector3 displacement = new Vector3(0f, 0f, 0f); 110 Vector3 displacement = new Vector3(0f, 0f, 0f);
111 String defaultUser = ""; 111 String defaultUser = "";
112 float rotation = 0f; 112 float rotation = 0f;
113 Vector3 rotationCenter = new Vector3(Constants.RegionSize / 2f, Constants.RegionSize / 2f, 0); 113 Vector3 rotationCenter = new Vector3(Scene.RegionInfo.RegionSizeX / 2f, Scene.RegionInfo.RegionSizeY / 2f, 0);
114 114 Vector3 boundingOrigin = new Vector3(0f, 0f, 0f);
115 Vector3 boundingSize = new Vector3(Scene.RegionInfo.RegionSizeX, Scene.RegionInfo.RegionSizeY, Constants.RegionHeight);
116 bool debug = false;
115 117
116 OptionSet options = new OptionSet(); 118 OptionSet options = new OptionSet();
117 options.Add("m|merge", delegate(string v) { mergeOar = (v != null); }); 119 options.Add("m|merge", delegate(string v) { mergeOar = (v != null); });
@@ -147,13 +149,14 @@ namespace OpenSim.Region.CoreModules.World.Archiver
147 m_log.ErrorFormat("[ARCHIVER MODULE] Must be an angle in degrees between -360 and +360: --rotation 45"); 149 m_log.ErrorFormat("[ARCHIVER MODULE] Must be an angle in degrees between -360 and +360: --rotation 45");
148 return; 150 return;
149 } 151 }
150 // Convert to radians for internals 152 //pass this in as degrees now, convert to radians later during actual work phase
151 rotation = Util.Clamp<float>(rotation, -359f, 359f) / 180f * (float)Math.PI; 153 rotation = Util.Clamp<float>(rotation, -359f, 359f);
152 }); 154 });
153 options.Add("rotation-center=", delegate(string v) 155 options.Add("rotation-center=", delegate(string v)
154 { 156 {
155 try 157 try
156 { 158 {
159 m_log.Info("[ARCHIVER MODULE] Warning: --rotation-center no longer does anything and will be removed soon!");
157 rotationCenter = v == null ? Vector3.Zero : Vector3.Parse(v); 160 rotationCenter = v == null ? Vector3.Zero : Vector3.Parse(v);
158 } 161 }
159 catch 162 catch
@@ -163,6 +166,33 @@ namespace OpenSim.Region.CoreModules.World.Archiver
163 return; 166 return;
164 } 167 }
165 }); 168 });
169 options.Add("bounding-origin=", delegate(string v)
170 {
171 try
172 {
173 boundingOrigin = v == null ? Vector3.Zero : Vector3.Parse(v);
174 }
175 catch
176 {
177 m_log.ErrorFormat("[ARCHIVER MODULE] failure parsing bounding cube origin");
178 m_log.ErrorFormat("[ARCHIVER MODULE] Must be represented as vector3: --bounding-origin \"<128,128,0>\"");
179 return;
180 }
181 });
182 options.Add("bounding-size=", delegate(string v)
183 {
184 try
185 {
186 boundingSize = v == null ? new Vector3(Scene.RegionInfo.RegionSizeX, Scene.RegionInfo.RegionSizeY, Constants.RegionHeight) : Vector3.Parse(v);
187 }
188 catch
189 {
190 m_log.ErrorFormat("[ARCHIVER MODULE] failure parsing bounding cube size");
191 m_log.ErrorFormat("[ARCHIVER MODULE] Must be represented as a positive vector3: --bounding-size \"<256,256,4096>\"");
192 return;
193 }
194 });
195 options.Add("d|debug", delegate(string v) { debug = (v != null); });
166 196
167 // Send a message to the region ready module 197 // Send a message to the region ready module
168 /* bluewall* Disable this for the time being 198 /* bluewall* Disable this for the time being
@@ -211,6 +241,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver
211 archiveOptions.Add("displacement", displacement); 241 archiveOptions.Add("displacement", displacement);
212 archiveOptions.Add("rotation", rotation); 242 archiveOptions.Add("rotation", rotation);
213 archiveOptions.Add("rotation-center", rotationCenter); 243 archiveOptions.Add("rotation-center", rotationCenter);
244 archiveOptions.Add("bounding-origin", boundingOrigin);
245 archiveOptions.Add("bounding-size", boundingSize);
246 if (debug) archiveOptions.Add("debug", null);
214 247
215 if (mainParams.Count > 2) 248 if (mainParams.Count > 2)
216 { 249 {
diff --git a/OpenSim/Region/CoreModules/World/Archiver/DearchiveScenesGroup.cs b/OpenSim/Region/CoreModules/World/Archiver/DearchiveScenesGroup.cs
index 3dcc020..12a520f 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/DearchiveScenesGroup.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/DearchiveScenesGroup.cs
@@ -70,6 +70,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
70 /// If null then the region doesn't have a corresponding scene, and it won't be loaded. 70 /// If null then the region doesn't have a corresponding scene, and it won't be loaded.
71 /// </summary> 71 /// </summary>
72 public Scene Scene { get; set; } 72 public Scene Scene { get; set; }
73
74 /// <summary>
75 /// The size of the region being loaded.
76 /// </summary>
77 public Vector3 RegionSize { get; set; }
73 } 78 }
74 79
75 /// <summary> 80 /// <summary>
@@ -118,7 +123,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
118 123
119 public void SetRegionOriginalID(string id) 124 public void SetRegionOriginalID(string id)
120 { 125 {
121 m_curRegion = new RegionInfo(); 126 if (m_curRegion == null) m_curRegion = new RegionInfo();
122 m_curRegion.Location = new Point((int)m_curX, (int)m_curY); 127 m_curRegion.Location = new Point((int)m_curX, (int)m_curY);
123 m_curRegion.OriginalID = id; 128 m_curRegion.OriginalID = id;
124 // 'curRegion' will be saved in 'm_directory2region' when SetRegionDir() is called 129 // 'curRegion' will be saved in 'm_directory2region' when SetRegionDir() is called
@@ -130,6 +135,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
130 m_directory2region[directory] = m_curRegion; 135 m_directory2region[directory] = m_curRegion;
131 } 136 }
132 137
138 public void SetRegionSize(Vector3 size)
139 {
140 if (m_curRegion == null) m_curRegion = new RegionInfo();
141 m_curRegion.RegionSize = size;
142 }
133 143
134 /// <summary> 144 /// <summary>
135 /// Sets all the scenes present in the simulator. 145 /// Sets all the scenes present in the simulator.