* Make code fix to address prim rotation unlink issues (mantis 383, 454. 369)
* Many thanks to alex_carnell for the necessary information for thisThreadPoolClientBranch
parent
49a5a00b80
commit
3624efde85
|
@ -868,12 +868,13 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
#region Packet Handlers
|
#region Packet Handlers
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Link the prims in a given group to this group
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="objectGroup"></param>
|
/// <param name="objectGroup">The group of prims which should be linked to this group</param>
|
||||||
public void LinkToGroup(SceneObjectGroup objectGroup)
|
public void LinkToGroup(SceneObjectGroup objectGroup)
|
||||||
{
|
{
|
||||||
SceneObjectPart linkPart = objectGroup.m_rootPart;
|
SceneObjectPart linkPart = objectGroup.m_rootPart;
|
||||||
|
|
||||||
Vector3 oldGroupPosition =
|
Vector3 oldGroupPosition =
|
||||||
new Vector3(linkPart.GroupPosition.X, linkPart.GroupPosition.Y, linkPart.GroupPosition.Z);
|
new Vector3(linkPart.GroupPosition.X, linkPart.GroupPosition.Y, linkPart.GroupPosition.Z);
|
||||||
Quaternion oldRootRotation =
|
Quaternion oldRootRotation =
|
||||||
|
@ -882,20 +883,23 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
linkPart.OffsetPosition = linkPart.GroupPosition - AbsolutePosition;
|
linkPart.OffsetPosition = linkPart.GroupPosition - AbsolutePosition;
|
||||||
linkPart.GroupPosition = AbsolutePosition;
|
linkPart.GroupPosition = AbsolutePosition;
|
||||||
|
|
||||||
Vector3 axPos = new Vector3(linkPart.OffsetPosition.X, linkPart.OffsetPosition.Y, linkPart.OffsetPosition.Z);
|
Vector3 axPos = new Vector3(linkPart.OffsetPosition.X, linkPart.OffsetPosition.Y, linkPart.OffsetPosition.Z);
|
||||||
|
|
||||||
Quaternion parentRot =
|
Quaternion parentRot =
|
||||||
new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y,
|
new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y,
|
||||||
m_rootPart.RotationOffset.Z);
|
m_rootPart.RotationOffset.Z);
|
||||||
axPos = parentRot.Inverse()*axPos;
|
axPos = parentRot.Inverse()*axPos;
|
||||||
|
|
||||||
linkPart.OffsetPosition = new LLVector3(axPos.x, axPos.y, axPos.z);
|
linkPart.OffsetPosition = new LLVector3(axPos.x, axPos.y, axPos.z);
|
||||||
Quaternion oldRot =
|
Quaternion oldRot =
|
||||||
new Quaternion(linkPart.RotationOffset.W, linkPart.RotationOffset.X, linkPart.RotationOffset.Y,
|
new Quaternion(linkPart.RotationOffset.W, linkPart.RotationOffset.X, linkPart.RotationOffset.Y,
|
||||||
linkPart.RotationOffset.Z);
|
linkPart.RotationOffset.Z);
|
||||||
Quaternion newRot = parentRot.Inverse()*oldRot;
|
Quaternion newRot = parentRot.Inverse()*oldRot;
|
||||||
linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w);
|
linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w);
|
||||||
|
|
||||||
linkPart.ParentID = m_rootPart.LocalID;
|
linkPart.ParentID = m_rootPart.LocalID;
|
||||||
linkPart.LinkNum = m_parts.Count;
|
linkPart.LinkNum = m_parts.Count;
|
||||||
|
|
||||||
m_parts.Add(linkPart.UUID, linkPart);
|
m_parts.Add(linkPart.UUID, linkPart);
|
||||||
linkPart.SetParent(this);
|
linkPart.SetParent(this);
|
||||||
|
|
||||||
|
@ -935,7 +939,8 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
if (null != linkPart)
|
if (null != linkPart)
|
||||||
{
|
{
|
||||||
|
LLQuaternion worldRot = linkPart.GetWorldRotation();
|
||||||
|
|
||||||
// Remove the part from this object
|
// Remove the part from this object
|
||||||
m_parts.Remove(linkPart.UUID);
|
m_parts.Remove(linkPart.UUID);
|
||||||
linkPart.ParentID = 0;
|
linkPart.ParentID = 0;
|
||||||
|
@ -944,8 +949,9 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor);
|
m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We need to reset the child part's position
|
// We need to reset the child part's position
|
||||||
// ready for life as a separate object after being a part of another object
|
// ready for life as a separate object after being a part of another object
|
||||||
Quaternion parentRot
|
Quaternion parentRot
|
||||||
= new Quaternion(
|
= new Quaternion(
|
||||||
m_rootPart.RotationOffset.W,
|
m_rootPart.RotationOffset.W,
|
||||||
|
@ -964,6 +970,10 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
linkPart.GroupPosition = AbsolutePosition + linkPart.OffsetPosition;
|
linkPart.GroupPosition = AbsolutePosition + linkPart.OffsetPosition;
|
||||||
linkPart.OffsetPosition = new LLVector3(0, 0, 0);
|
linkPart.OffsetPosition = new LLVector3(0, 0, 0);
|
||||||
|
|
||||||
|
linkPart.RotationOffset = worldRot;
|
||||||
|
|
||||||
|
// This chunk is probably unnecesary now - delete later on
|
||||||
|
/*
|
||||||
Quaternion oldRot
|
Quaternion oldRot
|
||||||
= new Quaternion(
|
= new Quaternion(
|
||||||
linkPart.RotationOffset.W,
|
linkPart.RotationOffset.W,
|
||||||
|
@ -972,6 +982,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
linkPart.RotationOffset.Z);
|
linkPart.RotationOffset.Z);
|
||||||
Quaternion newRot = parentRot*oldRot;
|
Quaternion newRot = parentRot*oldRot;
|
||||||
linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w);
|
linkPart.RotationOffset = new LLQuaternion(newRot.x, newRot.y, newRot.z, newRot.w);
|
||||||
|
*/
|
||||||
|
|
||||||
// Add physics information back to delinked part if appropriate
|
// Add physics information back to delinked part if appropriate
|
||||||
// XXX This is messy and should be refactorable with the similar section in
|
// XXX This is messy and should be refactorable with the similar section in
|
||||||
|
|
Loading…
Reference in New Issue