// ------------------------------------------------------------------------

        // Update animation state (position and orientation of bones).
        // Called from MySessionComponentAnimationSystem.
        public void Update()
        {
            using (m_componentValidLock.AcquireSharedUsing())
            {
                if (!m_componentValid)
                {
                    return;
                }
                VRage.Animations.MyAnimationUpdateData updateData = new Animations.MyAnimationUpdateData();
                updateData.DeltaTimeInSeconds = VRage.Game.MyEngineConstants.UPDATE_STEP_SIZE_IN_SECONDS;
                updateData.CharacterBones     = m_characterBones;
                updateData.Controller         = null; // will be set inside m_controller.Update automatically if null
                updateData.BonesResult        = null; // will be set inside m_controller.Update (result!)

                m_controller.Update(ref updateData);
                if (updateData.BonesResult != null)
                {
                    for (int i = 0; i < updateData.BonesResult.Count; i++)
                    {
                        CharacterBones[i].SetCompleteTransform(ref updateData.BonesResult[i].Translation,
                                                               ref updateData.BonesResult[i].Rotation);
                    }
                }
                m_lastBoneResult = updateData.BonesResult;
            }
        }
        // ------------------------------------------------------------------------

        // Update animation state (position and orientation of bones).
        // Called from MySessionComponentAnimationSystem.
        public void Update()
        {
            VRage.Animations.MyAnimationUpdateData updateData = new Animations.MyAnimationUpdateData();
            updateData.DeltaTimeInSeconds = VRage.Game.MyEngineConstants.UPDATE_STEP_SIZE_IN_SECONDS;
            updateData.CharacterBones = m_characterBones;
            updateData.Controller = null;  // will be set inside m_controller.Update automatically if null
            updateData.BonesResult = null; // will be set inside m_controller.Update (result!)
            m_controller.Update(ref updateData);
            if (updateData.BonesResult != null)
            {
                for (int i = 0; i < updateData.BonesResult.Count; i++)
                {
                    CharacterBones[i].SetCompleteTransform(ref updateData.BonesResult[i].Translation,
                        ref updateData.BonesResult[i].Rotation);
                }
            }
            m_lastBoneResult = updateData.BonesResult;
        }
        // ------------------------------------------------------------------------

        // Update animation state (position and orientation of bones).
        // Called from MySessionComponentAnimationSystem.
        public void Update()
        {
            using (m_componentValidLock.AcquireSharedUsing())
            {
                if (!m_componentValid)
                    return;

                VRage.Animations.MyAnimationUpdateData updateData = new Animations.MyAnimationUpdateData();
                updateData.DeltaTimeInSeconds = VRage.Game.MyEngineConstants.UPDATE_STEP_SIZE_IN_SECONDS;
                updateData.CharacterBones = m_characterBones;
                updateData.Controller = null;  // will be set inside m_controller.Update automatically if null
                updateData.BonesResult = null; // will be set inside m_controller.Update (result!)

                m_controller.Update(ref updateData);
                if (updateData.BonesResult != null)
                {
                    for (int i = 0; i < updateData.BonesResult.Count; i++)
                    {
                        CharacterBones[i].SetCompleteTransform(ref updateData.BonesResult[i].Translation,
                            ref updateData.BonesResult[i].Rotation);
                    }
                }
                m_lastBoneResult = updateData.BonesResult;

#if OFFICIAL_BUILD == false
                var helperLast = m_lastFrameActions;
                m_lastFrameActions = m_currentFrameActions;
                m_currentFrameActions = helperLast;
                if (m_currentFrameActions != null)
                    m_currentFrameActions.Clear();
#endif
            }
        }