taisei/src/gamepad.h
Andrei Alexeyev 7548e4892d
gamepad: direction snapping; more flexible configuration options
- The free/restricted axis distinction is gone; the joystick always
  operates in "free" mode.
- Added direction snapping functionality to help aid exact movement in
  cardinal and/or diagonal directions. The snapping angle can be
  adjusted from 0% (disabled) to 100% (similar to the old "restricted"
  mode). The snapping angle can also be biased towards cardinals or
  diagonals.
- When the maximum zone is less than or equals dead zone, moving
  the character will always move at maximum speed (as in the old
  "restricted" mode).
- Most of these settings are now visualized in the options menu and can
  be tested there.
2024-05-27 19:23:59 +02:00

143 lines
4.2 KiB
C

/*
* This software is licensed under the terms of the MIT License.
* See COPYING for further information.
* ---
* Copyright (c) 2011-2024, Lukas Weber <laochailan@web.de>.
* Copyright (c) 2012-2024, Andrei Alexeyev <akari@taisei-project.org>.
*/
#pragma once
#include "taisei.h"
#include "events.h"
#include "config.h"
#include <SDL.h>
typedef enum GamepadAxisDigitalValue {
AXISVAL_LEFT = -1,
AXISVAL_RIGHT = 1,
AXISVAL_UP = -1,
AXISVAL_DOWN = 1,
AXISVAL_NULL = 0
} GamepadAxisDigitalValue;
typedef enum GamepadPlrAxis {
PLRAXIS_LR, // aka X
PLRAXIS_UD, // aka Y
} GamepadPlrAxis;
typedef enum GamepadEmulatedButton {
GAMEPAD_EMULATED_BUTTON_INVALID = -1,
GAMEPAD_EMULATED_BUTTON_TRIGGER_LEFT,
GAMEPAD_EMULATED_BUTTON_TRIGGER_RIGHT,
GAMEPAD_EMULATED_BUTTON_ANALOG_STICK_UP,
GAMEPAD_EMULATED_BUTTON_ANALOG_STICK_DOWN,
GAMEPAD_EMULATED_BUTTON_ANALOG_STICK_LEFT,
GAMEPAD_EMULATED_BUTTON_ANALOG_STICK_RIGHT,
GAMEPAD_EMULATED_BUTTON_MAX,
} GamepadEmulatedButton;
typedef enum GamepadButton {
// must match SDL_GameControllerButton
GAMEPAD_BUTTON_INVALID = -1,
#ifdef __SWITCH__
GAMEPAD_BUTTON_B,
GAMEPAD_BUTTON_A,
GAMEPAD_BUTTON_Y,
GAMEPAD_BUTTON_X,
#else
GAMEPAD_BUTTON_A,
GAMEPAD_BUTTON_B,
GAMEPAD_BUTTON_X,
GAMEPAD_BUTTON_Y,
#endif
GAMEPAD_BUTTON_BACK,
GAMEPAD_BUTTON_GUIDE,
GAMEPAD_BUTTON_START,
GAMEPAD_BUTTON_STICK_LEFT,
GAMEPAD_BUTTON_STICK_RIGHT,
GAMEPAD_BUTTON_SHOULDER_LEFT,
GAMEPAD_BUTTON_SHOULDER_RIGHT,
GAMEPAD_BUTTON_DPAD_UP,
GAMEPAD_BUTTON_DPAD_DOWN,
GAMEPAD_BUTTON_DPAD_LEFT,
GAMEPAD_BUTTON_DPAD_RIGHT,
GAMEPAD_BUTTON_MISC1,
GAMEPAD_BUTTON_P1,
GAMEPAD_BUTTON_P2,
GAMEPAD_BUTTON_P3,
GAMEPAD_BUTTON_P4,
GAMEPAD_BUTTON_TOUCHPAD,
GAMEPAD_BUTTON_MAX,
GAMEPAD_BUTTON_EMULATED = 0x8000,
GAMEPAD_BUTTON_TRIGGER_LEFT = GAMEPAD_EMULATED_BUTTON_TRIGGER_LEFT | GAMEPAD_BUTTON_EMULATED,
GAMEPAD_BUTTON_TRIGGER_RIGHT = GAMEPAD_EMULATED_BUTTON_TRIGGER_RIGHT | GAMEPAD_BUTTON_EMULATED,
GAMEPAD_BUTTON_ANALOG_STICK_UP = GAMEPAD_EMULATED_BUTTON_ANALOG_STICK_UP | GAMEPAD_BUTTON_EMULATED,
GAMEPAD_BUTTON_ANALOG_STICK_DOWN = GAMEPAD_EMULATED_BUTTON_ANALOG_STICK_DOWN | GAMEPAD_BUTTON_EMULATED,
GAMEPAD_BUTTON_ANALOG_STICK_LEFT = GAMEPAD_EMULATED_BUTTON_ANALOG_STICK_LEFT | GAMEPAD_BUTTON_EMULATED,
GAMEPAD_BUTTON_ANALOG_STICK_RIGHT = GAMEPAD_EMULATED_BUTTON_ANALOG_STICK_RIGHT | GAMEPAD_BUTTON_EMULATED,
} GamepadButton;
typedef enum GamepadAxis {
// must match SDL_GameControllerAxis
GAMEPAD_AXIS_INVALID = -1,
GAMEPAD_AXIS_LEFT_X,
GAMEPAD_AXIS_LEFT_Y,
GAMEPAD_AXIS_RIGHT_X,
GAMEPAD_AXIS_RIGHT_Y,
GAMEPAD_AXIS_TRIGGER_LEFT,
GAMEPAD_AXIS_TRIGGER_RIGHT,
GAMEPAD_AXIS_MAX
} GamepadAxis;
enum {
GAMEPAD_DEVNUM_INVALID = -1,
GAMEPAD_DEVNUM_ANY = -2,
};
void gamepad_init(void);
void gamepad_shutdown(void);
bool gamepad_initialized(void);
void gamepad_event(SDL_Event*, EventHandler, EventFlags, void*);
int gamepad_device_count(void);
const char* gamepad_device_name(int);
void gamepad_device_guid(int num, char *guid_str, size_t guid_str_sz);
int gamepad_device_num_from_guid(const char *guid_str);
int gamepad_get_active_device(void);
bool gamepad_update_devices(void);
bool gamepad_button_pressed(GamepadButton btn);
bool gamepad_game_key_pressed(KeyIndex key);
const char* gamepad_button_name(GamepadButton btn);
const char* gamepad_axis_name(GamepadAxis btn);
GamepadButton gamepad_button_from_name(const char *name);
GamepadAxis gamepad_axis_from_name(const char *name);
GamepadButton gamepad_button_from_axis(GamepadAxis axis, GamepadAxisDigitalValue dval);
GamepadButton gamepad_button_from_sdl_button(SDL_GameControllerButton btn);
SDL_GameControllerButton gamepad_button_to_sdl_button(GamepadButton btn);
GamepadAxis gamepad_axis_from_sdl_axis(SDL_GameControllerAxis axis);
SDL_GameControllerAxis gamepad_axis_to_sdl_axis(GamepadAxis axis);
int gamepad_axis_value(GamepadAxis paxis);
int gamepad_player_axis_value(GamepadPlrAxis paxis);
void gamepad_get_player_analog_input(int *xaxis, int *yaxis);
double gamepad_normalize_axis_value(int val);
int gamepad_denormalize_axis_value(double val);
double gamepad_get_normalized_deadzone(void);
double gamepad_get_normalized_maxzone(void);
#define GAMEPAD_AXIS_MAX_VALUE 32767
#define GAMEPAD_AXIS_MIN_VALUE -32768