private void Update() { if (Input.GetMouseButtonDown(0)) { if (RuntimeTools.IsPointerOverGameObject()) { return; } if (SceneCamera == null) { Debug.LogError("Camera is null"); return; } if (RuntimeTools.IsViewing) { return; } if (RuntimeTools.ActiveTool != null) { return; } if (RuntimeEditorApplication.ActiveSceneCamera != null && !RuntimeEditorApplication.IsPointerOverWindow(RuntimeWindowType.SceneView)) { return; } Vector2 pointer = Input.mousePosition; m_dragIndex = Hit(pointer, HandlesPositions, HandlesNormals); if (m_dragIndex >= 0 && OnBeginDrag(m_dragIndex)) { m_handlesTransform = HandlesTransform; m_handlesInverseTransform = Matrix4x4.TRS(Target.position, Target.rotation, Target.localScale).inverse; // m_handlesTransform.inverse; m_dragPlane = GetDragPlane(); m_isDragging = GetPointOnDragPlane(Input.mousePosition, out m_prevPoint); m_normal = HandlesNormals[m_dragIndex].normalized; if (m_isDragging) { RuntimeTools.ActiveTool = this; } if (EnableUndo) { bool isRecording = RuntimeUndo.IsRecording; if (!isRecording) { RuntimeUndo.BeginRecord(); } RecordOverride(); if (!isRecording) { RuntimeUndo.EndRecord(); } } } } else if (Input.GetMouseButtonUp(0)) { if (m_isDragging) { OnDrop(); bool isRecording = RuntimeUndo.IsRecording; if (!isRecording) { RuntimeUndo.BeginRecord(); } RecordOverride(); if (!isRecording) { RuntimeUndo.EndRecord(); } m_isDragging = false; RuntimeTools.ActiveTool = null; } } else { if (m_isDragging) { Vector3 point; if (GetPointOnDragPlane(Input.mousePosition, out point)) { Vector3 offset = m_handlesInverseTransform.MultiplyVector(point - m_prevPoint); offset = Vector3.Project(offset, m_normal); if (InputController.GetKey(UnitSnapKey) || RuntimeTools.UnitSnapping) { Vector3 gridOffset = Vector3.zero; if (Mathf.Abs(offset.x * 1.5f) >= GridSize) { gridOffset.x = GridSize * Mathf.Sign(offset.x); } if (Mathf.Abs(offset.y * 1.5f) >= GridSize) { gridOffset.y = GridSize * Mathf.Sign(offset.y); } if (Mathf.Abs(offset.z * 1.5f) >= GridSize) { gridOffset.z = GridSize * Mathf.Sign(offset.z); } if (gridOffset != Vector3.zero) { if (OnDrag(m_dragIndex, gridOffset)) { m_prevPoint = point; } } } else { if (OnDrag(m_dragIndex, offset)) { m_prevPoint = point; } } } } } UpdateOverride(); }
private void Update() { if (!IsWindowActive) { return; } RuntimeTools tools = Editor.Tools; if (tools.ActiveTool != null && tools.ActiveTool != m_selectionComponent.BoxSelection) { return; } if (tools.IsViewing) { return; } if (!m_selectionComponent.Selection.Enabled) { return; } Vector3 v1 = Window.Camera.ScreenToWorldPoint(Window.Pointer.ScreenPoint); Vector3 v2 = Window.Camera.ScreenToWorldPoint(Window.Pointer.ScreenPoint + Vector2.up * 20); float uvMargin = (v1 - v2).sqrMagnitude / (ManualUVRenderer.Scale * ManualUVRenderer.Scale); if (SelectAction()) { Vector2 hitPoint; if (Raycast(out hitPoint)) { switch (m_tool.Mode) { case ProBuilderToolMode.Vertex: m_uvEditor.SelectVertices(uv => { float sqDistance = (uv - hitPoint).sqrMagnitude; if (sqDistance > uvMargin) { return(float.PositiveInfinity); } return(sqDistance); }, true, !SelectMultipleAction()); break; case ProBuilderToolMode.Face: m_uvEditor.SelectFaces(uv => { float sqDistance = (uv - hitPoint).sqrMagnitude; if (sqDistance > uvMargin) { return(float.PositiveInfinity); } return(sqDistance); }, true, !SelectMultipleAction()); break; default: m_uvEditor.SelectEdges((uv0, uv1) => { float sqDistance = PBMath.SqDistanceTo(uv0, uv1, hitPoint); if (sqDistance > uvMargin) { return(float.PositiveInfinity); } return(sqDistance); }, true, !SelectMultipleAction()); break; } } m_uvEditor.RefreshPivotPoint(); } }