public AISteerFabulaClip(JSONNode json, TimelineAsset p_timeline, PlayableDirector p_director)
            : base(json, p_timeline, p_director)
        {
            var TC = agent.GetComponent <DynoBehavior_TimelineControl>();

            TC.InitiateExternally();

            ending_location = GameObject.Find(json["end_pos_name"].Value);

            ClipInfo CI = new ClipInfo(p_director, start, duration, Name);

            // Here, we need to indicate that this is a master or not.
            CI.SteerClip(agent, starting_location.transform.position, ending_location.transform.position, false, true, true);

            // number of segs should based on total path / slow radius
            var lastPosition = starting_location.transform.position;
            var distance     = ending_location.transform.position - lastPosition;

            //var KB = agent.GetComponent<Kinematic>();
            var SP = agent.GetComponent <SteeringParams>();

            var slowRadius = agent.GetComponent <DynoBehavior_TimelineControl>().slowRadius;
            int numSegs    = (int)Mathf.Ceil(distance.magnitude / slowRadius);
            var eachSeg    = duration / numSegs;

            var directionSeg = distance / numSegs;

            for (int n = 0; n < numSegs; n++)
            {
                var p = SimulateSteering(starting_location.transform.position, ending_location.transform.position, SP, n * eachSeg);

                //var p = lastPosition + directionSeg;

                if (n == 0)
                {
                    lastPosition = p;
                    continue;
                }
                CI = new ClipInfo(p_director, start + n * eachSeg, eachSeg, Name + n.ToString());

                CI.SteerClip(agent, lastPosition, ending_location.transform.position, true, true, false);
                lastPosition = p;
            }
        }
        public DroneSteerFabulaClip(JSONNode json, TimelineAsset p_timeline, PlayableDirector p_director)
            : base(json, p_timeline, p_director)
        {
            ending_location = GameObject.Find(json["end_pos_name"].Value);

            // create Steer for each edge in path
            int numSegs      = 4;
            var eachSeg      = duration / numSegs;
            var lastPosition = starting_location.transform.position;
            var directionSeg = (ending_location.transform.position - lastPosition) / numSegs;


            // test
            ClipInfo CI = new ClipInfo(p_director, start, duration, Name);

            CI.SteerClip(agent, starting_location.transform.position, ending_location.transform.position, true, true, true);
            // for each segment
            //for (int n = 0;  n < numSegs; n++)
            //{
            //    ClipInfo CI = new ClipInfo(p_director, start + n * eachSeg, eachSeg, Name);
            //    var p = lastPosition + directionSeg;
            //    // for test:
            //    //GameObject intermed = new GameObject();
            //    //intermed.name = n.ToString();
            //    //intermed.transform.position = p;
            //    if (n == 0)
            //    {
            //        CI.SteerClip(agent, lastPosition, p, true, false);
            //    }
            //    else if (n == numSegs - 1)
            //    {
            //        CI.SteerClip(agent, lastPosition, ending_location.transform.position, false, true);
            //    }
            //    else
            //    {
            //        CI.SteerClip(agent, lastPosition, p, false, false);
            //    }
            //    lastPosition = p;
            //}
        }
        public SteerFabulaClip(JSONNode json, TimelineAsset p_timeline, PlayableDirector p_director)
            : base(json, p_timeline, p_director)
        {
            ending_location = GameObject.Find(json["end_pos_name"].Value);

            // Quantize to find start and finish nodes
            startNode = QuantizeLocalize.Quantize(starting_location.transform.position, TrackAttributes.TG);
            goalNode  = QuantizeLocalize.Quantize(ending_location.transform.position, TrackAttributes.TG);

            // Calculate path
            Path = PathFind.Dijkstra(TrackAttributes.TG, startNode, goalNode);

            // create Lerp for each edge in path
            var eachSeg  = duration / Path.Count;
            int n        = 0;
            var lastNode = startNode;

            foreach (Node p in Path)
            {
                ClipInfo CI = new ClipInfo(p_director, start + n * eachSeg, eachSeg, Name);

                CI.SimpleLerpClip(agent, lastNode.transform, p.transform);
                lastNode = p;
                n++;
            }

            // run animation across whole thing if not null
            if (json["animation_name"] != null)
            {
                control_track_clip             = ctrack.CreateDefaultClip();
                control_track_clip.start       = start + 0.06f;
                control_track_clip.duration    = duration - 0.06f;
                control_track_clip.displayName = Name;
                controlAnim = control_track_clip.asset as ControlPlayableAsset;
                AnimateBind(controlAnim, animTimelineObject);
            }
        }