From d38924b2a47ab398cd673df8c29612d69f2f0a2d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz>
Date: Sat, 6 May 2023 11:04:52 +0200
Subject: [PATCH] light uses own frame, attempt to fix pitch

---
 src/gfx/include/gfx/cam_control.hpp |  8 --------
 src/gfx/include/gfx/light.hpp       | 19 ++++--------------
 src/gfx/src/cam_control.cpp         | 31 ++++++++---------------------
 src/gfx/src/render.cpp              |  1 -
 src/studio/src/simulator.cpp        |  2 +-
 5 files changed, 13 insertions(+), 48 deletions(-)

diff --git a/src/gfx/include/gfx/cam_control.hpp b/src/gfx/include/gfx/cam_control.hpp
index bd2339a..84dba3c 100644
--- a/src/gfx/include/gfx/cam_control.hpp
+++ b/src/gfx/include/gfx/cam_control.hpp
@@ -14,20 +14,12 @@
 
 class CameraController : public Controller
 {
-    float overall_pitch = 0.0f;
-    float overall_yaw = -90.0f; 
-
     glm::vec2 sens;
     float sens_multiplier = 10.0f;
 
 public:
     using Controller::Controller;
 
-    float getPitch() { return overall_pitch; }
-    float getYaw() { return overall_yaw; }
-    void adjustPitch(float yoffset);
-    void setYaw(float xoffset);
-
     void setFrontVec(float xoffset, float yoffset);
 
     void turn(float xoffset, float yoffset);
diff --git a/src/gfx/include/gfx/light.hpp b/src/gfx/include/gfx/light.hpp
index 5923c3d..8fb65bc 100644
--- a/src/gfx/include/gfx/light.hpp
+++ b/src/gfx/include/gfx/light.hpp
@@ -9,37 +9,26 @@ class Light
 {
 protected:
     glm::vec3 color;
+    Frame frame;
 public:
-    Light(glm::vec3 _color) : color{_color} {}
+    Light(glm::vec3 _color, glm::vec3 _pos) : color{_color}, frame{_pos} {}
     glm::vec3 getColor() { return color; }
 
-    // WTF, FIX!!!
-    virtual glm::vec3 getPosition() { return color; }
+    virtual glm::vec3 getPosition() { return frame.getPosition(); }
+    virtual glm::vec3 getDirection() { return frame.getPosition(); }
     virtual ~Light() = default;
 };
 
 class DirLight : public Light
 {
-    glm::vec3 direction;
 public:
     using Light::Light;
-    DirLight(glm::vec3 _color, glm::vec3 _direction) : Light{_color}, direction{_direction} {}
-    glm::vec3 getDirection() { return direction; }
 };
 
 class PointLight : public Light
 {
-    glm::vec3 position;
-    bool bound_to_frame = false;
-    std::shared_ptr<Frame> bound_frame;
-
 public:
     using Light::Light;
-    PointLight(glm::vec3 _color, glm::vec3 _position) : Light{_color}, position{_position} {}
-    PointLight(glm::vec3 _color, std::shared_ptr<Frame> _bound_frame) 
-    : Light{_color}, bound_frame{_bound_frame} { bound_to_frame = true; }
-
-    glm::vec3 getPosition() override { return bound_to_frame ? bound_frame->getPosition() : position; }
 };
 
 #endif
\ No newline at end of file
diff --git a/src/gfx/src/cam_control.cpp b/src/gfx/src/cam_control.cpp
index 9688d1c..404da09 100644
--- a/src/gfx/src/cam_control.cpp
+++ b/src/gfx/src/cam_control.cpp
@@ -1,40 +1,25 @@
 #include <gfx/cam_control.hpp>
 #include <iostream>
 
-void CameraController::adjustPitch(float yoffset)
-{
-    overall_pitch += yoffset;
-
-    if(overall_pitch > glm::radians(89.0f))
-    {
-        overall_pitch = glm::radians(89.0f);
-    }
-    else if(overall_pitch < glm::radians(-89.0f))
-    {
-        overall_pitch = glm::radians(-89.0f);
-    }
-}
-
-void CameraController::setYaw(float xoffset) { overall_yaw += xoffset; }
-
 void CameraController::setFrontVec(float xoffset, float yoffset)
 {
     // TO DO: fix pitch
     auto pitch = glm::angleAxis(yoffset, glm::vec3(1, 0, 0));
     auto yaw = glm::angleAxis(-xoffset, glm::vec3(0, 1, 0));
-    bound_frame->rotateRotationQuat(pitch * yaw);
-
-    // auto pitch = glm::angleAxis(overall_pitch, glm::vec3(1, 0, 0));
-    // auto yaw = glm::angleAxis(-overall_yaw, glm::vec3(0, 1, 0));
-    // bound_frame->setRotationQuat(pitch * yaw);
+    auto temp_rot_quat = pitch * bound_frame->getRotation();
+    auto temp_y_axis = glm::column(glm::toMat3(temp_rot_quat), 1);
+    std::cout << "dot product: " << glm::dot(temp_y_axis, glm::vec3(0, 1, 0)) << std::endl;
+    if (glm::dot(temp_y_axis, glm::vec3(0, 1, 0)) > 0.15f) // 0
+    {
+        bound_frame->rotateRotationQuat(pitch * yaw);
+    }
 }
 
 void CameraController::turn(float xoffset, float yoffset)
 {
     if (xoffset == 0 && yoffset == 0)
         return;
-    setYaw(xoffset);
-    adjustPitch(yoffset);
+
     setFrontVec(xoffset, yoffset);
 }
 
diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp
index 6305d65..dcf1c9b 100644
--- a/src/gfx/src/render.cpp
+++ b/src/gfx/src/render.cpp
@@ -84,7 +84,6 @@ void draw_objects(std::map<std::string, shader_ptr> &myShaders, Light &light,
         {
             // Hardcoded light index
             // TO DO: enum promennych z shaderu
-            // TO DO: Light struct, kde bude info o pos, color
             myShaders[shader_used]->setVec3("lightColor", light.getColor());
             myShaders[shader_used]->setVec3("lightPos", light.getPosition()); 
             myShaders[shader_used]->setVec3("viewPos", cam_frames[active_camera]->getPosition()); 
diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp
index 6ecce98..c1a3035 100644
--- a/src/studio/src/simulator.cpp
+++ b/src/studio/src/simulator.cpp
@@ -124,7 +124,7 @@ Simulator::Simulator()
     , obj_frames{std::make_shared<Frame>(),
                  std::make_shared<Frame>(glm::vec3(1.2f, 2.0f, 2.0f ))}
     , obj_controls{std::make_shared<ObjectController>()}
-    , light{PointLight(glm::vec3(1.0f, 1.0f, 1.0f), obj_frames[1])}
+    , light{glm::vec3(1.0f, 1.0f, 1.0f), obj_frames[1]->getPosition()}
 {
     // SET LIGHT CUBE SHADER AND SIZE
     objects[1]->setShaderType("basic");
-- 
GitLab