marioparty4/src/dolphin/pad/Padclamp.c
2024-11-12 00:08:39 +01:00

119 lines
2.1 KiB
C

#include <dolphin/pad.h>
#include <math.h>
typedef struct PADClampRegion {
u8 minTrigger;
u8 maxTrigger;
s8 minStick;
s8 maxStick;
s8 xyStick;
s8 minSubstick;
s8 maxSubstick;
s8 xySubstick;
} PADClampRegion;
static PADClampRegion ClampRegion = {
// Triggers
30,
180,
// Left stick
15,
72,
40,
// Right stick
15,
59,
31,
};
static void ClampStick(s8 *px, s8 *py, s8 max, s8 xy, s8 min)
{
int x = *px;
int y = *py;
int signX;
int signY;
int d;
if (0 <= x) {
signX = 1;
}
else {
signX = -1;
x = -x;
}
if (0 <= y) {
signY = 1;
}
else {
signY = -1;
y = -y;
}
if (x <= min) {
x = 0;
}
else {
x -= min;
}
if (y <= min) {
y = 0;
}
else {
y -= min;
}
if (x == 0 && y == 0) {
*px = *py = 0;
return;
}
if (xy * y <= xy * x) {
d = xy * x + (max - xy) * y;
if (xy * max < d) {
x = (s8)(xy * max * x / d);
y = (s8)(xy * max * y / d);
}
}
else {
d = xy * y + (max - xy) * x;
if (xy * max < d) {
x = (s8)(xy * max * x / d);
y = (s8)(xy * max * y / d);
}
}
*px = (s8)(signX * x);
*py = (s8)(signY * y);
}
static void ClampTrigger(u8 *trigger, u8 min, u8 max)
{
if (*trigger <= min) {
*trigger = 0;
}
else {
if (max < *trigger) {
*trigger = max;
}
*trigger -= min;
}
}
void PADClamp(PADStatus *status)
{
// int i;
// for (i = 0; i < PAD_CHANMAX; i++, status++) {
// if (status->err != PAD_ERR_NONE) {
// continue;
// }
// ClampStick(&status->stickX, &status->stickY, ClampRegion.maxStick, ClampRegion.xyStick, ClampRegion.minStick);
// ClampStick(&status->substickX, &status->substickY, ClampRegion.maxSubstick, ClampRegion.xySubstick, ClampRegion.minSubstick);
// ClampTrigger(&status->triggerL, ClampRegion.minTrigger, ClampRegion.maxTrigger);
// ClampTrigger(&status->triggerR, ClampRegion.minTrigger, ClampRegion.maxTrigger);
// }
}