public void UpdateRootPosition(Vector3 pos)
{
foreach (SceneObjectPart part in ChildrenList)
{
part.StoreUndoState();
}
Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
Vector3 oldPos =
IsAttachment
? new Vector3(m_rootPart.OffsetPosition.X, m_rootPart.OffsetPosition.Y,
m_rootPart.OffsetPosition.Z)
: new Vector3(AbsolutePosition.X + m_rootPart.OffsetPosition.X,
AbsolutePosition.Y + m_rootPart.OffsetPosition.Y,
AbsolutePosition.Z + m_rootPart.OffsetPosition.Z);
Vector3 diff = oldPos - newPos;
Vector3 axDiff = new Vector3(diff.X, diff.Y, diff.Z);
Quaternion partRotation = m_rootPart.GetRotationOffset();
axDiff *= Quaternion.Inverse(partRotation);
diff = axDiff;
if (IsAttachment)
{
m_rootPart.FixOffsetPosition((newPos), false);
foreach (SceneObjectPart obPart in m_partsList)
{
if (obPart.UUID != m_rootPart.UUID)
{
obPart.OffsetPosition += diff;
obPart.SetGroupPosition(AbsolutePosition);
}
}
}
else
{
foreach (SceneObjectPart obPart in m_partsList)
{
if (obPart.UUID != m_rootPart.UUID)
obPart.FixOffsetPosition((obPart.OffsetPosition + diff), false);
}
AbsolutePosition = newPos;
}
HasGroupChanged = true;
ScheduleGroupTerseUpdate();
}