示例#1
0
        public static void Update(string undoName, bool record)
        {
            List <Ik2D> updatedIKs = new List <Ik2D>();

            for (int i = 0; i < s_Ik2Ds.Count; i++)
            {
                Ik2D ik2D = s_Ik2Ds[i];

                if (ik2D && !updatedIKs.Contains(ik2D))
                {
                    List <Ik2D> ikList = IkUtils.UpdateIK(ik2D, undoName, record);

                    if (ikList != null)
                    {
                        updatedIKs.AddRange(ikList);
                        updatedIKs = updatedIKs.Distinct().ToList();
                    }
                }
            }

            foreach (Control control in s_Controls)
            {
                if (control && control.isActiveAndEnabled && control.bone)
                {
                    control.transform.position = control.bone.transform.position;
                    control.transform.rotation = control.bone.transform.rotation;
                }
            }
        }
示例#2
0
        public void SetFrame(int frame, AnimationClip clip)
        {
            if (m_PreviewInstance && clip)
            {
                clip.SampleAnimation(m_PreviewInstance, AnimationWindowExtra.FrameToTime(frame));

                IkUtils.UpdateIK(m_PreviewInstance, "", false);
            }
        }
示例#3
0
        void OnSceneGUI()
        {
            Bone2D bone = target as Bone2D;

            if (Tools.current == Tool.Move)
            {
                Tools.hidden = true;

                float size = HandleUtility.GetHandleSize(bone.transform.position) / 5f;

                Quaternion rotation = bone.transform.rotation;

                EditorGUI.BeginChangeCheck();

                Vector3 newPosition = Handles.FreeMoveHandle(bone.transform.position,
                                                             rotation,
                                                             size,
                                                             Vector3.zero,
                                                             Handles.RectangleCap);

                if (EditorGUI.EndChangeCheck())
                {
                    GUI.changed = true;

                    Bone2D linkedParentBone = bone.linkedParentBone;

                    if (linkedParentBone)
                    {
                        Vector3 newLocalPosition = linkedParentBone.transform.InverseTransformPoint(newPosition);

                        if (newLocalPosition.sqrMagnitude > 0f)
                        {
                            float angle = Mathf.Atan2(newLocalPosition.y, newLocalPosition.x) * Mathf.Rad2Deg;

                            Undo.RecordObject(linkedParentBone.transform, "Move");
                            Undo.RecordObject(linkedParentBone, "Move");

                            linkedParentBone.transform.localRotation *= Quaternion.AngleAxis(angle, Vector3.forward);

                            EditorUtility.SetDirty(linkedParentBone.transform);
                        }
                    }

                    Undo.RecordObject(bone.transform, "Move");
                    bone.transform.position = newPosition;
                    bone.transform.rotation = rotation;
                    EditorUtility.SetDirty(bone.transform);

                    IkUtils.UpdateIK(bone, "Move");
                }
            }
            else
            {
                Tools.hidden = false;
            }
        }
        public void SetFrame(int frame, AnimationClip clip)
        {
            if (m_PreviewInstance && clip)
            {
                AnimationMode.BeginSampling();
                AnimationMode.SampleAnimationClip(m_PreviewInstance, clip, AnimationWindowExtra.FrameToTime(frame));
                AnimationMode.EndSampling();

                IkUtils.UpdateIK(m_PreviewInstance, "", false);
            }
        }
示例#5
0
        static void Update()
        {
            EditorUpdaterProxy.Instance.onLateUpdate -= OnLateUpdate;
            EditorUpdaterProxy.Instance.onLateUpdate += OnLateUpdate;

            if (s_DraggingATool)
            {
                s_DraggingATool = false;

                string undoName = "Move";

                if (Tools.current == Tool.Rotate)
                {
                    undoName = "Rotate";
                }
                if (Tools.current == Tool.Scale)
                {
                    undoName = "Scale";
                }

                for (int i = 0; i < Selection.transforms.Length; i++)
                {
                    Transform transform = Selection.transforms [i];
                    Control   control   = transform.GetComponent <Control> ();
                    if (control && control.isActiveAndEnabled && control.bone)
                    {
                        Undo.RecordObject(control.bone.transform, undoName);

                        control.bone.transform.position = control.transform.position;
                        control.bone.transform.rotation = control.transform.rotation;

                        BoneUtils.OrientToChild(control.bone.parentBone, false, undoName, true);
                    }

                    Ik2D ik2D = transform.GetComponent <Ik2D>();
                    if (ik2D && ik2D.record)
                    {
                        IkUtils.UpdateIK(ik2D, undoName, true);
                    }
                }

                SetDirty();
            }

            AnimationModeCheck();
            AnimationWindowTimeCheck();

            IkUtils.UpdateAttachedIKs(s_Ik2Ds);

            UpdateIKs();
        }
