Example #1
0
    private void    DoHandles(MapPolygon path, GUIStyle iconStyle)
    {
        Transform transform    = path.transform;
        Matrix4x4 mat          = transform.localToWorldMatrix;
        Matrix4x4 invMat       = transform.worldToLocalMatrix;
        Transform camTransform = SceneView.lastActiveSceneView.camera.transform;

        Handles.color = new Color(1, 1, 1, 1);
        for (int i = 0; i < path.GetVertsRaw().Count; i++)
        {
            // check if we want to remove points
            if (Event.current.alt)
            {
                DoResetModeHandles(path, i, mat, invMat, camTransform);
            }
            else
            {
                DoNormalModeHandles(path, i, mat, invMat, camTransform);
            }
        }

        if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Delete && selectedPoints.Count > 0)
        {
            deleteSelected = true;
            GUI.changed    = true;
            Event.current.Use();
        }

        if (deleteSelected)
        {
            DeleteSelected(path);
            deleteSelected = false;
        }
    }
Example #2
0
    private void DoNormalModeHandles(MapPolygon path, int i, Matrix4x4 mat, Matrix4x4 invMat, Transform camTransform)
    {
        List <Vector3> pathVerts  = path.GetVertsRaw();
        int            nextId     = i == path.GetVertsRaw().Count - 1?0:i + 1;
        Vector3        pos        = mat.MultiplyPoint3x4(pathVerts[i]);
        Vector3        posNext    = mat.MultiplyPoint3x4(pathVerts[nextId]);
        bool           isSelected = false;

        if (selectedPoints != null)
        {
            isSelected = selectedPoints.Contains(i);
        }

        // check for moving the point
        Handles.DrawCapFunction cap = CapDot;
        cap = isSelected ? (Handles.DrawCapFunction)CapDotSelected     : (Handles.DrawCapFunction)CapDot;

        Vector3 result = Handles.FreeMoveHandle(pos, Quaternion.Euler(Vector3.zero), HandleScale(pos), snap, cap);

        Handles.Label(pos, i.ToString(), EditorStyles.boldLabel);
        if (result != pos)
        {
            EnsureVertSelected(i, ref isSelected);

            for (int s = 0; s < selectedPoints.Count; s++)
            {
                path.UpdateVerts(selectedPoints [s], invMat.MultiplyPoint3x4(result));
                //pathVerts [selectedPoints [s]] = invMat.MultiplyPoint3x4 (result);
            }
        }

        // make sure we can add new point at the midpoints!s
        Vector3 mid         = (pos + posNext) / 2f;
        float   handleScale = HandleScale(mid);

        if (Handles.Button(mid, camTransform.rotation, handleScale, handleScale, CapDotPlus))
        {
            Vector3 pt = invMat.MultiplyPoint3x4(mid);
            path.AddPointAt(nextId, pt);
        }
    }
Example #3
0
    private void OnEnable()
    {
        MapPolygon path = (MapPolygon)target;

        if (path.GetVertsRaw().Count == 0)
        {
            path.AddPointAt(0, Vector3.zero);
            path.AddPointAt(0, new Vector3(1f, 0f, 1f));
            path.AddPointAt(0, Vector3.right);
            path.Init();
        }
        selectedPoints.Clear();
        LoadTextures();
    }
Example #4
0
    private void    DoPath(MapPolygon path)
    {
        Handles.color = Color.white;
        List <Vector3> verts = path.GetVertsRaw();
        Matrix4x4      mat   = path.transform.localToWorldMatrix;
        Vector3        pos;
        Vector3        pos2;

        for (int i = 0; i < verts.Count - 1; i++)
        {
            pos  = mat.MultiplyPoint3x4(verts[i]);
            pos2 = mat.MultiplyPoint3x4(verts[i + 1]);
            Handles.DrawLine(pos, pos2);
        }
        //连接第一个和最后一个
        pos  = mat.MultiplyPoint3x4(verts[0]);
        pos2 = mat.MultiplyPoint3x4(verts[verts.Count - 1]);
        Handles.DrawLine(pos, pos2);
    }
