Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Virtual Joysticks (new joystick backend) #3585

Closed
SDLBugzilla opened this issue Feb 11, 2021 · 0 comments
Closed

Virtual Joysticks (new joystick backend) #3585

SDLBugzilla opened this issue Feb 11, 2021 · 0 comments

Comments

@SDLBugzilla
Copy link
Collaborator

SDLBugzilla commented Feb 11, 2021

This bug report was migrated from our old Bugzilla tracker.

These attachments are available in the static archive:

Reported in version: HG 2.0
Reported for operating system, platform: All, All

Comments on the original bug report:

On 2020-03-13 18:53:15 +0000, David Ludwig wrote:

Created attachment 4254
patch # 1, based against SDL 2.0.12

I have created a new driver for SDL's Joystick and Game-Controller subsystem: a Virtual driver. This driver allows one to create a software-based joystick, which to SDL applications will look and react like a real joystick, but whose state can be set programmatically. A primary use case for this is to help enable developers to add touch-screen joysticks to their apps.

The driver comes with a set of new, public APIs, with functions to attach and detach joysticks, set virtual-joystick state, and to determine if a joystick is a virtual-one.

Use of virtual joysticks goes as such:

  1. Attach one or more virtual joysticks by calling SDL_JoystickAttachVirtual. If successful, this returns the virtual-device's joystick-index.
  2. Open the virtual joysticks (using indicies returned by SDL_JoystickAttachVirtual).
  3. Call any of the SDL_JoystickSetVirtual* functions when joystick-state changes. Please note that virtual-joystick state will only get applied on the next call to SDL_JoystickUpdate, or when pumping or polling for SDL events (via SDL_PumpEvents or SDL_PollEvent).

Here is a listing of the new, public APIs, at present and subject to change:


/**

  • Attaches a new virtual joystick.
  • Returns the joystick's device index, or -1 if an error occurred.
    */
    extern DECLSPEC int SDLCALL SDL_JoystickAttachVirtual(SDL_JoystickType type, int naxes, int nballs, int nbuttons, int nhats);

/**

  • Detaches a virtual joystick
  • Returns 0 on success, or -1 if an error occurred.
    */
    extern DECLSPEC int SDLCALL SDL_JoystickDetachVirtual(int device_index);

/**

  • Indicates whether or not a virtual-joystick is at a given device index.
    */
    extern DECLSPEC SDL_bool SDLCALL SDL_JoystickIsVirtual(int device_index);

/**

  • Set values on an opened, virtual-joystick's controls.
  • Returns 0 on success, -1 on error.
    */
    extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualAxis(SDL_Joystick * joystick, int axis, Sint16 value);
    extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualBall(SDL_Joystick * joystick, int ball, Sint16 xrel, Sint16 yrel);
    extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualButton(SDL_Joystick * joystick, int button, Uint8 value);
    extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualHat(SDL_Joystick * joystick, int hat, Uint8 value);

Miscellaneous notes on the initial patch, which are also subject to change:

  1. no test code is present in SDL, yet. This should, perhaps, change. Initial development was done with an ImGui-based app, which potentially is too thick for use in SDL-official. If tests are to be added, what kind of tests? Automated? Graphical?

  2. virtual game controllers can be created by calling SDL_JoystickAttachVirtual with a joystick-type of SDL_JOYSTICK_TYPE_GAME_CONTROLLER, with naxes (num axes) set to SDL_CONTROLLER_AXIS_MAX, and with nbuttons (num buttons) set to SDL_CONTROLLER_BUTTON_MAX. When updating their state, values of type SDL_GameControllerAxis or SDL_GameControllerButton can be casted to an int and used for the control-index (in calls to SDL_JoystickSetVirtual* functions).

  3. virtual joysticks' guids are mostly all-zeros with the exception of the last two bytes, the first of which is a 'v', to indicate that the guid is a virtual one, and the second of which is a SDL_JoystickType that has been converted into a Uint8.

  4. virtual joysticks are ONLY turned into virtual game-controllers if and when their joystick-type is set to SDL_JOYSTICK_TYPE_GAMECONTROLLER. This is controlled by having SDL's default list of game-controllers have a single entry for a virtual game controller (of guid, "00000000000000000000000000007601", which is subject to the guid-encoding described above).

  5. regarding having to call SDL_JoystickUpdate, either directly or indirectly via SDL_PumpEvents or SDL_PollEvents, before new virtual-joystick state becomes active (as specified via SDL_JoystickSetVirtual* function-calls), this was done to match behavior found in SDL's other joystick drivers, almost all of which will only update SDL-state during SDL_JoystickUpdate.

  6. the initial patch is based off of SDL 2.0.12

  7. the virtual joystick subsystem is disabled by default. It should be possible to enable it by building with SDL_JOYSTICK_VIRTUAL=1

