diff options
Diffstat (limited to 'src/mesh/mesh.c')
-rw-r--r-- | src/mesh/mesh.c | 114 |
1 files changed, 57 insertions, 57 deletions
diff --git a/src/mesh/mesh.c b/src/mesh/mesh.c index 1889bd7..8e7e444 100644 --- a/src/mesh/mesh.c +++ b/src/mesh/mesh.c @@ -1,106 +1,106 @@ #include "mesh.h" +static int honey_mesh_lua_draw(lua_State* L) +{ + honey_mesh* mesh; + int shader; + honey_lua_parse_arguments(L, 2, + HONEY_USERDATA, &mesh, + HONEY_INTEGER, &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_mesh_delete(*mesh); + return 0; +} + void honey_setup_mesh(lua_State* L) { honey_lua_element mesh_elements[] = { - { "new", HONEY_FUNCTION, { .function = honey_mesh_new } }, - { "draw", HONEY_FUNCTION, { .function = honey_mesh_draw } }, - { "delete", HONEY_FUNCTION, { .function = honey_mesh_delete } }, + { "draw", HONEY_FUNCTION, { .function = honey_mesh_lua_draw } }, + { "delete", HONEY_FUNCTION, { .function = honey_mesh_lua_delete } }, }; - honey_lua_create_table(L, mesh_elements, 3); + honey_lua_create_table(L, mesh_elements, 2); } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -int honey_mesh_new(lua_State* L) -{ - float* vertices; - unsigned int* indices; - int n_vertices, n_indices; - honey_lua_parse_arguments(L, 5, - HONEY_USERDATA, &vertices, - HONEY_USERDATA, &indices, - HONEY_TABLE, - HONEY_INTEGER, &n_vertices, - HONEY_INTEGER, &n_indices); - - size_t n_attributes = lua_objlen(L, 3); - unsigned int* attribute_sizes = malloc(n_attributes * sizeof(unsigned int)); - if (attribute_sizes == NULL) { - lua_pushstring(L, "failed to allocate memory for vertex attributes"); - lua_error(L); +honey_result honey_mesh_new(honey_mesh* mesh, + float* vertices, + unsigned int n_vertices, + unsigned int n_attributes, + unsigned int* attribute_sizes, + unsigned int* indices, + unsigned int n_indices) { + if (vertices == NULL || n_vertices == 0) { + return HONEY_MESH_BAD_VERTEX_DATA; + } + if (indices == NULL || n_indices == 0) { + return HONEY_MESH_BAD_INDEX_DATA; } unsigned int vertex_size = 0; for (int i=0; i<n_attributes; i++) { - lua_rawgeti(L, 2, i+1); - attribute_sizes[i] = lua_tointeger(L, -1); vertex_size += attribute_sizes[i]; } - lua_pop(L, n_attributes); - honey_mesh* mesh = lua_newuserdata(L, sizeof(honey_mesh)); - mesh->n_indices = n_indices; + (*mesh).n_vertices = n_vertices; + (*mesh).n_indices = n_indices; - glGenVertexArrays(1, &mesh->vertex_array); - glGenBuffers(1, &mesh->vertex_buffer); - glGenBuffers(1, &mesh->element_buffer); + glGenVertexArrays(1, &((*mesh).vertex_array)); + glGenBuffers(1, &((*mesh).vertex_buffer)); + glGenBuffers(1, &((*mesh).element_buffer)); - glBindVertexArray(mesh->vertex_array); + glBindVertexArray((*mesh).vertex_array); - glBindBuffer(GL_ARRAY_BUFFER, mesh->vertex_buffer); + glBindBuffer(GL_ARRAY_BUFFER, (*mesh).vertex_buffer); glBufferData(GL_ARRAY_BUFFER, vertex_size * n_vertices * sizeof(float), vertices, GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->element_buffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (*mesh).element_buffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, n_indices * sizeof(unsigned int), indices, GL_STATIC_DRAW); + /* set up vertex attributes */ unsigned int offset = 0; for (int i=0; i<n_attributes; i++) { glEnableVertexAttribArray(i); glVertexAttribPointer(i, attribute_sizes[i], - GL_FLOAT, GL_FALSE, - vertex_size * sizeof(float), - (void*) (offset * sizeof(float))); + GL_FLOAT, + GL_FALSE, + vertex_size*sizeof(float), + (void*) (offset*sizeof(float))); offset += attribute_sizes[i]; } - + glBindVertexArray(0); - free(attribute_sizes); - - return 1; + return HONEY_OK; } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -int honey_mesh_draw(lua_State* L) -{ - honey_mesh* mesh; - int shader; - honey_lua_parse_arguments(L, 2, - HONEY_USERDATA, &mesh, - HONEY_INTEGER, &shader); - - glUseProgram(shader); +void honey_mesh_draw(honey_mesh mesh, int shader) { + honey_shader_use(shader); - glBindVertexArray(mesh->vertex_array); - glDrawElements(GL_TRIANGLES, mesh->n_indices, GL_UNSIGNED_INT, 0); + glBindVertexArray(mesh.vertex_array); + glDrawElements(GL_TRIANGLES, mesh.n_indices, GL_UNSIGNED_INT, 0); glBindVertexArray(0); } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -int honey_mesh_delete(lua_State* L) -{ - honey_mesh* mesh; - honey_lua_parse_arguments(L, 1, HONEY_USERDATA, &mesh); - glDeleteVertexArrays(1, &(mesh->vertex_array)); - glDeleteBuffers(1, &(mesh->vertex_buffer)); - glDeleteBuffers(1, &(mesh->element_buffer)); +void honey_mesh_delete(honey_mesh mesh) { + glDeleteVertexArrays(1, &(mesh.vertex_array)); + glDeleteBuffers(1, &(mesh.vertex_buffer)); + glDeleteBuffers(1, &(mesh.element_buffer)); } |