static float RotationSlider(int controlID, Vector3 cornerPos, float rotation, Vector3 pivot, Vector3 handleDir, Vector3 outwardsDir1, Vector3 outwardsDir2, float handleSize, HandlesExtra.CapFunction drawFunc, Vector2 snap) { EventType eventType = Event.current.GetTypeForControl(controlID); Vector3 b = outwardsDir1 + outwardsDir2; Vector3 guiCornerPos = HandleUtility.WorldToGUIPoint(cornerPos); Vector3 b2 = ((Vector3)HandleUtility.WorldToGUIPoint(cornerPos + b) - guiCornerPos).normalized * 15f; cornerPos = HandlesExtra.GUIToWorld(guiCornerPos + b2); Vector3 newPosition = HandlesExtra.Slider2D(controlID, cornerPos, drawFunc); rotation = rotation - AngleAroundAxis(newPosition - pivot, cornerPos - pivot, handleDir); if (eventType == EventType.Layout) { HandleUtility.AddControl(controlID, HandleUtility.DistanceToCircle(cornerPos, HandleUtility.GetHandleSize(cornerPos + b) / 10f)); } if (eventType == EventType.Repaint) { if ((HandleUtility.nearestControl == controlID && GUIUtility.hotControl == 0) || GUIUtility.hotControl == controlID) { Rect cursorRect = new Rect(0, 0, 20f, 20f); cursorRect.center = Event.current.mousePosition; EditorGUIUtility.AddCursorRect(cursorRect, MouseCursor.RotateArrow, controlID); } } return(rotation); }
static Rect MoveHandlesGUI(Rect rect, ref Vector3 position, Quaternion rotation, bool anchorPivot = false) { int controlID = GUIUtility.GetControlID("RectMoveHandles".GetHashCode(), FocusType.Passive); EventType eventType = Event.current.GetTypeForControl(controlID); if (eventType == EventType.MouseDown) { s_StartRect = rect; } EditorGUI.BeginChangeCheck(); Vector3 newPosition = HandlesExtra.Slider2D(controlID, position, null); if (EditorGUI.EndChangeCheck()) { if (anchorPivot) { Vector2 delta = Quaternion.Inverse(rotation) * (newPosition - position); rect.min = s_StartRect.min + delta; rect.max = s_StartRect.max + delta; } else { position = newPosition; } } if (eventType == EventType.Layout) { Vector2 mousePositionRectSpace = Vector2.zero; mousePositionRectSpace = Quaternion.Inverse(rotation) * (HandlesExtra.GUIToWorld(Event.current.mousePosition) - position); if (rect.Contains(mousePositionRectSpace, true)) { HandleUtility.AddControl(controlID, 0f); } } if (eventType == EventType.Repaint) { if ((!Event.current.alt && HandleUtility.nearestControl == controlID && GUIUtility.hotControl == 0) || GUIUtility.hotControl == controlID) { Rect cursorRect = new Rect(0f, 0f, 20f, 20f); cursorRect.center = Event.current.mousePosition; EditorGUIUtility.AddCursorRect(cursorRect, MouseCursor.MoveArrow, controlID); } } return(rect); }
public static Rect Do(int controlID) { EventType eventType = Event.current.GetTypeForControl(controlID); if (eventType == EventType.MouseDown) { s_StartPosition = HandlesExtra.GUIToWorld(Event.current.mousePosition); s_EndPosition = s_StartPosition; s_currentRect.position = s_StartPosition; s_currentRect.size = Vector2.zero; } if (eventType == EventType.Layout) { HandleUtility.AddDefaultControl(controlID); } if (eventType == EventType.Repaint) { if (GUIUtility.hotControl == controlID) { RectHandles.RenderRect(s_currentRect, Vector3.zero, Quaternion.identity, new Color(0f, 1f, 1f, 1f), 0.05f, 0.8f); } } if (Camera.current) { #if UNITY_5_6_OR_NEWER s_EndPosition = Handles.Slider2D(controlID, s_EndPosition, Vector3.forward, Vector3.right, Vector3.up, HandleUtility.GetHandleSize(s_EndPosition) / 4f, (id, pos, rot, size, evt) => { }, Vector2.zero); #else s_EndPosition = Handles.Slider2D(controlID, s_EndPosition, Vector3.forward, Vector3.right, Vector3.up, HandleUtility.GetHandleSize(s_EndPosition) / 4f, (id, pos, rot, size) => {}, Vector2.zero); #endif } else { s_EndPosition = HandlesExtra.Slider2D(controlID, s_EndPosition, null); } s_currentRect.min = s_StartPosition; s_currentRect.max = s_EndPosition; return(s_currentRect); }
static void DrawPolyLineWithOffset(Color lineColor, Vector2 screenOffset, params Vector3[] points) { if (Event.current.type != EventType.Repaint) { return; } if (s_TempVectors.Length != points.Length) { s_TempVectors = new Vector3[points.Length]; } for (int i = 0; i < points.Length; i++) { s_TempVectors[i] = (Vector3)HandlesExtra.GUIToWorld(HandleUtility.WorldToGUIPoint(points[i]) + screenOffset); } Color color = Handles.color; Handles.color = lineColor; DrawPolyLine(s_TempVectors); Handles.color = color; }
public static void OnSceneGUI(SceneView sceneview) { for (int i = 0; i < s_Bones.Count; i++) { Bone2D bone = s_Bones[i]; if (bone && IsVisible(bone)) { int controlID = GUIUtility.GetControlID("BoneHandle".GetHashCode(), FocusType.Passive); EventType eventType = Event.current.GetTypeForControl(controlID); if (!IsLocked(bone)) { if (eventType == EventType.MouseDown) { if (HandleUtility.nearestControl == controlID && Event.current.button == 0) { GUIUtility.hotControl = controlID; Event.current.Use(); } } if (eventType == EventType.MouseUp) { if (GUIUtility.hotControl == controlID && Event.current.button == 0) { if (EditorGUI.actionKey) { List <Object> objects = new List <Object>(Selection.objects); objects.Add(bone.gameObject); Selection.objects = objects.ToArray(); } else { Selection.activeObject = bone; } GUIUtility.hotControl = 0; Event.current.Use(); } } if (eventType == EventType.MouseDrag) { if (GUIUtility.hotControl == controlID && Event.current.button == 0) { Handles.matrix = bone.transform.localToWorldMatrix; Vector3 position = HandlesExtra.GUIToWorld(Event.current.mousePosition); BoneUtils.OrientToLocalPosition(bone, position, Event.current.shift, "Rotate", true); EditorUpdater.SetDirty("Rotate"); GUI.changed = true; Event.current.Use(); } } } if (eventType == EventType.Repaint) { if ((HandleUtility.nearestControl == controlID && GUIUtility.hotControl == 0) || GUIUtility.hotControl == controlID || Selection.gameObjects.Contains(bone.gameObject)) { Color color = Color.yellow; float outlineSize = HandleUtility.GetHandleSize(bone.transform.position) * 0.015f * bone.color.a; BoneUtils.DrawBoneOutline(bone, outlineSize, color); Bone2D outlineBone = bone.child; color.a *= 0.5f; while (outlineBone) { if (Selection.gameObjects.Contains(outlineBone.gameObject)) { outlineBone = null; } else { if (outlineBone.color.a == 0f) { outlineSize = HandleUtility.GetHandleSize(outlineBone.transform.position) * 0.015f * outlineBone.color.a; BoneUtils.DrawBoneOutline(outlineBone, outlineSize, color); outlineBone = outlineBone.child; color.a *= 0.5f; } else { outlineBone = null; } } } } if (bone.parentBone && !bone.linkedParentBone) { Color color = bone.color; color.a *= 0.25f; Handles.matrix = Matrix4x4.identity; BoneUtils.DrawBoneBody(bone.transform.position, bone.parentBone.transform.position, BoneUtils.GetBoneRadius(bone), color); } BoneUtils.DrawBoneBody(bone); Color innerColor = bone.color * 0.25f; if (bone.attachedIK && bone.attachedIK.isActiveAndEnabled) { innerColor = new Color(0f, 0.75f, 0.75f, 1f); } innerColor.a = bone.color.a; BoneUtils.DrawBoneCap(bone, innerColor); } if (!IsLocked(bone) && eventType == EventType.Layout) { HandleUtility.AddControl(controlID, HandleUtility.DistanceToLine(bone.transform.position, bone.endPosition)); } } } foreach (Control control in s_Controls) { if (control && control.isActiveAndEnabled && IsVisible(control.gameObject)) { Transform transform = control.transform; if (Selection.activeTransform != transform) { if (!control.bone || (control.bone && !Selection.transforms.Contains(control.bone.transform))) { Handles.matrix = Matrix4x4.identity; Handles.color = control.color; if (Tools.current == Tool.Move) { EditorGUI.BeginChangeCheck(); Quaternion cameraRotation = UnityEngine.Camera.current.transform.rotation; if (Event.current.type == EventType.Repaint) { UnityEngine.Camera.current.transform.rotation = transform.rotation; } float size = HandleUtility.GetHandleSize(transform.position) / 5f; //Handles.DrawLine(transform.position + transform.rotation * new Vector3(size,0f,0f), transform.position + transform.rotation * new Vector3(-size,0f,0f)); //Handles.DrawLine(transform.position + transform.rotation * new Vector3(0f,size,0f), transform.position + transform.rotation * new Vector3(0f,-size,0f)); bool guiEnabled = GUI.enabled; GUI.enabled = !IsLocked(control.gameObject); #if UNITY_5_6_OR_NEWER Vector3 newPosition = Handles.FreeMoveHandle(transform.position, transform.rotation, size, Vector3.zero, Handles.RectangleHandleCap); #else Vector3 newPosition = Handles.FreeMoveHandle(transform.position, transform.rotation, size, Vector3.zero, Handles.RectangleCap); #endif GUI.enabled = guiEnabled; if (Event.current.type == EventType.Repaint) { UnityEngine.Camera.current.transform.rotation = cameraRotation; } if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(transform, "Move"); transform.position = newPosition; if (control.bone) { Undo.RecordObject(control.bone.transform, "Move"); control.bone.transform.position = newPosition; BoneUtils.OrientToChild(control.bone.parentBone, Event.current.shift, "Move", true); EditorUpdater.SetDirty("Move"); } } } else if (Tools.current == Tool.Rotate) { EditorGUI.BeginChangeCheck(); float size = HandleUtility.GetHandleSize(transform.position) * 0.5f; //Handles.DrawLine(transform.position + transform.rotation * new Vector3(size,0f,0f), transform.position + transform.rotation * new Vector3(-size,0f,0f)); //Handles.DrawLine(transform.position + transform.rotation * new Vector3(0f,size,0f), transform.position + transform.rotation * new Vector3(0f,-size,0f)); bool guiEnabled = GUI.enabled; GUI.enabled = !IsLocked(control.gameObject); Quaternion newRotation = Handles.Disc(transform.rotation, transform.position, transform.forward, size, false, 0f); GUI.enabled = guiEnabled; if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(transform, "Rotate"); transform.rotation = newRotation; if (control.bone) { Undo.RecordObject(control.bone.transform, "Rotate"); control.bone.transform.rotation = newRotation; EditorUpdater.SetDirty("Rotate"); } } } } } } } }