178 lines
5.8 KiB
C++
178 lines
5.8 KiB
C++
#include <algorithm>
|
|
#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("light.vert", "onelight.frag");
|
|
_lightShader = new ShaderProgram();
|
|
_lightShader->initFromFiles("light.vert", "toon.frag");
|
|
|
|
_static_drawables.push_back(new Plane(50, 16));
|
|
|
|
/*_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, 50, 50));
|
|
_light_drawables.back()->addTranslation(glm::vec4(-2, 1.1f, 0, 0));
|
|
_light_drawables.push_back(new VBOTeapot(64, glm::identity<glm::mat4x4>()));
|
|
_light_drawables.back()->addTranslation(glm::vec4(2, 0, -7, 0));
|
|
_light_drawables.back()->addRotation(glm::vec4(1, 0, 0, -90));
|
|
_light_drawables.push_back(new Mesh("bunny.obj", _lightShader));
|
|
_light_drawables.push_back(new Mesh("buddha.obj", _lightShader));
|
|
_light_drawables.back()->addTranslation(glm::vec4(0, 13, -15, 0));
|
|
_light_drawables.back()->addRotation(glm::vec4(0, 1, 0, -180));
|
|
_light_drawables.back()->addScaling(glm::vec4(30, 30, 30, 0));*/
|
|
_light_drawables.push_back(new Mesh("teapot.obj", _lightShader));
|
|
_light_drawables.back()->addTranslation(glm::vec4(0, 1, 0, 0));
|
|
_light_drawables.back()->addScaling(glm::vec4(1, 1, 1, 1));
|
|
}
|
|
|
|
void MyGlWindow::draw()
|
|
{
|
|
glClearColor(_bgColor[0], _bgColor[1], _bgColor[2], 1);
|
|
glViewport(0, 0, m_width, m_height);
|
|
glEnable(GL_DEPTH_TEST);
|
|
glEnable(GL_DEPTH_BUFFER);
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
|
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();
|
|
|
|
glEnable(GL_CULL_FACE);
|
|
glCullFace(GL_BACK);
|
|
glEnable(GL_BLEND);
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
_staticShader->addUniform("mvp");
|
|
|
|
_staticShader->addUniform("Ka"); //Ambient Object Color :vec3
|
|
glUniform3fv(_staticShader->uniform("Ka"), 1, glm::value_ptr(glm::vec3(0.19225, 0.19225, 0.19225)));
|
|
|
|
_staticShader->addUniform("Kd"); //Diffuse Object Color :vec3
|
|
glUniform3fv(_staticShader->uniform("Kd"), 1, glm::value_ptr(glm::vec3(0.50754, 0.50754, 0.50754)));
|
|
|
|
_staticShader->addUniform("Ks"); //Specular Object Color :vec3
|
|
glUniform3fv(_staticShader->uniform("Ks"), 1, glm::value_ptr(glm::vec3(0.508273, 0.508273, 0.508273)));
|
|
|
|
_staticShader->addUniform("Shininess");
|
|
glUniform1f(_staticShader->uniform("Shininess"), 51.2);
|
|
|
|
_staticShader->addUniform("NormalMatrix"); //Refer next slide : mat3
|
|
_staticShader->addUniform("ModelViewMatrix"); //View*Model : mat4
|
|
|
|
/* Variable set for spot lighting */
|
|
|
|
_staticShader->addUniform("LightDirection");
|
|
_staticShader->addUniform("Exponent");
|
|
glUniform1f(_staticShader->uniform("Exponent"), 10);
|
|
_staticShader->addUniform("Cutoff");
|
|
glUniform1f(_staticShader->uniform("Cutoff"), 30);
|
|
_staticShader->addUniform("InnerCutoff");
|
|
glUniform1f(_staticShader->uniform("InnerCutoff"), 25);
|
|
|
|
/* END set */
|
|
|
|
for (ADrawable *drawable : _static_drawables)
|
|
drawable->draw(_staticShader, projection, view);
|
|
|
|
_staticShader->disable();
|
|
|
|
_lightShader->use();
|
|
glEnable(GL_CULL_FACE);
|
|
glCullFace(GL_BACK);
|
|
glEnable(GL_BLEND);
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
_lightShader->addUniform("mvp");
|
|
|
|
_lightShader->addUniform("Ka"); //Ambient Object Color :vec3
|
|
glUniform3fv(_lightShader->uniform("Ka"), 1, glm::value_ptr(glm::vec3(0.19225, 0.19225, 0.19225)));
|
|
|
|
_lightShader->addUniform("Kd"); //Diffuse Object Color :vec3
|
|
glUniform3fv(_lightShader->uniform("Kd"), 1, glm::value_ptr(glm::vec3(0.50754, 0.50754, 0.50754)));
|
|
|
|
_lightShader->addUniform("Ks"); //Specular Object Color :vec3
|
|
glUniform3fv(_lightShader->uniform("Ks"), 1, glm::value_ptr(glm::vec3(0.508273, 0.508273, 0.508273)));
|
|
|
|
_lightShader->addUniform("Shininess");
|
|
glUniform1f(_lightShader->uniform("Shininess"), 51.2);
|
|
|
|
_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));
|
|
}
|