#include #include "MyGlWindow.h" //Getting the projection matrix glm::mat4x4 perspective(float fovy, float aspect, float near, float far) { float fovy2 = glm::tan(fovy / 2); glm::mat4x4 pmat{ { 1 / (aspect * fovy2), 0, 0, 0}, { 0, 1 / fovy2, 0, 0}, { 0, 0, -((far + near) / (far - near)), -1}, { 0, 0, -((2 * far * near) / (far - near)), 0} }; return pmat; } // Getting the view matrix glm::mat4x4 lookAt(glm::vec3 campos, glm::vec3 look, glm::vec3 up) { glm::vec3 ZCam(glm::normalize(campos - look)); glm::vec3 XCam(glm::normalize(glm::cross(up, ZCam))); glm::vec3 YCam(glm::normalize(glm::cross(ZCam, XCam))); glm::mat4x4 cam_mat{ {XCam.x, YCam.x, ZCam.x, 0}, {XCam.y, YCam.y, ZCam.y, 0}, {XCam.z, YCam.z, ZCam.z, 0}, {0, 0, 0 ,1} }; glm::mat4x4 norm_mat{ {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {-campos.x, -campos.y, -campos.z, 1} }; return cam_mat * norm_mat; } MyGlWindow::MyGlWindow(int w, int h) : viewer(glm::vec3(5, 5, 5), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0), 45.0f, (w / (float)h)) { m_width = w; m_height = h; setup(); } MyGlWindow::~MyGlWindow() { } void MyGlWindow::setBgColor(float bgColor[3]) { _bgColor[0] = bgColor[0]; _bgColor[1] = bgColor[1]; _bgColor[2] = bgColor[2]; } void MyGlWindow::setup() { _staticShader = new ShaderProgram(); _staticShader->initFromFiles("simple.vert", "simple.frag"); _lightShader = new ShaderProgram(); _lightShader->initFromFiles("light.vert", "simple.frag"); _static_drawables.emplace_back(new CheckeredFloor(50, 16)); _light_drawables.push_back(new ColorCube(false)); _light_drawables.back()->addTranslation(glm::vec4(2, 1.1f, 0, 0)); _light_drawables.push_back(new Sphere(1, 100, 100)); _light_drawables.back()->addTranslation(glm::vec4(-2, 1.1f, 0, 0)); _light_drawables.push_back(new VBOTeapot(64, glm::identity())); _light_drawables.back()->addTranslation(glm::vec4(2, 3, -7, 0)); _light_drawables.back()->addRotation(glm::vec4(1, 0, 0, -90)); } void MyGlWindow::draw() { glClearColor(_bgColor[0], _bgColor[1], _bgColor[2], 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, m_width, m_height); glEnable(GL_DEPTH_TEST); glm::vec3 eye(viewer.getViewPoint().x, viewer.getViewPoint().y, viewer.getViewPoint().z); glm::vec3 look(viewer.getViewCenter().x, viewer.getViewCenter().y, viewer.getViewCenter().z); glm::vec3 up(viewer.getUpVector().x, viewer.getUpVector().y, viewer.getUpVector().z); glm::mat4 view = lookAt(eye, look, up); //Calculate view matrix from paramters of m_viewer glm::mat4 projection = perspective(45.0f, m_width / m_height, 0.1f, 500.0f); _staticShader->use(); _staticShader->addUniform("mvp"); for (ADrawable *drawable : _static_drawables) drawable->draw(_staticShader, projection, view); _staticShader->disable(); _lightShader->use(); _lightShader->addUniform("mvp"); _lightShader->addUniform("LightLocation"); //Light Position to camera coordinates : vec4 _lightShader->addUniform("Kd"); //Diffuse Object Color :vec3 glUniform3fv(_lightShader->uniform("Kd"), 1, glm::value_ptr(glm::vec3(1, 1, 0))); _lightShader->addUniform("Ld"); //Diffuse Light Color : vec3 glUniform3fv(_lightShader->uniform("Ld"), 1, glm::value_ptr(glm::vec3(1, 1, 1))); _lightShader->addUniform("Ka"); //Diffuse Object Color :vec3 glUniform3fv(_lightShader->uniform("Ka"), 1, glm::value_ptr(glm::vec3(0.2, 0.2, 0))); _lightShader->addUniform("La"); //Diffuse Light Color : vec3 glUniform3fv(_lightShader->uniform("La"), 1, glm::value_ptr(glm::vec3(1, 1, 1))); _lightShader->addUniform("Ks"); //Diffuse Object Color :vec3 glUniform3fv(_lightShader->uniform("Ks"), 1, glm::value_ptr(glm::vec3(0.3, 0.3, 0))); _lightShader->addUniform("Ls"); //Diffuse Light Color : vec3 glUniform3fv(_lightShader->uniform("Ls"), 1, glm::value_ptr(glm::vec3(1, 1, 1))); _lightShader->addUniform("NormalMatrix"); //Refer next slide : mat3 _lightShader->addUniform("ModelViewMatrix"); //View*Model : mat4 for (ADrawable *drawable : _light_drawables) drawable->draw(_lightShader, projection, view); _lightShader->disable(); } void MyGlWindow::AddDrawable(ADrawable *d) { _static_drawables.push_back(d); } void MyGlWindow::resize(int w, int h) { m_width = w; m_height = h; viewer.setAspectRatio(w / float(h)); }