private void UpdateCharacterSkeleton()
        {
            if (!m_sentSkeletonMessage)
            {
                m_sentSkeletonMessage = true;
                var characterBones = m_skinnedEntity.AnimationController.CharacterBones;
                var skeletonDescription = new MySkeletonBoneDescription[characterBones.Length];

                for (int i = 0; i < characterBones.Length; i++)
                {
                    skeletonDescription[i].Parent = -1;
                    if (characterBones[i].Parent != null)
                    {
                        for (int j = 0; j < characterBones.Length; j++)
                        {
                            if (characterBones[j].Name == characterBones[i].Parent.Name)
                            {
                                skeletonDescription[i].Parent = j;
                                break;
                            }
                        }
                    }

                    if (characterBones[i].Parent != null)
                    {
                        Debug.Assert(skeletonDescription[i].Parent > -1, "Can't find bone with parent name!");
                    }

                    skeletonDescription[i].SkinTransform = characterBones[i].SkinTransform;
                }

                VRageRender.MyRenderProxy.SetCharacterSkeleton(RenderObjectIDs[0], skeletonDescription, Model.Animations.Skeleton.ToArray());
            }
        }
        internal void SetSkeleton(MySkeletonBoneDescription[] hierarchy, int[] skeletonIndices)
        {
            m_skeletonHierarchy = hierarchy;
            m_skeletonIndices = skeletonIndices;

            m_skinTransforms = new Matrix[m_skeletonHierarchy.Length];
            m_absoluteTransforms = new Matrix[m_skeletonHierarchy.Length];

            m_owner.MarkRenderDirty();
        }
        public void SetSkeleton(MySkeletonBoneDescription[] hierarchy, int[] skeletonIndices)
        {
            m_skeletonHierarchy = hierarchy;
            m_skeletonIndices = skeletonIndices;

            m_boneInterpolators = new MyInterpolationQueue<Matrix>[m_skeletonHierarchy.Length];
            m_interpolatedTransforms = new Matrix[m_skeletonHierarchy.Length];
            m_skinTransforms = new Matrix[m_skeletonHierarchy.Length];
            m_absoluteTransforms = new Matrix[m_skeletonHierarchy.Length];

            for (int i = 0; i < m_skeletonHierarchy.Length; i++)
            {
                m_boneInterpolators[i] = new MyInterpolationQueue<Matrix>(5, Matrix.SlerpScale);    
            }
        }
        internal static void SetSkeleton(EntityId entity, MySkeletonBoneDescription[] hierarchy, int[] skeletonIndices)
        {
            Skinnings[entity] = new MySkinning
            {
                SkeletonHierarchy = hierarchy,
                SkeletonIndices = skeletonIndices,
                SkinTransforms = new Matrix[hierarchy.Length],
                AbsoluteTransforms = new Matrix[hierarchy.Length]
            };

            EntityDirty.Add(entity);
        }