From d604cd284efc61af4616506830ff17ee52ff6e48 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Wed, 29 Apr 2009 15:54:16 +0000 Subject: Again, completely revamp the unlink code to finally allow unlinking arbitrary combinations of root and child prims from one or multiple link sets. Please test throughly and consider things UNSTABLE until this is proven out. --- .../Region/Framework/Scenes/SceneObjectGroup.cs | 95 ++++++++++++---------- 1 file changed, 50 insertions(+), 45 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index f8b4483..6dc331b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2237,71 +2237,76 @@ namespace OpenSim.Region.Framework.Scenes { SceneObjectPart linkPart = GetChildPart(partID); - if (null != linkPart) + if (linkPart != null) { - linkPart.ClearUndoState(); + DelinkFromGroup(linkPart, sendEvents); + } + else + { + m_log.InfoFormat("[SCENE OBJECT GROUP]: " + + "DelinkFromGroup(): Child prim {0} not found in object {1}, {2}", + partID, LocalId, UUID); + } + } + + public void DelinkFromGroup(SceneObjectPart linkPart, bool sendEvents) + { + linkPart.ClearUndoState(); // m_log.DebugFormat( // "[SCENE OBJECT GROUP]: Delinking part {0}, {1} from group with root part {2}, {3}", // linkPart.Name, linkPart.UUID, RootPart.Name, RootPart.UUID); - Quaternion worldRot = linkPart.GetWorldRotation(); + Quaternion worldRot = linkPart.GetWorldRotation(); - // Remove the part from this object - lock (m_parts) - { - m_parts.Remove(linkPart.UUID); - } + // Remove the part from this object + lock (m_parts) + { + m_parts.Remove(linkPart.UUID); + } - if (m_parts.Count == 1 && RootPart != null) //Single prim is left - RootPart.LinkNum = 0; - else + if (m_parts.Count == 1 && RootPart != null) //Single prim is left + RootPart.LinkNum = 0; + else + { + foreach (SceneObjectPart p in m_parts.Values) { - foreach (SceneObjectPart p in m_parts.Values) - { - if (p.LinkNum > linkPart.LinkNum) - p.LinkNum--; - } + if (p.LinkNum > linkPart.LinkNum) + p.LinkNum--; } + } - linkPart.ParentID = 0; - linkPart.LinkNum = 0; + linkPart.ParentID = 0; + linkPart.LinkNum = 0; - if (linkPart.PhysActor != null) - { - m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor); - } + if (linkPart.PhysActor != null) + { + m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor); + } - // We need to reset the child part's position - // ready for life as a separate object after being a part of another object - Quaternion parentRot = m_rootPart.RotationOffset; + // We need to reset the child part's position + // ready for life as a separate object after being a part of another object + Quaternion parentRot = m_rootPart.RotationOffset; - Vector3 axPos = linkPart.OffsetPosition; + Vector3 axPos = linkPart.OffsetPosition; - axPos *= parentRot; - linkPart.OffsetPosition = new Vector3(axPos.X, axPos.Y, axPos.Z); - linkPart.GroupPosition = AbsolutePosition + linkPart.OffsetPosition; - linkPart.OffsetPosition = new Vector3(0, 0, 0); + axPos *= parentRot; + linkPart.OffsetPosition = new Vector3(axPos.X, axPos.Y, axPos.Z); + linkPart.GroupPosition = AbsolutePosition + linkPart.OffsetPosition; + linkPart.OffsetPosition = new Vector3(0, 0, 0); - linkPart.RotationOffset = worldRot; + linkPart.RotationOffset = worldRot; - SceneObjectGroup objectGroup = new SceneObjectGroup(linkPart); + SceneObjectGroup objectGroup = new SceneObjectGroup(linkPart); - m_scene.AddNewSceneObject(objectGroup, true); + m_scene.AddNewSceneObject(objectGroup, true); - if (sendEvents) - linkPart.TriggerScriptChangedEvent(Changed.LINK); + if (sendEvents) + linkPart.TriggerScriptChangedEvent(Changed.LINK); - linkPart.Rezzed = RootPart.Rezzed; + linkPart.Rezzed = RootPart.Rezzed; - HasGroupChanged = true; - ScheduleGroupForFullUpdate(); - } - else - { - m_log.InfoFormat("[SCENE OBJECT GROUP]: " + - "DelinkFromGroup(): Child prim {0} not found in object {1}, {2}", - partID, LocalId, UUID); - } + HasGroupChanged = true; + ScheduleGroupForFullUpdate(); } /// -- cgit v1.1