aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs109
1 files changed, 53 insertions, 56 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 905c683..a39f27a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1678,28 +1678,23 @@ namespace OpenSim.Region.Framework.Scenes
1678 1678
1679 SceneObjectGroup group = part.ParentGroup; 1679 SceneObjectGroup group = part.ParentGroup;
1680 if (!affectedGroups.Contains(group)) 1680 if (!affectedGroups.Contains(group))
1681 {
1682 group.areUpdatesSuspended = true;
1681 affectedGroups.Add(group); 1683 affectedGroups.Add(group);
1684 }
1682 } 1685 }
1683 } 1686 }
1684 } 1687 }
1685 1688
1686 if (childParts.Count > 0) 1689 if (childParts.Count > 0)
1687 { 1690 {
1688 try 1691 foreach (SceneObjectPart child in childParts)
1689 { 1692 {
1690 childParts[0].ParentGroup.areUpdatesSuspended = true; 1693 // Unlink all child parts from their groups
1691 foreach (SceneObjectPart child in childParts) 1694 //
1692 { 1695 child.ParentGroup.DelinkFromGroup(child, true);
1693 // Unlink all child parts from their groups 1696 child.ParentGroup.HasGroupChanged = true;
1694 // 1697 child.ParentGroup.ScheduleGroupForFullUpdate();
1695 child.ParentGroup.DelinkFromGroup(child, true);
1696 child.ParentGroup.HasGroupChanged = true;
1697 child.ParentGroup.ScheduleGroupForFullUpdate();
1698 }
1699 }
1700 finally
1701 {
1702 childParts[0].ParentGroup.areUpdatesSuspended = false;
1703 } 1698 }
1704 } 1699 }
1705 1700
@@ -1710,9 +1705,10 @@ namespace OpenSim.Region.Framework.Scenes
1710 // However, editing linked parts and unlinking may be different 1705 // However, editing linked parts and unlinking may be different
1711 // 1706 //
1712 SceneObjectGroup group = root.ParentGroup; 1707 SceneObjectGroup group = root.ParentGroup;
1708 group.areUpdatesSuspended = true;
1713 1709
1714 List<SceneObjectPart> newSet = null; 1710 List<SceneObjectPart> newSet = null;
1715 int numChildren = -1; 1711 int numChildren;
1716 1712
1717 lock (group.Children) 1713 lock (group.Children)
1718 { 1714 {
@@ -1720,63 +1716,63 @@ namespace OpenSim.Region.Framework.Scenes
1720 numChildren = group.PrimCount; 1716 numChildren = group.PrimCount;
1721 } 1717 }
1722 1718
1719 if (numChildren == 1)
1720 break;
1721
1723 // If there are prims left in a link set, but the root is 1722 // If there are prims left in a link set, but the root is
1724 // slated for unlink, we need to do this 1723 // slated for unlink, we need to do this
1724 // Unlink the remaining set
1725 // 1725 //
1726 if (numChildren != 1) 1726 bool sendEventsToRemainder = true;
1727 { 1727 if (numChildren > 1)
1728 // Unlink the remaining set 1728 sendEventsToRemainder = false;
1729 //
1730 bool sendEventsToRemainder = true;
1731 if (numChildren > 1)
1732 sendEventsToRemainder = false;
1733 1729
1734 if (newSet.Count > 0) 1730 foreach (SceneObjectPart p in newSet)
1731 {
1732 if (p != group.RootPart)
1735 { 1733 {
1736 try 1734 group.DelinkFromGroup(p, sendEventsToRemainder);
1735 if (numChildren > 2)
1737 { 1736 {
1738 newSet[0].ParentGroup.areUpdatesSuspended = true; 1737 p.ParentGroup.areUpdatesSuspended = true;
1739 foreach (SceneObjectPart p in newSet)
1740 {
1741 if (p != group.RootPart)
1742 group.DelinkFromGroup(p, sendEventsToRemainder);
1743 }
1744 } 1738 }
1745 finally 1739 else
1746 { 1740 {
1747 newSet[0].ParentGroup.areUpdatesSuspended = false; 1741 p.ParentGroup.HasGroupChanged = true;
1742 p.ParentGroup.ScheduleGroupForFullUpdate();
1748 } 1743 }
1749 } 1744 }
1745 }
1746
1747 // If there is more than one prim remaining, we
1748 // need to re-link
1749 //
1750 if (numChildren > 2)
1751 {
1752 // Remove old root
1753 //
1754 if (newSet.Contains(root))
1755 newSet.Remove(root);
1750 1756
1751 // If there is more than one prim remaining, we 1757 // Preserve link ordering
1752 // need to re-link
1753 // 1758 //
1754 if (numChildren > 2) 1759 newSet.Sort(delegate (SceneObjectPart a, SceneObjectPart b)
1755 { 1760 {
1756 // Remove old root 1761 return a.LinkNum.CompareTo(b.LinkNum);
1757 // 1762 });
1758 if (newSet.Contains(root))
1759 newSet.Remove(root);
1760
1761 // Preserve link ordering
1762 //
1763 newSet.Sort(delegate (SceneObjectPart a, SceneObjectPart b)
1764 {
1765 return a.LinkNum.CompareTo(b.LinkNum);
1766 });
1767 1763
1768 // Determine new root 1764 // Determine new root
1769 // 1765 //
1770 SceneObjectPart newRoot = newSet[0]; 1766 SceneObjectPart newRoot = newSet[0];
1771 newSet.RemoveAt(0); 1767 newSet.RemoveAt(0);
1772 1768
1773 foreach (SceneObjectPart newChild in newSet) 1769 foreach (SceneObjectPart newChild in newSet)
1774 newChild.UpdateFlag = 0; 1770 newChild.UpdateFlag = 0;
1775 1771
1776 LinkObjects(newRoot, newSet); 1772 newRoot.ParentGroup.areUpdatesSuspended = true;
1777 if (!affectedGroups.Contains(newRoot.ParentGroup)) 1773 LinkObjects(newRoot, newSet);
1778 affectedGroups.Add(newRoot.ParentGroup); 1774 if (!affectedGroups.Contains(newRoot.ParentGroup))
1779 } 1775 affectedGroups.Add(newRoot.ParentGroup);
1780 } 1776 }
1781 } 1777 }
1782 1778
@@ -1786,6 +1782,7 @@ namespace OpenSim.Region.Framework.Scenes
1786 { 1782 {
1787 g.TriggerScriptChangedEvent(Changed.LINK); 1783 g.TriggerScriptChangedEvent(Changed.LINK);
1788 g.HasGroupChanged = true; // Persist 1784 g.HasGroupChanged = true; // Persist
1785 g.areUpdatesSuspended = false;
1789 g.ScheduleGroupForFullUpdate(); 1786 g.ScheduleGroupForFullUpdate();
1790 } 1787 }
1791 } 1788 }