예제 #1
0
        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();
        }
예제 #2
0
        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();
            }
        }