diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneGraph.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneGraph.cs | 53 |
1 files changed, 20 insertions, 33 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 85ff32e..28b80bb 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -348,9 +348,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
348 | if (Entities.ContainsKey(sceneObject.UUID)) | 348 | if (Entities.ContainsKey(sceneObject.UUID)) |
349 | return false; | 349 | return false; |
350 | 350 | ||
351 | List<SceneObjectPart> children; | 351 | SceneObjectPart[] children = sceneObject.Parts; |
352 | lock (sceneObject.Children) | ||
353 | children = new List<SceneObjectPart>(sceneObject.Children.Values); | ||
354 | 352 | ||
355 | // Clamp child prim sizes and add child prims to the m_numPrim count | 353 | // Clamp child prim sizes and add child prims to the m_numPrim count |
356 | if (m_parentScene.m_clampPrimSize) | 354 | if (m_parentScene.m_clampPrimSize) |
@@ -369,7 +367,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
369 | part.Shape.Scale = scale; | 367 | part.Shape.Scale = scale; |
370 | } | 368 | } |
371 | } | 369 | } |
372 | m_numPrim += children.Count; | 370 | m_numPrim += children.Length; |
373 | 371 | ||
374 | sceneObject.AttachToScene(m_parentScene); | 372 | sceneObject.AttachToScene(m_parentScene); |
375 | 373 | ||
@@ -426,15 +424,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
426 | 424 | ||
427 | lock (SceneObjectGroupsByFullID) | 425 | lock (SceneObjectGroupsByFullID) |
428 | { | 426 | { |
429 | foreach (SceneObjectPart part in grp.Children.Values) | 427 | SceneObjectPart[] parts = grp.Parts; |
430 | SceneObjectGroupsByFullID.Remove(part.UUID); | 428 | for (int i = 0; i < parts.Length; i++) |
429 | SceneObjectGroupsByFullID.Remove(parts[i].UUID); | ||
431 | SceneObjectGroupsByFullID.Remove(grp.RootPart.UUID); | 430 | SceneObjectGroupsByFullID.Remove(grp.RootPart.UUID); |
432 | } | 431 | } |
433 | 432 | ||
434 | lock (SceneObjectGroupsByLocalID) | 433 | lock (SceneObjectGroupsByLocalID) |
435 | { | 434 | { |
436 | foreach (SceneObjectPart part in grp.Children.Values) | 435 | SceneObjectPart[] parts = grp.Parts; |
437 | SceneObjectGroupsByLocalID.Remove(part.LocalId); | 436 | for (int i = 0; i < parts.Length; i++) |
437 | SceneObjectGroupsByLocalID.Remove(parts[i].LocalId); | ||
438 | SceneObjectGroupsByLocalID.Remove(grp.RootPart.LocalId); | 438 | SceneObjectGroupsByLocalID.Remove(grp.RootPart.LocalId); |
439 | } | 439 | } |
440 | 440 | ||
@@ -887,11 +887,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
887 | 887 | ||
888 | if (sog != null) | 888 | if (sog != null) |
889 | { | 889 | { |
890 | lock (sog.Children) | 890 | if (sog.ContainsPart(fullID)) |
891 | { | 891 | return sog; |
892 | if (sog.Children.ContainsKey(fullID)) | ||
893 | return sog; | ||
894 | } | ||
895 | 892 | ||
896 | lock (SceneObjectGroupsByFullID) | 893 | lock (SceneObjectGroupsByFullID) |
897 | SceneObjectGroupsByFullID.Remove(fullID); | 894 | SceneObjectGroupsByFullID.Remove(fullID); |
@@ -965,7 +962,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
965 | { | 962 | { |
966 | if (entity is SceneObjectGroup) | 963 | if (entity is SceneObjectGroup) |
967 | { | 964 | { |
968 | foreach (SceneObjectPart p in ((SceneObjectGroup)entity).GetParts()) | 965 | foreach (SceneObjectPart p in ((SceneObjectGroup)entity).Parts) |
969 | { | 966 | { |
970 | if (p.Name == name) | 967 | if (p.Name == name) |
971 | { | 968 | { |
@@ -1626,14 +1623,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1626 | // | 1623 | // |
1627 | SceneObjectGroup group = root.ParentGroup; | 1624 | SceneObjectGroup group = root.ParentGroup; |
1628 | 1625 | ||
1629 | List<SceneObjectPart> newSet = null; | 1626 | List<SceneObjectPart> newSet = new List<SceneObjectPart>(group.Parts); |
1630 | int numChildren = -1; | 1627 | int numChildren = newSet.Count; |
1631 | |||
1632 | lock (group.Children) | ||
1633 | { | ||
1634 | newSet = new List<SceneObjectPart>(group.Children.Values); | ||
1635 | numChildren = group.PrimCount; | ||
1636 | } | ||
1637 | 1628 | ||
1638 | // If there are prims left in a link set, but the root is | 1629 | // If there are prims left in a link set, but the root is |
1639 | // slated for unlink, we need to do this | 1630 | // slated for unlink, we need to do this |
@@ -1711,16 +1702,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
1711 | if (ent is SceneObjectGroup) | 1702 | if (ent is SceneObjectGroup) |
1712 | { | 1703 | { |
1713 | SceneObjectGroup sog = ent as SceneObjectGroup; | 1704 | SceneObjectGroup sog = ent as SceneObjectGroup; |
1714 | 1705 | ||
1715 | lock (sog.Children) | 1706 | foreach (SceneObjectPart part in sog.Parts) |
1716 | { | 1707 | { |
1717 | foreach (KeyValuePair<UUID, SceneObjectPart> subent in sog.Children) | 1708 | if (part.LocalId == localID) |
1718 | { | 1709 | { |
1719 | if (subent.Value.LocalId == localID) | 1710 | objid = part.UUID; |
1720 | { | 1711 | obj = part; |
1721 | objid = subent.Key; | ||
1722 | obj = subent.Value; | ||
1723 | } | ||
1724 | } | 1712 | } |
1725 | } | 1713 | } |
1726 | } | 1714 | } |
@@ -1796,8 +1784,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1796 | copy.SetOwnerId(AgentID); | 1784 | copy.SetOwnerId(AgentID); |
1797 | copy.SetRootPartOwner(copy.RootPart, AgentID, GroupID); | 1785 | copy.SetRootPartOwner(copy.RootPart, AgentID, GroupID); |
1798 | 1786 | ||
1799 | List<SceneObjectPart> partList = | 1787 | SceneObjectPart[] partList = copy.Parts; |
1800 | new List<SceneObjectPart>(copy.Children.Values); | ||
1801 | 1788 | ||
1802 | if (m_parentScene.Permissions.PropagatePermissions()) | 1789 | if (m_parentScene.Permissions.PropagatePermissions()) |
1803 | { | 1790 | { |
@@ -1822,7 +1809,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1822 | // think it's selected, so it will never send a deselect... | 1809 | // think it's selected, so it will never send a deselect... |
1823 | copy.IsSelected = false; | 1810 | copy.IsSelected = false; |
1824 | 1811 | ||
1825 | m_numPrim += copy.Children.Count; | 1812 | m_numPrim += copy.Parts.Length; |
1826 | 1813 | ||
1827 | if (rot != Quaternion.Identity) | 1814 | if (rot != Quaternion.Identity) |
1828 | { | 1815 | { |