Ejemplo n.º 1
0
 static EditorMeshHandles Get()
 {
     if (s_Instance == null)
     {
         s_Instance = new EditorMeshHandles();
     }
     return(s_Instance);
 }
 void DrawSelectionOriginGizmos()
 {
     if (isEditing && currentEvent.type == EventType.Repaint)
     {
         foreach (var key in meshAndElementGroupPairs)
         {
             foreach (var group in key.elementGroups)
             {
                 EditorMeshHandles.DrawTransformOriginGizmo(group.postApplyMatrix, m_IndividualOriginDirection);
             }
         }
     }
 }
Ejemplo n.º 3
0
        internal static void UpdateMeshHandles(bool selectionOrVertexCountChanged = true)
        {
            if (!s_Instance)
            {
                return;
            }

            try
            {
                EditorMeshHandles.RebuildSelectedHandles(MeshSelection.topInternal, selectMode);
            }
            catch
            {
                // happens on undo when c++ object is gone but c# isn't in the know
                EditorMeshHandles.ClearHandles();
            }
        }
Ejemplo n.º 4
0
        void LoadSettings()
        {
            EditorMeshHandles.ResetPreferences();

            m_ScenePickerPreferences = new ScenePickerPreferences()
            {
                maxPointerDistance        = ScenePickerPreferences.maxPointerDistanceFuzzy,
                cullMode                  = m_BackfaceSelectEnabled ? CullingMode.None : CullingMode.Back,
                selectionModifierBehavior = m_SelectModifierBehavior,
                rectSelectMode            = m_DragSelectRectMode
            };

            // workaround for old single-key shortcuts
            if (s_Shortcuts.value == null || s_Shortcuts.value.Length < 1)
            {
                s_Shortcuts.SetValue(Shortcut.DefaultShortcuts().ToArray(), true);
            }
        }
Ejemplo n.º 5
0
        void LoadSettings()
        {
            EditorMeshHandles.ResetPreferences();

            m_ScenePickerPreferences = new ScenePickerPreferences()
            {
                offPointerMultiplier      = s_PickingDistance * k_OffPointerMultiplierPercent,
                maxPointerDistance        = s_PickingDistance,
                cullMode                  = m_BackfaceSelectEnabled ? CullingMode.None : CullingMode.Back,
                selectionModifierBehavior = m_SelectModifierBehavior,
                rectSelectMode            = m_DragSelectRectMode
            };

#if !SHORTCUT_MANAGER
            // workaround for old single-key shortcuts
            if (s_Shortcuts.value == null || s_Shortcuts.value.Length < 1)
            {
                s_Shortcuts.SetValue(Shortcut.DefaultShortcuts().ToArray(), true);
            }
#endif
        }
