From 712c2655cf1fcef260662961470d3e337739928d Mon Sep 17 00:00:00 2001 From: 4VRDriver <44267643+4VRDriver@users.noreply.github.com> Date: Fri, 11 Sep 2020 11:11:11 +0200 Subject: [PATCH] First progress, not yet functional --- .vscode/launch.json | 2 +- res/shaders/basic.frag | 21 +++++++++++++++--- src/CMakeLists.txt | 2 ++ src/Controller.cpp | 15 +++++-------- src/EventHandler.cpp | 4 +--- src/Light.cpp | 41 ++++++++++++++++++++++++++++++++++++ src/Light.h | 48 ++++++++++++++++++++++++++++++++++++++++++ src/Scene.cpp | 6 ++++++ src/Scene.h | 19 +++++++++++++++++ 9 files changed, 141 insertions(+), 17 deletions(-) create mode 100644 src/Light.cpp create mode 100644 src/Light.h create mode 100644 src/Scene.cpp create mode 100644 src/Scene.h diff --git a/.vscode/launch.json b/.vscode/launch.json index f3f9bc5..432b072 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,7 +14,7 @@ "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], - "externalConsole": true, + "externalConsole": flase, "MIMode": "gdb", "preLaunchTask": "Build", "setupCommands": [ diff --git a/res/shaders/basic.frag b/res/shaders/basic.frag index 80f4885..9d432a8 100644 --- a/res/shaders/basic.frag +++ b/res/shaders/basic.frag @@ -16,6 +16,7 @@ struct Material { uniform Material u_material; struct DirectionalLight { + bool isActive; vec3 direction; vec3 ambient; @@ -25,6 +26,7 @@ struct DirectionalLight { uniform DirectionalLight u_directionalLight; struct PointLight { + bool isActive; vec3 position; float K_c; @@ -35,10 +37,11 @@ struct PointLight { vec3 diffuse; vec3 specular; }; -#define NR_POINT_LIGHTS 1 -uniform PointLight u_pointLight[NR_POINT_LIGHTS]; +#define NUM_POINT_LIGHTS 16 +uniform PointLight u_pointLight[NUM_POINT_LIGHTS]; struct SpotLight { + bool isActive; vec3 position; vec3 direction; @@ -71,7 +74,7 @@ void main() { fragmentColor += directionalLightContribution(u_directionalLight, normal, viewDir); - for(int i = 0; i < NR_POINT_LIGHTS; i++) { + for(int i = 0; i < NUM_POINT_LIGHTS; i++) { fragmentColor += pointLightContribution(u_pointLight[i], normal, v_fragmentPosition, viewDir); } @@ -83,6 +86,10 @@ void main() { vec3 directionalLightContribution(DirectionalLight light, vec3 normal, vec3 viewDir) { + // Only compute if light source is active + if(!light.isActive) + return vec3(0.0f); + vec3 lightDir = normalize(-light.direction); // Diffuse shading @@ -104,6 +111,10 @@ vec3 directionalLightContribution(DirectionalLight light, vec3 normal, vec3 view vec3 pointLightContribution(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir) { + // Only compute if light source is active + if(!light.isActive) + return vec3(0.0f); + vec3 lightDir = normalize(light.position - fragPos); // Diffuse shading @@ -133,6 +144,10 @@ vec3 pointLightContribution(PointLight light, vec3 normal, vec3 fragPos, vec3 vi vec3 spotLightContribution(SpotLight light, vec3 normal, vec3 fragPos, vec3 viewDir) { + // Only compute if light source is active + if(!light.isActive) + return vec3(0.0f); + vec3 lightDir = normalize(light.position - fragPos); // Diffuse shading diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d0da5b3..dcd33f0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,6 +10,8 @@ add_executable(Fall-Fever Mesh.cpp Model.cpp Entity.cpp + Light.cpp + Scene.cpp ) target_link_libraries( diff --git a/src/Controller.cpp b/src/Controller.cpp index 05f98c8..2cf8356 100644 --- a/src/Controller.cpp +++ b/src/Controller.cpp @@ -23,6 +23,7 @@ #include "Texture.h" #include "Model.h" #include "Entity.h" +#include "Scene.h" Controller::Controller() { if(!glfwInit()) exit(-1); @@ -108,17 +109,11 @@ void Controller::run() { shaderProgram.setUniform("u_directionalLight.diffuse", diffuseColor * 0.25f); shaderProgram.setUniform("u_directionalLight.specular", specularColor * 0.25f); - shaderProgram.setUniform("u_pointLight[0].position", lightSource.getPosition()); - shaderProgram.setUniform("u_pointLight[0].ambient", ambientColor); - shaderProgram.setUniform("u_pointLight[0].diffuse", diffuseColor); - shaderProgram.setUniform("u_pointLight[0].specular", specularColor); - shaderProgram.setUniform("u_pointLight[0].K_c", 1.0f); - shaderProgram.setUniform("u_pointLight[0].K_l", 0.09f); - shaderProgram.setUniform("u_pointLight[0].K_q", 0.032f); - shaderProgram.setUniform("u_material.shininess", 32.0f); shaderProgram.unbind(); + Scene scene(&shaderProgram); + scene.push_back(dragon); scene.push_back(lightSource); @@ -209,8 +204,8 @@ void Controller::renderImGui(Entity *entity) { static float rotation = 0.0; ImGui::SliderFloat("Rotation", &rotation, 0, 2 * M_PI); static float translation[] = {0.0f, 0.0f}; - ImGui::SliderFloat2("Position", translation, -3.0, 3.0); - static float color[4] = { 1.0f,1.0f,1.0f,1.0f }; + ImGui::SliderFloat2("Position", translation, -4.0, 4.0); + static float color[4] = {1.0f, 1.0f, 1.0f, 1.0f}; entity->setPosition(glm::vec3(translation[0], 0.0f, translation[1])); //entity->setRotation() diff --git a/src/EventHandler.cpp b/src/EventHandler.cpp index 59a40ad..91d6732 100644 --- a/src/EventHandler.cpp +++ b/src/EventHandler.cpp @@ -14,8 +14,6 @@ EventHandler::EventHandler(GLFWwindow *window) : window(window) { glfwSetKeyCallback(window, key_callback); - - // Currently disabled because callbacks are shitty glfwSetCursorPosCallback(window, mouse_callback); } @@ -31,7 +29,7 @@ void EventHandler::handleEvents() { void EventHandler::key_callback(GLFWwindow *window, int key, int scancode, int action, int mods) { // Silence warnings of unused variables. - (void)window; (void)scancode; (void)mods; (void)key; (void)action; + (void)window; (void)scancode; (void)mods; if(key==GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, true); diff --git a/src/Light.cpp b/src/Light.cpp new file mode 100644 index 0000000..7f2fa8b --- /dev/null +++ b/src/Light.cpp @@ -0,0 +1,41 @@ +#include "Light.h" + +#include + +PointLight::PointLight(ShaderProgram *shaderProgram) + : Light(shaderProgram) { + + +} + +void PointLight::update() { + + std::string uName; + + shaderProgram->bind(); + uName = "u_pointLight[" + std::to_string(lightId) + "].isActive"; + shaderProgram->setUniform(uName.c_str(), isActive); + + uName = "u_pointLight[" + std::to_string(lightId) + "].position"; + shaderProgram->setUniform(uName.c_str(), position); + + uName = "u_pointLight[" + std::to_string(lightId) + "].ambient"; + shaderProgram->setUniform(uName.c_str(), ambientColor); + + uName = "u_pointLight[" + std::to_string(lightId) + "].diffuse"; + shaderProgram->setUniform(uName.c_str(), diffuseColor); + + uName = "u_pointLight[" + std::to_string(lightId) + "].specular"; + shaderProgram->setUniform(uName.c_str(), specularColor); + + uName = "u_pointLight[" + std::to_string(lightId) + "].K_c"; + shaderProgram->setUniform(uName.c_str(), K_c); + + uName = "u_pointLight[" + std::to_string(lightId) + "].K_l"; + shaderProgram->setUniform(uName.c_str(), K_l); + + uName = "u_pointLight[" + std::to_string(lightId) + "].K_q"; + shaderProgram->setUniform(uName.c_str(), K_q); + shaderProgram->unbind(); + +} diff --git a/src/Light.h b/src/Light.h new file mode 100644 index 0000000..792e581 --- /dev/null +++ b/src/Light.h @@ -0,0 +1,48 @@ +#pragma once + +#include + +#include "ShaderProgram.h" + +#define NUM_POINT_LIGHTS 16 + +class Light { + +public: + + virtual void update() = 0; + + void setActive(bool active) { isActive = active; } + +protected: + + Light(ShaderProgram *shaderProgram) : shaderProgram(shaderProgram) {} + + ShaderProgram *shaderProgram; + + bool isActive; + + // Color + glm::vec3 lightColor = glm::vec3(1.0f, 1.0f, 1.0f); + glm::vec3 diffuseColor = lightColor * glm::vec3(1.0f); + glm::vec3 ambientColor = diffuseColor * glm::vec3(0.1f); + glm::vec3 specularColor = glm::vec3(1.0f); + +}; + +class PointLight : public Light { + + PointLight(ShaderProgram *shaderProgram); + + void update(); + +private: + + unsigned int lightId; + + glm::vec3 position; + float K_c = 1.0f; + float K_l = 0.09f; + float K_q = 0.032f; + +}; diff --git a/src/Scene.cpp b/src/Scene.cpp new file mode 100644 index 0000000..2fc5824 --- /dev/null +++ b/src/Scene.cpp @@ -0,0 +1,6 @@ +#include "Scene.h" + +Scene::Scene(ShaderProgram *shaderProgram) + : shaderProgram(shaderProgram), pointLights(shaderProgram) { + +} diff --git a/src/Scene.h b/src/Scene.h new file mode 100644 index 0000000..6990f15 --- /dev/null +++ b/src/Scene.h @@ -0,0 +1,19 @@ +#pragma once + +#include "Light.h" + +class Scene { + +public: + + Scene(ShaderProgram *shaderProgram); + +private: + + ShaderProgram *shaderProgram; + + //DirectionalLight directionalLight; + PointLight pointLights[NUM_POINT_LIGHTS]; + //SpotLight spotLight; + +}; \ No newline at end of file