aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
diff options
context:
space:
mode:
authorMW2007-08-21 16:25:57 +0000
committerMW2007-08-21 16:25:57 +0000
commitb7134c834c9e44802debc10671acbece1e94aa95 (patch)
treef3989ef8f89c70f39a40961c94651b9d446e54f3 /OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
parentCan now turn on/off server side permission checking (on prim editing etc) fro... (diff)
downloadopensim-SC_OLD-b7134c834c9e44802debc10671acbece1e94aa95.zip
opensim-SC_OLD-b7134c834c9e44802debc10671acbece1e94aa95.tar.gz
opensim-SC_OLD-b7134c834c9e44802debc10671acbece1e94aa95.tar.bz2
opensim-SC_OLD-b7134c834c9e44802debc10671acbece1e94aa95.tar.xz
Shift and Drag copying should now work correctly. [This was one of those stupid little one line bugs that was so much fun to track down that I decided to spend a few hours on it)
Linking groups should now work better than it did, but still a bit of work to do on getting the rotations of all the parts after linking right. Added part of dalien's #301 patch (xml loading/saving related parts with some small changes)
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs')
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs50
1 files changed, 44 insertions, 6 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 33f41e9..cd38b23 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -251,11 +251,11 @@ namespace OpenSim.Region.Environment.Scenes
251 public new SceneObjectGroup Copy() 251 public new SceneObjectGroup Copy()
252 { 252 {
253 SceneObjectGroup dupe = (SceneObjectGroup)this.MemberwiseClone(); 253 SceneObjectGroup dupe = (SceneObjectGroup)this.MemberwiseClone();
254 dupe.m_parts = new Dictionary<LLUUID, SceneObjectPart>();
254 dupe.m_parts.Clear(); 255 dupe.m_parts.Clear();
255 dupe.AbsolutePosition = new LLVector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z); 256 dupe.AbsolutePosition = new LLVector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
256 dupe.m_scene = m_scene; 257 dupe.m_scene = m_scene;
257 dupe.m_regionHandle = this.m_regionHandle; 258 dupe.m_regionHandle = this.m_regionHandle;
258
259 dupe.CopyRootPart(this.m_rootPart); 259 dupe.CopyRootPart(this.m_rootPart);
260 260
261 List<SceneObjectPart> partList = new List<SceneObjectPart>(this.m_parts.Values); 261 List<SceneObjectPart> partList = new List<SceneObjectPart>(this.m_parts.Values);
@@ -291,6 +291,7 @@ namespace OpenSim.Region.Environment.Scenes
291 public void CopyPart(SceneObjectPart part) 291 public void CopyPart(SceneObjectPart part)
292 { 292 {
293 SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate()); 293 SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate());
294 newPart.SetParent(this);
294 this.m_parts.Add(newPart.UUID, newPart); 295 this.m_parts.Add(newPart.UUID, newPart);
295 this.SetPartAsNonRoot(newPart); 296 this.SetPartAsNonRoot(newPart);
296 } 297 }
@@ -431,6 +432,9 @@ namespace OpenSim.Region.Environment.Scenes
431 public void LinkToGroup(SceneObjectGroup objectGroup) 432 public void LinkToGroup(SceneObjectGroup objectGroup)
432 { 433 {
433 SceneObjectPart linkPart = objectGroup.m_rootPart; 434 SceneObjectPart linkPart = objectGroup.m_rootPart;
435 Axiom.Math.Vector3 oldGroupPosition = new Vector3(linkPart.GroupPosition.X, linkPart.GroupPosition.Y, linkPart.GroupPosition.Z);
436 Axiom.Math.Quaternion oldRootRotation = new Quaternion(linkPart.RotationOffset.W, linkPart.RotationOffset.X, linkPart.RotationOffset.Y, linkPart.RotationOffset.Z);
437
434 linkPart.OffsetPosition = linkPart.GroupPosition - this.AbsolutePosition; 438 linkPart.OffsetPosition = linkPart.GroupPosition - this.AbsolutePosition;
435 linkPart.GroupPosition = this.AbsolutePosition; 439 linkPart.GroupPosition = this.AbsolutePosition;
436 440
@@ -450,20 +454,39 @@ namespace OpenSim.Region.Environment.Scenes
450 { 454 {
451 if (part.UUID != objectGroup.m_rootPart.UUID) 455 if (part.UUID != objectGroup.m_rootPart.UUID)
452 { 456 {
453 this.LinkNonRootPart(part); 457 this.LinkNonRootPart(part, oldGroupPosition, oldRootRotation);
454 } 458 }
455 } 459 }
456 460
457 m_scene.EventManager.OnBackup -= objectGroup.ProcessBackup; 461 m_scene.EventManager.OnBackup -= objectGroup.ProcessBackup;
458 m_scene.DeleteEntity(objectGroup.UUID); 462 m_scene.DeleteEntity(objectGroup.UUID);
463 objectGroup.DeleteParts();
459 this.ScheduleGroupForFullUpdate(); 464 this.ScheduleGroupForFullUpdate();
460 } 465 }
461 466
462 private void LinkNonRootPart(SceneObjectPart part) 467 private void LinkNonRootPart(SceneObjectPart part, Vector3 oldGroupPosition, Quaternion oldGroupRotation)
463 { 468 {
464 part.SetParent(this); 469 part.SetParent(this);
465 part.ParentID = this.m_rootPart.LocalID; 470 part.ParentID = this.m_rootPart.LocalID;
466 this.m_parts.Add(part.UUID, part); 471 this.m_parts.Add(part.UUID, part);
472
473 Vector3 axiomOldPos = new Vector3(part.OffsetPosition.X, part.OffsetPosition.Y, part.OffsetPosition.Z);
474 axiomOldPos = oldGroupRotation * axiomOldPos;
475 axiomOldPos += oldGroupPosition;
476 LLVector3 oldAbsolutePosition = new LLVector3(axiomOldPos.x, axiomOldPos.y, axiomOldPos.z);
477 part.OffsetPosition = oldAbsolutePosition - this.AbsolutePosition;
478
479 Quaternion axiomRootRotation = new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y, m_rootPart.RotationOffset.Z);
480
481 Vector3 axiomPos = new Vector3(part.OffsetPosition.X, part.OffsetPosition.Y, part.OffsetPosition.Z);
482 axiomPos = axiomRootRotation.Inverse() * axiomPos;
483 part.OffsetPosition = new LLVector3(axiomPos.x, axiomPos.y, axiomPos.z);
484
485 Quaternion axiomPartRotation = new Quaternion(part.RotationOffset.W, part.RotationOffset.X, part.RotationOffset.Y, part.RotationOffset.Z);
486
487 axiomPartRotation = oldGroupRotation * axiomPartRotation;
488 axiomPartRotation = axiomRootRotation.Inverse() * axiomPartRotation;
489 part.RotationOffset = new LLQuaternion(axiomPartRotation.x, axiomPartRotation.y, axiomPartRotation.z, axiomPartRotation.w);
467 } 490 }
468 491
469 /// <summary> 492 /// <summary>
@@ -669,7 +692,7 @@ namespace OpenSim.Region.Environment.Scenes
669 public void UpdateGroupPosition(LLVector3 pos) 692 public void UpdateGroupPosition(LLVector3 pos)
670 { 693 {
671 this.AbsolutePosition = pos; 694 this.AbsolutePosition = pos;
672 695 this.ScheduleGroupForTerseUpdate();
673 } 696 }
674 697
675 /// <summary> 698 /// <summary>
@@ -720,6 +743,7 @@ namespace OpenSim.Region.Environment.Scenes
720 pos.X = newPos.X; 743 pos.X = newPos.X;
721 pos.Y = newPos.Y; 744 pos.Y = newPos.Y;
722 pos.Z = newPos.Z; 745 pos.Z = newPos.Z;
746 this.ScheduleGroupForTerseUpdate();
723 } 747 }
724 #endregion 748 #endregion
725 749
@@ -859,7 +883,7 @@ namespace OpenSim.Region.Environment.Scenes
859 /// <param name="part"></param> 883 /// <param name="part"></param>
860 internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part) 884 internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part)
861 { 885 {
862 if (m_rootPart == part) 886 if (m_rootPart.UUID == part.UUID)
863 { 887 {
864 part.SendFullUpdateToClient(remoteClient, AbsolutePosition); 888 part.SendFullUpdateToClient(remoteClient, AbsolutePosition);
865 } 889 }
@@ -876,7 +900,7 @@ namespace OpenSim.Region.Environment.Scenes
876 /// <param name="part"></param> 900 /// <param name="part"></param>
877 internal void SendPartTerseUpdate(IClientAPI remoteClient, SceneObjectPart part) 901 internal void SendPartTerseUpdate(IClientAPI remoteClient, SceneObjectPart part)
878 { 902 {
879 if (m_rootPart == part) 903 if (m_rootPart.UUID == part.UUID)
880 { 904 {
881 part.SendTerseUpdateToClient(remoteClient, AbsolutePosition); 905 part.SendTerseUpdateToClient(remoteClient, AbsolutePosition);
882 } 906 }
@@ -932,6 +956,14 @@ namespace OpenSim.Region.Environment.Scenes
932 } 956 }
933 } 957 }
934 958
959 public void RegenerateFullIDs()
960 {
961 foreach (SceneObjectPart part in this.m_parts.Values)
962 {
963 part.UUID = LLUUID.Random();
964 }
965 }
966
935 public LLUUID GetPartsFullID(uint localID) 967 public LLUUID GetPartsFullID(uint localID)
936 { 968 {
937 SceneObjectPart part = this.GetChildPrim(localID); 969 SceneObjectPart part = this.GetChildPrim(localID);
@@ -984,6 +1016,12 @@ namespace OpenSim.Region.Environment.Scenes
984 } 1016 }
985 } 1017 }
986 1018
1019 public void DeleteParts()
1020 {
1021 this.m_rootPart = null;
1022 this.m_parts.Clear();
1023 }
1024
987 public override void SetText(string text, Vector3 color, double alpha) 1025 public override void SetText(string text, Vector3 color, double alpha)
988 { 1026 {
989 Text = text; 1027 Text = text;