Skip to content

Commit b638689

Browse files
committed
#225: Sticks dead zone configuration added
1 parent 198c5c7 commit b638689

File tree

8 files changed

+145
-4
lines changed

8 files changed

+145
-4
lines changed

app/include/settings_tab.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ class SettingsTab : public brls::Box {
2727
BRLS_BIND(brls::BooleanCell, pcAudio, "pcAudio");
2828
BRLS_BIND(brls::BooleanCell, swapUi, "swap_ui");
2929
BRLS_BIND(brls::DetailCell, swapGame, "swap_game");
30+
BRLS_BIND(brls::DetailCell, deadzoneStickLeft, "dead_zone_stick_left");
31+
BRLS_BIND(brls::DetailCell, deadzoneStickRight, "dead_zone_stick_right");
3032
BRLS_BIND(brls::Header, rumbleForceHeader, "rumble_slider_header");
3133
BRLS_BIND(brls::Slider, rumbleForceSlider, "rumble_slider");
3234
BRLS_BIND(brls::BooleanCell, swapStickToDpad, "swap_stick_to_dpad");
@@ -54,4 +56,5 @@ class SettingsTab : public brls::Box {
5456
std::vector<brls::ControllerButton> buttons);
5557
std::string getTextFromButtons(std::vector<brls::ControllerButton> buttons);
5658
NVGcolor getColorFromButtons(std::vector<brls::ControllerButton> buttons);
59+
void updateDeadZoneItems();
5760
};

app/src/settings_tab.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,48 @@ SettingsTab::SettingsTab() {
297297
return true;
298298
});
299299

300+
301+
deadzoneStickLeft->setText("settings/deadzone/stick_left"_i18n);
302+
deadzoneStickRight->setText("settings/deadzone/stick_right"_i18n);
303+
304+
updateDeadZoneItems();
305+
306+
deadzoneStickLeft->registerClickAction([this](View* view) {
307+
int currentValue = int(Settings::instance().get_deadzone_stick_left() * 100);
308+
bool res = Application::getImeManager()->openForNumber([&](long number) {
309+
Settings::instance().set_deadzone_stick_left(float(number) / 100.f);
310+
this->updateDeadZoneItems();
311+
},
312+
"settings/deadzone/stick_left"_i18n, "settings/deadzone/input_hint"_i18n, 2,
313+
currentValue > 0 ? std::to_string(currentValue) : "", "",
314+
"", 0);
315+
316+
if (!res) {
317+
Settings::instance().set_deadzone_stick_left(0);
318+
this->updateDeadZoneItems();
319+
}
320+
321+
return true;
322+
});
323+
324+
deadzoneStickRight->registerClickAction([this](View* view) {
325+
int currentValue = int(Settings::instance().get_deadzone_stick_right() * 100);
326+
bool res = Application::getImeManager()->openForNumber([&](long number) {
327+
Settings::instance().set_deadzone_stick_right(float(number) / 100.f);
328+
this->updateDeadZoneItems();
329+
},
330+
"settings/deadzone/stick_right"_i18n, "settings/deadzone/input_hint"_i18n, 2,
331+
currentValue > 0 ? std::to_string(currentValue) : "", "",
332+
"", 0);
333+
334+
if (!res) {
335+
Settings::instance().set_deadzone_stick_right(0);
336+
this->updateDeadZoneItems();
337+
}
338+
339+
return true;
340+
});
341+
300342
float rumbleForceProgress = Settings::instance().get_rumble_force();
301343
rumbleForceSlider->getProgressEvent()->subscribe([this](float value) {
302344
std::stringstream stream;
@@ -510,6 +552,24 @@ SettingsTab::SettingsTab() {
510552
});
511553
}
512554

