diff --git a/autogen/convert_functions.py b/autogen/convert_functions.py index c62ec9c5..bf0386c1 100644 --- a/autogen/convert_functions.py +++ b/autogen/convert_functions.py @@ -160,6 +160,7 @@ manual_index_documentation = """ - [network_send](#network_send) - [djui_hud_render_texture](#djui_hud_render_texture) - [get_texture_info](#get_texture_info) + - [djui_hud_render_texture_interpolated](#djui_hud_render_texture_interpolated)
@@ -334,6 +335,34 @@ Retrieves a texture by name.
+## [djui_hud_render_texture_interpolated](#djui_hud_render_texture_interpolated) + +### Lua Example +`djui_hud_render_texture_interpolated(texInfo, prevX, prevY, prevScaleW, prevScaleH, x, y, scaleW, scaleH)` + +### Parameters +| Field | Type | +| ----- | ---- | +| texInfo | [TextureInfo](structs.md#TextureInfo) | +| prevX | `number` | +| prevY | `number` | +| prevScaleW | `number` | +| prevScaleH | `number` | +| x | `number` | +| y | `number` | +| scaleW | `number` | +| scaleH | `number` | + +### Returns +- None + +### C Prototype +`void djui_hud_render_texture_interpolated(struct TextureInfo* texInfo, f32 prevX, f32 prevY, f32 prevScaleW, f32 prevScaleH, f32 x, f32 y, f32 scaleW, f32 scaleH);` + +[:arrow_up_small:](#) + +
+ """ ############################################################################ diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua index 79889e68..fdae952a 100644 --- a/autogen/lua_definitions/functions.lua +++ b/autogen/lua_definitions/functions.lua @@ -3609,6 +3609,19 @@ function djui_hud_render_rect(x, y, width, height) -- ... end +--- @param prevX number +--- @param prevY number +--- @param prevWidth number +--- @param prevHeight number +--- @param x number +--- @param y number +--- @param width number +--- @param height number +--- @return nil +function djui_hud_render_rect_interpolated(prevX, prevY, prevWidth, prevHeight, x, y, width, height) + -- ... +end + --- @param r integer --- @param g integer --- @param b integer @@ -3630,6 +3643,13 @@ function djui_hud_set_resolution(resolutionType) -- ... end +--- @param pos Vec3f +--- @param out Vec3f +--- @return nil +function djui_hud_world_pos_to_screen_pos(pos, out) + -- ... +end + --- @param message string --- @param lines integer --- @return nil diff --git a/autogen/lua_definitions/manual.lua b/autogen/lua_definitions/manual.lua index 364394e0..023337d9 100644 --- a/autogen/lua_definitions/manual.lua +++ b/autogen/lua_definitions/manual.lua @@ -158,4 +158,18 @@ end --- @return nil function djui_hud_render_texture(texInfo, x, y, scaleW, scaleH) -- ... -end \ No newline at end of file +end + +--- @param texInfo TextureInfo +--- @param prevX number +--- @param prevY number +--- @param prevScaleW number +--- @param prevScaleH number +--- @param x number +--- @param y number +--- @param scaleW number +--- @param scaleH number +--- @return nil +function djui_hud_render_texture_interpolated(texInfo, prevX, prevY, prevScaleW, prevScaleH, x, y, scaleW, scaleH) + -- ... +end diff --git a/docs/lua/functions-3.md b/docs/lua/functions-3.md index c90578ea..8a56c89b 100644 --- a/docs/lua/functions-3.md +++ b/docs/lua/functions-3.md @@ -2135,6 +2135,33 @@
+## [djui_hud_render_rect_interpolated](#djui_hud_render_rect_interpolated) + +### Lua Example +`djui_hud_render_rect_interpolated(prevX, prevY, prevWidth, prevHeight, x, y, width, height)` + +### Parameters +| Field | Type | +| ----- | ---- | +| prevX | `number` | +| prevY | `number` | +| prevWidth | `number` | +| prevHeight | `number` | +| x | `number` | +| y | `number` | +| width | `number` | +| height | `number` | + +### Returns +- None + +### C Prototype +`void djui_hud_render_rect_interpolated(f32 prevX, f32 prevY, f32 prevWidth, f32 prevHeight, f32 x, f32 y, f32 width, f32 height);` + +[:arrow_up_small:](#) + +
+ ## [djui_hud_set_color](#djui_hud_set_color) ### Lua Example @@ -2198,6 +2225,27 @@
+## [djui_hud_world_pos_to_screen_pos](#djui_hud_world_pos_to_screen_pos) + +### Lua Example +`djui_hud_world_pos_to_screen_pos(pos, out)` + +### Parameters +| Field | Type | +| ----- | ---- | +| pos | [Vec3f](structs.md#Vec3f) | +| out | [Vec3f](structs.md#Vec3f) | + +### Returns +- None + +### C Prototype +`void djui_hud_world_pos_to_screen_pos(Vec3f pos, Vec3f out);` + +[:arrow_up_small:](#) + +
+ --- # functions from djui_popup.h diff --git a/docs/lua/functions.md b/docs/lua/functions.md index 0cbf9a46..1aeae144 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -16,6 +16,7 @@ - [network_send](#network_send) - [djui_hud_render_texture](#djui_hud_render_texture) - [get_texture_info](#get_texture_info) + - [djui_hud_render_texture_interpolated](#djui_hud_render_texture_interpolated)
@@ -708,9 +709,11 @@ - [djui_hud_measure_text](functions-3.md#djui_hud_measure_text) - [djui_hud_print_text](functions-3.md#djui_hud_print_text) - [djui_hud_render_rect](functions-3.md#djui_hud_render_rect) + - [djui_hud_render_rect_interpolated](functions-3.md#djui_hud_render_rect_interpolated) - [djui_hud_set_color](functions-3.md#djui_hud_set_color) - [djui_hud_set_font](functions-3.md#djui_hud_set_font) - [djui_hud_set_resolution](functions-3.md#djui_hud_set_resolution) + - [djui_hud_world_pos_to_screen_pos](functions-3.md#djui_hud_world_pos_to_screen_pos)
@@ -1643,6 +1646,34 @@ Retrieves a texture by name.
+## [djui_hud_render_texture_interpolated](#djui_hud_render_texture_interpolated) + +### Lua Example +`djui_hud_render_texture_interpolated(texInfo, prevX, prevY, prevScaleW, prevScaleH, x, y, scaleW, scaleH)` + +### Parameters +| Field | Type | +| ----- | ---- | +| texInfo | [TextureInfo](structs.md#TextureInfo) | +| prevX | `number` | +| prevY | `number` | +| prevScaleW | `number` | +| prevScaleH | `number` | +| x | `number` | +| y | `number` | +| scaleW | `number` | +| scaleH | `number` | + +### Returns +- None + +### C Prototype +`void djui_hud_render_texture_interpolated(struct TextureInfo* texInfo, f32 prevX, f32 prevY, f32 prevScaleW, f32 prevScaleH, f32 x, f32 y, f32 scaleW, f32 scaleH);` + +[:arrow_up_small:](#) + +
+ --- 1 | [2](functions-2.md) | [3](functions-3.md) | [4](functions-4.md) | [next >](functions-2.md)] diff --git a/src/pc/djui/djui_hud_utils.c b/src/pc/djui/djui_hud_utils.c index 6a35fc17..91680839 100644 --- a/src/pc/djui/djui_hud_utils.c +++ b/src/pc/djui/djui_hud_utils.c @@ -8,12 +8,15 @@ #include "pc/gfx/gfx_pc.h" #include "pc/gfx/gfx_window_manager_api.h" #include "pc/pc_main.h" +#include "pc/utils/misc.h" #include "djui_gfx.h" #include "gfx_dimensions.h" #include "config.h" #include "djui.h" #include "djui_hud_utils.h" +#include "game/camera.h" + static enum HudUtilsResolution sResolution = RESOLUTION_DJUI; static enum DjuiFontType sFont = FONT_NORMAL; @@ -53,6 +56,66 @@ static void djui_hud_size_translate(f32* size) { } } + //////////// + // interp // +//////////// + +#define MAX_INTERP_HUD 128 +struct InterpHud { + Gfx* headPos; + f32 z; + f32 prevX; + f32 prevY; + f32 x; + f32 y; + f32 prevScaleW; + f32 prevScaleH; + f32 scaleW; + f32 scaleH; + f32 width; + f32 height; +}; +static struct InterpHud sInterpHuds[MAX_INTERP_HUD] = { 0 }; +static u16 sInterpHudCount = 0; + +void patch_djui_hud_before(void) { + sInterpHudCount = 0; +} + +void patch_djui_hud(f32 delta) { + f32 savedZ = gDjuiHudUtilsZ; + Gfx* savedHeadPos = gDisplayListHead; + for (u16 i = 0; i < sInterpHudCount; i++) { + struct InterpHud* interp = &sInterpHuds[i]; + f32 x = delta_interpolate_f32(interp->prevX, interp->x, delta); + f32 y = delta_interpolate_f32(interp->prevY, interp->y, delta); + f32 scaleW = delta_interpolate_f32(interp->prevScaleW, interp->scaleW, delta); + f32 scaleH = delta_interpolate_f32(interp->prevScaleH, interp->scaleH, delta); + + gDjuiHudUtilsZ = interp->z; + gDisplayListHead = interp->headPos; + + // translate position + f32 translatedX = x; + f32 translatedY = y; + djui_hud_position_translate(&translatedX, &translatedY); + create_dl_translation_matrix(DJUI_MTX_PUSH, translatedX, translatedY, gDjuiHudUtilsZ); + + // translate scale + f32 translatedW = scaleW; + f32 translatedH = scaleH; + djui_hud_size_translate(&translatedW); + djui_hud_size_translate(&translatedH); + create_dl_scale_matrix(DJUI_MTX_NOPUSH, interp->width * translatedW, interp->height * translatedH, 1.0f); + } + gDisplayListHead = savedHeadPos; + gDjuiHudUtilsZ = savedZ; +} + + //////////// + // others // +//////////// + void djui_hud_set_resolution(enum HudUtilsResolution resolutionType) { if (resolutionType >= RESOLUTION_COUNT) { return; } sResolution = resolutionType; @@ -183,6 +246,28 @@ void djui_hud_render_texture(struct TextureInfo* texInfo, f32 x, f32 y, f32 scal djui_hud_render_texture_raw(texInfo->texture, texInfo->bitSize, texInfo->width, texInfo->height, x, y, scaleW, scaleH); } +void djui_hud_render_texture_interpolated(struct TextureInfo* texInfo, f32 prevX, f32 prevY, f32 prevScaleW, f32 prevScaleH, f32 x, f32 y, f32 scaleW, f32 scaleH) { + Gfx* savedHeadPos = gDisplayListHead; + f32 savedZ = gDjuiHudUtilsZ; + + djui_hud_render_texture_raw(texInfo->texture, texInfo->bitSize, texInfo->width, texInfo->height, prevX, prevY, prevScaleW, prevScaleH); + + if (sInterpHudCount >= MAX_INTERP_HUD) { return; } + struct InterpHud* interp = &sInterpHuds[sInterpHudCount++]; + interp->headPos = savedHeadPos; + interp->prevX = prevX; + interp->prevY = prevY; + interp->prevScaleW = prevScaleW; + interp->prevScaleH = prevScaleH; + interp->x = x; + interp->y = y; + interp->scaleW = scaleW; + interp->scaleH = scaleH; + interp->width = texInfo->width; + interp->height = texInfo->height; + interp->z = savedZ; +} + void djui_hud_render_rect(f32 x, f32 y, f32 width, f32 height) { gDjuiHudUtilsZ += 0.01f; @@ -205,3 +290,51 @@ void djui_hud_render_rect(f32 x, f32 y, f32 width, f32 height) { // pop gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); } + +void djui_hud_render_rect_interpolated(f32 prevX, f32 prevY, f32 prevWidth, f32 prevHeight, f32 x, f32 y, f32 width, f32 height) { + Gfx* savedHeadPos = gDisplayListHead; + f32 savedZ = gDjuiHudUtilsZ; + + djui_hud_render_rect(prevX, prevY, prevWidth, prevHeight); + + if (sInterpHudCount >= MAX_INTERP_HUD) { return; } + struct InterpHud* interp = &sInterpHuds[sInterpHudCount++]; + interp->headPos = savedHeadPos; + interp->prevX = prevX; + interp->prevY = prevY; + interp->prevScaleW = prevWidth; + interp->prevScaleH = prevHeight; + interp->x = x; + interp->y = y; + interp->scaleW = width; + interp->scaleH = height; + interp->width = 1; + interp->height = 1; + interp->z = savedZ; +} + +static void hud_rotate_and_translate_vec3f(Vec3f vec, Mat4* mtx, Vec3f out) { + out[0] = (*mtx)[0][0] * vec[0] + (*mtx)[1][0] * vec[1] + (*mtx)[2][0] * vec[2]; + out[1] = (*mtx)[0][1] * vec[0] + (*mtx)[1][1] * vec[1] + (*mtx)[2][1] * vec[2]; + out[2] = (*mtx)[0][2] * vec[0] + (*mtx)[1][2] * vec[1] + (*mtx)[2][2] * vec[2]; + out[0] += (*mtx)[3][0]; + out[1] += (*mtx)[3][1]; + out[2] += (*mtx)[3][2]; +} + +void djui_hud_world_pos_to_screen_pos(Vec3f pos, Vec3f out) { + hud_rotate_and_translate_vec3f(pos, &gCamera->mtx, out); + if (out[2] > -256.0f) { + return; + } + + out[0] *= 256.0 / -out[2]; + out[1] *= 256.0 / out[2]; + + // TODO: this is a hack to correct for the FOV. It only sort of works for the default fov + out[0] *= 1.135; + out[1] *= 1.135; + + out[0] += djui_hud_get_screen_width() / 2.0f; + out[1] += djui_hud_get_screen_height() / 2.0f; +} \ No newline at end of file diff --git a/src/pc/djui/djui_hud_utils.h b/src/pc/djui/djui_hud_utils.h index 3f30529c..8ae7b704 100644 --- a/src/pc/djui/djui_hud_utils.h +++ b/src/pc/djui/djui_hud_utils.h @@ -41,6 +41,10 @@ f32 djui_hud_measure_text(const char* message); void djui_hud_print_text(const char* message, float x, float y, float scale); void djui_hud_render_texture(struct TextureInfo* texInfo, f32 x, f32 y, f32 scaleW, f32 scaleH); void djui_hud_render_texture_raw(const u8* texture, u32 bitSize, u32 width, u32 height, f32 x, f32 y, f32 scaleW, f32 scaleH); +void djui_hud_render_texture_interpolated(struct TextureInfo* texInfo, f32 prevX, f32 prevY, f32 prevScaleW, f32 prevScaleH, f32 x, f32 y, f32 scaleW, f32 scaleH); void djui_hud_render_rect(f32 x, f32 y, f32 width, f32 height); +void djui_hud_render_rect_interpolated(f32 prevX, f32 prevY, f32 prevWidth, f32 prevHeight, f32 x, f32 y, f32 width, f32 height); + +void djui_hud_world_pos_to_screen_pos(Vec3f pos, Vec3f out); #endif \ No newline at end of file diff --git a/src/pc/lua/smlua_functions.c b/src/pc/lua/smlua_functions.c index e2c86b7a..c9a3f9da 100644 --- a/src/pc/lua/smlua_functions.c +++ b/src/pc/lua/smlua_functions.c @@ -271,6 +271,59 @@ int smlua_func_djui_hud_render_texture(lua_State* L) { return 1; } +int smlua_func_djui_hud_render_texture_interpolated(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 9)) { return 0; } + + struct TextureInfo tmpTexInfo = { 0 }; + struct TextureInfo* texInfo = &tmpTexInfo; + + if (smlua_is_cobject(L, 1, LOT_TEXTUREINFO)) { + texInfo = (struct TextureInfo*)smlua_to_cobject(L, 1, LOT_TEXTUREINFO); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1"); return 0; } + } else { + int top = lua_gettop(L); + lua_pushvalue(L, 1); + + lua_pushstring(L, "texture"); + lua_gettable(L, top+1); + tmpTexInfo.texture = smlua_to_cpointer(L, lua_gettop(L), LVT_U8_P); + lua_pop(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1's 'texture' field"); return 0; } + + tmpTexInfo.bitSize = smlua_get_integer_field(top+1, "bitSize"); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1's 'bitSize' field"); return 0; } + + tmpTexInfo.width = smlua_get_integer_field(top+1, "width"); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1's 'width' field"); return 0; } + + tmpTexInfo.height = smlua_get_integer_field(top+1, "height"); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1's 'height' field"); return 0; } + + lua_settop(L, top); + } + + f32 prevX = smlua_to_number(L, 2); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 2"); return 0; } + f32 prevY = smlua_to_number(L, 3); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 3"); return 0; } + f32 prevScaleW = smlua_to_number(L, 4); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 4"); return 0; } + f32 prevScaleH = smlua_to_number(L, 5); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 5"); return 0; } + f32 x = smlua_to_number(L, 6); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 6"); return 0; } + f32 y = smlua_to_number(L, 7); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 7"); return 0; } + f32 scaleW = smlua_to_number(L, 8); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 8"); return 0; } + f32 scaleH = smlua_to_number(L, 9); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 9"); return 0; } + + djui_hud_render_texture_interpolated(texInfo, prevX, prevY, prevScaleW, prevScaleH, x, y, scaleW, scaleH); + + return 1; +} + ////////// // bind // ////////// @@ -290,4 +343,5 @@ void smlua_bind_functions(void) { smlua_bind_function(L, "network_send_to", smlua_func_network_send_to); smlua_bind_function(L, "get_texture_info", smlua_func_get_texture_info); smlua_bind_function(L, "djui_hud_render_texture", smlua_func_djui_hud_render_texture); + smlua_bind_function(L, "djui_hud_render_texture_interpolated", smlua_func_djui_hud_render_texture_interpolated); } diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index 9dbb9882..8f0d8deb 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -7267,6 +7267,31 @@ int smlua_func_djui_hud_render_rect(lua_State* L) { return 1; } +int smlua_func_djui_hud_render_rect_interpolated(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 8)) { return 0; } + + f32 prevX = smlua_to_number(L, 1); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1"); return 0; } + f32 prevY = smlua_to_number(L, 2); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 2"); return 0; } + f32 prevWidth = smlua_to_number(L, 3); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 3"); return 0; } + f32 prevHeight = smlua_to_number(L, 4); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 4"); return 0; } + f32 x = smlua_to_number(L, 5); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 5"); return 0; } + f32 y = smlua_to_number(L, 6); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 6"); return 0; } + f32 width = smlua_to_number(L, 7); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 7"); return 0; } + f32 height = smlua_to_number(L, 8); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 8"); return 0; } + + djui_hud_render_rect_interpolated(prevX, prevY, prevWidth, prevHeight, x, y, width, height); + + return 1; +} + int smlua_func_djui_hud_set_color(lua_State* L) { if(!smlua_functions_valid_param_count(L, 4)) { return 0; } @@ -7306,6 +7331,35 @@ int smlua_func_djui_hud_set_resolution(lua_State* L) { return 1; } +int smlua_func_djui_hud_world_pos_to_screen_pos(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 2)) { return 0; } + + + f32* pos = smlua_get_vec3f_from_buffer(); + pos[0] = smlua_get_number_field(1, "x"); + pos[1] = smlua_get_number_field(1, "y"); + pos[2] = smlua_get_number_field(1, "z"); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 1"); return 0; } + + f32* out = smlua_get_vec3f_from_buffer(); + out[0] = smlua_get_number_field(2, "x"); + out[1] = smlua_get_number_field(2, "y"); + out[2] = smlua_get_number_field(2, "z"); + if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter 2"); return 0; } + + djui_hud_world_pos_to_screen_pos(pos, out); + + smlua_push_number_field(1, "x", pos[0]); + smlua_push_number_field(1, "y", pos[1]); + smlua_push_number_field(1, "z", pos[2]); + + smlua_push_number_field(2, "x", out[0]); + smlua_push_number_field(2, "y", out[1]); + smlua_push_number_field(2, "z", out[2]); + + return 1; +} + ////////////////// // djui_popup.h // ////////////////// @@ -16807,9 +16861,11 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "djui_hud_measure_text", smlua_func_djui_hud_measure_text); smlua_bind_function(L, "djui_hud_print_text", smlua_func_djui_hud_print_text); smlua_bind_function(L, "djui_hud_render_rect", smlua_func_djui_hud_render_rect); + smlua_bind_function(L, "djui_hud_render_rect_interpolated", smlua_func_djui_hud_render_rect_interpolated); smlua_bind_function(L, "djui_hud_set_color", smlua_func_djui_hud_set_color); smlua_bind_function(L, "djui_hud_set_font", smlua_func_djui_hud_set_font); smlua_bind_function(L, "djui_hud_set_resolution", smlua_func_djui_hud_set_resolution); + smlua_bind_function(L, "djui_hud_world_pos_to_screen_pos", smlua_func_djui_hud_world_pos_to_screen_pos); // djui_popup.h smlua_bind_function(L, "djui_popup_create", smlua_func_djui_popup_create); diff --git a/src/pc/pc_main.c b/src/pc/pc_main.c index 9b58b305..42fb17c0 100644 --- a/src/pc/pc_main.c +++ b/src/pc/pc_main.c @@ -124,6 +124,7 @@ static void patch_interpolations_before(void) { extern void patch_bubble_particles_before(void); extern void patch_snow_particles_before(void); extern void patch_djui_before(void); + extern void patch_djui_hud_before(void); patch_mtx_before(); patch_screen_transition_before(); patch_title_screen_before(); @@ -133,6 +134,7 @@ static void patch_interpolations_before(void) { patch_bubble_particles_before(); patch_snow_particles_before(); patch_djui_before(); + patch_djui_hud_before(); } static inline void patch_interpolations(f32 delta) { @@ -145,6 +147,7 @@ static inline void patch_interpolations(f32 delta) { extern void patch_bubble_particles_interpolated(f32 delta); extern void patch_snow_particles_interpolated(f32 delta); extern void patch_djui_interpolated(f32 delta); + extern void patch_djui_hud(f32 delta); patch_mtx_interpolated(delta); patch_screen_transition_interpolated(delta); patch_title_screen_interpolated(delta); @@ -154,6 +157,7 @@ static inline void patch_interpolations(f32 delta) { patch_bubble_particles_interpolated(delta); patch_snow_particles_interpolated(delta); patch_djui_interpolated(delta); + patch_djui_hud(delta); } static void delay_frame(void) {