コード例 #1
0
        private static InputFrame DeserializeFrame(BinaryReader reader)
        {
            int frames = reader.ReadInt32();

            // Keyboard
            byte keyLength = reader.ReadByte();

            Keys[] keys = new Keys[keyLength];
            for (int i = 0; i < keyLength; i++)
            {
                keys[i] = (Keys)reader.ReadByte();
            }

            KeyboardState keyboard = new KeyboardState(keys);

            // Mouse
            int  mouseX       = reader.ReadInt32();
            int  mouseY       = reader.ReadInt32();
            int  mouseScroll  = reader.ReadInt32();
            byte mouseButtons = reader.ReadByte();

            ButtonState leftButton   = ((mouseButtons & 0b00001) == 0) ? ButtonState.Released : ButtonState.Pressed;
            ButtonState middleButton = ((mouseButtons & 0b00010) == 0) ? ButtonState.Released : ButtonState.Pressed;
            ButtonState rightButton  = ((mouseButtons & 0b00100) == 0) ? ButtonState.Released : ButtonState.Pressed;
            ButtonState xButton1     = ((mouseButtons & 0b01000) == 0) ? ButtonState.Released : ButtonState.Pressed;
            ButtonState xButton2     = ((mouseButtons & 0b10000) == 0) ? ButtonState.Released : ButtonState.Pressed;

            MouseState mouse = new MouseState(mouseX, mouseY, mouseScroll, leftButton, middleButton, rightButton, xButton1, xButton2);

            // Gamepads
            XINPUT_GAMEPAD[] pads = new XINPUT_GAMEPAD[4];
            for (int i = 0; i < 4; i++)
            {
                pads[i].Connected = reader.ReadBoolean();
                if (!pads[i].Connected)
                {
                    continue;
                }

                pads[i].Buttons      = reader.ReadUInt16();
                pads[i].LeftTrigger  = reader.ReadByte();
                pads[i].RightTrigger = reader.ReadByte();
                pads[i].ThumbLX      = reader.ReadInt16();
                pads[i].ThumbLY      = reader.ReadInt16();
                pads[i].ThumbRX      = reader.ReadInt16();
                pads[i].ThumbRY      = reader.ReadInt16();
            }

            // Create frame
            InputFrame frame = default;

            frame.frames   = frames;
            frame.keyboard = keyboard;
            frame.mouse    = mouse;
            frame.pads     = pads;
            return(frame);
        }
コード例 #2
0
        private static void UpdateButtons()
        {
            _kb    = GetActualKeyboard();
            _mouse = GetActualMouse();

            for (int i = 0; i < 4; i++)
            {
                PlayerIndex p = (PlayerIndex)i;
                PadCache[p]?.Clear();

                // Apply deadzone to allow combining of more frames in input file
                // Using a smaller deadzone than commonly used in game (0.3) to be on the safe side
                // I would use one of the XNA deadzones but the game doesn't do this either
                GamePadState   state = GetActualGamePad(p, GamePadDeadZone.None);
                XINPUT_GAMEPAD pad   = state.GetInternalState();

                if (Math.Abs(state.Triggers.Left) < 0.2f)
                {
                    pad.LeftTrigger = 0;
                }

                if (Math.Abs(state.Triggers.Right) < 0.2f)
                {
                    pad.RightTrigger = 0;
                }

                if (Math.Abs(state.ThumbSticks.Left.X) < 0.2f)
                {
                    pad.ThumbLX = 0;
                }

                if (Math.Abs(state.ThumbSticks.Left.Y) < 0.2f)
                {
                    pad.ThumbLY = 0;
                }

                if (Math.Abs(state.ThumbSticks.Right.X) < 0.2f)
                {
                    pad.ThumbRX = 0;
                }

                if (Math.Abs(state.ThumbSticks.Right.Y) < 0.2f)
                {
                    pad.ThumbRY = 0;
                }

                _pads[i] = pad;
            }
        }
