X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=main.cpp;h=003723704f39485a8f84184292a45634ffba1aad;hp=4c9171ab71a63c726e19996252e402b4e24949e1;hb=b64cd5a5ec09e6f051583371045ef7080c69b776;hpb=da829a43b9ab76ce8830bd83760e59f016787727 diff --git a/main.cpp b/main.cpp index 4c9171a..0037237 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,24 +22,25 @@ using namespace std; GLuint pyramidVao, lightVao, teapotVao; -GLuint gradientProgId, solidProgId, normalProgId; +GLuint gradientProgId, plainProgId, normalProgId, solidProgId; glm::vec3 camPos = glm::vec3(0.0f, 0.0f, -10.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; 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) { @@ -50,15 +52,15 @@ void setLightColorAndPos(GLuint progId, glm::vec3 lightPos, glm::vec4 lightColor } 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)); @@ -107,8 +109,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 +118,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 +132,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; } @@ -157,23 +159,40 @@ void display() { glm::vec4 lightColor(1, 1, 1, 1); glViewport(0, 0, WIDTH, HEIGHT); - drawPyramids(d, lightPos, lightColor); + /* drawPyramids(d, lightPos, lightColor); */ drawLight(d, lightPos, lightColor); - drawTeapot(teapotCamera, false, d, lightPos, lightColor); - glClear(GL_DEPTH_BUFFER_BIT); + glUseProgram(solidProgId); + setProjectionAndViewUniforms(solidProgId); + setLightColorAndPos(solidProgId, lightPos, lightColor); + GLuint colorLoc = glGetUniformLocation(solidProgId, "color"); + glm::vec4 c(1.f, 0, 1.f, 1.f); + glUniform4fv(colorLoc, 1, glm::value_ptr(c)); + GLuint modelLoc = glGetUniformLocation(solidProgId, "model"); + glm::mat4 model(1); + model = glm::scale(model, glm::vec3(2.0)); + glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); + monkeyHead->draw(); + model = glm::translate(model, glm::vec3(3, 0, 0)); + glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); + chest->draw(); + + /* drawTeapot(teapotCamera, false, d, lightPos, lightColor); */ - glViewport(0, 0, WIDTH / 4, HEIGHT / 4); - drawTeapot(teapotOrtho, false, d, lightPos, lightColor); + /* glClear(GL_DEPTH_BUFFER_BIT); */ - glViewport(WIDTH / 4, 0, WIDTH / 4, HEIGHT / 4); - drawTeapot(teapotOrtho, true, d, lightPos, lightColor); + /* glViewport(0, 0, WIDTH / 4, HEIGHT / 4); */ + /* drawTeapot(teapotOrtho, false, d, lightPos, lightColor); */ - glViewport(WIDTH / 4 * 2, 0, WIDTH / 4, HEIGHT / 4); - drawTeapot(teapotPerspStatic, false, d, lightPos, lightColor); + /* glViewport(WIDTH / 4, 0, WIDTH / 4, HEIGHT / 4); */ + /* drawTeapot(teapotOrtho, true, d, lightPos, lightColor); */ + + /* glViewport(WIDTH / 4 * 2, 0, WIDTH / 4, HEIGHT / 4); */ + /* drawTeapot(teapotPerspStatic, false, d, lightPos, lightColor); */ + + /* glViewport(WIDTH / 4 * 3, 0, WIDTH / 4, HEIGHT / 4); */ + /* drawTeapot(teapotPerspAnimated, false, d, lightPos, lightColor); */ - glViewport(WIDTH / 4 * 3, 0, WIDTH / 4, HEIGHT / 4); - drawTeapot(teapotPerspAnimated, false, d, lightPos, lightColor); glutSwapBuffers(); } @@ -452,23 +471,30 @@ 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); + + monkeyHead = new Model("monkeyhead_smooth.dae", solidProgId); + chest = new Model("chest.obj", solidProgId); + glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); + /* glEnable(GL_CULL_FACE); */ } bool* keyStates = new bool[256];