diff --git a/src/ex_9_1.hpp b/src/ex_9_1.hpp index df08e94..b5e0611 100644 --- a/src/ex_9_1.hpp +++ b/src/ex_9_1.hpp @@ -15,16 +15,20 @@ #include #include #include +#include "SOIL/stb_image_aug.h" const unsigned int SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024; int WIDTH = 900, HEIGHT = 900; +unsigned int skyboxVAO, skyboxVBO, skyboxEBO; +unsigned int cubemapTexture; + namespace models { Core::RenderContext spaceshipContext; Core::RenderContext sphereContext; - + Core::RenderContext laptop; Core::RenderContext windowFrame; Core::RenderContext bookShelf; Core::RenderContext window; @@ -35,19 +39,38 @@ namespace models { Core::RenderContext ceilingLamp; Core::RenderContext desk; Core::RenderContext bed; + Core::RenderContext floor; + Core::RenderContext carpet; + Core::RenderContext cabinet; + Core::RenderContext roof; + Core::RenderContext longerWall; + Core::RenderContext longerWall_d; + Core::RenderContext smallerWall; + Core::RenderContext smallerWall_ww; + Core::RenderContext trashcan; + Core::RenderContext cap; + Core::RenderContext aquarium; } namespace textures { + GLuint floorTexture; GLuint sunTexture; GLuint windowFrameTexture; GLuint bookShelfTexture; GLuint potPlantTexture; GLuint officeChariTexture; GLuint lampTexture; + GLuint laptopTexture; GLuint doorTexture; GLuint deskTexture; GLuint ceilingLampTexture; GLuint bedTexture; GLuint flashlightTexture; + GLuint carpetTexture; + GLuint roofTexture; + GLuint longerWallTexture; + GLuint smallerWallTexture; + GLuint trashcanTexture; + GLuint capTexture; } GLuint depthMapFBO; @@ -83,19 +106,20 @@ Core::RenderContext sphereContext; glm::vec3 sunPos = glm::vec3(-4.740971f, 2.149999f, 0.369280f); glm::vec3 sunDir = glm::vec3(-0.93633f, 0.351106, 0.003226f); -glm::vec3 sunColor = glm::vec3(0.9f, 0.9f, 0.7f)*5; +glm::vec3 sunColor = glm::vec3(0.9f, 0.9f, 0.7f); + glm::vec3 cameraPos = glm::vec3(0.479490f, 1.250000f, -2.124680f); glm::vec3 cameraDir = glm::vec3(-0.354510f, 0.000000f, 0.935054f); -glm::vec3 spaceshipPos = glm::vec3(0.065808f, 1.250000f, -2.189549f); +glm::vec3 spaceshipPos = glm::vec3(0.065808f, 1.250000f, 0.689549f); glm::vec3 spaceshipDir = glm::vec3(-0.490263f, 0.000000f, 0.871578f); GLuint VAO,VBO; float aspectRatio = 1.f; -float exposition = 1.f; +float exposition = 4.f; glm::vec3 pointlightPos = glm::vec3(0, 2, 0); glm::vec3 pointlightColor = glm::vec3(0.9, 0.6, 0.6); @@ -105,7 +129,40 @@ glm::vec3 spotlightConeDir = glm::vec3(0, 0, 0); glm::vec3 spotlightColor = glm::vec3(0.4, 0.4, 0.9)*3; float spotlightPhi = 3.14 / 4; +float skyboxVertices[] = +{ + // Coordinates + -1.0f, -1.0f, 1.0f,// 7--------6 + 1.0f, -1.0f, 1.0f,// /| /| + 1.0f, -1.0f, -1.0f,// 4--------5 | + -1.0f, -1.0f, -1.0f,// | | | | + -1.0f, 1.0f, 1.0f,// | 3------|-2 + 1.0f, 1.0f, 1.0f,// |/ |/ + 1.0f, 1.0f, -1.0f,// 0--------1 + -1.0f, 1.0f, -1.0f +}; +unsigned int skyboxIndices[] = +{ + // Right + 1, 2, 6, + 6, 5, 1, + // Left + 0, 4, 7, + 7, 3, 0, + // Top + 4, 5, 6, + 6, 7, 4, + // Bottom + 0, 3, 2, + 2, 1, 0, + // Back + 0, 1, 5, + 5, 4, 0, + // Front + 3, 7, 6, + 6, 2, 3 +}; float lastTime = -1.f; float deltaTime = 0.f; @@ -212,47 +269,105 @@ void renderShadowapSun() { glUseProgram(programDepth); glm::mat4 lightVP = glm::ortho(-3.f, 2.3f, -1.3f, 3.f, -1.0f, 40.0f) * glm::lookAt(sunPos, sunPos - sunDir, glm::vec3(0, 1, 0)); - - drawObjectDepth(sphereContext, - lightVP, - glm::translate(pointlightPos) * glm::scale(glm::vec3(0.1)) * glm::eulerAngleY(time / 3) * glm::translate(glm::vec3(4.f, 0, 0)) * glm::scale(glm::vec3(0.3f))); - drawObjectDepth(sphereContext, - lightVP, - glm::translate(pointlightPos) * glm::scale(glm::vec3(0.1)) * glm::eulerAngleY(time / 3) * glm::translate(glm::vec3(4.f, 0, 0)) * glm::eulerAngleY(time) * glm::translate(glm::vec3(1.f, 0, 0)) * glm::scale(glm::vec3(0.1f))); - //drawObjectDepth(models::bedContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::chairContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::deskContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::doorContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::drawerContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::marbleBustContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::materaceContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::pencilsContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::planeContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::roomContext, - // lightVP, - // glm::mat4()); - //drawObjectDepth(models::windowContext, - // lightVP, - // glm::mat4()); + glm::mat4 model; + drawObjectDepth(models::floor, + lightVP, + glm::mat4()); + + model = glm::mat4() * glm::translate(glm::vec3(0, 2.6, 0)); + drawObjectDepth(models::roof, + lightVP, + model); + + model = glm::mat4() * glm::translate(glm::vec3(0, 0, -2)); + drawObjectDepth(models::longerWall, + lightVP, + model); + + model = glm::mat4() * glm::translate(glm::vec3(0, 0, 2)); + model = glm::rotate(model, glm::radians(180.0f), glm::vec3(0, 1, 0)); + drawObjectDepth(models::longerWall_d, + lightVP, + model); + + model = glm::mat4() * glm::translate(glm::vec3(2.5, 0, 0)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0, 1, 0)); + drawObjectDepth(models::smallerWall, + lightVP, + model); + + model = glm::mat4() * glm::translate(glm::vec3(-2.5, 0, 0)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0, 1, 0)); + drawObjectDepth(models::smallerWall_ww, + lightVP, + model); + + model = glm::mat4() * glm::translate(glm::vec3(0.0, 0.01, 0.9)); + drawObjectDepth(models::carpet, + lightVP, + model); + + model = glm::mat4() * glm::translate(glm::vec3(-2.5, 0.99, -0.75)) * glm::scale(glm::vec3(0.36, 0.34, 0.36)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0, 1, 0)); + drawObjectDepth(models::window, + lightVP, + model); + + model = glm::mat4(); + model = glm::scale(glm::vec3(0.5f)) * translate(glm::vec3(0.8f, 0.0f, -3.0f)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0, 1, 0)); + drawObjectDepth(models::cabinet, + lightVP, + model); + + model = glm::mat4(); + model = glm::scale(glm::vec3(0.15f)) * glm::translate(glm::vec3(2.3f, 5.0f, -10.6f)); + drawObjectDepth(models::potPlant, + lightVP, + model); + + model = glm::mat4(1.0f); + model = glm::scale(glm::vec3(0.5f)) * glm::translate(glm::vec3(-2.65f, 0.0f, -1.65f)); + model = glm::rotate(model, glm::radians(180.0f), glm::vec3(0, 1, 0)); + drawObjectDepth(models::officeChair, + lightVP, + model); + + model = glm::mat4(); + model = glm::translate(glm::vec3(-0.7f, 0.75f, -1.7f)) * glm::scale(glm::vec3(0.001f)); + drawObjectDepth(models::lamp, + lightVP, + model); + + model = glm::mat4(1.0f) * glm::translate(glm::vec3(1.7f, 1.15f, 2.0f)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0.0, 1.0, 0.0)) * glm::scale(glm::vec3(1.0f, 1.1f, 1.3f)); + drawObjectDepth(models::door, + lightVP, + model); + + model = glm::mat4(1.0f) * glm::translate(glm::vec3(-2.2f, 0.38f, -1.5f)); + drawObjectDepth(models::desk, + lightVP, + model); + + model = glm::mat4(1.0f); + model = glm::scale(glm::vec3(0.4f)) * glm::translate(glm::vec3(0.0f, 3.6f, 0.0f)); + drawObjectDepth(models::ceilingLamp, + lightVP, + model); + + model = glm::mat4(1.0f) * glm::translate(glm::vec3(1.6f, 0.0f, -0.86f)) * glm::scale(glm::vec3(0.8f)); + model = glm::rotate(model, glm::radians(270.0f), glm::vec3(0.0f, 1.0f, 0.0f)); + drawObjectDepth(models::bed, + lightVP, + model); + + model = glm::mat4() * glm::translate(glm::vec3(-1.8f, -0.2f, 2.15f)) * glm::scale(glm::vec3(0.015)); + model = glm::rotate(model, glm::radians(180.0f), glm::vec3(0, 1, 0)); + drawObjectDepth(models::bookShelf, + lightVP, + model); glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(0, 0, WIDTH, HEIGHT); @@ -266,63 +381,148 @@ void renderScene(GLFWwindow* window) updateDeltaTime(time); renderShadowapSun(); - //space lamp + /*space lamp*/ glUseProgram(programSun); glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix(); glm::mat4 transformation = viewProjectionMatrix * glm::translate(pointlightPos) * glm::scale(glm::vec3(0.1)); glUniformMatrix4fv(glGetUniformLocation(programSun, "transformation"), 1, GL_FALSE, (float*)&transformation); - glUniform3f(glGetUniformLocation(programSun, "color"), sunColor.x / 2, sunColor.y / 2, sunColor.z / 2); + glUniform3f(glGetUniformLocation(programSun, "color"), sunColor.x, sunColor.y, sunColor.z); glUniform1f(glGetUniformLocation(programSun, "exposition"), exposition); Core::DrawContext(sphereContext); + glUseProgram(programSkybox); + glUniform1i(glGetUniformLocation(programSkybox, "skybox"), 0); + glUseProgram(program); - drawObjectPBR(models::window, glm::mat4(), + drawObjectPBR(models::floor, glm::mat4(), + textures::floorTexture, + 0, + 0); + drawObjectPBR(models::roof, glm::mat4() * glm::translate(glm::vec3(0, 2.6, 0)), + textures::roofTexture, + 0, + 0 + ); + drawObjectPBR(models::longerWall, glm::mat4() * glm::translate(glm::vec3(0,0,-2)), + textures::longerWallTexture, + 0, + 0); + glm::mat4 model = glm::mat4() * glm::translate(glm::vec3(0, 0, 2)); + model = glm::rotate(model, glm::radians(180.0f), glm::vec3(0, 1, 0)); + drawObjectPBR(models::longerWall_d, model, + textures::longerWallTexture, + 0, + 0); + model = glm::mat4() * glm::translate(glm::vec3(2.5, 0, 0)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0, 1, 0)); + drawObjectPBR(models::smallerWall, model, + textures::longerWallTexture, + 0, + 0 + ); + model = glm::mat4() * glm::translate(glm::vec3(-2.5, 0, 0)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0, 1, 0)); + drawObjectPBR(models::smallerWall_ww, model, + textures::longerWallTexture, + 0, + 0 + ); + drawObjectPBR(models::carpet, glm::mat4() * glm::translate(glm::vec3(0.0 ,0.01 ,0.9)), + textures::carpetTexture, + 0, + 0 + ); + model = glm::mat4() * glm::translate(glm::vec3(-2.5, 0.99, -0.75)) * glm::scale(glm::vec3(0.36,0.34,0.36)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0, 1, 0)); + drawObjectPBR(models::window, model, textures::windowFrameTexture, 0.2, 0.1 ); - drawObjectPBR(models::potPlant, glm::mat4() * glm::scale(glm::vec3(0.2f)) * glm::translate(glm::vec3(-5.0f, 55.0f, -6.0f)), + model = glm::mat4(); + model = glm::scale(glm::vec3(0.5f)) * translate(glm::vec3(0.8f, 0.0f, -3.0f)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0, 1, 0)); + drawObjectPBR(models::cabinet, model, + textures::floorTexture, + 0, + 0); + + model = glm::mat4(); + model = glm::scale(glm::vec3(0.15f)) * glm::translate(glm::vec3(2.3f, 5.0f, -10.6f)); + drawObjectPBR(models::potPlant, model, textures::potPlantTexture, 1.0f, 0.2f ); - drawObjectPBR(models::officeChair, glm::mat4(), + model = glm::mat4(1.0f); + model = glm::scale(glm::vec3(0.5f)) * glm::translate(glm::vec3(-2.65f, 0.0f, -1.65f)); + model = glm::rotate(model, glm::radians(180.0f), glm::vec3(0, 1, 0)); + drawObjectPBR(models::officeChair, model, textures::officeChariTexture, 0.2f, 0.0f ); - drawObjectPBR(models::lamp, glm::mat4() * glm::scale(glm::vec3(0.001f)), + model = glm::mat4(); + model = glm::translate(glm::vec3(-0.7f, 0.75f, -1.7f)) * glm::scale(glm::vec3(0.001f)); + drawObjectPBR(models::lamp, model, textures::lampTexture, 0.3f, 0.0f ); - drawObjectPBR(models::door, glm::mat4(), + model = glm::mat4(1.0f) * glm::translate(glm::vec3(1.7f, 1.15f, 2.0f)); + model = glm::rotate(model, glm::radians(90.0f), glm::vec3(0.0, 1.0, 0.0)) * glm::scale(glm::vec3(1.0f, 1.1f, 1.3f)); + drawObjectPBR(models::door, model, textures::doorTexture, 0.4f, 0.0f ); - drawObjectPBR(models::desk, glm::mat4(), + model = glm::mat4(1.0f) * glm::translate(glm::vec3(-2.2f, 0.38f, -1.5f)); + drawObjectPBR(models::desk, model, textures::deskTexture, 0.4f, 0.0f ); - drawObjectPBR(models::ceilingLamp, glm::mat4(), + model = glm::mat4(1.0f) * glm::translate(glm::vec3(-1.25f, 0.75f, -1.4f)) * glm::scale(glm::vec3(0.01f)); + model = glm::rotate(model, glm::radians(-87.0f), glm::vec3(1.0, 0.0, 0.0)); + drawObjectPBR(models::laptop, model, + textures::laptopTexture, + 0.4f, + 0.0f + ); + model = glm::mat4(1.0f) * glm::translate(glm::vec3(-0.15f, 0.16f, -1.5f)) * glm::scale(glm::vec3(2.5f)); + model = glm::rotate(model, glm::radians(-90.0f), glm::vec3(1.0, 0.0, 0.0)); + drawObjectPBR(models::trashcan, model, + textures::trashcanTexture, + 0.4f, + 0.0f + ); + model = glm::mat4(1.0f) * glm::translate(glm::vec3(-1.5f, 0.94f, 1.75f)) * glm::scale(glm::vec3(0.01f)); + model = glm::rotate(model, glm::radians(-90.0f), glm::vec3(1.0, 0.0, 0.0)); + model = glm::rotate(model, glm::radians(-33.0f), glm::vec3(0.0, 0.0, 1.0)); + drawObjectPBR(models::cap, model, + textures::capTexture, + 0.4f, + 0.0f + ); + model = glm::mat4(1.0f); + model = glm::scale(glm::vec3(0.4f)) * glm::translate(glm::vec3(0.0f, 3.6f, 0.0f)); + drawObjectPBR(models::ceilingLamp, model, textures::ceilingLampTexture, 0.2f, 0.0f ); - drawObjectPBR(models::bed, glm::mat4(), + model = glm::mat4(1.0f) * glm::translate(glm::vec3(1.6f, 0.0f, -0.86f)) * glm::scale(glm::vec3(0.8f)); + model = glm::rotate(model, glm::radians(270.0f), glm::vec3(0.0f, 1.0f, 0.0f)); + drawObjectPBR(models::bed, model, textures::bedTexture, 0.3f, 0.0f ); - drawObjectPBR(models::windowFrame, glm::mat4(), - textures::windowFrameTexture, - 0.2f, - 0.0f); - drawObjectPBR(models::bookShelf, glm::mat4() * glm::scale(glm::vec3(0.01)), + model = glm::mat4() * glm::translate(glm::vec3(-1.8f, -0.2f, 2.15f)) * glm::scale(glm::vec3(0.015)); + model = glm::rotate(model, glm::radians(180.0f), glm::vec3(0, 1, 0)); + drawObjectPBR(models::bookShelf, model, textures::bookShelfTexture, 0.4f, 0.1f); @@ -336,7 +536,6 @@ void renderScene(GLFWwindow* window) 0.,0.,0.,1., }); - //drawObjectColor(shipContext, // glm::translate(cameraPos + 1.5 * cameraDir + cameraUp * -0.5f) * inveseCameraRotrationMatrix * glm::eulerAngleY(glm::pi()), // glm::vec3(0.3, 0.3, 0.5) @@ -347,12 +546,47 @@ void renderScene(GLFWwindow* window) 0.0, 0.0 ); + //drawObjectPBR(models::aquarium, + //glm::mat4(), + //textures::flashlightTexture, + //0.0, + //0.0 + //); - spotlightPos = spaceshipPos + 0.2 * spaceshipDir; - if (!flashOff) + //spotlightPos = spaceshipPos + 0.2 * spaceshipDir; + if (!flashOff) { spotlightConeDir = spaceshipDir; - else + spotlightPos = spaceshipPos + 0.2 * spaceshipDir; + } + else { spotlightConeDir = -spaceshipDir; + spotlightPos = glm::vec3(500,500,500); + } + + + glDepthFunc(GL_LEQUAL); + + glUseProgram(programSkybox); + glm::mat4 view = glm::mat4(1.0f); + glm::mat4 projection = glm::mat4(1.0f); + // We make the mat4 into a mat3 and then a mat4 again in order to get rid of the last row and column + // The last row and column affect the translation of the skybox (which we don't want to affect) + view = glm::mat4(glm::mat3(glm::lookAt(cameraPos, cameraPos + cameraDir, Up))); + projection = glm::perspective(glm::radians(45.0f), (float)WIDTH / HEIGHT, 0.1f, 100.0f); + glUniformMatrix4fv(glGetUniformLocation(programSkybox, "view"), 1, GL_FALSE, glm::value_ptr(view)); + glUniformMatrix4fv(glGetUniformLocation(programSkybox, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); + + // Draws the cubemap as the last object so we can save a bit of performance by discarding all fragments + // where an object is present (a depth of 1.0f will always fail against any object's depth value) + glBindVertexArray(skyboxVAO); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture); + glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); + glBindVertexArray(0); + + // Switch back to the normal depth function + glDepthFunc(GL_LESS); + glUseProgram(0); glfwSwapBuffers(window); } @@ -376,6 +610,73 @@ void loadModelToContext(std::string path, Core::RenderContext& context) context.initFromAssimpMesh(scene->mMeshes[0]); } +void initSkybox() { + + glUseProgram(programSkybox); + //unsigned int skyboxVAO, skyboxVBO, skyboxEBO; + glGenVertexArrays(1, &skyboxVAO); + glGenBuffers(1, &skyboxVBO); + glGenBuffers(1, &skyboxEBO); + glBindVertexArray(skyboxVAO); + glBindBuffer(GL_ARRAY_BUFFER, skyboxVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), &skyboxVertices, GL_STATIC_DRAW); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, skyboxEBO); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(skyboxIndices), &skyboxIndices, GL_STATIC_DRAW); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + std::string facesCubemap[6] = + { + "./front.png", + "./back.png", + "./up.png", + "./down.png", + "./right.png", + "./left.png" + }; + + //unsigned int cubemapTexture; + glGenTextures(1, &cubemapTexture); + glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + // These are very important to prevent seams + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + for (unsigned int i = 0; i < 6; i++) + { + int width, height, nrChannels; + unsigned char* data = stbi_load(facesCubemap[i].c_str(), &width, &height, &nrChannels, 0); + if (data) + { + //stbi_set_flip_vertically_on_load(false); + glTexImage2D + ( + GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, + 0, + GL_RGB, + width, + height, + 0, + GL_RGB, + GL_UNSIGNED_BYTE, + data + ); + stbi_image_free(data); + } + else + { + std::cout << "Failed to load texture: " << facesCubemap[i] << std::endl; + stbi_image_free(data); + } + } +} + void initDepthMap() { glGenFramebuffers(1, &depthMapFBO); @@ -400,24 +701,43 @@ void init(GLFWwindow* window) { glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); initDepthMap(); + initSkybox(); glEnable(GL_DEPTH_TEST); program = shaderLoader.CreateProgram("shaders/shader_9_1.vert", "shaders/shader_9_1.frag"); programSun = shaderLoader.CreateProgram("shaders/shader_8_sun.vert", "shaders/shader_8_sun.frag"); programDepth = shaderLoader.CreateProgram("shaders/shader_depth.vert", "shaders/shader_depth.frag"); - + programSkybox = shaderLoader.CreateProgram("shaders/skybox.vert", "shaders/skybox.frag"); + loadModelToContext("./models/sphere.obj", sphereContext); loadModelToContext("./models/spaceship.obj", shipContext); loadModelToContext("./models/spaceship.obj", models::spaceshipContext); loadModelToContext("./models/sphere.obj", models::sphereContext); - loadModelToContext("./models2/Frame/Frame.obj", models::windowFrame); loadModelToContext("./models2/bookshelf/shelf.obj", models::bookShelf); loadModelToContext("./models2/potplant/Pot.obj", models::potPlant); loadModelToContext("./models2/lamp/Lamp_LOVMANAD_OBJ.obj", models::lamp); loadModelToContext("./models2/door/source/door.obj", models::door); + loadModelToContext("./models2/bed/untitled.obj", models::bed); + loadModelToContext("./models2/laptop/10119_Laptop_Computer_v2_max2011_SG_it2.obj", models::laptop); + loadModelToContext("./models2/ceiling_lamp/ceilinglamp.obj", models::ceilingLamp); + loadModelToContext("./models2/desk/Desk0.5.obj", models::desk); + loadModelToContext("./models2/chair/chair.obj", models::officeChair); + loadModelToContext("./models2/window/WindowUK.obj", models::window); + loadModelToContext("./models2/carpet/carpet.obj", models::carpet); + loadModelToContext("./models2/room/floor.obj", models::floor); + loadModelToContext("./models2/room/floor.obj", models::roof); + loadModelToContext("./models2/room/longerWall.obj", models::longerWall); + loadModelToContext("./models2/room/smallerWall.obj", models::smallerWall); + loadModelToContext("./models2/room/smallerWall_ww.obj", models::smallerWall_ww); + loadModelToContext("./models2/room/longerWall_d.obj", models::longerWall_d); + loadModelToContext("./models2/cabinet/cabinet.obj", models::cabinet); + loadModelToContext("./models2/trashcan/trashcan.obj", models::trashcan); + loadModelToContext("./models2/cap/Cap.obj", models::cap); + loadModelToContext("./models/aquarium1.obj", models::aquarium); + textures::floorTexture = Core::LoadTexture("./models2/room/wood.png"); textures::flashlightTexture = Core::LoadTexture("./models/FlashlightTexture.png"); textures::sunTexture = Core::LoadTexture("./models/sun.jpeg"); textures::windowFrameTexture = Core::LoadTexture("./models2/Frame/frame.png"); @@ -425,6 +745,18 @@ void init(GLFWwindow* window) textures::potPlantTexture = Core::LoadTexture("./models2/potplant/b3.bmp"); textures::lampTexture = Core::LoadTexture("./models2/lamp/_Base_color.png"); textures::doorTexture = Core::LoadTexture("./models2/door/textures/Door_albedo.bmp"); + textures::bedTexture = Core::LoadTexture("./models2/bed/bed.png"); + textures::ceilingLampTexture = Core::LoadTexture("./models2/ceiling_lamp/ceilingLamp.png"); + textures::deskTexture = Core::LoadTexture("./models2/desk/defsk.png"); + textures::officeChariTexture = Core::LoadTexture("./models2/chair/chair.png"); + textures::windowFrameTexture = Core::LoadTexture("./models2/window/windowColor.png"); + textures::carpetTexture = Core::LoadTexture("./models2/carpet/1251.jpg"); + textures::roofTexture = Core::LoadTexture("./models2/room/roof.png"); + textures::longerWallTexture = Core::LoadTexture("./models2/room/longerWall.png"); + textures::longerWallTexture = Core::LoadTexture("./models2/room/smallerWall.png"); + textures::laptopTexture = Core::LoadTexture("./models2/laptop/10119_Laptop_Computer_v1_Diffuse_SG.jpg"); + textures::trashcanTexture = Core::LoadTexture("./models2/trashcan/trashcan.jpg"); + textures::capTexture = Core::LoadTexture("./models2/cap/Cap.jpg"); } void shutdown(GLFWwindow* window) @@ -443,9 +775,9 @@ void processInput(GLFWwindow* window) glfwSetWindowShouldClose(window, true); } if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) - spaceshipPos += spaceshipDir * moveSpeed; + spaceshipPos += glm::vec3(cameraDir.x, 0.0f, cameraDir.z) * moveSpeed; if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) - spaceshipPos -= spaceshipDir * moveSpeed; + spaceshipPos -= glm::vec3(cameraDir.x, 0.0f, cameraDir.z) * moveSpeed; if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) spaceshipPos += spaceshipSide * moveSpeed; if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) @@ -467,20 +799,20 @@ void processInput(GLFWwindow* window) glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); glfwGetCursorPos(window, &xpos, &ypos); - float rotX = sensitivity * (float)(xpos - (HEIGHT / 2)) / HEIGHT; - float rotY = sensitivity * (float)(ypos - (WIDTH / 2)) / WIDTH; + float rotX = sensitivity * (float)(xpos - (WIDTH / 2)) / HEIGHT; + float rotY = sensitivity * (float)(ypos - (HEIGHT / 2)) / WIDTH; - glm::vec3 newOrientation = glm::rotate(spaceshipDir, glm::radians(-rotY), glm::normalize(glm::cross(spaceshipDir, Up))); + glm::vec3 newOrientation = glm::rotate(spaceshipDir, glm::radians(-rotY), glm::normalize(glm::cross(spaceshipDir, spaceshipUp))); // Decides whether or not the next vertical Orientation is legal or not - if (abs(glm::angle(newOrientation, Up) - glm::radians(90.0f)) <= glm::radians(85.0f)) + if (abs(glm::angle(newOrientation, spaceshipUp) - glm::radians(90.0f)) <= glm::radians(85.0f)) { spaceshipDir = newOrientation; } // Rotates the Orientation left and right - spaceshipDir = glm::rotate(spaceshipDir, glm::radians(-rotX), Up); + spaceshipDir = glm::rotate(spaceshipDir, glm::radians(-rotX), spaceshipUp); glfwSetCursorPos(window, WIDTH/2, HEIGHT/2); }