From c98db5b670c55c39b92391d77c12276f39cc82a7 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 2 Nov 2023 18:55:02 -0700 Subject: [PATCH] lovr.system.wasMousePressed/Released; --- src/api/l_system.c | 16 ++++++++++++++++ src/modules/system/system.c | 12 ++++++++++++ src/modules/system/system.h | 2 ++ 3 files changed, 30 insertions(+) diff --git a/src/api/l_system.c b/src/api/l_system.c index 6a6e36aa..1144d1f8 100644 --- a/src/api/l_system.c +++ b/src/api/l_system.c @@ -290,6 +290,20 @@ static int l_lovrSystemIsMouseDown(lua_State* L) { return 1; } +static int l_lovrSystemWasMousePressed(lua_State* L) { + int button = luaL_checkint(L, 1) - 1; + bool pressed = lovrSystemWasMousePressed(button); + lua_pushboolean(L, pressed); + return 1; +} + +static int l_lovrSystemWasMouseReleased(lua_State* L) { + int button = luaL_checkint(L, 1) - 1; + bool released = lovrSystemWasMouseReleased(button); + lua_pushboolean(L, released); + return 1; +} + static const luaL_Reg lovrSystem[] = { { "getOS", l_lovrSystemGetOS }, { "getCoreCount", l_lovrSystemGetCoreCount }, @@ -310,6 +324,8 @@ static const luaL_Reg lovrSystem[] = { { "getMouseY", l_lovrSystemGetMouseY }, { "getMousePosition", l_lovrSystemGetMousePosition }, { "isMouseDown", l_lovrSystemIsMouseDown }, + { "wasMousePressed", l_lovrSystemWasMousePressed }, + { "wasMouseReleased", l_lovrSystemWasMouseReleased }, { NULL, NULL } }; diff --git a/src/modules/system/system.c b/src/modules/system/system.c index 94ae74da..c04643de 100644 --- a/src/modules/system/system.c +++ b/src/modules/system/system.c @@ -9,6 +9,7 @@ static struct { bool keyRepeat; bool prevKeyState[OS_KEY_COUNT]; bool keyState[OS_KEY_COUNT]; + bool prevMouseState[8]; bool mouseState[8]; double mouseX; double mouseY; @@ -134,6 +135,7 @@ float lovrSystemGetWindowDensity(void) { void lovrSystemPollEvents(void) { memcpy(state.prevKeyState, state.keyState, sizeof(state.keyState)); + memcpy(state.prevMouseState, state.mouseState, sizeof(state.mouseState)); state.scrollDelta = 0.; os_poll_events(); } @@ -168,6 +170,16 @@ bool lovrSystemIsMouseDown(int button) { return state.mouseState[button]; } +bool lovrSystemWasMousePressed(int button) { + if ((size_t) button > COUNTOF(state.mouseState)) return false; + return !state.prevMouseState[button] && state.mouseState[button]; +} + +bool lovrSystemWasMouseReleased(int button) { + if ((size_t) button > COUNTOF(state.mouseState)) return false; + return state.prevMouseState[button] && !state.mouseState[button]; +} + // This is kind of a hacky thing for the simulator, since we're kinda bad at event dispatch float lovrSystemGetScrollDelta(void) { return state.scrollDelta; diff --git a/src/modules/system/system.h b/src/modules/system/system.h index c47b2fa5..2001af4d 100644 --- a/src/modules/system/system.h +++ b/src/modules/system/system.h @@ -26,4 +26,6 @@ bool lovrSystemHasKeyRepeat(void); void lovrSystemSetKeyRepeat(bool repeat); void lovrSystemGetMousePosition(double* x, double* y); bool lovrSystemIsMouseDown(int button); +bool lovrSystemWasMousePressed(int button); +bool lovrSystemWasMouseReleased(int button); float lovrSystemGetScrollDelta(void);