Add extra skyboxes
[opengl.git] / main.cpp
index 16466005327c8ceef3d1afd2d6ecd9ddb367fa6b..fcc7a1eb90c033f6c1b3a5edec943ff759e16ac8 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -26,15 +26,16 @@ using namespace std;
 GLuint lightVao;
 
 Program *textureProg, *plainProg, *reflectProg, *pbrProg;
-Skybox *skybox;
+
+std::vector<Skybox> skyboxes;
+int activeSkybox = 0;
+
 Model *chest, *mirrorCube, *pbr;
-GLuint albedoMap, metallicMap, roughnessMap, normalMap, aoMap;
                          
 glm::vec3 camPos   = glm::vec3(0.0f, 0.0f,  -5.f);
 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;
 
 struct Light {
        glm::vec3 pos;
@@ -50,11 +51,14 @@ std::vector<Light> lights = {
 
 int activeLight = 0;
 
-const int WIDTH = 800, HEIGHT = 600;
-const float ASPECT = (float)WIDTH / (float)HEIGHT;
+int windowWidth = 800, windowHeight = 600;
+
+float aspect() {
+       return (float)windowWidth / (float)windowHeight;
+}      
 
 glm::mat4 projMat() {
-       return glm::perspective(glm::radians(45.f), ASPECT, 0.01f, 10000.f);
+       return glm::perspective(glm::radians(45.f), aspect(), 0.01f, 10000.f);
 }
 
 glm::mat4 viewMat() {
@@ -104,35 +108,8 @@ void drawLight(Light &light) {
 void display() {
        glClearColor(0.5, 0.5, 0.5, 1);
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
-       float d = (float)glutGet(GLUT_ELAPSED_TIME) * 0.001f;
-
-       /* glm::vec4 lightColor(1, 1, 1, 1); */
-
-       /* drawLight(d, lightPos, lightColor); */
 
-       /* glUseProgram(textureProg->progId); */
-       /* setProjectionAndViewUniforms(textureProg->progId); */
-       /* setLightColorAndPos(textureProg->progId, 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)); */
-       
-       /* Model::Node *jewels = chest->find("jewels"); */
-       /* jewels->model = glm::scale(glm::mat4(1), glm::vec3((sin(d) + 1.2f) / 2.f)); */
-
-       /* 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)); */
-
-       /* Model::Node *key = chest->find("key"); */
-       /* key->model = glm::translate(glm::mat4(1), glm::vec3(0, 0, sin(d))); */
-       
-       /* chest->draw(); */
-
-       /* mirrorCube->draw(); */
+       float d = (float)glutGet(GLUT_ELAPSED_TIME) * 0.001f;
 
        glUseProgram(pbrProg->progId);
        setProjectionAndViewUniforms(pbrProg->progId);
@@ -146,43 +123,11 @@ void display() {
        glUniform3fv(glGetUniformLocation(pbrProg->progId, "lightPositions"), 4, glm::value_ptr(lightPositions[0]));
        glUniform3fv(glGetUniformLocation(pbrProg->progId, "lightColors"), 4, glm::value_ptr(lightColors[0]));
 
-       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "albedoMap"), 0); */
-       /* glActiveTexture(GL_TEXTURE0); */
-       /* glBindTexture(GL_TEXTURE_2D, albedoMap); */
-
-       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "normalMap"), 1); */
-       /* glActiveTexture(GL_TEXTURE1); */
-       /* glBindTexture(GL_TEXTURE_2D, normalMap); */
-
-       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "metallicMap"), 2); */
-       /* glActiveTexture(GL_TEXTURE2); */
-       /* glBindTexture(GL_TEXTURE_2D, metallicMap); */
-
-       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "roughnessMap"), 3); */
-       /* glActiveTexture(GL_TEXTURE3); */
-       /* glBindTexture(GL_TEXTURE_2D, roughnessMap); */
-       
-       /* glUniform1i(glGetUniformLocation(pbrProg->progId, "aoMap"), 4); */
-       /* glActiveTexture(GL_TEXTURE4); */
-       /* glBindTexture(GL_TEXTURE_2D, aoMap); */
-
-       glUniform1i(glGetUniformLocation(pbrProg->progId, "irradianceMap"), 5);
-       glActiveTexture(GL_TEXTURE5);
-       glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->getIrradianceMap());
-
-       glUniform1i(glGetUniformLocation(pbrProg->progId, "prefilterMap"), 6);
-       glActiveTexture(GL_TEXTURE6);
-       glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->getPrefilterMap());
-
-       glUniform1i(glGetUniformLocation(pbrProg->progId, "brdfMap"), 7);
-       glActiveTexture(GL_TEXTURE7);
-       glBindTexture(GL_TEXTURE_2D, skybox->getBRDFMap());
-
-       pbr->draw();
+       pbr->draw(skyboxes[activeSkybox]);
 
        for (Light &light: lights) drawLight(light);
 
