aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs21
1 files changed, 16 insertions, 5 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 117bcbc..aa2f2d0 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -868,12 +868,13 @@ namespace OpenSim.Region.Environment.Scenes
868 #region Packet Handlers 868 #region Packet Handlers
869 869
870 /// <summary> 870 /// <summary>
871 /// 871 /// Link the prims in a given group to this group
872 /// </summary> 872 /// </summary>
873 /// <param name="objectGroup"></param> 873 /// <param name="objectGroup">The group of prims which should be linked to this group</param>
874 public void LinkToGroup(SceneObjectGroup objectGroup) 874 public void LinkToGroup(SceneObjectGroup objectGroup)
875 { 875 {
876 SceneObjectPart linkPart = objectGroup.m_rootPart; 876 SceneObjectPart linkPart = objectGroup.m_rootPart;
877
877 Vector3 oldGroupPosition = 878 Vector3 oldGroupPosition =
878 new Vector3(linkPart.GroupPosition.X, linkPart.GroupPosition.Y, linkPart.GroupPosition.Z); 879 new Vector3(linkPart.GroupPosition.X, linkPart.GroupPosition.Y, linkPart.GroupPosition.Z);
879 Quaternion oldRootRotation = 880 Quaternion oldRootRotation =
@@ -882,20 +883,23 @@ namespace OpenSim.Region.Environment.Scenes
882 883
883 linkPart.OffsetPosition = linkPart.GroupPosition - AbsolutePosition; 884 linkPart.OffsetPosition = linkPart.GroupPosition - AbsolutePosition;
884 linkPart.GroupPosition = AbsolutePosition; 885 linkPart.GroupPosition = AbsolutePosition;
885
886 Vector3 axPos = new Vector3(linkPart.OffsetPosition.X, linkPart.OffsetPosition.Y, linkPart.OffsetPosition.Z); 886 Vector3 axPos = new Vector3(linkPart.OffsetPosition.X, linkPart.OffsetPosition.Y, linkPart.OffsetPosition.Z);
887
887 Quaternion parentRot = 888 Quaternion parentRot =
888 new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y, 889 new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y,
889 m_rootPart.RotationOffset.Z); 890 m_rootPart.RotationOffset.Z);
890 axPos = parentRot.Inverse()*axPos; 891 axPos = parentRot.Inverse()*axPos;
892
891 linkPart.OffsetPosition = new LLVector3(axPos.x, axPos.y, axPos.z); 893 linkPart.OffsetPosition = new LLVector3(axPos.x, axPos.y, axPos.z);
892 Quaternion oldRot = 894 Quaternion oldRot =
893 new Quaternion(linkPart.RotationOffset.W, linkPart.RotationOffset.X, linkPart.RotationOffset.Y, 895 new Quaternion(linkPart.RotationOffset.W, linkPart.RotationOffset.X, linkPart.RotationOffset.Y,
894 linkPart.RotationOffset.Z); 896 linkPart.RotationOffset.Z);
895 Quaternion newRot = parentRot.Inverse()*oldRot; 897 Quaternion newRot = parentRot.Inverse()*oldRot;
896 linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w); 898 linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w);
899
897 linkPart.ParentID = m_rootPart.LocalID; 900 linkPart.ParentID = m_rootPart.LocalID;
898 linkPart.LinkNum = m_parts.Count; 901 linkPart.LinkNum = m_parts.Count;
902
899 m_parts.Add(linkPart.UUID, linkPart); 903 m_parts.Add(linkPart.UUID, linkPart);
900 linkPart.SetParent(this); 904 linkPart.SetParent(this);
901 905
@@ -935,7 +939,8 @@ namespace OpenSim.Region.Environment.Scenes
935 939
936 if (null != linkPart) 940 if (null != linkPart)
937 { 941 {
938 942 LLQuaternion worldRot = linkPart.GetWorldRotation();
943
939 // Remove the part from this object 944 // Remove the part from this object
940 m_parts.Remove(linkPart.UUID); 945 m_parts.Remove(linkPart.UUID);
941 linkPart.ParentID = 0; 946 linkPart.ParentID = 0;
@@ -944,8 +949,9 @@ namespace OpenSim.Region.Environment.Scenes
944 { 949 {
945 m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor); 950 m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor);
946 } 951 }
952
947 // We need to reset the child part's position 953 // We need to reset the child part's position
948 // ready for life as a separate object after being a part of another object 954 // ready for life as a separate object after being a part of another object
949 Quaternion parentRot 955 Quaternion parentRot
950 = new Quaternion( 956 = new Quaternion(
951 m_rootPart.RotationOffset.W, 957 m_rootPart.RotationOffset.W,
@@ -964,6 +970,10 @@ namespace OpenSim.Region.Environment.Scenes
964 linkPart.GroupPosition = AbsolutePosition + linkPart.OffsetPosition; 970 linkPart.GroupPosition = AbsolutePosition + linkPart.OffsetPosition;
965 linkPart.OffsetPosition = new LLVector3(0, 0, 0); 971 linkPart.OffsetPosition = new LLVector3(0, 0, 0);
966 972
973 linkPart.RotationOffset = worldRot;
974
975 // This chunk is probably unnecesary now - delete later on
976 /*
967 Quaternion oldRot 977 Quaternion oldRot
968 = new Quaternion( 978 = new Quaternion(
969 linkPart.RotationOffset.W, 979 linkPart.RotationOffset.W,
@@ -972,6 +982,7 @@ namespace OpenSim.Region.Environment.Scenes
972 linkPart.RotationOffset.Z); 982 linkPart.RotationOffset.Z);
973 Quaternion newRot = parentRot*oldRot; 983 Quaternion newRot = parentRot*oldRot;
974 linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w); 984 linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w);
985 */
975 986
976 // Add physics information back to delinked part if appropriate 987 // Add physics information back to delinked part if appropriate
977 // XXX This is messy and should be refactorable with the similar section in 988 // XXX This is messy and should be refactorable with the similar section in