예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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;
        }
예제 #5
0
        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");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }