summaryrefslogtreecommitdiff
path: root/src/glm_bindings.c
diff options
context:
space:
mode:
authorsanine-a <sanine.not@pm.me>2020-11-29 01:18:34 -0600
committersanine-a <sanine.not@pm.me>2020-11-29 01:18:34 -0600
commitbb01e4d5967205fd95be5c0d5bfa105a22764e17 (patch)
tree84d5e00e44f3f07842641ab0b213da3b415ecc33 /src/glm_bindings.c
parentb97f172e948872cfe1bf030f95ff50e5d0b2a1bc (diff)
begin refactor of glm functions and basic argument parsing
Diffstat (limited to 'src/glm_bindings.c')
-rw-r--r--src/glm_bindings.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/glm_bindings.c b/src/glm_bindings.c
new file mode 100644
index 0000000..cfd85e5
--- /dev/null
+++ b/src/glm_bindings.c
@@ -0,0 +1,94 @@
+#include "glm_bindings.h"
+
+int honey_glm_vec3_mt_ref = LUA_NOREF;
+int honey_glm_vec4_mt_ref = LUA_NOREF;
+int honey_glm_mat3_mt_ref = LUA_NOREF;
+int honey_glm_mat4_mt_ref = LUA_NOREF;
+
+void honey_setup_glm(lua_State* L)
+{
+ honey_lua_create_table(L, NULL, 0);
+}
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * GLM Array Setup Functions
+ *
+ *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+static void setup_new_array(lua_State* L,
+ honey_glm_array* array,
+ honey_glm_array_type type)
+{
+ unsigned int size;
+ switch(type) {
+ case VEC3:
+ size = 3;
+ break;
+
+ case VEC4:
+ size = 4;
+ break;
+
+ case MAT3:
+ size = 9;
+ break;
+
+ case MAT4:
+ size = 16;
+ break;
+
+ default:
+ honey_lua_throw_error(L,
+ "unknown array type: %d",
+ type);
+ break;
+ }
+
+ array->type = type;
+ array->size = size;
+ array->data = calloc(size, sizeof(float));
+ if (array->data == NULL)
+ honey_lua_throw_error(L,
+ "failed to allocate memory for array of type %d",
+ type);
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+static int honey_glm_new_vec3(lua_State* L)
+{
+ honey_glm_array* vec3 = lua_newuserdata(L, sizeof(honey_glm_array));
+ setup_new_array(L, vec3, VEC3);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, honey_glm_vec3_mt_ref);
+ lua_setmetatable(L, -2);
+ return 1;
+}
+
+static int honey_glm_new_vec4(lua_State* L)
+{
+ honey_glm_array* vec4 = lua_newuserdata(L, sizeof(honey_glm_array));
+ setup_new_array(L, vec4, VEC4);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, honey_glm_vec4_mt_ref);
+ lua_setmetatable(L, -2);
+ return 1;
+}
+
+static int honey_glm_new_mat3(lua_State* L)
+{
+ honey_glm_array* mat3 = lua_newuserdata(L, sizeof(honey_glm_array));
+ setup_new_array(L, mat3, MAT3);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, honey_glm_mat3_mt_ref);
+ lua_setmetatable(L, -2);
+ return 1;
+}
+
+static int honey_glm_new_mat4(lua_State* L)
+{
+ honey_glm_array* mat4 = lua_newuserdata(L, sizeof(honey_glm_array));
+ setup_new_array(L, mat4, MAT4);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, honey_glm_mat4_mt_ref);
+ lua_setmetatable(L, -2);
+ return 1;
+}