Merge branch 'newluastuff'
fixes #198 # Conflicts: # desmume/ChangeLog # desmume/src/Makefile.am # desmume/src/OGLRender.cpp # desmume/src/OGLRender.h # desmume/src/OGLRender_3_2.cpp # desmume/src/OGLRender_3_2.h # desmume/src/render3D.cpp # desmume/src/render3D.h
This commit is contained in:
commit
c741f37c11
|
@ -20,6 +20,7 @@
|
|||
#if defined(WIN32)
|
||||
#include <windows.h>
|
||||
#include <direct.h>
|
||||
#include <MMSystem.h>
|
||||
|
||||
typedef HMENU PlatformMenu; // hMenu
|
||||
#define MAX_MENU_COUNT (IDC_LUAMENU_RESERVE_END - IDC_LUAMENU_RESERVE_START + 1)
|
||||
|
@ -4656,6 +4657,90 @@ DEFINE_LUA_FUNCTION(stylus_write, "table")
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
const char* s_dpadDirections[4] = {"up", "right", "down", "left"};
|
||||
const char* s_buttonNames[33] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32"};
|
||||
#endif
|
||||
// this function takes two optional variables
|
||||
// joystickID: a value (0-15) that identifies the controller to read; default is 0 which is the "preferred device" set in the control panel
|
||||
// returnDiagonals: a boolean (true/false) that determines whether or not to return diagonal values from a supported D-pad; default is false, which ignores diagonal values
|
||||
DEFINE_LUA_FUNCTION(controller_get, "[joystickID = 0 [,returnDiagonals = false]]") {
|
||||
unsigned int i_joystickID = 0;bool f_returnDiagonals = 0; // initialize optional variables
|
||||
switch (lua_gettop(L)) { // get number of arguments
|
||||
case 1:
|
||||
i_joystickID = lua_tonumber(L,1);
|
||||
break;
|
||||
case 2:
|
||||
i_joystickID = lua_tonumber(L,1);
|
||||
if (lua_isboolean(L,2)) { // only accept true/false
|
||||
f_returnDiagonals = lua_toboolean(L,2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
lua_newtable(L); // create new empty table
|
||||
|
||||
JOYCAPS joycaps;
|
||||
MMRESULT joygetdevcaps_result = joyGetDevCaps(i_joystickID, &joycaps, sizeof(joycaps)); // get controller's joystick (dpad) capabilities and number of buttons
|
||||
if (joygetdevcaps_result != JOYERR_NOERROR) {return 1;} // joystick doesn't exist so return an empty table
|
||||
|
||||
JOYINFOEX joyinfoex;
|
||||
joyinfoex.dwSize = sizeof(joyinfoex);
|
||||
joyinfoex.dwFlags = JOY_RETURNBUTTONS | JOY_RETURNPOV;
|
||||
MMRESULT joygetposex_result = joyGetPosEx(i_joystickID, &joyinfoex); // query joystick's pov and buttons
|
||||
if (joygetposex_result != JOYERR_NOERROR) {return 1;} // joystick doesn't exist so return an empty table
|
||||
|
||||
bool dpad[4] = {0,0,0,0}; // up, right, down, left;
|
||||
if ((joycaps.wCaps & JOYCAPS_HASPOV) && (joycaps.wCaps & JOYCAPS_POV4DIR)) { // confirm joystick has a pov that supports discrete values
|
||||
if (joyinfoex.dwPOV != JOY_POVCENTERED) { // dpad is neutral
|
||||
if (!(joyinfoex.dwPOV % 9000)) { // dpad is not currently on a diagonal so don't bother checking them
|
||||
dpad[(joyinfoex.dwPOV / 4500)/2] = true; // divide by 2 to ignore diagonals
|
||||
} else if (f_returnDiagonals) { // get the diagonal values if asked
|
||||
switch (joyinfoex.dwPOV) {
|
||||
case 4500: // up/right
|
||||
dpad[0] = true;
|
||||
dpad[1] = true;
|
||||
break;
|
||||
case 13500: // down/right
|
||||
dpad[2] = true;
|
||||
dpad[1] = true;
|
||||
break;
|
||||
case 22500: // down/left
|
||||
dpad[2] = true;
|
||||
dpad[3] = true;
|
||||
break;
|
||||
case 31500: // up/left
|
||||
dpad[0] = true;
|
||||
dpad[3] = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
// there is no supported dpad so all dpad booleans will default to false
|
||||
// should add support for JOYCAPS_POVCTS here but my three test controllers don't use it; unsure if it's even needed
|
||||
}
|
||||
|
||||
for (int i = 0; i < 4; i++) { // add dpad data to the table
|
||||
lua_pushboolean(L, dpad[i]); // dpad direction isPressed
|
||||
lua_setfield(L, -2, s_dpadDirections[i]); // dpad direction name
|
||||
}
|
||||
|
||||
int pow = 1; // joyinfoex.dwButtons is the total value of all pressed buttons; button values are powers of 2, starting with 2^0 for button 1
|
||||
for (unsigned int i = 1; i <= joycaps.wNumButtons; i++) { // add button data to the table
|
||||
lua_pushboolean(L, (joyinfoex.dwButtons & pow) ? (true) : (false)); // button isPressed
|
||||
lua_setfield(L, -2, s_buttonNames[i]); // button number
|
||||
pow *= 2;
|
||||
}
|
||||
|
||||
return 1; // return the table
|
||||
}
|
||||
static const struct luaL_reg controllerlib [] = {
|
||||
{"get", controller_get},
|
||||
{"read", controller_get},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
static int gcEMUFILE_MEMORY(lua_State *L)
|
||||
{
|
||||
EMUFILE_MEMORY** ppEmuFile = (EMUFILE_MEMORY**)luaL_checkudata(L, 1, "EMUFILE_MEMORY*");
|
||||
|
@ -5021,6 +5106,9 @@ void registerLibs(lua_State* L)
|
|||
luaL_register(L, "agg", aggbasicshapes);
|
||||
luaL_register(L, "agg", agggeneralattributes);
|
||||
luaL_register(L, "agg", aggcustom);
|
||||
|
||||
luaL_register(L, "controller", controllerlib);
|
||||
|
||||
|
||||
lua_settop(L, 0); // clean the stack, because each call to luaL_register leaves a table on top
|
||||
|
||||
|
|
Loading…
Reference in New Issue