Merge pull request #351 from SindenLightgun/master
authorTwinaphex <libretro@gmail.com>
Thu, 24 Oct 2019 18:11:31 +0000 (20:11 +0200)
committerGitHub <noreply@github.com>
Thu, 24 Oct 2019 18:11:31 +0000 (20:11 +0200)
Basic Guncon support

1  2 
frontend/libretro.c
frontend/libretro_core_options.h

diff --combined frontend/libretro.c
@@@ -78,7 -78,6 +78,7 @@@ static bool display_internal_fps = fals
  static unsigned frame_count = 0;
  static bool libretro_supports_bitmasks = false;
  static int show_advanced_gpu_peops_settings = -1;
 +static int show_advanced_gpu_unai_settings  = -1;
  
  static unsigned previous_width = 0;
  static unsigned previous_height = 0;
@@@ -572,6 -571,8 +572,8 @@@ static void update_controller_port_vari
                        in_type[port] = PSE_PAD_TYPE_ANALOGPAD;
                else if (strcmp(var.value, "negcon") == 0)
                        in_type[port] = PSE_PAD_TYPE_NEGCON;
+               else if (strcmp(var.value, "guncon") == 0)
+                       in_type[port] = PSE_PAD_TYPE_GUNCON;
                else if (strcmp(var.value, "none") == 0)
                        in_type[port] = PSE_PAD_TYPE_NONE;
                // else 'default' case, do nothing
