mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
Added rect rendering to Lua API
This commit is contained in:
parent
669e17bc18
commit
1ea28b9c5a
7 changed files with 197 additions and 19 deletions
129
docs/lua/examples/hud.lua
Normal file
129
docs/lua/examples/hud.lua
Normal file
|
|
@ -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)
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
- [djui_hud_get_screen_width](#djui_hud_get_screen_width)
|
- [djui_hud_get_screen_width](#djui_hud_get_screen_width)
|
||||||
- [djui_hud_measure_text](#djui_hud_measure_text)
|
- [djui_hud_measure_text](#djui_hud_measure_text)
|
||||||
- [djui_hud_print_text](#djui_hud_print_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_render_texture](#djui_hud_render_texture)
|
||||||
- [djui_hud_set_color](#djui_hud_set_color)
|
- [djui_hud_set_color](#djui_hud_set_color)
|
||||||
- [djui_hud_set_font](#djui_hud_set_font)
|
- [djui_hud_set_font](#djui_hud_set_font)
|
||||||
|
|
@ -708,6 +709,29 @@
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
|
## [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:](#)
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
## [djui_hud_render_texture](#djui_hud_render_texture)
|
## [djui_hud_render_texture](#djui_hud_render_texture)
|
||||||
|
|
||||||
### Lua Example
|
### Lua Example
|
||||||
|
|
|
||||||
|
|
@ -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)
|
- [Low Gravity](../../mods/low-gravity.lua)
|
||||||
- [Faster Swimming](../../mods/faster-swimming.lua)
|
- [Faster Swimming](../../mods/faster-swimming.lua)
|
||||||
- [Hide and Seek](../../mods/hide-and-seek.lua)
|
- [Hide and Seek](../../mods/hide-and-seek.lua)
|
||||||
|
- [HUD Rendering](examples/hud.lua)
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ static const Gfx djui_font_normal_text_begin[] = {
|
||||||
gsDPPipeSync(),
|
gsDPPipeSync(),
|
||||||
gsSPClearGeometryMode(G_LIGHTING),
|
gsSPClearGeometryMode(G_LIGHTING),
|
||||||
gsDPSetCombineMode(G_CC_FADEA, G_CC_FADEA),
|
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),
|
gsDPSetRenderMode(G_RM_XLU_SURF, G_RM_XLU_SURF2),
|
||||||
gsDPSetTextureFilter(G_TF_POINT),
|
gsDPSetTextureFilter(G_TF_POINT),
|
||||||
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
|
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[];
|
extern const u8* const font_normal_chars[];
|
||||||
// replace undisplayable characters
|
// replace undisplayable characters
|
||||||
if (c < ' ' || (u8)c > ('~' + 1)) { c = '?'; }
|
if (c < ' ' || (u8)c > ('~' + 1)) { c = '?'; }
|
||||||
|
if (c == ' ') { return; }
|
||||||
void* fontChar = (void*)font_normal_chars[c - '!'];
|
void* fontChar = (void*)font_normal_chars[c - '!'];
|
||||||
if (fontChar == NULL) { fontChar = (void*)font_normal_chars[94]; }
|
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[];
|
extern const u8* const font_title_chars[];
|
||||||
// replace undisplayable characters
|
// replace undisplayable characters
|
||||||
if (c < ' ' || (u8)c > ('~' + 1)) { c = '?'; }
|
if (c < ' ' || (u8)c > ('~' + 1)) { c = '?'; }
|
||||||
|
if (c == ' ') { return; }
|
||||||
djui_gfx_render_texture(font_title_chars[c - '!'], 64, 64, 32);
|
djui_gfx_render_texture(font_title_chars[c - '!'], 64, 64, 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -96,24 +98,6 @@ static const struct DjuiFont sDjuiFontTitle = {
|
||||||
// font 3 (hud font) //
|
// 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) {
|
static u8 djui_font_hud_index(char c) {
|
||||||
if (c == 'q' || c == 'Q') { return 50; }
|
if (c == 'q' || c == 'Q') { return 50; }
|
||||||
if (c == 'v' || c == 'V') { 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) {
|
static void djui_font_hud_render_char(char c) {
|
||||||
|
if (c == ' ') { return; }
|
||||||
u8 index = djui_font_hud_index(c);
|
u8 index = djui_font_hud_index(c);
|
||||||
djui_gfx_render_texture(main_hud_lut[index], 16, 16, 16);
|
djui_gfx_render_texture(main_hud_lut[index], 16, 16, 16);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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);
|
||||||
|
}
|
||||||
|
|
@ -36,5 +36,6 @@ u32 djui_hud_get_screen_height(void);
|
||||||
f32 djui_hud_measure_text(const char* message);
|
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_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(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
|
#endif
|
||||||
|
|
@ -252,6 +252,23 @@ int smlua_func_djui_hud_print_text(lua_State* L) {
|
||||||
return 1;
|
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) {
|
int smlua_func_djui_hud_render_texture(lua_State* L) {
|
||||||
if(!smlua_functions_valid_param_count(L, 5)) { return 0; }
|
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_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_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_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_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_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_font", smlua_func_djui_hud_set_font);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue