Last active
February 1, 2021 20:54
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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