From d726a2606bfc61ae27832cb5b4b959d33f317e79 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz>
Date: Mon, 24 Apr 2023 15:45:15 +0200
Subject: [PATCH] added specular lighting

---
 data/shaders/lightshader.frag   | 12 +++++++++++-
 src/gfx/include/gfx/control.hpp |  2 +-
 src/gfx/src/render.cpp          |  5 +++--
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/data/shaders/lightshader.frag b/data/shaders/lightshader.frag
index 9ae137b..95cda80 100644
--- a/data/shaders/lightshader.frag
+++ b/data/shaders/lightshader.frag
@@ -7,17 +7,27 @@ in vec3 Normal;
 uniform vec3 objectColor;
 uniform vec3 lightColor;
 uniform vec3 lightPos;
+uniform vec3 viewPos;
 
 void main()
 {
+    //ambient
     float ambientStrength = 0.1;
     vec3 ambient = ambientStrength * lightColor;
 
+    // diffuse
     vec3 norm = normalize(Normal);
     vec3 lightDir = normalize(lightPos - FragPos);
 
     float diff = max(dot(norm, lightDir), 0.0);
     vec3 diffuse = diff * lightColor;
 
-    FragColor = vec4((ambient + diffuse) * objectColor, 1.0f);
+    // specular
+    float specularStrength = 0.5; // TO DO: Object shine
+    vec3 viewDir = normalize(viewPos - FragPos);
+    vec3 reflectDir = reflect(-lightDir, norm);  
+    float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
+    vec3 specular = specularStrength * spec * lightColor; 
+
+    FragColor = vec4((ambient + diffuse + specular) * objectColor, 1.0f);
 }
diff --git a/src/gfx/include/gfx/control.hpp b/src/gfx/include/gfx/control.hpp
index 8b4278b..eb0695b 100644
--- a/src/gfx/include/gfx/control.hpp
+++ b/src/gfx/include/gfx/control.hpp
@@ -18,8 +18,8 @@ protected:
     float step = 0;
 
     // FTO DO: shared ptr
-    //Frame &bound_frame;
     Frame* bound_frame;
+    //std::shared_ptr<Frame> bound_frame;
 
 public:
     Controller(Frame* frame) 
diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp
index cb4eae2..742fc5f 100644
--- a/src/gfx/src/render.cpp
+++ b/src/gfx/src/render.cpp
@@ -69,7 +69,7 @@ void send_matrices_to_shader(Shader &myShader, glm::mat4 &model, glm::mat4 &view
     ASSUMPTION(glGetError() == GL_NO_ERROR);
 }
 
-void draw_objects(std::map<std::string, shader_ptr> &myShaders, 
+void draw_objects(std::map<std::string, shader_ptr> &myShaders, Frame &cam_frame,
                   std::vector<object_ptr> &objects,std::vector<frame_ptr> &obj_frames,
                   glm::mat4 &view, glm::mat4 &projection)
 {
@@ -84,6 +84,7 @@ void draw_objects(std::map<std::string, shader_ptr> &myShaders,
             // Hardcoded light index
             myShaders[shader_used]->setVec3("lightColor", objects[1]->getColor());
             myShaders[shader_used]->setVec3("lightPos", obj_frames[1]->getPosition()); 
+            myShaders[shader_used]->setVec3("viewPos", cam_frame.getPosition()); 
         }
         
         glm::mat4 model = obj_frames[i]->getModelMat();
@@ -158,7 +159,7 @@ void gfx_draw(std::map<std::string, shader_ptr> &myShaders,
     ASSUMPTION(glGetError() == GL_NO_ERROR);
 
     // DRAW OBJECTS
-    draw_objects(myShaders, objects, obj_frames, view, projection);
+    draw_objects(myShaders, cam_frame, objects, obj_frames, view, projection);
     
     // DRAW GRID
     draw_grid(myShaders, grid, grid_frame, view, projection);
-- 
GitLab