summaryrefslogtreecommitdiff
path: root/src/object.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/object.c')
-rw-r--r--src/object.c109
1 files changed, 109 insertions, 0 deletions
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;i<mesh->mNumFaces;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);
+}