void sampleMatrixCurves(ResourceMapper resMap, AnimationSampler providedSampler = null)
        {
            var skelId = resMap.skelRegistry.registerSkeleton(animator.transform, true);

            if (!ExportUtility.isValidId(skelId))
            {
                throw new System.ArgumentException(
                          string.Format("Skeleton not found for clip \"{0}\" and animator \"{1}\"",
                                        clip, animator));
            }
            var skeleton = resMap.skelRegistry.getSkeletonById(skelId);

            var prefabAnim = Utility.getSrcPrefabAssetObject(animator, false);

            if (providedSampler != null)
            {
                var sampled = providedSampler.sampleClip(clip);
                matrixCurves = sampled;                //.matrixCurves;
                //sampledFloatCurves = sampled.floatCurves;
            }
            else
            {
                using (var sampler = new AnimationSampler(prefabAnim, skeleton)){
                    var sampled = sampler.sampleClip(clip);
                    matrixCurves = sampled;                    //.matrixCurves;
                    //sampledFloatCurves = sampled.floatCurves;
                }
            }

            matrixCurves.forEach((obj) => obj.simpleCompress());

                        #if false
            //Black magic: on!
            //Spawning a duplicate

            var spawnedAnimator = GameObject.Instantiate(prefabAnim);
            if (!spawnedAnimator)
            {
                throw new System.Exception("Instantiating of original object failed while sampling animation");
            }

            var transformRoot = spawnedAnimator.transform;

            var foundTransforms = Utility.findNamedTransforms(
                skeleton.bones.Select((arg) => arg.name).ToList(),
                transformRoot);
            //This needs to be moved elsewhere.

            var guidName = System.Guid.NewGuid().ToString("N");
            var animControllerBaseAssetPath = string.Format("Assets/tmp-remapController-{0}.controller", guidName);
            Debug.LogFormat("guid: {0}, basePath: {1}", guidName, animControllerBaseAssetPath);
            var animControllerAssetPath = AssetDatabase.GenerateUniqueAssetPath(animControllerBaseAssetPath);
            Debug.LogFormat("generated path: {0}", animControllerAssetPath);
            var newController = UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath(
                animControllerAssetPath);

            var stateMachine = newController.layers[0].stateMachine;
            var stateName    = "clip";
            var state        = newController.layers[0].stateMachine.AddState(stateName);
            stateMachine.defaultState = state;

            spawnedAnimator.runtimeAnimatorController = newController;

            var firstTime = 0.0f;
            var lastTime  = clip.length;
            var timeStep  = 1.0f / clip.frameRate;

            spawnedAnimator.Play(stateName, 0, 0.0f);

            for (int transformIndex = 0; transformIndex < foundTransforms.Count; transformIndex++)
            {
                var curTransform = foundTransforms[transformIndex];
                var newCurve     = new JsonAnimationMatrixCurve();
                newCurve.objectName = skeleton.bones[transformIndex].name;
                matrixCurves.Add(newCurve);
            }

            for (float t = firstTime; t <= lastTime; t += timeStep)
            {
                clip.SampleAnimation(spawnedAnimator.gameObject, t);
                for (int transformIndex = 0; transformIndex < foundTransforms.Count; transformIndex++)
                {
                    var curTransform = foundTransforms[transformIndex];
                    if (!curTransform)
                    {
                        continue;
                    }
                    matrixCurves[transformIndex].addKey(t, curTransform, spawnedAnimator.transform);
                }
                ///sampleSingleFramePoints(spawnedAnimator, boneIds, t/lastTime);
            }

            foreach (var cur in matrixCurves)
            {
                cur.simpleCompress();
            }

            if (spawnedAnimator)
            {
                GameObject.DestroyImmediate(spawnedAnimator.gameObject);
            }
            if (newController)
            {
                AssetDatabase.DeleteAsset(animControllerAssetPath);
            }
                        #endif
        }
        public JsonAnimationClip(AnimationClip clip_, Animator animator_, ResId id_, ResourceMapper resMap, AnimationSampler animSampler = null)
        {
            clip     = clip_;
            id       = id_;
            animator = animator_;
            if (!clip)
            {
                throw new System.ArgumentNullException("clip_");
            }
            if (!animator)
            {
                throw new System.ArgumentNullException("animator_");
            }
            if (resMap == null)
            {
                throw new System.ArgumentNullException("resMap");
            }

            name = clip.name;
            sampleMatrixCurves(resMap, animSampler);
        }