From 1ea28b9c5ae83121741953dc12909bc14bc8f0d2 Mon Sep 17 00:00:00 2001 From: MysterD Date: Tue, 15 Feb 2022 22:15:49 -0800 Subject: [PATCH] Added rect rendering to Lua API --- docs/lua/examples/hud.lua | 129 +++++++++++++++++++++++++++ docs/lua/functions.md | 24 +++++ docs/lua/lua.md | 1 + src/pc/djui/djui_font.c | 23 +---- src/pc/djui/djui_hud_utils.c | 20 +++++ src/pc/djui/djui_hud_utils.h | 1 + src/pc/lua/smlua_functions_autogen.c | 18 ++++ 7 files changed, 197 insertions(+), 19 deletions(-) create mode 100644 docs/lua/examples/hud.lua diff --git a/docs/lua/examples/hud.lua b/docs/lua/examples/hud.lua new file mode 100644 index 000000000..78ee2c208 --- /dev/null +++ b/docs/lua/examples/hud.lua @@ -0,0 +1,129 @@ +-- This file is an example of how to render to the screen + +rainbow = 0 + +function test_text() + -- set text and scale + local text = "This is example text in the bottom right." + local scale = 1 + + -- render to native screen space, with the MENU font + djui_hud_set_resolution(RESOLUTION_DJUI); + djui_hud_set_font(FONT_MENU); + + -- get width of screen and text + local screenWidth = djui_hud_get_screen_width() + local width = djui_hud_measure_text(text) * scale + + -- get height of screen and text + local screenHeight = djui_hud_get_screen_height() + local height = 64 * scale + + -- set location + local x = screenWidth - width + local y = screenHeight - height + + -- set color and render + djui_hud_set_color(255, 0, 255, 255); + djui_hud_print_text(text, x, y, scale); +end + +function test_texture() + -- render to N64's screen space + djui_hud_set_resolution(RESOLUTION_N64) + + -- get player's character texture + local tex = gMarioStates[0].character.hudHeadTexture + + -- set scale + local wscale = 1 + local hscale = 1 + + -- set position + local x = 256 + local y = 64 + + -- set color and render + djui_hud_set_color(255, 0, 255, 255) + djui_hud_render_texture(tex, x, y, wscale, hscale) +end + +function test_rect() + -- render to native screen space + djui_hud_set_resolution(RESOLUTION_DJUI) + + -- set location + local x = 512 + local y = 512 + + -- set width/height + local w = 256 + local h = 256 + + -- set color and render first rectangle + djui_hud_set_color(255, 0, 0, 128) + djui_hud_render_rect(x, y, w, h) + + -- adjust location and size + x = x + 16 + y = y + 16 + w = w - 32 + h = h - 32 + + -- set color and render second rectangle + djui_hud_set_color(0, 255, 0, 128) + djui_hud_render_rect(x, y, w, h) + + -- adjust location and size + x = x + 16 + y = y + 16 + w = w - 32 + h = h - 32 + + -- set color and render third rectangle + djui_hud_set_color(0, 0, 255, 128) + djui_hud_render_rect(x, y, w, h) +end + +function test_rainbow_text() + -- this function is incredibly silly + -- don't do anything like this + local res = RESOLUTION_DJUI + local text = "HELLO WORLD" + local scale = 3 + + djui_hud_set_resolution(res); + djui_hud_set_font(FONT_NORMAL); + + for i=0,255 do + j = rainbow / 50 + local r = math.sin(0.00 + i / 15 + j) * 127 + 127 + local g = math.sin(0.33 + i / 33 + j) * 127 + 127 + local b = math.sin(0.66 + i / 77 + j) * 127 + 127 + local x = 64 + i + local y = 64 + i + math.sin(i / 40 + j) * 64 + if i == 255 then + r = 0 + g = 0 + b = 0 + end + djui_hud_set_color(r, g, b, i); + djui_hud_print_text(text, x, y, scale); + end + rainbow = rainbow + 1 +end + +function on_hud_render() + test_text() + test_rect() + test_texture() + test_rainbow_text() +end + +function on_mario_update(m) + if m.action == ACT_JUMP then + displaying = true + end +end + +hook_event(HOOK_ON_HUD_RENDER, on_hud_render) diff --git a/docs/lua/functions.md b/docs/lua/functions.md index c35d59a57..0a61ff05c 100644 --- a/docs/lua/functions.md +++ b/docs/lua/functions.md @@ -31,6 +31,7 @@ - [djui_hud_get_screen_width](#djui_hud_get_screen_width) - [djui_hud_measure_text](#djui_hud_measure_text) - [djui_hud_print_text](#djui_hud_print_text) + - [djui_hud_render_rect](#djui_hud_render_rect) - [djui_hud_render_texture](#djui_hud_render_texture) - [djui_hud_set_color](#djui_hud_set_color) - [djui_hud_set_font](#djui_hud_set_font) @@ -708,6 +709,29 @@
+## [djui_hud_render_rect](#djui_hud_render_rect) + +### Lua Example +`djui_hud_render_rect(x, y, width, height)` + +### Parameters +| Field | Type | +| ----- | ---- | +| x | number | +| y | number | +| width | number | +| height | number | + +### Returns +- None + +### C Prototype +`void djui_hud_render_rect(f32 x, f32 y, f32 width, f32 height);` + +[:arrow_up_small:](#) + +
+ ## [djui_hud_render_texture](#djui_hud_render_texture) ### Lua Example diff --git a/docs/lua/lua.md b/docs/lua/lua.md index 4ce285046..50af05e76 100644 --- a/docs/lua/lua.md +++ b/docs/lua/lua.md @@ -32,3 +32,4 @@ Lua scripts you make can be placed either the `mods` folder in the base director - [Low Gravity](../../mods/low-gravity.lua) - [Faster Swimming](../../mods/faster-swimming.lua) - [Hide and Seek](../../mods/hide-and-seek.lua) +- [HUD Rendering](examples/hud.lua) diff --git a/src/pc/djui/djui_font.c b/src/pc/djui/djui_font.c index b0bbb68cc..67c1e42bf 100644 --- a/src/pc/djui/djui_font.c +++ b/src/pc/djui/djui_font.c @@ -16,7 +16,7 @@ static const Gfx djui_font_normal_text_begin[] = { gsDPPipeSync(), gsSPClearGeometryMode(G_LIGHTING), gsDPSetCombineMode(G_CC_FADEA, G_CC_FADEA), - gsDPSetEnvColor(255, 255, 255, 255), + //gsDPSetEnvColor(255, 255, 255, 255), gsDPSetRenderMode(G_RM_XLU_SURF, G_RM_XLU_SURF2), gsDPSetTextureFilter(G_TF_POINT), gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON), @@ -39,6 +39,7 @@ static void djui_font_normal_render_char(char c) { extern const u8* const font_normal_chars[]; // replace undisplayable characters if (c < ' ' || (u8)c > ('~' + 1)) { c = '?'; } + if (c == ' ') { return; } void* fontChar = (void*)font_normal_chars[c - '!']; if (fontChar == NULL) { fontChar = (void*)font_normal_chars[94]; } @@ -72,6 +73,7 @@ static void djui_font_title_render_char(char c) { extern const u8* const font_title_chars[]; // replace undisplayable characters if (c < ' ' || (u8)c > ('~' + 1)) { c = '?'; } + if (c == ' ') { return; } djui_gfx_render_texture(font_title_chars[c - '!'], 64, 64, 32); } @@ -96,24 +98,6 @@ static const struct DjuiFont sDjuiFontTitle = { // font 3 (hud font) // /////////////////////// -/* - texture_hud_char_0, texture_hud_char_1, texture_hud_char_2, texture_hud_char_3, - texture_hud_char_4, texture_hud_char_5, texture_hud_char_6, texture_hud_char_7, - texture_hud_char_8, texture_hud_char_9, texture_hud_char_A, texture_hud_char_B, - texture_hud_char_C, texture_hud_char_D, texture_hud_char_E, texture_hud_char_F, - texture_hud_char_G, texture_hud_char_H, texture_hud_char_I, texture_hud_char_J, - texture_hud_char_K, texture_hud_char_L, texture_hud_char_M, texture_hud_char_N, - texture_hud_char_O, texture_hud_char_P, 0x0, texture_hud_char_R, - texture_hud_char_S, texture_hud_char_T, texture_hud_char_U, 0x0, - texture_hud_char_W, 0x0, texture_hud_char_Y, texture_hud_char_waluigi_head, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, texture_hud_char_multiply, texture_hud_char_coin, - texture_hud_char_mario_head, texture_hud_char_star, texture_hud_char_luigi_head, texture_hud_char_toad_head, - texture_hud_char_apostrophe, texture_hud_char_double_quote, -*/ - static u8 djui_font_hud_index(char c) { if (c == 'q' || c == 'Q') { return 50; } if (c == 'v' || c == 'V') { return 50; } @@ -138,6 +122,7 @@ static u8 djui_font_hud_index(char c) { } static void djui_font_hud_render_char(char c) { + if (c == ' ') { return; } u8 index = djui_font_hud_index(c); djui_gfx_render_texture(main_hud_lut[index], 16, 16, 16); } diff --git a/src/pc/djui/djui_hud_utils.c b/src/pc/djui/djui_hud_utils.c index 82127a22a..0bd59ba65 100644 --- a/src/pc/djui/djui_hud_utils.c +++ b/src/pc/djui/djui_hud_utils.c @@ -160,3 +160,23 @@ 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->width, x, y, scaleW, scaleH); } +void djui_hud_render_rect(f32 x, f32 y, f32 width, f32 height) { + // translate position + f32 translatedX = x; + f32 translatedY = y; + djui_hud_position_translate(&translatedX, &translatedY); + create_dl_translation_matrix(DJUI_MTX_PUSH, translatedX, translatedY, 0); + + // translate scale + f32 translatedW = width; + f32 translatedH = height; + djui_hud_size_translate(&translatedW); + djui_hud_size_translate(&translatedH); + create_dl_scale_matrix(DJUI_MTX_NOPUSH, translatedW, translatedH, 1.0f); + + // render + gSPDisplayList(gDisplayListHead++, dl_djui_simple_rect); + + // pop + gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); +} \ 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 5a8f3f904..1d62ea2be 100644 --- a/src/pc/djui/djui_hud_utils.h +++ b/src/pc/djui/djui_hud_utils.h @@ -36,5 +36,6 @@ u32 djui_hud_get_screen_height(void); 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_rect(f32 x, f32 y, f32 width, f32 height); #endif \ No newline at end of file diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c index d0bc4e034..e89282aaf 100644 --- a/src/pc/lua/smlua_functions_autogen.c +++ b/src/pc/lua/smlua_functions_autogen.c @@ -252,6 +252,23 @@ int smlua_func_djui_hud_print_text(lua_State* L) { return 1; } +int smlua_func_djui_hud_render_rect(lua_State* L) { + if(!smlua_functions_valid_param_count(L, 4)) { return 0; } + + f32 x = smlua_to_number(L, 1); + if (!gSmLuaConvertSuccess) { return 0; } + f32 y = smlua_to_number(L, 2); + if (!gSmLuaConvertSuccess) { return 0; } + f32 width = smlua_to_number(L, 3); + if (!gSmLuaConvertSuccess) { return 0; } + f32 height = smlua_to_number(L, 4); + if (!gSmLuaConvertSuccess) { return 0; } + + djui_hud_render_rect(x, y, width, height); + + return 1; +} + int smlua_func_djui_hud_render_texture(lua_State* L) { if(!smlua_functions_valid_param_count(L, 5)) { return 0; } @@ -3484,6 +3501,7 @@ void smlua_bind_functions_autogen(void) { smlua_bind_function(L, "djui_hud_get_screen_width", smlua_func_djui_hud_get_screen_width); 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_texture", smlua_func_djui_hud_render_texture); 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);