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); } } } }
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(); } }
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); } }
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 }
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(); } } } }
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; } } } } }
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(); } } } }
static EditorMeshHandles Get() { if(s_Instance == null) s_Instance = new EditorMeshHandles(); return s_Instance; }