From ebd9f22b29bfbe0cfb0689405984f856e0413405 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 7 Nov 2008 18:46:11 +0000 Subject: [PATCH] * refactor: allocate local ids to prims only when an object is attached to a scene --- .../ArchiveWriteRequestPreparation.cs | 2 +- .../World/Serialiser/SceneXmlLoader.cs | 2 +- .../Environment/Scenes/Scene.Inventory.cs | 8 ++-- OpenSim/Region/Environment/Scenes/Scene.cs | 2 +- .../Environment/Scenes/SceneObjectGroup.cs | 40 +++++++++++++------ 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs index 1fbc20fe1c..0202841018 100644 --- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs @@ -176,7 +176,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver if (null != objectAsset) { string xml = Utils.BytesToString(objectAsset.Data); - SceneObjectGroup sog = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, xml); + SceneObjectGroup sog = new SceneObjectGroup(xml, true); GetSceneObjectAssetUuids(sog, assetUuids); } } diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs index af69707826..a069ac368a 100644 --- a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs +++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.Environment.Scenes rootNode = doc.FirstChild; foreach (XmlNode aPrimNode in rootNode.ChildNodes) { - SceneObjectGroup obj = new SceneObjectGroup(scene, scene.RegionInfo.RegionHandle, aPrimNode.OuterXml); + SceneObjectGroup obj = new SceneObjectGroup(aPrimNode.OuterXml, true); if (newIDS) { diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index c59fffc209..4e93551a76 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -1953,8 +1953,10 @@ namespace OpenSim.Region.Environment.Scenes if (rezAsset != null) { string xmlData = Utils.BytesToString(rezAsset.Data); - SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData); - if (!ExternalChecks.ExternalChecksCanRezObject(group.Children.Count, remoteClient.AgentId, pos) && !attachment) + SceneObjectGroup group = new SceneObjectGroup(xmlData, true); + if (!ExternalChecks.ExternalChecksCanRezObject( + group.Children.Count, remoteClient.AgentId, pos) + && !attachment) { return null; } @@ -2091,7 +2093,7 @@ namespace OpenSim.Region.Environment.Scenes if (rezAsset != null) { string xmlData = Utils.BytesToString(rezAsset.Data); - SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData); + SceneObjectGroup group = new SceneObjectGroup(xmlData, true); if (!ExternalChecks.ExternalChecksCanRezObject(group.Children.Count, ownerID, pos)) { diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 40f86056a0..95d9f2af00 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1890,7 +1890,7 @@ namespace OpenSim.Region.Environment.Scenes public void LoadPrimsFromXml(string fileName, bool newIdsFlag, Vector3 loadOffset) { - m_log.InfoFormat("[SCENE]: Loading prims in xml format to region {0} from {1}", RegionInfo.RegionName); + m_log.InfoFormat("[SCENE]: Loading prims in xml format to region {0} from {1}", RegionInfo.RegionName, fileName); m_serialiser.LoadPrimsFromXml(this, fileName, newIdsFlag, loadOffset); } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index a19564fa1f..592644578c 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -381,10 +381,16 @@ namespace OpenSim.Region.Environment.Scenes /// /// Create an object using serialized data in OpenSim's original xml format. /// - public SceneObjectGroup(Scene scene, ulong regionHandle, string xmlData) + /// + /// + /// This parameter only exists to separate the two different xml constructors. In the future, versions should + /// be specified within the xml itself. + /// + public SceneObjectGroup(string xmlData, bool isOriginalXmlFormat) { - m_scene = scene; - m_regionHandle = regionHandle; + if (!isOriginalXmlFormat) + throw new Exception("This constructor must specify the xml is in OpenSim's original format"); + // libomv.types changes UUID to Guid xmlData = xmlData.Replace("", ""); xmlData = xmlData.Replace("", ""); @@ -416,16 +422,15 @@ namespace OpenSim.Region.Environment.Scenes { reader.Read(); SceneObjectPart part = SceneObjectPart.FromXml(reader); - part.LocalId = m_scene.PrimIDAllocate(); linkNum = part.LinkNum; AddPart(part); part.LinkNum = linkNum; - part.RegionHandle = m_regionHandle; part.TrimPermissions(); part.StoreUndoState(); } break; + case XmlNodeType.EndElement: break; } @@ -440,11 +445,6 @@ namespace OpenSim.Region.Environment.Scenes reader.Close(); sr.Close(); - - m_rootPart.LocalId = m_scene.PrimIDAllocate(); - m_rootPart.ParentID = 0; - m_rootPart.RegionHandle = m_regionHandle; - UpdateParentIDs(); } /// @@ -570,8 +570,24 @@ namespace OpenSim.Region.Environment.Scenes /// public void AttachToScene(Scene scene) { - m_scene = scene; - RegionHandle = scene.RegionInfo.RegionHandle; + m_scene = scene; + RegionHandle = m_scene.RegionInfo.RegionHandle; + + m_rootPart.ParentID = 0; + m_rootPart.LocalId = m_scene.PrimIDAllocate(); + + //UpdateParentIDs(); + + // No need to lock here since part isn't yet in a scene + foreach (SceneObjectPart part in m_parts.Values) + { + if (Object.ReferenceEquals(part, m_rootPart)) + continue; + + part.LocalId = m_scene.PrimIDAllocate(); + part.ParentID = m_rootPart.LocalId; + m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID); + } ApplyPhysics(m_scene.m_physicalPrim);