* Refactor: Collapse some multiple remove object paths

* Push some delete functionality into InnerScene to match what's already there for adding objects
0.6.0-stable
Justin Clarke Casey 2008-05-24 23:11:07 +00:00
parent 10564469c8
commit 0ee69707ea
6 changed files with 69 additions and 59 deletions

View File

@ -179,7 +179,7 @@ namespace OpenSim.Region.Environment.Modules.World.TreePopulator
if (Util.RandomClass.NextDouble() < killLikelyhood) if (Util.RandomClass.NextDouble() < killLikelyhood)
{ {
m_scene.RemoveSceneObject(selectedTree.ParentGroup); m_scene.DeleteSceneObject(selectedTree.ParentGroup);
m_trees.Remove(selectedTree.ParentGroup.UUID); m_trees.Remove(selectedTree.ParentGroup.UUID);
m_scene.ForEachClient(delegate(IClientAPI controller) m_scene.ForEachClient(delegate(IClientAPI controller)

View File

@ -204,18 +204,45 @@ namespace OpenSim.Region.Environment.Scenes
/// Add an object to the scene. /// Add an object to the scene.
/// </summary> /// </summary>
/// <param name="sceneObject"></param> /// <param name="sceneObject"></param>
public void AddSceneObject(SceneObjectGroup sceneObject) /// <returns>true if the object was added, false if an object with the same uuid was already in the scene
/// </returns>
public bool AddSceneObject(SceneObjectGroup sceneObject)
{ {
if (!Entities.ContainsKey(sceneObject.UUID)) lock (Entities)
{ {
// QuadTree.AddSceneObject(sceneObject); if (!Entities.ContainsKey(sceneObject.UUID))
lock (Entities)
{ {
// QuadTree.AddSceneObject(sceneObject);
Entities.Add(sceneObject.UUID, sceneObject); Entities.Add(sceneObject.UUID, sceneObject);
m_numPrim++;
return true;
} }
m_numPrim++;
return false;
} }
} }
/// <summary>
/// Delete an object from the scene
/// </summary>
/// <param name="sceneObject"></param>
/// <returns>true if the object was deleted, false if there was no object to delete</returns>
public bool DeleteSceneObject(LLUUID uuid)
{
lock (Entities)
{
if (Entities.ContainsKey(uuid))
{
Entities.Remove(uuid);
m_numPrim--;
return true;
}
}
return false;
}
/// <summary> /// <summary>
/// Add an entity to the list of prims to process on the next update /// Add an entity to the list of prims to process on the next update
@ -376,7 +403,6 @@ namespace OpenSim.Region.Environment.Scenes
// To LocalId or LLUUID, *THAT* is the question. How now Brown LLUUID?? // To LocalId or LLUUID, *THAT* is the question. How now Brown LLUUID??
public void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient) public void DetachSingleAttachmentToInv(LLUUID itemID, IClientAPI remoteClient)
{ {
if (itemID == LLUUID.Zero) // If this happened, someone made a mistake.... if (itemID == LLUUID.Zero) // If this happened, someone made a mistake....
return; return;
@ -392,11 +418,10 @@ namespace OpenSim.Region.Environment.Scenes
group.DetachToInventoryPrep(); group.DetachToInventoryPrep();
m_log.Debug("[DETACH]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); m_log.Debug("[DETACH]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString());
m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(),group.OwnerID); m_parentScene.updateKnownAsset(remoteClient, group, group.GetFromAssetID(),group.OwnerID);
m_parentScene.DeleteSceneObjectGroup(group); m_parentScene.DeleteSceneObject(group);
} }
} }
} }
} }
public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, LLVector3 attachPos) public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot, LLVector3 attachPos)

View File

@ -1251,14 +1251,12 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
if (permissionToDelete) if (permissionToDelete)
{ {
DeleteSceneObjectGroup(objectGroup); DeleteSceneObject(objectGroup);
} }
} }
} }
} }
public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID assetID, LLUUID agentID) public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID assetID, LLUUID agentID)
@ -1790,7 +1788,7 @@ namespace OpenSim.Region.Environment.Scenes
returnobjects[i] = null; returnobjects[i] = null;
DeleteSceneObjectGroup(ObjectDeleting); DeleteSceneObject(ObjectDeleting);
ObjectDeleting = null; ObjectDeleting = null;
} }
else else

View File

@ -1335,22 +1335,40 @@ namespace OpenSim.Region.Environment.Scenes
public void AddSceneObject(SceneObjectGroup sceneObject) public void AddSceneObject(SceneObjectGroup sceneObject)
{ {
m_innerScene.AddSceneObject(sceneObject); m_innerScene.AddSceneObject(sceneObject);
} }
/// <summary> /// <summary>
/// Remove an object from the scene /// Delete this object from the scene.
/// </summary> /// </summary>
/// <param name="sceneObject"></param> /// <param name="group"></param>
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)
{ {
EventManager.TriggerObjectBeingRemovedFromScene(sceneObject); PhysicsScene.RemovePrim(rootPart.PhysActor);
Entities.Remove(sceneObject.UUID); rootPart.PhysActor = null;
EventManager.TriggerParcelPrimCountTainted();
m_innerScene.RemoveAPrimCount();
} }
}
m_storageManager.DataStore.RemoveObject(group.UUID, m_regInfo.RegionID);
group.DeleteGroup();
if (m_innerScene.DeleteSceneObject(group.UUID))
{
EventManager.TriggerObjectBeingRemovedFromScene(group);
EventManager.TriggerParcelPrimCountTainted();
}
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) public void LoadPrimsFromXml(string fileName, bool newIdsFlag, LLVector3 loadOffset)
{ {
@ -1411,7 +1429,7 @@ namespace OpenSim.Region.Environment.Scenes
// We remove the object here // We remove the object here
try try
{ {
DeleteSceneObjectGroup(grp); DeleteSceneObject(grp);
} }
catch (Exception) catch (Exception)
{ {
@ -1473,7 +1491,7 @@ namespace OpenSim.Region.Environment.Scenes
// We remove the object here // We remove the object here
try try
{ {
DeleteSceneObjectGroup(grp); DeleteSceneObject(grp);
} }
catch (Exception) catch (Exception)
{ {
@ -3141,37 +3159,6 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
/// <summary>
/// Delete this object from the scene.
/// </summary>
/// <param name="group"></param>
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;
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>

View File

@ -126,7 +126,7 @@ namespace OpenSim.Region.Examples.SimpleModule
if (m_parts.Count == 1) if (m_parts.Count == 1)
{ {
m_parts.Remove(m_rootPart.UUID); m_parts.Remove(m_rootPart.UUID);
m_scene.RemoveSceneObject(this); m_scene.DeleteSceneObject(this);
remoteClient.SendKillObject(m_regionHandle, m_rootPart.LocalId); remoteClient.SendKillObject(m_regionHandle, m_rootPart.LocalId);
remoteClient.AddMoney(50); remoteClient.AddMoney(50);
remoteClient.SendChatMessage("KABLAM!!!", 1, AbsolutePosition, "Groupie Groupie", LLUUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully); remoteClient.SendChatMessage("KABLAM!!!", 1, AbsolutePosition, "Groupie Groupie", LLUUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully);

View File

@ -704,7 +704,7 @@ namespace OpenSim.Region.ScriptEngine.Common
public void llDie() public void llDie()
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
World.DeleteSceneObjectGroup(m_host.ParentGroup); World.DeleteSceneObject(m_host.ParentGroup);
} }
public double llGround(LSL_Types.Vector3 offset) public double llGround(LSL_Types.Vector3 offset)