summaryrefslogtreecommitdiff
path: root/src/gl/data.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gl/data.c')
-rw-r--r--src/gl/data.c72
1 files changed, 37 insertions, 35 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 */