summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-08-22 11:38:26 -0500
committersanine <sanine.not@pm.me>2022-08-22 11:38:26 -0500
commit249833947ff691dd79453c4d817387a6922236d6 (patch)
tree9fb1666f6ad443e13c5c6376ea949fbce6e58cfd /src
parenta2c162f12337142c054c2e1f01ad508ee56963d2 (diff)
add element buffers
Diffstat (limited to 'src')
-rw-r--r--src/gl/data.c72
-rw-r--r--src/gl/drawing.c11
-rw-r--r--src/gl/gl.c3
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),
);