コード例 #3
0
        private static void SerializeFrame(InputFrame frame)
        {
            _inputWriter.Write(frame.frames);

            // Keyboard
            Keys[] keys = frame.keyboard.GetPressedKeys();
            _inputWriter.Write((byte)keys.Length);
            for (int i = 0; i < keys.Length; i++)
            {
                _inputWriter.Write((byte)keys[i]);
            }

            // Mouse
            MouseState mouse = frame.mouse;

            _inputWriter.Write(mouse.X);
            _inputWriter.Write(mouse.Y);
            _inputWriter.Write(mouse.ScrollWheelValue);

            byte mouseButtons = (byte)mouse.LeftButton;

            mouseButtons |= (byte)((byte)mouse.MiddleButton << 1);
            mouseButtons |= (byte)((byte)mouse.RightButton << 2);
            mouseButtons |= (byte)((byte)mouse.XButton1 << 3);
            mouseButtons |= (byte)((byte)mouse.XButton2 << 4);
            _inputWriter.Write(mouseButtons);

            // GamePads
            for (int i = 0; i < 4; i++)
            {
                XINPUT_GAMEPAD pad = frame.pads[i];
                _inputWriter.Write(pad.Connected);
                if (!pad.Connected)
                {
                    continue;
                }

                _inputWriter.Write(pad.Buttons);
                _inputWriter.Write(pad.LeftTrigger);
                _inputWriter.Write(pad.RightTrigger);
                _inputWriter.Write(pad.ThumbLX);
                _inputWriter.Write(pad.ThumbLY);
                _inputWriter.Write(pad.ThumbRX);
                _inputWriter.Write(pad.ThumbRY);
            }
        }
