aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneGraph.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2010-03-03 22:14:06 +0000
committerJustin Clark-Casey (justincc)2010-03-09 18:53:04 +0000
commit5caae0293ab0f69cced21923c36db230698c7970 (patch)
treed9aadd6f5e7b159386e8633660955ee2805a5d2d /OpenSim/Region/Framework/Scenes/SceneGraph.cs
parentSmall consistency change (diff)
downloadopensim-SC-5caae0293ab0f69cced21923c36db230698c7970.zip
opensim-SC-5caae0293ab0f69cced21923c36db230698c7970.tar.gz
opensim-SC-5caae0293ab0f69cced21923c36db230698c7970.tar.bz2
opensim-SC-5caae0293ab0f69cced21923c36db230698c7970.tar.xz
Fix bug where approximately half the time, attachments would rez only their root prim until right clicked (or otherwise updated).
The root cause of this problem was that multiple ObjectUpdates were being sent on attachment which differed enough to confuse the client. Sometimes these would eliminate each other and sometimes not, depending on whether the scheduler looked at the queued updates. The solution here is to only schedule the ObjectUpdate once the attachment code has done all it needs to do. Backport from head.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneGraph.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs62
1 files changed, 41 insertions, 21 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 321cc45..d31b45e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -228,7 +228,7 @@ namespace OpenSim.Region.Framework.Scenes
228 sceneObject.HasGroupChanged = true; 228 sceneObject.HasGroupChanged = true;
229 } 229 }
230 230
231 return AddSceneObject(sceneObject, attachToBackup); 231 return AddSceneObject(sceneObject, attachToBackup, true);
232 } 232 }
233 233
234 /// <summary> 234 /// <summary>
@@ -243,12 +243,12 @@ namespace OpenSim.Region.Framework.Scenes
243 /// <returns> 243 /// <returns>
244 /// true if the object was added, false if an object with the same uuid was already in the scene 244 /// true if the object was added, false if an object with the same uuid was already in the scene
245 /// </returns> 245 /// </returns>
246 protected internal bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup) 246 protected internal bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
247 { 247 {
248 // Ensure that we persist this new scene object 248 // Ensure that we persist this new scene object
249 sceneObject.HasGroupChanged = true; 249 sceneObject.HasGroupChanged = true;
250 250
251 return AddSceneObject(sceneObject, attachToBackup); 251 return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates);
252 } 252 }
253 253
254 /// <summary> 254 /// <summary>
@@ -260,12 +260,19 @@ namespace OpenSim.Region.Framework.Scenes
260 /// If true, the object is made persistent into the scene. 260 /// If true, the object is made persistent into the scene.
261 /// If false, the object will not persist over server restarts 261 /// If false, the object will not persist over server restarts
262 /// </param> 262 /// </param>
263 /// <returns>true if the object was added, false if an object with the same uuid was already in the scene 263 /// <param name="sendClientUpdates">
264 /// If true, updates for the new scene object are sent to all viewers in range.
265 /// If false, it is left to the caller to schedule the update
266 /// </param>
267 /// <returns>
268 /// true if the object was added, false if an object with the same uuid was already in the scene
264 /// </returns> 269 /// </returns>
265 protected bool AddSceneObject(SceneObjectGroup sceneObject, bool attachToBackup) 270 protected bool AddSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
266 { 271 {
267 if (sceneObject == null || sceneObject.RootPart == null || sceneObject.RootPart.UUID == UUID.Zero) 272 if (sceneObject == null || sceneObject.RootPart == null || sceneObject.RootPart.UUID == UUID.Zero)
268 return false; 273 return false;
274
275 bool alreadyExisted = false;
269 276
270 if (m_parentScene.m_clampPrimSize) 277 if (m_parentScene.m_clampPrimSize)
271 { 278 {
@@ -286,6 +293,9 @@ namespace OpenSim.Region.Framework.Scenes
286 293
287 sceneObject.AttachToScene(m_parentScene); 294 sceneObject.AttachToScene(m_parentScene);
288 295
296 if (sendClientUpdates)
297 sceneObject.ScheduleGroupForFullUpdate();
298
289 lock (sceneObject) 299 lock (sceneObject)
290 { 300 {
291 if (!Entities.ContainsKey(sceneObject.UUID)) 301 if (!Entities.ContainsKey(sceneObject.UUID))
@@ -309,12 +319,14 @@ namespace OpenSim.Region.Framework.Scenes
309 SceneObjectGroupsByLocalID[part.LocalId] = sceneObject; 319 SceneObjectGroupsByLocalID[part.LocalId] = sceneObject;
310 } 320 }
311 } 321 }
312 322 }
313 return true; 323 else
324 {
325 alreadyExisted = true;
314 } 326 }
315 } 327 }
316 328
317 return false; 329 return alreadyExisted;
318 } 330 }
319 331
320 /// <summary> 332 /// <summary>
@@ -521,26 +533,34 @@ namespace OpenSim.Region.Framework.Scenes
521 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, 533 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
522 false, false, remoteClient.AgentId, true); 534 false, false, remoteClient.AgentId, true);
523 535
536// m_log.DebugFormat(
537// "[SCENE GRAPH]: Retrieved single object {0} for attachment to {1} on point {2}",
538// objatt.Name, remoteClient.Name, AttachmentPt);
539
524 if (objatt != null) 540 if (objatt != null)
525 { 541 {
526 bool tainted = false; 542 bool tainted = false;
527 if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint()) 543 if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint())
528 tainted = true; 544 tainted = true;
529 545
530 if (AttachObject( 546 AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false);
531 remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false)) 547 //objatt.ScheduleGroupForFullUpdate();
532 {
533 objatt.ScheduleGroupForFullUpdate();
534 if (tainted)
535 objatt.HasGroupChanged = true;
536
537 // Fire after attach, so we don't get messy perms dialogs
538 // 3 == AttachedRez
539 objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3);
540 548
541 // Do this last so that event listeners have access to all the effects of the attachment 549 if (tainted)
542 m_parentScene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId); 550 objatt.HasGroupChanged = true;
543 } 551
552 // Fire after attach, so we don't get messy perms dialogs
553 // 3 == AttachedRez
554 objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3);
555
556 // Do this last so that event listeners have access to all the effects of the attachment
557 m_parentScene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId);
558 }
559 else
560 {
561 m_log.WarnFormat(
562 "[SCENE GRAPH]: Could not retrieve item {0} for attaching to avatar {1} at point {2}",
563 itemID, remoteClient.Name, AttachmentPt);
544 } 564 }
545 565
546 return objatt; 566 return objatt;