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