aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c287
1 files changed, 84 insertions, 203 deletions
diff --git a/src/main.c b/src/main.c
index 531a1df..01ac661 100644
--- a/src/main.c
+++ b/src/main.c
@@ -10,11 +10,12 @@
#include <GLFW/glfw3.h>
#define STB_IMAGE_IMPLEMENTATION
-#include <stb_image.h>
+#include "../include/stb_image.h"
#include "main.h"
#include "linear.h"
#include "shader.h"
+#include "obj.h"
struct Camera {
Vec3 position;
@@ -22,55 +23,15 @@ struct Camera {
Vec3 up;
};
-float vertices[] = {
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
-
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
- 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
- -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
- -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
-};
-
static void userError(const char *msg, const char *detail);
static void glfw_size_callback(GLFWwindow *window, int width, int height);
static void processInput(GLFWwindow *window);
static Mat4 processCameraInput(GLFWwindow *window, struct Camera *cameraObj, float deltaTime);
static unsigned int loadTexture(char const *path);
+static void meshSetUp(Mesh *mesh);
+static void meshDraw(unsigned int shader, Mesh mesh);
+
+static float cameraSpeed = 2.0;
void
userError(const char *msg, const char *detail)
@@ -107,7 +68,11 @@ processCameraInput(GLFWwindow *window, struct Camera *camObj, float deltaTime)
* Keyboard Input
*/
Vec3 tmp;
- float speed = 2.0f * deltaTime;
+ float speed = cameraSpeed * deltaTime;
+
+ if (glfwGetKey(window, GLFW_KEY_K)) cameraSpeed += 0.2;
+ if (glfwGetKey(window, GLFW_KEY_J)) cameraSpeed -= 0.2;
+
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
// pos = pos + front * speed
tmp = linearVec3ScalarMulp(camObj->front, speed);
@@ -213,11 +178,57 @@ loadTexture(char const *path)
return textureID;
}
-int main()
+
+void
+meshSetUp(Mesh *mesh)
{
+ glGenVertexArrays(1, &(mesh->VAO));
+ glGenBuffers(1, &(mesh->VBO));
+ glGenBuffers(1, &(mesh->EBO));
+
+ glBindVertexArray(mesh->VAO);
+
+ glBindBuffer(GL_ARRAY_BUFFER, mesh->VBO);
+ glBufferData(GL_ARRAY_BUFFER, mesh->vertexSize * sizeof(Vertex), mesh->vertices, GL_STATIC_DRAW);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->EBO);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, mesh->indexSize * sizeof(int), mesh->indices, GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)0);
+
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *)offsetof(Vertex, normal));
+
+ glEnableVertexAttribArray(2);
+ glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void *)offsetof(Vertex, texCoords));
+
+ glBindVertexArray(0);
+}
+
+void
+meshDraw(unsigned int shader, Mesh mesh)
+{
+ glBindVertexArray(mesh.VAO);
+ glDrawElements(GL_TRIANGLES, mesh.indexSize, GL_UNSIGNED_INT, 0);
+ glBindVertexArray(0);
+}
+
+int main(int argc, char *argv[])
+{
+ Mesh *mesh;
GLFWwindow *window;
const char *glfwErrno;
+ if (argc == 2) mesh = objCreateMesh(argv[1]);
+ else if (argc == 1) mesh = objCreateMesh("-");
+ else return 1;
+
+ if (mesh == NULL) {
+ glfwTerminate();
+ userError("objCreateMesh Error", "NULL mesh returned");
+ }
+
if (!glfwInit()) {
glfwGetError(&glfwErrno);
glfwTerminate();
@@ -227,7 +238,7 @@ int main()
window = glfwCreateWindow(640, 480, "Mverse", NULL, NULL);
if (!window) {
glfwTerminate();
- userError("glfwCreateWindow() failed", "Can't create window");
+ userError("glfwCreateWindow() Error", "Can't create window");
}
glfwSetFramebufferSizeCallback(window, glfw_size_callback);
@@ -237,189 +248,59 @@ int main()
GLubyte glewErrno = glewInit();
if (glewErrno != GLEW_OK) {
glfwTerminate();
- userError("glewInit() failed", (const char *)glewGetErrorString(glewErrno));
+ userError("glewInit Error", (const char *)glewGetErrorString(glewErrno));
}
- glEnable(GL_DEPTH_TEST);
- stbi_set_flip_vertically_on_load(1);
-
- unsigned int programColor = shaderCreateProgram("shaders/color.vsh",
- "shaders/color.fsh");
- unsigned int programLight = shaderCreateProgram("shaders/lightsource.vsh",
- "shaders/lightsource.fsh");
- unsigned int VBO, VAO, lightVAO;
- int vertexSize = 8;
-
- glGenVertexArrays(1, &VAO);
- glGenBuffers(1, &VBO);
-
- glBindBuffer(GL_ARRAY_BUFFER, VBO);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- glBindVertexArray(VAO);
-
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertexSize * sizeof(float), (void *)0);
- glEnableVertexAttribArray(0);
-
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertexSize * sizeof(float), (void *)(3 * sizeof(float)));
- glEnableVertexAttribArray(1);
-
- glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, vertexSize * sizeof(float), (void *)(6 * sizeof(float)));
- glEnableVertexAttribArray(2);
-
- glBindVertexArray(lightVAO);
-
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertexSize * sizeof(float), (void *)0);
- glEnableVertexAttribArray(0);
-
- unsigned int diffuseMap = loadTexture("textures/container2.png");
- unsigned int specularMap = loadTexture("textures/container2_specular.png");
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindVertexArray(0);
+ unsigned int shader = shaderCreateProgram("shaders/dummy.vsh", "shaders/dummy.fsh");
- /*============ Initializations ===============*/
-
- Vec3 cubePositions[] = {
- linearVec3( 0.5f, 0.0f, 0.0f),
- linearVec3( 2.0f, 5.0f, -15.0f),
- linearVec3(-1.5f, -2.2f, -2.5f),
- linearVec3(-3.8f, -2.0f, -12.3f),
- linearVec3( 2.4f, -0.4f, -3.5f),
- linearVec3(-1.7f, 3.0f, -7.5f),
- linearVec3( 1.3f, -2.0f, -2.5f),
- linearVec3( 1.5f, 2.0f, -2.5f),
- linearVec3( 1.5f, 0.2f, -1.5f),
- linearVec3(-1.3f, 1.0f, -1.5f)
- };
-
- Vec3 pointLightsPos[4] = {
- linearVec3(0.7f, 0.2f, 2.0f),
- linearVec3(2.3f, -3.3f, -4.0f),
- linearVec3(-4.0f, 2.0f, -12.0f),
- linearVec3(0.0f, 0.0f, -3.0f),
- };
+ meshSetUp(mesh);
struct Camera mainCamera;
- mainCamera.position = linearVec3(0.0, 0.0, 3.0);
+ mainCamera.position = linearVec3(0.0, 0.0, 10.0);
mainCamera.front = linearVec3(0.0, 0.0, -1.0);
mainCamera.up = linearVec3(0.0, 1.0, 0.0);
Mat4 model, view, proj;
Mat4 T, S, R;
-
- Vec3 dirLight = linearVec3(-0.2, -1.0, 0.3);
- Vec3 ambient = linearVec3(0.0, 0.0, 0.0);
- Vec3 diffuse = linearVec3(0.5, 0.5, 0.5);
- Vec3 specular = linearVec3(1.0, 1.0, 1.0);
- float dt, t, t0;
+ float t, t0, dt;
int width, height;
t0 = 0;
+
+ glEnable(GL_DEPTH_TEST);
while (!glfwWindowShouldClose(window)) {
processInput(window);
-
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glfwGetWindowSize(window, &width, &height);
- /* -------------------
- * frame calculations
- * ------------------*/
t = (float)glfwGetTime();
dt = t - t0;
t0 = t;
-
view = processCameraInput(window, &mainCamera, dt);
- glfwGetWindowSize(window, &width, &height);
proj = linearPerspective(35, (float)width / height, 0.1, 100);
+ T = linearTranslate(0.0, 0.0, 0.0);
+ R = linearRotate(0, 1.0, 0.0, 0.0);
+ S = linearScale(0.6, 0.6, 0.6);
+ model = linearMat4Muln(3, T, R, S);
- glUseProgram(programColor);
-
- float constant = 1.0;
- float linear = 0.09;
- float quadratic = 0.032f;
-
- shaderSetfv(programColor, "dirLight.direction", dirLight.vector, glUniform3fv);
- shaderSetfv(programColor, "dirLight.ambient", ambient.vector, glUniform3fv);
- shaderSetfv(programColor, "dirLight.diffuse", diffuse.vector, glUniform3fv);
- shaderSetfv(programColor, "dirLight.specular", vec3(1.0, 1.0, 1.0), glUniform3fv);
-
- char varNames[7][50];
- for (int i = 0; i < 4; i++) {
- sprintf(varNames[0], "pointLight[%d].position", i);
- sprintf(varNames[1], "pointLight[%d].ambient", i);
- sprintf(varNames[2], "pointLight[%d].diffuse", i);
- sprintf(varNames[3], "pointLight[%d].specular", i);
- sprintf(varNames[4], "pointLight[%d].constant", i);
- sprintf(varNames[5], "pointLight[%d].linear", i);
- sprintf(varNames[6], "pointLight[%d].quadratic", i);
-
- shaderSetfv(programColor, varNames[0], pointLightsPos[i].vector, glUniform3fv);
- shaderSetfv(programColor, varNames[1], ambient.vector, glUniform3fv);
- shaderSetfv(programColor, varNames[2], diffuse.vector, glUniform3fv);
- shaderSetfv(programColor, varNames[3], specular.vector, glUniform3fv);
- shaderSet1f(programColor, varNames[4], constant);
- shaderSet1f(programColor, varNames[5], linear);
- shaderSet1f(programColor, varNames[6], quadratic);
- }
-
- shaderSetfv(programColor, "flashLight.position", mainCamera.position.vector, glUniform3fv);
- shaderSetfv(programColor, "flashLight.direction", mainCamera.front.vector, glUniform3fv);
- shaderSetfv(programColor, "flashLight.ambient", ambient.vector, glUniform3fv);
- shaderSetfv(programColor, "flashLight.diffuse", vec3(0.8, 0.5, 0.5), glUniform3fv);
- shaderSetfv(programColor, "flashLight.specular", vec3(1.0, 0.0, 0.0), glUniform3fv);
- shaderSet1f(programColor, "flashLight.constant", constant);
- shaderSet1f(programColor, "flashLight.linear", linear);
- shaderSet1f(programColor, "flashLight.quadratic", quadratic);
- shaderSet1f(programColor, "flashLight.cutOff", cosf(12.5f * M_PI / 180));
- shaderSet1f(programColor, "flashLight.outerCutOff", cosf(17.5f * M_PI / 180));
-
- shaderSetfv(programColor, "viewPos", mainCamera.position.vector, glUniform3fv);
- shaderSetfv(programColor, "material.specular", vec3(0.5, 0.5, 0.5), glUniform3fv);
- shaderSet1f(programColor, "material.shininess", 64.0f);
- shaderSet1i(programColor, "material.diffuse", 0);
- shaderSet1i(programColor, "material.specular", 1);
-
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, diffuseMap);
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, specularMap);
-
- shaderSetMatrixfv(programColor, "view", view.matrix[0], glUniformMatrix4fv);
- shaderSetMatrixfv(programColor, "proj", proj.matrix[0], glUniformMatrix4fv);
- for (int i = 0; i < 10; i++) {
- // World Transformation
- // --------------------
- T = linearTranslatev(cubePositions[i]);
- R = linearRotate(180 * i / M_PI, 1.0, 0.3, 0.5);
- S = linearScale(1.0, 1.0, 1.0);
- model = linearMat4Muln(3, T, R, S);
- shaderSetMatrixfv(programColor, "model", model.matrix[0], glUniformMatrix4fv);
- shaderSetMatrixfv(programColor, "rotNormals", R.matrix[0], glUniformMatrix4fv);
-
- glBindVertexArray(VAO);
- glDrawArrays(GL_TRIANGLES, 0, sizeof(vertices) / sizeof(float));
- }
-
- /* -----------------
- * Light Source
- * -----------------*/
- for (int i = 0; i < 4; i++) {
- model = linearMat4Mul(linearTranslatev(pointLightsPos[i]),
- linearScale(0.2, 0.2, 0.2));
- glUseProgram(programLight);
- glBindVertexArray(lightVAO);
-
- shaderSetMatrixfv(programColor, "model", model.matrix[0], glUniformMatrix4fv);
- shaderSetMatrixfv(programColor, "view", view.matrix[0], glUniformMatrix4fv);
- shaderSetMatrixfv(programColor, "proj", proj.matrix[0], glUniformMatrix4fv);
- glDrawArrays(GL_TRIANGLES, 0, sizeof(vertices) / sizeof(float));
- }
+ glUseProgram(shader);
+
+ shaderSetMatrixfv(shader, "model", model.matrix[0], glUniformMatrix4fv);
+ shaderSetMatrixfv(shader, "proj", proj.matrix[0], glUniformMatrix4fv);
+ shaderSetMatrixfv(shader, "view", view.matrix[0], glUniformMatrix4fv);
+ shaderSetMatrixfv(shader, "rotNormals", R.matrix[0], glUniformMatrix4fv);
+
+ meshDraw(shader, mesh[0]);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
+
+ free(mesh->vertices);
+ free(mesh->indices);
+ free(mesh);
return 0;
}
Feel free to download, copy and edit any repo