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",
"include/PR/os_cont.h",
"src/game/interaction.c",
"src/pc/djui/djui_gfx_utils.h",
"src/pc/djui/djui_hud_utils.h",
]
exclude_constants = [

View file

@ -32,7 +32,7 @@ in_files = [
"src/game/level_info.h",
"src/game/save_file.h",
"src/game/sound_init.h",
"src/pc/djui/djui_gfx_utils.h",
"src/pc/djui/djui_hud_utils.h",
]
override_allowed_functions = {
@ -164,6 +164,9 @@ def build_param(param, i):
return ' %s %s = smlua_to_number(L, %d);\n' % (ptype, pid, i)
elif ptype == 'const char*':
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:
lot = translate_type_to_lot(ptype)
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
$FILE --server 27015 --configfile sm64config_server.txt &
sleep 2
$FILE --client 127.0.0.1 27015 --configfile sm64config_client.txt &
#sleep 2
#$FILE --client 127.0.0.1 27015 --configfile sm64config_client.txt &
exit
# debug on server

View file

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

View file

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

View file

@ -4,7 +4,6 @@
#include "game/level_update.h"
#include "pc/lua/smlua_hooks.h"
#include "djui_panel_playerlist.h"
#include "djui_gfx_utils.h"
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/pc_main.h"
#include "djui_gfx.h"
#include "gfx_dimensions.h"
#include "config.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;
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; }
sResolution = resolutionType;
}
void djui_gfx_set_font(enum DjuiFontType fontType) {
void djui_hud_set_font(enum DjuiFontType fontType) {
if (fontType >= FONT_COUNT) { return; }
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);
}
u32 djui_gfx_get_screen_width(void) {
u32 djui_hud_get_screen_width(void) {
u32 windowWidth, windowHeight;
wm_api->get_dimensions(&windowWidth, &windowHeight);
@ -37,7 +53,7 @@ u32 djui_gfx_get_screen_width(void) {
: (windowWidth / djui_gfx_get_scale());
}
u32 djui_gfx_get_screen_height(void) {
u32 djui_hud_get_screen_height(void) {
u32 windowWidth, windowHeight;
wm_api->get_dimensions(&windowWidth, &windowHeight);
@ -46,7 +62,7 @@ u32 djui_gfx_get_screen_height(void) {
: (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; }
const struct DjuiFont* font = gDjuiFonts[sFont];
f32 width = 0;
@ -58,7 +74,7 @@ f32 djui_gfx_measure_text(const char* message) {
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; }
const struct DjuiFont* font = gDjuiFonts[sFont];
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
f32 translatedX = x;
f32 translatedY = y;
if (sResolution == RESOLUTION_DJUI) {
djui_gfx_position_translate(&translatedX, &translatedY);
} else if (sResolution == RESOLUTION_N64) {
translatedX = GFX_DIMENSIONS_FROM_LEFT_EDGE(0) + x;
translatedY = SCREEN_HEIGHT - y;
}
djui_hud_position_translate(&translatedX, &translatedY);
create_dl_translation_matrix(DJUI_MTX_PUSH, translatedX, translatedY, 0);
// compute font size
f32 translatedFontSize = fontScale;
if (sResolution == RESOLUTION_DJUI) {
djui_gfx_size_translate(&translatedFontSize);
}
djui_hud_size_translate(&translatedFontSize);
create_dl_scale_matrix(DJUI_MTX_NOPUSH, translatedFontSize, translatedFontSize, 1.0f);
// 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);
}
void djui_gfx_utils_render(void) {
//struct DjuiColor fore = { .r = 255, .g = 255, .b = 255, .a = 255 };
//struct DjuiColor back = { .r = 0, .g = 0, .b = 0, .a = 255 };
//const struct DjuiFont* font = gDjuiFonts[2];
//djui_gfx_print_text(font, "abcdefghijklmnopqrstuvwxyz:1234567890", 2, 2, 2, back);
//djui_gfx_print_text(font, "1234567890:abcdefghijklmnopqrstuvwxyz", 0, 0, 2, fore);
//float scale = 240.0f / gfx_current_dimensions.height;
void djui_hud_render_texture(const u8* texture, u32 bitSize, f32 x, f32 y, u32 width, u32 height, f32 scaleW, f32 scaleH) {
// translate position
f32 translatedX = x;
f32 translatedY = y;
djui_hud_position_translate(&translatedX, &translatedY);
create_dl_translation_matrix(DJUI_MTX_PUSH, translatedX, translatedY, 0);
/*{
f32 screenWidth = djui_gfx_get_screen_width(RESOLUTION_N64);
f32 width = djui_gfx_measure_text(font, "PAUSE", RESOLUTION_N64);
// 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, width * translatedW, height * translatedH, 1.0f);
f32 screenHeight = djui_gfx_get_screen_height(RESOLUTION_N64);
f32 height = 16;
// render
djui_gfx_render_texture(texture, width, height, bitSize);
djui_gfx_print_text(font, "PAUSE", screenWidth - width, screenHeight - height - 32, 1.0f, fore, RESOLUTION_N64);
djui_gfx_print_text(font, "PAUSE", screenWidth - width * 2, screenHeight - height, 1.0f, fore, RESOLUTION_N64);
}*/
/*{
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);
}*/
}
// pop
gSPPopMatrix(gDisplayListHead++, G_MTX_MODELVIEW);
}

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_S32_P:
case LVT_F32_P:
smlua_push_pointer(L, data->valueType, p);
smlua_push_pointer(L, data->valueType, *(u8**)p);
break;
default:

View file

@ -16,7 +16,7 @@
#include "src/game/level_info.h"
#include "src/game/save_file.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; }
lua_pushinteger(L, djui_gfx_get_screen_height());
lua_pushinteger(L, djui_hud_get_screen_height());
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; }
lua_pushinteger(L, djui_gfx_get_screen_width());
lua_pushinteger(L, djui_hud_get_screen_width());
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; }
const char* message = smlua_to_string(L, 1);
if (!gSmLuaConvertSuccess) { return 0; }
lua_pushnumber(L, djui_gfx_measure_text(message));
lua_pushnumber(L, djui_hud_measure_text(message));
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; }
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);
if (!gSmLuaConvertSuccess) { return 0; }
djui_gfx_print_text(message, x, y, scale);
djui_hud_print_text(message, x, y, scale);
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; }
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);
if (!gSmLuaConvertSuccess) { return 0; }
djui_gfx_set_color(r, g, b, a);
djui_hud_set_color(r, g, b, a);
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; }
int fontType = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { return 0; }
djui_gfx_set_font(fontType);
djui_hud_set_font(fontType);
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; }
int resolutionType = smlua_to_integer(L, 1);
if (!gSmLuaConvertSuccess) { return 0; }
djui_gfx_set_resolution(resolutionType);
djui_hud_set_resolution(resolutionType);
return 1;
}
@ -3460,14 +3485,15 @@ void smlua_bind_functions_autogen(void) {
// djui_chat_message.h
smlua_bind_function(L, "djui_chat_message_create", smlua_func_djui_chat_message_create);
// djui_gfx_utils.h
smlua_bind_function(L, "djui_gfx_get_screen_height", smlua_func_djui_gfx_get_screen_height);
smlua_bind_function(L, "djui_gfx_get_screen_width", smlua_func_djui_gfx_get_screen_width);
smlua_bind_function(L, "djui_gfx_measure_text", smlua_func_djui_gfx_measure_text);
smlua_bind_function(L, "djui_gfx_print_text", smlua_func_djui_gfx_print_text);
smlua_bind_function(L, "djui_gfx_set_color", smlua_func_djui_gfx_set_color);
smlua_bind_function(L, "djui_gfx_set_font", smlua_func_djui_gfx_set_font);
smlua_bind_function(L, "djui_gfx_set_resolution", smlua_func_djui_gfx_set_resolution);
// djui_hud_utils.h
smlua_bind_function(L, "djui_hud_get_screen_height", smlua_func_djui_hud_get_screen_height);
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_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);
smlua_bind_function(L, "djui_hud_set_resolution", smlua_func_djui_hud_set_resolution);
// djui_popup.h
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;
}
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 lnt = { 0 };
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);
const char* smlua_to_string(lua_State* L, int index);
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);
void smlua_push_object(lua_State* L, u16 lot, void* p);