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

let ports set default controls #795

Merged
merged 10 commits into from
Jan 29, 2025
38 changes: 0 additions & 38 deletions cmake/cvars.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,6 @@ set(CVAR_MENU_BAR_OPEN "gOpenMenuBar" CACHE STRING "")
set(CVAR_PREFIX_CONTROLLERS "gControllers" CACHE STRING "")
set(CVAR_PREFIX_ADVANCED_RESOLUTION "gAdvancedResolution" CACHE STRING "")

set(LUS_DEFAULT_KB_MAPPING_A KbScancode::LUS_KB_X CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_B KbScancode::LUS_KB_C CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_L KbScancode::LUS_KB_E CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_R KbScancode::LUS_KB_R CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_Z KbScancode::LUS_KB_Z CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_START KbScancode::LUS_KB_SPACE CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_STICKUP KbScancode::LUS_KB_W CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_STICKDOWN KbScancode::LUS_KB_S CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_STICKLEFT KbScancode::LUS_KB_A CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_STICKRIGHT KbScancode::LUS_KB_D CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_CUP KbScancode::LUS_KB_ARROWKEY_UP CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_CDOWN KbScancode::LUS_KB_ARROWKEY_DOWN CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_CLEFT KbScancode::LUS_KB_ARROWKEY_LEFT CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_CRIGHT KbScancode::LUS_KB_ARROWKEY_RIGHT CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_DUP KbScancode::LUS_KB_T CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_DDOWN KbScancode::LUS_KB_G CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_DLEFT KbScancode::LUS_KB_F CACHE STRING "")
set(LUS_DEFAULT_KB_MAPPING_DRIGHT KbScancode::LUS_KB_H CACHE STRING "")

add_compile_definitions(
CVAR_VSYNC_ENABLED="${CVAR_VSYNC_ENABLED}"
CVAR_Z_FIGHTING_MODE="${CVAR_Z_FIGHTING_MODE}"
Expand All @@ -63,23 +44,4 @@ add_compile_definitions(
CVAR_MENU_BAR_OPEN="${CVAR_MENU_BAR_OPEN}"
CVAR_PREFIX_CONTROLLERS="${CVAR_PREFIX_CONTROLLERS}"
CVAR_PREFIX_ADVANCED_RESOLUTION="${CVAR_PREFIX_ADVANCED_RESOLUTION}"

LUS_DEFAULT_KB_MAPPING_A=${LUS_DEFAULT_KB_MAPPING_A}
LUS_DEFAULT_KB_MAPPING_B=${LUS_DEFAULT_KB_MAPPING_B}
LUS_DEFAULT_KB_MAPPING_L=${LUS_DEFAULT_KB_MAPPING_L}
LUS_DEFAULT_KB_MAPPING_R=${LUS_DEFAULT_KB_MAPPING_R}
LUS_DEFAULT_KB_MAPPING_Z=${LUS_DEFAULT_KB_MAPPING_Z}
LUS_DEFAULT_KB_MAPPING_START=${LUS_DEFAULT_KB_MAPPING_START}
LUS_DEFAULT_KB_MAPPING_STICKUP=${LUS_DEFAULT_KB_MAPPING_STICKUP}
LUS_DEFAULT_KB_MAPPING_STICKDOWN=${LUS_DEFAULT_KB_MAPPING_STICKDOWN}
LUS_DEFAULT_KB_MAPPING_STICKLEFT=${LUS_DEFAULT_KB_MAPPING_STICKLEFT}
LUS_DEFAULT_KB_MAPPING_STICKRIGHT=${LUS_DEFAULT_KB_MAPPING_STICKRIGHT}
LUS_DEFAULT_KB_MAPPING_CUP=${LUS_DEFAULT_KB_MAPPING_CUP}
LUS_DEFAULT_KB_MAPPING_CDOWN=${LUS_DEFAULT_KB_MAPPING_CDOWN}
LUS_DEFAULT_KB_MAPPING_CLEFT=${LUS_DEFAULT_KB_MAPPING_CLEFT}
LUS_DEFAULT_KB_MAPPING_CRIGHT=${LUS_DEFAULT_KB_MAPPING_CRIGHT}
LUS_DEFAULT_KB_MAPPING_DUP=${LUS_DEFAULT_KB_MAPPING_DUP}
LUS_DEFAULT_KB_MAPPING_DDOWN=${LUS_DEFAULT_KB_MAPPING_DDOWN}
LUS_DEFAULT_KB_MAPPING_DLEFT=${LUS_DEFAULT_KB_MAPPING_DLEFT}
LUS_DEFAULT_KB_MAPPING_DRIGHT=${LUS_DEFAULT_KB_MAPPING_DRIGHT}
)
18 changes: 15 additions & 3 deletions src/controller/controldeck/ControlDeck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@

namespace Ship {

ControlDeck::ControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks) {
ControlDeck::ControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks,
std::shared_ptr<ControllerDefaultMappings> controllerDefaultMappings) {
mConnectedPhysicalDeviceManager = std::make_shared<ConnectedPhysicalDeviceManager>();
mGlobalSDLDeviceSettings = std::make_shared<GlobalSDLDeviceSettings>();
mControllerDefaultMappings = controllerDefaultMappings == nullptr ? std::make_shared<ControllerDefaultMappings>()
: controllerDefaultMappings;
}

ControlDeck::~ControlDeck() {
Expand Down Expand Up @@ -110,16 +113,25 @@ std::shared_ptr<ConnectedPhysicalDeviceManager> ControlDeck::GetConnectedPhysica
std::shared_ptr<GlobalSDLDeviceSettings> ControlDeck::GetGlobalSDLDeviceSettings() {
return mGlobalSDLDeviceSettings;
}

std::shared_ptr<ControllerDefaultMappings> ControlDeck::GetControllerDefaultMappings() {
return mControllerDefaultMappings;
}
} // namespace Ship

namespace LUS {
ControlDeck::ControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks)
: Ship::ControlDeck(additionalBitmasks), mPads(nullptr) {
ControlDeck::ControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks,
std::shared_ptr<Ship::ControllerDefaultMappings> controllerDefaultMappings)
: Ship::ControlDeck(additionalBitmasks, controllerDefaultMappings), mPads(nullptr) {
for (int32_t i = 0; i < MAXCONTROLLERS; i++) {
mPorts.push_back(std::make_shared<Ship::ControlPort>(i, std::make_shared<Controller>(i, additionalBitmasks)));
}
}

ControlDeck::ControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks)
: ControlDeck(additionalBitmasks, nullptr) {
}

