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; } } }
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(); }
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(); }
public void SetFrame(int frame, AnimationClip clip) { if (m_PreviewInstance && clip) { clip.SampleAnimation(m_PreviewInstance, AnimationWindowExtra.FrameToTime(frame)); IkUtils.UpdateIK(m_PreviewInstance, "", false); } }
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(); }
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(); }
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(); }
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); }
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; } }
protected void DoUpdateIK() { Ik2D ik2D = target as Ik2D; IkUtils.UpdateIK(ik2D, "Update IK"); }
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; } }