diff options
author | sanine <sanine.not@pm.me> | 2022-08-22 11:38:26 -0500 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2022-08-22 11:38:26 -0500 |
commit | 249833947ff691dd79453c4d817387a6922236d6 (patch) | |
tree | 9fb1666f6ad443e13c5c6376ea949fbce6e58cfd /src/gl | |
parent | a2c162f12337142c054c2e1f01ad508ee56963d2 (diff) |
add element buffers
Diffstat (limited to 'src/gl')
-rw-r--r-- | src/gl/data.c | 72 | ||||
-rw-r--r-- | src/gl/drawing.c | 11 | ||||
-rw-r--r-- | src/gl/gl.c | 3 |
3 files changed, 50 insertions, 36 deletions
diff --git a/src/gl/data.c b/src/gl/data.c index f598784..777689a 100644 --- a/src/gl/data.c +++ b/src/gl/data.c @@ -65,48 +65,50 @@ int gl_bind_buffer(lua_State *L) } +#define GET_BUFFER_TYPE(type, name, conversion) \ + void * get_buffer_ ## name (lua_State *L, size_t *sz, int tbl) { \ + size_t len = lua_objlen(L, tbl); \ + *sz = len * sizeof(type); \ + type *buf = malloc(*sz); \ + if (buf == NULL) \ + hs_throw_error(L, "failed to allocate intermediary buffer"); \ + for (int i=0; i<len; i++) { \ + lua_rawgeti(L, tbl, i+1); \ + if (!lua_isnumber(L, -1)) \ + hs_throw_error(L, "all elements must be numbers (failed at index %d)", i); \ + buf[i] = conversion(L, -1); \ + lua_pop(L, 1); \ + } \ + return buf; \ + } + +GET_BUFFER_TYPE(unsigned int, uint, lua_tointeger) +GET_BUFFER_TYPE(int, int, lua_tointeger) +GET_BUFFER_TYPE(float, float, lua_tonumber) + int gl_buffer_data(lua_State *L) { lua_Integer target, type, usage; int table; hs_parse_args(L, hs_int(target), hs_int(type), hs_tbl(table), hs_int(usage)); - if (type != GL_INT && type != GL_FLOAT) { - hs_throw_error(L, "invalid type"); - } - /* build raw buffer */ - size_t len = lua_objlen(L, table); - void *buf; - if (type == GL_FLOAT) { - float *fbuf = malloc(len * sizeof(float)); - if (fbuf == NULL) - hs_throw_error(L, "failed to allocate intermediary fbuffer"); - for (int i=0; i<len; i++) { - lua_rawgeti(L, table, i+1); - if (!lua_isnumber(L, -1)) { - hs_throw_error(L, "all table items must be numbers (failed at index %d)", i); - } - fbuf[i] = lua_tonumber(L, -1); - lua_pop(L, 1); - } - len = len * sizeof(float); - buf = fbuf; - } - else { - int *ibuf = malloc(len * sizeof(int)); - if (ibuf == NULL) - hs_throw_error(L, "failed to allocate intermediary ibuffer"); - for (int i=0; i<len; i++) { - lua_rawgeti(L, table, i+1); - if (!lua_isnumber(L, -1)) { - hs_throw_error(L, "all table items must be integers (failed at index %d)", i); - } - ibuf[i] = lua_tointeger(L, -1); - lua_pop(L, 1); - } - len = len * sizeof(int); - buf = ibuf; + void *buf; size_t len; + switch(type) { + case GL_UNSIGNED_INT: + buf = get_buffer_uint(L, &len, table); + break; + + case GL_INT: + buf = get_buffer_int(L, &len, table); + break; + + case GL_FLOAT: + buf = get_buffer_float(L, &len, table); + break; + + default: + hs_throw_error(L, "invalid type"); } /* call */ diff --git a/src/gl/drawing.c b/src/gl/drawing.c index a64f56d..ca914e0 100644 --- a/src/gl/drawing.c +++ b/src/gl/drawing.c @@ -5,6 +5,7 @@ int gl_set_viewport(lua_State *L); int gl_draw_arrays(lua_State *L); +int gl_draw_elements(lua_State *L); int gl_set_clear_color(lua_State *L); int gl_clear(lua_State *L); @@ -24,6 +25,7 @@ void setup_drawing(lua_State *L, int gl_index) hs_create_table(L, hs_str_cfunc("drawArrays", gl_draw_arrays), + hs_str_cfunc("drawElements", gl_draw_elements), hs_str_cfunc("setClearColor", gl_set_clear_color), hs_str_cfunc("clear", gl_clear), hs_str_cfunc("setViewport", gl_set_viewport), @@ -62,6 +64,15 @@ int gl_draw_arrays(lua_State *L) } +int gl_draw_elements(lua_State *L) +{ + lua_Integer mode, count, type, offset; + hs_parse_args(L, hs_int(mode), hs_int(count), hs_int(type), hs_int(offset)); + glDrawElements(mode, count, type, (const void*)offset); + return 0; +} + + int gl_set_viewport(lua_State *L) { lua_Integer x, y, w, h; diff --git a/src/gl/gl.c b/src/gl/gl.c index 8a1cb17..8f56d33 100644 --- a/src/gl/gl.c +++ b/src/gl/gl.c @@ -21,7 +21,8 @@ int gl_get_error(lua_State *L); void setup_gl(lua_State *L, int honey_index) { int data_types = hs_create_table(L, - hs_str_int("integer", GL_INT), + hs_str_int("uint", GL_UNSIGNED_INT), + hs_str_int("int", GL_INT), hs_str_int("float", GL_FLOAT), ); |