From 73be72585c8c8fcc1b6543f19841bb3894c4f141 Mon Sep 17 00:00:00 2001 From: JonasJan2 Date: Wed, 5 Jun 2024 14:45:48 +0200 Subject: [PATCH] WIP objecthandler stuff --- src/main.c | 547 ++++++++++++++++++++++---------------------- src/objectHandler.c | 10 +- 2 files changed, 284 insertions(+), 273 deletions(-) diff --git a/src/main.c b/src/main.c index b8d18e0..415c39e 100644 --- a/src/main.c +++ b/src/main.c @@ -32,11 +32,11 @@ int flipFlag = 1; GLuint textures[NUM_TEXTURES]; char* textureFiles[NUM_TEXTURES] = { - "../texture/earth/day.png", - "../texture/earth/night.png", - "../texture/earth/clouds.png", - "../texture/earth/ocean_mask.png", - "../texture/earth/normal.png" + "../texture/earth/day.png", + "../texture/earth/night.png", + "../texture/earth/clouds.png", + "../texture/earth/ocean_mask.png", + "../texture/earth/normal.png" }; ObjectData* objectData; @@ -59,353 +59,362 @@ vec3 cameraPosition = {0.0f, 3.0f, 5.5f}; int numModels = 4; char* models[] = { - "../obj/Yblock.obj", - "../obj/Zblock.obj", - "../obj/Yblock_rotated.obj", - "../obj/Xblock.obj" + "../obj/Yblock.obj", + "../obj/Zblock.obj", + "../obj/Yblock_rotated.obj", + "../obj/Xblock.obj" }; // input handler for camera movement void handleInputs(double deltaTime) { - if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { - cameraPosition.z += deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { - cameraPosition.z -= deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) { - cameraPosition.x += deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) { - cameraPosition.x -= deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { - cameraPosition.y += deltaTime * 10; - } - if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) { - cameraPosition.y -= deltaTime * 10; - } + if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { + cameraPosition.z += deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { + cameraPosition.z -= deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) { + cameraPosition.x += deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) { + cameraPosition.x -= deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { + cameraPosition.y += deltaTime * 10; + } + if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) { + cameraPosition.y -= deltaTime * 10; + } } // input handler to quit with ESC void keyboardHandler(GLFWwindow* window, int key, int scancode, int action, int mods) { - if (action == GLFW_PRESS) { - if (key == GLFW_KEY_ESCAPE) { - exitRequested = true; - } - } + if (action == GLFW_PRESS) { + if (key == GLFW_KEY_ESCAPE) { + exitRequested = true; + } + } } void loadTexture(char* textureFile, GLuint* texture) { - int width, height, nrChannels; - unsigned char* image = stbi_load(textureFile, &width, &height, &nrChannels, 0); + int width, height, nrChannels; + unsigned char* image = stbi_load(textureFile, &width, &height, &nrChannels, 0); - // default: 3 channels, RGB + // default: 3 channels, RGB - GLenum channelFormats[] = { - 0, - GL_RED, - GL_RG, - GL_RGB, - GL_RGBA - }; - GLenum format = channelFormats[nrChannels]; + GLenum channelFormats[] = { + 0, + GL_RED, + GL_RG, + GL_RGB, + GL_RGBA + }; + GLenum format = channelFormats[nrChannels]; - glGenTextures(1, texture); - glBindTexture(GL_TEXTURE_2D, *texture); + glGenTextures(1, texture); + glBindTexture(GL_TEXTURE_2D, *texture); - printf("%s - %d\n", textureFile, nrChannels); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, format, GL_UNSIGNED_BYTE, image); - // load texture using previously determined format ----- ^^^^^^ + printf("%s - %d\n", textureFile, nrChannels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, format, GL_UNSIGNED_BYTE, image); + // load texture using previously determined format ----- ^^^^^^ - glGenerateMipmap(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 0); + glGenerateMipmap(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, 0); - stbi_image_free(image); + stbi_image_free(image); } - - void init(void) { - // create and compile vertex shader - const GLchar *vertexTextConst = vertexShader_glsl; + // create and compile vertex shader + const GLchar *vertexTextConst = vertexShader_glsl; - GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertexShader, 1, &vertexTextConst, &vertexShader_glsl_len); - glCompileShader(vertexShader); + GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexTextConst, &vertexShader_glsl_len); + glCompileShader(vertexShader); - GLint status; - glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); - - if (!status) { - printf("Error compiling vertex shader: "); - GLchar infoLog[1024]; - glGetShaderInfoLog(vertexShader, 1024, NULL, infoLog); - printf("%s",infoLog); - exit(1); - } + GLint status; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); + + if (!status) { + printf("Error compiling vertex shader: "); + GLchar infoLog[1024]; + glGetShaderInfoLog(vertexShader, 1024, NULL, infoLog); + printf("%s",infoLog); + exit(1); + } - vertexTextConst = NULL; + vertexTextConst = NULL; + + // create and compile fragment shader + + const GLchar *fragmentTextConst = fragmentShader_glsl; + + GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentTextConst, &fragmentShader_glsl_len); + glCompileShader(fragmentShader); + + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status); + + if (!status) { + printf("Error compiling fragment shader: "); + GLchar infoLog[1024]; + glGetShaderInfoLog(fragmentShader, 1024, NULL, infoLog); + printf("%s",infoLog); + exit(1); + } + + // create and link shader program + program = glCreateProgram(); + glAttachShader(program, vertexShader); + glAttachShader(program, fragmentShader); + glLinkProgram(program); + + glGetProgramiv(program, GL_LINK_STATUS, &status); + + if (!status) { + printf("Error linking program: "); + GLchar infoLog[1024]; + glGetProgramInfoLog(program, 1024, NULL, infoLog); + printf("%s",infoLog); + exit(1); + } + glValidateProgram(program); + glGetProgramiv(program, GL_VALIDATE_STATUS, &status); - // create and compile fragment shader - - const GLchar *fragmentTextConst = fragmentShader_glsl; - - GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragmentShader, 1, &fragmentTextConst, &fragmentShader_glsl_len); - glCompileShader(fragmentShader); - - glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status); - - if (!status) { - printf("Error compiling fragment shader: "); - GLchar infoLog[1024]; - glGetShaderInfoLog(fragmentShader, 1024, NULL, infoLog); - printf("%s",infoLog); - exit(1); - } - - // create and link shader program - program = glCreateProgram(); - glAttachShader(program, vertexShader); - glAttachShader(program, fragmentShader); - glLinkProgram(program); - - glGetProgramiv(program, GL_LINK_STATUS, &status); - - if (!status) { - printf("Error linking program: "); - GLchar infoLog[1024]; - glGetProgramInfoLog(program, 1024, NULL, infoLog); - printf("%s",infoLog); - exit(1); - } - glValidateProgram(program); + if (!status) { + printf("Error validating program: "); + GLchar infoLog[1024]; + glGetProgramInfoLog(program, 1024, NULL, infoLog); + printf("%s",infoLog); + exit(1); + } - glGetProgramiv(program, GL_VALIDATE_STATUS, &status); + // --------------- READ MODEL FILES + + objectData = malloc(numModels * sizeof(ObjectData)); + for (int i = 0; i < numModels; i++) { + ObjectData objData = readObjFiles(models, 1); - if (!status) { - printf("Error validating program: "); - GLchar infoLog[1024]; - glGetProgramInfoLog(program, 1024, NULL, infoLog); - printf("%s",infoLog); - exit(1); - } + glGenVertexArrays(1, &objData.vao); + glGenBuffers(1, &objData.vbo); + glBindVertexArray(objData.vao); + glBindBuffer(GL_ARRAY_BUFFER, objData.vbo); + glBufferData(GL_ARRAY_BUFFER, objData.numFaces * 3 * sizeof(Vertex), objData.vertices, GL_STATIC_DRAW); - // --------------- READ MODEL FILES - - objectData = readObjFiles(models, numModels); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)0); + glEnableVertexAttribArray(0); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)(3 * sizeof(GLfloat))); + glEnableVertexAttribArray(1); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)(6 * sizeof(GLfloat))); + glEnableVertexAttribArray(2); + glBindVertexArray(0); - stbi_set_flip_vertically_on_load(flipFlag); - // -------------- READ TEXTURE FILES - for (int i = 0; i < NUM_TEXTURES; i++) { - loadTexture(textureFiles[i], &textures[i]); - } + objectData[i] = objData; + } - // ENABLE BACKFACE CULLING - glFrontFace(GL_CCW); - glEnable(GL_CULL_FACE); + stbi_set_flip_vertically_on_load(flipFlag); + // -------------- READ TEXTURE FILES + for (int i = 0; i < NUM_TEXTURES; i++) { + loadTexture(textureFiles[i], &textures[i]); + } - // ENABLE DEPTH BUFFER - glEnable(GL_DEPTH_TEST); + // ENABLE BACKFACE CULLING + glFrontFace(GL_CCW); + glEnable(GL_CULL_FACE); - glClearColor(0.1f, 0.1f, 0.1f, 1.0f); + // ENABLE DEPTH BUFFER + glEnable(GL_DEPTH_TEST); + + glClearColor(0.1f, 0.1f, 0.1f, 1.0f); } void updateStats() { - printf("\rFPS: %.1f", framesSinceUpdate / timeSinceUpdate); - printf(" - Camera Position: [%f, %f, %f]", cameraPosition.x, cameraPosition.y, cameraPosition.z); - fflush(stdout); + printf("\rFPS: %.1f", framesSinceUpdate / timeSinceUpdate); + printf(" - Camera Position: [%f, %f, %f]", cameraPosition.x, cameraPosition.y, cameraPosition.z); + fflush(stdout); } void draw(void) { - // FPS Counter - framesSinceUpdate++; - double deltaTime = glfwGetTime(); - timeSinceUpdate += deltaTime; - glfwSetTime(0.0f); + // FPS Counter + framesSinceUpdate++; + double deltaTime = glfwGetTime(); + timeSinceUpdate += deltaTime; + glfwSetTime(0.0f); - if (timeSinceUpdate >= timeBetweenUpdates) { - updateStats(); - timeSinceUpdate = 0.0f; - framesSinceUpdate = 0; - } + if (timeSinceUpdate >= timeBetweenUpdates) { + updateStats(); + timeSinceUpdate = 0.0f; + framesSinceUpdate = 0; + } - // camera movement - handleInputs(deltaTime); + // camera movement + handleInputs(deltaTime); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glUseProgram(program); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glUseProgram(program); + // step for rotations + // counts up to 1.0 and then resets back to 0.0 forever + step += deltaTime / 15; + if (step > 1.0f) step -= 1.0f; + if (step < 0.0f) step += 1.0f; - // step for rotations - // counts up to 1.0 and then resets back to 0.0 forever - step += deltaTime / 15; - if (step > 1.0f) step -= 1.0f; - if (step < 0.0f) step += 1.0f; + // step multiplied by pi * 2 for use in rotation and trig functions + GLfloat stepi = step * pi * 2; - // step multiplied by pi * 2 for use in rotation and trig functions - GLfloat stepi = step * pi * 2; + // ------------- VIEWING TRANSFORMATION ------------------- + vec3 origin = {0.0f, 0.0f, 0.0f}; + vec3 up = {0.0f, 1.0f, 0.0f}; + mat4 viewingTransformation; + lookAt(&viewingTransformation, &cameraPosition, &origin, &up); - // ------------- MODEL TRANSFORMATION --------------------- - // SCALE -> ROTATE -> TRANSLATE + // -------------- PROJECTION TRANSFORMATION ---------------- + mat4 projectionTransformation; + GLfloat near = 0.1f; + GLfloat far = 20.0f; + perspectiveProjection(&projectionTransformation, near, far); - mat4 modelTransformation; - identity(&modelTransformation); + // -------------- NORMALISATION TRANSFORMATION ------------- + mat4 normalisationTransformation; + GLfloat fovy = pi / 2; + normalisedDeviceCoordinatesFov(&normalisationTransformation, fovy, aspectRatio, near, far); - rotateY(&modelTransformation, &modelTransformation, stepi * 2); - rotateZ(&modelTransformation, &modelTransformation, -23.5f / 180 * pi); + mat4 projection; + identity(&projection); + multiply(&projection, &projectionTransformation, &projection); + multiply(&projection, &normalisationTransformation, &projection); - // ------------- VIEWING TRANSFORMATION ------------------- - vec3 origin = {0.0f, 0.0f, 0.0f}; - vec3 up = {0.0f, 1.0f, 0.0f}; + // ------------- DRAW EACH OBJECT SEPARATELY ---------------- + for (int i = 0; i < numModels; i++) { + // Reset model transformation for each object + mat4 modelTransformation; + identity(&modelTransformation); - mat4 viewingTransformation; - lookAt(&viewingTransformation, &cameraPosition, &origin, &up); + // Apply object-specific transformations + if (i == 0) { + // Example transformations for the first object + rotateY(&modelTransformation, &modelTransformation, stepi * 2); + } else if (i == 1) { + // Example transformations for the second object + rotateZ(&modelTransformation, &modelTransformation, -23.5f / 180 * pi); + } else if (i == 2) { + // Example transformations for the third object + rotateX(&modelTransformation, &modelTransformation, stepi); + } else if (i == 3) { + // Example transformations for the fourth object + translate(&modelTransformation, &modelTransformation, 1.0f, 0.0f, 0.0f); + } + mat4 modelView; + identity(&modelView); + multiply(&modelView, &modelTransformation, &modelView); + multiply(&modelView, &viewingTransformation, &modelView); + // calculate matrix for normals + mat3 normalModelView; + mat3From4(&normalModelView, &modelView); + mat3Inverse(&normalModelView, &normalModelView); + mat3Transpose(&normalModelView, &normalModelView); - // -------------- PROJECTION TRANSFORMATION ---------------- - mat4 projectionTransformation; - GLfloat near = 0.1f; - GLfloat far = 20.0f; - perspectiveProjection(&projectionTransformation, near, far); + // send transformation matrix to shader + glUniformMatrix4fv(glGetUniformLocation(program, "modelView"), 1, GL_FALSE, (GLfloat*)&modelView); + glUniformMatrix3fv(glGetUniformLocation(program, "normalModelView"), 1, GL_FALSE, (GLfloat*)&normalModelView); + glUniformMatrix4fv(glGetUniformLocation(program, "projection"), 1, GL_FALSE, (GLfloat*)&projection); + // SET MATERIAL DATA + glUniform1f(glGetUniformLocation(program, "shininess"), 60.0f * 4.0f); + // SET LIGHT DATA + glUniform4f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f, 1.0f); + glUniform4f(glGetUniformLocation(program, "ambientLight"), 0.05f, 0.05f, 0.05f, 1.0f); - // -------------- NORMALISATION TRANSFORMATION ------------- - mat4 normalisationTransformation; - GLfloat fovy = pi / 2; - normalisedDeviceCoordinatesFov(&normalisationTransformation, fovy, aspectRatio, near, far); + // BIND TEXTURES + GLuint textureLocation; + textureLocation = glGetUniformLocation(program, "day"); + glUniform1i(textureLocation, 0); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, textures[DAY]); + textureLocation = glGetUniformLocation(program, "night"); + glUniform1i(textureLocation, 1); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, textures[NIGHT]); - mat4 modelView; - identity(&modelView); - multiply(&modelView, &modelTransformation, &modelView); - multiply(&modelView, &viewingTransformation, &modelView); + textureLocation = glGetUniformLocation(program, "clouds"); + glUniform1i(textureLocation, 2); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, textures[CLOUDS]); - mat4 projection; - identity(&projection); - multiply(&projection, &projectionTransformation, &projection); - multiply(&projection, &normalisationTransformation, &projection); + textureLocation = glGetUniformLocation(program, "ocean"); + glUniform1i(textureLocation, 3); + glActiveTexture(GL_TEXTURE3); + glBindTexture(GL_TEXTURE_2D, textures[OCEAN]); - // calculate matrix for normals - mat3 normalModelView; - mat3From4(&normalModelView, &modelView); - mat3Inverse(&normalModelView, &normalModelView); - mat3Transpose(&normalModelView, &normalModelView); + textureLocation = glGetUniformLocation(program, "normalMap"); + glUniform1i(textureLocation, 4); + glActiveTexture(GL_TEXTURE4); + glBindTexture(GL_TEXTURE_2D, textures[NORMAL]); - // send transformation matrix to shader - glUniformMatrix4fv(glGetUniformLocation(program, "modelView"), 1, GL_FALSE, (GLfloat*)&modelView); - glUniformMatrix3fv(glGetUniformLocation(program, "normalModelView"), 1, GL_FALSE, (GLfloat*)&normalModelView); - glUniformMatrix4fv(glGetUniformLocation(program, "projection"), 1, GL_FALSE, (GLfloat*)&projection); - - - //vec4 lightPosition = {cos(stepi) * 1000.0f, 0.0f, sin(stepi) * 1000.0f, 1.0f}; - //multiplyAny((GLfloat *)&lightPosition, (GLfloat *)&viewingTransformation, (GLfloat *)&lightPosition, 4, 4, 1); - - //glUniform3f(glGetUniformLocation(program, "lightPosition"), lightPosition.x, lightPosition.y, lightPosition.z); - - - // SET MATERIAL DATA - glUniform1f(glGetUniformLocation(program, "shininess"), 60.0f * 4.0f); - - // SET LIGHT DATA - glUniform4f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f, 1.0f); - glUniform4f(glGetUniformLocation(program, "ambientLight"), 0.05f, 0.05f, 0.05f, 1.0f); - - - // BIND TEXTURES - GLuint textureLocation; - textureLocation = glGetUniformLocation(program, "day"); - glUniform1i(textureLocation, 0); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, textures[DAY]); - - textureLocation = glGetUniformLocation(program, "night"); - glUniform1i(textureLocation, 1); - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, textures[NIGHT]); - - textureLocation = glGetUniformLocation(program, "clouds"); - glUniform1i(textureLocation, 2); - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, textures[CLOUDS]); - - textureLocation = glGetUniformLocation(program, "ocean"); - glUniform1i(textureLocation, 3); - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_2D, textures[OCEAN]); - - textureLocation = glGetUniformLocation(program, "normalMap"); - glUniform1i(textureLocation, 4); - glActiveTexture(GL_TEXTURE4); - glBindTexture(GL_TEXTURE_2D, textures[NORMAL]); - - - // draw!!1 - for (int i = 0; i < numObj; i++) - { - glBindVertexArray(vao[i]); - glDrawArrays(GL_TRIANGLES, 0, objectData[i].numFaces * 3); - } + // draw each object separately + glBindVertexArray(objectData[i].vao); + glDrawArrays(GL_TRIANGLES, 0, objectData[i].numFaces * 3); + } } // change viewport size and adjust aspect ratio when changing window size void framebuffer_size_callback(GLFWwindow *window, int width, int height) { - glViewport(0, 0, width, height); - aspectRatio = (float)width / height; + glViewport(0, 0, width, height); + aspectRatio = (float)width / height; } int main(int argc, char **argv) { - // initialise window - glfwInit(); - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + // initialise window + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - window = glfwCreateWindow(700, 700, "Computergrafik 1", NULL, NULL); + window = glfwCreateWindow(700, 700, "Computergrafik 1", NULL, NULL); - if (!window) { - printf("Failed to create window\n"); - glfwTerminate(); - return -1; - } + if (!window) { + printf("Failed to create window\n"); + glfwTerminate(); + return -1; + } + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + glfwMakeContextCurrent(window); - glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - glfwMakeContextCurrent(window); + // disable framerate cap + glfwSwapInterval(0); - // disable framerate cap - glfwSwapInterval(0); + // register keyboard event handler + glfwSetKeyCallback(window, keyboardHandler); - // register keyboard event handler - glfwSetKeyCallback(window, keyboardHandler); + // initialise glew + glewInit(); - // initialise glew - glewInit(); + printf("OpenGL version supported by this platform (%s):\n", glGetString(GL_VERSION)); - printf("OpenGL version supported by this platform (%s):\n", glGetString(GL_VERSION)); + init(); - init(); + // exit when window should close or exit is requested (ESC) + while (!glfwWindowShouldClose(window) && !exitRequested) { + draw(); - // exit when window should close or exit is requested (ESC) - while (!glfwWindowShouldClose(window) && !exitRequested) { - draw(); + glfwSwapBuffers(window); + glfwPollEvents(); + } - glfwSwapBuffers(window); - glfwPollEvents(); - } + glfwTerminate(); - glfwTerminate(); - - return 0; -} \ No newline at end of file + return 0; +} diff --git a/src/objectHandler.c b/src/objectHandler.c index 3fb5cb0..5badac0 100644 --- a/src/objectHandler.c +++ b/src/objectHandler.c @@ -5,10 +5,11 @@ GLuint vao[2]; int numObj = 0; -typedef struct ObjectData -{ +typedef struct { + GLuint vao; + GLuint vbo; + int numFaces; ParsedObjFile object; - int numFaces; } ObjectData; void load_object(ParsedObjFile* object) { @@ -86,7 +87,8 @@ ObjectData* readObjFiles(char** path, int numModels) { for (int i = 0; i < numModels; ++i) { objects[i].object = readObjFile(path[i]); objects[i].numFaces = objects[i].object.length; // Assuming .length gives the number of faces - load_object(&objects[i].object); + objects[i].vbo = + load_object(&objects[i].object); } return objects;