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;
                }
            }
        }
Beispiel #2
0
        override public void OnInspectorGUI()
        {
            serializedObject.Update();

            SerializedProperty targetProp = serializedObject.FindProperty("m_Target");
            SerializedProperty weightProp = serializedObject.FindProperty("m_Weight");

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.PropertyField(targetProp);

            if (EditorGUI.EndChangeCheck())
            {
                IkUtils.InitializeIk2D(serializedObject);

                DoUpdateIK();
            }

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.Slider(weightProp, 0f, 1f);

            if (EditorGUI.EndChangeCheck())
            {
                DoUpdateIK();
            }

            serializedObject.ApplyModifiedProperties();
        }
Beispiel #3
0
        override public void OnInspectorGUI()
        {
            serializedObject.Update();

            EditorGUILayout.PropertyField(m_RecordProperty);

            Transform targetTransform = null;

            if (m_Ik2D.target)
            {
                targetTransform = m_Ik2D.target.transform;
            }

            EditorGUI.BeginChangeCheck();

            Transform newTargetTransform = EditorGUILayout.ObjectField(new GUIContent("Target"), targetTransform, typeof(Transform), true) as Transform;

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RegisterCompleteObjectUndo(m_Ik2D, "set target");

                if (newTargetTransform && !newTargetTransform.GetComponent <Bone2D>())
                {
                    newTargetTransform = null;
                }

                if (newTargetTransform != targetTransform)
                {
                    m_TargetTransformProperty.objectReferenceValue = newTargetTransform;
                    IkUtils.InitializeIk2D(serializedObject);
                    EditorUpdater.SetDirty("set target");
                }
            }

            /*
             * EditorGUI.BeginChangeCheck();
             *
             * EditorGUILayout.PropertyField(m_TargetTransformProperty);
             *
             * if(EditorGUI.EndChangeCheck())
             * {
             *      IkUtils.InitializeIk2D(serializedObject);
             *
             *      DoUpdateIK();
             * }
             */

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.Slider(m_WeightProperty, 0f, 1f);
            EditorGUILayout.PropertyField(m_RestorePoseProperty);
            EditorGUILayout.PropertyField(m_OrientChildProperty);

            if (EditorGUI.EndChangeCheck())
            {
                EditorUpdater.SetDirty(Undo.GetCurrentGroupName());
            }

            serializedObject.ApplyModifiedProperties();
        }
Beispiel #4
0
        public void SetFrame(int frame, AnimationClip clip)
        {
            if (m_PreviewInstance && clip)
            {
                clip.SampleAnimation(m_PreviewInstance, AnimationWindowExtra.FrameToTime(frame));

                IkUtils.UpdateIK(m_PreviewInstance, "", false);
            }
        }
Beispiel #5
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 static void SavePose(Pose pose, Transform root)
        {
            List <Bone2D> bones = new List <Bone2D>(50);

            root.GetComponentsInChildren <Bone2D>(true, bones);

            SerializedObject   poseSO      = new SerializedObject(pose);
            SerializedProperty entriesProp = poseSO.FindProperty("m_BoneEntries");

            poseSO.Update();
            entriesProp.arraySize = bones.Count;

            for (int i = 0; i < bones.Count; i++)
            {
                Bone2D bone = bones [i];

                if (bone)
                {
                    SerializedProperty element = entriesProp.GetArrayElementAtIndex(i);
                    element.FindPropertyRelative("path").stringValue              = BoneUtils.GetBonePath(root, bone);
                    element.FindPropertyRelative("localPosition").vector3Value    = bone.transform.localPosition;
                    element.FindPropertyRelative("localRotation").quaternionValue = bone.transform.localRotation;
                    element.FindPropertyRelative("localScale").vector3Value       = bone.transform.localScale;
                }
            }

            poseSO.ApplyModifiedProperties();



            List <Ik2D> iks = new List <Ik2D>(50);

            root.GetComponentsInChildren <Ik2D>(true, iks);

            SerializedObject   poseS1       = new SerializedObject(pose);
            SerializedProperty entriesProp1 = poseS1.FindProperty("m_IkEntries");

            poseS1.Update();
            entriesProp1.arraySize = iks.Count;

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

                if (ik)
                {
                    SerializedProperty element = entriesProp1.GetArrayElementAtIndex(i);
                    element.FindPropertyRelative("path").stringValue              = IkUtils.GetIkPath(root, ik);
                    element.FindPropertyRelative("localPosition").vector3Value    = ik.transform.localPosition;
                    element.FindPropertyRelative("localRotation").quaternionValue = ik.transform.localRotation;
                    element.FindPropertyRelative("localScale").vector3Value       = ik.transform.localScale;
                }
            }

            poseS1.ApplyModifiedProperties();
        }
        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);
            }
        }
        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();
        }
