aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs192
1 files changed, 96 insertions, 96 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index e42b675..8fdb0f1 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -24,7 +24,7 @@
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using System; 28using System;
29using System.ComponentModel; 29using System.ComponentModel;
30using System.Collections.Generic; 30using System.Collections.Generic;
@@ -46,7 +46,7 @@ using OpenSim.Services.Interfaces;
46 46
47namespace OpenSim.Region.Framework.Scenes 47namespace OpenSim.Region.Framework.Scenes
48{ 48{
49 49
50 [Flags] 50 [Flags]
51 public enum scriptEvents 51 public enum scriptEvents
52 { 52 {
@@ -148,7 +148,7 @@ namespace OpenSim.Region.Framework.Scenes
148 { 148 {
149 if (value) 149 if (value)
150 { 150 {
151 151
152 if (Backup) 152 if (Backup)
153 { 153 {
154 m_scene.SceneGraph.FireChangeBackup(this); 154 m_scene.SceneGraph.FireChangeBackup(this);
@@ -188,7 +188,7 @@ namespace OpenSim.Region.Framework.Scenes
188 } 188 }
189 } 189 }
190 m_hasGroupChanged = value; 190 m_hasGroupChanged = value;
191 191
192// m_log.DebugFormat( 192// m_log.DebugFormat(
193// "[SCENE OBJECT GROUP]: HasGroupChanged set to {0} for {1} {2}", m_hasGroupChanged, Name, LocalId); 193// "[SCENE OBJECT GROUP]: HasGroupChanged set to {0} for {1} {2}", m_hasGroupChanged, Name, LocalId);
194 } 194 }
@@ -197,7 +197,7 @@ namespace OpenSim.Region.Framework.Scenes
197 } 197 }
198 198
199 private bool m_groupContainsForeignPrims = false; 199 private bool m_groupContainsForeignPrims = false;
200 200
201 /// <summary> 201 /// <summary>
202 /// Whether the group contains prims that came from a different group. This happens when 202 /// Whether the group contains prims that came from a different group. This happens when
203 /// linking or delinking groups. The implication is that until the group is persisted, 203 /// linking or delinking groups. The implication is that until the group is persisted,
@@ -232,7 +232,7 @@ namespace OpenSim.Region.Framework.Scenes
232 m_maxPersistTime = m_scene.m_persistAfter; 232 m_maxPersistTime = m_scene.m_persistAfter;
233 m_minPersistTime = m_scene.m_dontPersistBefore; 233 m_minPersistTime = m_scene.m_dontPersistBefore;
234 } 234 }
235 235
236 long currentTime = DateTime.UtcNow.Ticks; 236 long currentTime = DateTime.UtcNow.Ticks;
237 237
238 if (timeLastChanged == 0) timeLastChanged = currentTime; 238 if (timeLastChanged == 0) timeLastChanged = currentTime;
@@ -419,7 +419,7 @@ namespace OpenSim.Region.Framework.Scenes
419// { 419// {
420// get { return m_rotation; } 420// get { return m_rotation; }
421// set { 421// set {
422// m_rotation = value; 422// m_rotation = value;
423// } 423// }
424// } 424// }
425 425
@@ -435,27 +435,27 @@ namespace OpenSim.Region.Framework.Scenes
435 Vector3 minScale = new Vector3(Constants.MaximumRegionSize, Constants.MaximumRegionSize, Constants.MaximumRegionSize); 435 Vector3 minScale = new Vector3(Constants.MaximumRegionSize, Constants.MaximumRegionSize, Constants.MaximumRegionSize);
436 Vector3 maxScale = Vector3.Zero; 436 Vector3 maxScale = Vector3.Zero;
437 Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f); 437 Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f);
438 438
439 SceneObjectPart[] parts = m_parts.GetArray(); 439 SceneObjectPart[] parts = m_parts.GetArray();
440 for (int i = 0; i < parts.Length; i++) 440 for (int i = 0; i < parts.Length; i++)
441 { 441 {
442 SceneObjectPart part = parts[i]; 442 SceneObjectPart part = parts[i];
443 Vector3 partscale = part.Scale; 443 Vector3 partscale = part.Scale;
444 Vector3 partoffset = part.OffsetPosition; 444 Vector3 partoffset = part.OffsetPosition;
445 445
446 minScale.X = (partscale.X + partoffset.X < minScale.X) ? partscale.X + partoffset.X : minScale.X; 446 minScale.X = (partscale.X + partoffset.X < minScale.X) ? partscale.X + partoffset.X : minScale.X;
447 minScale.Y = (partscale.Y + partoffset.Y < minScale.Y) ? partscale.Y + partoffset.Y : minScale.Y; 447 minScale.Y = (partscale.Y + partoffset.Y < minScale.Y) ? partscale.Y + partoffset.Y : minScale.Y;
448 minScale.Z = (partscale.Z + partoffset.Z < minScale.Z) ? partscale.Z + partoffset.Z : minScale.Z; 448 minScale.Z = (partscale.Z + partoffset.Z < minScale.Z) ? partscale.Z + partoffset.Z : minScale.Z;
449 449
450 maxScale.X = (partscale.X + partoffset.X > maxScale.X) ? partscale.X + partoffset.X : maxScale.X; 450 maxScale.X = (partscale.X + partoffset.X > maxScale.X) ? partscale.X + partoffset.X : maxScale.X;
451 maxScale.Y = (partscale.Y + partoffset.Y > maxScale.Y) ? partscale.Y + partoffset.Y : maxScale.Y; 451 maxScale.Y = (partscale.Y + partoffset.Y > maxScale.Y) ? partscale.Y + partoffset.Y : maxScale.Y;
452 maxScale.Z = (partscale.Z + partoffset.Z > maxScale.Z) ? partscale.Z + partoffset.Z : maxScale.Z; 452 maxScale.Z = (partscale.Z + partoffset.Z > maxScale.Z) ? partscale.Z + partoffset.Z : maxScale.Z;
453 } 453 }
454 454
455 finalScale.X = (minScale.X > maxScale.X) ? minScale.X : maxScale.X; 455 finalScale.X = (minScale.X > maxScale.X) ? minScale.X : maxScale.X;
456 finalScale.Y = (minScale.Y > maxScale.Y) ? minScale.Y : maxScale.Y; 456 finalScale.Y = (minScale.Y > maxScale.Y) ? minScale.Y : maxScale.Y;
457 finalScale.Z = (minScale.Z > maxScale.Z) ? minScale.Z : maxScale.Z; 457 finalScale.Z = (minScale.Z > maxScale.Z) ? minScale.Z : maxScale.Z;
458 458
459 return finalScale; 459 return finalScale;
460 } 460 }
461 } 461 }
@@ -520,7 +520,7 @@ namespace OpenSim.Region.Framework.Scenes
520 /// <remarks> 520 /// <remarks>
521 /// This is necessary in some cases, particularly when a scene object has just crossed into a region and doesn't 521 /// This is necessary in some cases, particularly when a scene object has just crossed into a region and doesn't
522 /// have the IsAttachment property yet checked. 522 /// have the IsAttachment property yet checked.
523 /// 523 ///
524 /// FIXME: However, this should be fixed so that this property 524 /// FIXME: However, this should be fixed so that this property
525 /// propertly reflects the underlying status. 525 /// propertly reflects the underlying status.
526 /// </remarks> 526 /// </remarks>
@@ -530,7 +530,7 @@ namespace OpenSim.Region.Framework.Scenes
530 return (IsAttachment || 530 return (IsAttachment ||
531 (m_rootPart.Shape.PCode == (byte)PCodeEnum.Primitive && m_rootPart.Shape.State != 0)); 531 (m_rootPart.Shape.PCode == (byte)PCodeEnum.Primitive && m_rootPart.Shape.State != 0));
532 } 532 }
533 533
534 private struct avtocrossInfo 534 private struct avtocrossInfo
535 { 535 {
536 public ScenePresence av; 536 public ScenePresence av;
@@ -627,7 +627,7 @@ namespace OpenSim.Region.Framework.Scenes
627 OpenSim.Services.Interfaces.GridRegion destination = null; 627 OpenSim.Services.Interfaces.GridRegion destination = null;
628 628
629 if (sog.RootPart.DIE_AT_EDGE) 629 if (sog.RootPart.DIE_AT_EDGE)
630 { 630 {
631 try 631 try
632 { 632 {
633 sogScene.DeleteSceneObject(sog, false); 633 sogScene.DeleteSceneObject(sog, false);
@@ -648,7 +648,7 @@ namespace OpenSim.Region.Framework.Scenes
648 localIDs.Add(sog.RootPart.LocalId); 648 localIDs.Add(sog.RootPart.LocalId);
649 sogScene.AddReturn(sog.OwnerID, sog.Name, sog.AbsolutePosition, 649 sogScene.AddReturn(sog.OwnerID, sog.Name, sog.AbsolutePosition,
650 "Returned at region cross"); 650 "Returned at region cross");
651 sogScene.DeRezObjects(null, localIDs, UUID.Zero, DeRezAction.Return, UUID.Zero); 651 sogScene.DeRezObjects(null, localIDs, UUID.Zero, DeRezAction.Return, UUID.Zero);
652 } 652 }
653 catch (Exception) 653 catch (Exception)
654 { 654 {
@@ -754,7 +754,7 @@ namespace OpenSim.Region.Framework.Scenes
754 // avatar cross failed we need do dedicated standUp 754 // avatar cross failed we need do dedicated standUp
755 // part of it was done at CrossAgentToNewRegionAsync 755 // part of it was done at CrossAgentToNewRegionAsync
756 // so for now just remove the sog controls 756 // so for now just remove the sog controls
757 // this may need extra care 757 // this may need extra care
758 av.UnRegisterSeatControls(sog.UUID); 758 av.UnRegisterSeatControls(sog.UUID);
759 } 759 }
760 760
@@ -869,7 +869,7 @@ namespace OpenSim.Region.Framework.Scenes
869 public override UUID UUID 869 public override UUID UUID
870 { 870 {
871 get { return m_rootPart.UUID; } 871 get { return m_rootPart.UUID; }
872 set 872 set
873 { 873 {
874 lock (m_parts.SyncRoot) 874 lock (m_parts.SyncRoot)
875 { 875 {
@@ -931,7 +931,7 @@ namespace OpenSim.Region.Framework.Scenes
931 { 931 {
932 get { return true; } 932 get { return true; }
933 } 933 }
934 934
935 public bool IsSelected 935 public bool IsSelected
936 { 936 {
937 get { return m_isSelected; } 937 get { return m_isSelected; }
@@ -944,7 +944,7 @@ namespace OpenSim.Region.Framework.Scenes
944 // but ode engines should only really need to know about root part 944 // but ode engines should only really need to know about root part
945 // so they can put entire object simulation on hold and not colliding 945 // so they can put entire object simulation on hold and not colliding
946 // keep as was for now 946 // keep as was for now
947 947
948 PhysicsActor pa = m_rootPart.PhysActor; 948 PhysicsActor pa = m_rootPart.PhysActor;
949 if (pa != null) 949 if (pa != null)
950 { 950 {
@@ -1107,7 +1107,7 @@ namespace OpenSim.Region.Framework.Scenes
1107 /// </summary> 1107 /// </summary>
1108 public SceneObjectGroup() 1108 public SceneObjectGroup()
1109 { 1109 {
1110 1110
1111 } 1111 }
1112 1112
1113 /// <summary> 1113 /// <summary>
@@ -1152,7 +1152,7 @@ namespace OpenSim.Region.Framework.Scenes
1152 if (itemid != UUID.Zero) 1152 if (itemid != UUID.Zero)
1153 m_savedScriptState[itemid] = node.InnerXml; 1153 m_savedScriptState[itemid] = node.InnerXml;
1154 } 1154 }
1155 } 1155 }
1156 } 1156 }
1157 } 1157 }
1158 1158
@@ -1211,11 +1211,11 @@ namespace OpenSim.Region.Framework.Scenes
1211 1211
1212 if (!Backup) 1212 if (!Backup)
1213 m_scene.EventManager.OnBackup += ProcessBackup; 1213 m_scene.EventManager.OnBackup += ProcessBackup;
1214 1214
1215 Backup = true; 1215 Backup = true;
1216 } 1216 }
1217 } 1217 }
1218 1218
1219 /// <summary> 1219 /// <summary>
1220 /// Attach this object to a scene. It will also now appear to agents. 1220 /// Attach this object to a scene. It will also now appear to agents.
1221 /// </summary> 1221 /// </summary>
@@ -1378,7 +1378,7 @@ namespace OpenSim.Region.Framework.Scenes
1378 backBottomRight.Y = orig.Y + (part.Scale.Y / 2); 1378 backBottomRight.Y = orig.Y + (part.Scale.Y / 2);
1379 backBottomRight.Z = orig.Z - (part.Scale.Z / 2); 1379 backBottomRight.Z = orig.Z - (part.Scale.Z / 2);
1380 1380
1381 1381
1382 1382
1383 //m_log.InfoFormat("pre corner 1 is {0} {1} {2}", frontTopLeft.X, frontTopLeft.Y, frontTopLeft.Z); 1383 //m_log.InfoFormat("pre corner 1 is {0} {1} {2}", frontTopLeft.X, frontTopLeft.Y, frontTopLeft.Z);
1384 //m_log.InfoFormat("pre corner 2 is {0} {1} {2}", frontTopRight.X, frontTopRight.Y, frontTopRight.Z); 1384 //m_log.InfoFormat("pre corner 2 is {0} {1} {2}", frontTopRight.X, frontTopRight.Y, frontTopRight.Z);
@@ -1675,7 +1675,7 @@ namespace OpenSim.Region.Framework.Scenes
1675 } 1675 }
1676 1676
1677 int nparts = parts.Length; 1677 int nparts = parts.Length;
1678 1678
1679 1679
1680 for (int i = 0; i < nparts; i++) 1680 for (int i = 0; i < nparts; i++)
1681 { 1681 {
@@ -1692,7 +1692,7 @@ namespace OpenSim.Region.Framework.Scenes
1692 { 1692 {
1693 linksetResCost = 0; 1693 linksetResCost = 0;
1694 linksetPhysCost = 0; 1694 linksetPhysCost = 0;
1695 partCost = 0; 1695 partCost = 0;
1696 partPhysCost = 0; 1696 partPhysCost = 0;
1697 1697
1698 for (int i = 0; i < nparts; i++) 1698 for (int i = 0; i < nparts; i++)
@@ -1838,7 +1838,7 @@ namespace OpenSim.Region.Framework.Scenes
1838 else 1838 else
1839 { 1839 {
1840 m_log.WarnFormat( 1840 m_log.WarnFormat(
1841 "[SOG]: Tried to add attachment {0} to avatar with UUID {1} in region {2} but the avatar is not present", 1841 "[SOG]: Tried to add attachment {0} to avatar with UUID {1} in region {2} but the avatar is not present",
1842 UUID, avatar.ControllingClient.AgentId, Scene.RegionInfo.RegionName); 1842 UUID, avatar.ControllingClient.AgentId, Scene.RegionInfo.RegionName);
1843 } 1843 }
1844 } 1844 }
@@ -1925,7 +1925,7 @@ namespace OpenSim.Region.Framework.Scenes
1925 { 1925 {
1926 return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); 1926 return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
1927 } 1927 }
1928 1928
1929 /// <summary> 1929 /// <summary>
1930 /// Set a part to act as the root part for this scene object 1930 /// Set a part to act as the root part for this scene object
1931 /// </summary> 1931 /// </summary>
@@ -1940,7 +1940,7 @@ namespace OpenSim.Region.Framework.Scenes
1940 if (!IsAttachment) 1940 if (!IsAttachment)
1941 part.ParentID = 0; 1941 part.ParentID = 0;
1942 part.LinkNum = 0; 1942 part.LinkNum = 0;
1943 1943
1944 m_parts.Add(m_rootPart.UUID, m_rootPart); 1944 m_parts.Add(m_rootPart.UUID, m_rootPart);
1945 } 1945 }
1946 1946
@@ -1991,19 +1991,19 @@ namespace OpenSim.Region.Framework.Scenes
1991 // justincc: I don't believe this hack is needed any longer, especially since the physics 1991 // justincc: I don't believe this hack is needed any longer, especially since the physics
1992 // parts of set AbsolutePosition were already commented out. By changing HasGroupChanged to false 1992 // parts of set AbsolutePosition were already commented out. By changing HasGroupChanged to false
1993 // this method was preventing proper reload of scene objects. 1993 // this method was preventing proper reload of scene objects.
1994 1994
1995 // dahlia: I had to uncomment it, without it meshing was failing on some prims and objects 1995 // dahlia: I had to uncomment it, without it meshing was failing on some prims and objects
1996 // at region startup 1996 // at region startup
1997 1997
1998 // teravus: After this was removed from the linking algorithm, Linked prims no longer collided 1998 // teravus: After this was removed from the linking algorithm, Linked prims no longer collided
1999 // properly when non-physical if they havn't been moved. This breaks ALL builds. 1999 // properly when non-physical if they havn't been moved. This breaks ALL builds.
2000 // see: http://opensimulator.org/mantis/view.php?id=3108 2000 // see: http://opensimulator.org/mantis/view.php?id=3108
2001 2001
2002 // Here's the deal, this is ABSOLUTELY CRITICAL so the physics scene gets the update about the 2002 // Here's the deal, this is ABSOLUTELY CRITICAL so the physics scene gets the update about the
2003 // position of linkset prims. IF YOU CHANGE THIS, YOU MUST TEST colliding with just linked and 2003 // position of linkset prims. IF YOU CHANGE THIS, YOU MUST TEST colliding with just linked and
2004 // unmoved prims! As soon as you move a Prim/group, it will collide properly because Absolute 2004 // unmoved prims! As soon as you move a Prim/group, it will collide properly because Absolute
2005 // Position has been set! 2005 // Position has been set!
2006 2006
2007 public void ResetChildPrimPhysicsPositions() 2007 public void ResetChildPrimPhysicsPositions()
2008 { 2008 {
2009 // Setting this SOG's absolute position also loops through and sets the positions 2009 // Setting this SOG's absolute position also loops through and sets the positions
@@ -2219,9 +2219,9 @@ namespace OpenSim.Region.Framework.Scenes
2219 2219
2220 if (m_rootPart.PhysActor != null) 2220 if (m_rootPart.PhysActor != null)
2221 m_rootPart.PhysActor.Building = false; 2221 m_rootPart.PhysActor.Building = false;
2222 } 2222 }
2223 else 2223 else
2224 { 2224 {
2225 // Apply physics to the root prim 2225 // Apply physics to the root prim
2226 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, false); 2226 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, false);
2227 } 2227 }
@@ -2309,7 +2309,7 @@ namespace OpenSim.Region.Framework.Scenes
2309 2309
2310 DetachFromBackup(); 2310 DetachFromBackup();
2311 m_log.DebugFormat( 2311 m_log.DebugFormat(
2312 "[SCENE OBJECT GROUP]: Returning object {0} due to parcel autoreturn", 2312 "[SCENE OBJECT GROUP]: Returning object {0} due to parcel autoreturn",
2313 RootPart.UUID); 2313 RootPart.UUID);
2314 m_scene.AddReturn(OwnerID == GroupID ? LastOwnerID : OwnerID, Name, AbsolutePosition, "parcel autoreturn"); 2314 m_scene.AddReturn(OwnerID == GroupID ? LastOwnerID : OwnerID, Name, AbsolutePosition, "parcel autoreturn");
2315 m_scene.DeRezObjects(null, new List<uint>() { RootPart.LocalId }, UUID.Zero, 2315 m_scene.DeRezObjects(null, new List<uint>() { RootPart.LocalId }, UUID.Zero,
@@ -2364,9 +2364,9 @@ namespace OpenSim.Region.Framework.Scenes
2364 2364
2365 datastore.StoreObject(backup_group, m_scene.RegionInfo.RegionID); 2365 datastore.StoreObject(backup_group, m_scene.RegionInfo.RegionID);
2366 2366
2367 backup_group.ForEachPart(delegate(SceneObjectPart part) 2367 backup_group.ForEachPart(delegate(SceneObjectPart part)
2368 { 2368 {
2369 part.Inventory.ProcessInventoryBackup(datastore); 2369 part.Inventory.ProcessInventoryBackup(datastore);
2370 2370
2371 if(part.KeyframeMotion != null) 2371 if(part.KeyframeMotion != null)
2372 { 2372 {
@@ -2389,7 +2389,7 @@ namespace OpenSim.Region.Framework.Scenes
2389 catch (Exception e) 2389 catch (Exception e)
2390 { 2390 {
2391 m_log.ErrorFormat( 2391 m_log.ErrorFormat(
2392 "[SCENE]: Storing of {0}, {1} in {2} failed with exception {3}{4}", 2392 "[SCENE]: Storing of {0}, {1} in {2} failed with exception {3}{4}",
2393 Name, UUID, m_scene.RegionInfo.RegionName, e.Message, e.StackTrace); 2393 Name, UUID, m_scene.RegionInfo.RegionName, e.Message, e.StackTrace);
2394 } 2394 }
2395 } 2395 }
@@ -2427,22 +2427,22 @@ namespace OpenSim.Region.Framework.Scenes
2427 { 2427 {
2428 m_dupeInProgress = true; 2428 m_dupeInProgress = true;
2429 SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone(); 2429 SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
2430 2430
2431 dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>(); 2431 dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>();
2432 2432
2433 // a copy isnt backedup 2433 // a copy isnt backedup
2434 dupe.Backup = false; 2434 dupe.Backup = false;
2435 dupe.InvalidBoundsRadius(); 2435 dupe.InvalidBoundsRadius();
2436 2436
2437 // a copy is not in transit hopefully 2437 // a copy is not in transit hopefully
2438 dupe.inTransit = false; 2438 dupe.inTransit = false;
2439 2439
2440 // new group as no sitting avatars 2440 // new group as no sitting avatars
2441 dupe.m_sittingAvatars = new List<ScenePresence>(); 2441 dupe.m_sittingAvatars = new List<ScenePresence>();
2442 2442
2443 dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed); 2443 dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
2444 dupe.m_rootPart.LinkNum = m_rootPart.LinkNum; 2444 dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
2445 2445
2446 2446
2447 if (userExposed) 2447 if (userExposed)
2448 dupe.m_rootPart.TrimPermissions(); 2448 dupe.m_rootPart.TrimPermissions();
@@ -2587,7 +2587,7 @@ namespace OpenSim.Region.Framework.Scenes
2587 2587
2588 if (pa != null) 2588 if (pa != null)
2589 { 2589 {
2590 // false to be applied as a impulse 2590 // false to be applied as a impulse
2591 pa.AddForce(impulse, false); 2591 pa.AddForce(impulse, false);
2592 m_scene.PhysicsScene.AddPhysicsActorTaint(pa); 2592 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
2593 } 2593 }
@@ -2723,7 +2723,7 @@ namespace OpenSim.Region.Framework.Scenes
2723 if(IsAttachment) 2723 if(IsAttachment)
2724 { 2724 {
2725 ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar); 2725 ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar);
2726 if (avatar != null) 2726 if (avatar != null)
2727 pa = avatar.PhysicsActor; 2727 pa = avatar.PhysicsActor;
2728 } 2728 }
2729 else 2729 else
@@ -2813,7 +2813,7 @@ namespace OpenSim.Region.Framework.Scenes
2813 public void ServiceObjectPropertiesFamilyRequest(IClientAPI remoteClient, UUID AgentID, uint RequestFlags) 2813 public void ServiceObjectPropertiesFamilyRequest(IClientAPI remoteClient, UUID AgentID, uint RequestFlags)
2814 { 2814 {
2815 remoteClient.SendObjectPropertiesFamilyData(RootPart, RequestFlags); 2815 remoteClient.SendObjectPropertiesFamilyData(RootPart, RequestFlags);
2816 2816
2817// remoteClient.SendObjectPropertiesFamilyData(RequestFlags, RootPart.UUID, RootPart.OwnerID, RootPart.GroupID, RootPart.BaseMask, 2817// remoteClient.SendObjectPropertiesFamilyData(RequestFlags, RootPart.UUID, RootPart.OwnerID, RootPart.GroupID, RootPart.BaseMask,
2818// RootPart.OwnerMask, RootPart.GroupMask, RootPart.EveryoneMask, RootPart.NextOwnerMask, 2818// RootPart.OwnerMask, RootPart.GroupMask, RootPart.EveryoneMask, RootPart.NextOwnerMask,
2819// RootPart.OwnershipCost, RootPart.ObjectSaleType, RootPart.SalePrice, RootPart.Category, 2819// RootPart.OwnershipCost, RootPart.ObjectSaleType, RootPart.SalePrice, RootPart.Category,
@@ -2844,7 +2844,7 @@ namespace OpenSim.Region.Framework.Scenes
2844 // return; 2844 // return;
2845 2845
2846 // If we somehow got here to updating the SOG and its root part is not scheduled for update, 2846 // If we somehow got here to updating the SOG and its root part is not scheduled for update,
2847 // check to see if the physical position or rotation warrant an update. 2847 // check to see if the physical position or rotation warrant an update.
2848 if (m_rootPart.UpdateFlag == UpdateRequired.NONE) 2848 if (m_rootPart.UpdateFlag == UpdateRequired.NONE)
2849 { 2849 {
2850 // rootpart SendScheduledUpdates will check if a update is needed 2850 // rootpart SendScheduledUpdates will check if a update is needed
@@ -2885,7 +2885,7 @@ namespace OpenSim.Region.Framework.Scenes
2885 { 2885 {
2886// if (IsAttachment) 2886// if (IsAttachment)
2887// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId); 2887// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId);
2888 2888
2889 checkAtTargets(); 2889 checkAtTargets();
2890 RootPart.ScheduleFullUpdate(); 2890 RootPart.ScheduleFullUpdate();
2891 2891
@@ -2919,11 +2919,11 @@ namespace OpenSim.Region.Framework.Scenes
2919 /// Immediately send a full update for this scene object. 2919 /// Immediately send a full update for this scene object.
2920 /// </summary> 2920 /// </summary>
2921 public void SendGroupFullUpdate() 2921 public void SendGroupFullUpdate()
2922 { 2922 {
2923 if (IsDeleted) 2923 if (IsDeleted)
2924 return; 2924 return;
2925 2925
2926// m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID); 2926// m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID);
2927 2927
2928 if (IsAttachment) 2928 if (IsAttachment)
2929 { 2929 {
@@ -2964,7 +2964,7 @@ namespace OpenSim.Region.Framework.Scenes
2964 { 2964 {
2965 if (m_scene == null) // Need to check here as it's null during object creation 2965 if (m_scene == null) // Need to check here as it's null during object creation
2966 return; 2966 return;
2967 2967
2968 m_scene.SceneGraph.AddToUpdateList(this); 2968 m_scene.SceneGraph.AddToUpdateList(this);
2969 } 2969 }
2970 2970
@@ -3139,7 +3139,7 @@ namespace OpenSim.Region.Framework.Scenes
3139 Vector3 oldGroupPosition = linkPart.GroupPosition; 3139 Vector3 oldGroupPosition = linkPart.GroupPosition;
3140 Quaternion oldRootRotation = linkPart.RotationOffset; 3140 Quaternion oldRootRotation = linkPart.RotationOffset;
3141 3141
3142 // A linked SOP remembers its location and rotation relative to the root of a group. 3142 // A linked SOP remembers its location and rotation relative to the root of a group.
3143 // Convert the root of the group being linked to be relative to the 3143 // Convert the root of the group being linked to be relative to the
3144 // root of the group being linked to. 3144 // root of the group being linked to.
3145 // Note: Some of the assignments have complex side effects. 3145 // Note: Some of the assignments have complex side effects.
@@ -3247,7 +3247,7 @@ namespace OpenSim.Region.Framework.Scenes
3247 objectGroup.IsDeleted = true; 3247 objectGroup.IsDeleted = true;
3248 3248
3249 objectGroup.m_parts.Clear(); 3249 objectGroup.m_parts.Clear();
3250 3250
3251 // Can't do this yet since backup still makes use of the root part without any synchronization 3251 // Can't do this yet since backup still makes use of the root part without any synchronization
3252// objectGroup.m_rootPart = null; 3252// objectGroup.m_rootPart = null;
3253 3253
@@ -3258,8 +3258,8 @@ namespace OpenSim.Region.Framework.Scenes
3258 3258
3259 AttachToBackup(); 3259 AttachToBackup();
3260 3260
3261 // Here's the deal, this is ABSOLUTELY CRITICAL so the physics scene gets the update about the 3261 // Here's the deal, this is ABSOLUTELY CRITICAL so the physics scene gets the update about the
3262 // position of linkset prims. IF YOU CHANGE THIS, YOU MUST TEST colliding with just linked and 3262 // position of linkset prims. IF YOU CHANGE THIS, YOU MUST TEST colliding with just linked and
3263 // unmoved prims! 3263 // unmoved prims!
3264 ResetChildPrimPhysicsPositions(); 3264 ResetChildPrimPhysicsPositions();
3265 3265
@@ -3453,7 +3453,7 @@ namespace OpenSim.Region.Framework.Scenes
3453 lock (m_parts.SyncRoot) 3453 lock (m_parts.SyncRoot)
3454 if(!m_parts.Remove(linkPart.UUID)) 3454 if(!m_parts.Remove(linkPart.UUID))
3455 continue; 3455 continue;
3456 3456
3457 linkPart.ClearUndoState(); 3457 linkPart.ClearUndoState();
3458 3458
3459 Vector3 worldPos = linkPart.GetWorldPosition(); 3459 Vector3 worldPos = linkPart.GetWorldPosition();
@@ -3580,7 +3580,7 @@ namespace OpenSim.Region.Framework.Scenes
3580 part.setOffsetPosition(newPos - AbsolutePosition); 3580 part.setOffsetPosition(newPos - AbsolutePosition);
3581 3581
3582 // (radams1 20120711: I don't know why part.OffsetPosition is set multiple times. 3582 // (radams1 20120711: I don't know why part.OffsetPosition is set multiple times.
3583 // It would have the affect of setting the physics engine position multiple 3583 // It would have the affect of setting the physics engine position multiple
3584 // times. In theory, that is not necessary but I don't have a good linkset 3584 // times. In theory, that is not necessary but I don't have a good linkset
3585 // test to know that cleaning up this code wouldn't break things.) 3585 // test to know that cleaning up this code wouldn't break things.)
3586 3586
@@ -3685,29 +3685,29 @@ namespace OpenSim.Region.Framework.Scenes
3685 /// <param name="remoteClient"></param> 3685 /// <param name="remoteClient"></param>
3686 public void SpinMovement(Quaternion newOrientation, IClientAPI remoteClient) 3686 public void SpinMovement(Quaternion newOrientation, IClientAPI remoteClient)
3687 { 3687 {
3688 // The incoming newOrientation, sent by the client, "seems" to be the 3688 // The incoming newOrientation, sent by the client, "seems" to be the
3689 // desired target orientation. This needs further verification; in particular, 3689 // desired target orientation. This needs further verification; in particular,
3690 // one would expect that the initial incoming newOrientation should be 3690 // one would expect that the initial incoming newOrientation should be
3691 // fairly close to the original prim's physical orientation, 3691 // fairly close to the original prim's physical orientation,
3692 // m_rootPart.PhysActor.Orientation. This however does not seem to be the 3692 // m_rootPart.PhysActor.Orientation. This however does not seem to be the
3693 // case (might just be an issue with different quaternions representing the 3693 // case (might just be an issue with different quaternions representing the
3694 // same rotation, or it might be a coordinate system issue). 3694 // same rotation, or it might be a coordinate system issue).
3695 // 3695 //
3696 // Since it's not clear what the relationship is between the PhysActor.Orientation 3696 // Since it's not clear what the relationship is between the PhysActor.Orientation
3697 // and the incoming orientations sent by the client, we take an alternative approach 3697 // and the incoming orientations sent by the client, we take an alternative approach
3698 // of calculating the delta rotation between the orientations being sent by the 3698 // of calculating the delta rotation between the orientations being sent by the
3699 // client. (Since a spin is invoked by ctrl+shift+drag in the client, we expect 3699 // client. (Since a spin is invoked by ctrl+shift+drag in the client, we expect
3700 // a steady stream of several new orientations coming in from the client.) 3700 // a steady stream of several new orientations coming in from the client.)
3701 // This ensures that the delta rotations are being calculated from self-consistent 3701 // This ensures that the delta rotations are being calculated from self-consistent
3702 // pairs of old/new rotations. Given the delta rotation, we apply a torque around 3702 // pairs of old/new rotations. Given the delta rotation, we apply a torque around
3703 // the delta rotation axis, scaled by the object mass times an arbitrary scaling 3703 // the delta rotation axis, scaled by the object mass times an arbitrary scaling
3704 // factor (to ensure the resulting torque is not "too strong" or "too weak"). 3704 // factor (to ensure the resulting torque is not "too strong" or "too weak").
3705 // 3705 //
3706 // Ideally we need to calculate (probably iteratively) the exact torque or series 3706 // Ideally we need to calculate (probably iteratively) the exact torque or series
3707 // of torques needed to arrive exactly at the destination orientation. However, since 3707 // of torques needed to arrive exactly at the destination orientation. However, since
3708 // it is not yet clear how to map the destination orientation (provided by the viewer) 3708 // it is not yet clear how to map the destination orientation (provided by the viewer)
3709 // into PhysActor orientations (needed by the physics engine), we omit this step. 3709 // into PhysActor orientations (needed by the physics engine), we omit this step.
3710 // This means that the resulting torque will at least be in the correct direction, 3710 // This means that the resulting torque will at least be in the correct direction,
3711 // but it will result in over-shoot or under-shoot of the target orientation. 3711 // but it will result in over-shoot or under-shoot of the target orientation.
3712 // For the end user, this means that ctrl+shift+drag can be used for relative, 3712 // For the end user, this means that ctrl+shift+drag can be used for relative,
3713 // but not absolute, adjustments of orientation for physical prims. 3713 // but not absolute, adjustments of orientation for physical prims.
@@ -3750,7 +3750,7 @@ namespace OpenSim.Region.Framework.Scenes
3750 if(rotationAngle > 0) 3750 if(rotationAngle > 0)
3751 spinforce = spinforce * pa.Mass * 0.1f; // 0.1 is an arbitrary torque scaling factor 3751 spinforce = spinforce * pa.Mass * 0.1f; // 0.1 is an arbitrary torque scaling factor
3752 else 3752 else
3753 spinforce = spinforce * pa.Mass * -0.1f; // 0.1 is an arbitrary torque scaling 3753 spinforce = spinforce * pa.Mass * -0.1f; // 0.1 is an arbitrary torque scaling
3754 pa.AddAngularForce(spinforce,true); 3754 pa.AddAngularForce(spinforce,true);
3755 m_scene.PhysicsScene.AddPhysicsActorTaint(pa); 3755 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
3756 } 3756 }
@@ -3870,8 +3870,8 @@ namespace OpenSim.Region.Framework.Scenes
3870 if (selectionPart != null) 3870 if (selectionPart != null)
3871 { 3871 {
3872 SceneObjectPart[] parts = m_parts.GetArray(); 3872 SceneObjectPart[] parts = m_parts.GetArray();
3873 3873
3874 if (Scene != null && UsePhysics) 3874 if (Scene != null && UsePhysics)
3875 { 3875 {
3876 int maxprims = m_scene.m_linksetPhysCapacity; 3876 int maxprims = m_scene.m_linksetPhysCapacity;
3877 bool checkShape = (maxprims > 0 && 3877 bool checkShape = (maxprims > 0 &&
@@ -3975,7 +3975,7 @@ namespace OpenSim.Region.Framework.Scenes
3975 RootPart.OwnerMask = (RootPart.OwnerMask & lockBit) | ((newOwnerMask | foldedPerms) & lockMask); 3975 RootPart.OwnerMask = (RootPart.OwnerMask & lockBit) | ((newOwnerMask | foldedPerms) & lockMask);
3976 3976
3977// m_log.DebugFormat( 3977// m_log.DebugFormat(
3978// "[SCENE OBJECT GROUP]: RootPart.OwnerMask now {0} for {1} in {2}", 3978// "[SCENE OBJECT GROUP]: RootPart.OwnerMask now {0} for {1} in {2}",
3979// (OpenMetaverse.PermissionMask)RootPart.OwnerMask, Name, Scene.Name); 3979// (OpenMetaverse.PermissionMask)RootPart.OwnerMask, Name, Scene.Name);
3980 3980
3981 RootPart.ScheduleFullUpdate(); 3981 RootPart.ScheduleFullUpdate();
@@ -4273,7 +4273,7 @@ namespace OpenSim.Region.Framework.Scenes
4273 { 4273 {
4274 if (Scene == null || IsDeleted || inTransit) 4274 if (Scene == null || IsDeleted || inTransit)
4275 return 1.0f; 4275 return 1.0f;
4276 4276
4277 float maxsize = Scene.m_maxNonphys; 4277 float maxsize = Scene.m_maxNonphys;
4278 PhysicsActor pa = m_rootPart.PhysActor; 4278 PhysicsActor pa = m_rootPart.PhysActor;
4279 // assuming physics is more restrictive 4279 // assuming physics is more restrictive
@@ -4282,7 +4282,7 @@ namespace OpenSim.Region.Framework.Scenes
4282 4282
4283 SceneObjectPart[] parts = m_parts.GetArray(); 4283 SceneObjectPart[] parts = m_parts.GetArray();
4284 float larger = float.MinValue; 4284 float larger = float.MinValue;
4285 4285
4286 for(int i = 0; i < parts.Length; i++) 4286 for(int i = 0; i < parts.Length; i++)
4287 { 4287 {
4288 SceneObjectPart obPart = parts[i]; 4288 SceneObjectPart obPart = parts[i];
@@ -4310,7 +4310,7 @@ namespace OpenSim.Region.Framework.Scenes
4310 { 4310 {
4311 if (Scene == null || IsDeleted || inTransit) 4311 if (Scene == null || IsDeleted || inTransit)
4312 return 1.0f; 4312 return 1.0f;
4313 4313
4314 float minsize = Scene.m_minNonphys; 4314 float minsize = Scene.m_minNonphys;
4315 PhysicsActor pa = m_rootPart.PhysActor; 4315 PhysicsActor pa = m_rootPart.PhysActor;
4316 // assuming physics is more restrictive 4316 // assuming physics is more restrictive
@@ -4319,7 +4319,7 @@ namespace OpenSim.Region.Framework.Scenes
4319 4319
4320 SceneObjectPart[] parts = m_parts.GetArray(); 4320 SceneObjectPart[] parts = m_parts.GetArray();
4321 float smaller = float.MaxValue; 4321 float smaller = float.MaxValue;
4322 4322
4323 for(int i = 0; i < parts.Length; i++) 4323 for(int i = 0; i < parts.Length; i++)
4324 { 4324 {
4325 SceneObjectPart obPart = parts[i]; 4325 SceneObjectPart obPart = parts[i];
@@ -4388,7 +4388,7 @@ namespace OpenSim.Region.Framework.Scenes
4388 /// </summary> 4388 /// </summary>
4389 /// <param name="pos"></param> 4389 /// <param name="pos"></param>
4390 /// <param name="localID"></param> 4390 /// <param name="localID"></param>
4391 /// 4391 ///
4392 4392
4393 public void UpdateSinglePosition(Vector3 pos, uint localID) 4393 public void UpdateSinglePosition(Vector3 pos, uint localID)
4394 { 4394 {
@@ -4443,7 +4443,7 @@ namespace OpenSim.Region.Framework.Scenes
4443 } 4443 }
4444 4444
4445 AbsolutePosition = newPos; 4445 AbsolutePosition = newPos;
4446 4446
4447 if (IsAttachment) 4447 if (IsAttachment)
4448 m_rootPart.AttachedPos = newPos; 4448 m_rootPart.AttachedPos = newPos;
4449 4449
@@ -4469,7 +4469,7 @@ namespace OpenSim.Region.Framework.Scenes
4469 public void UpdateGroupRotationR(Quaternion rot) 4469 public void UpdateGroupRotationR(Quaternion rot)
4470 { 4470 {
4471 m_rootPart.UpdateRotation(rot); 4471 m_rootPart.UpdateRotation(rot);
4472 4472
4473/* this is done by rootpart RotationOffset set called by UpdateRotation 4473/* this is done by rootpart RotationOffset set called by UpdateRotation
4474 PhysicsActor actor = m_rootPart.PhysActor; 4474 PhysicsActor actor = m_rootPart.PhysActor;
4475 if (actor != null) 4475 if (actor != null)
@@ -4747,7 +4747,7 @@ namespace OpenSim.Region.Framework.Scenes
4747 if (setX || setY || setZ) 4747 if (setX || setY || setZ)
4748 { 4748 {
4749 bool lockaxis = (rotate10 == 0); // zero means axis locked 4749 bool lockaxis = (rotate10 == 0); // zero means axis locked
4750 4750
4751 byte locks = RootPart.RotationAxisLocks; 4751 byte locks = RootPart.RotationAxisLocks;
4752 4752
4753 if (setX) 4753 if (setX)
@@ -4757,7 +4757,7 @@ namespace OpenSim.Region.Framework.Scenes
4757 else 4757 else
4758 locks &= (byte)SceneObjectGroup.axisSelect.NOT_STATUS_ROTATE_X; 4758 locks &= (byte)SceneObjectGroup.axisSelect.NOT_STATUS_ROTATE_X;
4759 } 4759 }
4760 4760
4761 if (setY) 4761 if (setY)
4762 { 4762 {
4763 if(lockaxis) 4763 if(lockaxis)
@@ -4791,7 +4791,7 @@ namespace OpenSim.Region.Framework.Scenes
4791 if (axis == (int)SceneObjectGroup.axisSelect.STATUS_ROTATE_X) 4791 if (axis == (int)SceneObjectGroup.axisSelect.STATUS_ROTATE_X)
4792 return (rotAxislocks & (byte)SceneObjectGroup.axisSelect.STATUS_ROTATE_X) == 0 ? 1:0; 4792 return (rotAxislocks & (byte)SceneObjectGroup.axisSelect.STATUS_ROTATE_X) == 0 ? 1:0;
4793 4793
4794 return 0; 4794 return 0;
4795 } 4795 }
4796 4796
4797 public int registerRotTargetWaypoint(Quaternion target, float tolerance) 4797 public int registerRotTargetWaypoint(Quaternion target, float tolerance)
@@ -4837,7 +4837,7 @@ namespace OpenSim.Region.Framework.Scenes
4837 m_scene.AddGroupTarget(this); 4837 m_scene.AddGroupTarget(this);
4838 return (int)handle; 4838 return (int)handle;
4839 } 4839 }
4840 4840
4841 public void unregisterTargetWaypoint(int handle) 4841 public void unregisterTargetWaypoint(int handle)
4842 { 4842 {
4843 lock (m_targets) 4843 lock (m_targets)
@@ -4879,14 +4879,14 @@ namespace OpenSim.Region.Framework.Scenes
4879 } 4879 }
4880 } 4880 }
4881 } 4881 }
4882 4882
4883 if (atTargets.Count > 0) 4883 if (atTargets.Count > 0)
4884 { 4884 {
4885 SceneObjectPart[] parts = m_parts.GetArray(); 4885 SceneObjectPart[] parts = m_parts.GetArray();
4886 uint[] localids = new uint[parts.Length]; 4886 uint[] localids = new uint[parts.Length];
4887 for (int i = 0; i < parts.Length; i++) 4887 for (int i = 0; i < parts.Length; i++)
4888 localids[i] = parts[i].LocalId; 4888 localids[i] = parts[i].LocalId;
4889 4889
4890 for (int ctr = 0; ctr < localids.Length; ctr++) 4890 for (int ctr = 0; ctr < localids.Length; ctr++)
4891 { 4891 {
4892 foreach (uint target in atTargets.Keys) 4892 foreach (uint target in atTargets.Keys)
@@ -4896,10 +4896,10 @@ namespace OpenSim.Region.Framework.Scenes
4896 localids[ctr], att.handle, att.targetPos, m_rootPart.GroupPosition); 4896 localids[ctr], att.handle, att.targetPos, m_rootPart.GroupPosition);
4897 } 4897 }
4898 } 4898 }
4899 4899
4900 return; 4900 return;
4901 } 4901 }
4902 4902
4903 if (m_scriptListens_notAtTarget && !at_target) 4903 if (m_scriptListens_notAtTarget && !at_target)
4904 { 4904 {
4905 //trigger not_at_target 4905 //trigger not_at_target
@@ -4907,7 +4907,7 @@ namespace OpenSim.Region.Framework.Scenes
4907 uint[] localids = new uint[parts.Length]; 4907 uint[] localids = new uint[parts.Length];
4908 for (int i = 0; i < parts.Length; i++) 4908 for (int i = 0; i < parts.Length; i++)
4909 localids[i] = parts[i].LocalId; 4909 localids[i] = parts[i].LocalId;
4910 4910
4911 for (int ctr = 0; ctr < localids.Length; ctr++) 4911 for (int ctr = 0; ctr < localids.Length; ctr++)
4912 { 4912 {
4913 m_scene.EventManager.TriggerNotAtTargetEvent(localids[ctr]); 4913 m_scene.EventManager.TriggerNotAtTargetEvent(localids[ctr]);
@@ -4994,7 +4994,7 @@ namespace OpenSim.Region.Framework.Scenes
4994 // http://wiki.secondlife.com/wiki/llGetGeometricCenter 4994 // http://wiki.secondlife.com/wiki/llGetGeometricCenter
4995 // ignoring tortured prims details since sl also seems to ignore 4995 // ignoring tortured prims details since sl also seems to ignore
4996 // so no real use in doing it on physics 4996 // so no real use in doing it on physics
4997 4997
4998 Vector3 gc = Vector3.Zero; 4998 Vector3 gc = Vector3.Zero;
4999 4999
5000 SceneObjectPart[] parts = m_parts.GetArray(); 5000 SceneObjectPart[] parts = m_parts.GetArray();
@@ -5034,7 +5034,7 @@ namespace OpenSim.Region.Framework.Scenes
5034 Vector3 tmp = pa.CenterOfMass; 5034 Vector3 tmp = pa.CenterOfMass;
5035 return tmp; 5035 return tmp;
5036 } 5036 }
5037 5037
5038 Vector3 Ptot = Vector3.Zero; 5038 Vector3 Ptot = Vector3.Zero;
5039 float totmass = 0f; 5039 float totmass = 0f;
5040 float m; 5040 float m;
@@ -5072,7 +5072,7 @@ namespace OpenSim.Region.Framework.Scenes
5072 } 5072 }
5073 5073
5074 HasGroupChanged = true; 5074 HasGroupChanged = true;
5075 5075
5076 // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled 5076 // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled
5077 // for the same object with very different properties. The caller must schedule the update. 5077 // for the same object with very different properties. The caller must schedule the update.
5078 //ScheduleGroupForFullUpdate(); 5078 //ScheduleGroupForFullUpdate();