示例#6
0
        static void Update()
        {
            UpdateAttachedIKs();

            if (s_DraggingATool)
            {
                string undoName = "Move";

                if (Tools.current == Tool.Rotate)
                {
                    undoName = "Rotate";
                }
                if (Tools.current == Tool.Scale)
                {
                    undoName = "Scale";
                }

                for (int i = 0; i < Selection.transforms.Length; i++)
                {
                    Transform transform = Selection.transforms [i];
                    Ik2D      ik2D      = transform.GetComponent <Ik2D> ();
                    if (ik2D)
                    {
                        IkUtils.UpdateIK(ik2D, undoName);
                    }

                    Bone2D bone = transform.GetComponent <Bone2D>();
                    if (bone)
                    {
                        IkUtils.UpdateIK(bone, undoName);
                    }
                }

                s_DraggingATool = false;
            }
        }
示例#7
0
        protected void DoUpdateIK()
        {
            Ik2D ik2D = target as Ik2D;

            IkUtils.UpdateIK(ik2D, "Update IK");
        }
示例#8
0
        public static void OnSceneGUI(SceneView sceneview)
        {
            int dragBoneControlId = GUIUtility.GetControlID(FocusType.Passive);

            switch (Event.current.GetTypeForControl(dragBoneControlId))
            {
            case EventType.MouseMove:

                Bone2D bone = GetClosestBone(Event.current.mousePosition, 10f);

                if (bone != s_HoveredBone)
                {
                    s_HoveredBone = bone;
                    SceneView.RepaintAll();
                }

                break;

            case EventType.MouseDown:

                if (!ToolsExtra.viewToolActive &&
                    HandleUtility.nearestControl == dragBoneControlId &&
                    Event.current.button == 0)
                {
                    s_SelectedBone = s_HoveredBone;
                    Undo.IncrementCurrentGroup();

                    GUIUtility.hotControl = dragBoneControlId;
                    Event.current.Use();
                }

                break;

            case EventType.MouseUp:

                if (s_SelectedBone &&
                    GUIUtility.hotControl == dragBoneControlId &&
                    Event.current.button == 0)
                {
                    Selection.activeGameObject = s_SelectedBone.gameObject;

                    GUIUtility.hotControl = 0;
                    s_SelectedBone        = null;

                    Event.current.Use();
                }

                break;

            case EventType.MouseDrag:

                if (s_SelectedBone &&
                    GUIUtility.hotControl == dragBoneControlId &&
                    Event.current.button == 0)
                {
                    Ray   ray   = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
                    Plane plane = new Plane(s_SelectedBone.transform.forward, s_SelectedBone.transform.position);
                    float distance;
                    if (plane.Raycast(ray, out distance))
                    {
                        Vector3 point = ray.GetPoint(distance);
                        float   angle = AngleAroundAxis(s_SelectedBone.transform.right, point - s_SelectedBone.transform.position, s_SelectedBone.transform.forward);

                        Vector3 eulerAngles = s_SelectedBone.transform.localEulerAngles;
                        eulerAngles.z += angle;

                        Undo.RecordObject(s_SelectedBone.transform, "Rotate");
                        s_SelectedBone.transform.localRotation = Quaternion.Euler(eulerAngles);

                        IkUtils.UpdateIK(s_SelectedBone, "Rotate");
                    }

                    GUI.changed = true;
                    Event.current.Use();
                }

                break;

            case EventType.Repaint:

                DrawBoneGizmos();

                break;

            case EventType.Layout:

                if (!ToolsExtra.viewToolActive && s_HoveredBone)
                {
                    float   radius         = BoneUtils.GetBoneRadius(s_HoveredBone);
                    Vector3 direction      = (s_HoveredBone.endPosition - s_HoveredBone.transform.position).normalized;
                    Vector2 screenPosition = HandleUtility.WorldToGUIPoint(s_HoveredBone.transform.position);

                    Vector3 endPoint = s_HoveredBone.endPosition - direction * radius;

                    if (s_HoveredBone.child)
                    {
                        endPoint -= direction * BoneUtils.GetBoneRadius(s_HoveredBone.child);
                    }

                    Vector2 screenEndPosition = HandleUtility.WorldToGUIPoint(endPoint);

                    float distance = MathUtils.SegmentDistance(Event.current.mousePosition, screenPosition, screenEndPosition);

                    HandleUtility.AddControl(dragBoneControlId, distance * 0.49f);
                }

                break;
            }
        }