119 lines
2.1 KiB
C
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);
|
|
// }
|
|
}
|