Added image drawing to Lua API

This commit is contained in:
MysterD 2022-02-15 22:12:20 -08:00
parent 941375718b
commit ded74e7fb5
13 changed files with 237 additions and 136 deletions

View file

@ -17,7 +17,7 @@ in_files = [
"src/pc/network/network_player.h", "src/pc/network/network_player.h",
"include/PR/os_cont.h", "include/PR/os_cont.h",
"src/game/interaction.c", "src/game/interaction.c",
"src/pc/djui/djui_gfx_utils.h", "src/pc/djui/djui_hud_utils.h",
] ]
exclude_constants = [ exclude_constants = [

View file

@ -32,7 +32,7 @@ in_files = [
"src/game/level_info.h", "src/game/level_info.h",
"src/game/save_file.h", "src/game/save_file.h",
"src/game/sound_init.h", "src/game/sound_init.h",
"src/pc/djui/djui_gfx_utils.h", "src/pc/djui/djui_hud_utils.h",
] ]
override_allowed_functions = { override_allowed_functions = {
@ -164,6 +164,9 @@ def build_param(param, i):
return ' %s %s = smlua_to_number(L, %d);\n' % (ptype, pid, i) return ' %s %s = smlua_to_number(L, %d);\n' % (ptype, pid, i)
elif ptype == 'const char*': elif ptype == 'const char*':
return ' %s %s = smlua_to_string(L, %d);\n' % (ptype, pid, i) return ' %s %s = smlua_to_string(L, %d);\n' % (ptype, pid, i)
elif translate_type_to_lot(ptype) == 'LOT_POINTER':
lvt = translate_type_to_lvt(ptype)
return ' %s %s = (%s)smlua_to_cpointer(L, %d, %s);\n' % (ptype, pid, ptype, i, lvt)
else: else:
lot = translate_type_to_lot(ptype) lot = translate_type_to_lot(ptype)
s = ' %s %s = (%s)smlua_to_cobject(L, %d, %s);' % (ptype, pid, ptype, i, lot) s = ' %s %s = (%s)smlua_to_cobject(L, %d, %s);' % (ptype, pid, ptype, i, lot)

View file

@ -19,8 +19,8 @@ fi
# no debug, direct # no debug, direct
$FILE --server 27015 --configfile sm64config_server.txt & $FILE --server 27015 --configfile sm64config_server.txt &
sleep 2 #sleep 2
$FILE --client 127.0.0.1 27015 --configfile sm64config_client.txt & #$FILE --client 127.0.0.1 27015 --configfile sm64config_client.txt &
exit exit
# debug on server # debug on server

View file

@ -6,9 +6,9 @@
- [characters.h](#characters.h) - [characters.h](#characters.h)
- [CharacterSound](#CharacterSound) - [CharacterSound](#CharacterSound)
- [CharacterType](#CharacterType) - [CharacterType](#CharacterType)
- [djui_gfx_utils.h](#djui_gfx_utils.h) - [djui_hud_utils.h](#djui_hud_utils.h)
- [DjuiFontType](#DjuiFontType) - [DjuiFontType](#DjuiFontType)
- [GfxUtilsResolution](#GfxUtilsResolution) - [HudUtilsResolution](#HudUtilsResolution)
- [interaction.c](#interaction.c) - [interaction.c](#interaction.c)
- [InteractionFlag](#InteractionFlag) - [InteractionFlag](#InteractionFlag)
- [mario_animation_ids.h](#mario_animation_ids.h) - [mario_animation_ids.h](#mario_animation_ids.h)
@ -745,7 +745,7 @@
<br /> <br />
## [djui_gfx_utils.h](#djui_gfx_utils.h) ## [djui_hud_utils.h](#djui_hud_utils.h)
### [enum DjuiFontType](#DjuiFontType) ### [enum DjuiFontType](#DjuiFontType)
| Identifier | Value | | Identifier | Value |
@ -755,7 +755,7 @@
| FONT_HUD | 2 | | FONT_HUD | 2 |
| FONT_COUNT | 3 | | FONT_COUNT | 3 |
### [enum GfxUtilsResolution](#GfxUtilsResolution) ### [enum HudUtilsResolution](#HudUtilsResolution)
| Identifier | Value | | Identifier | Value |
| :--------- | :---- | | :--------- | :---- |
| RESOLUTION_DJUI | 0 | | RESOLUTION_DJUI | 0 |

View file

@ -26,14 +26,15 @@
<br /> <br />
- djui_gfx_utils.h - djui_hud_utils.h
- [djui_gfx_get_screen_height](#djui_gfx_get_screen_height) - [djui_hud_get_screen_height](#djui_hud_get_screen_height)
- [djui_gfx_get_screen_width](#djui_gfx_get_screen_width) - [djui_hud_get_screen_width](#djui_hud_get_screen_width)
- [djui_gfx_measure_text](#djui_gfx_measure_text) - [djui_hud_measure_text](#djui_hud_measure_text)
- [djui_gfx_print_text](#djui_gfx_print_text) - [djui_hud_print_text](#djui_hud_print_text)
- [djui_gfx_set_color](#djui_gfx_set_color) - [djui_hud_render_texture](#djui_hud_render_texture)
- [djui_gfx_set_font](#djui_gfx_set_font) - [djui_hud_set_color](#djui_hud_set_color)
- [djui_gfx_set_resolution](#djui_gfx_set_resolution) - [djui_hud_set_font](#djui_hud_set_font)
- [djui_hud_set_resolution](#djui_hud_set_resolution)
<br /> <br />
@ -623,15 +624,15 @@
<br /> <br />
--- ---
# functions from djui_gfx_utils.h # functions from djui_hud_utils.h
<br /> <br />
## [djui_gfx_get_screen_height](#djui_gfx_get_screen_height) ## [djui_hud_get_screen_height](#djui_hud_get_screen_height)
### Lua Example ### Lua Example
`local integerValue = djui_gfx_get_screen_height()` `local integerValue = djui_hud_get_screen_height()`
### Parameters ### Parameters
- None - None
@ -640,16 +641,16 @@
- integer - integer
### C Prototype ### C Prototype
`u32 djui_gfx_get_screen_height(void);` `u32 djui_hud_get_screen_height(void);`
[:arrow_up_small:](#) [:arrow_up_small:](#)
<br /> <br />
## [djui_gfx_get_screen_width](#djui_gfx_get_screen_width) ## [djui_hud_get_screen_width](#djui_hud_get_screen_width)
### Lua Example ### Lua Example
`local integerValue = djui_gfx_get_screen_width()` `local integerValue = djui_hud_get_screen_width()`
### Parameters ### Parameters
- None - None
@ -658,16 +659,16 @@
- integer - integer
### C Prototype ### C Prototype
`u32 djui_gfx_get_screen_width(void);` `u32 djui_hud_get_screen_width(void);`
[:arrow_up_small:](#) [:arrow_up_small:](#)
<br /> <br />
## [djui_gfx_measure_text](#djui_gfx_measure_text) ## [djui_hud_measure_text](#djui_hud_measure_text)
### Lua Example ### Lua Example
`local numberValue = djui_gfx_measure_text(message)` `local numberValue = djui_hud_measure_text(message)`
### Parameters ### Parameters
| Field | Type | | Field | Type |
@ -678,16 +679,16 @@
- number - number
### C Prototype ### C Prototype
`f32 djui_gfx_measure_text(const char* message);` `f32 djui_hud_measure_text(const char* message);`
[:arrow_up_small:](#) [:arrow_up_small:](#)
<br /> <br />
## [djui_gfx_print_text](#djui_gfx_print_text) ## [djui_hud_print_text](#djui_hud_print_text)
### Lua Example ### Lua Example
`djui_gfx_print_text(message, x, y, scale)` `djui_hud_print_text(message, x, y, scale)`
### Parameters ### Parameters
| Field | Type | | Field | Type |
@ -701,16 +702,43 @@
- None - None
### C Prototype ### C Prototype
`void djui_gfx_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);`
[:arrow_up_small:](#) [:arrow_up_small:](#)
<br /> <br />
## [djui_gfx_set_color](#djui_gfx_set_color) ## [djui_hud_render_texture](#djui_hud_render_texture)
### Lua Example ### Lua Example
`djui_gfx_set_color(r, g, b, a)` `djui_hud_render_texture(texture, bitSize, x, y, width, height, scaleW, scaleH)`
### Parameters
| Field | Type |
| ----- | ---- |
| texture | Pointer <integer> |
| bitSize | integer |
| x | number |
| y | number |
| width | integer |
| height | integer |
| scaleW | number |
| scaleH | number |
### Returns
- None
### C Prototype
`void djui_hud_render_texture(const u8* texture, u32 bitSize, f32 x, f32 y, u32 width, u32 height, f32 scaleW, f32 scaleH);`
[:arrow_up_small:](#)
<br />
## [djui_hud_set_color](#djui_hud_set_color)
### Lua Example
`djui_hud_set_color(r, g, b, a)`
### Parameters ### Parameters
| Field | Type | | Field | Type |
@ -724,16 +752,16 @@
- None - None
### C Prototype ### C Prototype
`void djui_gfx_set_color(u8 r, u8 g, u8 b, u8 a);` `void djui_hud_set_color(u8 r, u8 g, u8 b, u8 a);`
[:arrow_up_small:](#) [:arrow_up_small:](#)
<br /> <br />
## [djui_gfx_set_font](#djui_gfx_set_font) ## [djui_hud_set_font](#djui_hud_set_font)
### Lua Example ### Lua Example
`djui_gfx_set_font(fontType)` `djui_hud_set_font(fontType)`
### Parameters ### Parameters
| Field | Type | | Field | Type |
@ -744,16 +772,16 @@
- None - None
### C Prototype ### C Prototype
`void djui_gfx_set_font(enum DjuiFontType fontType);` `void djui_hud_set_font(enum DjuiFontType fontType);`
[:arrow_up_small:](#) [:arrow_up_small:](#)
<br /> <br />
## [djui_gfx_set_resolution](#djui_gfx_set_resolution) ## [djui_hud_set_resolution](#djui_hud_set_resolution)
### Lua Example ### Lua Example
`djui_gfx_set_resolution(resolutionType)` `djui_hud_set_resolution(resolutionType)`
### Parameters ### Parameters
| Field | Type | | Field | Type |
@ -764,7 +792,7 @@
- None - None
### C Prototype ### C Prototype
`void djui_gfx_set_resolution(enum GfxUtilsResolution resolutionType);` `void djui_hud_set_resolution(enum HudUtilsResolution resolutionType);`
[:arrow_up_small:](#) [:arrow_up_small:](#)

View file

@ -4,7 +4,6 @@
#include "game/level_update.h" #include "game/level_update.h"
#include "pc/lua/smlua_hooks.h" #include "pc/lua/smlua_hooks.h"
#include "djui_panel_playerlist.h" #include "djui_panel_playerlist.h"
#include "djui_gfx_utils.h"
static Gfx* sSavedDisplayListHead = NULL; static Gfx* sSavedDisplayListHead = NULL;

View file

@ -1,27 +0,0 @@
#ifndef DJUI_GFX_UTILS_H
#define DJUI_GFX_UTILS_H
enum GfxUtilsResolution {
RESOLUTION_DJUI,
RESOLUTION_N64,
RESOLUTION_COUNT,
};
enum DjuiFontType {
FONT_NORMAL,
FONT_MENU,
FONT_HUD,
FONT_COUNT,
};
void djui_gfx_set_resolution(enum GfxUtilsResolution resolutionType);
void djui_gfx_set_font(enum DjuiFontType fontType);
void djui_gfx_set_color(u8 r, u8 g, u8 b, u8 a);
u32 djui_gfx_get_screen_width(void);
u32 djui_gfx_get_screen_height(void);
f32 djui_gfx_measure_text(const char* message);
void djui_gfx_print_text(const char* message, float x, float y, float scale);
#endif

View file

@ -6,29 +6,45 @@
#include "pc/gfx/gfx_window_manager_api.h" #include "pc/gfx/gfx_window_manager_api.h"
#include "pc/pc_main.h" #include "pc/pc_main.h"
#include "djui_gfx.h"
#include "gfx_dimensions.h" #include "gfx_dimensions.h"
#include "config.h" #include "config.h"
#include "djui.h" #include "djui.h"
#include "djui_gfx_utils.h" #include "djui_hud_utils.h"
static enum GfxUtilsResolution sResolution = RESOLUTION_DJUI; static enum HudUtilsResolution sResolution = RESOLUTION_DJUI;
static enum DjuiFontType sFont = FONT_NORMAL; static enum DjuiFontType sFont = FONT_NORMAL;
void djui_gfx_set_resolution(enum GfxUtilsResolution resolutionType) { static void djui_hud_position_translate(f32* x, f32* y) {
if (sResolution == RESOLUTION_DJUI) {
djui_gfx_position_translate(x, y);
} else {
*x = GFX_DIMENSIONS_FROM_LEFT_EDGE(0) + *x;
*y = SCREEN_HEIGHT - *y;
}
}
static void djui_hud_size_translate(f32* size) {
if (sResolution == RESOLUTION_DJUI) {
djui_gfx_size_translate(size);
}
}
void djui_hud_set_resolution(enum HudUtilsResolution resolutionType) {
if (resolutionType >= RESOLUTION_COUNT) { return; } if (resolutionType >= RESOLUTION_COUNT) { return; }
sResolution = resolutionType; sResolution = resolutionType;
} }
void djui_gfx_set_font(enum DjuiFontType fontType) { void djui_hud_set_font(enum DjuiFontType fontType) {
if (fontType >= FONT_COUNT) { return; } if (fontType >= FONT_COUNT) { return; }
sFont = fontType; sFont = fontType;
} }
void djui_gfx_set_color(u8 r, u8 g, u8 b, u8 a) { void djui_hud_set_color(u8 r, u8 g, u8 b, u8 a) {
gDPSetEnvColor(gDisplayListHead++, r, g, b, a); gDPSetEnvColor(gDisplayListHead++, r, g, b, a);
} }
u32 djui_gfx_get_screen_width(void) { u32 djui_hud_get_screen_width(void) {
u32 windowWidth, windowHeight; u32 windowWidth, windowHeight;
wm_api->get_dimensions(&windowWidth, &windowHeight); wm_api->get_dimensions(&windowWidth, &windowHeight);
@ -37,7 +53,7 @@ u32 djui_gfx_get_screen_width(void) {
: (windowWidth / djui_gfx_get_scale()); : (windowWidth / djui_gfx_get_scale());
} }
u32 djui_gfx_get_screen_height(void) { u32 djui_hud_get_screen_height(void) {
u32 windowWidth, windowHeight; u32 windowWidth, windowHeight;
wm_api->get_dimensions(&windowWidth, &windowHeight); wm_api->get_dimensions(&windowWidth, &windowHeight);
@ -46,7 +62,7 @@ u32 djui_gfx_get_screen_height(void) {
: (windowHeight / djui_gfx_get_scale()); : (windowHeight / djui_gfx_get_scale());
} }
f32 djui_gfx_measure_text(const char* message) { f32 djui_hud_measure_text(const char* message) {
if (message == NULL) { return 0; } if (message == NULL) { return 0; }
const struct DjuiFont* font = gDjuiFonts[sFont]; const struct DjuiFont* font = gDjuiFonts[sFont];
f32 width = 0; f32 width = 0;
@ -58,7 +74,7 @@ f32 djui_gfx_measure_text(const char* message) {
return width * font->defaultFontScale; return width * font->defaultFontScale;
} }
void djui_gfx_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) {
if (message == NULL) { return; } if (message == NULL) { return; }
const struct DjuiFont* font = gDjuiFonts[sFont]; const struct DjuiFont* font = gDjuiFonts[sFont];
f32 fontScale = font->defaultFontScale * scale; f32 fontScale = font->defaultFontScale * scale;
@ -71,19 +87,12 @@ void djui_gfx_print_text(const char* message, float x, float y, float scale) {
// translate position // translate position
f32 translatedX = x; f32 translatedX = x;
f32 translatedY = y; f32 translatedY = y;
if (sResolution == RESOLUTION_DJUI) { djui_hud_position_translate(&translatedX, &translatedY);
djui_gfx_position_translate(&translatedX, &translatedY);
} else if (sResolution == RESOLUTION_N64) {
translatedX = GFX_DIMENSIONS_FROM_LEFT_EDGE(0) + x;
translatedY = SCREEN_HEIGHT - y;
}
create_dl_translation_matrix(DJUI_MTX_PUSH, translatedX, translatedY, 0); create_dl_translation_matrix(DJUI_MTX_PUSH, translatedX, translatedY, 0);
// compute font size // compute font size
f32 translatedFontSize = fontScale; f32 translatedFontSize = fontScale;
if (sResolution == RESOLUTION_DJUI) { djui_hud_size_translate(&translatedFontSize);
djui_gfx_size_translate(&translatedFontSize);
}
create_dl_scale_matrix(DJUI_MTX_NOPUSH, translatedFontSize, translatedFontSize, 1.0f); create_dl_scale_matrix(DJUI_MTX_NOPUSH, translatedFontSize, translatedFontSize, 1.0f);
// render the line // render the line
@ -108,33 +117,23 @@ void djui_gfx_print_text(const char* message, float x, float y, float scale) {
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW); gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
} }
void djui_gfx_utils_render(void) { void djui_hud_render_texture(const u8* texture, u32 bitSize, f32 x, f32 y, u32 width, u32 height, f32 scaleW, f32 scaleH) {
//struct DjuiColor fore = { .r = 255, .g = 255, .b = 255, .a = 255 }; // translate position
//struct DjuiColor back = { .r = 0, .g = 0, .b = 0, .a = 255 }; f32 translatedX = x;
//const struct DjuiFont* font = gDjuiFonts[2]; f32 translatedY = y;
//djui_gfx_print_text(font, "abcdefghijklmnopqrstuvwxyz:1234567890", 2, 2, 2, back); djui_hud_position_translate(&translatedX, &translatedY);
//djui_gfx_print_text(font, "1234567890:abcdefghijklmnopqrstuvwxyz", 0, 0, 2, fore); create_dl_translation_matrix(DJUI_MTX_PUSH, translatedX, translatedY, 0);
//float scale = 240.0f / gfx_current_dimensions.height;
/*{ // translate scale
f32 screenWidth = djui_gfx_get_screen_width(RESOLUTION_N64); f32 translatedW = scaleW;
f32 width = djui_gfx_measure_text(font, "PAUSE", RESOLUTION_N64); f32 translatedH = scaleH;
djui_hud_size_translate(&translatedW);
djui_hud_size_translate(&translatedH);
create_dl_scale_matrix(DJUI_MTX_NOPUSH, width * translatedW, height * translatedH, 1.0f);
f32 screenHeight = djui_gfx_get_screen_height(RESOLUTION_N64); // render
f32 height = 16; djui_gfx_render_texture(texture, width, height, bitSize);
djui_gfx_print_text(font, "PAUSE", screenWidth - width, screenHeight - height - 32, 1.0f, fore, RESOLUTION_N64); // pop
djui_gfx_print_text(font, "PAUSE", screenWidth - width * 2, screenHeight - height, 1.0f, fore, RESOLUTION_N64); gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
}*/
/*{
f32 screenWidth = djui_gfx_get_screen_width(RESOLUTION_DJUI);
f32 width = djui_gfx_measure_text(font, "PAUSE", RESOLUTION_DJUI);
f32 screenHeight = djui_gfx_get_screen_height(RESOLUTION_DJUI);
f32 height = 16;
djui_gfx_print_text(FONT_NORMAL, "PAUSE", screenWidth - width, screenHeight - height - 32, 1.0f, fore, RESOLUTION_DJUI);
djui_gfx_print_text(FONT_NORMAL, "PAUSE", screenWidth - width * 2, screenHeight - height, 1.0f, fore, RESOLUTION_DJUI);
}*/
} }

View file

@ -0,0 +1,28 @@
#ifndef DJUI_HUD_UTILS_H
#define DJUI_HUD_UTILS_H
enum HudUtilsResolution {
RESOLUTION_DJUI,
RESOLUTION_N64,
RESOLUTION_COUNT,
};
enum DjuiFontType {
FONT_NORMAL,
FONT_MENU,
FONT_HUD,
FONT_COUNT,
};
void djui_hud_set_resolution(enum HudUtilsResolution resolutionType);
void djui_hud_set_font(enum DjuiFontType fontType);
void djui_hud_set_color(u8 r, u8 g, u8 b, u8 a);
u32 djui_hud_get_screen_width(void);
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(const u8* texture, u32 bitSize, f32 x, f32 y, u32 width, u32 height, f32 scaleW, f32 scaleH);
#endif

View file

@ -107,7 +107,7 @@ static int smlua__get_field(lua_State* L) {
case LVT_S16_P: case LVT_S16_P:
case LVT_S32_P: case LVT_S32_P:
case LVT_F32_P: case LVT_F32_P:
smlua_push_pointer(L, data->valueType, p); smlua_push_pointer(L, data->valueType, *(u8**)p);
break; break;
default: default:

View file

@ -16,7 +16,7 @@
#include "src/game/level_info.h" #include "src/game/level_info.h"
#include "src/game/save_file.h" #include "src/game/save_file.h"
#include "src/game/sound_init.h" #include "src/game/sound_init.h"
#include "src/pc/djui/djui_gfx_utils.h" #include "src/pc/djui/djui_hud_utils.h"
////////////// //////////////
@ -203,39 +203,39 @@ int smlua_func_djui_chat_message_create(lua_State* L) {
} }
////////////////////// //////////////////////
// djui_gfx_utils.h // // djui_hud_utils.h //
////////////////////// //////////////////////
int smlua_func_djui_gfx_get_screen_height(UNUSED lua_State* L) { int smlua_func_djui_hud_get_screen_height(UNUSED lua_State* L) {
if(!smlua_functions_valid_param_count(L, 0)) { return 0; } if(!smlua_functions_valid_param_count(L, 0)) { return 0; }
lua_pushinteger(L, djui_gfx_get_screen_height()); lua_pushinteger(L, djui_hud_get_screen_height());
return 1; return 1;
} }
int smlua_func_djui_gfx_get_screen_width(UNUSED lua_State* L) { int smlua_func_djui_hud_get_screen_width(UNUSED lua_State* L) {
if(!smlua_functions_valid_param_count(L, 0)) { return 0; } if(!smlua_functions_valid_param_count(L, 0)) { return 0; }
lua_pushinteger(L, djui_gfx_get_screen_width()); lua_pushinteger(L, djui_hud_get_screen_width());
return 1; return 1;
} }
int smlua_func_djui_gfx_measure_text(lua_State* L) { int smlua_func_djui_hud_measure_text(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 1)) { return 0; } if(!smlua_functions_valid_param_count(L, 1)) { return 0; }
const char* message = smlua_to_string(L, 1); const char* message = smlua_to_string(L, 1);
if (!gSmLuaConvertSuccess) { return 0; } if (!gSmLuaConvertSuccess) { return 0; }
lua_pushnumber(L, djui_gfx_measure_text(message)); lua_pushnumber(L, djui_hud_measure_text(message));
return 1; return 1;
} }
int smlua_func_djui_gfx_print_text(lua_State* L) { int smlua_func_djui_hud_print_text(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 4)) { return 0; } if(!smlua_functions_valid_param_count(L, 4)) { return 0; }
const char* message = smlua_to_string(L, 1); const char* message = smlua_to_string(L, 1);
@ -247,12 +247,37 @@ int smlua_func_djui_gfx_print_text(lua_State* L) {
float scale = smlua_to_number(L, 4); float scale = smlua_to_number(L, 4);
if (!gSmLuaConvertSuccess) { return 0; } if (!gSmLuaConvertSuccess) { return 0; }
djui_gfx_print_text(message, x, y, scale); djui_hud_print_text(message, x, y, scale);
return 1; return 1;
} }
int smlua_func_djui_gfx_set_color(lua_State* L) { int smlua_func_djui_hud_render_texture(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 8)) { return 0; }
const u8* texture = (const u8*)smlua_to_cpointer(L, 1, LVT_U8_P);
if (!gSmLuaConvertSuccess) { return 0; }
u32 bitSize = smlua_to_integer(L, 2);
if (!gSmLuaConvertSuccess) { return 0; }
f32 x = smlua_to_number(L, 3);
if (!gSmLuaConvertSuccess) { return 0; }
f32 y = smlua_to_number(L, 4);
if (!gSmLuaConvertSuccess) { return 0; }
u32 width = smlua_to_integer(L, 5);
if (!gSmLuaConvertSuccess) { return 0; }
u32 height = smlua_to_integer(L, 6);
if (!gSmLuaConvertSuccess) { return 0; }
f32 scaleW = smlua_to_number(L, 7);
if (!gSmLuaConvertSuccess) { return 0; }
f32 scaleH = smlua_to_number(L, 8);
if (!gSmLuaConvertSuccess) { return 0; }
djui_hud_render_texture(texture, bitSize, x, y, width, height, scaleW, scaleH);
return 1;
}
int smlua_func_djui_hud_set_color(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 4)) { return 0; } if(!smlua_functions_valid_param_count(L, 4)) { return 0; }
u8 r = smlua_to_integer(L, 1); u8 r = smlua_to_integer(L, 1);
@ -264,29 +289,29 @@ int smlua_func_djui_gfx_set_color(lua_State* L) {
u8 a = smlua_to_integer(L, 4); u8 a = smlua_to_integer(L, 4);
if (!gSmLuaConvertSuccess) { return 0; } if (!gSmLuaConvertSuccess) { return 0; }
djui_gfx_set_color(r, g, b, a); djui_hud_set_color(r, g, b, a);
return 1; return 1;
} }
int smlua_func_djui_gfx_set_font(lua_State* L) { int smlua_func_djui_hud_set_font(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 1)) { return 0; } if(!smlua_functions_valid_param_count(L, 1)) { return 0; }
int fontType = smlua_to_integer(L, 1); int fontType = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { return 0; } if (!gSmLuaConvertSuccess) { return 0; }
djui_gfx_set_font(fontType); djui_hud_set_font(fontType);
return 1; return 1;
} }
int smlua_func_djui_gfx_set_resolution(lua_State* L) { int smlua_func_djui_hud_set_resolution(lua_State* L) {
if(!smlua_functions_valid_param_count(L, 1)) { return 0; } if(!smlua_functions_valid_param_count(L, 1)) { return 0; }
int resolutionType = smlua_to_integer(L, 1); int resolutionType = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { return 0; } if (!gSmLuaConvertSuccess) { return 0; }
djui_gfx_set_resolution(resolutionType); djui_hud_set_resolution(resolutionType);
return 1; return 1;
} }
@ -3460,14 +3485,15 @@ void smlua_bind_functions_autogen(void) {
// djui_chat_message.h // djui_chat_message.h
smlua_bind_function(L, "djui_chat_message_create", smlua_func_djui_chat_message_create); smlua_bind_function(L, "djui_chat_message_create", smlua_func_djui_chat_message_create);
// djui_gfx_utils.h // djui_hud_utils.h
smlua_bind_function(L, "djui_gfx_get_screen_height", smlua_func_djui_gfx_get_screen_height); smlua_bind_function(L, "djui_hud_get_screen_height", smlua_func_djui_hud_get_screen_height);
smlua_bind_function(L, "djui_gfx_get_screen_width", smlua_func_djui_gfx_get_screen_width); smlua_bind_function(L, "djui_hud_get_screen_width", smlua_func_djui_hud_get_screen_width);
smlua_bind_function(L, "djui_gfx_measure_text", smlua_func_djui_gfx_measure_text); smlua_bind_function(L, "djui_hud_measure_text", smlua_func_djui_hud_measure_text);
smlua_bind_function(L, "djui_gfx_print_text", smlua_func_djui_gfx_print_text); smlua_bind_function(L, "djui_hud_print_text", smlua_func_djui_hud_print_text);
smlua_bind_function(L, "djui_gfx_set_color", smlua_func_djui_gfx_set_color); smlua_bind_function(L, "djui_hud_render_texture", smlua_func_djui_hud_render_texture);
smlua_bind_function(L, "djui_gfx_set_font", smlua_func_djui_gfx_set_font); smlua_bind_function(L, "djui_hud_set_color", smlua_func_djui_hud_set_color);
smlua_bind_function(L, "djui_gfx_set_resolution", smlua_func_djui_gfx_set_resolution); 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);
// djui_popup.h // djui_popup.h
smlua_bind_function(L, "djui_popup_create", smlua_func_djui_popup_create); smlua_bind_function(L, "djui_popup_create", smlua_func_djui_popup_create);

View file

@ -131,6 +131,50 @@ void* smlua_to_cobject(lua_State* L, int index, u16 lot) {
return pointer; return pointer;
} }
void* smlua_to_cpointer(lua_State* L, int index, u16 lvt) {
if (lua_type(L, index) != LUA_TTABLE) {
LOG_LUA("smlua_to_cpointer received improper type '%d'", lua_type(L, index));
smlua_logline();
gSmLuaConvertSuccess = false;
return 0;
}
// get LVT
lua_getfield(L, index, "_lvt");
enum LuaObjectType objLvt = smlua_to_integer(L, -1);
lua_pop(L, 1);
if (!gSmLuaConvertSuccess) { return NULL; }
if (lvt != objLvt) {
LOG_LUA("smlua_to_cpointer received improper LVT. Expected '%d', received '%d'", lvt, objLvt);
smlua_logline();
gSmLuaConvertSuccess = false;
return NULL;
}
// get pointer
lua_getfield(L, index, "_pointer");
void* pointer = (void*)(intptr_t)smlua_to_integer(L, -1);
lua_pop(L, 1);
if (!gSmLuaConvertSuccess) { return NULL; }
// TODO: check allowlist
/*if (!smlua_cobject_allowlist_contains(lot, (u64)(intptr_t)pointer)) {
LOG_LUA("smlua_to_cobject received a pointer not in allow list. '%u', '%llu", lot, (u64)(intptr_t)pointer);
gSmLuaConvertSuccess = false;
return NULL;
}*/
if (pointer == NULL) {
LOG_LUA("smlua_to_cpointer received null pointer.");
smlua_logline();
gSmLuaConvertSuccess = false;
return NULL;
}
gSmLuaConvertSuccess = true;
return pointer;
}
struct LSTNetworkType smlua_to_lnt(lua_State* L, int index) { struct LSTNetworkType smlua_to_lnt(lua_State* L, int index) {
struct LSTNetworkType lnt = { 0 }; struct LSTNetworkType lnt = { 0 };
int valueType = lua_type(L, index); int valueType = lua_type(L, index);

View file

@ -14,6 +14,7 @@ lua_Integer smlua_to_integer(lua_State* L, int index);
lua_Number smlua_to_number(lua_State* L, int index); lua_Number smlua_to_number(lua_State* L, int index);
const char* smlua_to_string(lua_State* L, int index); const char* smlua_to_string(lua_State* L, int index);
void* smlua_to_cobject(lua_State* L, int index, u16 lot); void* smlua_to_cobject(lua_State* L, int index, u16 lot);
void* smlua_to_cpointer(lua_State* L, int index, u16 lvt);
struct LSTNetworkType smlua_to_lnt(lua_State* L, int index); struct LSTNetworkType smlua_to_lnt(lua_State* L, int index);
void smlua_push_object(lua_State* L, u16 lot, void* p); void smlua_push_object(lua_State* L, u16 lot, void* p);