From f3e1cf814e94d227ed83c3d8eba4f872fedea723 Mon Sep 17 00:00:00 2001 From: hayaunderscore Date: Tue, 4 Jun 2024 17:13:35 +0800 Subject: [PATCH 1/2] Expose `V_SetClipRect` and `V_ClearClipRect` to lua Via the `v.setClipRect` and `v.clearClipRect` functions respectively. --- src/lua_hudlib.c | 41 +++++++++++++++++++++++++++++++++++++++ src/lua_hudlib_drawlist.c | 36 ++++++++++++++++++++++++++++++++++ src/lua_hudlib_drawlist.h | 11 +++++++++++ 3 files changed, 88 insertions(+) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index 824825fe7..dd17f67a7 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -989,6 +989,45 @@ static int libd_drawKartString(lua_State *L) return 0; } +static int libd_setClipRect(lua_State *L) +{ + fixed_t x = luaL_checkinteger(L, 1); + fixed_t y = luaL_checkinteger(L, 2); + fixed_t w = luaL_checkinteger(L, 3); + fixed_t h = luaL_checkinteger(L, 4); + INT32 flags = luaL_optinteger(L, 5, 0); + huddrawlist_h list; + + flags &= ~V_PARAMMASK; // Don't let crashes happen. + + HUDONLY + lua_getfield(L, LUA_REGISTRYINDEX, "HUD_DRAW_LIST"); + list = (huddrawlist_h) lua_touserdata(L, -1); + lua_pop(L, 1); + + if (LUA_HUD_IsDrawListValid(list)) + LUA_HUD_AddSetClipRect(list, x, y, w, h, flags); + else + V_SetClipRect(x, y, w, h, flags); + return 0; +} + +static int libd_clearClipRect(lua_State *L) +{ + huddrawlist_h list; + + HUDONLY + lua_getfield(L, LUA_REGISTRYINDEX, "HUD_DRAW_LIST"); + list = (huddrawlist_h) lua_touserdata(L, -1); + lua_pop(L, 1); + + if (LUA_HUD_IsDrawListValid(list)) + LUA_HUD_AddClearClipRect(list); + else + V_ClearClipRect(); + return 0; +} + static int libd_titleCardStringWidth(lua_State *L) { const char *str = luaL_checkstring(L, 1); @@ -1207,6 +1246,8 @@ static luaL_Reg lib_draw[] = { {"drawString", libd_drawString}, {"drawTitleCardString", libd_drawTitleCardString}, {"drawKartString", libd_drawKartString}, + {"setClipRect", libd_setClipRect}, + {"clearClipRect", libd_clearClipRect}, // misc {"stringWidth", libd_stringWidth}, {"titleCardStringWidth", libd_titleCardStringWidth}, diff --git a/src/lua_hudlib_drawlist.c b/src/lua_hudlib_drawlist.c index 1c7ee3117..e9120c692 100644 --- a/src/lua_hudlib_drawlist.c +++ b/src/lua_hudlib_drawlist.c @@ -30,6 +30,8 @@ enum drawitem_e { DI_FadeScreen, DI_DrawTitleCardString, DI_DrawKartString, + DI_SetClipRect, + DI_ClearClipRect, DI_MAX, }; @@ -394,6 +396,34 @@ void LUA_HUD_AddDrawKartString( item->flags = flags; } +void LUA_HUD_AddSetClipRect( + huddrawlist_h list, + fixed_t x, + fixed_t y, + fixed_t w, + fixed_t h, + INT32 flags +) +{ + size_t i = AllocateDrawItem(list); + drawitem_t *item = &list->items[i]; + item->type = DI_SetClipRect; + item->x = x; + item->y = y; + item->w = w; + item->h = h; + item->flags = flags; +} + +void LUA_HUD_AddClearClipRect( + huddrawlist_h list +) +{ + size_t i = AllocateDrawItem(list); + drawitem_t *item = &list->items[i]; + item->type = DI_ClearClipRect; +} + void LUA_HUD_DrawList(huddrawlist_h list) { size_t i; @@ -474,6 +504,12 @@ void LUA_HUD_DrawList(huddrawlist_h list) case DI_DrawKartString: V_DrawTimerString(item->x, item->y, item->flags, itemstr); break; + case DI_SetClipRect: + V_SetClipRect(item->x, item->y, item->w, item->h, item->flags); + break; + case DI_ClearClipRect: + V_ClearClipRect(); + break; default: I_Error("can't draw draw list item: invalid draw list item type"); continue; diff --git a/src/lua_hudlib_drawlist.h b/src/lua_hudlib_drawlist.h index fea4499cb..1ad55ac2a 100644 --- a/src/lua_hudlib_drawlist.h +++ b/src/lua_hudlib_drawlist.h @@ -122,6 +122,17 @@ void LUA_HUD_AddDrawKartString( const char *str, INT32 flags ); +void LUA_HUD_AddSetClipRect( + huddrawlist_h list, + fixed_t x, + fixed_t y, + fixed_t w, + fixed_t h, + INT32 flags +); +void LUA_HUD_AddClearClipRect( + huddrawlist_h list +); // Draws the given draw list void LUA_HUD_DrawList(huddrawlist_h list); From 49c49dab3bf0b8c793eca564a6c436c005203175 Mon Sep 17 00:00:00 2001 From: hayaunderscore Date: Mon, 26 Aug 2024 10:25:09 +0800 Subject: [PATCH 2/2] Move V_ClearClipRect after call_mapped based on toaster's suggestion --- src/lua_hooklib.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 0eacf83ce..1ccedd091 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -688,11 +688,11 @@ void LUA_HookHUD(huddrawlist_h list, int hook_type) hud_running = true; // local hook - // Catch runaway clipping rectangles. - V_ClearClipRect(); - init_hook_call(&hook, 0, res_none); call_mapped(&hook, &hudHookIds[hook_type]); + + // Catch runaway clipping rectangles. + V_ClearClipRect(); hud_running = false; }