From d6e28d796fa3268642ed09836c5ce78545040e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz> Date: Wed, 3 May 2023 01:35:01 +0200 Subject: [PATCH] added light class --- src/gfx/include/gfx/frame.hpp | 32 --------------------- src/gfx/include/gfx/light.hpp | 38 +++++++++++++++++++++---- src/gfx/include/gfx/render.hpp | 2 +- src/gfx/src/render.cpp | 12 ++++---- src/studio/include/studio/simulator.hpp | 2 +- src/studio/src/simulator.cpp | 4 +-- 6 files changed, 43 insertions(+), 47 deletions(-) diff --git a/src/gfx/include/gfx/frame.hpp b/src/gfx/include/gfx/frame.hpp index e83c36e..a094b69 100644 --- a/src/gfx/include/gfx/frame.hpp +++ b/src/gfx/include/gfx/frame.hpp @@ -25,38 +25,6 @@ public: setRotationQuat(rotation); } - Frame(Frame &f) - { - positionVec = f.getPosition(); - rotationQuat = f.getRotation(); - scaleVec = f.getScale(); - } - - Frame(Frame &&f) - { - positionVec = f.getPosition(); - rotationQuat = f.getRotation(); - scaleVec = f.getScale(); - } - - Frame& operator=(Frame &f) - { - positionVec = f.getPosition(); - rotationQuat = f.getRotation(); - scaleVec = f.getScale(); - return *this; - } - - Frame& operator=(Frame &&f) - { - positionVec = f.getPosition(); - rotationQuat = f.getRotation(); - scaleVec = f.getScale(); - return *this; - } - - // ~Frame() = 0; - glm::vec3 getPosition() { return positionVec; } glm::quat getRotation() { return rotationQuat; } glm::vec3 getScale() { return scaleVec; } diff --git a/src/gfx/include/gfx/light.hpp b/src/gfx/include/gfx/light.hpp index c284fb5..5923c3d 100644 --- a/src/gfx/include/gfx/light.hpp +++ b/src/gfx/include/gfx/light.hpp @@ -3,15 +3,43 @@ #include <glad/glad.h> #include <glm/glm.hpp> +#include <gfx/frame.hpp> class Light { - glm::vec3* position; - glm::vec3* color; - Light(glm::vec3* _position, glm::vec3* _color) : position{_position}, color{_color} {} +protected: + glm::vec3 color; +public: + Light(glm::vec3 _color) : color{_color} {} + glm::vec3 getColor() { return color; } - glm::vec3 getPosition() { return *position; } - glm::vec3 getColor() { return *color; } + // WTF, FIX!!! + virtual glm::vec3 getPosition() { return color; } + 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/include/gfx/render.hpp b/src/gfx/include/gfx/render.hpp index 7596f1b..a18ca6f 100644 --- a/src/gfx/include/gfx/render.hpp +++ b/src/gfx/include/gfx/render.hpp @@ -20,7 +20,7 @@ using shader_ptr = std::shared_ptr<Shader>; std::vector<float> generate_grid_vertices(int span); std::vector<unsigned int> generate_grid_indices(int span); void send_matrices_to_shader(Shader &myShader, glm::mat4 &model, glm::mat4 &view, glm::mat4 &projection); -void gfx_draw(std::map<std::string, shader_ptr> &myShaders, +void gfx_draw(std::map<std::string, shader_ptr> &myShaders, Light &light, std::vector<camera_ptr> &cameras, std::vector<frame_ptr> &cam_frames, int active_camera, std::vector<object_ptr> &objects, std::vector<frame_ptr> &obj_frames, Object &grid, Frame &grid_frame); diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp index b5a29c0..6305d65 100644 --- a/src/gfx/src/render.cpp +++ b/src/gfx/src/render.cpp @@ -69,7 +69,8 @@ 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, std::vector<frame_ptr> &cam_frames, int active_camera, +void draw_objects(std::map<std::string, shader_ptr> &myShaders, Light &light, + std::vector<frame_ptr> &cam_frames, int active_camera, std::vector<object_ptr> &objects,std::vector<frame_ptr> &obj_frames, glm::mat4 &view, glm::mat4 &projection) { @@ -84,8 +85,8 @@ void draw_objects(std::map<std::string, shader_ptr> &myShaders, std::vector<fram // Hardcoded light index // TO DO: enum promennych z shaderu // TO DO: Light struct, kde bude info o pos, color - myShaders[shader_used]->setVec3("lightColor", objects[1]->getColor()); - myShaders[shader_used]->setVec3("lightPos", obj_frames[1]->getPosition()); + myShaders[shader_used]->setVec3("lightColor", light.getColor()); + myShaders[shader_used]->setVec3("lightPos", light.getPosition()); myShaders[shader_used]->setVec3("viewPos", cam_frames[active_camera]->getPosition()); } @@ -120,8 +121,7 @@ void draw_grid(std::map<std::string, shader_ptr> &myShaders, Object &grid, Frame ASSUMPTION(glGetError() == GL_NO_ERROR); } -// TO DO: only objs, shaders - no frames? -void gfx_draw(std::map<std::string, shader_ptr> &myShaders, +void gfx_draw(std::map<std::string, shader_ptr> &myShaders, Light &light, std::vector<camera_ptr> &cameras, std::vector<frame_ptr> &cam_frames, int active_camera, std::vector<object_ptr> &objects, std::vector<frame_ptr> &obj_frames, Object &grid, Frame &grid_frame) @@ -163,7 +163,7 @@ void gfx_draw(std::map<std::string, shader_ptr> &myShaders, ASSUMPTION(glGetError() == GL_NO_ERROR); // DRAW OBJECTS - draw_objects(myShaders, cam_frames, active_camera, objects, obj_frames, view, projection); + draw_objects(myShaders, light, cam_frames, active_camera, objects, obj_frames, view, projection); // DRAW GRID draw_grid(myShaders, grid, grid_frame, view, projection); diff --git a/src/studio/include/studio/simulator.hpp b/src/studio/include/studio/simulator.hpp index ef6fc69..74b4a10 100644 --- a/src/studio/include/studio/simulator.hpp +++ b/src/studio/include/studio/simulator.hpp @@ -63,7 +63,7 @@ struct Simulator : public osi::Simulator Object grid = Object(generate_grid_vertices(100), generate_grid_indices(100), {0, -1, 0}); Frame grid_frame = Frame({0, 0, 0}); - // Light light; + PointLight light; std::map<std::string, shader_ptr> myShaders; }; diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp index de93804..6ecce98 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{&obj_frames[1]->getPosition(), &objects[1]->getColor()} + , light{PointLight(glm::vec3(1.0f, 1.0f, 1.0f), obj_frames[1])} { // SET LIGHT CUBE SHADER AND SIZE objects[1]->setShaderType("basic"); @@ -166,7 +166,7 @@ void Simulator::present() cameras[active_camera]->setWindowSize(window().size()); } - gfx_draw(myShaders, cameras, cam_frames, active_camera, objects, obj_frames, grid, grid_frame); + gfx_draw(myShaders, light, cameras, cam_frames, active_camera, objects, obj_frames, grid, grid_frame); } // Object movement now works only for one object -- GitLab