diff options
| author | robojumper <robojumper@gmail.com> | 2024-05-28 20:45:14 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2024-05-28 20:45:14 +0200 |
| commit | 35a4b294a158286fb1b44241914b780abecde9d2 (patch) | |
| tree | c84dd02f10ff163dd7509aee426abc8d38f90d6e /src | |
| parent | d05a543bc1e4d2e6e0bb1370975f50157d9e745e (diff) | |
Look if it matches it matches
Diffstat (limited to 'src')
| -rw-r--r-- | src/m/m_pad.cpp | 108 |
1 files changed, 55 insertions, 53 deletions
diff --git a/src/m/m_pad.cpp b/src/m/m_pad.cpp index 63b4bf18..3b880d96 100644 --- a/src/m/m_pad.cpp +++ b/src/m/m_pad.cpp @@ -2,44 +2,22 @@ #include <egg/core/eggController.h> #include <egg/math/eggVector.h> #include <m/m_pad.h> +#include <rvl/WPAD.h> namespace mPad { -static EGG::CoreControllerMgr *g_padMg; -static int g_currentCoreId; -static EGG::CoreController *g_currentCore; +EGG::CoreControllerMgr *g_padMg; +int g_currentCoreId; +EGG::CoreController *g_currentCore; +EGG::CoreController *g_core[4]; + static bool g_IsConnected[4]; static u32 g_PadFrame; -static u32 s_GetWPADInfoInterval = 0; static bool s_WPADInfoAvailable[4]; +static u32 s_GetWPADInfoInterval = 0; static u32 s_GetWPADInfoCount = 0; -static EGG::CoreController *g_core[4]; - -struct WPADInfo_t { - u32 field_0x00; - u32 field_0x04; - u32 field_0x08; - u32 field_0x0C; - u32 field_0x10; - bool field_0x14; - bool field_0x15; - bool field_0x16; - bool field_0x17; - - inline void clear() { - field_0x00 = 0; - field_0x04 = 0; - field_0x08 = 0; - field_0x0C = 0; - field_0x10 = 0; - field_0x14 = false; - field_0x15 = false; - field_0x16 = false; - field_0x17 = false; - } -}; struct PadAdditionalData_t { PadAdditionalData_t() {} @@ -51,8 +29,8 @@ struct PadAdditionalData_t { }; static PadAdditionalData_t g_PadAdditionalData[4]; -static WPADInfo_t s_WPADInfo[4]; -static WPADInfo_t s_WPADInfoTmp[4]; +static WPADInfo s_WPADInfo[4]; +static WPADInfo s_WPADInfoTmp[4]; static void initWPADInfo(); static void clearWPADInfo(int); @@ -65,27 +43,36 @@ void create() { endPad(); } -// Has a regshuffle +// This code looks really bad. +// It mostly matches when writing it the obvious way +// (just indexing the arrays normally) +// but has an annoying regshuffle void beginPad() { - EGG::CoreController *ctl; g_PadFrame++; g_padMg->beginFrame(); - for (int i = 0; i < 4; i++) { + EGG::CoreController *ctl; + EGG::CoreController **p_ctl = g_core; + PadAdditionalData_t *dat = g_PadAdditionalData; + bool *connected; + int i = 0; + connected = g_IsConnected; + + for (; i < 4; i++) { ctl = g_padMg->getNthController(i); - g_core[i] = ctl; + *p_ctl = ctl; if (ctl->mFlag.onBit(0)) { // These sort of look like value, first order derivative, and second order derivative // So perhaps value, velocity, acceleration? EGG::Vector2f pos = ctl->coreStatus[0].getUnk(); - EGG::Vector2f v = pos - g_PadAdditionalData[i].v1; - g_PadAdditionalData[i].v1 = pos; - g_PadAdditionalData[i].v3 = v - g_PadAdditionalData[i].v2; - g_PadAdditionalData[i].v2 = v; + EGG::Vector2f v = pos - dat->v1; + dat->v1 = pos; + dat->v3 = v - dat->v2; + dat->v2 = v; - if (!g_IsConnected[i]) { - g_IsConnected[i] = true; + if (!*connected) { + *connected = true; } // Not sure why this checks the controller index against the tick count @@ -94,18 +81,22 @@ void beginPad() { (s_GetWPADInfoInterval <= 3 && (s_GetWPADInfoCount & 1) == (i & 1)))) { getWPADInfoCB(i); } - } else if (g_IsConnected[i]) { + } else if (*connected) { ctl->coreStatus->init(); ctl->sceneReset(); - g_PadAdditionalData[i].v1.x = 0.0f; - g_PadAdditionalData[i].v1.y = 0.0f; - g_PadAdditionalData[i].v3.x = 0.0f; - g_PadAdditionalData[i].v3.y = 0.0f; - g_PadAdditionalData[i].v2.x = 0.0f; - g_PadAdditionalData[i].v2.y = 0.0f; + dat->v1.x = 0.0f; + dat->v1.y = 0.0f; + dat->v3.x = 0.0f; + dat->v3.y = 0.0f; + dat->v2.x = 0.0f; + dat->v2.y = 0.0f; clearWPADInfo(i); - g_IsConnected[i] = false; + *connected = false; } + + p_ctl++; + dat++; + connected++; } if (s_GetWPADInfoInterval != 0) { @@ -121,9 +112,21 @@ void endPad() { g_padMg->endFrame(); } +static inline void clear(WPADInfo *info) { + info->field_0x00 = 0; + info->field_0x04 = 0; + info->field_0x08 = 0; + info->field_0x0C = 0; + info->field_0x10 = 0; + info->field_0x14 = false; + info->field_0x15 = false; + info->field_0x16 = false; + info->field_0x17 = false; +} + static void clearWPADInfo(int controller) { s_WPADInfoAvailable[controller] = false; - s_WPADInfo[controller].clear(); + clear(&s_WPADInfo[controller]); } static void initWPADInfo() { @@ -132,11 +135,10 @@ static void initWPADInfo() { } } -extern "C" int fn_803DAFC0(int controller, void *data, void (*callback)(int, int)); -extern "C" void fn_80058DA0(int, int); +extern "C" void fn_80058DA0(s32, s32); static int getWPADInfoCB(int controller) { - int result = fn_803DAFC0(controller, &s_WPADInfoTmp[controller], fn_80058DA0); + int result = WPADGetInfoAsync(controller, &s_WPADInfoTmp[controller], fn_80058DA0); if (result == -1) { clearWPADInfo(controller); } |
