Universe.Region.SceneObjectGroup.UpdateRootRotation C# (CSharp) Method

UpdateRootRotation() private method

private UpdateRootRotation ( Quaternion rot ) : void
rot Quaternion
return void
        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();
        }
SceneObjectGroup