diff options
Diffstat (limited to 'src/glm_mat3_bindings.c')
-rw-r--r-- | src/glm_mat3_bindings.c | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/glm_mat3_bindings.c b/src/glm_mat3_bindings.c new file mode 100644 index 0000000..0222e47 --- /dev/null +++ b/src/glm_mat3_bindings.c @@ -0,0 +1,197 @@ +#include "glm_bindings.h" + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * Mat3 Functions + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +int honey_glm_mat3_copy(lua_State* L) +{ + honey_glm_array* self, *dest; + honey_lua_parse_arguments + (L, 1, 2, + HONEY_USERDATA, &self, + HONEY_USERDATA, &dest); + + if (dest->type != MAT3) + honey_lua_throw_error + (L, "destination must be MAT3 (%d); got %d instead", + MAT3, dest->type); + + glm_mat3_copy(self->data, dest->data); + + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_glm_mat3_eye(lua_State* L) +{ + honey_glm_array* self; + honey_lua_parse_arguments + (L, 1, 1, HONEY_USERDATA, &self); + + glm_mat3_identity(self->data); + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_glm_mat3_zero(lua_State* L) +{ + honey_glm_array* self; + honey_lua_parse_arguments + (L, 1, 1, HONEY_USERDATA, &self); + + glm_mat3_zero(self->data); + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_glm_mat3_mul(lua_State* L) +{ + honey_glm_array* self, *mult, *dest; + int choice = honey_lua_parse_arguments + (L, 2, + 2, HONEY_USERDATA, &self, HONEY_USERDATA, &mult, + 3, HONEY_USERDATA, &self, HONEY_USERDATA, &mult, HONEY_USERDATA, &dest); + + if (mult->type != MAT3) + honey_lua_throw_error + (L, "second matrix must be of type MAT3 (%d); got %d instead", + MAT3, mult->type); + + if (choice == 1) { + if (dest->type != MAT3) + honey_lua_throw_error + (L, "destination matrix must be of type MAT3 (%d); got %d instead", + MAT3, dest->type); + } + else { + honey_glm_new_mat3(L); + dest = lua_touserdata(L, -1); + } + + glm_mat3_mul(self->data, mult->data, dest->data); + + if (choice == 0) + return 1; + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_glm_mat3_transpose(lua_State* L) +{ + honey_glm_array* self, *dest; + int choice = honey_lua_parse_arguments + (L, 2, + 1, HONEY_USERDATA, &self, + 2, HONEY_USERDATA, &self, HONEY_USERDATA, &dest); + + if (choice == 1) { + if (dest->type != MAT3) + honey_lua_throw_error + (L, "destination matrix must be of type MAT3 (%d); got %d instead", + MAT3, dest->type); + } + + if (choice == 0) + glm_mat3_transpose(self->data); + else + glm_mat3_transpose_to(self->data, dest->data); + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_glm_mat3_mulv(lua_State* L) +{ + honey_glm_array* self, *v, *dest; + int choice = honey_lua_parse_arguments + (L, 2, + 2, HONEY_USERDATA, &self, HONEY_USERDATA, &v, + 3, HONEY_USERDATA, &self, HONEY_USERDATA, &v, HONEY_USERDATA, &dest); + + if (v->type != VEC3) + honey_lua_throw_error + (L, "vector must be of type VEC3 (%d); got %d instead", + VEC3, v->type); + + if (choice == 0) { + honey_glm_new_vec3(L); + dest = lua_touserdata(L, -1); + } + else { + if (dest->type == MAT3) + honey_lua_throw_error + (L, "destination matrix must be of type MAT3 (%d); got %d instead", + MAT3, dest->type); + } + + glm_mat3_mulv(self->data, v->data, dest->data); + + if (choice == 0) + return 1; + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_glm_mat3_scale(lua_State* L) +{ + honey_glm_array* self; + float s; + int choice = honey_lua_parse_arguments + (L, 1, + 2, HONEY_USERDATA, &self, HONEY_NUMBER, &s); + + glm_mat3_scale(self->data, s); + + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_glm_mat3_det(lua_State* L) +{ + honey_glm_array* self; + honey_lua_parse_arguments(L, 1, 1, HONEY_USERDATA, &self); + + float det = glm_mat3_det(self->data); + lua_pushnumber(L, det); + return 1; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_glm_mat3_inv(lua_State* L) +{ + honey_glm_array* self, *dest; + int choice = honey_lua_parse_arguments + (L, 2, + 1, HONEY_USERDATA, &self, + 2, HONEY_USERDATA, &self, HONEY_USERDATA, &dest); + + if (choice == 0) { + honey_glm_new_mat3(L); + dest = lua_touserdata(L, -1); + } + else { + if (dest->type == MAT3) + honey_lua_throw_error + (L, "destination matrix must be of type MAT3 (%d); got %d instead", + MAT3, dest->type); + } + + glm_mat3_inv(self->data, dest->data); + + if (choice == 0) + return 1; + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ |