diff --git a/src/gfx/include/gfx/frame.hpp b/src/gfx/include/gfx/frame.hpp index e83c36e2daebf56e3e962e6677291966c721fd0b..a094b69d3a73b892d2ba9944b87e3db4cc04744f 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 c284fb5e4a126b90b18af27947e827164acb6237..5923c3d24907eb0362181f3fc5f662e631e0a836 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 7596f1b7f26df78bd190d298b8022665011eb3aa..a18ca6f31c3c04289643deb8c2745cadc868abc4 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 b5a29c058998712a488262c1876f885ca2cf5192..6305d65f2fe29e1a034f2e1b4a624ab55573d742 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 ef6fc69ee3758d979f132abffe52e4481d612199..74b4a10ee8ff07e90645a08dff0d091c08e38f20 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 de9380478df75593ad33de78544a62a71273a8b2..6ecce98c06378912fd77ef6483c9607a42fe9fd4 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