555+
void SettingsTab::updateDeadZoneItems() {
556+
if (Settings::instance().get_deadzone_stick_left() > 0) {
557+
deadzoneStickLeft->setDetailTextColor(Application::getTheme()["brls/list/listItem_value_color"]);
558+
deadzoneStickLeft->setDetailText(fmt::format("{}%", int(Settings::instance().get_deadzone_stick_left() * 100.f)));
559+
} else {
560+
deadzoneStickLeft->setDetailTextColor(Application::getTheme()["brls/text_disabled"]);
561+
deadzoneStickLeft->setDetailText("hints/off"_i18n);
562+
}
563+
564+
if (Settings::instance().get_deadzone_stick_right() > 0) {
565+
deadzoneStickRight->setDetailTextColor(Application::getTheme()["brls/list/listItem_value_color"]);
566+
deadzoneStickRight->setDetailText(fmt::format("{}%", int(Settings::instance().get_deadzone_stick_right() * 100)));
567+
} else {
568+
deadzoneStickRight->setDetailTextColor(Application::getTheme()["brls/text_disabled"]);
569+
deadzoneStickRight->setDetailText("hints/off"_i18n);
570+
}
571+
}
572+
513573
void SettingsTab::setupButtonsSelectorCell(
514574
brls::DetailCell* cell, std::vector<ControllerButton> buttons) {
515575
cell->setDetailText(getTextFromButtons(buttons));

app/src/streaming/InputManager.cpp

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@
1212

1313
using namespace brls;
1414

15+
float fsqrt_(float f) {
16+
int i = *(int *)&f;
17+
i = (i >> 1) + 0x1fbb67ae;
18+
float f1 = *(float *)&i;
19+
return 0.5F * (f1 + f / f1);
20+
21+
}
22+
1523
MoonlightInputManager::MoonlightInputManager() {
1624
auto inputManager = brls::Application::getPlatform()->getInputManager();
1725

@@ -181,20 +189,45 @@ GamepadState MoonlightInputManager::getControllerState(int controllerNum,
181189
float lzAxis = controller.axes[LEFT_Z] > 0 ? controller.axes[LEFT_Z] : (controller.buttons[brls::BUTTON_LT] ? 1.f : 0.f);
182190
float rzAxis = controller.axes[RIGHT_Z] > 0 ? controller.axes[RIGHT_Z] : (controller.buttons[brls::BUTTON_RT] ? 1.f : 0.f);
183191

192+
// Truncate dead zones
193+
float leftStickDeadzone = Settings::instance().get_deadzone_stick_left();
194+
float rightStickDeadzone = Settings::instance().get_deadzone_stick_right();
195+
196+
float leftXAxis = controller.axes[brls::LEFT_X];
197+
float leftYAxis = controller.axes[brls::LEFT_Y];
198+
float rightXAxis = controller.axes[brls::RIGHT_X];
199+
float rightYAxis = controller.axes[brls::RIGHT_Y];
200+
201+
if (leftStickDeadzone > 0) {
202+
float magnitude = fsqrt_(std::powf(leftXAxis, 2) + std::powf(leftYAxis, 2));
203+
if (magnitude < leftStickDeadzone) {
204+
leftXAxis = 0;
205+
leftYAxis = 0;
206+
}
207+
}
208+
209+
if (rightStickDeadzone > 0) {
210+
float magnitude = fsqrt_(std::powf(rightXAxis, 2) + std::powf(rightYAxis, 2));
211+
if (magnitude < rightStickDeadzone) {
212+
rightXAxis = 0;
213+
rightYAxis = 0;
214+
}
215+
}
216+
184217
GamepadState gamepadState{
185218
.buttonFlags = 0,
186219
.leftTrigger = static_cast<unsigned char>(
187220
0xFFFF * (!specialKey ? lzAxis : 0)),
188221
.rightTrigger = static_cast<unsigned char>(
189222
0xFFFF * (!specialKey ? rzAxis : 0)),
190223
.leftStickX = static_cast<short>(
191-
0x7FFF * (!specialKey ? controller.axes[brls::LEFT_X] : 0)),
224+
0x7FFF * (!specialKey ? leftXAxis : 0)),
192225
.leftStickY = static_cast<short>(
193-
-0x7FFF * (!specialKey ? controller.axes[brls::LEFT_Y] : 0)),
226+
-0x7FFF * (!specialKey ? leftYAxis : 0)),
194227
.rightStickX = static_cast<short>(
195-
0x7FFF * (!specialKey ? controller.axes[brls::RIGHT_X] : 0)),
228+
0x7FFF * (!specialKey ? rightXAxis : 0)),
196229
.rightStickY = static_cast<short>(
197-
-0x7FFF * (!specialKey ? controller.axes[brls::RIGHT_Y] : 0)),
230+
-0x7FFF * (!specialKey ? rightYAxis : 0)),
198231
};
199232

200233
brls::ControllerButton a = brls::BUTTON_A;

app/src/utils/Settings.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,18 @@ void Settings::load() {
329329
m_mouse_speed_multiplier = (int)json_integer_value(mouse_speed_multiplier);
330330
}
331331
}
332+
333+
if (json_t* deadzone_stick_left = json_object_get(settings, "deadzone_stick_left")) {
334+
if (json_typeof(deadzone_stick_left) == JSON_INTEGER) {
335+
m_deadzone_stick_left = (float)json_integer_value(deadzone_stick_left) / 100.f;
336+
}
337+
}
338+
339+
if (json_t* deadzone_stick_right = json_object_get(settings, "deadzone_stick_right")) {
340+
if (json_typeof(deadzone_stick_right) == JSON_INTEGER) {
341+
m_deadzone_stick_right = (float)json_integer_value(deadzone_stick_right) / 100.f;
342+
}
343+
}
332344

333345
if (json_t* rumble_force = json_object_get(settings, "rumble_force")) {
334346
if (json_typeof(rumble_force) == JSON_INTEGER) {
@@ -492,6 +504,8 @@ void Settings::save() {
492504
json_object_set_new(settings, "overlay_hold_time", json_integer(m_overlay_options.holdTime));
493505
json_object_set_new(settings, "mouse_input_hold_time", json_integer(m_mouse_input_options.holdTime));
494506
json_object_set_new(settings, "mouse_speed_multiplier", json_integer(m_mouse_speed_multiplier));
507+
json_object_set_new(settings, "deadzone_stick_left", json_integer(int(m_deadzone_stick_left * 100.f)));
508+
json_object_set_new(settings, "deadzone_stick_right", json_integer(int(m_deadzone_stick_right * 100.f)));
495509
json_object_set_new(settings, "rumble_force", json_integer(m_rumble_force));
496510
json_object_set_new(settings, "current_mapping_layout", json_integer(m_current_mapping_layout));
497511
json_object_set_new(settings, "keyboard_type", json_integer(m_keyboard_type));

app/src/utils/Settings.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ class Settings : public Singleton<Settings> {
160160
void set_mouse_speed_multiplier(int mouse_speed_multiplier) { m_mouse_speed_multiplier = mouse_speed_multiplier; }
161161
[[nodiscard]] int get_mouse_speed_multiplier() const { return m_mouse_speed_multiplier; }
162162

163+
void set_deadzone_stick_left(float deadzone) { m_deadzone_stick_left = deadzone; }
164+
[[nodiscard]] float get_deadzone_stick_left() const { return m_deadzone_stick_left; }
165+
166+
void set_deadzone_stick_right(float deadzone) { m_deadzone_stick_right = deadzone; }
167+
[[nodiscard]] float get_deadzone_stick_right() const { return m_deadzone_stick_right; }
168+
163169
int get_current_mapping_layout();
164170
void set_current_mapping_layout(int layout) { m_current_mapping_layout = layout; }
165171

@@ -218,5 +224,8 @@ class Settings : public Singleton<Settings> {
218224
.buttons = {},
219225
};
220226

227+
float m_deadzone_stick_left = 0;
228+
float m_deadzone_stick_right = 0;
229+
221230
void loadBaseLayouts();
222231
};

resources/i18n/en-US/main.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@
100100
"home": "Home",
101101
"screenshot": "Screenshot"
102102
},
103+
"deadzone": {
104+
"input_hint": "Dead zone value in percent",
105+
"stick_left": "Left stick",
106+
"stick_right": "Right stick",
107+
"title": "Dead zones"
108+
},
103109
"debug": "Debug",
104110
"debugging_view": "Show debugging view",
105111
"decoder_threads": "Decoder Threads",

resources/i18n/ru/main.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@
100100
"home": "Домой",
101101
"screenshot": "Скриншот"
102102
},
103+
"deadzone": {
104+
"input_hint": "Значение мёртвой зоны в процентах",
105+
"stick_left": "Левый стик",
106+
"stick_right": "Правый стик",
107+
"title": "Мёртвые зоны"
108+
},
103109
"debug": "Отладка",
104110
"debugging_view": "Показать окно отладки",
105111
"decoder_threads": "Потоки декодера",

resources/xml/tabs/settings.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,16 @@
7979
<brls:DetailCell
8080
id="swap_game"/>
8181

82+
<brls:Header
83+
title="@i18n/settings/deadzone/title"
84+
paddingTop="60"/>
85+
86+
<brls:DetailCell
87+
id="dead_zone_stick_left"/>
88+
89+
<brls:DetailCell
90+
id="dead_zone_stick_right"/>
91+
8292
<brls:Header
8393
id="rumble_slider_header"
8494
title="@i18n/settings/rumble_force"

0 commit comments

Comments
 (0)