@@@ -1434,7 -1435,6 +1436,7 @@@ static void update_variables(bool in_fl
        if (strcmp(var.value, "disabled") == 0) {
           pl_rearmed_cbs.gpu_peops.iUseDither = 0;
           pl_rearmed_cbs.gpu_peopsgl.bDrawDither = 0;
 +         pl_rearmed_cbs.gpu_unai.dithering = 0;
  #ifdef __ARM_NEON__
           pl_rearmed_cbs.gpu_neon.allow_dithering = 0;
  #endif
        else if (strcmp(var.value, "enabled") == 0) {
           pl_rearmed_cbs.gpu_peops.iUseDither = 1;
           pl_rearmed_cbs.gpu_peopsgl.bDrawDither = 1;
 +         pl_rearmed_cbs.gpu_unai.dithering = 1;
  #ifdef __ARM_NEON__
           pl_rearmed_cbs.gpu_neon.allow_dithering = 1;
  #endif
     }
  #endif
  
 +#ifdef GPU_UNAI
 +   var.key = "pcsx_rearmed_gpu_unai_ilace_force";
 +   var.value = NULL;
 +
 +   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
 +   {
 +      if (strcmp(var.value, "disabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.ilace_force = 0;
 +      else if (strcmp(var.value, "enabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.ilace_force = 1;
 +   }
 +
 +   var.key = "pcsx_rearmed_gpu_unai_pixel_skip";
 +   var.value = NULL;
 +
 +   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
 +   {
 +      if (strcmp(var.value, "disabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.pixel_skip = 0;
 +      else if (strcmp(var.value, "enabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.pixel_skip = 1;
 +   }
 +
 +   var.key = "pcsx_rearmed_gpu_unai_lighting";
 +   var.value = NULL;
 +
 +   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
 +   {
 +      if (strcmp(var.value, "disabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.lighting = 0;
 +      else if (strcmp(var.value, "enabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.lighting = 1;
 +   }
 +
 +   var.key = "pcsx_rearmed_gpu_unai_fast_lighting";
 +   var.value = NULL;
 +
 +   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
 +   {
 +      if (strcmp(var.value, "disabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.fast_lighting = 0;
 +      else if (strcmp(var.value, "enabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.fast_lighting = 1;
 +   }
 +
 +   var.key = "pcsx_rearmed_gpu_unai_blending";
 +   var.value = NULL;
 +
 +   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
 +   {
 +      if (strcmp(var.value, "disabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.blending = 0;
 +      else if (strcmp(var.value, "enabled") == 0)
 +         pl_rearmed_cbs.gpu_unai.blending = 1;
 +   }
 +
 +   var.key = "pcsx_rearmed_show_gpu_unai_settings";
 +   var.value = NULL;
 +
 +   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
 +   {
 +      int show_advanced_gpu_unai_settings_prev = show_advanced_gpu_unai_settings;
 +
 +      show_advanced_gpu_unai_settings = 1;
 +      if (strcmp(var.value, "disabled") == 0)
 +         show_advanced_gpu_unai_settings = 0;
 +
 +      if (show_advanced_gpu_unai_settings != show_advanced_gpu_unai_settings_prev)
 +      {
 +         unsigned i;
 +         struct retro_core_option_display option_display;
 +         char gpu_unai_option[5][40] = {
 +            "pcsx_rearmed_gpu_unai_blending",
 +            "pcsx_rearmed_gpu_unai_lighting",
 +            "pcsx_rearmed_gpu_unai_fast_lighting",
 +            "pcsx_rearmed_gpu_unai_ilace_force",
 +            "pcsx_rearmed_gpu_unai_pixel_skip",
 +         };
 +
 +         option_display.visible = show_advanced_gpu_unai_settings;
 +
 +         for (i = 0; i < 5; i++)
 +         {
 +            option_display.key = gpu_unai_option[i];
 +            environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY, &option_display);
 +         }
 +      }
 +   }
 +#endif // GPU_UNAI
 +
     if (in_flight) {
        // inform core things about possible config changes
        plugin_call_rearmed_cbs();
@@@ -2000,6 -1909,93 +2002,93 @@@ void retro_run(void
           }
        }
  
+               if (in_type[i] == PSE_PAD_TYPE_GUNCON)
+               {
+                       //ToDo move across to:
+                       //RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X
+                       //RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y   
+                       //RETRO_DEVICE_ID_LIGHTGUN_TRIGGER
+                       //RETRO_DEVICE_ID_LIGHTGUN_RELOAD
+                       //RETRO_DEVICE_ID_LIGHTGUN_AUX_A 
+                       //RETRO_DEVICE_ID_LIGHTGUN_AUX_B
+                       //Though not sure these are hooked up properly on the Pi
+                       
+                       //ToDo
+                       //Put the controller index back to i instead of hardcoding to 1 when the libretro overlay crash bug is fixed
+                       //This is required for 2 player
+                       
+                       //GUNCON has 3 controls, Trigger,A,B which equal Circle,Start,Cross
+                       
+                       // Trigger
+                       //The 1 is hardcoded instead of i to prevent the overlay mouse button libretro crash bug
+                       if (input_state_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT)){
+                               in_keystate[i] |= (1 << DKEY_CIRCLE);
+                       }
+                       
+                       // A
+                       if (input_state_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT)){
+                               in_keystate[i] |= (1 << DKEY_START);
+                       }
+                       
+                       // B
+                       if (input_state_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE)){
+                               in_keystate[i] |= (1 << DKEY_CROSS);
+                       }
+                       
+                       //The 1 is hardcoded instead of i to prevent the overlay mouse button libretro crash bug
+                       int gunx = input_state_cb(1, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X);
+                       int guny = input_state_cb(1, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y);
+                       
+                       //This adjustment process gives the user the ability to manually align the mouse up better 
+                       //with where the shots are in the emulator.
+                       
+                       //Percentage distance of screen to adjust 
+                       int GunconAdjustX = 0;
+                       int GunconAdjustY = 0;
+                       
+                       //Used when out by a percentage
+                       float GunconAdjustRatioX = 1;
+                       float GunconAdjustRatioY = 1;
+                               
+                       struct retro_variable var;
+                       var.value = NULL;
+                       var.key = "pcsx_rearmed_gunconadjustx";
+                       if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+                       {
+                               GunconAdjustX = atoi(var.value);        
+                       }
+                               
+                       var.value = NULL;
+                       var.key = "pcsx_rearmed_gunconadjusty";
+                       if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+                       {
+                               GunconAdjustY = atoi(var.value);        
+                       } 
+                       
+                       
+                       var.value = NULL;
+                       var.key = "pcsx_rearmed_gunconadjustratiox";
+                       if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+                       {
+                               GunconAdjustRatioX = atof(var.value);   
+                       } 
+                       
+                       
+                       var.value = NULL;
+                       var.key = "pcsx_rearmed_gunconadjustratioy";
+                       if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+                       {
+                               GunconAdjustRatioY = atof(var.value);   
+                       } 
+                       
+                       //Mouse range is -32767 -> 32767
+                       //1% is about 655
+                       //Use the left analog stick field to store the absolute coordinates
+                       in_analog_left[0][0] = (gunx*GunconAdjustRatioX) + (GunconAdjustX * 655);
+                       in_analog_left[0][1] = (guny*GunconAdjustRatioY) + (GunconAdjustY * 655);
+                       
+                       
+               }
                if (in_type[i] == PSE_PAD_TYPE_NEGCON)
                {
                        // Query digital inputs
                        // > NeGcon L
                        in_analog_left[i][1] = get_analog_button(ret, input_state_cb, i, RETRO_DEVICE_ID_JOYPAD_L);
                }
-               else
+               if (in_type[i] != PSE_PAD_TYPE_NEGCON && in_type[i] != PSE_PAD_TYPE_GUNCON)
                {
                        // Query digital inputs
                        for (j = 0; j < RETRO_PSX_MAP_LEN; j++)
@@@ -106,6 -106,7 +106,7 @@@ struct retro_core_option_definition opt
           { "analog",    NULL },
           { "dualshock", NULL },
           { "negcon",    NULL },
+          { "guncon",    NULL },
           { "none",      NULL },
           { NULL, NULL },
        },
           { "analog",    NULL },
           { "dualshock", NULL },
           { "negcon",    NULL },
+          { "guncon",    NULL },
           { "none",      NULL },
           { NULL, NULL },
        },
           { "analog",    NULL },
           { "dualshock", NULL },
           { "negcon",    NULL },
+          { "guncon",    NULL },
           { "none",      NULL },
           { NULL, NULL },
        },
           { "analog",    NULL },
           { "dualshock", NULL },
           { "negcon",    NULL },
+          { "guncon",    NULL },
           { "none",      NULL },
           { NULL, NULL },
        },
           { "analog",    NULL },
           { "dualshock", NULL },
           { "negcon",    NULL },
+          { "guncon",    NULL },
           { "none",      NULL },
           { NULL, NULL },
        },
           { "analog",    NULL },
           { "dualshock", NULL },
           { "negcon",    NULL },
+          { "guncon",    NULL },
           { "none",      NULL },
           { NULL, NULL },
        },
           { "analog",    NULL },
           { "dualshock", NULL },
           { "negcon",    NULL },
+          { "guncon",    NULL },
           { "none",      NULL },
           { NULL, NULL },
        },
           { "analog",    NULL },
           { "dualshock", NULL },
           { "negcon",    NULL },
+          { "guncon",    NULL },
           { "none",      NULL },
           { NULL, NULL },
        },
        },
        "enabled",
     },
+    {
+       "pcsx_rearmed_gunconadjustx",
+       "Guncon Adjust X",
+       "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies an increment on the x axis.",
+       {
+          { "0", NULL },
+          { "-25", NULL },
+          { "-24", NULL },
+          { "-23", NULL },
+          { "-22", NULL },
+          { "-21", NULL },
+          { "-20", NULL },
+          { "-19", NULL },
+          { "-18", NULL },
+          { "-17", NULL },
+          { "-16", NULL },
+          { "-15", NULL },
+          { "-14", NULL },
+          { "-13", NULL },
+          { "-12", NULL },
+          { "-11", NULL },
+          { "-10", NULL },
+          { "-09", NULL },
+          { "-08", NULL },
+          { "-07", NULL },
+          { "-06", NULL },
+          { "-05", NULL },
+          { "-04", NULL },
+          { "-03", NULL },
+          { "-02", NULL },
+          { "-01", NULL },
+          { "00", NULL },
+          { "01", NULL },
+          { "02", NULL },
+          { "03", NULL },
+          { "04", NULL },
+          { "05", NULL },
+          { "06", NULL },
+          { "07", NULL },
+          { "08", NULL },
+          { "09", NULL },
+          { "10", NULL },
+          { "11", NULL },
+          { "12", NULL },
+          { "13", NULL },
+          { "14", NULL },
+          { "15", NULL },
+          { "16", NULL },
+          { "17", NULL },
+          { "18", NULL },
+          { "19", NULL },
+          { "20", NULL },
+          { "21", NULL },
+          { "22", NULL },
+          { "23", NULL },
+          { "24", NULL },
+          { "25", NULL },
+          { NULL, NULL },
+       },
+       "0",
+    },
+    {
+       "pcsx_rearmed_gunconadjusty",
+       "Guncon Adjust Y",
+       "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies an increment on the y axis.",
+       {
+          { "0", NULL },
+          { "-25", NULL },
+          { "-24", NULL },
+          { "-23", NULL },
+          { "-22", NULL },
+          { "-21", NULL },
+          { "-20", NULL },
+          { "-19", NULL },
+          { "-18", NULL },
+          { "-17", NULL },
+          { "-16", NULL },
+          { "-15", NULL },
+          { "-14", NULL },
+          { "-13", NULL },
+          { "-12", NULL },
+          { "-11", NULL },
+          { "-10", NULL },
+          { "-09", NULL },
+          { "-08", NULL },
+          { "-07", NULL },
+          { "-06", NULL },
+          { "-05", NULL },
+          { "-04", NULL },
+          { "-03", NULL },
+          { "-02", NULL },
+          { "-01", NULL },
+          { "00", NULL },
+          { "01", NULL },
+          { "02", NULL },
+          { "03", NULL },
+          { "04", NULL },
+          { "05", NULL },
+          { "06", NULL },
+          { "07", NULL },
+          { "08", NULL },
+          { "09", NULL },
+          { "10", NULL },
+          { "11", NULL },
+          { "12", NULL },
+          { "13", NULL },
+          { "14", NULL },
+          { "15", NULL },
+          { "16", NULL },
+          { "17", NULL },
+          { "18", NULL },
+          { "19", NULL },
+          { "20", NULL },
+          { "21", NULL },
+          { "22", NULL },
+          { "23", NULL },
+          { "24", NULL },
+          { "25", NULL },
+          { NULL, NULL },
+       },
+       "0",
+    },
+    {
+       "pcsx_rearmed_gunconadjustratiox",
+       "Guncon Adjust Ratio X",
+       "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies a ratio on the x axis.",
+       {
+          { "1", NULL },
+          { "0.75", NULL },
+          { "0.76", NULL },
+          { "0.77", NULL },
+          { "0.78", NULL },
+          { "0.79", NULL },
+          { "0.80", NULL },
+          { "0.81", NULL },
+          { "0.82", NULL },
+          { "0.83", NULL },
+          { "0.84", NULL },
+          { "0.85", NULL },
+          { "0.86", NULL },
+          { "0.87", NULL },
+          { "0.88", NULL },
+          { "0.89", NULL },
+          { "0.90", NULL },
+          { "0.91", NULL },
+          { "0.92", NULL },
+          { "0.93", NULL },
+          { "0.94", NULL },
+          { "0.95", NULL },
+          { "0.96", NULL },
+          { "0.97", NULL },
+          { "0.98", NULL },
+          { "0.99", NULL },
+          { "1.00", NULL },
+          { "1.01", NULL },
+          { "1.02", NULL },
+          { "1.03", NULL },
+          { "1.04", NULL },
+          { "1.05", NULL },
+          { "1.06", NULL },
+          { "1.07", NULL },
+          { "1.08", NULL },
+          { "1.09", NULL },
+          { "1.10", NULL },
+          { "1.11", NULL },
+          { "1.12", NULL },
+          { "1.13", NULL },
+          { "1.14", NULL },
+          { "1.15", NULL },
+          { "1.16", NULL },
+          { "1.17", NULL },
+          { "1.18", NULL },
+          { "1.19", NULL },
+          { "1.20", NULL },
+          { "1.21", NULL },
+          { "1.22", NULL },
+          { "1.23", NULL },
+          { "1.24", NULL },
+          { "1.25", NULL },
+          { NULL, NULL },
+       },
+       "1",
+    },
+    {
+       "pcsx_rearmed_gunconadjustratioy",
+       "Guncon Adjust Ratio Y",
+       "When using Guncon mode, you can override aim in emulator if shots misaligned, this applies a ratio on the y axis.",
+       {
+          { "1", NULL },
+          { "0.75", NULL },
+          { "0.76", NULL },
+          { "0.77", NULL },
+          { "0.78", NULL },
+          { "0.79", NULL },
+          { "0.80", NULL },
+          { "0.81", NULL },
+          { "0.82", NULL },
+          { "0.83", NULL },
+          { "0.84", NULL },
+          { "0.85", NULL },
+          { "0.86", NULL },
+          { "0.87", NULL },
+          { "0.88", NULL },
+          { "0.89", NULL },
+          { "0.90", NULL },
+          { "0.91", NULL },
+          { "0.92", NULL },
+          { "0.93", NULL },
+          { "0.94", NULL },
+          { "0.95", NULL },
+          { "0.96", NULL },
+          { "0.97", NULL },
+          { "0.98", NULL },
+          { "0.99", NULL },
+          { "1.00", NULL },
+          { "1.01", NULL },
+          { "1.02", NULL },
+          { "1.03", NULL },
+          { "1.04", NULL },
+          { "1.05", NULL },
+          { "1.06", NULL },
+          { "1.07", NULL },
+          { "1.08", NULL },
+          { "1.09", NULL },
+          { "1.10", NULL },
+          { "1.11", NULL },
+          { "1.12", NULL },
+          { "1.13", NULL },
+          { "1.14", NULL },
+          { "1.15", NULL },
+          { "1.16", NULL },
+          { "1.17", NULL },
+          { "1.18", NULL },
+          { "1.19", NULL },
+          { "1.20", NULL },
+          { "1.21", NULL },
+          { "1.22", NULL },
+          { "1.23", NULL },
+          { "1.24", NULL },
+          { "1.25", NULL },
+          { NULL, NULL },
+       },
+       "1",
+    },
     {
        "pcsx_rearmed_dithering",
        "Enable Dithering",
     },
  #endif
  
 +    /* GPU UNAI Advanced Options */
 +#ifdef GPU_UNAI
 +   {
 +      "pcsx_rearmed_show_gpu_unai_settings",
 +      "Advance GPU UNAI/PCSX4All Settings",
 +      "Shows or hides advanced gpu settings. A core restart might be needed for settings to take effect. NOTE: Quick Menu must be toggled for this setting to take effect.",
 +      {
 +         { "disabled", NULL },
 +         { "enabled",  NULL },
 +         { NULL, NULL},
 +      },
 +      "disabled",
 +   },
 +   {
 +      "pcsx_rearmed_gpu_unai_blending",
 +      "(GPU) Enable Blending",
 +      NULL,
 +      {
 +         { "disabled", NULL },
 +         { "enabled",  NULL },
 +         { NULL, NULL},
 +      },
 +      "enabled",
 +   },
 +   {
 +      "pcsx_rearmed_gpu_unai_lighting",
 +      "(GPU) Enable Lighting",
 +      NULL,
 +      {
 +         { "disabled", NULL },
 +         { "enabled",  NULL },
 +         { NULL, NULL},
 +      },
 +      "enabled",
 +   },
 +   {
 +      "pcsx_rearmed_gpu_unai_fast_lighting",
 +      "(GPU) Enable Fast Lighting",
 +      NULL,
 +      {
 +         { "disabled", NULL },
 +         { "enabled",  NULL },
 +         { NULL, NULL},
 +      },
 +      "enabled",
 +   },
 +   {
 +      "pcsx_rearmed_gpu_unai_ilace_force",
 +      "(GPU) Enable Forced Interlace",
 +      NULL,
 +      {
 +         { "disabled", NULL },
 +         { "enabled",  NULL },
 +         { NULL, NULL},
 +      },
 +      "disabled",
 +   },
 +   {
 +      "pcsx_rearmed_gpu_unai_pixel_skip",
 +      "(GPU) Enable Pixel Skip",
 +      NULL,
 +      {
 +         { "disabled", NULL },
 +         { "enabled",  NULL },
 +         { NULL, NULL},
 +      },
 +      "disabled",
 +   },
 +#endif /* GPU UNAI Advanced Settings */
 +
     {
        "pcsx_rearmed_show_bios_bootlogo",
        "Show Bios Bootlogo",