* refactor: allocate local ids to prims only when an object is attached to a scene

0.6.0-stable
Justin Clarke Casey 2008-11-07 18:46:11 +00:00
parent 2184f4b2a9
commit ebd9f22b29
5 changed files with 36 additions and 18 deletions

View File

@ -176,7 +176,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
if (null != objectAsset) if (null != objectAsset)
{ {
string xml = Utils.BytesToString(objectAsset.Data); 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); GetSceneObjectAssetUuids(sog, assetUuids);
} }
} }

View File

@ -58,7 +58,7 @@ namespace OpenSim.Region.Environment.Scenes
rootNode = doc.FirstChild; rootNode = doc.FirstChild;
foreach (XmlNode aPrimNode in rootNode.ChildNodes) 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) if (newIDS)
{ {

View File

@ -1953,8 +1953,10 @@ namespace OpenSim.Region.Environment.Scenes
if (rezAsset != null) if (rezAsset != null)
{ {
string xmlData = Utils.BytesToString(rezAsset.Data); 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, remoteClient.AgentId, pos) && !attachment) if (!ExternalChecks.ExternalChecksCanRezObject(
group.Children.Count, remoteClient.AgentId, pos)
&& !attachment)
{ {
return null; return null;
} }
@ -2091,7 +2093,7 @@ namespace OpenSim.Region.Environment.Scenes
if (rezAsset != null) if (rezAsset != null)
{ {
string xmlData = Utils.BytesToString(rezAsset.Data); 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)) if (!ExternalChecks.ExternalChecksCanRezObject(group.Children.Count, ownerID, pos))
{ {

View File

@ -1890,7 +1890,7 @@ namespace OpenSim.Region.Environment.Scenes
public void LoadPrimsFromXml(string fileName, bool newIdsFlag, Vector3 loadOffset) 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); m_serialiser.LoadPrimsFromXml(this, fileName, newIdsFlag, loadOffset);
} }

View File

@ -381,10 +381,16 @@ namespace OpenSim.Region.Environment.Scenes
/// <summary> /// <summary>
/// Create an object using serialized data in OpenSim's original xml format. /// Create an object using serialized data in OpenSim's original xml format.
/// </summary> /// </summary>
public SceneObjectGroup(Scene scene, ulong regionHandle, string xmlData) /// <param name="xmlData"></param>
/// <param name="isOriginalXmlFormat">
/// This parameter only exists to separate the two different xml constructors. In the future, versions should
/// be specified within the xml itself.
/// </param>
public SceneObjectGroup(string xmlData, bool isOriginalXmlFormat)
{ {
m_scene = scene; if (!isOriginalXmlFormat)
m_regionHandle = regionHandle; throw new Exception("This constructor must specify the xml is in OpenSim's original format");
// libomv.types changes UUID to Guid // libomv.types changes UUID to Guid
xmlData = xmlData.Replace("<UUID>", "<Guid>"); xmlData = xmlData.Replace("<UUID>", "<Guid>");
xmlData = xmlData.Replace("</UUID>", "</Guid>"); xmlData = xmlData.Replace("</UUID>", "</Guid>");
@ -416,16 +422,15 @@ namespace OpenSim.Region.Environment.Scenes
{ {
reader.Read(); reader.Read();
SceneObjectPart part = SceneObjectPart.FromXml(reader); SceneObjectPart part = SceneObjectPart.FromXml(reader);
part.LocalId = m_scene.PrimIDAllocate();
linkNum = part.LinkNum; linkNum = part.LinkNum;
AddPart(part); AddPart(part);
part.LinkNum = linkNum; part.LinkNum = linkNum;
part.RegionHandle = m_regionHandle;
part.TrimPermissions(); part.TrimPermissions();
part.StoreUndoState(); part.StoreUndoState();
} }
break; break;
case XmlNodeType.EndElement: case XmlNodeType.EndElement:
break; break;
} }
@ -440,11 +445,6 @@ namespace OpenSim.Region.Environment.Scenes
reader.Close(); reader.Close();
sr.Close(); sr.Close();
m_rootPart.LocalId = m_scene.PrimIDAllocate();
m_rootPart.ParentID = 0;
m_rootPart.RegionHandle = m_regionHandle;
UpdateParentIDs();
} }
/// <summary> /// <summary>
@ -570,8 +570,24 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="scene"></param> /// <param name="scene"></param>
public void AttachToScene(Scene scene) public void AttachToScene(Scene scene)
{ {
m_scene = scene; m_scene = scene;
RegionHandle = scene.RegionInfo.RegionHandle; 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); ApplyPhysics(m_scene.m_physicalPrim);