public static GpuInstancedAnimationBoneFrame Lerp(GpuInstancedAnimationBoneFrame a, GpuInstancedAnimationBoneFrame b, float factor)
    {
        GpuInstancedAnimationBoneFrame frame = new GpuInstancedAnimationBoneFrame();

        frame.localPosition = Vector3.Lerp(a.localPosition, b.localPosition, factor);
        frame.localForward  = Vector3.Lerp(a.localForward, b.localForward, factor);

        return(frame);
    }
    private GpuInstancedAnimationBoneFrame GetBoneFrame(int frame, int boneIndex)
    {
        int frameIndex = frame * bones.Count + boneIndex;

        if (frameIndex >= 0 && frameIndex < boneFrames.Count)
        {
            GpuInstancedAnimationBoneFrame blendBoneFrame = boneFrames[frameIndex];

            return(blendBoneFrame);
        }
        return(new GpuInstancedAnimationBoneFrame());
    }
    public GpuInstancedAnimationBoneFrame GetBoneFrame(string boneName)
    {
        GpuInstancedAnimationBone bone = GetBone(boneName);

        if (bone != null)
        {
            int currentFrame = 0;
            if (mCurrentAnimationClip != null)
            {
                currentFrame = mCurrentAnimationClip.RealFrame;
            }
            GpuInstancedAnimationBoneFrame previousBoneFrame = new GpuInstancedAnimationBoneFrame();
            GpuInstancedAnimationBoneFrame boneFrame         = GetBoneFrame(currentFrame, bone.index);
            if ((mFadeBegin || mFadeEnd) && mPreviousAnimationClip != null)
            {
                previousBoneFrame = GetBoneFrame(mPreviousAnimationClip.RealFrame, bone.index);

                boneFrame = GpuInstancedAnimationBoneFrame.Lerp(previousBoneFrame, boneFrame, mFadeStrength);
            }

            if (mBlendAnimationClip != null)
            {
                GpuInstancedAnimationBoneFrame blendBoneFrame = GetBoneFrame(mBlendAnimationClip.RealFrame, bone.index);

                if ((mFadeBegin || mFadeEnd) && mPreviousAnimationClip != null)
                {
                    blendBoneFrame = GpuInstancedAnimationBoneFrame.Lerp(previousBoneFrame, blendBoneFrame, mFadeStrength);
                }

                if (mBlendBegin || mBlendEnd)
                {
                    blendBoneFrame = GpuInstancedAnimationBoneFrame.Lerp(boneFrame, blendBoneFrame, mBlendFadeStrength);
                }

                float blendWeight = bone.blendWeight;
                float factor      = Mathf.Abs(1 - blendWeight - (int)blendDirection);

                boneFrame = GpuInstancedAnimationBoneFrame.Lerp(boneFrame, blendBoneFrame, factor);
            }

            return(boneFrame);
        }
        return(new GpuInstancedAnimationBoneFrame());
    }