From 510f1bac9b71ba240d30bb5bc5df6501e70fafc9 Mon Sep 17 00:00:00 2001 From: DrNuget Date: Sun, 4 Jan 2026 22:12:24 +0200 Subject: Working 3D with .obj file loading --- src/object.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/object.c (limited to 'src/object.c') diff --git a/src/object.c b/src/object.c new file mode 100644 index 0000000..25d504f --- /dev/null +++ b/src/object.c @@ -0,0 +1,109 @@ +#include "object.h" + +void createViewModel(ViewModel *model, int num_vertices, float *vert, int num_indices, unsigned int *indices) +{ + model->num_indices = num_indices; + + glGenVertexArrays(1, &model->VAO); + glBindVertexArray(model->VAO); + + glGenBuffers(1, &model->VBO); + glBindBuffer(GL_ARRAY_BUFFER, model->VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(float)*num_vertices*3, vert, GL_STATIC_DRAW); + + glGenBuffers(1, &model->EBO); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model->EBO); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*num_indices, indices, GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); +} + +void killViewModel(ViewModel *model) +{ + glDeleteVertexArrays(1, &model->VAO); + glDeleteBuffers(1, &model->VBO); + glDeleteBuffers(1, &model->EBO); +} + +void bindViewModel(ViewModel *model) +{ + glBindVertexArray(model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model->EBO); +} + +ViewModel loadViewModel(const char* filename) +{ + const struct aiScene* scene = aiImportFile(filename, + aiProcess_CalcTangentSpace | + aiProcess_Triangulate | + aiProcess_JoinIdenticalVertices | + aiProcess_SortByPType); + + struct aiMesh *mesh = scene->mMeshes[0]; + + unsigned int *indices = malloc(mesh->mNumFaces*3*sizeof(unsigned int)); + int index = 0; + for (unsigned int i=0;imNumFaces;i++) { + memcpy(&indices[index], mesh->mFaces[i].mIndices, 3*sizeof(unsigned int)); + index+=3; + } + + ViewModel model; + createViewModel(&model, mesh->mNumVertices, (float*)mesh->mVertices, mesh->mNumFaces*3, indices); + free(indices); + return model; +} + +void createObject(Object *obj, ViewModel *model) +{ + obj->model = model; + glm_mat4_identity(obj->transform); + + glm_vec3_zero(obj->pos); + glm_vec3_one(obj->size); + + obj->rotation.angle = 0.0f; + glm_vec3_zero(obj->rotation.direction); +} + +void moveObject(Object *obj, vec3 pos) +{ + glm_vec3_copy( + pos, + obj->pos + ); + updateObjectTransform(obj); +} + +void scaleObject(Object *obj, vec3 scale) +{ + glm_scale(obj->transform, scale); + updateObjectTransform(obj); +} + +void rotateObject(Object *obj, float angle, vec3 direction) +{ + obj->rotation.angle = angle; + glm_vec3_copy( + direction, + obj->rotation.direction + ); + updateObjectTransform(obj); +} + +inline void updateObjectTransform(Object *obj) +{ + glm_mat4_identity(obj->transform); + glm_translate(obj->transform, obj->pos); + glm_rotate(obj->transform, obj->rotation.angle, obj->rotation.direction); + glm_scale(obj->transform, obj->size); +} + +void drawObject(Game *game, Object *obj) +{ + glUniformMatrix4fv(game->transform_loc, 1, GL_FALSE, (float*)obj->transform); + + glDrawElements(GL_TRIANGLES, obj->model->num_indices, GL_UNSIGNED_INT, 0); +} -- cgit v1.2.3