diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/glm_bindings.c | 13 | ||||
-rw-r--r-- | src/glm_bindings.h | 4 | ||||
-rw-r--r-- | src/glm_mat4_bindings.c | 41 | ||||
-rw-r--r-- | src/glm_vec3_bindings.c | 27 | ||||
-rw-r--r-- | src/honey.c | 18 | ||||
-rw-r--r-- | src/input.c | 17 | ||||
-rw-r--r-- | src/mesh.c | 12 | ||||
-rw-r--r-- | src/primitives.c | 4 | ||||
-rw-r--r-- | src/scene_tree_node.c | 103 | ||||
-rw-r--r-- | src/shader.c | 15 | ||||
-rw-r--r-- | src/texture.c | 18 |
11 files changed, 183 insertions, 89 deletions
diff --git a/src/glm_bindings.c b/src/glm_bindings.c index 6893534..aa40fff 100644 --- a/src/glm_bindings.c +++ b/src/glm_bindings.c @@ -10,8 +10,8 @@ int honey_glm_UNIT_Y_ref = LUA_NOREF; int honey_glm_UNIT_Z_ref = LUA_NOREF; static void create_vec3(lua_State* L, - int x, int y, int z, - int* ref) + int x, int y, int z, + int* ref) { lua_createtable(L, 3, 0); @@ -32,12 +32,14 @@ static void create_vec3(lua_State* L, lua_pop(L, 1); } +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + void honey_setup_glm(lua_State* L) { /* vec3 metatable */ honey_lua_create_table (L, 3, - HONEY_TABLE, "__index", 23, + HONEY_TABLE, "__index", 24, HONEY_FUNCTION, "get", honey_glm_array_vec_get, HONEY_FUNCTION, "set", honey_glm_array_vec_set, HONEY_FUNCTION, "copyTo", honey_glm_vec3_copy, @@ -53,6 +55,7 @@ void honey_setup_glm(lua_State* L) HONEY_FUNCTION, "sub", honey_glm_vec3_sub, HONEY_FUNCTION, "subs", honey_glm_vec3_subs, HONEY_FUNCTION, "mul", honey_glm_vec3_mul, + HONEY_FUNCTION, "muls", honey_glm_vec3_muls, HONEY_FUNCTION, "scale", honey_glm_vec3_scale, HONEY_FUNCTION, "scaleAs", honey_glm_vec3_scale_as, HONEY_FUNCTION, "div", honey_glm_vec3_div, @@ -124,7 +127,7 @@ void honey_setup_glm(lua_State* L) honey_lua_create_table (L, 3, - HONEY_TABLE, "__index", 24, + HONEY_TABLE, "__index", 25, HONEY_FUNCTION, "get", honey_glm_array_mat_get, HONEY_FUNCTION, "set", honey_glm_array_mat_set, HONEY_FUNCTION, "copyTo", honey_glm_mat4_copy, @@ -136,6 +139,7 @@ void honey_setup_glm(lua_State* L) HONEY_FUNCTION, "scale", honey_glm_mat4_scale, HONEY_FUNCTION, "det", honey_glm_mat4_det, HONEY_FUNCTION, "inv", honey_glm_mat4_inv, + HONEY_FUNCTION, "basis", honey_glm_mat4_basis, HONEY_FUNCTION, "translate", honey_glm_translate, HONEY_FUNCTION, "translateX", honey_glm_translate_x, HONEY_FUNCTION, "translateY", honey_glm_translate_y, @@ -442,7 +446,6 @@ int honey_glm_array_destroy(lua_State* L) { honey_glm_array* array; honey_lua_parse_arguments(L, 1, 1, HONEY_USERDATA, &array); - printf("DESTROY GLM ARRAY %d", array->type); free(array->data); return 0; } diff --git a/src/glm_bindings.h b/src/glm_bindings.h index b04016e..21d92b9 100644 --- a/src/glm_bindings.h +++ b/src/glm_bindings.h @@ -76,6 +76,8 @@ int honey_glm_vec3_sub(lua_State* L); int honey_glm_vec3_subs(lua_State* L); int honey_glm_vec3_mul(lua_State* L); + +int honey_glm_vec3_muls(lua_State* L); int honey_glm_vec3_scale(lua_State* L); @@ -186,6 +188,8 @@ int honey_glm_mat4_det(lua_State* L); int honey_glm_mat4_inv(lua_State* L); +int honey_glm_mat4_basis(lua_State* L); + int honey_glm_translate(lua_State* L); int honey_glm_translate_x(lua_State* L); diff --git a/src/glm_mat4_bindings.c b/src/glm_mat4_bindings.c index b082a4b..8320dcb 100644 --- a/src/glm_mat4_bindings.c +++ b/src/glm_mat4_bindings.c @@ -197,6 +197,47 @@ int honey_glm_mat4_inv(lua_State* L) return 0; } +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +int honey_glm_mat4_basis(lua_State* L) +{ + honey_glm_array* self; + honey_lua_parse_arguments(L, 1, 1, HONEY_USERDATA, &self); + + + lua_createtable(L, 0, 3); + honey_glm_array *x, *y, *z; + + lua_pushcfunction(L, honey_glm_new_vec3); + honey_lua_pcall(L, 0, 1); + x = lua_touserdata(L, -1); + lua_setfield(L, -2, "x"); + + lua_pushcfunction(L, honey_glm_new_vec3); + honey_lua_pcall(L, 0, 1); + y = lua_touserdata(L, -1); + lua_setfield(L, -2, "y"); + + lua_pushcfunction(L, honey_glm_new_vec3); + honey_lua_pcall(L, 0, 1); + z = lua_touserdata(L, -1); + lua_setfield(L, -2, "z"); + + x->data[0] = self->data[0]; + x->data[1] = self->data[1]; + x->data[2] = self->data[2]; + + y->data[0] = self->data[4]; + y->data[1] = self->data[5]; + y->data[2] = self->data[6]; + + z->data[0] = self->data[8]; + z->data[1] = self->data[9]; + z->data[2] = self->data[10]; + + return 1; +} + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * Affine Transforms diff --git a/src/glm_vec3_bindings.c b/src/glm_vec3_bindings.c index a8157f2..e6ea407 100644 --- a/src/glm_vec3_bindings.c +++ b/src/glm_vec3_bindings.c @@ -247,6 +247,33 @@ int honey_glm_vec3_mul(lua_State* L) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +int honey_glm_vec3_muls(lua_State* L) +{ + honey_glm_array *self, *dest; + float s; + int choice = honey_lua_parse_arguments + (L, 2, + 2, HONEY_USERDATA, &self, HONEY_NUMBER, &s, + 3, HONEY_USERDATA, &self, HONEY_NUMBER, &s, HONEY_USERDATA, &dest); + + if (choice == 0) + dest = self; + else { + if (dest->type != VEC3) + honey_lua_throw_error + (L, "destination vector must be of type VEC3 (%d); got %d instead", + VEC3, dest->type); + } + + dest->data[0] = s * self->data[0]; + dest->data[1] = s * self->data[1]; + dest->data[2] = s * self->data[2]; + + return 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + int honey_glm_vec3_scale(lua_State* L) { honey_glm_array *self, *dest; diff --git a/src/honey.c b/src/honey.c index f58be3e..5f83544 100644 --- a/src/honey.c +++ b/src/honey.c @@ -57,17 +57,17 @@ bool honey_parse_options(honey_options* options, int argc, char** argv) static int honey_lua_clear_color(lua_State* L) { - float* color_array; + honey_glm_array* color_array; bool color, depth, stencil; - honey_lua_parse_arguments(L, 4, + honey_lua_parse_arguments(L, 1, 4, HONEY_USERDATA, &color_array, HONEY_BOOLEAN, &color, HONEY_BOOLEAN, &depth, HONEY_BOOLEAN, &stencil); - float r = color_array[0]; - float g = color_array[1]; - float b = color_array[2]; - float a = color_array[3]; + float r = color_array->data[0]; + float g = color_array->data[1]; + float b = color_array->data[2]; + float a = color_array->data[3]; int clear_flags = 0; if (color) @@ -87,7 +87,7 @@ static int honey_lua_clear_color(lua_State* L) int honey_lua_enable_depth_test(lua_State* L) { bool enable; - honey_lua_parse_arguments(L, 1, HONEY_BOOLEAN, &enable); + honey_lua_parse_arguments(L, 1, 1, HONEY_BOOLEAN, &enable); if (enable) glEnable(GL_DEPTH_TEST); else @@ -98,7 +98,7 @@ int honey_lua_enable_depth_test(lua_State* L) int honey_lua_set_viewport_size(lua_State* L) { int width, height; - honey_lua_parse_arguments(L, 2, + honey_lua_parse_arguments(L, 1, 2, HONEY_INTEGER, &width, HONEY_INTEGER, &height); glViewport(0,0,width,height); @@ -249,7 +249,7 @@ int honey_get_callback(lua_State* L, char* callback) int honey_set_framebuffer(lua_State* L) { int framebuffer; - honey_lua_parse_arguments(L, 1, HONEY_INTEGER, &framebuffer); + honey_lua_parse_arguments(L, 1, 1, HONEY_INTEGER, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); return 0; } diff --git a/src/input.c b/src/input.c index 3b0b286..ca5fc05 100644 --- a/src/input.c +++ b/src/input.c @@ -194,8 +194,8 @@ int honey_key_bind(lua_State* L) int choice = honey_lua_parse_arguments (L, 2, - 2, HONEY_INTEGER, &key, HONEY_FUNCTION, - 3, HONEY_INTEGER, &key, HONEY_FUNCTION, HONEY_ANY); + 2, HONEY_INTEGER, &key, HONEY_FUNCTION, NULL, + 3, HONEY_INTEGER, &key, HONEY_FUNCTION, NULL, HONEY_ANY, NULL); lua_pushvalue(L, 2); int callback = luaL_ref(L, LUA_REGISTRYINDEX); @@ -282,16 +282,19 @@ int honey_mouse_set_mode(lua_State* L) int honey_mouse_movement_bind(lua_State* L) { - honey_lua_parse_arguments - (L, 1, - 2, HONEY_FUNCTION, HONEY_ANY); + int choice = honey_lua_parse_arguments + (L, 2, + 1, HONEY_FUNCTION, NULL, + 2, HONEY_FUNCTION, NULL, HONEY_ANY, NULL); honey_mouse_movement_unbind(L); /* avoid memory leaks! */ lua_pushvalue(L, 1); honey_mouse_movement_callback_ref = luaL_ref(L, LUA_REGISTRYINDEX); - lua_pushvalue(L, 2); - honey_mouse_movement_callback_data_ref = luaL_ref(L, LUA_REGISTRYINDEX); + if (choice == 1) { + lua_pushvalue(L, 2); + honey_mouse_movement_callback_data_ref = luaL_ref(L, LUA_REGISTRYINDEX); + } return 0; } @@ -3,18 +3,18 @@ static int honey_mesh_lua_draw(lua_State* L) { honey_mesh* mesh; - int shader; - honey_lua_parse_arguments(L, 2, + int* shader; + honey_lua_parse_arguments(L, 1, 2, HONEY_USERDATA, &mesh, - HONEY_INTEGER, &shader); - honey_mesh_draw(*mesh, shader); + HONEY_USERDATA, &shader); + honey_mesh_draw(*mesh, *shader); return 0; } static int honey_mesh_lua_delete(lua_State* L) { honey_mesh* mesh; - honey_lua_parse_arguments(L, 1, HONEY_USERDATA, &mesh); + honey_lua_parse_arguments(L, 1, 1, HONEY_USERDATA, &mesh); honey_mesh_delete(*mesh); return 0; } @@ -123,7 +123,7 @@ static void process_nodes_recursively(lua_State* L, int honey_mesh_load(lua_State* L) { char* filename; - honey_lua_parse_arguments(L, 1, HONEY_STRING, &filename); + honey_lua_parse_arguments(L, 1, 1, HONEY_STRING, &filename); int n_meshes = 1; diff --git a/src/primitives.c b/src/primitives.c index c2f6c9e..ee68f6a 100644 --- a/src/primitives.c +++ b/src/primitives.c @@ -3,7 +3,7 @@ static int honey_mesh_lua_plane(lua_State* L) { float width, height; - honey_lua_parse_arguments(L, 2, + honey_lua_parse_arguments(L, 1, 2, HONEY_NUMBER, &width, HONEY_NUMBER, &height); @@ -18,7 +18,7 @@ static int honey_mesh_lua_plane(lua_State* L) static int honey_mesh_lua_cube(lua_State* L) { float width, height, depth; - honey_lua_parse_arguments(L, 3, + honey_lua_parse_arguments(L, 1, 3, HONEY_NUMBER, &width, HONEY_NUMBER, &height, HONEY_NUMBER, &depth); diff --git a/src/scene_tree_node.c b/src/scene_tree_node.c index a3ca27e..87618e6 100644 --- a/src/scene_tree_node.c +++ b/src/scene_tree_node.c @@ -16,6 +16,9 @@ void honey_setup_scene_tree(lua_State* L) HONEY_FUNCTION, "scale", honey_node_scale); honey_node_mt_ref = luaL_ref(L, LUA_REGISTRYINDEX); + lua_rawgeti(L, LUA_REGISTRYINDEX, honey_node_mt_ref); + lua_setfield(L, -2, "nodeMetatable"); + lua_pushcfunction(L, honey_node_new); lua_setfield(L, -2, "node"); } @@ -42,18 +45,19 @@ int honey_node_new(lua_State* L) lua_rawgeti(L, LUA_REGISTRYINDEX, honey_node_mt_ref); lua_setmetatable(L, -2); - lua_pushvalue(L, 1); - if (!lua_isnil(L, -1)) { + if (lua_istable(L, 1)) { /* add self to parent.children */ - lua_getfield(L, -1, "children"); + lua_getfield(L, 1, "children"); int length = lua_objlen(L, -1); lua_pushinteger(L, length+1); - lua_pushvalue(L, 5); + lua_pushvalue(L, -3); lua_settable(L, -3); lua_pop(L, 1); + + lua_pushvalue(L, 1); + lua_setfield(L, -2, "parent"); } - lua_setfield(L, -2, "parent"); if (position->type != VEC3) honey_lua_throw_error @@ -105,46 +109,35 @@ int honey_node_update_transform(lua_State* L) { honey_lua_parse_arguments(L, 1, 1, HONEY_TABLE, NULL); - /* self.transform:eye() */ - lua_pushcfunction(L, honey_glm_mat4_eye); - lua_getfield(L, 1, "transform"); - lua_pushvalue(L, -1); - honey_lua_pcall(L, 1, 0); + honey_glm_array *transform, *position, *rotation, *parent_transform; - /* self.transform:translate(self.position) */ - lua_pushcfunction(L, honey_glm_translate); - lua_pushvalue(L, 2); - lua_getfield(L, 1, "position"); - honey_lua_pcall(L, 2, 0); + lua_getfield(L, 1, "transform"); + transform = lua_touserdata(L, -1); + lua_pop(L, 1); - /* self.transform:rotateZ(self.rotation:at(2)) */ - lua_pushcfunction(L, honey_glm_rotate_z); - lua_pushvalue(L, 2); lua_getfield(L, 1, "position"); - honey_glm_array* position = lua_touserdata(L, -1); + position = lua_touserdata(L, -1); + lua_pop(L, 1); + + lua_getfield(L, 1, "rotation"); + rotation = lua_touserdata(L, -1); lua_pop(L, 1); - lua_pushnumber(L, position->data[2]); - honey_lua_pcall(L, 2, 0); - /* self.transform:rotateY(self.rotation:at(1)) */ - lua_pushcfunction(L, honey_glm_rotate_y); - lua_pushvalue(L, 2); - lua_pushnumber(L, position->data[1]); - honey_lua_pcall(L, 2, 0); + glm_mat4_identity(transform->data); - /* self.transform:rotateX(self.rotation:at(0)) */ - lua_pushcfunction(L, honey_glm_rotate_x); - lua_pushvalue(L, 2); - lua_pushnumber(L, position->data[0]); - honey_lua_pcall(L, 2, 0); + glm_translate(transform->data, position->data); + + glm_rotate_z(transform->data, rotation->data[2], transform->data); + glm_rotate_y(transform->data, rotation->data[1], transform->data); + glm_rotate_x(transform->data, rotation->data[0], transform->data); lua_getfield(L, 1, "parent"); - if (!lua_isnil(L, -1)) { - lua_pushcfunction(L, honey_glm_mat4_mul); - lua_getfield(L, -2, "transform"); - lua_pushvalue(L, 2); - lua_pushvalue(L, -1); - honey_lua_pcall(L, 3, 0); + if (lua_istable(L, -1)) { + lua_getfield(L, -1, "transform"); + parent_transform = lua_touserdata(L, -1); + lua_pop(L, 1); + + glm_mat4_mul(parent_transform->data, transform->data, transform->data); } lua_pop(L, 1); @@ -191,13 +184,23 @@ int honey_node_update_cascade(lua_State* L) int honey_node_draw_cascade(lua_State* L) { - honey_lua_parse_arguments(L, 1, 1, HONEY_TABLE, NULL); + int* shader; + int choice = honey_lua_parse_arguments + (L, 2, + 2, HONEY_TABLE, NULL, HONEY_TABLE, NULL, + 3, HONEY_TABLE, NULL, HONEY_TABLE, NULL, HONEY_USERDATA, &shader); /* call self.draw if it exists */ lua_getfield(L, 1, "draw"); if (!lua_isnil(L, -1)) { lua_pushvalue(L, 1); - honey_lua_pcall(L, 1, 0); + lua_pushvalue(L, 2); + if (choice == 1) { + lua_pushvalue(L, 3); + honey_lua_pcall(L, 3, 0); + } + else + honey_lua_pcall(L, 2, 0); } else lua_pop(L, 1); @@ -209,7 +212,13 @@ int honey_node_draw_cascade(lua_State* L) lua_rawgeti(L, -1, i+1); lua_pushcfunction(L, honey_node_draw_cascade); lua_pushvalue(L, -2); - honey_lua_pcall(L, 1, 0); + lua_pushvalue(L, 2); + if (choice == 1) { + lua_pushvalue(L, 3); + honey_lua_pcall(L, 3, 0); + } + else + honey_lua_pcall(L, 2, 0); lua_pop(L, 1); } @@ -220,15 +229,17 @@ int honey_node_draw_cascade(lua_State* L) int honey_node_translate(lua_State* L) { - honey_glm_array* v; + honey_glm_array* position, *v; honey_lua_parse_arguments(L, 1, 2, HONEY_TABLE, NULL, HONEY_USERDATA, &v); - lua_pushcfunction(L, honey_glm_vec3_add); - lua_getfield(L, 1, "transform"); - lua_pushvalue(L, 2); - lua_pushvalue(L, -2); - honey_lua_pcall(L, 3, 0); + lua_getfield(L, 1, "position"); + position = lua_touserdata(L, -1); + lua_pop(L, 1); + position->data[0] += v->data[0]; + position->data[1] += v->data[1]; + position->data[2] += v->data[2]; + return 0; } diff --git a/src/shader.c b/src/shader.c index a05bd0c..048cf87 100644 --- a/src/shader.c +++ b/src/shader.c @@ -10,17 +10,20 @@ void honey_setup_shader(lua_State* L) /* honey.shader.prototype */ HONEY_FUNCTION, "use", honey_shader_use, - HONEY_FUNCTION, "set_int", honey_shader_set_int, - HONEY_FUNCTION, "set_float", honey_shader_set_float, - HONEY_FUNCTION, "set_vec3", honey_shader_set_vec3, - HONEY_FUNCTION, "set_vec4", honey_shader_set_vec4, - HONEY_FUNCTION, "set_mat3", honey_shader_set_mat3, - HONEY_FUNCTION, "set_mat4", honey_shader_set_mat4, + HONEY_FUNCTION, "setInteger", honey_shader_set_int, + HONEY_FUNCTION, "setFloat", honey_shader_set_float, + HONEY_FUNCTION, "setVec3", honey_shader_set_vec3, + HONEY_FUNCTION, "setVec4", honey_shader_set_vec4, + HONEY_FUNCTION, "setMat3", honey_shader_set_mat3, + HONEY_FUNCTION, "setMat4", honey_shader_set_mat4, HONEY_FUNCTION, "__gc", honey_shader_delete); honey_shader_mt_ref = luaL_ref(L, LUA_REGISTRYINDEX); + lua_rawgeti(L, LUA_REGISTRYINDEX, honey_shader_mt_ref); + lua_setfield(L, -2, "shaderMetatable"); + lua_pushcfunction(L, honey_shader_new); lua_setfield(L, -2, "shader"); } diff --git a/src/texture.c b/src/texture.c index 7388d50..cdd36c4 100644 --- a/src/texture.c +++ b/src/texture.c @@ -11,7 +11,7 @@ static int honey_lua_texture_create(lua_State* L) honey_texture* texture; int width, height; char* type; - honey_lua_parse_arguments(L, 4, + honey_lua_parse_arguments(L, 1, 4, HONEY_USERDATA, &texture, HONEY_STRING, &type, HONEY_INTEGER, &width, @@ -41,7 +41,7 @@ static int honey_lua_texture_load(lua_State* L) { honey_texture* texture; char* texture_path; - honey_lua_parse_arguments(L, 3, + honey_lua_parse_arguments(L, 1, 3, HONEY_USERDATA, &texture, HONEY_STRING, &texture_path); enum honey_texture_result result = honey_texture_load(texture, texture_path); @@ -62,7 +62,7 @@ static int honey_lua_texture_use(lua_State* L) { honey_texture* texture; int texture_unit; - honey_lua_parse_arguments(L, 2, + honey_lua_parse_arguments(L, 1, 2, HONEY_USERDATA, &texture, HONEY_INTEGER, &texture_unit); honey_texture_use(*texture, texture_unit); @@ -72,6 +72,13 @@ static int honey_lua_texture_use(lua_State* L) static int honey_lua_framebuffer_new(lua_State* L) { honey_texture* draw, *depth; + int width, height; + honey_lua_parse_arguments(L, 1, 4, + HONEY_ANY, NULL, + HONEY_ANY, NULL, + HONEY_INTEGER, &width, + HONEY_INTEGER, &height); + if (lua_isuserdata(L, 1)) draw = lua_touserdata(L, 1); else @@ -82,11 +89,6 @@ static int honey_lua_framebuffer_new(lua_State* L) else depth = NULL; - int width, height; - honey_lua_parse_arguments(L, 4, HONEY_ANY, HONEY_ANY, - HONEY_INTEGER, &width, - HONEY_INTEGER, &height); - unsigned int framebuffer; honey_texture_framebuffer_object_new(&framebuffer, draw, depth, |