add fps util for pxl8 in lua

This commit is contained in:
asrael 2025-11-11 23:26:51 -06:00
parent 7dd32ec453
commit 5637fa18c8
9 changed files with 57 additions and 76 deletions

View file

@ -1,5 +1,6 @@
local ffi = require("ffi")
local C = ffi.C
local game = _pxl8_game
local gfx = _pxl8_gfx
local input = _pxl8_input
local ui = _pxl8_ui
@ -46,6 +47,10 @@ function pxl8.sprite(id, x, y, w, h, flip_x, flip_y)
C.pxl8_sprite(gfx, id or 0, x or 0, y or 0, w or 16, h or 16, flip_x or false, flip_y or false)
end
function pxl8.get_fps()
return C.pxl8_game_get_fps(game)
end
function pxl8.get_width()
return C.pxl8_gfx_get_width(gfx)
end

View file

@ -119,6 +119,7 @@ pxl8_game_result pxl8_init(pxl8_game* game, i32 argc, char* argv[]) {
pxl8_script_set_gfx(game->script, game->gfx);
pxl8_script_set_input(game->script, &game->input);
pxl8_script_set_ui(game->script, game->ui);
pxl8_script_set_game(game->script, game);
if (game->script_path[0] != '\0') {
pxl8_result result = pxl8_script_load_main(game->script, game->script_path);
@ -307,3 +308,7 @@ void pxl8_quit(pxl8_game* game) {
pxl8_script_destroy(game->script);
if (game->ui) pxl8_ui_destroy(game->ui);
}
f32 pxl8_game_get_fps(const pxl8_game* game) {
return game ? game->fps : 0.0f;
}

View file

@ -52,3 +52,4 @@ pxl8_game_result pxl8_init(pxl8_game* game, i32 argc, char* argv[]);
pxl8_game_result pxl8_update(pxl8_game* game);
pxl8_game_result pxl8_frame(pxl8_game* game);
void pxl8_quit(pxl8_game* game);
f32 pxl8_game_get_fps(const pxl8_game* game);

View file

@ -79,9 +79,12 @@ static const char* pxl8_ffi_cdefs =
"typedef float f32;\n"
"typedef double f64;\n"
"typedef struct pxl8_gfx pxl8_gfx;\n"
"typedef struct pxl8_game pxl8_game;\n"
"typedef struct { int x, y, w, h; } pxl8_bounds;\n"
"typedef struct { int x, y; } pxl8_point;\n"
"\n"
"f32 pxl8_game_get_fps(const pxl8_game* game);\n"
"\n"
"i32 pxl8_gfx_get_height(pxl8_gfx* ctx);\n"
"i32 pxl8_gfx_get_width(pxl8_gfx* ctx);\n"
"void pxl8_circle(pxl8_gfx* ctx, i32 x, i32 y, i32 r, u32 color);\n"
@ -408,6 +411,14 @@ void pxl8_script_set_ui(pxl8_script* script, pxl8_ui* ui) {
}
}
void pxl8_script_set_game(pxl8_script* script, void* game) {
if (!script) return;
if (script->L && game) {
lua_pushlightuserdata(script->L, game);
lua_setglobal(script->L, "_pxl8_game");
}
}
static pxl8_result pxl8_script_prepare_path(pxl8_script* script, const char* filename, char* out_basename, size_t basename_size) {
char filename_copy[PATH_MAX];
strncpy(filename_copy, filename, sizeof(filename_copy) - 1);

View file

@ -20,6 +20,7 @@ void pxl8_script_set_cart_path(pxl8_script* script, const char* cart_path, const
void pxl8_script_set_gfx(pxl8_script* script, pxl8_gfx* gfx);
void pxl8_script_set_input(pxl8_script* script, pxl8_input_state* input);
void pxl8_script_set_ui(pxl8_script* script, pxl8_ui* ui);
void pxl8_script_set_game(pxl8_script* script, void* game);
pxl8_result pxl8_script_call_function(pxl8_script* script, const char* name);
pxl8_result pxl8_script_call_function_f32(pxl8_script* script, const char* name, f32 arg);

View file

@ -61,9 +61,6 @@ static void* sdl3_create(pxl8_color_mode mode, pxl8_resolution resolution,
pxl8_error("Failed to set vsync: %s", SDL_GetError());
}
SDL_SetRenderLogicalPresentation(ctx->renderer, fb_w, fb_h,
SDL_LOGICAL_PRESENTATION_INTEGER_SCALE);
ctx->framebuffer_texture = SDL_CreateTexture(ctx->renderer,
SDL_PIXELFORMAT_RGBA32,
SDL_TEXTUREACCESS_STREAMING,