summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2024-05-28 20:45:14 +0200
committerrobojumper <robojumper@gmail.com>2024-05-28 20:45:14 +0200
commit35a4b294a158286fb1b44241914b780abecde9d2 (patch)
treec84dd02f10ff163dd7509aee426abc8d38f90d6e /src
parentd05a543bc1e4d2e6e0bb1370975f50157d9e745e (diff)
Look if it matches it matches
Diffstat (limited to 'src')
-rw-r--r--src/m/m_pad.cpp108
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);
}