mirror of
https://github.com/opensim/opensim.git
synced 2026-08-12 12:25:42 +08:00
Fix prim link numbers (Mantis #1781)
Implements additional unlink modes (unlink root prim from link set, some multi-set operations). Linking (single and mutiple) fully implemented. Consistent numbering of links while in world. Link/delink with predictable link numbering. Correct link numbers in LSL. Not all multi-set ops implemented. Link numbers still change when taken and re-rezzed.
This commit is contained in:
@@ -427,7 +427,10 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
if (reader.Name == "SceneObjectPart")
|
||||
{
|
||||
SceneObjectPart Part = SceneObjectPart.FromXml(reader);
|
||||
if(m_rootPart.LinkNum == 0)
|
||||
m_rootPart.LinkNum++;
|
||||
AddPart(Part);
|
||||
Part.LinkNum = m_parts.Count;
|
||||
Part.StoreUndoState();
|
||||
}
|
||||
else
|
||||
@@ -462,7 +465,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
LLVector3 rootOffset = new LLVector3(0, 0, 0);
|
||||
SceneObjectPart newPart =
|
||||
new SceneObjectPart(m_regionHandle, this, ownerID, localID, shape, pos, rot, rootOffset);
|
||||
newPart.LinkNum = m_parts.Count;
|
||||
newPart.LinkNum = 0;
|
||||
m_parts.Add(newPart.UUID, newPart);
|
||||
SetPartAsRoot(newPart);
|
||||
|
||||
@@ -817,7 +820,6 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
lock (m_parts)
|
||||
{
|
||||
part.SetParent(this);
|
||||
part.LinkNum = m_parts.Count;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -828,6 +830,11 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
m_log.Error("Failed to add scened object part", e);
|
||||
}
|
||||
|
||||
part.LinkNum = m_parts.Count;
|
||||
|
||||
if(part.LinkNum == 2 && RootPart != null)
|
||||
RootPart.LinkNum = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1738,14 +1745,16 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w);
|
||||
|
||||
linkPart.ParentID = m_rootPart.LocalId;
|
||||
|
||||
linkPart.LinkNum = m_parts.Count;
|
||||
if(m_rootPart.LinkNum == 0)
|
||||
m_rootPart.LinkNum = 1;
|
||||
|
||||
lock (m_parts)
|
||||
{
|
||||
m_parts.Add(linkPart.UUID, linkPart);
|
||||
}
|
||||
|
||||
linkPart.LinkNum = m_parts.Count;
|
||||
|
||||
linkPart.SetParent(this);
|
||||
|
||||
//if (linkPart.PhysActor != null)
|
||||
@@ -1783,6 +1792,11 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
/// </summary>
|
||||
/// <param name="partID"></param>
|
||||
public void DelinkFromGroup(uint partID)
|
||||
{
|
||||
DelinkFromGroup(partID, true);
|
||||
}
|
||||
|
||||
public void DelinkFromGroup(uint partID, bool sendEvents)
|
||||
{
|
||||
SceneObjectPart linkPart = GetChildPart(partID);
|
||||
|
||||
@@ -1801,7 +1815,17 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
m_parts.Remove(linkPart.UUID);
|
||||
}
|
||||
|
||||
if(m_parts.Count == 1 && RootPart != null) //Single prim is left
|
||||
RootPart.LinkNum = 0;
|
||||
else
|
||||
{
|
||||
foreach (SceneObjectPart p in m_parts.Values)
|
||||
if(p.LinkNum > linkPart.LinkNum)
|
||||
p.LinkNum--;
|
||||
}
|
||||
|
||||
linkPart.ParentID = 0;
|
||||
linkPart.LinkNum = 0;
|
||||
|
||||
if (linkPart.PhysActor != null)
|
||||
{
|
||||
@@ -1834,6 +1858,9 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
|
||||
m_scene.AddNewSceneObject(objectGroup, true);
|
||||
|
||||
if(sendEvents)
|
||||
linkPart.TriggerScriptChangedEvent(Changed.LINK);
|
||||
|
||||
HasGroupChanged = true;
|
||||
ScheduleGroupForFullUpdate();
|
||||
}
|
||||
@@ -1858,13 +1885,14 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
part.SetParent(this);
|
||||
part.ParentID = m_rootPart.LocalId;
|
||||
part.LinkNum = m_parts.Count;
|
||||
|
||||
lock (m_parts)
|
||||
{
|
||||
m_parts.Add(part.UUID, part);
|
||||
}
|
||||
|
||||
part.LinkNum = m_parts.Count;
|
||||
|
||||
Vector3 axiomOldPos = new Vector3(part.OffsetPosition.X, part.OffsetPosition.Y, part.OffsetPosition.Z);
|
||||
axiomOldPos = oldGroupRotation * axiomOldPos;
|
||||
axiomOldPos += oldGroupPosition;
|
||||
@@ -2670,5 +2698,13 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
|
||||
ScheduleGroupForFullUpdate();
|
||||
}
|
||||
|
||||
public void TriggerScriptChangedEvent(Changed val)
|
||||
{
|
||||
foreach (SceneObjectPart part in Children.Values)
|
||||
{
|
||||
part.TriggerScriptChangedEvent(val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user