cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

SDL_gamecontroller.h (14508B)


      1/*
      2  Simple DirectMedia Layer
      3  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
      4
      5  This software is provided 'as-is', without any express or implied
      6  warranty.  In no event will the authors be held liable for any damages
      7  arising from the use of this software.
      8
      9  Permission is granted to anyone to use this software for any purpose,
     10  including commercial applications, and to alter it and redistribute it
     11  freely, subject to the following restrictions:
     12
     13  1. The origin of this software must not be misrepresented; you must not
     14     claim that you wrote the original software. If you use this software
     15     in a product, an acknowledgment in the product documentation would be
     16     appreciated but is not required.
     17  2. Altered source versions must be plainly marked as such, and must not be
     18     misrepresented as being the original software.
     19  3. This notice may not be removed or altered from any source distribution.
     20*/
     21
     22/**
     23 *  \file SDL_gamecontroller.h
     24 *
     25 *  Include file for SDL game controller event handling
     26 */
     27
     28#ifndef SDL_gamecontroller_h_
     29#define SDL_gamecontroller_h_
     30
     31#include "SDL_stdinc.h"
     32#include "SDL_error.h"
     33#include "SDL_rwops.h"
     34#include "SDL_joystick.h"
     35
     36#include "begin_code.h"
     37/* Set up for C function definitions, even when using C++ */
     38#ifdef __cplusplus
     39extern "C" {
     40#endif
     41
     42/**
     43 *  \file SDL_gamecontroller.h
     44 *
     45 *  In order to use these functions, SDL_Init() must have been called
     46 *  with the ::SDL_INIT_GAMECONTROLLER flag.  This causes SDL to scan the system
     47 *  for game controllers, and load appropriate drivers.
     48 *
     49 *  If you would like to receive controller updates while the application
     50 *  is in the background, you should set the following hint before calling
     51 *  SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
     52 */
     53
     54/**
     55 * The gamecontroller structure used to identify an SDL game controller
     56 */
     57struct _SDL_GameController;
     58typedef struct _SDL_GameController SDL_GameController;
     59
     60typedef enum
     61{
     62    SDL_CONTROLLER_TYPE_UNKNOWN = 0,
     63    SDL_CONTROLLER_TYPE_XBOX360,
     64    SDL_CONTROLLER_TYPE_XBOXONE,
     65    SDL_CONTROLLER_TYPE_PS3,
     66    SDL_CONTROLLER_TYPE_PS4,
     67    SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO
     68} SDL_GameControllerType;
     69
     70typedef enum
     71{
     72    SDL_CONTROLLER_BINDTYPE_NONE = 0,
     73    SDL_CONTROLLER_BINDTYPE_BUTTON,
     74    SDL_CONTROLLER_BINDTYPE_AXIS,
     75    SDL_CONTROLLER_BINDTYPE_HAT
     76} SDL_GameControllerBindType;
     77
     78/**
     79 *  Get the SDL joystick layer binding for this controller button/axis mapping
     80 */
     81typedef struct SDL_GameControllerButtonBind
     82{
     83    SDL_GameControllerBindType bindType;
     84    union
     85    {
     86        int button;
     87        int axis;
     88        struct {
     89            int hat;
     90            int hat_mask;
     91        } hat;
     92    } value;
     93
     94} SDL_GameControllerButtonBind;
     95
     96
     97/**
     98 *  To count the number of game controllers in the system for the following:
     99 *  int nJoysticks = SDL_NumJoysticks();
    100 *  int nGameControllers = 0;
    101 *  for (int i = 0; i < nJoysticks; i++) {
    102 *      if (SDL_IsGameController(i)) {
    103 *          nGameControllers++;
    104 *      }
    105 *  }
    106 *
    107 *  Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping() you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is:
    108 *  guid,name,mappings
    109 *
    110 *  Where GUID is the string value from SDL_JoystickGetGUIDString(), name is the human readable string for the device and mappings are controller mappings to joystick ones.
    111 *  Under Windows there is a reserved GUID of "xinput" that covers any XInput devices.
    112 *  The mapping format for joystick is:
    113 *      bX - a joystick button, index X
    114 *      hX.Y - hat X with value Y
    115 *      aX - axis X of the joystick
    116 *  Buttons can be used as a controller axis and vice versa.
    117 *
    118 *  This string shows an example of a valid mapping for a controller
    119 *  "03000000341a00003608000000000000,PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7",
    120 *
    121 */
    122
    123/**
    124 *  Load a set of mappings from a seekable SDL data stream (memory or file), filtered by the current SDL_GetPlatform()
    125 *  A community sourced database of controllers is available at https://raw.github.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt
    126 *
    127 *  If \c freerw is non-zero, the stream will be closed after being read.
    128 * 
    129 * \return number of mappings added, -1 on error
    130 */
    131extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW(SDL_RWops * rw, int freerw);
    132
    133/**
    134 *  Load a set of mappings from a file, filtered by the current SDL_GetPlatform()
    135 *
    136 *  Convenience macro.
    137 */
    138#define SDL_GameControllerAddMappingsFromFile(file)   SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, "rb"), 1)
    139
    140/**
    141 *  Add or update an existing mapping configuration
    142 *
    143 * \return 1 if mapping is added, 0 if updated, -1 on error
    144 */
    145extern DECLSPEC int SDLCALL SDL_GameControllerAddMapping(const char* mappingString);
    146
    147/**
    148 *  Get the number of mappings installed
    149 *
    150 *  \return the number of mappings
    151 */
    152extern DECLSPEC int SDLCALL SDL_GameControllerNumMappings(void);
    153
    154/**
    155 *  Get the mapping at a particular index.
    156 *
    157 *  \return the mapping string.  Must be freed with SDL_free().  Returns NULL if the index is out of range.
    158 */
    159extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForIndex(int mapping_index);
    160
    161/**
    162 *  Get a mapping string for a GUID
    163 *
    164 *  \return the mapping string.  Must be freed with SDL_free().  Returns NULL if no mapping is available
    165 */
    166extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForGUID(SDL_JoystickGUID guid);
    167
    168/**
    169 *  Get a mapping string for an open GameController
    170 *
    171 *  \return the mapping string.  Must be freed with SDL_free().  Returns NULL if no mapping is available
    172 */
    173extern DECLSPEC char * SDLCALL SDL_GameControllerMapping(SDL_GameController * gamecontroller);
    174
    175/**
    176 *  Is the joystick on this index supported by the game controller interface?
    177 */
    178extern DECLSPEC SDL_bool SDLCALL SDL_IsGameController(int joystick_index);
    179
    180/**
    181 *  Get the implementation dependent name of a game controller.
    182 *  This can be called before any controllers are opened.
    183 *  If no name can be found, this function returns NULL.
    184 */
    185extern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_index);
    186
    187/**
    188 *  Get the type of a game controller.
    189 *  This can be called before any controllers are opened.
    190 */
    191extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerTypeForIndex(int joystick_index);
    192
    193/**
    194 *  Get the mapping of a game controller.
    195 *  This can be called before any controllers are opened.
    196 *
    197 *  \return the mapping string.  Must be freed with SDL_free().  Returns NULL if no mapping is available
    198 */
    199extern DECLSPEC char *SDLCALL SDL_GameControllerMappingForDeviceIndex(int joystick_index);
    200
    201/**
    202 *  Open a game controller for use.
    203 *  The index passed as an argument refers to the N'th game controller on the system.
    204 *  This index is not the value which will identify this controller in future
    205 *  controller events.  The joystick's instance id (::SDL_JoystickID) will be
    206 *  used there instead.
    207 *
    208 *  \return A controller identifier, or NULL if an error occurred.
    209 */
    210extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerOpen(int joystick_index);
    211
    212/**
    213 * Return the SDL_GameController associated with an instance id.
    214 */
    215extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromInstanceID(SDL_JoystickID joyid);
    216
    217/**
    218 * Return the SDL_GameController associated with a player index.
    219 */
    220extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromPlayerIndex(int player_index);
    221
    222/**
    223 *  Return the name for this currently opened controller
    224 */
    225extern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller);
    226
    227/**
    228 *  Return the type of this currently opened controller
    229 */
    230extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerGetType(SDL_GameController *gamecontroller);
    231
    232/**
    233 *  Get the player index of an opened game controller, or -1 if it's not available
    234 *
    235 *  For XInput controllers this returns the XInput user index.
    236 */
    237extern DECLSPEC int SDLCALL SDL_GameControllerGetPlayerIndex(SDL_GameController *gamecontroller);
    238
    239/**
    240 *  Set the player index of an opened game controller
    241 */
    242extern DECLSPEC void SDLCALL SDL_GameControllerSetPlayerIndex(SDL_GameController *gamecontroller, int player_index);
    243
    244/**
    245 *  Get the USB vendor ID of an opened controller, if available.
    246 *  If the vendor ID isn't available this function returns 0.
    247 */
    248extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetVendor(SDL_GameController * gamecontroller);
    249
    250/**
    251 *  Get the USB product ID of an opened controller, if available.
    252 *  If the product ID isn't available this function returns 0.
    253 */
    254extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProduct(SDL_GameController * gamecontroller);
    255
    256/**
    257 *  Get the product version of an opened controller, if available.
    258 *  If the product version isn't available this function returns 0.
    259 */
    260extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProductVersion(SDL_GameController * gamecontroller);
    261
    262/**
    263 *  Returns SDL_TRUE if the controller has been opened and currently connected,
    264 *  or SDL_FALSE if it has not.
    265 */
    266extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerGetAttached(SDL_GameController *gamecontroller);
    267
    268/**
    269 *  Get the underlying joystick object used by a controller
    270 */
    271extern DECLSPEC SDL_Joystick *SDLCALL SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller);
    272
    273/**
    274 *  Enable/disable controller event polling.
    275 *
    276 *  If controller events are disabled, you must call SDL_GameControllerUpdate()
    277 *  yourself and check the state of the controller when you want controller
    278 *  information.
    279 *
    280 *  The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE.
    281 */
    282extern DECLSPEC int SDLCALL SDL_GameControllerEventState(int state);
    283
    284/**
    285 *  Update the current state of the open game controllers.
    286 *
    287 *  This is called automatically by the event loop if any game controller
    288 *  events are enabled.
    289 */
    290extern DECLSPEC void SDLCALL SDL_GameControllerUpdate(void);
    291
    292
    293/**
    294 *  The list of axes available from a controller
    295 *
    296 *  Thumbstick axis values range from SDL_JOYSTICK_AXIS_MIN to SDL_JOYSTICK_AXIS_MAX,
    297 *  and are centered within ~8000 of zero, though advanced UI will allow users to set
    298 *  or autodetect the dead zone, which varies between controllers.
    299 *
    300 *  Trigger axis values range from 0 to SDL_JOYSTICK_AXIS_MAX.
    301 */
    302typedef enum
    303{
    304    SDL_CONTROLLER_AXIS_INVALID = -1,
    305    SDL_CONTROLLER_AXIS_LEFTX,
    306    SDL_CONTROLLER_AXIS_LEFTY,
    307    SDL_CONTROLLER_AXIS_RIGHTX,
    308    SDL_CONTROLLER_AXIS_RIGHTY,
    309    SDL_CONTROLLER_AXIS_TRIGGERLEFT,
    310    SDL_CONTROLLER_AXIS_TRIGGERRIGHT,
    311    SDL_CONTROLLER_AXIS_MAX
    312} SDL_GameControllerAxis;
    313
    314/**
    315 *  turn this string into a axis mapping
    316 */
    317extern DECLSPEC SDL_GameControllerAxis SDLCALL SDL_GameControllerGetAxisFromString(const char *pchString);
    318
    319/**
    320 *  turn this axis enum into a string mapping
    321 */
    322extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis);
    323
    324/**
    325 *  Get the SDL joystick layer binding for this controller button mapping
    326 */
    327extern DECLSPEC SDL_GameControllerButtonBind SDLCALL
    328SDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller,
    329                                 SDL_GameControllerAxis axis);
    330
    331/**
    332 *  Get the current state of an axis control on a game controller.
    333 *
    334 *  The state is a value ranging from -32768 to 32767 (except for the triggers,
    335 *  which range from 0 to 32767).
    336 *
    337 *  The axis indices start at index 0.
    338 */
    339extern DECLSPEC Sint16 SDLCALL
    340SDL_GameControllerGetAxis(SDL_GameController *gamecontroller,
    341                          SDL_GameControllerAxis axis);
    342
    343/**
    344 *  The list of buttons available from a controller
    345 */
    346typedef enum
    347{
    348    SDL_CONTROLLER_BUTTON_INVALID = -1,
    349    SDL_CONTROLLER_BUTTON_A,
    350    SDL_CONTROLLER_BUTTON_B,
    351    SDL_CONTROLLER_BUTTON_X,
    352    SDL_CONTROLLER_BUTTON_Y,
    353    SDL_CONTROLLER_BUTTON_BACK,
    354    SDL_CONTROLLER_BUTTON_GUIDE,
    355    SDL_CONTROLLER_BUTTON_START,
    356    SDL_CONTROLLER_BUTTON_LEFTSTICK,
    357    SDL_CONTROLLER_BUTTON_RIGHTSTICK,
    358    SDL_CONTROLLER_BUTTON_LEFTSHOULDER,
    359    SDL_CONTROLLER_BUTTON_RIGHTSHOULDER,
    360    SDL_CONTROLLER_BUTTON_DPAD_UP,
    361    SDL_CONTROLLER_BUTTON_DPAD_DOWN,
    362    SDL_CONTROLLER_BUTTON_DPAD_LEFT,
    363    SDL_CONTROLLER_BUTTON_DPAD_RIGHT,
    364    SDL_CONTROLLER_BUTTON_MAX
    365} SDL_GameControllerButton;
    366
    367/**
    368 *  turn this string into a button mapping
    369 */
    370extern DECLSPEC SDL_GameControllerButton SDLCALL SDL_GameControllerGetButtonFromString(const char *pchString);
    371
    372/**
    373 *  turn this button enum into a string mapping
    374 */
    375extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForButton(SDL_GameControllerButton button);
    376
    377/**
    378 *  Get the SDL joystick layer binding for this controller button mapping
    379 */
    380extern DECLSPEC SDL_GameControllerButtonBind SDLCALL
    381SDL_GameControllerGetBindForButton(SDL_GameController *gamecontroller,
    382                                   SDL_GameControllerButton button);
    383
    384
    385/**
    386 *  Get the current state of a button on a game controller.
    387 *
    388 *  The button indices start at index 0.
    389 */
    390extern DECLSPEC Uint8 SDLCALL SDL_GameControllerGetButton(SDL_GameController *gamecontroller,
    391                                                          SDL_GameControllerButton button);
    392
    393/**
    394 *  Trigger a rumble effect
    395 *  Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
    396 *
    397 *  \param gamecontroller The controller to vibrate
    398 *  \param low_frequency_rumble The intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF
    399 *  \param high_frequency_rumble The intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF
    400 *  \param duration_ms The duration of the rumble effect, in milliseconds
    401 *
    402 *  \return 0, or -1 if rumble isn't supported on this joystick
    403 */
    404extern DECLSPEC int SDLCALL SDL_GameControllerRumble(SDL_GameController *gamecontroller, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms);
    405
    406/**
    407 *  Close a controller previously opened with SDL_GameControllerOpen().
    408 */
    409extern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecontroller);
    410
    411
    412/* Ends C function definitions when using C++ */
    413#ifdef __cplusplus
    414}
    415#endif
    416#include "close_code.h"
    417
    418#endif /* SDL_gamecontroller_h_ */
    419
    420/* vi: set ts=4 sw=4 expandtab: */