Beispiel #9
0
        override public void OnInspectorGUI()
        {
            IkCCD2D ikCCD2D = target as IkCCD2D;

            base.OnInspectorGUI();

            SerializedProperty numBonesProp   = serializedObject.FindProperty("m_NumBones");
            SerializedProperty iterationsProp = serializedObject.FindProperty("iterations");
            SerializedProperty dampingProp    = serializedObject.FindProperty("damping");

            Bone2D targetBone = ikCCD2D.target;

            serializedObject.Update();

            EditorGUI.BeginDisabledGroup(!targetBone);

            EditorGUI.BeginChangeCheck();

            int chainLength = 0;

            if (targetBone)
            {
                chainLength = targetBone.chainLength;
            }

            EditorGUILayout.IntSlider(numBonesProp, 0, chainLength);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RegisterCompleteObjectUndo(ikCCD2D, "Set num bones");

                IkUtils.InitializeIk2D(serializedObject);
                EditorUpdater.SetDirty("Set num bones");
            }

            EditorGUI.EndDisabledGroup();

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.PropertyField(iterationsProp);
            EditorGUILayout.PropertyField(dampingProp);

            if (EditorGUI.EndChangeCheck())
            {
                EditorUpdater.SetDirty(Undo.GetCurrentGroupName());
            }

            serializedObject.ApplyModifiedProperties();
        }
Beispiel #10
0
        override public void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            serializedObject.Update();

            SerializedProperty targetBoneProp = serializedObject.FindProperty("m_Target");
            SerializedProperty numBonesProp   = serializedObject.FindProperty("m_NumBones");
            SerializedProperty iterationsProp = serializedObject.FindProperty("iterations");
            SerializedProperty dampingProp    = serializedObject.FindProperty("damping");

            Bone2D targetBone = targetBoneProp.objectReferenceValue as Bone2D;

            EditorGUI.BeginDisabledGroup(!targetBone);

            EditorGUI.BeginChangeCheck();

            int chainLength = 0;

            if (targetBone)
            {
                chainLength = targetBone.chainLength;
            }

            EditorGUILayout.IntSlider(numBonesProp, 0, chainLength);

            if (EditorGUI.EndChangeCheck())
            {
                IkUtils.InitializeIk2D(serializedObject);

                DoUpdateIK();
            }

            EditorGUI.EndDisabledGroup();

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.PropertyField(iterationsProp);
            EditorGUILayout.PropertyField(dampingProp);

            if (EditorGUI.EndChangeCheck())
            {
                DoUpdateIK();
            }

            serializedObject.ApplyModifiedProperties();
        }
Beispiel #11
0
        void CreatePreview()
        {
            DestroyPreview();

            if (!AnimationMode.InAnimationMode())
            {
                return;
            }

            if (m_SelectedRenderer)
            {
                List <Renderer> l_renderers = new List <Renderer>();

                AnimationWindowExtra.rootGameObject.GetComponentsInChildren <Renderer>(l_renderers);

                foreach (Renderer renderer in l_renderers)
                {
                    renderer.enabled = renderer == m_SelectedRenderer;
                }

                m_InstanceRoot = EditorExtra.InstantiateForAnimatorPreview(AnimationWindowExtra.rootGameObject) as GameObject;

                foreach (Renderer renderer in l_renderers)
                {
                    renderer.enabled = true;
                }
            }
            else
            {
                m_InstanceRoot = EditorExtra.InstantiateForAnimatorPreview(AnimationWindowExtra.rootGameObject) as GameObject;
            }

            EditorExtra.InitInstantiatedPreviewRecursive(m_InstanceRoot);

            List <Ik2D> ik2Ds = new List <Ik2D>();

            m_InstanceRoot.GetComponentsInChildren <Ik2D>(ik2Ds);

            IkUtils.UpdateAttachedIKs(ik2Ds);

            m_OnionLayerManager.source = m_InstanceRoot;

            m_InstanceRoot.SetActive(false);
        }
        void CreatePreview()
        {
            DestroyPreview();

            if (!AnimationMode.InAnimationMode())
            {
                return;
            }

            m_InstanceRoot = EditorExtra.InstantiateForAnimatorPreview(AnimationWindowExtra.rootGameObject) as GameObject;

            EditorExtra.InitInstantiatedPreviewRecursive(m_InstanceRoot);

            List <Ik2D> ik2Ds = new List <Ik2D>();

            m_InstanceRoot.GetComponentsInChildren <Ik2D>(ik2Ds);

            IkUtils.UpdateAttachedIKs(ik2Ds);

            m_OnionLayerManager.source = m_InstanceRoot;

            m_InstanceRoot.SetActive(false);
        }
Beispiel #13
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;
            }
        }
Beispiel #14
0
        protected void DoUpdateIK()
        {
            Ik2D ik2D = target as Ik2D;

            IkUtils.UpdateIK(ik2D, "Update IK");
        }
Beispiel #15
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;
            }
        }