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; } } }
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 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(); }
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; } }