ControlDeck::ControlDeck() : ControlDeck(std::vector<CONTROLLERBUTTONS_T>()) {
}

Expand Down
8 changes: 7 additions & 1 deletion src/controller/controldeck/ControlDeck.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
#include "controller/controldevice/controller/mapping/keyboard/KeyboardScancodes.h"
#include "controller/physicaldevice/ConnectedPhysicalDeviceManager.h"
#include "controller/physicaldevice/GlobalSDLDeviceSettings.h"
#include "controller/controldevice/controller/mapping/ControllerDefaultMappings.h"

namespace Ship {

class ControlDeck {
public:
ControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks);
ControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks,
std::shared_ptr<ControllerDefaultMappings> controllerDefaultMappings);
~ControlDeck();

void Init(uint8_t* controllerBits);
Expand All @@ -28,6 +30,7 @@ class ControlDeck {

std::shared_ptr<ConnectedPhysicalDeviceManager> GetConnectedPhysicalDeviceManager();
std::shared_ptr<GlobalSDLDeviceSettings> GetGlobalSDLDeviceSettings();
std::shared_ptr<ControllerDefaultMappings> GetControllerDefaultMappings();

protected:
bool AllGameInputBlocked();
Expand All @@ -38,6 +41,7 @@ class ControlDeck {
std::unordered_map<int32_t, bool> mGameInputBlockers;
std::shared_ptr<ConnectedPhysicalDeviceManager> mConnectedPhysicalDeviceManager;
std::shared_ptr<GlobalSDLDeviceSettings> mGlobalSDLDeviceSettings;
std::shared_ptr<ControllerDefaultMappings> mControllerDefaultMappings;
};
} // namespace Ship

Expand All @@ -46,6 +50,8 @@ class ControlDeck : public Ship::ControlDeck {
public:
ControlDeck();
ControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks);
ControlDeck(std::vector<CONTROLLERBUTTONS_T> additionalBitmasks,
std::shared_ptr<Ship::ControllerDefaultMappings> controllerDefaultMappings);

OSContPad* GetPads();
void WriteToPad(void* pad) override;
Expand Down
1 change: 1 addition & 0 deletions src/controller/controldevice/controller/Controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ void Controller::AddDefaultMappings(PhysicalDeviceType physicalDeviceType) {
button->AddDefaultMappings(physicalDeviceType);
}
GetLeftStick()->AddDefaultMappings(physicalDeviceType);
GetRightStick()->AddDefaultMappings(physicalDeviceType);
GetRumble()->AddDefaultMappings(physicalDeviceType);

