public void AttachBind(AttachToParent atpObj, GameObject parent, GameObject child)
 {
     atpObj.Parent.exposedName = UnityEditor.GUID.Generate().ToString();
     atpObj.Child.exposedName  = UnityEditor.GUID.Generate().ToString();
     playableDirector.SetReferenceValue(atpObj.Parent.exposedName, parent);
     playableDirector.SetReferenceValue(atpObj.Child.exposedName, child);
 }
        public ClipInfo ProcessInstruction(GameObject goWithAction, string instruction, List <GameObject> terms, double startTime, double duration)
        {
            var instructionParts = instruction.Split(' ');
            var instructionType  = instructionParts[0];

            var CI = new ClipInfo(this.playableDirector, startTime, duration, instruction);

            if (instructionType.Equals("play"))
            {
                // implies only 1 argument, unless refactored later
                var agent = terms[Int32.Parse(instructionParts[1])];

                // Clones action and sets binding
                var goClone          = SetAgentToGenericAction(goWithAction, agent);
                var controlTrackClip = ctrack.CreateDefaultClip();
                CI.display = string.Format("playing timeline {0}", goWithAction.name);
                AnimateClip(controlTrackClip, goClone, CI);
            }

            if (instructionType.Equals("attach"))
            {
                var parent = terms[Int32.Parse(instructionParts[1])];
                var child  = terms[Int32.Parse(instructionParts[2])];

                var attachClip = attachTrack.CreateClip <AttachToParent>();
                attachClip.start       = CI.start;
                attachClip.duration    = CI.duration;
                attachClip.displayName = string.Format("attach parent={0} child={1}", parent.name, child.name);
                AttachToParent aClip = attachClip.asset as AttachToParent;
                AttachBind(aClip, parent, child);
            }

            if (instructionType.Equals("dettach"))
            {
                var child = terms[Int32.Parse(instructionParts[1])];

                var dettachClip = attachTrack.CreateClip <DettachToParent>();
                dettachClip.start       = CI.start;
                dettachClip.duration    = CI.duration;
                dettachClip.displayName = string.Format("dettach child={0}", child.name);
                DettachToParent aClip = dettachClip.asset as DettachToParent;
                DettachBind(aClip, child);
            }

            if (instructionType.Equals("transform"))
            {
                // parse 5 argument instructions
                var agent             = terms[Int32.Parse(instructionParts[1])];
                var origin            = terms[Int32.Parse(instructionParts[2])];
                var originHeight      = float.Parse(instructionParts[3]);
                var destination       = terms[Int32.Parse(instructionParts[4])];
                var destinationHeight = float.Parse(instructionParts[5]);

                // Creating new transforms with custom heights
                var originTransform = new GameObject();
                originTransform.transform.position = new Vector3(origin.transform.position.x, originHeight, origin.transform.position.z);
                var destinationTransform = new GameObject();
                destinationTransform.transform.position = new Vector3(destination.transform.position.x, destinationHeight, destination.transform.position.z);

                SimpleLerpClip(agent, originTransform.transform, destinationTransform.transform, CI);
            }

            if (instructionType.Equals("steer"))
            {
                var agent  = terms[Int32.Parse(instructionParts[1])];
                var source = terms[Int32.Parse(instructionParts[2])];
                var sink   = terms[Int32.Parse(instructionParts[3])];

                var displayName = string.Format("{0} {1} {2} {3}", instructionType, agent.name, source.name, sink.name);
                CI.display = displayName;

                // Initiate the Steering capability of the agent
                var DS_TC = agent.GetComponent <DynoBehavior_TimelineControl>();
                DS_TC.InitiateExternally();

                var steerStart  = new Vector3(source.transform.position.x, agent.transform.position.y, source.transform.position.z);
                var steerFinish = new Vector3(sink.transform.position.x, agent.transform.position.y, sink.transform.position.z);
                // arg 1 is agent, arg 2 is source, arg 3 is destination
                SteerClip(agent, steerStart, steerFinish, true, true, true, CI);
            }

            if (instructionType.Equals("orient"))
            {
                var agent       = terms[Int32.Parse(instructionParts[1])];
                var destination = terms[Int32.Parse(instructionParts[2])];

                // Initiate the Steering capability of the agent (if not already set; fine if redundant)
                var DS_TC = agent.GetComponent <DynoBehavior_TimelineControl>();
                DS_TC.InitiateExternally();
                // var test = destination.transform.position + destination.transform.localPosition;
                OrientClip(agent, destination.transform.position, CI);
            }


            //if (instructionType.Equals("scale"))
            //{
            //    var rescale = new Vector3(float.Parse(instructionParts[2]), float.Parse(instructionParts[3]), float.Parse(instructionParts[4]));
            //    var agent = terms[Int32.Parse(instructionParts[1])];
            //    var destination = new Trans(agent.transform);
            //    destination.localScale = rescale;
            //    SimpleLerpClip(agent, destination, CI);

            //}
            //else if (instructionType.Equals("takePosition"))
            //{
            //    // argument 1 is to take position of second
            //    var destination = terms[Int32.Parse(instructionParts[2])].transform;
            //    SimpleLerpClip(terms[1], new Trans(destination), CI);
            //}
            //else if (instructionType.Equals("addPosition"))
            //{
            //    var agent = terms[Int32.Parse(instructionParts[1])];
            //    // adds vector3
            //    var addition = new Vector3(float.Parse(instructionParts[2]), float.Parse(instructionParts[3]), float.Parse(instructionParts[4]));
            //    var destination = new Trans(agent.transform);

            //    destination.position += addition;
            //    SimpleLerpClip(agent, destination, CI);
            //}
            //else if (instructionType.Equals("parent"))
            //{

            //}
            //else if (instructionType.Equals("deparent"))
            //{

            //}
            //else if (instructionType.Equals("steer"))
            //{
            //    // noninstantaneous...
            //}
            //else
            //{
            //    Debug.Log(string.Format("instruction type {0} not yet written.", instructionType));
            //    throw new System.Exception();
            //}

            return(CI);
        }