Merge branch 'multiple-objects'

This commit is contained in:
Luca Conte 2024-06-10 11:13:34 +02:00
commit 3db8817187
6 changed files with 605 additions and 333 deletions

40
obj/Xblock.obj Normal file
View File

@ -0,0 +1,40 @@
# Blender 4.1.1
# www.blender.org
mtllib Xblock.mtl
o Cube
v 1.740000 0.130000 -0.150000
v 1.740000 -0.130000 -0.150000
v 1.740000 0.130000 0.150000
v 1.740000 -0.130000 0.150000
v -1.740000 0.130000 -0.150000
v -1.740000 -0.130000 -0.150000
v -1.740000 0.130000 0.150000
v -1.740000 -0.130000 0.150000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vt 0.625000 0.500000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.125000 0.500000
vt 0.375000 0.500000
vt 0.125000 0.750000
s 0
usemtl Material
f 1/1/1 5/2/1 7/3/1 3/4/1
f 4/5/2 3/4/2 7/6/2 8/7/2
f 8/8/3 7/9/3 5/10/3 6/11/3
f 6/12/4 2/13/4 4/5/4 8/14/4
f 2/13/5 1/1/5 3/4/5 4/5/5
f 6/11/6 5/10/6 1/1/6 2/13/6

40
obj/Yblock.obj Normal file
View File

@ -0,0 +1,40 @@
# Blender 4.1.1
# www.blender.org
mtllib Yblock.mtl
o Cube
v 0.230000 0.130000 -1.230000
v 0.230000 -0.130000 -1.230000
v 0.230000 0.130000 1.230000
v 0.230000 -0.130000 1.230000
v -0.230000 0.130000 -1.230000
v -0.230000 -0.130000 -1.230000
v -0.230000 0.130000 1.230000
v -0.230000 -0.130000 1.230000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vt 0.625000 0.500000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.125000 0.500000
vt 0.375000 0.500000
vt 0.125000 0.750000
s 0
usemtl Material
f 1/1/1 5/2/1 7/3/1 3/4/1
f 4/5/2 3/4/2 7/6/2 8/7/2
f 8/8/3 7/9/3 5/10/3 6/11/3
f 6/12/4 2/13/4 4/5/4 8/14/4
f 2/13/5 1/1/5 3/4/5 4/5/5
f 6/11/6 5/10/6 1/1/6 2/13/6

40
obj/Yblock_rotated.obj Normal file
View File

@ -0,0 +1,40 @@
# Blender 4.1.1
# www.blender.org
mtllib Yblock_rotated.mtl
o Cube
v 1.231565 1.164580 -0.150000
v 1.395188 0.962522 -0.150000
v 1.231565 1.164580 0.150000
v 1.395188 0.962522 0.150000
v -1.395188 -0.962522 -0.150000
v -1.231565 -1.164580 -0.150000
v -1.395188 -0.962522 0.150000
v -1.231565 -1.164580 0.150000
vn -0.6293 0.7771 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.7771 -0.6293 -0.0000
vn 0.6293 -0.7771 -0.0000
vn 0.7771 0.6293 -0.0000
vn -0.0000 -0.0000 -1.0000
vt 0.625000 0.500000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.125000 0.500000
vt 0.375000 0.500000
vt 0.125000 0.750000
s 0
usemtl Material
f 1/1/1 5/2/1 7/3/1 3/4/1
f 4/5/2 3/4/2 7/6/2 8/7/2
f 8/8/3 7/9/3 5/10/3 6/11/3
f 6/12/4 2/13/4 4/5/4 8/14/4
f 2/13/5 1/1/5 3/4/5 4/5/5
f 6/11/6 5/10/6 1/1/6 2/13/6

40
obj/Zblock.obj Normal file
View File

@ -0,0 +1,40 @@
# Blender 4.1.1
# www.blender.org
mtllib Zblock.mtl
o Cube
v 0.280000 1.000000 -0.170000
v 0.280000 -1.000000 -0.170000
v 0.280000 1.000000 0.170000
v 0.280000 -1.000000 0.170000
v -0.280000 1.000000 -0.170000
v -0.280000 -1.000000 -0.170000
v -0.280000 1.000000 0.170000
v -0.280000 -1.000000 0.170000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vt 0.625000 0.500000
vt 0.875000 0.500000
vt 0.875000 0.750000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.125000 0.500000
vt 0.375000 0.500000
vt 0.125000 0.750000
s 0
usemtl Material
f 1/1/1 5/2/1 7/3/1 3/4/1
f 4/5/2 3/4/2 7/6/2 8/7/2
f 8/8/3 7/9/3 5/10/3 6/11/3
f 6/12/4 2/13/4 4/5/4 8/14/4
f 2/13/5 1/1/5 3/4/5 4/5/5
f 6/11/6 5/10/6 1/1/6 2/13/6

