diff --git a/src/gfx/include/gfx/camera.hpp b/src/gfx/include/gfx/camera.hpp index 0ac7962cb8af00846e0ce7934e9889d44f946050..f91fddd44980027325d1ba654e8ef7ee1f51265b 100644 --- a/src/gfx/include/gfx/camera.hpp +++ b/src/gfx/include/gfx/camera.hpp @@ -1,7 +1,7 @@ #ifndef CAMERA_INCLUDED #define CAMERA_INCLUDED -#include<glad/glad.h> +#include <glad/glad.h> #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> @@ -12,11 +12,17 @@ class Camera glm::vec3 frontVec = glm::vec3(0.0f, 0.0f, -1.0f); glm::vec3 upVec = glm::vec3(0.0f, 1.0f, 0.0f); - const float speed = 0.05f; //TO DO: change + float speed_multiplier = 2.5f; + float speed = 0; //TO DO: change + + glm::vec2 sens; + float sens_multiplier = 400.0f; float pitch = 0.0f; float yaw = -90.0f; + glm::u32vec2 window_size = glm::u32vec2{0, 0}; + public: void forward(); void backward(); @@ -34,8 +40,18 @@ class Camera glm::vec3 getPosVec(); glm::vec3 getUpVec(); void setFrontVec(); - //void setPosVec(); - //void setUpVec(); + //void setPosVec(); TO DO + //void setUpVec(); TO DO + + void setSpeed(float dt); + void setSpeedMultiplier(float multiplier); + + glm::vec2 getSens(); + void setSens(float x_size, float y_size); + void setSensMultiplier(float multiplier); + + glm::vec2 getWindowSize(); + void setWindowSize(glm::u32vec2 size); }; #endif \ No newline at end of file diff --git a/src/gfx/include/gfx/vbo.hpp b/src/gfx/include/gfx/vbo.hpp index 79abf4293ded48e4db2181d7ee84facaa76340d6..c250e12b78e3754342e61be1db49429f04ae5bd1 100644 --- a/src/gfx/include/gfx/vbo.hpp +++ b/src/gfx/include/gfx/vbo.hpp @@ -7,7 +7,7 @@ class VBO { unsigned int ID; - public: +public: VBO(); void Bind(); void Unbind(); diff --git a/src/gfx/src/camera.cpp b/src/gfx/src/camera.cpp index ae2fd9ca078706e0d8b2673c7b5a0f8d10daa2f9..dfc34f9c2fd238d7eb599834818eb468306b5179 100644 --- a/src/gfx/src/camera.cpp +++ b/src/gfx/src/camera.cpp @@ -58,3 +58,38 @@ void Camera::setFrontVec() // void Camera::setPosVec() // void Camera::setUpVec() + +void Camera::setSpeed(float dt) +{ + speed = speed_multiplier * dt; +} +void Camera::setSpeedMultiplier(float multiplier) +{ + speed_multiplier = multiplier; +} + +glm::vec2 Camera::getSens() +{ + return sens; +} + +void Camera::setSens(float x_size, float y_size) +{ + sens.x = sens_multiplier * x_size; + sens.y = sens_multiplier * y_size; +} + +void Camera::setSensMultiplier(float multiplier) +{ + sens_multiplier = multiplier; +} + +glm::vec2 Camera::getWindowSize() +{ + return window_size; +} + +void Camera::setWindowSize(glm::u32vec2 size) +{ + window_size = size; +} \ No newline at end of file diff --git a/src/gfx/src/render.cpp b/src/gfx/src/render.cpp index 74cdfa9017923647ad0f2457555446fac433c1da..162bc7ac55b0d477522b423822d3ec0a9866dbe5 100644 --- a/src/gfx/src/render.cpp +++ b/src/gfx/src/render.cpp @@ -143,7 +143,11 @@ void gfx_draw(Shader &myShader, VAO &VAO, Camera camera) view = glm::lookAt(camera.getPosVec(), camera.getPosVec() + camera.getFrontVec(), camera.getUpVec()); glm::mat4 projection; - projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f); + //projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f); + projection = glm::perspective(glm::radians(45.0f), + camera.getWindowSize().x / camera.getWindowSize().y, + 0.1f, + 100.0f); send_matrices_to_shader(myShader, model, view, projection); diff --git a/src/studio/include/studio/simulator.hpp b/src/studio/include/studio/simulator.hpp index c967af3d6af289ca403fc568228083dfb2cd9ecf..c11757e7aabda8a823a8b4809d48516c571e6e52 100644 --- a/src/studio/include/studio/simulator.hpp +++ b/src/studio/include/studio/simulator.hpp @@ -29,8 +29,6 @@ struct Simulator : public osi::Simulator void process_input(); void process_mouse(); - - private: //unsigned int VBO, VAO, EBO; //predelat na vlastni tridy + procedural gen @@ -39,11 +37,6 @@ struct Simulator : public osi::Simulator EBO myEBO; Camera camera; - int prev_mouse_x; - int prev_mouse_y; - const uint8_t* keyboard; - - Shader myShader; }; diff --git a/src/studio/src/simulator.cpp b/src/studio/src/simulator.cpp index e33dfb1b44ae96aa7dc71112086608d97636ddfc..c7b085cd865f65c8d733f7919cd014e654255565 100644 --- a/src/studio/src/simulator.cpp +++ b/src/studio/src/simulator.cpp @@ -47,12 +47,14 @@ Simulator::Simulator() , myEBO{EBO{}} , myShader{create_shader_program()} { - // get_vertices(vertices, v_size); - // get_indices(indices, i_size); + // get_vertices(vertices, v_size); TO DO + // get_indices(indices, i_size); TO DO myVBO.SendData(vertices_cube, sizeof(vertices_cube)); myEBO.SendData(indices_cube, sizeof(indices_cube)); create_buffer(myVAO, myVBO, myEBO); //bool + + camera.setWindowSize(window().size()); } Simulator::~Simulator() @@ -67,6 +69,7 @@ void Simulator::update() // Update the state (i.e., transform objects, create/destroy objects, ... ) process_input(); process_mouse(); + } void Simulator::present() @@ -78,61 +81,60 @@ void Simulator::present() ImGui::Text("Hello, world!"); ImGui::End(); + if (window().is_resized()) + { + camera.setWindowSize(window().size()); + } + gfx_draw(myShader, myVAO, camera); } void Simulator::process_input() { - SDL_PumpEvents(); - keyboard = SDL_GetKeyboardState(NULL); + if (! window().has_keyboard_focus()) + return; + + camera.setSpeed(timer().dt()); - const float cameraSpeed = 0.05f; // adjust accordingly - if (keyboard[SDL_SCANCODE_W]) + if (keyboard().down().contains("W")) camera.forward(); - if (keyboard[SDL_SCANCODE_S]) + if (keyboard().down().contains("S")) camera.backward(); - if (keyboard[SDL_SCANCODE_A]) + if (keyboard().down().contains("A") && !keyboard().just_released().contains("A")) camera.left(); - if (keyboard[SDL_SCANCODE_D]) + if (keyboard().down().contains("D") && !keyboard().just_released().contains("D")) camera.right(); - if (keyboard[SDL_SCANCODE_R]) + if (keyboard().down().contains("R")) camera.up(); - if (keyboard[SDL_SCANCODE_F]) + if (keyboard().down().contains("F")) camera.down(); - int fill_mode = keyboard[SDL_SCANCODE_X] ? GL_FILL : GL_LINE; + int fill_mode = keyboard().down().contains("X") ? GL_FILL : GL_LINE; // TO DO change glPolygonMode(GL_FRONT_AND_BACK, fill_mode); } void Simulator::process_mouse() { - //SDL_SetWindowGrab(window, SDL_TRUE); -- currently possible in run.cpp - SDL_PumpEvents(); - SDL_Event event; - SDL_PollEvent(&event); - - int curr_mouse_x; - int curr_mouse_y; + if (window().is_minimized()) + return; - unsigned int mouse = SDL_GetMouseState(&curr_mouse_x, &curr_mouse_y); + float xoffset = 0; + float yoffset = 0; - if (!(mouse & SDL_BUTTON_LMASK)) + if (true /*mouse().down().contains("SDL_BUTTON_LMASK")*/ + && window().is_mouse_in_window()) { - prev_mouse_x = curr_mouse_x; - prev_mouse_y = curr_mouse_y; - return; + glm::i32vec2 offset = mouse().pos_delta(); + xoffset = static_cast<float>(offset.x); + yoffset = static_cast<float>(-offset.y); + + camera.setSens(window().pixel_size_in_meters().x, // if window.is_resized()? Něco na ten způsob + window().pixel_size_in_meters().y); + xoffset *= camera.getSens().x; + yoffset *= camera.getSens().y; } - float xoffset = static_cast<float>(curr_mouse_x - prev_mouse_x); - float yoffset = static_cast<float>(prev_mouse_y - curr_mouse_y); - - prev_mouse_x = curr_mouse_x; - prev_mouse_y = curr_mouse_y; - - const float sensitivity = 0.1f; - xoffset *= sensitivity; - yoffset *= sensitivity; - + // Zabalit do camera.turn(xoffset, yoffset) ? camera.setYaw(xoffset); camera.setPitch(yoffset); camera.setFrontVec();