diff --git a/examples/graphics.lua b/examples/graphics.lua index 981c84829af36b30f6127cb6146c9fdcf6610fef..c6b30a5e66d069c11bbe46b70ef58b9a6a593549 100644 --- a/examples/graphics.lua +++ b/examples/graphics.lua @@ -8,6 +8,15 @@ draw_rect(100, 100, 300, 200, color.YELLOW) draw_text("YOOOOO", 10, 10, 20, color.VIOLET) + draw_text(string.format("fps: %d", get_fps()), 10, 30, 20, color.VIOLET) + draw_text(string.format("dt: %.3f", get_dt()), 10, 50, 20, color.VIOLET) + + draw_line(400, 10, 500, 100, color.RED) + draw_circle(500, 500, 100, color.BLUE) + draw_ellipse(200, 500, 100, 50, color.BLUE) + + draw_triangle(20, 20, 100, 20, 50, 100, color.BLUE) + draw_info() end_drawing() end diff --git a/main.c b/main.c index 4083b8be0cf6b81fea727f9f74fc9006d2f93113..a57280f98725c49941d5e0eda976c1c911cb286e 100644 --- a/main.c +++ b/main.c @@ -81,6 +81,16 @@ TraceLog(LOG_DEBUG, "l_set_fps"); return 0; } +static int l_get_dt(lua_State *L) { + lua_pushnumber(L, GetFrameTime()); + return 1; +} + +static int l_get_fps(lua_State *L) { + lua_pushnumber(L, GetFPS()); + return 1; +} + static int l_close_window(lua_State *L) { CloseWindow(); TraceLog(LOG_DEBUG, "l_close_window"); @@ -154,11 +164,90 @@ DrawTextEx(ctx.font, text, (Vector2){ x, y }, size, 0, color); return 0; } -static int l_draw_pixel(lua_State *L) {} -static int l_draw_line(lua_State *L) {} -static int l_draw_circle(lua_State *L) {} -static int l_draw_ellipse(lua_State *L) {} -static int l_draw_triangle(lua_State *L) {} +static int l_draw_pixel(lua_State *L) { + int x = luaL_checknumber(L, 1); + int y = luaL_checknumber(L, 2); + luaL_checktype(L, 3, LUA_TTABLE); + Color color = { + .r = (unsigned char)lua_getfield_int(L, 3, "r"), + .g = (unsigned char)lua_getfield_int(L, 3, "g"), + .b = (unsigned char)lua_getfield_int(L, 3, "b"), + .a = (unsigned char)lua_getfield_int_opt(L, 3, "a", 255) + }; + DrawPixel(x, y, color); +} + +static int l_draw_line(lua_State *L) { + int x1 = luaL_checknumber(L, 1); + int y1 = luaL_checknumber(L, 2); + int x2 = luaL_checknumber(L, 3); + int y2 = luaL_checknumber(L, 4); + luaL_checktype(L, 5, LUA_TTABLE); + Color color = { + .r = (unsigned char)lua_getfield_int(L, 5, "r"), + .g = (unsigned char)lua_getfield_int(L, 5, "g"), + .b = (unsigned char)lua_getfield_int(L, 5, "b"), + .a = (unsigned char)lua_getfield_int_opt(L, 5, "a", 255) + }; + DrawLine(x1, y1, x2, y2, color); + return 0; +} + +static int l_draw_circle(lua_State *L) { + int center_x = luaL_checknumber(L, 1); + int center_y = luaL_checknumber(L, 2); + int radius = luaL_checknumber(L, 3); + luaL_checktype(L, 4, LUA_TTABLE); + Color color = { + .r = (unsigned char)lua_getfield_int(L, 4, "r"), + .g = (unsigned char)lua_getfield_int(L, 4, "g"), + .b = (unsigned char)lua_getfield_int(L, 4, "b"), + .a = (unsigned char)lua_getfield_int_opt(L, 4, "a", 255) + }; + DrawCircle(center_x, center_y, radius, color); + return 0; +} + +static int l_draw_ellipse(lua_State *L) { + int center_x = luaL_checknumber(L, 1); + int center_y = luaL_checknumber(L, 2); + int radius_h = luaL_checknumber(L, 3); + int radius_v = luaL_checknumber(L, 4); + luaL_checktype(L, 5, LUA_TTABLE); + Color color = { + .r = (unsigned char)lua_getfield_int(L, 5, "r"), + .g = (unsigned char)lua_getfield_int(L, 5, "g"), + .b = (unsigned char)lua_getfield_int(L, 5, "b"), + .a = (unsigned char)lua_getfield_int_opt(L, 5, "a", 255) + }; + DrawEllipse(center_x, center_y, radius_h, radius_v, color); + return 0; +} + +static int l_draw_triangle(lua_State *L) { + int x1 = luaL_checknumber(L, 1); + int y1 = luaL_checknumber(L, 2); + int x2 = luaL_checknumber(L, 3); + int y2 = luaL_checknumber(L, 4); + int x3 = luaL_checknumber(L, 5); + int y3 = luaL_checknumber(L, 6); + luaL_checktype(L, 7, LUA_TTABLE); + Color color = { + .r = (unsigned char)lua_getfield_int(L, 7, "r"), + .g = (unsigned char)lua_getfield_int(L, 7, "g"), + .b = (unsigned char)lua_getfield_int(L, 7, "b"), + .a = (unsigned char)lua_getfield_int_opt(L, 7, "a", 255) + }; + + // NOTE: Raylib orders vertices in counter-clockwise order. We order them + // in clockwise order instead to make this a bit easier to use. + Vector2 p1 = { x1, y1 }; + Vector2 p2 = { x3, y3 }; + Vector2 p3 = { x2, y2 }; + + DrawTriangle(p1, p2, p3, color); + return 0; +} static void help(const char *argv0) { printf("Usage: %s [options]\n" @@ -226,10 +315,17 @@ lua_register(L, "window_running", l_window_running); lua_register(L, "begin_drawing", l_begin_drawing); lua_register(L, "end_drawing", l_end_drawing); lua_register(L, "set_fps", l_set_fps); + lua_register(L, "get_fps", l_get_fps); + lua_register(L, "get_dt", l_get_dt); + lua_register(L, "clear_window", l_clear_window); lua_register(L, "draw_info", l_draw_info); - lua_register(L, "clear_window", l_clear_window); lua_register(L, "draw_rect", l_draw_rect); lua_register(L, "draw_text", l_draw_text); + lua_register(L, "draw_pixel", l_draw_pixel); + lua_register(L, "draw_line", l_draw_line); + lua_register(L, "draw_circle", l_draw_circle); + lua_register(L, "draw_ellipse", l_draw_ellipse); + lua_register(L, "draw_triangle", l_draw_triangle); // Loading embeded modules into Lua state. if (!load_embedded_module(L, json, json_len, "json")) return 1;