Ejemplo n.º 6
0
        void DrawHandleGUI(SceneView sceneView)
        {
            if (sceneView != SceneView.lastActiveSceneView)
            {
                return;
            }

            if (m_CurrentEvent.type == EventType.Repaint &&
                !SceneDragAndDropListener.isDragging &&
                m_Hovering != null &&
                GUIUtility.hotControl == 0 &&
                HandleUtility.nearestControl == m_DefaultControl &&
                selectMode.IsMeshElementMode())
            {
                try
                {
                    EditorMeshHandles.DrawSceneSelection(m_Hovering);
                }
                catch
                {
                    // this happens on undo, when c++ object is destroyed but c# side thinks it's still alive
                }
            }

            using (new HandleGUI())
            {
                int screenWidth  = (int)sceneView.position.width;
                int screenHeight = (int)sceneView.position.height;

                switch ((SceneToolbarLocation)s_SceneToolbarLocation)
                {
                case SceneToolbarLocation.BottomCenter:
                    m_ElementModeToolbarRect.x = (screenWidth / 2 - 64);
                    m_ElementModeToolbarRect.y = screenHeight - m_ElementModeToolbarRect.height * 3;
                    break;

                case SceneToolbarLocation.BottomLeft:
                    m_ElementModeToolbarRect.x = 12;
                    m_ElementModeToolbarRect.y = screenHeight - m_ElementModeToolbarRect.height * 3;
                    break;

                case SceneToolbarLocation.BottomRight:
                    m_ElementModeToolbarRect.x = screenWidth - (m_ElementModeToolbarRect.width + 12);
                    m_ElementModeToolbarRect.y = screenHeight - m_ElementModeToolbarRect.height * 3;
                    break;

                case SceneToolbarLocation.UpperLeft:
                    m_ElementModeToolbarRect.x = 12;
                    m_ElementModeToolbarRect.y = 10;
                    break;

                case SceneToolbarLocation.UpperRight:
                    m_ElementModeToolbarRect.x = screenWidth - (m_ElementModeToolbarRect.width + 96);
                    m_ElementModeToolbarRect.y = 10;
                    break;

                default:
                case SceneToolbarLocation.UpperCenter:
                    m_ElementModeToolbarRect.x = (screenWidth / 2 - 64);
                    m_ElementModeToolbarRect.y = 10;
                    break;
                }

                selectMode = UI.EditorGUIUtility.DoElementModeToolbar(m_ElementModeToolbarRect, selectMode);

                if (s_ShowSceneInfo)
                {
                    Vector2 size = UI.EditorStyles.sceneTextBox.CalcSize(m_SceneInfo);
                    m_SceneInfoRect.width  = size.x;
                    m_SceneInfoRect.height = size.y;
                    GUI.Label(m_SceneInfoRect, m_SceneInfo, UI.EditorStyles.sceneTextBox);
                }

                if (m_IsDragging)
                {
                    if (m_CurrentEvent.type == EventType.Repaint)
                    {
                        // Always draw from lowest to largest values
                        var start = Vector2.Min(m_InitialMousePosition, m_CurrentEvent.mousePosition);
                        var end   = Vector2.Max(m_InitialMousePosition, m_CurrentEvent.mousePosition);

                        m_MouseDragRect = new Rect(start.x, start.y, end.x - start.x, end.y - start.y);

                        SceneStyles.selectionRect.Draw(m_MouseDragRect, false, false, false, false);
                    }
                    else if (m_CurrentEvent.isMouse)
                    {
                        HandleUtility.Repaint();
                    }
                }
            }
        }