const std::string hasConfigCvarKey =
Expand Down
6 changes: 4 additions & 2 deletions src/controller/controldevice/controller/ControllerButton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,10 @@ bool ControllerButton::ProcessMouseButtonEvent(bool isPressed, MouseBtn button)
}

void ControllerButton::AddDefaultMappings(PhysicalDeviceType physicalDeviceType) {
for (auto mapping : ButtonMappingFactory::CreateDefaultSDLButtonMappings(mPortIndex, mBitmask)) {
AddButtonMapping(mapping);
if (physicalDeviceType == PhysicalDeviceType::SDLGamepad) {
for (auto mapping : ButtonMappingFactory::CreateDefaultSDLButtonMappings(mPortIndex, mBitmask)) {
AddButtonMapping(mapping);
}
}

if (physicalDeviceType == PhysicalDeviceType::Keyboard) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
#include "ControllerDefaultMappings.h"
#include "libultraship/libultra/controller.h"

namespace Ship {
ControllerDefaultMappings::ControllerDefaultMappings(
std::unordered_map<CONTROLLERBUTTONS_T, std::unordered_set<KbScancode>> defaultKeyboardKeyToButtonMappings,
std::unordered_map<StickIndex, std::vector<std::pair<Direction, KbScancode>>>
defaultKeyboardKeyToAxisDirectionMappings,
std::unordered_map<CONTROLLERBUTTONS_T, std::unordered_set<SDL_GameControllerButton>>
defaultSDLButtonToButtonMappings,
std::unordered_map<StickIndex, std::vector<std::pair<Direction, SDL_GameControllerButton>>>
defaultSDLButtonToAxisDirectionMappings,
std::unordered_map<CONTROLLERBUTTONS_T, std::vector<std::pair<SDL_GameControllerAxis, int32_t>>>
defaultSDLAxisDirectionToButtonMappings,
std::unordered_map<StickIndex, std::vector<std::pair<Direction, std::pair<SDL_GameControllerAxis, int32_t>>>>
defaultSDLAxisDirectionToAxisDirectionMappings) {
SetDefaultKeyboardKeyToButtonMappings(defaultKeyboardKeyToButtonMappings);
SetDefaultKeyboardKeyToAxisDirectionMappings(defaultKeyboardKeyToAxisDirectionMappings);

SetDefaultSDLButtonToButtonMappings(defaultSDLButtonToButtonMappings);
SetDefaultSDLButtonToAxisDirectionMappings(defaultSDLButtonToAxisDirectionMappings);

SetDefaultSDLAxisDirectionToButtonMappings(defaultSDLAxisDirectionToButtonMappings);
SetDefaultSDLAxisDirectionToAxisDirectionMappings(defaultSDLAxisDirectionToAxisDirectionMappings);
}

ControllerDefaultMappings::ControllerDefaultMappings()
: ControllerDefaultMappings(
std::unordered_map<CONTROLLERBUTTONS_T, std::unordered_set<KbScancode>>(),
std::unordered_map<StickIndex, std::vector<std::pair<Direction, KbScancode>>>(),
std::unordered_map<CONTROLLERBUTTONS_T, std::unordered_set<SDL_GameControllerButton>>(),
std::unordered_map<StickIndex, std::vector<std::pair<Direction, SDL_GameControllerButton>>>(),
std::unordered_map<CONTROLLERBUTTONS_T, std::vector<std::pair<SDL_GameControllerAxis, int32_t>>>(),
std::unordered_map<StickIndex,
std::vector<std::pair<Direction, std::pair<SDL_GameControllerAxis, int32_t>>>>()) {
}

ControllerDefaultMappings::~ControllerDefaultMappings() {
}

std::unordered_map<CONTROLLERBUTTONS_T, std::unordered_set<KbScancode>>
ControllerDefaultMappings::GetDefaultKeyboardKeyToButtonMappings() {
return mDefaultKeyboardKeyToButtonMappings;
}

void ControllerDefaultMappings::SetDefaultKeyboardKeyToButtonMappings(
std::unordered_map<CONTROLLERBUTTONS_T, std::unordered_set<KbScancode>> defaultKeyboardKeyToButtonMappings) {
if (!defaultKeyboardKeyToButtonMappings.empty()) {
mDefaultKeyboardKeyToButtonMappings = defaultKeyboardKeyToButtonMappings;
return;
}

mDefaultKeyboardKeyToButtonMappings[BTN_A] = { KbScancode::LUS_KB_X };
mDefaultKeyboardKeyToButtonMappings[BTN_B] = { KbScancode::LUS_KB_C };
mDefaultKeyboardKeyToButtonMappings[BTN_L] = { KbScancode::LUS_KB_E };
mDefaultKeyboardKeyToButtonMappings[BTN_R] = { KbScancode::LUS_KB_R };
mDefaultKeyboardKeyToButtonMappings[BTN_Z] = { KbScancode::LUS_KB_Z };
mDefaultKeyboardKeyToButtonMappings[BTN_START] = { KbScancode::LUS_KB_SPACE };
mDefaultKeyboardKeyToButtonMappings[BTN_CUP] = { KbScancode::LUS_KB_ARROWKEY_UP };
mDefaultKeyboardKeyToButtonMappings[BTN_CDOWN] = { KbScancode::LUS_KB_ARROWKEY_DOWN };
mDefaultKeyboardKeyToButtonMappings[BTN_CLEFT] = { KbScancode::LUS_KB_ARROWKEY_LEFT };
mDefaultKeyboardKeyToButtonMappings[BTN_CRIGHT] = { KbScancode::LUS_KB_ARROWKEY_RIGHT };
mDefaultKeyboardKeyToButtonMappings[BTN_DUP] = { KbScancode::LUS_KB_T };
mDefaultKeyboardKeyToButtonMappings[BTN_DDOWN] = { KbScancode::LUS_KB_G };
mDefaultKeyboardKeyToButtonMappings[BTN_DLEFT] = { KbScancode::LUS_KB_F };
mDefaultKeyboardKeyToButtonMappings[BTN_DRIGHT] = { KbScancode::LUS_KB_H };
}

std::unordered_map<StickIndex, std::vector<std::pair<Direction, KbScancode>>>
ControllerDefaultMappings::GetDefaultKeyboardKeyToAxisDirectionMappings() {
return mDefaultKeyboardKeyToAxisDirectionMappings;
}

void ControllerDefaultMappings::SetDefaultKeyboardKeyToAxisDirectionMappings(
std::unordered_map<StickIndex, std::vector<std::pair<Direction, KbScancode>>>
defaultKeyboardKeyToAxisDirectionMappings) {
if (!defaultKeyboardKeyToAxisDirectionMappings.empty()) {
mDefaultKeyboardKeyToAxisDirectionMappings = defaultKeyboardKeyToAxisDirectionMappings;
return;
}

mDefaultKeyboardKeyToAxisDirectionMappings[LEFT_STICK] = { { LEFT, KbScancode::LUS_KB_A },
{ RIGHT, KbScancode::LUS_KB_D },
{ UP, KbScancode::LUS_KB_W },
{ DOWN, KbScancode::LUS_KB_S } };
}

std::unordered_map<CONTROLLERBUTTONS_T, std::unordered_set<SDL_GameControllerButton>>
ControllerDefaultMappings::GetDefaultSDLButtonToButtonMappings() {
return mDefaultSDLButtonToButtonMappings;
}

void ControllerDefaultMappings::SetDefaultSDLButtonToButtonMappings(
std::unordered_map<CONTROLLERBUTTONS_T, std::unordered_set<SDL_GameControllerButton>>
defaultSDLButtonToButtonMappings) {
if (!defaultSDLButtonToButtonMappings.empty()) {
mDefaultSDLButtonToButtonMappings = defaultSDLButtonToButtonMappings;
return;
}

mDefaultSDLButtonToButtonMappings[BTN_A] = { SDL_CONTROLLER_BUTTON_A };
mDefaultSDLButtonToButtonMappings[BTN_B] = { SDL_CONTROLLER_BUTTON_B };
mDefaultSDLButtonToButtonMappings[BTN_L] = { SDL_CONTROLLER_BUTTON_LEFTSHOULDER };
mDefaultSDLButtonToButtonMappings[BTN_START] = { SDL_CONTROLLER_BUTTON_START };
mDefaultSDLButtonToButtonMappings[BTN_DUP] = { SDL_CONTROLLER_BUTTON_DPAD_UP };
mDefaultSDLButtonToButtonMappings[BTN_DDOWN] = { SDL_CONTROLLER_BUTTON_DPAD_DOWN };
mDefaultSDLButtonToButtonMappings[BTN_DLEFT] = { SDL_CONTROLLER_BUTTON_DPAD_LEFT };
mDefaultSDLButtonToButtonMappings[BTN_DRIGHT] = { SDL_CONTROLLER_BUTTON_DPAD_RIGHT };
}

std::unordered_map<StickIndex, std::vector<std::pair<Direction, SDL_GameControllerButton>>>
ControllerDefaultMappings::GetDefaultSDLButtonToAxisDirectionMappings() {
return mDefaultSDLButtonToAxisDirectionMappings;
}

void ControllerDefaultMappings::SetDefaultSDLButtonToAxisDirectionMappings(
std::unordered_map<StickIndex, std::vector<std::pair<Direction, SDL_GameControllerButton>>>
defaultSDLButtonToAxisDirectionMappings) {
if (!defaultSDLButtonToAxisDirectionMappings.empty()) {
mDefaultSDLButtonToAxisDirectionMappings = defaultSDLButtonToAxisDirectionMappings;
return;
}
}

std::unordered_map<CONTROLLERBUTTONS_T, std::vector<std::pair<SDL_GameControllerAxis, int32_t>>>
ControllerDefaultMappings::GetDefaultSDLAxisDirectionToButtonMappings() {
return mDefaultSDLAxisDirectionToButtonMappings;
}

void ControllerDefaultMappings::SetDefaultSDLAxisDirectionToButtonMappings(
std::unordered_map<CONTROLLERBUTTONS_T, std::vector<std::pair<SDL_GameControllerAxis, int32_t>>>
defaultSDLAxisDirectionToButtonMappings) {
if (!defaultSDLAxisDirectionToButtonMappings.empty()) {
mDefaultSDLAxisDirectionToButtonMappings = defaultSDLAxisDirectionToButtonMappings;
return;
}

mDefaultSDLAxisDirectionToButtonMappings[BTN_R] = { { SDL_CONTROLLER_AXIS_TRIGGERRIGHT, 1 } };
mDefaultSDLAxisDirectionToButtonMappings[BTN_Z] = { { SDL_CONTROLLER_AXIS_TRIGGERLEFT, 1 } };
mDefaultSDLAxisDirectionToButtonMappings[BTN_CUP] = { { SDL_CONTROLLER_AXIS_RIGHTY, -1 } };
mDefaultSDLAxisDirectionToButtonMappings[BTN_CDOWN] = { { SDL_CONTROLLER_AXIS_RIGHTY, 1 } };
mDefaultSDLAxisDirectionToButtonMappings[BTN_CLEFT] = { { SDL_CONTROLLER_AXIS_RIGHTX, -1 } };
mDefaultSDLAxisDirectionToButtonMappings[BTN_CRIGHT] = { { SDL_CONTROLLER_AXIS_RIGHTX, 1 } };
}

std::unordered_map<StickIndex, std::vector<std::pair<Direction, std::pair<SDL_GameControllerAxis, int32_t>>>>
ControllerDefaultMappings::GetDefaultSDLAxisDirectionToAxisDirectionMappings() {
return mDefaultSDLAxisDirectionToAxisDirectionMappings;
}

void ControllerDefaultMappings::SetDefaultSDLAxisDirectionToAxisDirectionMappings(
std::unordered_map<StickIndex, std::vector<std::pair<Direction, std::pair<SDL_GameControllerAxis, int32_t>>>>
defaultSDLAxisDirectionToAxisDirectionMappings) {
if (!defaultSDLAxisDirectionToAxisDirectionMappings.empty()) {
mDefaultSDLAxisDirectionToAxisDirectionMappings = defaultSDLAxisDirectionToAxisDirectionMappings;
return;
}

mDefaultSDLAxisDirectionToAxisDirectionMappings[LEFT_STICK] = {
{ LEFT, { SDL_CONTROLLER_AXIS_LEFTX, -1 } },
{ RIGHT, { SDL_CONTROLLER_AXIS_LEFTX, 1 } },
{ UP, { SDL_CONTROLLER_AXIS_LEFTY, -1 } },
{ DOWN, { SDL_CONTROLLER_AXIS_LEFTY, 1 } },
};

mDefaultSDLAxisDirectionToAxisDirectionMappings[RIGHT_STICK] = {
{ LEFT, { SDL_CONTROLLER_AXIS_RIGHTX, -1 } },
{ RIGHT, { SDL_CONTROLLER_AXIS_RIGHTX, 1 } },
{ UP, { SDL_CONTROLLER_AXIS_RIGHTY, -1 } },
{ DOWN, { SDL_CONTROLLER_AXIS_RIGHTY, 1 } },
};
}

} // namespace Ship
Loading
Loading