Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Gemba/22d55e309f1be1cbfc06b12bd8a4986f to your computer and use it in GitHub Desktop.
Save Gemba/22d55e309f1be1cbfc06b12bd8a4986f to your computer and use it in GitHub Desktop.
Adds an option to rotate mouse and analog stick input (90 degrees CCW) for upright / book mode games in lr-desmume2015, tested against d6128e6b commit. Workaround until https://github.com/libretro/desmume2015/issues/98 is fixed.
diff --git a/desmume/src/libretro/libretro.cpp b/desmume/src/libretro/libretro.cpp
index 4d32d238..04ead997 100644
--- a/desmume/src/libretro/libretro.cpp
+++ b/desmume/src/libretro/libretro.cpp
@@ -33,6 +33,7 @@ static int delay_timer = 0;
static bool quick_switch_enable = false;
static bool mouse_enable = false;
static double mouse_speed= 1.0;
+static bool mouse_rotate_90ccw = false;
static double mouse_x_delta = 0.0;
static double mouse_y_delta = 0.0;
static int pointer_device_l = 0;
@@ -745,6 +746,18 @@ static void check_variables(bool first_boot)
else
mouse_speed = 1.0f;
+ var.key = "desmume_mouse_rotate_90ccw";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (!strcmp(var.value, "enabled"))
+ mouse_rotate_90ccw = true;
+ else if (!strcmp(var.value, "disabled"))
+ mouse_rotate_90ccw = false;
+ }
+ else
+ mouse_rotate_90ccw = false;
+
var.key = "desmume_pointer_device_l";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
@@ -1050,6 +1063,7 @@ void retro_set_environment(retro_environment_t cb)
{ "desmume_pointer_mouse", "Enable mouse/pointer; enabled|disabled" },
{ "desmume_pointer_type", "Pointer type; mouse|touch" },
{ "desmume_mouse_speed", "Mouse Speed; 1.0|1.5|2.0|0.125|0.25|0.5"},
+ { "desmume_mouse_rotate_90ccw", "Rotate mouse/analog input by 90 deg CCW for upright games; disabled|enabled"},
{ "desmume_pointer_colour", "Pointer Colour; white|black|red|blue|yellow"},
{ "desmume_pointer_device_l", "Pointer mode l-analog; none|emulated|absolute|pressed" },
{ "desmume_pointer_device_r", "Pointer mode r-analog; none|emulated|absolute|pressed" },
@@ -1268,11 +1282,20 @@ void retro_run (void)
if((pointer_device_l == 1) && (pointer_device_r == 1))
{
- analogX_l = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
- analogY_l = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
- analogX_r = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
- analogY_r = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
-
+ if (mouse_rotate_90ccw)
+ {
+ analogX_l = -input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ analogY_l = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
+ analogX_r = -input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ analogY_r = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
+ }
+ else
+ {
+ analogX_l = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
+ analogY_l = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ analogX_r = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
+ analogY_r = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ }
double radius_l = sqrt(analogX_l * analogX_l + analogY_l * analogY_l);
double radius_r = sqrt(analogX_r * analogX_r + analogY_r * analogY_r);
@@ -1294,15 +1317,31 @@ void retro_run (void)
else if(pointer_device_l == 1)
{
- analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
- analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ if (mouse_rotate_90ccw)
+ {
+ analogX = -input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
+ }
+ else
+ {
+ analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
+ analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ }
radius = sqrt(analogX * analogX + analogY * analogY);
angle = atan2(analogY, analogX);
}
else
{
- analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
- analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ if (mouse_rotate_90ccw)
+ {
+ analogX = -input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
+ }
+ else
+ {
+ analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration;
+ analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration;
+ }
radius = sqrt(analogX * analogX + analogY * analogY);
angle = atan2(analogY, analogX);
}
@@ -1468,8 +1507,18 @@ void retro_run (void)
// TOUCH: Mouse
if(!touchEnabled)
{
- int16_t mouseX = input_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
- int16_t mouseY = input_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
+ int16_t mouseX;
+ int16_t mouseY;
+ if (mouse_rotate_90ccw)
+ {
+ mouseX = -input_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
+ mouseY = input_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
+ }
+ else
+ {
+ mouseX = input_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
+ mouseY = input_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
+ }
have_touch = have_touch || input_cb(0, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT);
mouse_x_delta += mouseX * mouse_speed;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment