diff --git a/headers/camera.hpp b/headers/camera.hpp index e21f414..186a073 100644 --- a/headers/camera.hpp +++ b/headers/camera.hpp @@ -7,7 +7,10 @@ public: Camera(glm::vec3 pos, float yaw, float pitch, float fov, float aspect); ~Camera(); void setPos(glm::vec3 pos); + void addPos(glm::vec3 pos); + void addFPos(glm::vec3 pos); void setRotate(float yaw, float pitch); + void addRotate(float yaw, float pitch); glm::mat4 getView(); glm::mat4 getProjection(); float aspect; diff --git a/shaders/lighting/Frag.glsl b/shaders/lighting/Frag.glsl index a3d7ace..f0ed3ef 100644 --- a/shaders/lighting/Frag.glsl +++ b/shaders/lighting/Frag.glsl @@ -6,35 +6,43 @@ struct Material { float shininess; }; + +struct Light { + vec3 position; + vec3 ambient; + vec3 diffuse; + vec3 specular; +}; + + out vec4 FragColor; in vec3 FragPos; in vec3 Normal; uniform vec3 ourColor; -uniform vec3 lightColor; -uniform vec3 lightPos; uniform vec3 viewPos; uniform Material material; +uniform Light light; void main() { //misc vec3 norm = normalize(Normal); - vec3 lightDir = normalize(lightPos - FragPos); + vec3 lightDir = normalize(light.position - FragPos); // ambient - vec3 ambient = vec3(0.2) * (lightColor * material.ambient); + vec3 ambient = light.ambient * material.ambient; // diffuse float diff = max(dot(norm, lightDir), 0.0); - vec3 diffuse = lightColor * (diff * material.diffuse); + vec3 diffuse = light.diffuse * (diff * material.diffuse); // specular vec3 viewDir = normalize(viewPos - FragPos); vec3 reflectDir = reflect(-lightDir, norm); float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); - vec3 specular = vec3(0.5) * (lightColor * (spec * material.specular)); + vec3 specular = light.specular * (spec * material.specular); //out vec3 result = ambient + diffuse + specular; diff --git a/src/camera.cpp b/src/camera.cpp index c5863de..ed568e9 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -16,8 +16,28 @@ void Camera::setRotate(float yaw, float pitch) { update(); } +void Camera::addRotate(float yaw, float pitch) { + this->yaw += yaw; + this->pitch += pitch; + if (this->pitch > 89.0f) + this->pitch = 89.0f; + if (this->pitch < -89.0f) + this->pitch = -89.0f; + update(); +} + void Camera::setPos(glm::vec3 pos) { this->pos = pos; } +void Camera::addPos(glm::vec3 pos) { this->pos += pos; } + +void Camera::addFPos(glm::vec3 pos) { + glm::vec3 f = glm::normalize(glm::vec3(front.x, 0, front.z)); + glm::vec3 r = glm::normalize(glm::cross(f, up)); + this->pos += f * pos.x; + this->pos += up * pos.y; + this->pos += r * pos.z; +} + void Camera::update() { glm::vec3 direction; direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch)); diff --git a/src/main.cpp b/src/main.cpp index 454c0a4..efc0045 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,8 +10,12 @@ #define UNUSED(x) (void)(x) -void processInput(GLFWwindow *window); +glm::vec3 processInput(GLFWwindow *window); void framebuffer_size_callback(GLFWwindow *window, int width, int height); +void mouse_callback(GLFWwindow *window, double xpos, double ypos); + +float deltaTime = 0; + GLFWwindow *init() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); @@ -25,9 +29,11 @@ GLFWwindow *init() { int is_ok = 0; is_ok = gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); assert(is_ok && "Failed to init glad"); + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); glViewport(0, 0, 800, 600); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + glfwSetCursorPosCallback(window, mouse_callback); return window; } @@ -50,11 +56,10 @@ unsigned int meshInit() { int main(void) { glm::vec3 lightPos = glm::vec3(1, 2.0f, 1); - glm::vec3 cameraPos = glm::vec3(2.3, 3, 5); glm::vec3 lightColor = glm::vec3(1); GLFWwindow *window = init(); - Camera *cam = new Camera(cameraPos, -115.0f, -25.0f, 45, 800.0 / 600); + Camera *cam = new Camera(glm::vec3(0), 0, 0, 45, 800.0 / 600); glfwSetWindowUserPointer(window, cam); Shader *cubeShader = new Shader("./shaders/lighting/Vert.glsl", @@ -72,7 +77,12 @@ int main(void) { light->setScale(glm::vec3(.3)); glEnable(GL_DEPTH_TEST); + float lastFrame = 0; while (!glfwWindowShouldClose(window)) { + float currentFrame = static_cast(glfwGetTime()); + deltaTime = currentFrame - lastFrame; + lastFrame = currentFrame; + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -83,12 +93,15 @@ int main(void) { s->setVec3("lightPos", lightPos); s->setVec3("viewPos", glm::vec3(0.0, 0.0, 5.0)); - /*mat taken from*/ - /*http://devernay.free.fr/cours/opengl/materials.html*/ - s->setVec3("material.ambient", glm::vec3(0.24725, 0.1995, 0.0745)); - s->setVec3("material.diffuse", glm::vec3(0.75164, 0.60648, 0.22648)); - s->setVec3("material.specular", glm::vec3(0.628281, 0.555802, 0.366065)); - s->setFloat("material.shininess", 0.4 * 128); + s->setVec3("light.ambient", glm::vec3(0.2)); + s->setVec3("light.diffuse", glm::vec3(0.5)); + s->setVec3("light.specular", glm::vec3(1)); + s->setVec3("light.position", lightPos); + + s->setVec3("material.ambient", glm::vec3(1.0, 0.5, 0.31)); + s->setVec3("material.diffuse", glm::vec3(1.0, 0.5, 0.31)); + s->setVec3("material.specular", glm::vec3(0.5)); + s->setFloat("material.shininess", 32); cube->draw(cam); s = light->getShader(); @@ -98,7 +111,9 @@ int main(void) { glfwSwapBuffers(window); glfwPollEvents(); - processInput(window); + glm::vec3 mov = processInput(window); + mov *= deltaTime; + cam->addFPos(mov); } delete cam; @@ -108,9 +123,26 @@ int main(void) { return 0; } -void processInput(GLFWwindow *window) { +glm::vec3 processInput(GLFWwindow *window) { + glm::vec3 mov = glm::vec3(0); if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); + + if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) + mov += glm::vec3(1, 0, 0); + if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) + mov -= glm::vec3(1, 0, 0); + if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) + mov += glm::vec3(0, 0, 1); + if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) + mov -= glm::vec3(0, 0, 1); + if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) + mov += glm::vec3(0, 1, 0); + if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS) + mov -= glm::vec3(0, 1, 0); + + mov *= 5; + return mov; } void framebuffer_size_callback(GLFWwindow *window, int width, int height) { @@ -120,3 +152,20 @@ void framebuffer_size_callback(GLFWwindow *window, int width, int height) { if (cam) cam->aspect = (float)width / height; } + +void mouse_callback(GLFWwindow *window, double xpos, double ypos) { + static float xprev = 0.0, yprev = 0.0; + + float xchange = xpos - xprev; + float ychange = yprev - ypos; + xprev = xpos; + yprev = ypos; + + float sensitivity = 0.1f; + xchange *= sensitivity; + ychange *= sensitivity; + + Camera *cam = (Camera *)glfwGetWindowUserPointer(window); + if (cam) + cam->addRotate(xchange, ychange); +}