mirror of
https://github.com/zeldaret/ss
synced 2026-07-30 16:03:22 -04:00
Look if it matches it matches
This commit is contained in:
+55
-53
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user