Questions, comments, suggestions, or bug reports very welcome!

On 2020-03-13 19:05:16 +0000, David Ludwig wrote:

To note, I am currently hosting my own development of this at https://osdn.net/projects/sdl-dll/scm/hg/sdl-dll/commits?branch=virtual-joysticks

On 2020-03-13 19:16:43 +0000, David Ludwig wrote:

My hg repo on osdn.net is, as of this writing, having some issues when pushing, so it is a few commits behind. The patch attached to this bugzilla case is, however, up to date.

On 2020-03-13 19:30:00 +0000, David Ludwig wrote:

Ok, my repo's back up, and the latest changes are now there.

On 2020-03-14 02:11:06 +0000, Sam Lantinga wrote:

Patch added!
https://hg.libsdl.org/SDL/rev/958bd91f4f4c

A few things to do off the top of my head:

  • Add autotools build support
  • Add the new files to the Windows and Mac projects
  • Remove ball support (really, nobody uses this)

On 2020-03-14 20:01:35 +0000, Malte Kießling wrote:

Created attachment 4255
patch for the build error in SDL_sysjoystick.c

I get a build error in SDL_sysjoystick.c:74 for the merged patch, but its nothing to sweat about, just -Werror=declaration-after-statement doing its usual stuff.

Have a nice weekend folks :) And don't overstock on toilet paper, it tastes horrible!

On 2020-03-15 00:45:33 +0000, Sam Lantinga wrote:

Patch added, thanks!
https://hg.libsdl.org/SDL/rev/d195863f8226

We're running low though, and the local stores are all out...

On 2020-03-15 17:39:17 +0000, David Ludwig wrote:

I removed ball support, and will try to work on additional build system support, within the next few days.

Good luck wherever y'all are at. It does look like Amazon, at least, still has toilet paper in stock, though I've yet to try it myself (and might be, soon enough!)

On 2020-03-15 17:42:13 +0000, David Ludwig wrote:

For posterity and convenience, here is a link to the ball-removal change: https://hg.libsdl.org/SDL/rev/4377c59b636e

I also added a bit more documentation to SDL_joystick.h, regarding SDL_JoystickSetVirtual* calls and the need to invoke SDL_JoystickUpdate: https://hg.libsdl.org/SDL/rev/c88387a1e0e2

On 2020-03-16 04:29:38 +0000, David Ludwig wrote:

More commits to this are in SDL hg's default branch:

Xcode build support was added via https://hg.libsdl.org/SDL/rev/a9723f168294

Windows+MSVC support was added via two changes: https://hg.libsdl.org/SDL/rev/a0ab6d4ff5e7 and https://hg.libsdl.org/SDL/rev/4ee09b18876b

autotools-build support was added via https://hg.libsdl.org/SDL/rev/49320151ca4d

Please note that virtual joystick support is currently disabled, by default, in all builds.

On 2020-04-10 19:35:05 +0000, David Ludwig wrote:

Ick, I noticed that virtual joysticks are, in fact, enabled-by-default for CMake-made builds.

Should I assume that this ought to be disabled, for now?

On 2020-04-13 15:19:40 +0000, Sam Lantinga wrote:

(In reply to David Ludwig from comment # 10)

Ick, I noticed that virtual joysticks are, in fact, enabled-by-default for
CMake-made builds.

Should I assume that this ought to be disabled, for now?

I went ahead and enabled it by default for autoconf builds as well:
https://hg.libsdl.org/SDL/rev/5ccab1c0bdd9

... and for all the other builds too:
https://hg.libsdl.org/SDL/rev/e4fe9547334c

With this, I'm going to mark this bug complete. Feel free to open new ones if you want to add functionality or find other bugs.

On 2020-04-13 23:09:08 +0000, David Ludwig wrote:

That’s great news. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant