ImGui widget for visualizing real-time gamepad input state. More...
Namespaces Index
| namespace | helios |
|
|
|
| namespace | ext |
|
Platform-specific extensions and backend implementations. More...
|
|
| namespace | imgui |
|
|
|
| namespace | widgets |
|
Debug and developer widgets for ImGui overlays. More...
|
|
Classes Index
Description
ImGui widget for visualizing real-time gamepad input state.
File Listing
The file content with the documentation metadata removed is:
16export module helios.ext.imgui.widgets.GamepadWidget;
18import helios.ext.imgui.ImGuiWidget;
19import helios.input.InputManager;
20import helios.input.gamepad.GamepadState;
21import helios.input.gamepad.GamepadSettings;
22import helios.input.types.Gamepad;
23import helios.math.types;
56 int selectedGamepadIndex_ = 0;
61 bool showSettings_ = true;
88 void drawStickVisualizer(const char* label, const helios::math::vec2f& value, float radius) {
89 ImVec2 p = ImGui::GetCursorScreenPos();
90 ImDrawList* draw_list = ImGui::GetWindowDrawList();
92 float center_x = p.x + radius;
93 float center_y = p.y + radius;
96 draw_list->AddCircleFilled(ImVec2(center_x, center_y), radius, IM_COL32(50, 50, 50, 255));
98 draw_list->AddCircle(ImVec2(center_x, center_y), radius, IM_COL32(255, 255, 255, 255));
105 float dot_x = center_x + (value[0] * radius);
106 float dot_y = center_y - (value[1] * radius);
109 draw_list->AddCircleFilled(ImVec2(dot_x, dot_y), 4.0f, IM_COL32(0, 255, 0, 255));
112 ImGui::Dummy(ImVec2(radius * 2, radius * 2));
113 ImGui::Text("%s: (%.2f, %.2f)", label, value[0], value[1]);
122 auto& settings = inputManager_->inputAdapter().gamepadSettings(gamepadId);
127 ImGui::Columns(2, "deadzoneColumns", false);
130 ImGui::Text("Left Stick");
131 float leftDeadzone = settings.leftStickDeadzone();
132 if (ImGui::SliderFloat("##LeftDZ", &leftDeadzone, 0.0f, 0.9f, "%.2f")) {
133 settings.setLeftStickDeadzone(leftDeadzone);
136 bool invertLX = settings.invertLeftX();
137 bool invertLY = settings.invertLeftY();
138 if (ImGui::Checkbox("Invert X##L", &invertLX)) settings.setInvertLeftX(invertLX);
140 if (ImGui::Checkbox("Invert Y##L", &invertLY)) settings.setInvertLeftY(invertLY);
145 ImGui::Text("Right Stick");
146 float rightDeadzone = settings.rightStickDeadzone();
147 if (ImGui::SliderFloat("##RightDZ", &rightDeadzone, 0.0f, 0.9f, "%.2f")) {
148 settings.setRightStickDeadzone(rightDeadzone);
151 bool invertRX = settings.invertRightX();
152 bool invertRY = settings.invertRightY();
153 if (ImGui::Checkbox("Invert X##R", &invertRX)) settings.setInvertRightX(invertRX);
155 if (ImGui::Checkbox("Invert Y##R", &invertRY)) settings.setInvertRightY(invertRY);
162 if (ImGui::Button("Reset Settings")) {
163 settings.setLeftStickDeadzone(0.0f);
164 settings.setRightStickDeadzone(0.0f);
165 settings.setInvertLeftX(false);
166 settings.setInvertLeftY(false);
167 settings.setInvertRightX(false);
168 settings.setInvertRightY(false);
181 : inputManager_(inputManager) {}
187 if (!inputManager_) return;
191 auto DrawReadOnlyCheckbox = [](const char* label, bool isPressed) {
192 ImGui::BeginDisabled();
193 bool tempValue = isPressed;
194 ImGui::Checkbox(label, &tempValue);
195 ImGui::EndDisabled();
198 ImGui::SetNextWindowSize(ImVec2(450, 550), ImGuiCond_FirstUseEver);
200 if (ImGui::Begin("Gamepad Debugger", nullptr, ImGuiWindowFlags_NoCollapse)) {
203 const char* items[] = { "Gamepad 1", "Gamepad 2", "Gamepad 3", "Gamepad 4" };
204 ImGui::Combo("Select ID", &selectedGamepadIndex_, items, IM_ARRAYSIZE(items));
206 auto gamepadId = indexToId(selectedGamepadIndex_);
209 bool connected = inputManager_->isConnected(gamepadId);
212 ImGui::TextColored(ImVec4(0, 1, 0, 1), "Connected");
214 ImGui::TextColored(ImVec4(1, 0, 0, 1), "Disconnected");
218 if (ImGui::Button(showSettings_ ? "Hide Settings" : "Show Settings")) {
219 showSettings_ = !showSettings_;
226 if (ImGui::CollapsingHeader("Controller Settings", ImGuiTreeNodeFlags_DefaultOpen)) {
227 drawSettingsPanel(gamepadId);
234 const auto& state = inputManager_->gamepadState(gamepadId);
237 ImGui::Columns(2, "sticks", false);
240 drawStickVisualizer("L-Stick", state.left(), 40.0f);
241 DrawReadOnlyCheckbox("L-Thumb", state.buttonLeftThumb());
246 drawStickVisualizer("R-Stick", state.right(), 40.0f);
247 DrawReadOnlyCheckbox("R-Thumb", state.buttonRightThumb());
253 ImGui::Text("Triggers");
255 ImGui::Text("L: %.2f", state.triggerLeft());
258 ImGui::ProgressBar(state.triggerLeft(), ImVec2(100, 0), "");
260 ImGui::SameLine(220);
262 ImGui::Text("R: %.2f", state.triggerRight());
264 ImGui::ProgressBar(state.triggerRight(), ImVec2(100, 0), "");
270 ImGui::Columns(2, "buttons", false);
272 ImGui::Text("D-Pad");
273 DrawReadOnlyCheckbox("Up", state.buttonDpadUp());
274 DrawReadOnlyCheckbox("Down", state.buttonDpadDown());
275 DrawReadOnlyCheckbox("Left", state.buttonDpadLeft());
276 DrawReadOnlyCheckbox("Right", state.buttonDpadRight());
280 ImGui::Text("Face Buttons");
281 DrawReadOnlyCheckbox("A", state.buttonA());
282 DrawReadOnlyCheckbox("B", state.buttonB());
283 DrawReadOnlyCheckbox("X", state.buttonX());
284 DrawReadOnlyCheckbox("Y", state.buttonY());
290 ImGui::Text("Center & Bumpers");
293 DrawReadOnlyCheckbox("LB", state.buttonLeftBumper());
295 DrawReadOnlyCheckbox("Back", state.buttonBack());
297 DrawReadOnlyCheckbox("Guide", state.buttonGuide());
299 DrawReadOnlyCheckbox("Start", state.buttonStart());
301 DrawReadOnlyCheckbox("RB", state.buttonRightBumper());
304 ImGui::TextDisabled("No input data available. Please connect a controller.");
Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.15.0.