Esempio n. 1
0
    void window_RenderFrame(object sender, OpenTK.FrameEventArgs e)
    {
        UpdateMousePositionArgs a = new UpdateMousePositionArgs();
        UpdateMousePosition(a);
        if (!TouchTest)
        {
            foreach (MouseEventHandler h in mouseEventHandlers)
            {
                MouseEventArgs args2 = new MouseEventArgs();
                args2.SetX(a.mouseCurrentX);
                args2.SetY(a.mouseCurrentY);
                args2.SetMovementX((int)a.mouseDeltaX);
                args2.SetMovementY((int)a.mouseDeltaY);
                h.OnMouseMove(args2);
            }
        }

        foreach (NewFrameHandler h in newFrameHandlers)
        {
            NewFrameEventArgs args = new NewFrameEventArgs();
            args.SetDt((float)e.Time);
            h.OnNewFrame(args);
        }
        window.SwapBuffers();
    }
Esempio n. 2
0
    void UpdateMousePosition(UpdateMousePositionArgs args)
    {
        args.mouseCurrentX = System.Windows.Forms.Cursor.Position.X;
        args.mouseCurrentY = System.Windows.Forms.Cursor.Position.Y;
        if (!mousePointerLocked)
        {
            args.mouseCurrentX = args.mouseCurrentX - window.X;
            args.mouseCurrentY = args.mouseCurrentY - window.Y;

            args.mouseCurrentY = args.mouseCurrentY - System.Windows.Forms.SystemInformation.CaptionHeight;

            args.mouseDeltaX = args.mouseCurrentX - mouse_previous.X;
            args.mouseDeltaY = args.mouseCurrentY - mouse_previous.Y;
            mouse_previous.X = args.mouseCurrentX;
            mouse_previous.Y = args.mouseCurrentY;
        }
        if (!window.Focused)
        {
            return;
        }
        if (mousePointerLocked && (!wasMousePointerLocked))
        {
            mouse_previous.X = args.mouseCurrentX;
            mouse_previous.Y = args.mouseCurrentY;
            args.freemousejustdisabled = false;
        }
        wasMousePointerLocked = mousePointerLocked;
        if (mousePointerLocked)
        {
            //There are two versions:

            //a) System.Windows.Forms.Cursor and GameWindow.CursorVisible = true.
            //It works by centering global mouse cursor every frame.
            //*Windows:
            //   *OK.
            //   *On a few YouTube videos mouse cursor is not hiding properly.
            //    That could be just a problem with video recording software.
            //*Ubuntu: Broken, mouse cursor doesn't hide.
            //*Mac: Broken, mouse doesn't move at all.

            //b) OpenTk.Input.Mouse and GameWindow.CursorVisible = false.
            //Uses raw mouse coordinates, movement is not accelerated.
            //*Windows:
            //  *OK.
            //  *Worse than a), because this doesn't use system-wide mouse acceleration.
            //*Ubuntu: Broken, crashes with "libxi" library missing.
            //*Mac: OK.

            if (!IsMac)
            {
                //a)
                int centerx = window.Bounds.Left + (window.Bounds.Width / 2);
                int centery = window.Bounds.Top + (window.Bounds.Height / 2);

                args.mouseDeltaX = args.mouseCurrentX - mouse_previous.X;
                args.mouseDeltaY = args.mouseCurrentY - mouse_previous.Y;

                System.Windows.Forms.Cursor.Position =
                    new Point(centerx, centery);
                mouse_previous = new Point(centerx, centery);
            }
            else
            {
                //b)
                var state = OpenTK.Input.Mouse.GetState();
                float dx = state.X - mouse_previous_state.X;
                float dy = state.Y - mouse_previous_state.Y;
                mouse_previous_state = state;
                //These are raw coordinates, so need to apply acceleration manually.
                float dx2 = (dx * Math.Abs(dx) * MouseAcceleration1);
                float dy2 = (dy * Math.Abs(dy) * MouseAcceleration1);
                dx2 += dx * MouseAcceleration2;
                dy2 += dy * MouseAcceleration2;
                args.mouseDeltaX = dx2;
                args.mouseDeltaY = dy2;
            }
        }
    }