コード例 #4
0
ファイル: BusDevice.cs プロジェクト: zhsrain/ScpToolkit
        /// <summary>
        ///     Translates an <see cref="ScpHidReport"/> to an Xbox 360 compatible byte array.
        /// </summary>
        /// <param name="inputReport">The <see cref="ScpHidReport"/> to translate.</param>
        /// <returns>The translated data as <see cref="XINPUT_GAMEPAD"/> structure.</returns>
        public XINPUT_GAMEPAD Parse(ScpHidReport inputReport)
        {
            var xButton = X360Button.None;
            var output  = new XINPUT_GAMEPAD();

            switch (inputReport.Model)
            {
            case DsModel.DS3:
            {
                // select & start
                if (inputReport[Ds3Button.Select].IsPressed)
                {
                    xButton |= X360Button.Back;
                }
                if (inputReport[Ds3Button.Start].IsPressed)
                {
                    xButton |= X360Button.Start;
                }

                // d-pad
                if (inputReport[Ds3Button.Up].IsPressed)
                {
                    xButton |= X360Button.Up;
                }
                if (inputReport[Ds3Button.Right].IsPressed)
                {
                    xButton |= X360Button.Right;
                }
                if (inputReport[Ds3Button.Down].IsPressed)
                {
                    xButton |= X360Button.Down;
                }
                if (inputReport[Ds3Button.Left].IsPressed)
                {
                    xButton |= X360Button.Left;
                }

                // shoulders
                if (inputReport[Ds3Button.L1].IsPressed)
                {
                    xButton |= X360Button.LB;
                }
                if (inputReport[Ds3Button.R1].IsPressed)
                {
                    xButton |= X360Button.RB;
                }

                // face buttons
                if (inputReport[Ds3Button.Triangle].IsPressed)
                {
                    xButton |= X360Button.Y;
                }
                if (inputReport[Ds3Button.Circle].IsPressed)
                {
                    xButton |= X360Button.B;
                }
                if (inputReport[Ds3Button.Cross].IsPressed)
                {
                    xButton |= X360Button.A;
                }
                if (inputReport[Ds3Button.Square].IsPressed)
                {
                    xButton |= X360Button.X;
                }

                // PS/Guide
                if (inputReport[Ds3Button.Ps].IsPressed)
                {
                    xButton |= X360Button.Guide;
                }

                // thumbs
                if (inputReport[Ds3Button.L3].IsPressed)
                {
                    xButton |= X360Button.LS;
                }
                if (inputReport[Ds3Button.R3].IsPressed)
                {
                    xButton |= X360Button.RS;
                }

                // face buttons
                output.wButtons = (ushort)xButton;

                // trigger
                output.bLeftTrigger  = inputReport[Ds3Axis.L2].Value;
                output.bRightTrigger = inputReport[Ds3Axis.R2].Value;

                if (!DsMath.DeadZone(GlobalConfiguration.Instance.DeadZoneL,
                                     inputReport[Ds3Axis.Lx].Value,
                                     inputReport[Ds3Axis.Ly].Value))
                // Left Stick DeadZone
                {
                    output.sThumbLX =
                        (short)
                        +DsMath.Scale(inputReport[Ds3Axis.Lx].Value, GlobalConfiguration.Instance.FlipLX);
                    output.sThumbLY =
                        (short)
                        -DsMath.Scale(inputReport[Ds3Axis.Ly].Value, GlobalConfiguration.Instance.FlipLY);
                }

                if (!DsMath.DeadZone(GlobalConfiguration.Instance.DeadZoneR,
                                     inputReport[Ds3Axis.Rx].Value,
                                     inputReport[Ds3Axis.Ry].Value))
                // Right Stick DeadZone
                {
                    output.sThumbRX =
                        (short)
                        +DsMath.Scale(inputReport[Ds3Axis.Rx].Value, GlobalConfiguration.Instance.FlipRX);
                    output.sThumbRY =
                        (short)
                        -DsMath.Scale(inputReport[Ds3Axis.Ry].Value, GlobalConfiguration.Instance.FlipRY);
                }
            }
            break;

            case DsModel.DS4:
            {
                if (inputReport[Ds4Button.Share].IsPressed)
                {
                    xButton |= X360Button.Back;
                }
                if (inputReport[Ds4Button.Options].IsPressed)
                {
                    xButton |= X360Button.Start;
                }

                if (inputReport[Ds4Button.Up].IsPressed)
                {
                    xButton |= X360Button.Up;
                }
                if (inputReport[Ds4Button.Right].IsPressed)
                {
                    xButton |= X360Button.Right;
                }
                if (inputReport[Ds4Button.Down].IsPressed)
                {
                    xButton |= X360Button.Down;
                }
                if (inputReport[Ds4Button.Left].IsPressed)
                {
                    xButton |= X360Button.Left;
                }

                if (inputReport[Ds4Button.L1].IsPressed)
                {
                    xButton |= X360Button.LB;
                }
                if (inputReport[Ds4Button.R1].IsPressed)
                {
                    xButton |= X360Button.RB;
                }

                if (inputReport[Ds4Button.Triangle].IsPressed)
                {
                    xButton |= X360Button.Y;
                }
                if (inputReport[Ds4Button.Circle].IsPressed)
                {
                    xButton |= X360Button.B;
                }
                if (inputReport[Ds4Button.Cross].IsPressed)
                {
                    xButton |= X360Button.A;
                }
                if (inputReport[Ds4Button.Square].IsPressed)
                {
                    xButton |= X360Button.X;
                }

                if (inputReport[Ds4Button.Ps].IsPressed)
                {
                    xButton |= X360Button.Guide;
                }

                if (inputReport[Ds4Button.L3].IsPressed)
                {
                    xButton |= X360Button.LS;
                }
                if (inputReport[Ds4Button.R3].IsPressed)
                {
                    xButton |= X360Button.RS;
                }

                // face buttons
                output.wButtons = (ushort)xButton;

                // trigger
                output.bLeftTrigger  = inputReport[Ds4Axis.L2].Value;
                output.bRightTrigger = inputReport[Ds4Axis.R2].Value;

                if (!DsMath.DeadZone(GlobalConfiguration.Instance.DeadZoneL,
                                     inputReport[Ds4Axis.Lx].Value,
                                     inputReport[Ds4Axis.Ly].Value))
                // Left Stick DeadZone
                {
                    output.sThumbLX =
                        (short)
                        +DsMath.Scale(inputReport[Ds4Axis.Lx].Value, GlobalConfiguration.Instance.FlipLX);
                    output.sThumbLY =
                        (short)
                        -DsMath.Scale(inputReport[Ds4Axis.Ly].Value, GlobalConfiguration.Instance.FlipLY);
                }

                if (!DsMath.DeadZone(GlobalConfiguration.Instance.DeadZoneR,
                                     inputReport[Ds4Axis.Rx].Value,
                                     inputReport[Ds4Axis.Ry].Value))
                // Right Stick DeadZone
                {
                    output.sThumbRX =
                        (short)
                        +DsMath.Scale(inputReport[Ds4Axis.Rx].Value, GlobalConfiguration.Instance.FlipRX);
                    output.sThumbRY =
                        (short)
                        -DsMath.Scale(inputReport[Ds4Axis.Ry].Value, GlobalConfiguration.Instance.FlipRY);
                }
            }
            break;
            }

            return(output);
        }
