frontend: change nub_adjust ranges
[pcsx_rearmed.git] / frontend / plugin_lib.c
index 5017a1b..8546c92 100644 (file)
@@ -35,6 +35,7 @@
 int in_type1, in_type2;
 int in_a1[2] = { 127, 127 }, in_a2[2] = { 127, 127 };
 int in_adev[2] = { -1, -1 }, in_adev_axis[2][2] = {{ 0, 1 }, { 0, 1 }};
+int in_adev_is_nublike[2];
 int in_keystate, in_state_gun;
 int in_enable_vibration;
 void *tsdev;
@@ -430,9 +431,38 @@ void pl_switch_dispmode(void)
 }
 
 #ifndef MAEMO
+/* adjust circle-like analog inputs to better match
+ * more square-like analogs in PSX */
+static void update_analog_nub_adjust(int *x_, int *y_)
+{
+       const int d = 16;
+       static const int scale[] =
+               { 0 - d*2,  0 - d*2,  0 - d*2, 12 - d*2,
+                30 - d*2, 60 - d*2, 75 - d*2, 60 - d*2, 60 - d*2 };
+       int x = abs(*x_);
+       int y = abs(*y_);
+       int scale_x = scale[y / 16];
+       int scale_y = scale[x / 16];
+
+       if (x) {
+               x += d + (x * scale_x >> 8);
+               if (*x_ < 0)
+                       x = -x;
+       }
+       if (y) {
+               y += d + (y * scale_y >> 8);
+               if (*y_ < 0)
+                       y = -y;
+       }
+
+       *x_ = x;
+       *y_ = y;
+}
+
 static void update_analogs(void)
 {
        int *nubp[2] = { in_a1, in_a2 };
+       int vals[2];
        int i, a, v, ret;
 
        for (i = 0; i < 2; i++)
@@ -441,14 +471,23 @@ static void update_analogs(void)
                        continue;
 
                for (a = 0; a < 2; a++) {
-                       nubp[i][a] = 127;
+                       vals[a] = 0;
 
                        ret = in_update_analog(in_adev[i], in_adev_axis[i][a], &v);
-                       if (ret == 0) {
-                               v = v / (IN_ABS_RANGE / 128) + 127;
-                               nubp[i][a] = v < 0 ? 0 : v;
-                       }
+                       if (ret == 0)
+                               vals[a] = 128 * v / IN_ABS_RANGE;
                }
+
+               if (in_adev_is_nublike[i])
+                       update_analog_nub_adjust(&vals[0], &vals[1]);
+
+               for (a = 0; a < 2; a++) {
+                       v = vals[a] + 127;
+                       if (v < 0) v = 0;
+                       else if (v > 255) v = 255;
+                       nubp[i][a] = v;
+               }
+
        }
        //printf("%4d %4d %4d %4d\n", in_a1[0], in_a1[1], in_a2[0], in_a2[1]);
 }