X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=main.cpp;h=742c8983840eff62fbb68652ba0365fe2da0c72b;hp=4c9171ab71a63c726e19996252e402b4e24949e1;hb=85f8f7278f24fe73fef1a19174376b155319072f;hpb=da829a43b9ab76ce8830bd83760e59f016787727 diff --git a/main.cpp b/main.cpp index 4c9171a..742c898 100644 --- a/main.cpp +++ b/main.cpp @@ -14,6 +14,7 @@ #include #include #include +#include "model.hpp" #include "teapot.h" #pragma clang diagnostic ignored "-Wdeprecated-declarations" @@ -21,44 +22,49 @@ using namespace std; GLuint pyramidVao, lightVao, teapotVao; -GLuint gradientProgId, solidProgId, normalProgId; -glm::vec3 camPos = glm::vec3(0.0f, 0.0f, -10.0f); +GLuint gradientProgId, plainProgId, normalProgId, solidProgId, textureProgId; +glm::vec3 camPos = glm::vec3(0.0f, 0.0f, 0.0f); glm::vec3 camFront = glm::vec3(0.0f, 0.0f, 1.0f); glm::vec3 camUp = glm::vec3(0.0f, 1.0f, 0.0f); float yaw = 1.57, pitch = 0; bool doScale, doRotate, doTranslate; +Model *monkeyHead, *chest; +glm::vec3 lightPos(0); const int WIDTH = 800, HEIGHT = 600; const float ASPECT = (float)WIDTH / (float)HEIGHT; void setProjectionAndViewUniforms(GLuint progId) { - GLuint projId = glGetUniformLocation(progId, "projection"); + GLuint projLoc = glGetUniformLocation(progId, "projection"); glm::mat4 proj = glm::perspective(glm::radians(45.f), ASPECT, 0.01f, 10000.f); - glUniformMatrix4fv(projId, 1, GL_FALSE, glm::value_ptr(proj)); + glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(proj)); - GLuint viewId = glGetUniformLocation(progId, "view"); + GLuint viewLoc = glGetUniformLocation(progId, "view"); glm::mat4 view = glm::lookAt(camPos, camPos + camFront, camUp); - glUniformMatrix4fv(viewId, 1, GL_FALSE, glm::value_ptr(view)); + glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); } void setLightColorAndPos(GLuint progId, glm::vec3 lightPos, glm::vec4 lightColor) { GLuint lightColorLoc = glGetUniformLocation(progId, "lightColor"); glUniform4fv(lightColorLoc, 1, glm::value_ptr(lightColor)); - GLuint lightPosLoc = glGetUniformLocation(progId, "lightPos"); + GLuint lightPosLoc = glGetUniformLocation(progId, "vLightPos"); glUniform3fv(lightPosLoc, 1, glm::value_ptr(lightPos)); + + GLuint viewPosLoc = glGetUniformLocation(progId, "vViewPos"); + glUniform3fv(viewPosLoc, 1, glm::value_ptr(camPos)); } void drawLight(float d, glm::vec3 lightPos, glm::vec4 lightColor) { - glUseProgram(solidProgId); + glUseProgram(plainProgId); glBindVertexArray(lightVao); - setProjectionAndViewUniforms(solidProgId); + setProjectionAndViewUniforms(plainProgId); glm::mat4 model = glm::translate(glm::mat4(1.f), lightPos); model = glm::scale(model, glm::vec3(0.2)); - GLuint modelId = glGetUniformLocation(solidProgId, "model"); - glUniformMatrix4fv(modelId, 1, GL_FALSE, glm::value_ptr(model)); + GLuint modelLoc = glGetUniformLocation(plainProgId, "model"); + glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); - GLuint colorLoc = glGetUniformLocation(solidProgId, "color"); + GLuint colorLoc = glGetUniformLocation(plainProgId, "color"); glm::vec4 color(lightColor); glUniform4fv(colorLoc, 1, glm::value_ptr(color)); @@ -72,9 +78,6 @@ void drawPyramids(float d, glm::vec3 lightPos, glm::vec4 lightColor) { setLightColorAndPos(gradientProgId, lightPos, lightColor); - GLuint viewPosLoc = glGetUniformLocation(gradientProgId, "viewPos"); - glUniform3fv(viewPosLoc, 1, glm::value_ptr(camPos)); - GLuint modelId = glGetUniformLocation(gradientProgId, "model"); for (int i = 0; i < 10; i++) { @@ -107,8 +110,8 @@ enum TeapotProjection { teapotOrtho, teapotCamera, teapotPerspStatic, teapotPers void drawTeapot(TeapotProjection proj, bool rotate, float d, glm::vec3 lightPos, glm::vec4 lightColor) { glUseProgram(normalProgId); - GLuint projId = glGetUniformLocation(normalProgId, "projection"); - GLuint viewId = glGetUniformLocation(normalProgId, "view"); + GLuint projLoc = glGetUniformLocation(normalProgId, "projection"); + GLuint viewLoc = glGetUniformLocation(normalProgId, "view"); switch (proj) { case teapotCamera: setProjectionAndViewUniforms(normalProgId); @@ -116,11 +119,11 @@ void drawTeapot(TeapotProjection proj, bool rotate, float d, glm::vec3 lightPos, case teapotOrtho: { glm::mat4 proj = glm::ortho(-5.f * ASPECT, 5.f * ASPECT, -5.f, 5.f, 0.01f, 1000.f); - glUniformMatrix4fv(projId, 1, GL_FALSE, glm::value_ptr(proj)); + glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(proj)); glm::vec3 camPos(-5, 5, -5), camFront = glm::vec3(0) - camPos; glm::mat4 view = glm::lookAt(camPos, camPos + camFront, camUp); - glUniformMatrix4fv(viewId, 1, GL_FALSE, glm::value_ptr(view)); + glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); } break; case teapotPerspStatic: @@ -130,10 +133,10 @@ void drawTeapot(TeapotProjection proj, bool rotate, float d, glm::vec3 lightPos, if (proj == teapotPerspAnimated) fov += glm::radians(sin(d) * 30.f); glm::mat4 proj = glm::perspective(fov, ASPECT, 0.01f, 10000.f); - glUniformMatrix4fv(projId, 1, GL_FALSE, glm::value_ptr(proj)); + glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(proj)); glm::mat4 view = glm::lookAt(glm::vec3(0, 0, -10), glm::vec3(0), camUp); - glUniformMatrix4fv(viewId, 1, GL_FALSE, glm::value_ptr(view)); + glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); } break; } @@ -153,27 +156,33 @@ void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); float d = (float)glutGet(GLUT_ELAPSED_TIME) * 0.001f; - glm::vec3 lightPos = glm::vec3(sin(d) * 10, 0, cos(d) * 10); + /* glm::vec3 lightPos = glm::vec3(sin(d / 10.f) * 10, 0, cos(d / 10.f) * 10); */ glm::vec4 lightColor(1, 1, 1, 1); - glViewport(0, 0, WIDTH, HEIGHT); - drawPyramids(d, lightPos, lightColor); drawLight(d, lightPos, lightColor); - drawTeapot(teapotCamera, false, d, lightPos, lightColor); - glClear(GL_DEPTH_BUFFER_BIT); + glUseProgram(textureProgId); + setProjectionAndViewUniforms(textureProgId); + setLightColorAndPos(textureProgId, lightPos, lightColor); - glViewport(0, 0, WIDTH / 4, HEIGHT / 4); - drawTeapot(teapotOrtho, false, d, lightPos, lightColor); + Model::Node *top = chest->find("top"); + top->model = glm::translate(glm::mat4(1), glm::vec3(0, 1, -1)); + top->model = glm::rotate(top->model, sin(d / 2.5f) * 0.5f, glm::vec3(1, 0, 0)); + top->model = glm::translate(top->model, glm::vec3(0, -1, 1)); - glViewport(WIDTH / 4, 0, WIDTH / 4, HEIGHT / 4); - drawTeapot(teapotOrtho, true, d, lightPos, lightColor); + /* Model::Node *jewels = chest->find("jewels"); */ + /* jewels->model = glm::scale(glm::mat4(1), glm::vec3((sin(d) + 1.2f) / 2.f)); */ - glViewport(WIDTH / 4 * 2, 0, WIDTH / 4, HEIGHT / 4); - drawTeapot(teapotPerspStatic, false, d, lightPos, lightColor); + /* Model::Node *lock = chest->find("lock"); */ + /* lock->model = glm::translate(glm::mat4(1), glm::vec3(0.22610, 3.36478, -0.75649)); */ + /* lock->model = glm::rotate(lock->model, (d / 2.5f), glm::vec3(0, 1, 0.4)); */ + /* lock->model = glm::translate(lock->model, -glm::vec3(0.22610, 3.36478, -0.75649)); */ - glViewport(WIDTH / 4 * 3, 0, WIDTH / 4, HEIGHT / 4); - drawTeapot(teapotPerspAnimated, false, d, lightPos, lightColor); + /* Model::Node *key = chest->find("key"); */ + /* key->model = glm::translate(glm::mat4(1), glm::vec3(0, 0, sin(d))); */ + + /* chest->getRoot()->model = glm::translate(glm::mat4(1), lightPos); */ + chest->draw(); glutSwapBuffers(); } @@ -452,21 +461,32 @@ void init() { } } - gradientProgId = compileShaders((char*)"vertex.glsl", (char*)"fragment.glsl"); + gradientProgId = compileShaders((char*)"vertex.glsl", (char*)"gradientfrag.glsl"); glUseProgram(gradientProgId); pyramidVao = setupBuffers(vertices, normals, gradientProgId); validateProgram(gradientProgId); - solidProgId = compileShaders((char*)"solidvertex.glsl", (char*)"solidfrag.glsl"); - glUseProgram(solidProgId); - setupLightBuffers(solidProgId); - validateProgram(solidProgId); + plainProgId = compileShaders((char*)"plainvertex.glsl", (char*)"plainfrag.glsl"); + glUseProgram(plainProgId); + setupLightBuffers(plainProgId); + validateProgram(plainProgId); normalProgId = compileShaders((char*)"vertex.glsl", (char*)"normalfrag.glsl"); glUseProgram(normalProgId); setupTeapotBuffers(normalProgId); validateProgram(normalProgId); + solidProgId = compileShaders((char*)"vertex.glsl", (char*)"solidfrag.glsl"); + glUseProgram(solidProgId); + validateProgram(solidProgId); + + textureProgId = compileShaders((char*)"texturevertex.glsl", (char*)"texturefrag.glsl"); + glUseProgram(textureProgId); + validateProgram(textureProgId); + + monkeyHead = new Model("monkeyhead_smooth.dae", solidProgId); + chest = new Model("models/chest.dae", textureProgId); + glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); } @@ -502,6 +522,13 @@ void timer(int _) { if (keyStates['e']) ySpeed = -0.1f; + if (keyStates['j']) lightPos.z += 0.1f; + if (keyStates['k']) lightPos.z -= 0.1f; + if (keyStates['h']) lightPos.x -= 0.1f; + if (keyStates['l']) lightPos.x += 0.1f; + if (keyStates['m']) lightPos.y -= 0.1f; + if (keyStates['n']) lightPos.y += 0.1f; + camPos.x += xSpeed * sin(yaw) + zSpeed * cos(yaw); camPos.y += ySpeed; camPos.z += zSpeed * sin(yaw) - xSpeed * cos(yaw);