コード例 #5
0
        public static uint XInputGetState(uint dwUserIndex, ref XINPUT_STATE pState)
        {
#if !EXPERIMENTAL
            return(OriginalXInputGetStateFunction.Value(dwUserIndex, ref pState));
#else
            if (OriginalXInputGetStateFunction.Value(dwUserIndex, ref pState) == ResultWin32.ERROR_SUCCESS)
            {
                return(ResultWin32.ERROR_SUCCESS);
            }

            try
            {
                ScpHidReport report = null;

                while (dwUserIndex == 0 && (report = Proxy.GetReport(dwUserIndex)) == null)
                {
                    Thread.Sleep(100);
                }

                if (report == null || report.PadState != DsState.Connected)
                {
                    return(ResultWin32.ERROR_DEVICE_NOT_CONNECTED);
                }

                var xPad = new XINPUT_GAMEPAD();

                pState.dwPacketNumber = report.PacketCounter;

                switch (report.Model)
                {
                case DsModel.DS3:
                {
                    // select & start
                    xPad.wButtons |= (ushort)report[Ds3Button.Select].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Start].Xbox360Button;

                    // d-pad
                    xPad.wButtons |= (ushort)report[Ds3Button.Up].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Right].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Down].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Left].Xbox360Button;

                    // shoulders
                    xPad.wButtons |= (ushort)report[Ds3Button.L1].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.R1].Xbox360Button;

                    // face buttons
                    xPad.wButtons |= (ushort)report[Ds3Button.Triangle].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Circle].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Cross].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.Square].Xbox360Button;

                    // PS/Guide
                    xPad.wButtons |= (ushort)report[Ds3Button.Ps].Xbox360Button;

                    // thumbs
                    xPad.wButtons |= (ushort)report[Ds3Button.L3].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds3Button.R3].Xbox360Button;

                    // triggers
                    xPad.bLeftTrigger  = report[Ds3Axis.L2].Value;
                    xPad.bRightTrigger = report[Ds3Axis.R2].Value;

                    // thumb axes
                    xPad.sThumbLX = (short)+DsMath.Scale(report[Ds3Axis.Lx].Value, false);
                    xPad.sThumbLY = (short)-DsMath.Scale(report[Ds3Axis.Ly].Value, false);
                    xPad.sThumbRX = (short)+DsMath.Scale(report[Ds3Axis.Rx].Value, false);
                    xPad.sThumbRY = (short)-DsMath.Scale(report[Ds3Axis.Ry].Value, false);
                }
                break;

                case DsModel.DS4:
                {
                    // select & start
                    xPad.wButtons |= (ushort)report[Ds4Button.Share].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Options].Xbox360Button;

                    // d-pad
                    xPad.wButtons |= (ushort)report[Ds4Button.Up].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Right].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Down].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Left].Xbox360Button;

                    // shoulders
                    xPad.wButtons |= (ushort)report[Ds4Button.L1].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.R1].Xbox360Button;

                    // face buttons
                    xPad.wButtons |= (ushort)report[Ds4Button.Triangle].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Circle].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Cross].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.Square].Xbox360Button;

                    // PS/Guide
                    xPad.wButtons |= (ushort)report[Ds4Button.Ps].Xbox360Button;

                    // thumbs
                    xPad.wButtons |= (ushort)report[Ds4Button.L3].Xbox360Button;
                    xPad.wButtons |= (ushort)report[Ds4Button.R3].Xbox360Button;

                    // triggers
                    xPad.bLeftTrigger  = report[Ds4Axis.L2].Value;
                    xPad.bRightTrigger = report[Ds4Axis.R2].Value;

                    // thumb axes
                    xPad.sThumbLX = (short)+DsMath.Scale(report[Ds4Axis.Lx].Value, false);
                    xPad.sThumbLY = (short)-DsMath.Scale(report[Ds4Axis.Ly].Value, false);
                    xPad.sThumbRX = (short)+DsMath.Scale(report[Ds4Axis.Rx].Value, false);
                    xPad.sThumbRY = (short)-DsMath.Scale(report[Ds4Axis.Ry].Value, false);
                }
                break;
                }

                pState.Gamepad = xPad;
            }
            catch (Exception ex)
            {
                Log.ErrorFormat("Unexpected error: {0}", ex);
                return(ResultWin32.ERROR_DEVICE_NOT_CONNECTED);
            }

            return(ResultWin32.ERROR_SUCCESS);
#endif
        }
コード例 #6
0
 private static extern uint XOutputSetState(uint userIndex, ref XINPUT_GAMEPAD gamepad);
コード例 #7
0
 public void SetState(uint userIndex, XINPUT_GAMEPAD gamepad)
 {
     XOutputSetState(userIndex, ref gamepad);
 }