Ejemplo n.º 7
0
        void OnSceneGUI(SceneView sceneView)
        {
#if !UNITY_2018_2_OR_NEWER
            if (s_ResetOnSceneGUIState != null)
            {
                s_ResetOnSceneGUIState.Invoke(sceneView, null);
            }
#endif

            SceneStyles.Init();

            m_CurrentEvent = Event.current;

            EditorMeshHandles.DrawSceneHandles(SceneDragAndDropListener.isDragging ? SelectMode.None : selectMode);

            DrawHandleGUI(sceneView);

#if SHORTCUT_MANAGER
            // Escape isn't assignable as a shortcut
            if (m_CurrentEvent.type == EventType.KeyDown)
            {
                if (m_CurrentEvent.keyCode == KeyCode.Escape && selectMode != SelectMode.Object)
                {
                    selectMode = SelectMode.Object;
                    m_CurrentEvent.Use();
                }
            }
#else
            if (m_CurrentEvent.type == EventType.MouseDown && m_CurrentEvent.button == 1)
            {
                m_IsRightMouseDown = true;
            }

            if (m_CurrentEvent.type == EventType.MouseUp && m_CurrentEvent.button == 1 || m_CurrentEvent.type == EventType.Ignore)
            {
                m_IsRightMouseDown = false;
            }

            if (!m_IsRightMouseDown && (m_CurrentEvent.type == EventType.KeyUp ? m_CurrentEvent.keyCode : KeyCode.None) != KeyCode.None)
            {
                if (ShortcutCheck(m_CurrentEvent))
                {
                    m_CurrentEvent.Use();
                    return;
                }
            }

            if (m_CurrentEvent.type == EventType.KeyDown)
            {
                if (s_Shortcuts.value.Any(x => x.Matches(m_CurrentEvent.keyCode, m_CurrentEvent.modifiers)))
                {
                    m_CurrentEvent.Use();
                }
            }
#endif

            if (selectMode == SelectMode.Object)
            {
                return;
            }

            // Check mouse position in scene and determine if we should highlight something
            if (s_ShowHoverHighlight &&
                m_CurrentEvent.type == EventType.MouseMove &&
                selectMode.IsMeshElementMode())
            {
                m_Hovering.CopyTo(m_HoveringPrevious);

                if (GUIUtility.hotControl != 0 ||
                    EditorSceneViewPicker.MouseRayHitTest(m_CurrentEvent.mousePosition, selectMode, m_ScenePickerPreferences, m_Hovering) > ScenePickerPreferences.maxPointerDistance)
                {
                    m_Hovering.Clear();
                }

                if (!m_Hovering.Equals(m_HoveringPrevious))
                {
                    SceneView.RepaintAll();
                }
            }

            if (Tools.current == Tool.View)
            {
                return;
            }

            // Overrides the toolbar transform tools
            if (Tools.current != Tool.None && Tools.current != m_CurrentTool)
            {
                SetTool_Internal(Tools.current);
            }

            Tools.current = Tool.None;

            if (selectMode.IsMeshElementMode() && MeshSelection.selectedVertexCount > 0)
            {
                var tool = GetToolForSelectMode(m_CurrentTool, s_SelectMode);

                if (tool != null)
                {
                    tool.OnSceneGUI(m_CurrentEvent);
                }
            }

            if (EditorHandleUtility.SceneViewInUse(m_CurrentEvent) || m_CurrentEvent.isKey)
            {
                m_IsDragging = false;

                if (GUIUtility.hotControl == m_DefaultControl)
                {
                    GUIUtility.hotControl = 0;
                }

                return;
            }

            // This prevents us from selecting other objects in the scene,
            // and allows for the selection of faces / vertices.
            m_DefaultControl = GUIUtility.GetControlID(FocusType.Passive);
            HandleUtility.AddDefaultControl(m_DefaultControl);

            if (m_CurrentEvent.type == EventType.MouseDown && HandleUtility.nearestControl == m_DefaultControl)
            {
                // double clicking object
                if (m_CurrentEvent.clickCount > 1)
                {
                    DoubleClick(m_CurrentEvent);
                }

                m_InitialMousePosition = m_CurrentEvent.mousePosition;
                // readyForMouseDrag prevents a bug wherein after ending a drag an errant
                // MouseDrag event is sent with no corresponding MouseDown/MouseUp event.
                m_IsReadyForMouseDrag = true;

                GUIUtility.hotControl = m_DefaultControl;
            }

            if (m_CurrentEvent.type == EventType.MouseDrag && m_IsReadyForMouseDrag && GUIUtility.hotControl == m_DefaultControl)
            {
                if (!m_IsDragging && Vector2.Distance(m_CurrentEvent.mousePosition, m_InitialMousePosition) > k_MouseDragThreshold)
                {
                    sceneView.Repaint();
                    m_IsDragging = true;
                }
            }

            if (m_CurrentEvent.type == EventType.Ignore)
            {
                if (m_IsDragging)
                {
                    m_IsReadyForMouseDrag = false;
                    m_IsDragging          = false;
                    EditorSceneViewPicker.DoMouseDrag(m_MouseDragRect, selectMode, m_ScenePickerPreferences);
                }

                if (m_WasDoubleClick)
                {
                    m_WasDoubleClick = false;
                }

                if (GUIUtility.hotControl == m_DefaultControl)
                {
                    GUIUtility.hotControl = 0;
                }
            }

            if (m_CurrentEvent.type == EventType.MouseUp && GUIUtility.hotControl == m_DefaultControl)
            {
                GUIUtility.hotControl = 0;

                if (m_WasDoubleClick)
                {
                    m_WasDoubleClick = false;
                }
                else
                {
                    if (!m_IsDragging)
                    {
                        if (UVEditor.instance)
                        {
                            UVEditor.instance.ResetUserPivot();
                        }

                        EditorSceneViewPicker.DoMouseClick(m_CurrentEvent, selectMode, m_ScenePickerPreferences);
                        UpdateSelection();
                        SceneView.RepaintAll();
                    }
                    else
                    {
                        m_IsDragging          = false;
                        m_IsReadyForMouseDrag = false;

                        if (UVEditor.instance)
                        {
                            UVEditor.instance.ResetUserPivot();
                        }

                        EditorSceneViewPicker.DoMouseDrag(m_MouseDragRect, selectMode, m_ScenePickerPreferences);

                        if (GUIUtility.hotControl == m_DefaultControl)
                        {
                            GUIUtility.hotControl = 0;
                        }
                    }
                }
            }
        }
