diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index e003cf8..5a586d4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -398,6 +398,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
398 | 398 | ||
399 | /// <value> | 399 | /// <value> |
400 | /// The parts of this scene object group. You must lock this property before using it. | 400 | /// The parts of this scene object group. You must lock this property before using it. |
401 | /// If you're doing anything other than reading values, please take a copy of the values rather than locking | ||
402 | /// the dictionary for the entirety of the operation. This increases liveness and reduces the danger of deadlock | ||
401 | /// If you want to know the number of children, consider using the PrimCount property instead | 403 | /// If you want to know the number of children, consider using the PrimCount property instead |
402 | /// </value> | 404 | /// </value> |
403 | public Dictionary<UUID, SceneObjectPart> Children | 405 | public Dictionary<UUID, SceneObjectPart> Children |
@@ -2306,29 +2308,29 @@ namespace OpenSim.Region.Framework.Scenes | |||
2306 | // return; | 2308 | // return; |
2307 | 2309 | ||
2308 | lockPartsForRead(true); | 2310 | lockPartsForRead(true); |
2309 | { | ||
2310 | bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0); | ||
2311 | 2311 | ||
2312 | if (UsePhysics && !AbsolutePosition.ApproxEquals(lastPhysGroupPos, 0.02f)) | 2312 | bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0); |
2313 | { | ||
2314 | m_rootPart.UpdateFlag = 1; | ||
2315 | lastPhysGroupPos = AbsolutePosition; | ||
2316 | } | ||
2317 | 2313 | ||
2318 | if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f)) | 2314 | if (UsePhysics && !AbsolutePosition.ApproxEquals(lastPhysGroupPos, 0.02f)) |
2319 | { | 2315 | { |
2320 | m_rootPart.UpdateFlag = 1; | 2316 | m_rootPart.UpdateFlag = 1; |
2321 | lastPhysGroupRot = GroupRotation; | 2317 | lastPhysGroupPos = AbsolutePosition; |
2322 | } | 2318 | } |
2323 | 2319 | ||
2324 | foreach (SceneObjectPart part in m_parts.Values) | 2320 | if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f)) |
2325 | { | 2321 | { |
2326 | if (!IsSelected) | 2322 | m_rootPart.UpdateFlag = 1; |
2327 | part.UpdateLookAt(); | 2323 | lastPhysGroupRot = GroupRotation; |
2324 | } | ||
2328 | 2325 | ||
2329 | part.SendScheduledUpdates(); | 2326 | List<SceneObjectPart> partList = null; |
2330 | 2327 | partList = new List<SceneObjectPart>(m_parts.Values); | |
2331 | } | 2328 | |
2329 | foreach (SceneObjectPart part in partList) | ||
2330 | { | ||
2331 | if (!IsSelected) | ||
2332 | part.UpdateLookAt(); | ||
2333 | part.SendScheduledUpdates(); | ||
2332 | } | 2334 | } |
2333 | lockPartsForRead(false); | 2335 | lockPartsForRead(false); |
2334 | } | 2336 | } |
@@ -3161,11 +3163,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3161 | public void UpdatePermissions(UUID AgentID, byte field, uint localID, | 3163 | public void UpdatePermissions(UUID AgentID, byte field, uint localID, |
3162 | uint mask, byte addRemTF) | 3164 | uint mask, byte addRemTF) |
3163 | { | 3165 | { |
3166 | List<SceneObjectPart> partList = null; | ||
3164 | lock (m_parts) | 3167 | lock (m_parts) |
3165 | { | 3168 | partList = new List<SceneObjectPart>(m_parts.Values); |
3166 | foreach (SceneObjectPart part in m_parts.Values) | 3169 | |
3167 | part.UpdatePermissions(AgentID, field, localID, mask, addRemTF); | 3170 | foreach (SceneObjectPart part in partList) |
3168 | } | 3171 | part.UpdatePermissions(AgentID, field, localID, mask, addRemTF); |
3169 | 3172 | ||
3170 | HasGroupChanged = true; | 3173 | HasGroupChanged = true; |
3171 | } | 3174 | } |