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();