Ejemplo n.º 8
0
        void DrawHandleGUI(SceneView sceneView)
        {
            if (sceneView != SceneView.lastActiveSceneView)
            {
                return;
            }

            if (m_CurrentEvent.type == EventType.Repaint &&
                !SceneDragAndDropListener.isDragging &&
                m_Hovering != null &&
                GUIUtility.hotControl == 0 &&
                HandleUtility.nearestControl == m_DefaultControl &&
                selectMode.IsMeshElementMode())
            {
                try
                {
                    EditorMeshHandles.DrawSceneSelection(m_Hovering);
                }
                catch
                {
                    // this happens on undo, when c++ object is destroyed but c# side thinks it's still alive
                }
            }

            using (new HandleGUI())
            {
                int screenWidth  = (int)sceneView.position.width;
                int screenHeight = (int)sceneView.position.height;

                switch ((SceneToolbarLocation)s_SceneToolbarLocation)
                {
                case SceneToolbarLocation.BottomCenter:
                    m_ElementModeToolbarRect.x = (screenWidth / 2 - 64);
                    m_ElementModeToolbarRect.y = screenHeight - m_ElementModeToolbarRect.height * 3;
                    break;

                case SceneToolbarLocation.BottomLeft:
                    m_ElementModeToolbarRect.x = 12;
                    m_ElementModeToolbarRect.y = screenHeight - m_ElementModeToolbarRect.height * 3;
                    break;

                case SceneToolbarLocation.BottomRight:
                    m_ElementModeToolbarRect.x = screenWidth - (m_ElementModeToolbarRect.width + 12);
                    m_ElementModeToolbarRect.y = screenHeight - m_ElementModeToolbarRect.height * 3;
                    break;

                case SceneToolbarLocation.UpperLeft:
                    m_ElementModeToolbarRect.x = 12;
                    m_ElementModeToolbarRect.y = 10;
                    break;

                case SceneToolbarLocation.UpperRight:
                    m_ElementModeToolbarRect.x = screenWidth - (m_ElementModeToolbarRect.width + 96);
                    m_ElementModeToolbarRect.y = 10;
                    break;

                default:
                case SceneToolbarLocation.UpperCenter:
                    m_ElementModeToolbarRect.x = (screenWidth / 2 - 64);
                    m_ElementModeToolbarRect.y = 10;
                    break;
                }

                selectMode = UI.EditorGUIUtility.DoElementModeToolbar(m_ElementModeToolbarRect, selectMode);

                // todo Move to VertexManipulationTool
//              if (m_IsMovingElements && s_ShowSceneInfo)
//              {
//                  string handleTransformInfo = string.Format(
//                      "translate: <b>{0}</b>\nrotate: <b>{1}</b>\nscale: <b>{2}</b>",
//                      (m_ElementHandlePosition - m_TranslateOrigin).ToString(),
//                      (m_HandleRotation.eulerAngles - m_RotateOrigin).ToString(),
//                      (m_HandleScale - m_ScaleOrigin).ToString());
//
//                  var gc = UI.EditorGUIUtility.TempContent(handleTransformInfo);
//                  // sceneview screen.height includes the tab and toolbar
//                  var toolbarHeight = EditorStyles.toolbar.CalcHeight(gc, Screen.width);
//                  var size = UI.EditorStyles.sceneTextBox.CalcSize(gc);
//
//                  Rect handleTransformInfoRect = new Rect(
//                      sceneView.position.width - (size.x + 8), sceneView.position.height - (size.y + 8 + toolbarHeight),
//                      size.x,
//                      size.y);
//
//                  GUI.Label(handleTransformInfoRect, gc, UI.EditorStyles.sceneTextBox);
//              }

                if (s_ShowSceneInfo)
                {
                    Vector2 size = UI.EditorStyles.sceneTextBox.CalcSize(m_SceneInfo);
                    m_SceneInfoRect.width  = size.x;
                    m_SceneInfoRect.height = size.y;
                    GUI.Label(m_SceneInfoRect, m_SceneInfo, UI.EditorStyles.sceneTextBox);
                }

                if (m_IsDragging)
                {
                    if (m_CurrentEvent.type == EventType.Repaint)
                    {
                        // Always draw from lowest to largest values
                        var start = Vector2.Min(m_InitialMousePosition, m_CurrentEvent.mousePosition);
                        var end   = Vector2.Max(m_InitialMousePosition, m_CurrentEvent.mousePosition);

                        m_MouseDragRect = new Rect(start.x, start.y, end.x - start.x, end.y - start.y);

                        SceneStyles.selectionRect.Draw(m_MouseDragRect, false, false, false, false);
                    }
                    else if (m_CurrentEvent.isMouse)
                    {
                        HandleUtility.Repaint();
                    }
                }
            }
        }
Ejemplo n.º 9
0
 static EditorMeshHandles Get()
 {
     if(s_Instance == null)
         s_Instance = new EditorMeshHandles();
     return s_Instance;
 }