diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/texture.c | 39 | ||||
-rw-r--r-- | src/texture.h | 2 |
2 files changed, 29 insertions, 12 deletions
diff --git a/src/texture.c b/src/texture.c index cdd36c4..919cbda 100644 --- a/src/texture.c +++ b/src/texture.c @@ -1,8 +1,12 @@ #include "texture.h" +int honey_texture_mt_ref = LUA_NOREF; + static int honey_lua_texture_new(lua_State* L) { honey_texture* texture = lua_newuserdata(L, sizeof(honey_texture)); + lua_rawgeti(L, LUA_REGISTRYINDEX, honey_texture_mt_ref); + lua_setmetatable(L, -2); return 1; } @@ -26,17 +30,20 @@ static int honey_lua_texture_create(lua_State* L) else if (strcmp(type, "depth") == 0) honey_texture_new_depth(texture, width, height, NULL); else { - char* error; - honey_format_string(&error, - "unknown texture type '%s'", - type); - lua_pushstring(L, error); - free(error); - lua_error(L); + honey_lua_throw_error + (L, "unknown texture type '%s'", type); } return 0; } +static int honey_lua_texture_destroy(lua_State* L) +{ + honey_texture* texture; + honey_lua_parse_arguments(L, 1, 1, HONEY_USERDATA, &texture); + glDeleteTextures(1, &(texture->id)); + return 0; +} + static int honey_lua_texture_load(lua_State* L) { honey_texture* texture; @@ -100,12 +107,20 @@ static int honey_lua_framebuffer_new(lua_State* L) void honey_setup_texture(lua_State* L) { honey_lua_create_table - (L, 5, + (L, 2, + HONEY_TABLE, "__index", 3, + HONEY_FUNCTION, "create", honey_lua_texture_create, + HONEY_FUNCTION, "load", honey_lua_texture_load, + HONEY_FUNCTION, "use", honey_lua_texture_use, + + HONEY_FUNCTION, "__gc", honey_lua_texture_destroy); + honey_texture_mt_ref = luaL_ref(L, LUA_REGISTRYINDEX); + + honey_lua_create_table + (L, 2, HONEY_FUNCTION, "new", honey_lua_texture_new, - HONEY_FUNCTION, "new_framebuffer", honey_lua_framebuffer_new, - HONEY_FUNCTION, "create", honey_lua_texture_create, - HONEY_FUNCTION, "load", honey_lua_texture_load, - HONEY_FUNCTION, "use", honey_lua_texture_use); + HONEY_FUNCTION, "new_framebuffer", honey_lua_framebuffer_new); + lua_setfield(L, -2, "texture"); } diff --git a/src/texture.h b/src/texture.h index aed6057..93417f0 100644 --- a/src/texture.h +++ b/src/texture.h @@ -8,6 +8,8 @@ #include "common.h" +extern int honey_texture_mt_ref; + enum honey_texture_result { TEXTURE_OK, TEXTURE_FAILED, |