From 0ee69707ea8c0948b79aeba5dbe078fe28dc6482 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Sat, 24 May 2008 23:11:07 +0000 Subject: * Refactor: Collapse some multiple remove object paths * Push some delete functionality into InnerScene to match what's already there for adding objects --- OpenSim/Region/Environment/Scenes/Scene.cs | 71 ++++++++++++------------------ 1 file changed, 29 insertions(+), 42 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes/Scene.cs') diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index bbe8bd9..e30813c 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1335,22 +1335,40 @@ namespace OpenSim.Region.Environment.Scenes public void AddSceneObject(SceneObjectGroup sceneObject) { m_innerScene.AddSceneObject(sceneObject); - } + } /// - /// Remove an object from the scene + /// Delete this object from the scene. /// - /// - public void RemoveSceneObject(SceneObjectGroup sceneObject) + /// + public void DeleteSceneObject(SceneObjectGroup group) { - if (Entities.ContainsKey(sceneObject.UUID)) + SceneObjectPart rootPart = (group).GetChildPart(group.UUID); + if (rootPart.PhysActor != null) + { + PhysicsScene.RemovePrim(rootPart.PhysActor); + rootPart.PhysActor = null; + } + + m_storageManager.DataStore.RemoveObject(group.UUID, m_regInfo.RegionID); + group.DeleteGroup(); + + if (m_innerScene.DeleteSceneObject(group.UUID)) { - EventManager.TriggerObjectBeingRemovedFromScene(sceneObject); - Entities.Remove(sceneObject.UUID); + EventManager.TriggerObjectBeingRemovedFromScene(group); EventManager.TriggerParcelPrimCountTainted(); - m_innerScene.RemoveAPrimCount(); } - } + + group.DeleteParts(); + + // In case anybody else retains a reference to this group, signal deletion by changing the name + // to null. We can't zero out the UUID because this is taken from the root part, which has already + // been removed. + // FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race + // conditions where a user deletes an entity while it is being stored. Really, the update + // code needs a redesign. + group.Name = null; + } public void LoadPrimsFromXml(string fileName, bool newIdsFlag, LLVector3 loadOffset) { @@ -1411,7 +1429,7 @@ namespace OpenSim.Region.Environment.Scenes // We remove the object here try { - DeleteSceneObjectGroup(grp); + DeleteSceneObject(grp); } catch (Exception) { @@ -1473,7 +1491,7 @@ namespace OpenSim.Region.Environment.Scenes // We remove the object here try { - DeleteSceneObjectGroup(grp); + DeleteSceneObject(grp); } catch (Exception) { @@ -3142,37 +3160,6 @@ namespace OpenSim.Region.Environment.Scenes } /// - /// Delete this object from the scene. - /// - /// - public void DeleteSceneObjectGroup(SceneObjectGroup group) - { - SceneObjectPart rootPart = (group).GetChildPart(group.UUID); - if (rootPart.PhysActor != null) - { - PhysicsScene.RemovePrim(rootPart.PhysActor); - rootPart.PhysActor = null; - } - - m_storageManager.DataStore.RemoveObject(group.UUID, m_regInfo.RegionID); - group.DeleteGroup(); - - lock (Entities) - { - RemoveSceneObject(group); - } - group.DeleteParts(); - - // In case anybody else retains a reference to this group, signal deletion by changing the name - // to null. We can't zero out the UUID because this is taken from the root part, which has already - // been removed. - // FIXME: This is a really poor temporary solution, since it still leaves plenty of scope for race - // conditions where a user deletes an entity while it is being stored. Really, the update - // code needs a redesign. - group.Name = null; - } - - /// /// /// /// -- cgit v1.1