From 63f3c1781cec32bd4603cd92a9b788e3000a9594 Mon Sep 17 00:00:00 2001 From: jussi Date: Wed, 12 Mar 2025 23:26:01 +0200 Subject: Basic sdl3 support. --- src/gl.c | 2 +- src/lua_core.c | 8 +- src/platforms/core_desktop_sdl.c | 561 -------------------------------------- src/platforms/core_desktop_sdl2.c | 561 ++++++++++++++++++++++++++++++++++++++ src/platforms/core_desktop_sdl3.c | 23 ++ src/state.c | 2 +- 6 files changed, 591 insertions(+), 566 deletions(-) delete mode 100644 src/platforms/core_desktop_sdl.c create mode 100644 src/platforms/core_desktop_sdl2.c create mode 100644 src/platforms/core_desktop_sdl3.c (limited to 'src') diff --git a/src/gl.c b/src/gl.c index 4082e27..38fa7fe 100644 --- a/src/gl.c +++ b/src/gl.c @@ -32,7 +32,7 @@ Copy a block of pixels from one framebuffer object to another. Use nil RenderTexture for window framebuffer */ int lglBlitFramebuffer( lua_State* L ) { -#if defined( PLATFORM_DESKTOP ) || defined( PLATFORM_DESKTOP_SDL ) +#if defined( PLATFORM_DESKTOP ) || defined( PLATFORM_DESKTOP_SDL2 ) || defined( PLATFORM_DESKTOP_SDL3 ) if ( !( lua_isuserdata( L, 1 ) || lua_isnil( L, 1 ) ) || !( lua_isuserdata( L, 2 ) || lua_isnil( L, 2 ) ) ) { TraceLog( state->logLevelInvalid, "%s", "Argument needs to be RenderTexture or nil" ); lua_pushnil( L ); diff --git a/src/lua_core.c b/src/lua_core.c index de90e89..0191e98 100644 --- a/src/lua_core.c +++ b/src/lua_core.c @@ -17,8 +17,10 @@ #ifdef PLATFORM_DESKTOP #include "platforms/core_desktop_glfw.c" -#elif PLATFORM_DESKTOP_SDL - #include "platforms/core_desktop_sdl.c" +#elif PLATFORM_DESKTOP_SDL2 + #include "platforms/core_desktop_sdl2.c" +#elif PLATFORM_DESKTOP_SDL3 + #include "platforms/core_desktop_sdl3.c" #elif PLATFORM_WEB #include "platforms/core_web.c" #endif @@ -1451,7 +1453,7 @@ void luaCallInit() { void luaCallUpdate() { -#if defined PLATFORM_DESKTOP_SDL && defined LUA_EVENTS +#if defined PLATFORM_DESKTOP_SDL2 && defined LUA_EVENTS platformSendEvents(); #endif lua_State* L = state->luaState; diff --git a/src/platforms/core_desktop_sdl.c b/src/platforms/core_desktop_sdl.c deleted file mode 100644 index 4105b25..0000000 --- a/src/platforms/core_desktop_sdl.c +++ /dev/null @@ -1,561 +0,0 @@ -#include "main.h" -#include "lua_core.h" -#include "core.h" -#include "platforms/core_desktop_sdl.h" - -void platformDefineGlobals() { - lua_State* L = state->luaState; - - lua_getglobal( L, "RL" ); -/*DOC_DEFINES_START*/ - /* Keyboard events */ - assignGlobalInt( SDL_KEYDOWN, "SDL_KEYDOWN" ); // Key pressed - assignGlobalInt( SDL_KEYUP, "SDL_KEYUP" ); // Key released - /* Window events */ - assignGlobalInt( SDL_WINDOWEVENT, "SDL_WINDOWEVENT" ); // Window state change - /* Mouse events */ - assignGlobalInt( SDL_MOUSEMOTION, "SDL_MOUSEMOTION" ); // Mouse moved - assignGlobalInt( SDL_MOUSEBUTTONDOWN, "SDL_MOUSEBUTTONDOWN" ); // Mouse button pressed - assignGlobalInt( SDL_MOUSEBUTTONUP, "SDL_MOUSEBUTTONUP" ); // Mouse button released - assignGlobalInt( SDL_MOUSEWHEEL, "SDL_MOUSEWHEEL" ); // Mouse wheel motion - /* Joystick events */ - assignGlobalInt( SDL_JOYAXISMOTION, "SDL_JOYAXISMOTION" ); // Joystick axis motion - assignGlobalInt( SDL_JOYBALLMOTION, "SDL_JOYBALLMOTION" ); // Joystick trackball motion - assignGlobalInt( SDL_JOYHATMOTION, "SDL_JOYHATMOTION" ); - assignGlobalInt( SDL_JOYBUTTONDOWN, "SDL_JOYBUTTONDOWN" ); // Joystick button pressed - assignGlobalInt( SDL_JOYBUTTONUP, "SDL_JOYBUTTONUP" ); // Joystick button released - assignGlobalInt( SDL_JOYDEVICEADDED, "SDL_JOYDEVICEADDED" ); // Joystick connected - assignGlobalInt( SDL_JOYDEVICEREMOVED, "SDL_JOYDEVICEREMOVED" ); // Joystick disconnected - /* Controller events */ - assignGlobalInt( SDL_CONTROLLERAXISMOTION, "SDL_CONTROLLERAXISMOTION" ); // Controller axis motion - assignGlobalInt( SDL_CONTROLLERBUTTONDOWN, "SDL_CONTROLLERBUTTONDOWN" ); // Controller button pressed - assignGlobalInt( SDL_CONTROLLERBUTTONUP, "SDL_CONTROLLERBUTTONUP" ); // Controller button released - assignGlobalInt( SDL_CONTROLLERDEVICEADDED, "SDL_CONTROLLERDEVICEADDED" ); // Controller connected - assignGlobalInt( SDL_CONTROLLERDEVICEREMOVED, "SDL_CONTROLLERDEVICEREMOVED" ); // Controller disconnected - assignGlobalInt( SDL_CONTROLLERDEVICEREMAPPED, "SDL_CONTROLLERDEVICEREMAPPED" ); // Controller mapping updated - /* Touch events */ - assignGlobalInt( SDL_FINGERDOWN, "SDL_FINGERDOWN" ); // User has touched input device - assignGlobalInt( SDL_FINGERUP, "SDL_FINGERUP" ); // User stopped touching input device - assignGlobalInt( SDL_FINGERMOTION, "SDL_FINGERMOTION" ); // User is dragging finger on input device - /* Gesture events */ - assignGlobalInt( SDL_DOLLARGESTURE, "SDL_DOLLARGESTURE" ); - assignGlobalInt( SDL_DOLLARRECORD, "SDL_DOLLARRECORD" ); - assignGlobalInt( SDL_MULTIGESTURE, "SDL_MULTIGESTURE" ); - /* Window states */ - assignGlobalInt( SDL_WINDOWEVENT_SHOWN, "SDL_WINDOWEVENT_SHOWN" ); - assignGlobalInt( SDL_WINDOWEVENT_HIDDEN, "SDL_WINDOWEVENT_HIDDEN" ); - assignGlobalInt( SDL_WINDOWEVENT_EXPOSED, "SDL_WINDOWEVENT_EXPOSED" ); - assignGlobalInt( SDL_WINDOWEVENT_MOVED, "SDL_WINDOWEVENT_MOVED" ); - assignGlobalInt( SDL_WINDOWEVENT_RESIZED, "SDL_WINDOWEVENT_RESIZED" ); - assignGlobalInt( SDL_WINDOWEVENT_SIZE_CHANGED, "SDL_WINDOWEVENT_SIZE_CHANGED" ); - assignGlobalInt( SDL_WINDOWEVENT_MINIMIZED, "SDL_WINDOWEVENT_MINIMIZED" ); - assignGlobalInt( SDL_WINDOWEVENT_MAXIMIZED, "SDL_WINDOWEVENT_MAXIMIZED" ); - assignGlobalInt( SDL_WINDOWEVENT_RESTORED, "SDL_WINDOWEVENT_RESTORED" ); - assignGlobalInt( SDL_WINDOWEVENT_ENTER, "SDL_WINDOWEVENT_ENTER" ); - assignGlobalInt( SDL_WINDOWEVENT_LEAVE, "SDL_WINDOWEVENT_LEAVE" ); - assignGlobalInt( SDL_WINDOWEVENT_FOCUS_GAINED, "SDL_WINDOWEVENT_FOCUS_GAINED" ); - assignGlobalInt( SDL_WINDOWEVENT_FOCUS_LOST, "SDL_WINDOWEVENT_FOCUS_LOST" ); - assignGlobalInt( SDL_WINDOWEVENT_CLOSE, "SDL_WINDOWEVENT_CLOSE" ); - assignGlobalInt( SDL_WINDOWEVENT_TAKE_FOCUS, "SDL_WINDOWEVENT_TAKE_FOCUS" ); - assignGlobalInt( SDL_WINDOWEVENT_HIT_TEST, "SDL_WINDOWEVENT_HIT_TEST" ); - /* Keyboard and mouse states */ - assignGlobalInt( SDL_RELEASED, "SDL_RELEASED" ); - assignGlobalInt( SDL_PRESSED, "SDL_PRESSED" ); - /* Joystick hat motion */ - assignGlobalInt( SDL_HAT_LEFTUP, "SDL_HAT_LEFTUP" ); - assignGlobalInt( SDL_HAT_UP, "SDL_HAT_UP" ); - assignGlobalInt( SDL_HAT_RIGHTUP, "SDL_HAT_RIGHTUP" ); - assignGlobalInt( SDL_HAT_LEFT, "SDL_HAT_LEFT" ); - assignGlobalInt( SDL_HAT_CENTERED, "SDL_HAT_CENTERED" ); - assignGlobalInt( SDL_HAT_RIGHT, "SDL_HAT_RIGHT" ); - assignGlobalInt( SDL_HAT_LEFTDOWN, "SDL_HAT_LEFTDOWN" ); - assignGlobalInt( SDL_HAT_DOWN, "SDL_HAT_DOWN" ); - assignGlobalInt( SDL_HAT_RIGHTDOWN, "SDL_HAT_RIGHTDOWN" ); -/*DOC_DEFINES_END*/ - lua_pop( L, -1 ); -} - -/* Functions. */ - -/* -## SDL Core - Input-related functions: keyboard. -*/ - -/* -> keyName = RL.GetKeyName( int key ) - -Use this function to get a human-readable name for a key. If the key doesn't have a name, this function returns an empty string (""). - -- Success return string -*/ -int lcoreGetKeyName( lua_State* L ) { - int key = luaL_checkinteger( L, 1 ); - - lua_pushstring( L, SDL_GetKeyName( key ) ); - - return 1; -} - -/* -> keyName = RL.GetScancodeFromKey( int key ) - -Use this function to get the scancode corresponding to the given key code according to the current keyboard layout. - -- Success return int -*/ -int lcoreGetScancodeFromKey( lua_State* L ) { - int key = luaL_checkinteger( L, 1 ); - - lua_pushinteger( L, SDL_GetScancodeFromKey( key ) ); - - return 1; -} - -/* Events. */ - -/* -## SDL Events -*/ - -/* This function is not thread safe so we don't use Lua inside it directly. It only adds events to another queue. */ -static int SDLEventFilter( void* userdata, SDL_Event* event ) { - /* SDL_EVENT_POLL_SENTINEL = 0x7F00, /**< Signals the end of an event poll cycle */ - if ( event->type != SDL_QUIT && event->type != 0x7F00 && state->SDL_eventQueueLen < PLATFORM_SDL_EVENT_QUEUE_LEN ) { - state->SDL_eventQueue[ state->SDL_eventQueueLen ] = *event; - state->SDL_eventQueueLen++; - - // printf( "event %u state->SDL_eventQueueLen %d\n", event->type, state->SDL_eventQueueLen ); - } -} - -static void platformRegisterEvents() { - /* SDL Warning: Be very careful of what you do in the event filter function, as it may run in a different thread! */ - SDL_AddEventWatch( SDLEventFilter, NULL ); -} - -static void platformSendEvents() { - lua_State* L = state->luaState; - - lua_pushcfunction( L, luaTraceback ); - int tracebackidx = lua_gettop( L ); - - /* If RL.event is not defined, we don't need to proceed. */ - lua_getglobal( L, "RL" ); - lua_getfield( L, -1, "event" ); - - if ( !lua_isfunction( L, -1 ) ) { - state->SDL_eventQueueLen = 0; - return; - } - - for ( int i = 0; i < state->SDL_eventQueueLen; i++ ) { - bool call = false; - lua_getglobal( L, "RL" ); - lua_getfield( L, -1, "event" ); - - SDL_Event event = state->SDL_eventQueue[i]; - - switch ( event.type ) { -/* -> SDL_KeyboardEvent = { int type, int timestamp, int state, int repeat, int scancode, int sym, int mod } - -Event occurs whenever a user presses or releases a button on a keyboard. Type SDL_KEYUP or SDL_KEYDOWN -*/ - case SDL_KEYUP: - case SDL_KEYDOWN: - { - lua_createtable( L, 7, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.key.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.key.state ); - lua_setfield( L, -2, "state" ); - lua_pushinteger( L, event.key.repeat ); - lua_setfield( L, -2, "repeating" ); /* repeat is Lua keyword. */ - lua_pushinteger( L, event.key.keysym.scancode ); - lua_setfield( L, -2, "scancode" ); - lua_pushinteger( L, event.key.keysym.sym ); - lua_setfield( L, -2, "sym" ); - lua_pushinteger( L, event.key.keysym.mod ); - lua_setfield( L, -2, "mod" ); - call = true; - } - break; -/* -> SDL_WindowEvent = { int type, int timestamp, int event, int data1, int data2 } - -Event occurs when an event of type SDL_WINDOWEVENT is reported. Type SDL_WINDOWEVENT -*/ - case SDL_WINDOWEVENT: - { - lua_createtable( L, 5, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.window.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.window.event ); - lua_setfield( L, -2, "event" ); - lua_pushinteger( L, event.window.data1 ); - lua_setfield( L, -2, "data1" ); - lua_pushinteger( L, event.window.data2 ); - lua_setfield( L, -2, "data2" ); - call = true; - } - break; -/* -> SDL_MouseMotionEvent = { int type, int timestamp, int which, int state, int x, int y, int xrel, int yrel } - -Event occurs whenever a user moves the mouse within the application window or when SDL_WarpMouseInWindow() is called. Type SDL_MOUSEMOTION -*/ - case SDL_MOUSEMOTION: - { - lua_createtable( L, 8, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.motion.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.motion.which ); - lua_setfield( L, -2, "which" ); - lua_pushinteger( L, event.motion.state ); - lua_setfield( L, -2, "state" ); - lua_pushinteger( L, event.motion.x ); - lua_setfield( L, -2, "x" ); - lua_pushinteger( L, event.motion.y ); - lua_setfield( L, -2, "y" ); - lua_pushinteger( L, event.motion.xrel ); - lua_setfield( L, -2, "xrel" ); - lua_pushinteger( L, event.motion.yrel ); - lua_setfield( L, -2, "yrel" ); - call = true; - } - break; -/* -> SDL_MouseButtonEvent = { int type, int timestamp, int which, int button, int state, int x, int y } - -Event occurs whenever a user presses or releases a button on a mouse. Type SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP -*/ - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - { - lua_createtable( L, 7, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.button.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.button.which ); - lua_setfield( L, -2, "which" ); - lua_pushinteger( L, event.button.button ); - lua_setfield( L, -2, "button" ); - lua_pushinteger( L, event.button.state ); - lua_setfield( L, -2, "state" ); - lua_pushinteger( L, event.button.x ); - lua_setfield( L, -2, "x" ); - lua_pushinteger( L, event.button.y ); - lua_setfield( L, -2, "y" ); - call = true; - } - break; -/* -> SDL_MouseWheelEvent = { int type, int timestamp, int which, int x, int y } - -Event occurs whenever a user moves the mouse wheel. Type SDL_MOUSEWHEEL -*/ - case SDL_MOUSEWHEEL: - { - lua_createtable( L, 5, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.wheel.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.wheel.which ); - lua_setfield( L, -2, "which" ); - lua_pushinteger( L, event.wheel.x ); - lua_setfield( L, -2, "x" ); - lua_pushinteger( L, event.wheel.y ); - lua_setfield( L, -2, "y" ); - call = true; - } - break; -/* -> SDL_JoyAxisEvent = { int type, int timestamp, int which, int axis, int value } - -Event occurs whenever a user moves an axis on the joystick. Type SDL_JOYAXISMOTION -*/ - case SDL_JOYAXISMOTION: - { - lua_createtable( L, 5, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.jaxis.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.jaxis.which ); - lua_setfield( L, -2, "which" ); - lua_pushinteger( L, event.jaxis.axis ); - lua_setfield( L, -2, "axis" ); - lua_pushinteger( L, event.jaxis.value ); - lua_setfield( L, -2, "value" ); - call = true; - } - break; -/* -> SDL_JoyBallEvent = { int type, int timestamp, int which, int ball, int xrel, int yrel } - -Event occurs when a user moves a trackball on the joystick. Type SDL_JOYBALLMOTION -*/ - case SDL_JOYBALLMOTION: - { - lua_createtable( L, 6, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.jball.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.jball.which ); - lua_setfield( L, -2, "which" ); - lua_pushinteger( L, event.jball.ball ); - lua_setfield( L, -2, "ball" ); - lua_pushinteger( L, event.jball.xrel ); - lua_setfield( L, -2, "xrel" ); - lua_pushinteger( L, event.jball.yrel ); - lua_setfield( L, -2, "yrel" ); - call = true; - } - break; -/* -> SDL_JoyHatEvent = { int type, int timestamp, int which, int hat, int value } - -Event occurs whenever a user moves a hat on the joystick. Type SDL_JOYHATMOTION -*/ - case SDL_JOYHATMOTION: - { - lua_createtable( L, 5, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.jhat.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.jhat.which ); - lua_setfield( L, -2, "which" ); - lua_pushinteger( L, event.jhat.hat ); - lua_setfield( L, -2, "hat" ); - lua_pushinteger( L, event.jhat.value ); - lua_setfield( L, -2, "value" ); - call = true; - } - break; -/* -> SDL_JoyButtonEvent = { int type, int timestamp, int which, int button, int state } - -Event occurs whenever a user presses or releases a button on a joystick. Type SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP -*/ - case SDL_JOYBUTTONDOWN: - case SDL_JOYBUTTONUP: - { - lua_createtable( L, 5, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.jbutton.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.jbutton.which ); - lua_setfield( L, -2, "which" ); - lua_pushinteger( L, event.jbutton.button ); - lua_setfield( L, -2, "button" ); - lua_pushinteger( L, event.jbutton.state ); - lua_setfield( L, -2, "state" ); - call = true; - } - break; -/* -> SDL_JoyDeviceEvent = { int type, int timestamp, int which } - -Event occurs whenever a user connects or disconnects a joystick. Type SDL_JOYDEVICEADDED or SDL_JOYDEVICEREMOVED -*/ - case SDL_JOYDEVICEADDED: - case SDL_JOYDEVICEREMOVED: - { - lua_createtable( L, 3, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.jdevice.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.jdevice.which ); - lua_setfield( L, -2, "which" ); - call = true; - } - break; -/* -> SDL_ControllerAxisEvent = { int type, int timestamp, int which, int axis, int value } - -Event occurs whenever a user moves an axis on the controller. Type SDL_CONTROLLERAXISMOTION -*/ - case SDL_CONTROLLERAXISMOTION: - { - lua_createtable( L, 5, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.caxis.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.caxis.which ); - lua_setfield( L, -2, "which" ); - lua_pushinteger( L, event.caxis.axis ); - lua_setfield( L, -2, "axis" ); - lua_pushinteger( L, event.caxis.value ); - lua_setfield( L, -2, "value" ); - call = true; - } - break; -/* -> SDL_ControllerButtonEvent = { int type, int timestamp, int which, int button, int state } - -Event occurs whenever a user presses or releases a button on a controller. Type SDL_CONTROLLERBUTTONDOWN or SDL_CONTROLLERBUTTONUP -*/ - case SDL_CONTROLLERBUTTONDOWN: - case SDL_CONTROLLERBUTTONUP: - { - lua_createtable( L, 5, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.cbutton.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.cbutton.which ); - lua_setfield( L, -2, "which" ); - lua_pushinteger( L, event.cbutton.button ); - lua_setfield( L, -2, "button" ); - lua_pushinteger( L, event.cbutton.state ); - lua_setfield( L, -2, "state" ); - call = true; - } - break; -/* -> SDL_ControllerDeviceEvent = { int type, int timestamp, int which } - -Event occurs whenever a user connects, disconnects or remaps a controller. Type SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEREMOVED or SDL_CONTROLLERDEVICEREMAPPED -*/ - case SDL_CONTROLLERDEVICEADDED: - case SDL_CONTROLLERDEVICEREMOVED: - case SDL_CONTROLLERDEVICEREMAPPED: - { - lua_createtable( L, 3, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.cdevice.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.cdevice.which ); - lua_setfield( L, -2, "which" ); - call = true; - } - break; -/* -> SDL_TouchFingerEvent = { int type, int timestamp, int touchId, int fingerId, float x, float y, float dx, float dy, float pressure } - -Event occurs when an event of type SDL_FINGERMOTION, SDL_FINGERDOWN, or SDL_FINGERUP is reported. Type SDL_FINGERMOTION, SDL_FINGERDOWN or SDL_FINGERUP -*/ - case SDL_FINGERMOTION: - case SDL_FINGERDOWN: - case SDL_FINGERUP: - { - lua_createtable( L, 9, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.tfinger.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.tfinger.touchId ); - lua_setfield( L, -2, "touchId" ); - lua_pushinteger( L, event.tfinger.fingerId ); - lua_setfield( L, -2, "fingerId" ); - lua_pushnumber( L, event.tfinger.x ); - lua_setfield( L, -2, "x" ); - lua_pushnumber( L, event.tfinger.y ); - lua_setfield( L, -2, "y" ); - lua_pushnumber( L, event.tfinger.dx ); - lua_setfield( L, -2, "dx" ); - lua_pushnumber( L, event.tfinger.dy ); - lua_setfield( L, -2, "dy" ); - lua_pushnumber( L, event.tfinger.pressure ); - lua_setfield( L, -2, "pressure" ); - call = true; - } - break; -/* -> SDL_MultiGestureEvent = { int type, int timestamp, int touchId, float dTheta, float dDist, float x, float y, int numFingers } - -Event occurs when type SDL_MULTIGESTURE is reported. Type SDL_MULTIGESTURE -*/ - case SDL_MULTIGESTURE: - { - lua_createtable( L, 8, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.mgesture.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.mgesture.touchId ); - lua_setfield( L, -2, "touchId" ); - lua_pushnumber( L, event.mgesture.dTheta ); - lua_setfield( L, -2, "dTheta" ); - lua_pushnumber( L, event.mgesture.dDist ); - lua_setfield( L, -2, "dDist" ); - lua_pushnumber( L, event.mgesture.x ); - lua_setfield( L, -2, "x" ); - lua_pushnumber( L, event.mgesture.y ); - lua_setfield( L, -2, "y" ); - lua_pushinteger( L, event.mgesture.numFingers ); - lua_setfield( L, -2, "numFingers" ); - call = true; - } - break; -/* -> SDL_DollarGestureEvent = { int type, int timestamp, int touchId, int gestureId, int numFingers, float error, float x, float y } - -Event occurs an event of type SDL_DOLLARGESTURE or SDL_DOLLARRECORD is reported. Type SDL_DOLLARGESTURE or SDL_DOLLARRECORD -*/ - case SDL_DOLLARGESTURE: - case SDL_DOLLARRECORD: - { - lua_createtable( L, 8, 0 ); - lua_pushinteger( L, event.type ); - lua_setfield( L, -2, "type" ); - lua_pushinteger( L, event.dgesture.timestamp ); - lua_setfield( L, -2, "timestamp" ); - lua_pushinteger( L, event.dgesture.touchId ); - lua_setfield( L, -2, "touchId" ); - lua_pushinteger( L, event.dgesture.gestureId ); - lua_setfield( L, -2, "gestureId" ); - lua_pushinteger( L, event.dgesture.numFingers ); - lua_setfield( L, -2, "numFingers" ); - lua_pushnumber( L, event.dgesture.error ); - lua_setfield( L, -2, "error" ); - lua_pushnumber( L, event.dgesture.x ); - lua_setfield( L, -2, "x" ); - lua_pushnumber( L, event.dgesture.y ); - lua_setfield( L, -2, "y" ); - call = true; - } - break; - default: - break; - } - - if ( call ) { - if ( lua_pcall( L, 1, 0, tracebackidx ) != 0 ) { - TraceLog( LOG_ERROR, "Lua error: %s", lua_tostring( L, -1 ) ); - state->run = false; - } - } - lua_pop( L, -1 ); - } - state->SDL_eventQueueLen = 0; -} - -void luaPlatformRegister() { - lua_State* L = state->luaState; - lua_getglobal( L, "RL" ); - - /* Input-related functions: keyboard. */ - assingGlobalFunction( "GetKeyName", lcoreGetKeyName ); - assingGlobalFunction( "GetScancodeFromKey", lcoreGetScancodeFromKey ); - - lua_pop( L, -1 ); - -#ifdef LUA_EVENTS - platformRegisterEvents(); -#endif -} diff --git a/src/platforms/core_desktop_sdl2.c b/src/platforms/core_desktop_sdl2.c new file mode 100644 index 0000000..ce105ee --- /dev/null +++ b/src/platforms/core_desktop_sdl2.c @@ -0,0 +1,561 @@ +#include "main.h" +#include "lua_core.h" +#include "core.h" +#include "platforms/core_desktop_sdl2.h" + +void platformDefineGlobals() { + lua_State* L = state->luaState; + + lua_getglobal( L, "RL" ); +/*DOC_DEFINES_START*/ + /* Keyboard events */ + assignGlobalInt( SDL_KEYDOWN, "SDL_KEYDOWN" ); // Key pressed + assignGlobalInt( SDL_KEYUP, "SDL_KEYUP" ); // Key released + /* Window events */ + assignGlobalInt( SDL_WINDOWEVENT, "SDL_WINDOWEVENT" ); // Window state change + /* Mouse events */ + assignGlobalInt( SDL_MOUSEMOTION, "SDL_MOUSEMOTION" ); // Mouse moved + assignGlobalInt( SDL_MOUSEBUTTONDOWN, "SDL_MOUSEBUTTONDOWN" ); // Mouse button pressed + assignGlobalInt( SDL_MOUSEBUTTONUP, "SDL_MOUSEBUTTONUP" ); // Mouse button released + assignGlobalInt( SDL_MOUSEWHEEL, "SDL_MOUSEWHEEL" ); // Mouse wheel motion + /* Joystick events */ + assignGlobalInt( SDL_JOYAXISMOTION, "SDL_JOYAXISMOTION" ); // Joystick axis motion + assignGlobalInt( SDL_JOYBALLMOTION, "SDL_JOYBALLMOTION" ); // Joystick trackball motion + assignGlobalInt( SDL_JOYHATMOTION, "SDL_JOYHATMOTION" ); + assignGlobalInt( SDL_JOYBUTTONDOWN, "SDL_JOYBUTTONDOWN" ); // Joystick button pressed + assignGlobalInt( SDL_JOYBUTTONUP, "SDL_JOYBUTTONUP" ); // Joystick button released + assignGlobalInt( SDL_JOYDEVICEADDED, "SDL_JOYDEVICEADDED" ); // Joystick connected + assignGlobalInt( SDL_JOYDEVICEREMOVED, "SDL_JOYDEVICEREMOVED" ); // Joystick disconnected + /* Controller events */ + assignGlobalInt( SDL_CONTROLLERAXISMOTION, "SDL_CONTROLLERAXISMOTION" ); // Controller axis motion + assignGlobalInt( SDL_CONTROLLERBUTTONDOWN, "SDL_CONTROLLERBUTTONDOWN" ); // Controller button pressed + assignGlobalInt( SDL_CONTROLLERBUTTONUP, "SDL_CONTROLLERBUTTONUP" ); // Controller button released + assignGlobalInt( SDL_CONTROLLERDEVICEADDED, "SDL_CONTROLLERDEVICEADDED" ); // Controller connected + assignGlobalInt( SDL_CONTROLLERDEVICEREMOVED, "SDL_CONTROLLERDEVICEREMOVED" ); // Controller disconnected + assignGlobalInt( SDL_CONTROLLERDEVICEREMAPPED, "SDL_CONTROLLERDEVICEREMAPPED" ); // Controller mapping updated + /* Touch events */ + assignGlobalInt( SDL_FINGERDOWN, "SDL_FINGERDOWN" ); // User has touched input device + assignGlobalInt( SDL_FINGERUP, "SDL_FINGERUP" ); // User stopped touching input device + assignGlobalInt( SDL_FINGERMOTION, "SDL_FINGERMOTION" ); // User is dragging finger on input device + /* Gesture events */ + assignGlobalInt( SDL_DOLLARGESTURE, "SDL_DOLLARGESTURE" ); + assignGlobalInt( SDL_DOLLARRECORD, "SDL_DOLLARRECORD" ); + assignGlobalInt( SDL_MULTIGESTURE, "SDL_MULTIGESTURE" ); + /* Window states */ + assignGlobalInt( SDL_WINDOWEVENT_SHOWN, "SDL_WINDOWEVENT_SHOWN" ); + assignGlobalInt( SDL_WINDOWEVENT_HIDDEN, "SDL_WINDOWEVENT_HIDDEN" ); + assignGlobalInt( SDL_WINDOWEVENT_EXPOSED, "SDL_WINDOWEVENT_EXPOSED" ); + assignGlobalInt( SDL_WINDOWEVENT_MOVED, "SDL_WINDOWEVENT_MOVED" ); + assignGlobalInt( SDL_WINDOWEVENT_RESIZED, "SDL_WINDOWEVENT_RESIZED" ); + assignGlobalInt( SDL_WINDOWEVENT_SIZE_CHANGED, "SDL_WINDOWEVENT_SIZE_CHANGED" ); + assignGlobalInt( SDL_WINDOWEVENT_MINIMIZED, "SDL_WINDOWEVENT_MINIMIZED" ); + assignGlobalInt( SDL_WINDOWEVENT_MAXIMIZED, "SDL_WINDOWEVENT_MAXIMIZED" ); + assignGlobalInt( SDL_WINDOWEVENT_RESTORED, "SDL_WINDOWEVENT_RESTORED" ); + assignGlobalInt( SDL_WINDOWEVENT_ENTER, "SDL_WINDOWEVENT_ENTER" ); + assignGlobalInt( SDL_WINDOWEVENT_LEAVE, "SDL_WINDOWEVENT_LEAVE" ); + assignGlobalInt( SDL_WINDOWEVENT_FOCUS_GAINED, "SDL_WINDOWEVENT_FOCUS_GAINED" ); + assignGlobalInt( SDL_WINDOWEVENT_FOCUS_LOST, "SDL_WINDOWEVENT_FOCUS_LOST" ); + assignGlobalInt( SDL_WINDOWEVENT_CLOSE, "SDL_WINDOWEVENT_CLOSE" ); + assignGlobalInt( SDL_WINDOWEVENT_TAKE_FOCUS, "SDL_WINDOWEVENT_TAKE_FOCUS" ); + assignGlobalInt( SDL_WINDOWEVENT_HIT_TEST, "SDL_WINDOWEVENT_HIT_TEST" ); + /* Keyboard and mouse states */ + assignGlobalInt( SDL_RELEASED, "SDL_RELEASED" ); + assignGlobalInt( SDL_PRESSED, "SDL_PRESSED" ); + /* Joystick hat motion */ + assignGlobalInt( SDL_HAT_LEFTUP, "SDL_HAT_LEFTUP" ); + assignGlobalInt( SDL_HAT_UP, "SDL_HAT_UP" ); + assignGlobalInt( SDL_HAT_RIGHTUP, "SDL_HAT_RIGHTUP" ); + assignGlobalInt( SDL_HAT_LEFT, "SDL_HAT_LEFT" ); + assignGlobalInt( SDL_HAT_CENTERED, "SDL_HAT_CENTERED" ); + assignGlobalInt( SDL_HAT_RIGHT, "SDL_HAT_RIGHT" ); + assignGlobalInt( SDL_HAT_LEFTDOWN, "SDL_HAT_LEFTDOWN" ); + assignGlobalInt( SDL_HAT_DOWN, "SDL_HAT_DOWN" ); + assignGlobalInt( SDL_HAT_RIGHTDOWN, "SDL_HAT_RIGHTDOWN" ); +/*DOC_DEFINES_END*/ + lua_pop( L, -1 ); +} + +/* Functions. */ + +/* +## SDL Core - Input-related functions: keyboard. +*/ + +/* +> keyName = RL.GetKeyName( int key ) + +Use this function to get a human-readable name for a key. If the key doesn't have a name, this function returns an empty string (""). + +- Success return string +*/ +int lcoreGetKeyName( lua_State* L ) { + int key = luaL_checkinteger( L, 1 ); + + lua_pushstring( L, SDL_GetKeyName( key ) ); + + return 1; +} + +/* +> keyName = RL.GetScancodeFromKey( int key ) + +Use this function to get the scancode corresponding to the given key code according to the current keyboard layout. + +- Success return int +*/ +int lcoreGetScancodeFromKey( lua_State* L ) { + int key = luaL_checkinteger( L, 1 ); + + lua_pushinteger( L, SDL_GetScancodeFromKey( key ) ); + + return 1; +} + +/* Events. */ + +/* +## SDL Events +*/ + +/* This function is not thread safe so we don't use Lua inside it directly. It only adds events to another queue. */ +static int SDLEventFilter( void* userdata, SDL_Event* event ) { + /* SDL_EVENT_POLL_SENTINEL = 0x7F00, /**< Signals the end of an event poll cycle */ + if ( event->type != SDL_QUIT && event->type != 0x7F00 && state->SDL_eventQueueLen < PLATFORM_SDL_EVENT_QUEUE_LEN ) { + state->SDL_eventQueue[ state->SDL_eventQueueLen ] = *event; + state->SDL_eventQueueLen++; + + // printf( "event %u state->SDL_eventQueueLen %d\n", event->type, state->SDL_eventQueueLen ); + } +} + +static void platformRegisterEvents() { + /* SDL Warning: Be very careful of what you do in the event filter function, as it may run in a different thread! */ + SDL_AddEventWatch( SDLEventFilter, NULL ); +} + +static void platformSendEvents() { + lua_State* L = state->luaState; + + lua_pushcfunction( L, luaTraceback ); + int tracebackidx = lua_gettop( L ); + + /* If RL.event is not defined, we don't need to proceed. */ + lua_getglobal( L, "RL" ); + lua_getfield( L, -1, "event" ); + + if ( !lua_isfunction( L, -1 ) ) { + state->SDL_eventQueueLen = 0; + return; + } + + for ( int i = 0; i < state->SDL_eventQueueLen; i++ ) { + bool call = false; + lua_getglobal( L, "RL" ); + lua_getfield( L, -1, "event" ); + + SDL_Event event = state->SDL_eventQueue[i]; + + switch ( event.type ) { +/* +> SDL_KeyboardEvent = { int type, int timestamp, int state, int repeat, int scancode, int sym, int mod } + +Event occurs whenever a user presses or releases a button on a keyboard. Type SDL_KEYUP or SDL_KEYDOWN +*/ + case SDL_KEYUP: + case SDL_KEYDOWN: + { + lua_createtable( L, 7, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.key.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.key.state ); + lua_setfield( L, -2, "state" ); + lua_pushinteger( L, event.key.repeat ); + lua_setfield( L, -2, "repeating" ); /* repeat is Lua keyword. */ + lua_pushinteger( L, event.key.keysym.scancode ); + lua_setfield( L, -2, "scancode" ); + lua_pushinteger( L, event.key.keysym.sym ); + lua_setfield( L, -2, "sym" ); + lua_pushinteger( L, event.key.keysym.mod ); + lua_setfield( L, -2, "mod" ); + call = true; + } + break; +/* +> SDL_WindowEvent = { int type, int timestamp, int event, int data1, int data2 } + +Event occurs when an event of type SDL_WINDOWEVENT is reported. Type SDL_WINDOWEVENT +*/ + case SDL_WINDOWEVENT: + { + lua_createtable( L, 5, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.window.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.window.event ); + lua_setfield( L, -2, "event" ); + lua_pushinteger( L, event.window.data1 ); + lua_setfield( L, -2, "data1" ); + lua_pushinteger( L, event.window.data2 ); + lua_setfield( L, -2, "data2" ); + call = true; + } + break; +/* +> SDL_MouseMotionEvent = { int type, int timestamp, int which, int state, int x, int y, int xrel, int yrel } + +Event occurs whenever a user moves the mouse within the application window or when SDL_WarpMouseInWindow() is called. Type SDL_MOUSEMOTION +*/ + case SDL_MOUSEMOTION: + { + lua_createtable( L, 8, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.motion.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.motion.which ); + lua_setfield( L, -2, "which" ); + lua_pushinteger( L, event.motion.state ); + lua_setfield( L, -2, "state" ); + lua_pushinteger( L, event.motion.x ); + lua_setfield( L, -2, "x" ); + lua_pushinteger( L, event.motion.y ); + lua_setfield( L, -2, "y" ); + lua_pushinteger( L, event.motion.xrel ); + lua_setfield( L, -2, "xrel" ); + lua_pushinteger( L, event.motion.yrel ); + lua_setfield( L, -2, "yrel" ); + call = true; + } + break; +/* +> SDL_MouseButtonEvent = { int type, int timestamp, int which, int button, int state, int x, int y } + +Event occurs whenever a user presses or releases a button on a mouse. Type SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP +*/ + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + { + lua_createtable( L, 7, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.button.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.button.which ); + lua_setfield( L, -2, "which" ); + lua_pushinteger( L, event.button.button ); + lua_setfield( L, -2, "button" ); + lua_pushinteger( L, event.button.state ); + lua_setfield( L, -2, "state" ); + lua_pushinteger( L, event.button.x ); + lua_setfield( L, -2, "x" ); + lua_pushinteger( L, event.button.y ); + lua_setfield( L, -2, "y" ); + call = true; + } + break; +/* +> SDL_MouseWheelEvent = { int type, int timestamp, int which, int x, int y } + +Event occurs whenever a user moves the mouse wheel. Type SDL_MOUSEWHEEL +*/ + case SDL_MOUSEWHEEL: + { + lua_createtable( L, 5, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.wheel.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.wheel.which ); + lua_setfield( L, -2, "which" ); + lua_pushinteger( L, event.wheel.x ); + lua_setfield( L, -2, "x" ); + lua_pushinteger( L, event.wheel.y ); + lua_setfield( L, -2, "y" ); + call = true; + } + break; +/* +> SDL_JoyAxisEvent = { int type, int timestamp, int which, int axis, int value } + +Event occurs whenever a user moves an axis on the joystick. Type SDL_JOYAXISMOTION +*/ + case SDL_JOYAXISMOTION: + { + lua_createtable( L, 5, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.jaxis.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.jaxis.which ); + lua_setfield( L, -2, "which" ); + lua_pushinteger( L, event.jaxis.axis ); + lua_setfield( L, -2, "axis" ); + lua_pushinteger( L, event.jaxis.value ); + lua_setfield( L, -2, "value" ); + call = true; + } + break; +/* +> SDL_JoyBallEvent = { int type, int timestamp, int which, int ball, int xrel, int yrel } + +Event occurs when a user moves a trackball on the joystick. Type SDL_JOYBALLMOTION +*/ + case SDL_JOYBALLMOTION: + { + lua_createtable( L, 6, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.jball.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.jball.which ); + lua_setfield( L, -2, "which" ); + lua_pushinteger( L, event.jball.ball ); + lua_setfield( L, -2, "ball" ); + lua_pushinteger( L, event.jball.xrel ); + lua_setfield( L, -2, "xrel" ); + lua_pushinteger( L, event.jball.yrel ); + lua_setfield( L, -2, "yrel" ); + call = true; + } + break; +/* +> SDL_JoyHatEvent = { int type, int timestamp, int which, int hat, int value } + +Event occurs whenever a user moves a hat on the joystick. Type SDL_JOYHATMOTION +*/ + case SDL_JOYHATMOTION: + { + lua_createtable( L, 5, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.jhat.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.jhat.which ); + lua_setfield( L, -2, "which" ); + lua_pushinteger( L, event.jhat.hat ); + lua_setfield( L, -2, "hat" ); + lua_pushinteger( L, event.jhat.value ); + lua_setfield( L, -2, "value" ); + call = true; + } + break; +/* +> SDL_JoyButtonEvent = { int type, int timestamp, int which, int button, int state } + +Event occurs whenever a user presses or releases a button on a joystick. Type SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP +*/ + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + { + lua_createtable( L, 5, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.jbutton.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.jbutton.which ); + lua_setfield( L, -2, "which" ); + lua_pushinteger( L, event.jbutton.button ); + lua_setfield( L, -2, "button" ); + lua_pushinteger( L, event.jbutton.state ); + lua_setfield( L, -2, "state" ); + call = true; + } + break; +/* +> SDL_JoyDeviceEvent = { int type, int timestamp, int which } + +Event occurs whenever a user connects or disconnects a joystick. Type SDL_JOYDEVICEADDED or SDL_JOYDEVICEREMOVED +*/ + case SDL_JOYDEVICEADDED: + case SDL_JOYDEVICEREMOVED: + { + lua_createtable( L, 3, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.jdevice.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.jdevice.which ); + lua_setfield( L, -2, "which" ); + call = true; + } + break; +/* +> SDL_ControllerAxisEvent = { int type, int timestamp, int which, int axis, int value } + +Event occurs whenever a user moves an axis on the controller. Type SDL_CONTROLLERAXISMOTION +*/ + case SDL_CONTROLLERAXISMOTION: + { + lua_createtable( L, 5, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.caxis.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.caxis.which ); + lua_setfield( L, -2, "which" ); + lua_pushinteger( L, event.caxis.axis ); + lua_setfield( L, -2, "axis" ); + lua_pushinteger( L, event.caxis.value ); + lua_setfield( L, -2, "value" ); + call = true; + } + break; +/* +> SDL_ControllerButtonEvent = { int type, int timestamp, int which, int button, int state } + +Event occurs whenever a user presses or releases a button on a controller. Type SDL_CONTROLLERBUTTONDOWN or SDL_CONTROLLERBUTTONUP +*/ + case SDL_CONTROLLERBUTTONDOWN: + case SDL_CONTROLLERBUTTONUP: + { + lua_createtable( L, 5, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.cbutton.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.cbutton.which ); + lua_setfield( L, -2, "which" ); + lua_pushinteger( L, event.cbutton.button ); + lua_setfield( L, -2, "button" ); + lua_pushinteger( L, event.cbutton.state ); + lua_setfield( L, -2, "state" ); + call = true; + } + break; +/* +> SDL_ControllerDeviceEvent = { int type, int timestamp, int which } + +Event occurs whenever a user connects, disconnects or remaps a controller. Type SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEREMOVED or SDL_CONTROLLERDEVICEREMAPPED +*/ + case SDL_CONTROLLERDEVICEADDED: + case SDL_CONTROLLERDEVICEREMOVED: + case SDL_CONTROLLERDEVICEREMAPPED: + { + lua_createtable( L, 3, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.cdevice.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.cdevice.which ); + lua_setfield( L, -2, "which" ); + call = true; + } + break; +/* +> SDL_TouchFingerEvent = { int type, int timestamp, int touchId, int fingerId, float x, float y, float dx, float dy, float pressure } + +Event occurs when an event of type SDL_FINGERMOTION, SDL_FINGERDOWN, or SDL_FINGERUP is reported. Type SDL_FINGERMOTION, SDL_FINGERDOWN or SDL_FINGERUP +*/ + case SDL_FINGERMOTION: + case SDL_FINGERDOWN: + case SDL_FINGERUP: + { + lua_createtable( L, 9, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.tfinger.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.tfinger.touchId ); + lua_setfield( L, -2, "touchId" ); + lua_pushinteger( L, event.tfinger.fingerId ); + lua_setfield( L, -2, "fingerId" ); + lua_pushnumber( L, event.tfinger.x ); + lua_setfield( L, -2, "x" ); + lua_pushnumber( L, event.tfinger.y ); + lua_setfield( L, -2, "y" ); + lua_pushnumber( L, event.tfinger.dx ); + lua_setfield( L, -2, "dx" ); + lua_pushnumber( L, event.tfinger.dy ); + lua_setfield( L, -2, "dy" ); + lua_pushnumber( L, event.tfinger.pressure ); + lua_setfield( L, -2, "pressure" ); + call = true; + } + break; +/* +> SDL_MultiGestureEvent = { int type, int timestamp, int touchId, float dTheta, float dDist, float x, float y, int numFingers } + +Event occurs when type SDL_MULTIGESTURE is reported. Type SDL_MULTIGESTURE +*/ + case SDL_MULTIGESTURE: + { + lua_createtable( L, 8, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.mgesture.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.mgesture.touchId ); + lua_setfield( L, -2, "touchId" ); + lua_pushnumber( L, event.mgesture.dTheta ); + lua_setfield( L, -2, "dTheta" ); + lua_pushnumber( L, event.mgesture.dDist ); + lua_setfield( L, -2, "dDist" ); + lua_pushnumber( L, event.mgesture.x ); + lua_setfield( L, -2, "x" ); + lua_pushnumber( L, event.mgesture.y ); + lua_setfield( L, -2, "y" ); + lua_pushinteger( L, event.mgesture.numFingers ); + lua_setfield( L, -2, "numFingers" ); + call = true; + } + break; +/* +> SDL_DollarGestureEvent = { int type, int timestamp, int touchId, int gestureId, int numFingers, float error, float x, float y } + +Event occurs an event of type SDL_DOLLARGESTURE or SDL_DOLLARRECORD is reported. Type SDL_DOLLARGESTURE or SDL_DOLLARRECORD +*/ + case SDL_DOLLARGESTURE: + case SDL_DOLLARRECORD: + { + lua_createtable( L, 8, 0 ); + lua_pushinteger( L, event.type ); + lua_setfield( L, -2, "type" ); + lua_pushinteger( L, event.dgesture.timestamp ); + lua_setfield( L, -2, "timestamp" ); + lua_pushinteger( L, event.dgesture.touchId ); + lua_setfield( L, -2, "touchId" ); + lua_pushinteger( L, event.dgesture.gestureId ); + lua_setfield( L, -2, "gestureId" ); + lua_pushinteger( L, event.dgesture.numFingers ); + lua_setfield( L, -2, "numFingers" ); + lua_pushnumber( L, event.dgesture.error ); + lua_setfield( L, -2, "error" ); + lua_pushnumber( L, event.dgesture.x ); + lua_setfield( L, -2, "x" ); + lua_pushnumber( L, event.dgesture.y ); + lua_setfield( L, -2, "y" ); + call = true; + } + break; + default: + break; + } + + if ( call ) { + if ( lua_pcall( L, 1, 0, tracebackidx ) != 0 ) { + TraceLog( LOG_ERROR, "Lua error: %s", lua_tostring( L, -1 ) ); + state->run = false; + } + } + lua_pop( L, -1 ); + } + state->SDL_eventQueueLen = 0; +} + +void luaPlatformRegister() { + lua_State* L = state->luaState; + lua_getglobal( L, "RL" ); + + /* Input-related functions: keyboard. */ + assingGlobalFunction( "GetKeyName", lcoreGetKeyName ); + assingGlobalFunction( "GetScancodeFromKey", lcoreGetScancodeFromKey ); + + lua_pop( L, -1 ); + +#ifdef LUA_EVENTS + platformRegisterEvents(); +#endif +} diff --git a/src/platforms/core_desktop_sdl3.c b/src/platforms/core_desktop_sdl3.c new file mode 100644 index 0000000..9314b26 --- /dev/null +++ b/src/platforms/core_desktop_sdl3.c @@ -0,0 +1,23 @@ +#include "main.h" +#include "lua_core.h" +#include "core.h" +#include "platforms/core_desktop_sdl3.h" + +void platformDefineGlobals() { + lua_State* L = state->luaState; + + lua_getglobal( L, "RL" ); +/*DOC_DEFINES_START*/ +/*DOC_DEFINES_END*/ + lua_pop( L, -1 ); +} + +void luaPlatformRegister() { + // lua_State* L = state->luaState; + // lua_getglobal( L, "RL" ); + + // lua_pop( L, -1 ); +#ifdef LUA_EVENTS + // platformRegisterEvents(); +#endif +} diff --git a/src/state.c b/src/state.c index fdfdbd0..8f8c03d 100644 --- a/src/state.c +++ b/src/state.c @@ -29,7 +29,7 @@ void stateContextInit() { state->defaultTexture = (Texture){ 1, 1, 1, 1, 7 }; state->shapesTexture = (Texture){ 1, 1, 1, 1, 7 }; state->RLGLcurrentShaderLocs = malloc( RL_MAX_SHADER_LOCATIONS * sizeof( int ) ); -#ifdef PLATFORM_DESKTOP_SDL +#ifdef PLATFORM_DESKTOP_SDL2 state->SDL_eventQueue = malloc( PLATFORM_SDL_EVENT_QUEUE_LEN * sizeof( SDL_Event ) ); state->SDL_eventQueueLen = 0; #endif -- cgit v1.2.3