mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-06-14 21:39:01 -04:00
273 lines
11 KiB
C++
273 lines
11 KiB
C++
#include "m_Do/m_Do_controller_pad.h"
|
|
|
|
#include "imgui.h"
|
|
#include <imgui_internal.h>
|
|
#include "ImGuiConsole.hpp"
|
|
#include "ImGuiMenuGame.hpp"
|
|
|
|
namespace dusk {
|
|
void TextCenter(const std::string& text) {
|
|
float font_size = ImGui::GetFontSize() * text.size() / 2;
|
|
ImGui::SameLine(ImGui::GetWindowSize().x / 2 - font_size + (font_size / 2));
|
|
|
|
ImGui::TextUnformatted(text.c_str());
|
|
}
|
|
|
|
void ImGuiMenuGame::windowInputViewer() {
|
|
if (!m_showInputViewer) {
|
|
return;
|
|
}
|
|
|
|
const char* controller_name = PADGetName(PAD_1);
|
|
if (controller_name != nullptr) {
|
|
m_controllerName = controller_name;
|
|
}
|
|
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize |
|
|
ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav;
|
|
if (m_inputOverlayCorner != -1) {
|
|
SetOverlayWindowLocation(m_inputOverlayCorner);
|
|
windowFlags |= ImGuiWindowFlags_NoMove;
|
|
}
|
|
|
|
ImGui::SetNextWindowBgAlpha(0.65f);
|
|
if (ImGui::Begin("Input Viewer", nullptr, windowFlags)) {
|
|
float scale = ImGuiScale();
|
|
if (!m_controllerName.empty()) {
|
|
TextCenter(m_controllerName);
|
|
ImGui::Separator();
|
|
}
|
|
|
|
ImDrawList* dl = ImGui::GetWindowDrawList();
|
|
ImVec2 p = ImGui::GetCursorScreenPos();
|
|
|
|
// Left Stick vars
|
|
float leftStickRadius = 30 * scale;
|
|
p.x += 20 * scale;
|
|
p.y += 20 * scale;
|
|
ImVec2 leftStickCenter;
|
|
leftStickCenter.x = p.x + 30 * scale;
|
|
leftStickCenter.y = p.y + 45 * scale;
|
|
|
|
// Right Stick vars
|
|
float rightStickRadius = 20 * scale;
|
|
ImVec2 rightStickCenter;
|
|
rightStickCenter.x = p.x + 160 * scale;
|
|
rightStickCenter.y = p.y + 90 * scale;
|
|
|
|
// D-Pad vars
|
|
float dpadRadius = 15 * scale;
|
|
float dpadWidth = 8 * scale;
|
|
ImVec2 dpadCenter;
|
|
dpadCenter.x = p.x + 80 * scale;
|
|
dpadCenter.y = p.y + 90 * scale;
|
|
|
|
// Start Button vars
|
|
float startButtonRadius = 5 * scale;
|
|
ImVec2 startButtonCenter;
|
|
startButtonCenter.x = p.x + 120 * scale;
|
|
startButtonCenter.y = p.y + 55 * scale;
|
|
|
|
// A Button vars
|
|
float aButtonRadius = 16 * scale;
|
|
ImVec2 aButtonCenter;
|
|
aButtonCenter.x = p.x + 210 * scale;
|
|
aButtonCenter.y = p.y + 48 * scale;
|
|
|
|
// B Button vars
|
|
float bButtonRadius = 8 * scale;
|
|
ImVec2 bButtonCenter;
|
|
bButtonCenter.x = aButtonCenter.x + -24 * scale;
|
|
bButtonCenter.y = aButtonCenter.y + 16 * scale;
|
|
|
|
// X Button vars
|
|
ImVec2 xButtonRadius{ 7 * scale, 12 * scale};
|
|
ImVec2 xButtonCenter;
|
|
xButtonCenter.x = aButtonCenter.x + 24 * scale;
|
|
xButtonCenter.y = aButtonCenter.y + -5 * scale;
|
|
|
|
// Y Button vars
|
|
ImVec2 yButtonRadius{ 12 * scale, 7 * scale };
|
|
ImVec2 yButtonCenter;
|
|
yButtonCenter.x = aButtonCenter.x + -8 * scale;
|
|
yButtonCenter.y = aButtonCenter.y + -24 * scale;
|
|
|
|
// Trigger vars
|
|
float triggerWidth = leftStickRadius * 2;
|
|
float triggerHeight = 8 * scale;
|
|
ImVec2 lTrigCenter;
|
|
lTrigCenter.x = leftStickCenter.x + 0 * scale;
|
|
lTrigCenter.y = leftStickCenter.y + -60 * scale;
|
|
ImVec2 rTrigCenter;
|
|
rTrigCenter.x = aButtonCenter.x * scale;
|
|
rTrigCenter.y = lTrigCenter.y * scale;
|
|
|
|
// Z Button vars
|
|
ImVec2 zButtonRadius{ 10 * scale, 5 * scale };
|
|
ImVec2 zButtonCenter;
|
|
zButtonCenter.x = aButtonCenter.x + 18 * scale;
|
|
zButtonCenter.y = aButtonCenter.y + -30 * scale;
|
|
|
|
const float zButtonHalfWidth = triggerWidth / 2;
|
|
const float zButtonHalfHeight = 4 * scale;
|
|
|
|
constexpr ImU32 stickGray = IM_COL32(150, 150, 150, 255);
|
|
constexpr ImU32 darkGray = IM_COL32(60, 60, 60, 255);
|
|
constexpr ImU32 red = IM_COL32(230, 0, 0, 255);
|
|
constexpr ImU32 yellow = IM_COL32(255, 219, 109, 255);
|
|
constexpr ImU32 white = IM_COL32(255, 255, 255, 255);
|
|
constexpr ImU32 green = IM_COL32(0, 225, 255, 255);
|
|
constexpr ImU32 purple = IM_COL32(165, 75, 165, 255);
|
|
|
|
// Draw Left Stick
|
|
{
|
|
float x = mDoCPd_c::getStickX(PAD_1);
|
|
float y = -mDoCPd_c::getStickY(PAD_1);
|
|
dl->AddCircleFilled(leftStickCenter, leftStickRadius, stickGray, 8);
|
|
|
|
ImVec2 center;
|
|
center.x = leftStickCenter.x + x * (leftStickRadius / 2);
|
|
center.y = leftStickCenter.y + y * (leftStickRadius / 2);
|
|
dl->AddCircleFilled(center, leftStickRadius / 2, white);
|
|
}
|
|
|
|
// Draw Right Stick
|
|
{
|
|
float x = mDoCPd_c::getSubStickX(PAD_1);
|
|
float y = -mDoCPd_c::getSubStickY(PAD_1);
|
|
dl->AddCircleFilled(rightStickCenter, rightStickRadius, stickGray, 8);
|
|
|
|
ImVec2 center;
|
|
center.x = rightStickCenter.x + x * (rightStickRadius / 2);
|
|
center.y = rightStickCenter.y + y * (rightStickRadius / 2);
|
|
dl->AddCircleFilled(center, leftStickRadius / 3, yellow);
|
|
}
|
|
|
|
// Draw D-Pad
|
|
{
|
|
float halfWidth = dpadWidth / 2;
|
|
{
|
|
ImVec2 pmin;
|
|
pmin.x = dpadCenter.x + -halfWidth;
|
|
pmin.y = dpadCenter.y + -dpadRadius;
|
|
ImVec2 pmax;
|
|
pmax.x = dpadCenter.x + halfWidth;
|
|
pmax.y = dpadCenter.y + dpadRadius;
|
|
dl->AddRectFilled(pmin, pmax, stickGray);
|
|
}
|
|
{
|
|
ImVec2 pmin;
|
|
pmin.x = dpadCenter.x + -dpadRadius;
|
|
pmin.y = dpadCenter.y + -halfWidth;
|
|
ImVec2 pmax;
|
|
pmax.x = dpadCenter.x + dpadRadius;
|
|
pmax.y = dpadCenter.y + halfWidth;
|
|
dl->AddRectFilled(pmin, pmax, stickGray);
|
|
}
|
|
|
|
if (mDoCPd_c::getHoldUp(PAD_1)) {
|
|
ImVec2 pmin;
|
|
pmin.x = dpadCenter.x + -halfWidth;
|
|
pmin.y = dpadCenter.y + -dpadRadius;
|
|
ImVec2 pmax;
|
|
pmax.x = dpadCenter.x + halfWidth;
|
|
pmax.y = dpadCenter.y + -dpadRadius / 2;
|
|
dl->AddRectFilled(pmin, pmax, white);
|
|
}
|
|
if (mDoCPd_c::getHoldDown(PAD_1)) {
|
|
ImVec2 pmin;
|
|
pmin.x = dpadCenter.x + -halfWidth;
|
|
pmin.y = dpadCenter.y + dpadRadius;
|
|
ImVec2 pmax;
|
|
pmax.x = dpadCenter.x + halfWidth;
|
|
pmax.y = dpadCenter.y + dpadRadius / 2;
|
|
dl->AddRectFilled(pmin, pmax, white);
|
|
}
|
|
if (mDoCPd_c::getHoldLeft(PAD_1)) {
|
|
ImVec2 pmin;
|
|
pmin.x = dpadCenter.x + -dpadRadius;
|
|
pmin.y = dpadCenter.y + -halfWidth;
|
|
ImVec2 pmax;
|
|
pmax.x = dpadCenter.x + -dpadRadius / 2;
|
|
pmax.y = dpadCenter.y + halfWidth;
|
|
dl->AddRectFilled(pmin, pmax, white);
|
|
}
|
|
if (mDoCPd_c::getHoldRight(PAD_1)) {
|
|
ImVec2 pmin;
|
|
pmin.x = dpadCenter.x + dpadRadius;
|
|
pmin.y = dpadCenter.y + -halfWidth;
|
|
ImVec2 pmax;
|
|
pmax.x = dpadCenter.x + dpadRadius / 2;
|
|
pmax.y = dpadCenter.y + halfWidth;
|
|
dl->AddRectFilled(pmin, pmax, white);
|
|
}
|
|
}
|
|
|
|
// Draw Buttons
|
|
{
|
|
// start
|
|
dl->AddCircleFilled(startButtonCenter, startButtonRadius, mDoCPd_c::getHoldStart(PAD_1) ? white : stickGray);
|
|
|
|
// a
|
|
dl->AddCircleFilled(aButtonCenter, aButtonRadius, mDoCPd_c::getHoldA(PAD_1) ? green : stickGray);
|
|
|
|
// b
|
|
dl->AddCircleFilled(bButtonCenter, bButtonRadius, mDoCPd_c::getHoldB(PAD_1) ? red : stickGray);
|
|
|
|
// x
|
|
dl->AddEllipseFilled(xButtonCenter, xButtonRadius, mDoCPd_c::getHoldX(PAD_1) ? white : stickGray, 25);
|
|
|
|
// y
|
|
dl->AddEllipseFilled(yButtonCenter, yButtonRadius, mDoCPd_c::getHoldY(PAD_1) ? white : stickGray, 25);
|
|
|
|
// z
|
|
dl->AddEllipseFilled(zButtonCenter, zButtonRadius, mDoCPd_c::getHoldZ(PAD_1) ? purple : stickGray, 35);
|
|
}
|
|
|
|
// Draw Triggers
|
|
{
|
|
float halfTriggerWidth = triggerWidth / 2;
|
|
ImVec2 lStart;
|
|
lStart.x = lTrigCenter.x - halfTriggerWidth;
|
|
lStart.y = lTrigCenter.y - 0;
|
|
ImVec2 lEnd;
|
|
lEnd.x = lTrigCenter.x + halfTriggerWidth;
|
|
lEnd.y = lTrigCenter.y + triggerHeight;
|
|
|
|
float lValue = triggerWidth * std::min(1.f, mDoCPd_c::getAnalogL(PAD_1));
|
|
ImVec2 p2;
|
|
p2.x = lStart.x + lValue;
|
|
p2.y = lStart.y + triggerHeight;
|
|
dl->AddRectFilled(lStart, p2, mDoCPd_c::getHoldL(PAD_1) ? IM_COL32(0, 225, 0, 255) : white);
|
|
p2.x = lStart.x + lValue;
|
|
p2.y = lStart.y;
|
|
dl->AddRectFilled(p2, lEnd, darkGray);
|
|
|
|
ImVec2 rStart;
|
|
rStart.x = rTrigCenter.x - halfTriggerWidth;
|
|
rStart.y = rTrigCenter.y - 0;
|
|
ImVec2 rEnd;
|
|
rEnd.x = rTrigCenter.x + halfTriggerWidth;
|
|
rEnd.y = rTrigCenter.y + triggerHeight;
|
|
|
|
float rValue = triggerWidth * std::min(1.f, mDoCPd_c::getAnalogR(PAD_1));
|
|
p2.x = rEnd.x - rValue;
|
|
p2.y = rEnd.y - triggerHeight;
|
|
dl->AddRectFilled(p2, rEnd, mDoCPd_c::getHoldR(PAD_1) ? IM_COL32(0, 225, 0, 255) : white);
|
|
p2.x = rEnd.x - rValue;
|
|
p2.y = rEnd.y;
|
|
dl->AddRectFilled(rStart, p2, darkGray);
|
|
}
|
|
|
|
ImVec2 size;
|
|
size.x = 270 * scale;
|
|
size.y = 130 * scale;
|
|
ImGui::Dummy(size);
|
|
|
|
ShowCornerContextMenu(m_inputOverlayCorner, 0);
|
|
}
|
|
|
|
ImGui::End();
|
|
}
|
|
} // namespace dusk
|