View File

@ -5,7 +5,7 @@
#include "vertexShader.c" #include "vertexShader.c"
#include "fragmentShader.c" #include "fragmentShader.c"
#include "objectHandler.c"
#include "matrixMath.h" #include "matrixMath.h"
#include "transformation.h" #include "transformation.h"
#include "wavefrontobj.h" #include "wavefrontobj.h"
@ -19,7 +19,6 @@
#include <stdbool.h> #include <stdbool.h>
GLuint program; GLuint program;
GLuint vao;
#define NUM_TEXTURES 5 #define NUM_TEXTURES 5
@ -40,7 +39,7 @@ char* textureFiles[NUM_TEXTURES] = {
"../texture/earth/normal.png" "../texture/earth/normal.png"
}; };
int numFaces = 0; ObjectData* objectData;
bool exitRequested = false; bool exitRequested = false;
@ -57,11 +56,20 @@ GLfloat step = 0.0f;
const GLfloat pi = 3.14159f; const GLfloat pi = 3.14159f;
vec3 cameraPosition = {0.0f, 3.0f, 5.5f}; vec3 cameraPosition = {0.0f, 3.0f, 5.5f};
vec3 objectPosition = {0.0f, 0.0f, 0.0f};
GLfloat radius = 1.0f;
char* defaultModel = "../obj/monkey.obj"; int numModels = 0;
char* model; char* models[] = {
"../obj/Xblock.obj",
"../obj/Yblock.obj",
"../obj/Yblock_rotated.obj",
"../obj/Zblock.obj",
};
// input handler for camera movement /**
* Input handler for camera movement.
* */
void handleInputs(double deltaTime) { void handleInputs(double deltaTime) {
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
cameraPosition.z += deltaTime * 10; cameraPosition.z += deltaTime * 10;
@ -69,18 +77,37 @@ void handleInputs(double deltaTime) {
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
cameraPosition.z -= deltaTime * 10; cameraPosition.z -= deltaTime * 10;
} }
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) { if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {
cameraPosition.x += deltaTime * 10; cameraPosition.x += deltaTime * 10;
} }
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) { if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
cameraPosition.x -= deltaTime * 10; cameraPosition.x -= deltaTime * 10;
} }
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { if (glfwGetKey(window, GLFW_KEY_F) == GLFW_PRESS) {
cameraPosition.y += deltaTime * 10; cameraPosition.y += deltaTime * 10;
} }
if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) { if (glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS) {
cameraPosition.y -= deltaTime * 10; cameraPosition.y -= deltaTime * 10;
} }
if (glfwGetKey(window, GLFW_KEY_L) == GLFW_PRESS) {
objectPosition.x += deltaTime * 10;
}
if (glfwGetKey(window, GLFW_KEY_J) == GLFW_PRESS) {
objectPosition.x -= deltaTime * 10;
}
if (glfwGetKey(window, GLFW_KEY_I) == GLFW_PRESS) {
objectPosition.z += deltaTime * 10;
}
if (glfwGetKey(window, GLFW_KEY_K) == GLFW_PRESS) {
objectPosition.z -= deltaTime * 10;
}
if (glfwGetKey(window, GLFW_KEY_O) == GLFW_PRESS) {
radius += deltaTime * 10;
}
if (glfwGetKey(window, GLFW_KEY_U) == GLFW_PRESS) {
radius -= deltaTime * 10;
}
} }
// input handler to quit with ESC // input handler to quit with ESC
@ -92,6 +119,9 @@ void keyboardHandler(GLFWwindow* window, int key, int scancode, int action, int
} }
} }
/**
* Loads textures.
*/
void loadTexture(char* textureFile, GLuint* texture) { void loadTexture(char* textureFile, GLuint* texture) {
int width, height, nrChannels; int width, height, nrChannels;
unsigned char* image = stbi_load(textureFile, &width, &height, &nrChannels, 0); unsigned char* image = stbi_load(textureFile, &width, &height, &nrChannels, 0);
@ -142,10 +172,7 @@ void init(void) {
vertexTextConst = NULL; vertexTextConst = NULL;
// create and compile fragment shader // create and compile fragment shader
const GLchar *fragmentTextConst = fragmentShader_glsl; const GLchar *fragmentTextConst = fragmentShader_glsl;
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
@ -191,17 +218,36 @@ void init(void) {
} }
// --------------- READ MODEL FILE // --------------- READ MODEL FILES
ParsedObjFile teapot = readObjFile(model);
numFaces = teapot.length;
// write faces to buffer //objectData = readObjFiles(&models, numModels);
GLuint triangleVertexBufferObject; char* c = "../obj/Yblock.obj";
glGenBuffers(1, &triangleVertexBufferObject); objectData = readSingleObjFile(&c, 10, &numModels);
glBindBuffer(GL_ARRAY_BUFFER, triangleVertexBufferObject); printf("\nAmount %d\n", numModels);
glBufferData(GL_ARRAY_BUFFER, teapot.length * sizeof(face), teapot.faces, GL_STATIC_DRAW); fflush(stdout);
glBindBuffer(GL_ARRAY_BUFFER, 0); /*
objectData = malloc(numModels * sizeof(ObjectData));
for (int i = 0; i < numModels; i++) {
glGenVertexArrays(1, &objData->vao);
glGenBuffers(1, &objData->vbo);
glBindVertexArray(objData->vao);
glBindBuffer(GL_ARRAY_BUFFER, objData->vbo);
glBufferData(GL_ARRAY_BUFFER, objData->object.numFaces * 3 * sizeof(Vertex), objData->object.vertices, GL_STATIC_DRAW);
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);
objectData[i] = objData;
}
*/
stbi_set_flip_vertically_on_load(flipFlag); stbi_set_flip_vertically_on_load(flipFlag);
// -------------- READ TEXTURE FILES // -------------- READ TEXTURE FILES
@ -209,60 +255,6 @@ void init(void) {
loadTexture(textureFiles[i], &textures[i]); loadTexture(textureFiles[i], &textures[i]);
} }
// create vertex array object
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, triangleVertexBufferObject);
// vertex positions
glVertexAttribPointer(
0,
3,
GL_FLOAT,
GL_FALSE,
sizeof(vertex),
0
);
glEnableVertexAttribArray(0);
// vertex normals
glVertexAttribPointer(
1,
3,
GL_FLOAT,
GL_FALSE,
sizeof(vertex),
(void*) offsetof(vertex, normal)
);
glEnableVertexAttribArray(1);
// vertex texture coordinates
glVertexAttribPointer(
2,
2,
GL_FLOAT,
GL_FALSE,
sizeof(vertex),
(void*) offsetof(vertex, texture)
);
glEnableVertexAttribArray(2);
// face tangents
glVertexAttribPointer(
3,
3,
GL_FLOAT,
GL_FALSE,
sizeof(vertex),
(void*) offsetof(vertex, tangent)
);
glEnableVertexAttribArray(3);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
// ENABLE BACKFACE CULLING // ENABLE BACKFACE CULLING
glFrontFace(GL_CCW); glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
@ -279,6 +271,9 @@ void updateStats() {
fflush(stdout); fflush(stdout);
} }
/**
* Main draw function.
*/
void draw(void) { void draw(void) {
// FPS Counter // FPS Counter
@ -298,7 +293,6 @@ void draw(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(program); glUseProgram(program);
glBindVertexArray(vao);
// step for rotations // step for rotations
// counts up to 1.0 and then resets back to 0.0 forever // counts up to 1.0 and then resets back to 0.0 forever
@ -309,16 +303,6 @@ void draw(void) {
// step multiplied by pi * 2 for use in rotation and trig functions // step multiplied by pi * 2 for use in rotation and trig functions
GLfloat stepi = step * pi * 2; GLfloat stepi = step * pi * 2;
// ------------- MODEL TRANSFORMATION ---------------------
// SCALE -> ROTATE -> TRANSLATE
mat4 modelTransformation;
identity(&modelTransformation);
rotateY(&modelTransformation, &modelTransformation, stepi * 2);
rotateZ(&modelTransformation, &modelTransformation, -23.5f / 180 * pi);
// ------------- VIEWING TRANSFORMATION ------------------- // ------------- VIEWING TRANSFORMATION -------------------
vec3 origin = {0.0f, 0.0f, 0.0f}; vec3 origin = {0.0f, 0.0f, 0.0f};
vec3 up = {0.0f, 1.0f, 0.0f}; vec3 up = {0.0f, 1.0f, 0.0f};
@ -326,32 +310,42 @@ void draw(void) {
mat4 viewingTransformation; mat4 viewingTransformation;
lookAt(&viewingTransformation, &cameraPosition, &origin, &up); lookAt(&viewingTransformation, &cameraPosition, &origin, &up);
// -------------- PROJECTION TRANSFORMATION ---------------- // -------------- PROJECTION TRANSFORMATION ----------------
mat4 projectionTransformation; mat4 projectionTransformation;
GLfloat near = 0.1f; GLfloat near = 0.1f;
GLfloat far = 20.0f; GLfloat far = 20.0f;
perspectiveProjection(&projectionTransformation, near, far); perspectiveProjection(&projectionTransformation, near, far);
// -------------- NORMALISATION TRANSFORMATION ------------- // -------------- NORMALISATION TRANSFORMATION -------------
mat4 normalisationTransformation; mat4 normalisationTransformation;
GLfloat fovy = pi / 2; GLfloat fovy = pi / 2;
normalisedDeviceCoordinatesFov(&normalisationTransformation, fovy, aspectRatio, near, far); normalisedDeviceCoordinatesFov(&normalisationTransformation, fovy, aspectRatio, near, far);
mat4 projection;
identity(&projection);
multiply(&projection, &projectionTransformation, &projection);
multiply(&projection, &normalisationTransformation, &projection);
// ------------- DRAW EACH OBJECT SEPARATELY ----------------
for (int i = 0; i < numModels; i++) {
// Reset model transformation for each object
mat4 modelTransformation;
identity(&modelTransformation);
// Apply object-specific transformations
vec3 v = {
(GLfloat)i*2+objectPosition.x,
0.0f+objectPosition.y,
0.0f+objectPosition.z
};
translate(&modelTransformation, &modelTransformation, &v);
mat4 modelView; mat4 modelView;
identity(&modelView); identity(&modelView);
multiply(&modelView, &modelTransformation, &modelView); multiply(&modelView, &modelTransformation, &modelView);
multiply(&modelView, &viewingTransformation, &modelView); multiply(&modelView, &viewingTransformation, &modelView);
mat4 projection;
identity(&projection);
multiply(&projection, &projectionTransformation, &projection);
multiply(&projection, &normalisationTransformation, &projection);
// calculate matrix for normals // calculate matrix for normals
mat3 normalModelView; mat3 normalModelView;
mat3From4(&normalModelView, &modelView); mat3From4(&normalModelView, &modelView);
@ -363,13 +357,6 @@ void draw(void) {
glUniformMatrix3fv(glGetUniformLocation(program, "normalModelView"), 1, GL_FALSE, (GLfloat*)&normalModelView); glUniformMatrix3fv(glGetUniformLocation(program, "normalModelView"), 1, GL_FALSE, (GLfloat*)&normalModelView);
glUniformMatrix4fv(glGetUniformLocation(program, "projection"), 1, GL_FALSE, (GLfloat*)&projection); 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 // SET MATERIAL DATA
glUniform1f(glGetUniformLocation(program, "shininess"), 60.0f * 4.0f); glUniform1f(glGetUniformLocation(program, "shininess"), 60.0f * 4.0f);
@ -377,7 +364,6 @@ void draw(void) {
glUniform4f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f, 1.0f); glUniform4f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f, 1.0f);
glUniform4f(glGetUniformLocation(program, "ambientLight"), 0.05f, 0.05f, 0.05f, 1.0f); glUniform4f(glGetUniformLocation(program, "ambientLight"), 0.05f, 0.05f, 0.05f, 1.0f);
// BIND TEXTURES // BIND TEXTURES
GLuint textureLocation; GLuint textureLocation;
textureLocation = glGetUniformLocation(program, "day"); textureLocation = glGetUniformLocation(program, "day");
@ -405,24 +391,24 @@ void draw(void) {
glActiveTexture(GL_TEXTURE4); glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, textures[NORMAL]); glBindTexture(GL_TEXTURE_2D, textures[NORMAL]);
// draw each object separately
// draw!!1 glBindVertexArray(objectData[i].vao);
glDrawArrays(GL_TRIANGLES, 0, numFaces * 3); glDrawArrays(GL_TRIANGLES, 0, objectData[i].object.length * 3);
}
} }
// change viewport size and adjust aspect ratio when changing window size /**
* Changes viewport size and adjust aspect ratio when changing window size
*/
void framebuffer_size_callback(GLFWwindow *window, int width, int height) { void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
aspectRatio = (float)width / height; aspectRatio = (float)width / height;
} }
/**
* Main function.
*/
int main(int argc, char **argv) { int main(int argc, char **argv) {
if (argc >= 2) {
model = argv[1];
} else {
model = defaultModel;
}
// initialise window // initialise window
glfwInit(); glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
@ -437,7 +423,6 @@ int main(int argc, char **argv) {
return -1; return -1;
} }
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
glfwMakeContextCurrent(window); glfwMakeContextCurrent(window);
@ -453,7 +438,6 @@ int main(int argc, char **argv) {
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) // exit when window should close or exit is requested (ESC)
while (!glfwWindowShouldClose(window) && !exitRequested) { while (!glfwWindowShouldClose(window) && !exitRequested) {
draw(); draw();

128
src/objectHandler.c Normal file
View File

@ -0,0 +1,128 @@
#include "wavefrontobj.h"
#include <GL/glew.h>
#include <stdlib.h>
typedef struct {
GLuint vao;
GLuint vbo;
ParsedObjFile object;
} ObjectData;
/**
* Loads an object.
* Basically generates vbo and vao for an object and saving them in the ObjectData struct.
*/
void load_object(ObjectData* objectData) {
// write faces to buffer
//GLuint triangleVertexBufferObject;
glGenBuffers(1, &objectData->vbo);
glBindBuffer(GL_ARRAY_BUFFER, objectData->vbo);
glBufferData(GL_ARRAY_BUFFER, objectData->object.length * sizeof(face), objectData->object.faces, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// create vertex array object
glGenVertexArrays(1, &objectData->vao);
glBindVertexArray(objectData->vao);
glBindBuffer(GL_ARRAY_BUFFER, objectData->vao);
// vertex positions
glVertexAttribPointer(
0,
3,
GL_FLOAT,
GL_FALSE,
sizeof(vertex),
0
);
glEnableVertexAttribArray(0);
// vertex normals
glVertexAttribPointer(
1,
3,
GL_FLOAT,
GL_FALSE,
sizeof(vertex),
(void*) offsetof(vertex, normal)
);
glEnableVertexAttribArray(1);
// vertex texture coordinates
glVertexAttribPointer(
2,
2,
GL_FLOAT,
GL_FALSE,
sizeof(vertex),
(void*) offsetof(vertex, texture)
);
glEnableVertexAttribArray(2);
// face tangents
glVertexAttribPointer(
3,
3,
GL_FLOAT,
GL_FALSE,
sizeof(vertex),
(void*) offsetof(vertex, tangent)
);
glEnableVertexAttribArray(3);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
/**
* Takes a string-pointer, a number of files to read and a number to store the added objects to
* Returns an array of objects.
*/
ObjectData* readObjFiles(char** path, int numModels, int* count) {
ObjectData* objects = (ObjectData*) malloc(sizeof(ObjectData) * numModels);
*count += numModels;
if (!objects) {
printf("ERROR in objectHandler: Failed to allocate memory for objects\n");
return NULL;
}
for (int i = 0; i < numModels; ++i) {
objects[i].object = readObjFile(path[i]);
load_object(&objects[i]);
}
return objects;
}
/**
* Takes a single object and reads it a certain number of times.
* Returns an array of objects.
*/
ObjectData* readSingleObjFile(char** path, int numModels, int* count) {
ObjectData* objects = (ObjectData*) malloc(sizeof(ObjectData) * numModels);
*count += numModels;
if (!objects) {
printf("ERROR in objectHandler: Failed to allocate memory for objects\n");
fflush(stdout);
return NULL;
}
for (int i = 0; i < numModels; ++i) {
objects[i].object = readObjFile(*path);
load_object(&objects[i]);
*count++;
}
return objects;
}
/**
* Draw call for a single object.
* Used to clean up the draw calls in Main().
*/
void draw_object(ObjectData* objectData) {
glBindVertexArray(objectData->vao);
glDrawArrays(GL_TRIANGLES, 0, objectData->object.length * 3); // Annahme: Jedes face hat 3 vertices
glBindVertexArray(0);
}