public override IKSolver.Point GetPoint(Transform transform)
 {
     IKSolverLookAt.LookAtBone[] array = this.spine;
     for (int i = 0; i < array.Length; i++)
     {
         IKSolverLookAt.LookAtBone lookAtBone = array[i];
         if (lookAtBone.transform == transform)
         {
             return(lookAtBone);
         }
     }
     IKSolverLookAt.LookAtBone[] array2 = this.eyes;
     for (int j = 0; j < array2.Length; j++)
     {
         IKSolverLookAt.LookAtBone lookAtBone2 = array2[j];
         if (lookAtBone2.transform == transform)
         {
             return(lookAtBone2);
         }
     }
     if (this.head.transform == transform)
     {
         return(this.head);
     }
     return(null);
 }
 public bool SetChain(Transform[] spine, Transform head, Transform[] eyes, Transform root)
 {
     this.SetBones(spine, ref this.spine);
     this.head = new IKSolverLookAt.LookAtBone(head);
     this.SetBones(eyes, ref this.eyes);
     base.Initiate(root);
     return(base.initiated);
 }
        private static void DrawLookAtBoneInScene(IKSolverLookAt.LookAtBone bone, Vector3 IKPosition, Color color, float lineWeight)
        {
            Handles.color = color;
            GUI.color     = color;

            Handles.SphereCap(0, bone.transform.position, Quaternion.identity, GetHandleSize(bone.transform.position));

            // Draw a transparent line from last bone to IKPosition
            if (Application.isPlaying && lineWeight > 0)
            {
                Handles.color = new Color(color.r, color.g, color.b, color.a * lineWeight);
                Handles.DrawLine(bone.transform.position, IKPosition);
            }
        }
 protected override void OnInitiate()
 {
     if (this.firstInitiation || !Application.isPlaying)
     {
         if (this.spine.Length > 0)
         {
             this.IKPosition = this.spine[this.spine.Length - 1].transform.position + this.root.forward * 3f;
         }
         else if (this.head.transform != null)
         {
             this.IKPosition = this.head.transform.position + this.root.forward * 3f;
         }
         else if (this.eyes.Length > 0 && this.eyes[0].transform != null)
         {
             this.IKPosition = this.eyes[0].transform.position + this.root.forward * 3f;
         }
     }
     IKSolverLookAt.LookAtBone[] array = this.spine;
     for (int i = 0; i < array.Length; i++)
     {
         IKSolverLookAt.LookAtBone lookAtBone = array[i];
         lookAtBone.Initiate(this.root);
     }
     if (this.head != null)
     {
         this.head.Initiate(this.root);
     }
     IKSolverLookAt.LookAtBone[] array2 = this.eyes;
     for (int j = 0; j < array2.Length; j++)
     {
         IKSolverLookAt.LookAtBone lookAtBone2 = array2[j];
         lookAtBone2.Initiate(this.root);
     }
     if (this.spineForwards == null || this.spineForwards.Length != this.spine.Length)
     {
         this.spineForwards = new Vector3[this.spine.Length];
     }
     if (this.headForwards == null)
     {
         this.headForwards = new Vector3[1];
     }
     if (this.eyeForward == null)
     {
         this.eyeForward = new Vector3[1];
     }
 }
 private void SetBones(Transform[] array, ref IKSolverLookAt.LookAtBone[] bones)
 {
     if (array == null)
     {
         bones = new IKSolverLookAt.LookAtBone[0];
         return;
     }
     if (bones.Length != array.Length)
     {
         bones = new IKSolverLookAt.LookAtBone[array.Length];
     }
     for (int i = 0; i < array.Length; i++)
     {
         if (bones[i] == null)
         {
             bones[i] = new IKSolverLookAt.LookAtBone(array[i]);
         }
     }
 }
        /*
         * Draws the scene view helpers for IKSolverLookAt
         * */
        public static void AddScene(IKSolverLookAt solver, Color color, bool modifiable)
        {
            // Protect from null reference errors
            if (Application.isPlaying && !solver.initiated)
            {
                return;
            }
            if (!Application.isPlaying && !solver.IsValid())
            {
                return;
            }

            // Display the Spine
            if (solver.spine.Length > 0)
            {
                Handles.color = color;
                GUI.color     = color;

                for (int i = 0; i < solver.spine.Length; i++)
                {
                    IKSolverLookAt.LookAtBone bone = solver.spine[i];

                    if (i < solver.spine.Length - 1)
                    {
                        Handles.DrawLine(bone.transform.position, solver.spine[i + 1].transform.position);
                    }
                    Handles.SphereCap(0, bone.transform.position, Quaternion.identity, GetHandleSize(bone.transform.position));
                }

                // Draw a transparent line from last bone to IKPosition
                if (Application.isPlaying)
                {
                    Handles.color = new Color(color.r, color.g, color.b, color.a * solver.IKPositionWeight * solver.bodyWeight);
                    Handles.DrawLine(solver.spine[solver.spine.Length - 1].transform.position, solver.IKPosition);
                }
            }

            // Display the eyes
            if (solver.eyes.Length > 0)
            {
                for (int i = 0; i < solver.eyes.Length; i++)
                {
                    DrawLookAtBoneInScene(solver.eyes[i], solver.IKPosition, color, solver.IKPositionWeight * solver.eyesWeight);
                }
            }

            // Display the head
            if (solver.head.transform != null)
            {
                DrawLookAtBoneInScene(solver.head, solver.IKPosition, color, solver.IKPositionWeight * solver.headWeight);
            }

            Handles.color = color;
            GUI.color     = color;

            // Selecting joint and manipulating IKPosition
            if (Application.isPlaying && solver.IKPositionWeight > 0)
            {
                if (modifiable)
                {
                    Handles.SphereCap(0, solver.IKPosition, Quaternion.identity, GetHandleSize(solver.IKPosition));

                    // Manipulating position
                    if (solver.target == null)
                    {
                        solver.IKPosition = Handles.PositionHandle(solver.IKPosition, Quaternion.identity);
                    }
                }
            }

            Handles.color = Color.white;
            GUI.color     = Color.white;
        }