Example #5
0
    private void DoResetModeHandles(MapPolygon path, int i, Matrix4x4 mat, Matrix4x4 invMat, Transform camTransform)
    {
        List <Vector3> pathVerts  = path.GetVertsRaw();
        int            nextId     = i == pathVerts.Count - 1?i % pathVerts.Count:i + 1;
        Vector3        pos        = mat.MultiplyPoint3x4(pathVerts[i]);
        Vector3        posNext    = mat.MultiplyPoint3x4(pathVerts[nextId]);
        Vector3        posStart   = pos;
        bool           isSelected = false;

        if (selectedPoints != null)
        {
            isSelected = selectedPoints.Contains(i);
        }

        float handleScale = HandleScale(posStart);

        Handles.DrawCapFunction cap = (isSelected || selectedPoints.Count <= 0) ? (Handles.DrawCapFunction)CapDotMinusSelected : (Handles.DrawCapFunction)CapDotMinus;
        if (Handles.Button(posStart, camTransform.rotation, handleScale, handleScale, cap))
        {
            EnsureVertSelected(i, ref isSelected);
            deleteSelected = true;
            GUI.changed    = true;
        }
    }
Example #6
0
    private void    DragSelect(MapPolygon path)
    {
        List <Vector3> pathVerts = path.GetVertsRaw();

        if (Event.current.type == EventType.Repaint)
        {
            if (drag)
            {
                Vector3 pt1 = HandleUtility.GUIPointToWorldRay(dragStart).GetPoint(0.2f);
                Vector3 pt2 = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).GetPoint(0.2f);
                Vector3 pt3 = HandleUtility.GUIPointToWorldRay(new Vector2(dragStart.x, Event.current.mousePosition.y)).GetPoint(0.2f);
                Vector3 pt4 = HandleUtility.GUIPointToWorldRay(new Vector2(Event.current.mousePosition.x, dragStart.y)).GetPoint(0.2f);
                Handles.DrawSolidRectangleWithOutline(new Vector3[] { pt1, pt3, pt2, pt4 }, new Color(0, 0.5f, 0.25f, 0.25f), new Color(0, 0.5f, 0.25f, 0.5f));
            }
        }

        if (Event.current.shift && Event.current.control)
        {
            switch (Event.current.type)
            {
            case EventType.MouseDrag:
                SceneView.RepaintAll();
                break;

            case EventType.MouseMove:
                SceneView.RepaintAll();
                break;

            case EventType.MouseDown:
                if (Event.current.button != 0)
                {
                    break;
                }

                dragStart = Event.current.mousePosition;
                drag      = true;

                break;

            case EventType.MouseUp:
                if (Event.current.button != 0)
                {
                    break;
                }

                Vector2 dragEnd = Event.current.mousePosition;

                selectedPoints.Clear();
                for (int i = 0; i < pathVerts.Count; i++)
                {
                    float left   = Mathf.Min(dragStart.x, dragEnd.x);
                    float right  = Mathf.Max(dragStart.x, dragEnd.x);
                    float top    = Mathf.Min(dragStart.y, dragEnd.y);
                    float bottom = Mathf.Max(dragStart.y, dragEnd.y);

                    Rect r = new Rect(left, top, right - left, bottom - top);
                    if (r.Contains(HandleUtility.WorldToGUIPoint(path.transform.TransformPoint(pathVerts[i]))))
                    {
                        selectedPoints.Add(i);
                    }
                }

                HandleUtility.AddDefaultControl(0);
                drag = false;
                SceneView.RepaintAll();
                break;

            case EventType.Layout:
                HandleUtility.AddDefaultControl(GetHashCode());
                break;
            }
        }
        else if (drag == true)
        {
            drag = false;
            Repaint();
        }
    }