summaryrefslogtreecommitdiff
path: root/src/lua_core.c
diff options
context:
space:
mode:
authorjussi2023-08-18 01:23:30 +0300
committerjussi2023-08-18 01:23:30 +0300
commitc911ba043116e9d0e321311ddf27b0170d74410b (patch)
treee51f7141a16400f794d535f999a37ed176271861 /src/lua_core.c
parentb7b46ada041ad56b1bc84fea3062464b702135c5 (diff)
downloadreilua-enhanced-c911ba043116e9d0e321311ddf27b0170d74410b.tar.gz
reilua-enhanced-c911ba043116e9d0e321311ddf27b0170d74410b.tar.bz2
reilua-enhanced-c911ba043116e9d0e321311ddf27b0170d74410b.zip
RL.event function with input events.
Diffstat (limited to 'src/lua_core.c')
-rw-r--r--src/lua_core.c264
1 files changed, 235 insertions, 29 deletions
diff --git a/src/lua_core.c b/src/lua_core.c
index d14c41e..d8c2f6e 100644
--- a/src/lua_core.c
+++ b/src/lua_core.c
@@ -614,12 +614,23 @@ void defineGlobals() {
assignGlobalInt( GL_STENCIL_BUFFER_BIT, "GL_STENCIL_BUFFER_BIT" );
assignGlobalInt( GL_NEAREST, "GL_NEAREST" );
assignGlobalInt( GL_LINEAR, "GL_LINEAR" );
+ /* GLFW API tokens. */
+ assignGlobalInt( GLFW_RELEASE, "GLFW_RELEASE" );
+ assignGlobalInt( GLFW_PRESS, "GLFW_PRESS" );
+ assignGlobalInt( GLFW_REPEAT, "GLFW_REPEAT" );
+ /* Event types. */
+ assignGlobalInt( EVENT_KEY, "EVENT_KEY" );
+ assignGlobalInt( EVENT_CHAR, "EVENT_CHAR" );
+ assignGlobalInt( EVENT_MOUSE_BUTTON, "EVENT_MOUSE_BUTTON" );
+ assignGlobalInt( EVENT_MOUSE_CURSOR_POS, "EVENT_MOUSE_CURSOR_POS" );
+ assignGlobalInt( EVENT_MOUSE_SCROLL, "EVENT_MOUSE_SCROLL" );
+ assignGlobalInt( EVENT_CURSOR_ENTER, "EVENT_CURSOR_ENTER" );
/*DOC_END*/
lua_pop( L, -1 );
}
-// Custom logging funtion
+// Custom logging funtion.
void logCustom( int logLevel, const char *text, va_list args ) {
char string[ STRING_LEN ] = {'\0'};
char msg[ STRING_LEN ] = {'\0'};
@@ -661,6 +672,194 @@ void logCustom( int logLevel, const char *text, va_list args ) {
lua_pop( L, -1 );
}
+static void keyInputEvent( GLFWwindow* window, int key, int scancode, int action, int mods ) {
+ /* Pass through to raylib callback. */
+ state->raylibKeyCallback( window, key, scancode, action, mods );
+
+ lua_State *L = state->luaState;
+
+ lua_pushcfunction( L, luaTraceback );
+ int tracebackidx = lua_gettop( L );
+
+ lua_getglobal( L, "RL" );
+ lua_getfield( L, -1, "event" );
+
+ if ( lua_isfunction( L, -1 ) ) {
+ lua_createtable( L, 5, 0 );
+ lua_pushinteger( L, EVENT_KEY );
+ lua_setfield( L, -2, "type" );
+ lua_pushinteger( L, key );
+ lua_setfield( L, -2, "key" );
+ lua_pushinteger( L, scancode );
+ lua_setfield( L, -2, "scancode" );
+ lua_pushinteger( L, action );
+ lua_setfield( L, -2, "action" );
+ lua_pushinteger( L, mods );
+ lua_setfield( L, -2, "mods" );
+
+ 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 );
+ return;
+ }
+ }
+ lua_pop( L, -1 );
+}
+
+static void charInputEvent( GLFWwindow* window, unsigned int key ) {
+ /* Pass through to raylib callback. */
+ state->raylibCharCallback( window, key );
+
+ lua_State *L = state->luaState;
+
+ lua_pushcfunction( L, luaTraceback );
+ int tracebackidx = lua_gettop( L );
+
+ lua_getglobal( L, "RL" );
+ lua_getfield( L, -1, "event" );
+
+ if ( lua_isfunction( L, -1 ) ) {
+ lua_createtable( L, 2, 0 );
+ lua_pushinteger( L, EVENT_CHAR );
+ lua_setfield( L, -2, "type" );
+ lua_pushinteger( L, key );
+ lua_setfield( L, -2, "key" );
+
+ 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 );
+ return;
+ }
+ }
+ lua_pop( L, -1 );
+}
+
+static void mouseButtonInputEvent( GLFWwindow* window, int button, int action, int mods ) {
+ /* Pass through to raylib callback. */
+ state->raylibMouseButtonCallback( window, button, action, mods );
+
+ lua_State *L = state->luaState;
+
+ lua_pushcfunction( L, luaTraceback );
+ int tracebackidx = lua_gettop( L );
+
+ lua_getglobal( L, "RL" );
+ lua_getfield( L, -1, "event" );
+
+ if ( lua_isfunction( L, -1 ) ) {
+ lua_createtable( L, 4, 0 );
+ lua_pushinteger( L, EVENT_MOUSE_BUTTON );
+ lua_setfield( L, -2, "type" );
+ lua_pushinteger( L, button );
+ lua_setfield( L, -2, "button" );
+ lua_pushinteger( L, action );
+ lua_setfield( L, -2, "action" );
+ lua_pushinteger( L, mods );
+ lua_setfield( L, -2, "mods" );
+
+ 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 );
+ return;
+ }
+ }
+ lua_pop( L, -1 );
+}
+
+static void mouseCursorPosInputEvent( GLFWwindow* window, double x, double y ) {
+ /* Pass through to raylib callback. */
+ state->raylibMouseCursorPosCallback( window, x, y );
+
+ lua_State *L = state->luaState;
+
+ lua_pushcfunction( L, luaTraceback );
+ int tracebackidx = lua_gettop( L );
+
+ lua_getglobal( L, "RL" );
+ lua_getfield( L, -1, "event" );
+
+ if ( lua_isfunction( L, -1 ) ) {
+ lua_createtable( L, 3, 0 );
+ lua_pushinteger( L, EVENT_MOUSE_CURSOR_POS );
+ lua_setfield( L, -2, "type" );
+ lua_pushnumber( L, x );
+ lua_setfield( L, -2, "x" );
+ lua_pushnumber( L, y );
+ lua_setfield( L, -2, "y" );
+
+ 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 );
+ return;
+ }
+ }
+ lua_pop( L, -1 );
+}
+
+static void mouseScrollInputEvent( GLFWwindow* window, double xoffset, double yoffset ) {
+ /* Pass through to raylib callback. */
+ state->raylibMouseScrollCallback( window, xoffset, yoffset );
+
+ lua_State *L = state->luaState;
+
+ lua_pushcfunction( L, luaTraceback );
+ int tracebackidx = lua_gettop( L );
+
+ lua_getglobal( L, "RL" );
+ lua_getfield( L, -1, "event" );
+
+ if ( lua_isfunction( L, -1 ) ) {
+ lua_createtable( L, 3, 0 );
+ lua_pushinteger( L, EVENT_MOUSE_SCROLL );
+ lua_setfield( L, -2, "type" );
+ lua_pushnumber( L, xoffset );
+ lua_setfield( L, -2, "xoffset" );
+ lua_pushnumber( L, yoffset );
+ lua_setfield( L, -2, "yoffset" );
+
+ 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 );
+ return;
+ }
+ }
+ lua_pop( L, -1 );
+}
+
+static void cursorEnterInputEvent( GLFWwindow* window, int enter ) {
+ /* Pass through to raylib callback. */
+ state->raylibCursorEnterCallback( window, enter );
+
+ lua_State *L = state->luaState;
+
+ lua_pushcfunction( L, luaTraceback );
+ int tracebackidx = lua_gettop( L );
+
+ lua_getglobal( L, "RL" );
+ lua_getfield( L, -1, "event" );
+
+ if ( lua_isfunction( L, -1 ) ) {
+ lua_createtable( L, 2, 0 );
+ lua_pushinteger( L, EVENT_CURSOR_ENTER );
+ lua_setfield( L, -2, "type" );
+ lua_pushinteger( L, enter );
+ lua_setfield( L, -2, "enter" );
+
+ 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 );
+ return;
+ }
+ }
+ lua_pop( L, -1 );
+}
+
bool luaInit() {
state->luaState = luaL_newstate();
@@ -728,8 +927,15 @@ bool luaCallMain() {
/* Apply custom callback here. */
SetTraceLogCallback( logCustom );
+ state->raylibKeyCallback = glfwSetKeyCallback( GetWindowHandle(), keyInputEvent );
+ state->raylibCharCallback = glfwSetCharCallback( GetWindowHandle(), charInputEvent );
+ state->raylibMouseButtonCallback = glfwSetMouseButtonCallback( GetWindowHandle(), mouseButtonInputEvent );
+ state->raylibMouseCursorPosCallback = glfwSetCursorPosCallback( GetWindowHandle(), mouseCursorPosInputEvent );
+ state->raylibMouseScrollCallback = glfwSetScrollCallback( GetWindowHandle(), mouseScrollInputEvent );
+ state->raylibCursorEnterCallback = glfwSetCursorEnterCallback( GetWindowHandle(), cursorEnterInputEvent );
+
lua_getglobal( L, "RL" );
- lua_getfield ( L, -1, "init" );
+ lua_getfield( L, -1, "init" );
if ( lua_isfunction( L, -1 ) ) {
if ( lua_pcall( L, 0, 0, tracebackidx ) != 0 ) {
@@ -754,7 +960,7 @@ void luaCallProcess() {
int tracebackidx = lua_gettop(L);
lua_getglobal( L, "RL" );
- lua_getfield ( L, -1, "process" );
+ lua_getfield( L, -1, "process" );
if ( lua_isfunction( L, -1 ) ) {
lua_pushnumber( L, GetFrameTime() );
@@ -775,7 +981,7 @@ void luaCallDraw() {
int tracebackidx = lua_gettop(L);
lua_getglobal( L, "RL" );
- lua_getfield ( L, -1, "draw" );
+ lua_getfield( L, -1, "draw" );
if ( lua_isfunction( L, -1 ) ) {
BeginDrawing();
@@ -797,7 +1003,7 @@ void luaCallExit() {
int tracebackidx = lua_gettop(L);
lua_getglobal( L, "RL" );
- lua_getfield ( L, -1, "exit" );
+ lua_getfield( L, -1, "exit" );
if ( lua_isfunction( L, -1 ) ) {
if ( lua_pcall( L, 0, 0, tracebackidx ) != 0 ) {
@@ -2458,38 +2664,38 @@ void uluaPushVector3( lua_State *L, Vector3 vector ) {
void uluaPushVector4( lua_State *L, Vector4 vector ) {
lua_createtable( L, 4, 0 );
- lua_pushnumber( L, vector.x );
- lua_rawseti( L, -2, 1 );
- lua_pushnumber( L, vector.y );
- lua_rawseti( L, -2, 2 );
- lua_pushnumber( L, vector.z );
- lua_rawseti( L, -2, 3 );
- lua_pushnumber( L, vector.w );
- lua_rawseti( L, -2, 4 );
+ lua_pushnumber( L, vector.x );
+ lua_rawseti( L, -2, 1 );
+ lua_pushnumber( L, vector.y );
+ lua_rawseti( L, -2, 2 );
+ lua_pushnumber( L, vector.z );
+ lua_rawseti( L, -2, 3 );
+ lua_pushnumber( L, vector.w );
+ lua_rawseti( L, -2, 4 );
}
void uluaPushRectangle( lua_State *L, Rectangle rect ) {
lua_createtable( L, 4, 0 );
- lua_pushnumber( L, rect.x );
- lua_rawseti( L, -2, 1 );
- lua_pushnumber( L, rect.y );
- lua_rawseti( L, -2, 2 );
- lua_pushnumber( L, rect.width );
- lua_rawseti( L, -2, 3 );
- lua_pushnumber( L, rect.height );
- lua_rawseti( L, -2, 4 );
+ lua_pushnumber( L, rect.x );
+ lua_rawseti( L, -2, 1 );
+ lua_pushnumber( L, rect.y );
+ lua_rawseti( L, -2, 2 );
+ lua_pushnumber( L, rect.width );
+ lua_rawseti( L, -2, 3 );
+ lua_pushnumber( L, rect.height );
+ lua_rawseti( L, -2, 4 );
}
void uluaPushQuaternion( lua_State *L, Quaternion quaternion ) {
lua_createtable( L, 4, 0 );
- lua_pushnumber( L, quaternion.x );
- lua_rawseti( L, -2, 1 );
- lua_pushnumber( L, quaternion.y );
- lua_rawseti( L, -2, 2 );
- lua_pushnumber( L, quaternion.z );
- lua_rawseti( L, -2, 3 );
- lua_pushnumber( L, quaternion.w );
- lua_rawseti( L, -2, 4 );
+ lua_pushnumber( L, quaternion.x );
+ lua_rawseti( L, -2, 1 );
+ lua_pushnumber( L, quaternion.y );
+ lua_rawseti( L, -2, 2 );
+ lua_pushnumber( L, quaternion.z );
+ lua_rawseti( L, -2, 3 );
+ lua_pushnumber( L, quaternion.w );
+ lua_rawseti( L, -2, 4 );
}
void uluaPushMatrix( lua_State *L, Matrix matrix ) {