void UpdateRootRotation(Quaternion rot)
{
Quaternion new_global_group_rot = rot;
Quaternion old_global_group_rot = m_rootPart.GetRotationOffset();
m_rootPart.UpdateRotation(rot);
if (m_rootPart.PhysActor != null)
m_rootPart.PhysActor.Orientation = m_rootPart.GetRotationOffset();
foreach (SceneObjectPart childPrim in m_partsList.Where(childPrim => childPrim.UUID != m_rootPart.UUID))
{
childPrim.StoreUndoState();
childPrim.IgnoreUndoUpdate = true;
// fix rotation
// get in world coords
Quaternion primsRot = old_global_group_rot*childPrim.GetRotationOffset();
// set new offset as inverse of the one on root
// so world is right
primsRot = Quaternion.Inverse(new_global_group_rot)*primsRot;
// just store it
childPrim.SetRotationOffset(false, primsRot, false);
// fix position offset
Vector3 axPos = childPrim.OffsetPosition;
axPos *= old_global_group_rot;
axPos *= Quaternion.Inverse(new_global_group_rot);
// store it and let physics know about both changes
childPrim.FixOffsetPosition(axPos, true);
childPrim.ScheduleTerseUpdate();
childPrim.IgnoreUndoUpdate = false;
}
m_rootPart.ScheduleTerseUpdate();
}