fix gun handling in enhancement mode
[pcsx_rearmed.git] / frontend / plugin_lib.c
index 79f41fe..9cbfe59 100644 (file)
 #include "../libpcsxcore/new_dynarec/new_dynarec.h"
 #include "../libpcsxcore/psemu_plugin_defs.h"
 #include "../plugins/gpulib/cspace.h"
+#include "../plugins/dfinput/externals.h"
 
 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;
@@ -71,20 +73,24 @@ static __attribute__((noinline)) int get_cpu_ticks(void)
 static void print_msg(int h, int border)
 {
        if (pl_vout_bpp == 16)
-               pl_text_out16(border + 2, h - 10, "%s", hud_msg);
+               basic_text_out16_nf(pl_vout_buf, pl_vout_w,
+                       border + 2, h - 10, hud_msg);
 }
 
 static void print_fps(int h, int border)
 {
        if (pl_vout_bpp == 16)
-               pl_text_out16(border + 2, h - 10, "%2d %4.1f",
+               basic_text_out16(pl_vout_buf, pl_vout_w,
+                       border + 2, h - 10, "%2d %4.1f",
                        pl_rearmed_cbs.flips_per_sec, pl_rearmed_cbs.vsps_cur);
 }
 
 static void print_cpu_usage(int w, int h, int border)
 {
        if (pl_vout_bpp == 16)
-               pl_text_out16(w - border - 28, h - 10, "%3d", pl_rearmed_cbs.cpu_usage);
+               basic_text_out16(pl_vout_buf, pl_vout_w,
+                       pl_vout_w - border - 28, h - 10,
+                       "%3d", pl_rearmed_cbs.cpu_usage);
 }
 
 // draw 192x8 status of 24 sound channels
@@ -122,6 +128,8 @@ void pl_print_hud(int w, int h, int xborder)
        if (h < 16)
                return;
 
+       xborder += (pl_vout_w - w) / 2;
+
        if (g_opts & OPT_SHOWSPU)
                draw_active_chans(w, h);
 
@@ -192,7 +200,7 @@ static int resolution_ok(int w, int h)
        return w <= 1024 && h <= 512;
 }
 
-static void pl_vout_set_mode(int w, int h, int bpp)
+static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp)
 {
        int vout_w, vout_h, vout_bpp;
 
@@ -202,8 +210,10 @@ static void pl_vout_set_mode(int w, int h, int bpp)
                h = (h + 7) & ~7;
        vsync_cnt_ms_prev = vsync_cnt;
 
-       vout_w = psx_w = w;
-       vout_h = psx_h = h;
+       psx_w = raw_w;
+       psx_h = raw_h;
+       vout_w = w;
+       vout_h = h;
        vout_bpp = psx_bpp = bpp;
 
        pl_vout_scale = 1;
@@ -230,7 +240,7 @@ static void pl_vout_set_mode(int w, int h, int bpp)
        pl_vout_buf = plat_gvideo_set_mode(&vout_w, &vout_h, &vout_bpp);
        if (pl_vout_buf == NULL)
                fprintf(stderr, "failed to set mode %dx%d@%d\n",
-                       psx_w, psx_h, psx_bpp);
+                       vout_w, vout_h, psx_bpp);
        else {
                pl_vout_w = vout_w;
                pl_vout_h = vout_h;
@@ -383,7 +393,7 @@ int dispmode_doubleres(void)
 
 int dispmode_scale2x(void)
 {
-       if (psx_bpp != 16)
+       if (!resolution_ok(psx_w * 2, psx_h * 2) || psx_bpp != 16)
                return 0;
 
        dispmode_default();
@@ -394,7 +404,7 @@ int dispmode_scale2x(void)
 
 int dispmode_eagle2x(void)
 {
-       if (psx_bpp != 16)
+       if (!resolution_ok(psx_w * 2, psx_h * 2) || psx_bpp != 16)
                return 0;
 
        dispmode_default();
@@ -430,9 +440,39 @@ 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_)
+{
+       #define 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;
+       #undef d
+}
+
 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 +481,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]);
 }
@@ -474,11 +523,6 @@ static void update_input(void)
        emu_set_action(emu_act);
 
        in_keystate = actions[IN_BINDTYPE_PLAYER12];
-#ifdef X11
-       extern int x11_update_keys(unsigned int *action);
-       in_keystate |= x11_update_keys(&emu_act);
-       emu_set_action(emu_act);
-#endif
 }
 #else /* MAEMO */
 static void update_input(void)
@@ -486,13 +530,13 @@ static void update_input(void)
 }
 #endif
 
-void pl_update_gun(int *xn, int *xres, int *y, int *in)
+void pl_update_gun(int *xn, int *yn, int *xres, int *yres, int *in)
 {
        if (tsdev)
-               pl_gun_ts_update(tsdev, xn, y, in);
+               pl_gun_ts_update(tsdev, xn, yn, in);
 
-       *xres = pl_vout_w;
-       *y = *y * pl_vout_h >> 10;
+       *xres = psx_w;
+       *yres = psx_h;
 }
 
 #define MAX_LAG_FRAMES 3
@@ -607,57 +651,6 @@ void pl_timing_prepare(int is_pal_)
                (100000*100 / (unsigned long)(pl_rearmed_cbs.gpu_peops.fFrameRateHz*100));
 }
 
-static void pl_text_out16_(int x, int y, const char *text)
-{
-       int i, l, w = pl_vout_w;
-       unsigned short *screen;
-       unsigned short val = 0xffff;
-
-       x &= ~1;
-       screen = (unsigned short *)pl_vout_buf + x + y * w;
-       for (i = 0; ; i++, screen += 8)
-       {
-               char c = text[i];
-               if (c == 0)
-                       break;
-               if (c == ' ')
-                       continue;
-
-               for (l = 0; l < 8; l++)
-               {
-                       unsigned char fd = fontdata8x8[c * 8 + l];
-                       unsigned short *s = screen + l * w;
-                       unsigned int *s32 = (void *)s;
-
-                       s32[0] = (s32[0] >> 1) & 0x7bef7bef;
-                       s32[1] = (s32[1] >> 1) & 0x7bef7bef;
-                       s32[2] = (s32[2] >> 1) & 0x7bef7bef;
-                       s32[3] = (s32[3] >> 1) & 0x7bef7bef;
-
-                       if (fd&0x80) s[0] = val;
-                       if (fd&0x40) s[1] = val;
-                       if (fd&0x20) s[2] = val;
-                       if (fd&0x10) s[3] = val;
-                       if (fd&0x08) s[4] = val;
-                       if (fd&0x04) s[5] = val;
-                       if (fd&0x02) s[6] = val;
-                       if (fd&0x01) s[7] = val;
-               }
-       }
-}
-
-void pl_text_out16(int x, int y, const char *texto, ...)
-{
-       va_list args;
-       char    buffer[256];
-
-       va_start(args, texto);
-       vsnprintf(buffer, sizeof(buffer), texto, args);
-       va_end(args);
-
-       pl_text_out16_(x, y, buffer);
-}
-
 static void pl_get_layer_pos(int *x, int *y, int *w, int *h)
 {
        *x = g_layer_x;