#include #include #include "utils.h" #include #include #include #include #include #include #include #include "Sphere.h" #include "Torus.h" #include "ImportedModel.h" #define numVAOs 1 #define numVBOs 11 GLuint renderingProgram; GLuint vao[numVAOs]; GLuint vbo[numVBOs]; glm::vec3 camera; GLuint globalAmbLoc,ambLoc,diffLoc,specLoc,lPosLoc,mAmbLoc,mDiffLoc,mSpecLoc,mShinLoc,mvLoc,projLoc,nLoc; int width, height; float aspect; glm::mat4 mMat, pMat, vMat, mvMat,invTrMat; glm::vec3 currentLightPos,lightPosV; std::arraylightPos; glm::vec3 initialLightLoc={0.0f,2.0f,4.0f}; float globalAmbient[4] = { 0.7f, 0.7f, 0.7f, 1.0f }; float lightAmbient[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; float lightDiffuse[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; float lightSpecular[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; float* matAmb = utils::goldAmbient(); float* matDif = utils::goldDiffuse(); float* matSpe = utils::goldSpecular(); float matShi = utils::goldShininess(); float* matAmb2 = utils::jadeAmbient(); float* matDif2 = utils::jadeDiffuse(); float* matSpe2 = utils::jadeSpecular(); float matShi2 = utils::jadeShininess(); std::stacktransforms; GLuint pyrTex; Sphere sphere(48); Torus torus(1.0,0.5,48); ImportedModel shuttle("StanfordDragon.obj"); void setupVertices(void) { glGenVertexArrays(1, vao); glBindVertexArray(vao[0]); glGenBuffers(numVBOs, vbo); std::vectorindices=sphere.getIndices(); std::vectorvertices=sphere.getVertices(); std::vectoruvs=sphere.getTexCoords(); std::vectornormals=sphere.getNormals(); std::vectorpvalues; std::vectortvalues; std::vectornvalues; for(int i=0;i0){ tvalues.push_back(uvs[i].s); tvalues.push_back(uvs[i].t); } nvalues.push_back(normals[i].x); nvalues.push_back(normals[i].y); nvalues.push_back(normals[i].z); } glBindBuffer(GL_ARRAY_BUFFER, vbo[8]); glBufferData(GL_ARRAY_BUFFER, pvalues.size()*sizeof(float), pvalues.data(), GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, vbo[9]); glBufferData(GL_ARRAY_BUFFER, tvalues.size()*sizeof(float), tvalues.data(),GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, vbo[10]); glBufferData(GL_ARRAY_BUFFER, nvalues.size()*sizeof(float), nvalues.data(), GL_STATIC_DRAW); } void setupTextures(){ pyrTex=utils::loadTexture("spstob_1.jpg"); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,pyrTex); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); glGenerateMipmap(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } void init(GLFWwindow* window) { renderingProgram=utils::createShaderProgram("vertShader.glsl","fragShader.glsl"); camera={0.0f,0.0f,-10.0f}; setupVertices(); setupTextures(); } void DrawSphere(){ glUniformMatrix4fv(mvLoc,1,GL_FALSE,glm::value_ptr(mvMat)); glUniformMatrix4fv(projLoc,1,GL_FALSE,glm::value_ptr(pMat)); glUniformMatrix4fv(nLoc, 1, GL_FALSE, glm::value_ptr(invTrMat)); glBindBuffer(GL_ARRAY_BUFFER,vbo[0]); glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0); glBindBuffer(GL_ARRAY_BUFFER,vbo[1]); glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,0); glBindBuffer(GL_ARRAY_BUFFER,vbo[2]); glVertexAttribPointer(2,3,GL_FLOAT,GL_FALSE,0,0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vbo[3]); glDrawElements(GL_TRIANGLES,sphere.getNumIndices(),GL_UNSIGNED_INT,0); } void DrawTorus(){ glUniformMatrix4fv(mvLoc,1,GL_FALSE,glm::value_ptr(mvMat)); glUniformMatrix4fv(projLoc,1,GL_FALSE,glm::value_ptr(pMat)); glUniformMatrix4fv(nLoc, 1, GL_FALSE, glm::value_ptr(invTrMat)); glBindBuffer(GL_ARRAY_BUFFER,vbo[4]); glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0); glBindBuffer(GL_ARRAY_BUFFER,vbo[5]); glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,0); glBindBuffer(GL_ARRAY_BUFFER,vbo[6]); glVertexAttribPointer(2,3,GL_FLOAT,GL_FALSE,0,0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vbo[7]); glDrawElements(GL_TRIANGLES,torus.getNumIndices(),GL_UNSIGNED_INT,0); } void DrawShuttle(){ glUniformMatrix4fv(mvLoc,1,GL_FALSE,glm::value_ptr(mvMat)); glUniformMatrix4fv(projLoc,1,GL_FALSE,glm::value_ptr(pMat)); glUniformMatrix4fv(nLoc, 1, GL_FALSE, glm::value_ptr(invTrMat)); glBindBuffer(GL_ARRAY_BUFFER,vbo[8]); glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0); glBindBuffer(GL_ARRAY_BUFFER,vbo[9]); glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,0); glBindBuffer(GL_ARRAY_BUFFER,vbo[10]); glVertexAttribPointer(2,3,GL_FLOAT,GL_FALSE,0,0); glDrawArrays(GL_TRIANGLES,0,shuttle.getNumVertices()); } void installLights(glm::mat4 vMat){ currentLightPos = glm::vec3(initialLightLoc.x, initialLightLoc.y, initialLightLoc.z); // convert light's position to view space, and save it in a float array lightPosV = glm::vec3(vMat * glm::vec4(currentLightPos, 1.0)); lightPos[0] = lightPosV.x; lightPos[1] = lightPosV.y; lightPos[2] = lightPosV.z; // get the locations of the light and material fields in the shader globalAmbLoc = glGetUniformLocation(renderingProgram, "globalAmbient"); ambLoc = glGetUniformLocation(renderingProgram, "light.ambient"); diffLoc = glGetUniformLocation(renderingProgram, "light.diffuse"); specLoc = glGetUniformLocation(renderingProgram, "light.specular"); lPosLoc = glGetUniformLocation(renderingProgram, "light.position"); mAmbLoc = glGetUniformLocation(renderingProgram, "material.ambient"); mDiffLoc = glGetUniformLocation(renderingProgram, "material.diffuse"); mSpecLoc = glGetUniformLocation(renderingProgram, "material.specular"); mShinLoc = glGetUniformLocation(renderingProgram, "material.shininess"); // set the uniform light and material values in the shader glProgramUniform4fv(renderingProgram, globalAmbLoc, 1, globalAmbient); glProgramUniform4fv(renderingProgram, ambLoc, 1, lightAmbient); glProgramUniform4fv(renderingProgram, diffLoc, 1, lightDiffuse); glProgramUniform4fv(renderingProgram, specLoc, 1, lightSpecular); glProgramUniform3fv(renderingProgram, lPosLoc, 1, lightPos.data()); glProgramUniform4fv(renderingProgram, mAmbLoc, 1, matAmb); glProgramUniform4fv(renderingProgram, mDiffLoc, 1, matDif); glProgramUniform4fv(renderingProgram, mSpecLoc, 1, matSpe); glProgramUniform1f(renderingProgram, mShinLoc, matShi); } double lastTime=0; void display(GLFWwindow* window, double currentTime) { double elapsedTime=currentTime-lastTime; lastTime=currentTime; glClear(GL_DEPTH_BUFFER_BIT); glClearColor(0.2,0,0.2,1); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(renderingProgram); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); mvLoc=glGetUniformLocation(renderingProgram,"mv_matrix"); projLoc=glGetUniformLocation(renderingProgram,"proj_matrix"); nLoc = glGetUniformLocation(renderingProgram, "norm_matrix"); glfwGetFramebufferSize(window,&width,&height); aspect=(float)width/(float)height; pMat=glm::perspective(utils::degToRad(60),aspect,0.1f,1000.f); vMat=glm::translate(glm::mat4(1.0f),glm::vec3{camera.x,camera.y,camera.z}); installLights(vMat); //vMat=glm::lookAt(glm::vec3{camera.x,camera.y,camera.z},{0,-3,0},{0,1,0}); mMat=glm::translate(glm::mat4(1.0f),{0.f,-8.f,0.f}); mMat=glm::rotate(mMat,float(currentTime/4),{0.f,1.f,0.f}); mMat=glm::scale(mMat,{60,60,60}); mvMat=vMat*mMat; invTrMat=glm::transpose(glm::inverse(mvMat)); //DrawSphere(); DrawShuttle(); glProgramUniform4fv(renderingProgram, mAmbLoc, 1, matAmb2); glProgramUniform4fv(renderingProgram, mDiffLoc, 1, matDif2); glProgramUniform4fv(renderingProgram, mSpecLoc, 1, matSpe2); glProgramUniform1f(renderingProgram, mShinLoc, matShi2); mMat=glm::translate(glm::mat4(1.0f),{4.f,2.f,0.f}); mMat=glm::rotate(mMat,float(currentTime/4),{1.f,0.f,0.f}); mMat=glm::scale(mMat,{3,3,3}); mvMat=vMat*mMat; invTrMat=glm::transpose(glm::inverse(mvMat)); //DrawTorus(); } int main(void) { if (!glfwInit()) { exit(EXIT_FAILURE); } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); GLFWwindow* window = glfwCreateWindow(1920, 1080, "Texture Mapping!", NULL, NULL); glfwSetWindowPos(window,1400,180); glfwMakeContextCurrent(window); if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); } glfwSwapInterval(1); init(window); while (!glfwWindowShouldClose(window)) { display(window,glfwGetTime()); glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); exit(EXIT_SUCCESS); }