-       skybox->draw(projMat(), viewMat());
+       skyboxes[activeSkybox].draw(projMat(), viewMat());
 
        glutSwapBuffers();
 }
@@ -203,37 +148,19 @@ void setupLightBuffers(GLuint progId) {
        glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, 0);
 }
 
-GLuint loadTexture(const std::string &path) {
-       Image img(path);
-       GLuint texId;
-       glGenTextures(1, &texId);
-       glBindTexture(GL_TEXTURE_2D, texId);
-       glTexImage2D(GL_TEXTURE_2D, 0, img.format(), img.width(), img.height(), 0, img.format(), GL_UNSIGNED_BYTE, img.data());
-       glGenerateMipmap(GL_TEXTURE_2D);
-       return texId;
-}
-
 void init() {
        plainProg = new Program("plainvertex.glsl", "plainfrag.glsl");
        glUseProgram(plainProg->progId);
        setupLightBuffers(plainProg->progId);
        plainProg->validate();
 
-       skybox = new Skybox(Image("models/loftSkybox/Newport_Loft_Ref.hdr"));
-
-       /* textureProg = new Program("texturevertex.glsl", "texturefrag.glsl"); */
-       /* chest = new Model("models/chest.dae", *textureProg, *skybox); */
-       /* mirrorCube = new Model("models/mirrorCube.dae", *textureProg, *skybox); */
+       skyboxes.push_back(Skybox(Image("skyboxes/loft/Newport_Loft_Ref.hdr")));
+       skyboxes.push_back(Skybox(Image("skyboxes/monumentValley/Road_to_MonumentValley_Ref.hdr")));
+       skyboxes.push_back(Skybox(Image("skyboxes/factory/Factory_Catwalk_2k.hdr")));
 
        pbrProg = new Program("pbrvert.glsl", "pbrfrag.glsl");
        glUseProgram(pbrProg->progId);
-       pbr = new Model("models/sphereMetal.gltf", *pbrProg, *skybox);
-
-       /* albedoMap = loadTexture("models/materials/streakedmetal/streakedmetal-albedo.png"); */
-       /* metallicMap = loadTexture("models/materials/streakedmetal/streakedmetal-metalness.png"); */
-       /* normalMap = loadTexture("models/materials/streakedmetal/streakedmetal-normal.png"); */
-       /* roughnessMap = loadTexture("models/materials/streakedmetal/streakedmetal-roughness.png"); */
-       /* aoMap = loadTexture("models/materials/streakedmetal/streakedmetal-ao.png"); */
+       pbr = new Model("models/sphereMetal.gltf", *pbrProg);
 
        glEnable(GL_DEPTH_TEST); 
        glEnable(GL_CULL_FACE); 
@@ -246,11 +173,9 @@ bool* keyStates = new bool[256];
 void keyboard(unsigned char key, int x, int y) {
        keyStates[key] = true;
        if (key == 'z')
-               doScale = !doScale;
+               activeSkybox = (activeSkybox + 1) % skyboxes.size();
        if (key == 'x')
-               doRotate = !doRotate;
-       if (key == 'c')
-               doTranslate = !doTranslate;
+               activeLight = (activeLight + 1) % lights.size();
 }
 
 void keyboardUp(unsigned char key, int x, int y) {
@@ -322,18 +247,24 @@ void mouse(int button, int state, int x, int y) {
                firstMouse = true;
 }
 
+void reshape(int newWidth, int newHeight) {
+       glViewport(0, 0, newWidth * 2, newHeight * 2);
+       windowWidth = newWidth, windowHeight = newHeight;
+}
+
 int main(int argc, char** argv) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGB|GLUT_3_2_CORE_PROFILE);
-       glutInitWindowSize(WIDTH, HEIGHT);
+       glutInitWindowSize(windowWidth, windowHeight);
        int win = glutCreateWindow("Physically Based Rendering");
        glutDisplayFunc(display);
+       glutReshapeFunc(reshape);
 
        glewInit();
        
        init();
        
-       swizzle();
+       makeRetina();
 
        glutKeyboardFunc(keyboard);
        glutKeyboardUpFunc(keyboardUp);