public KeyframeAnimation AllocateCopyAtFixedSampleRate(float sampleRate)
        {
            int numJoints = jointSamplers.Length;

            KeyframeAnimation anim = new KeyframeAnimation();

            anim.animationCurves = new List <CurveInfo>(animationCurves.Count);
            anim.jointSamplers   = new NativeArray <TransformSampler>(numJoints, Allocator.Persistent);
            anim.numFrames       = (int)math.ceil(sampleRate * duration);

            for (int jointIndex = 0; jointIndex < numJoints; ++jointIndex)
            {
                TransformSampler sourceSampler      = jointSamplers[jointIndex];
                TransformSampler destinationSampler = TransformSampler.CreateEmpty(sourceSampler.DefaultTransform);

                for (int curveIndex = 0; curveIndex < TransformSampler.NumCurves; ++curveIndex)
                {
                    if (sourceSampler.GetCurveProxy(curveIndex).HasCurve)
                    {
                        Curve curve = new Curve(anim.numFrames, Allocator.Persistent); // fixed framerate curve
                        anim.animationCurves.Add(new CurveInfo()
                        {
                            curve      = curve,
                            jointIndex = jointIndex,
                            curveIndex = curveIndex,
                        });
                        destinationSampler.SetCurve(curveIndex, curve);
                    }
                }

                anim.jointSamplers[jointIndex] = destinationSampler;
            }

            return(anim);
        }
        void InitWithRigTransforms(AnimationRig targetRig)
        {
            animationCurves = new List <CurveInfo>();
            jointSamplers   = new NativeArray <TransformSampler>(targetRig.NumJoints, Allocator.Persistent);

            for (int i = 0; i < targetRig.NumJoints; ++i)
            {
                jointSamplers[i] = TransformSampler.CreateEmpty(targetRig.Joints[i].localTransform);
            }
        }