hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/src/core/camera.h
blob: 200c4b06381bf032851808bf479e41ec430f4134 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#pragma once

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>

namespace Donut
{
    class Camera
    {
    public:
        Camera(float fov = 45.0f, float aspect_ratio = 16.0f / 9.0f, 
               float near_plane = 0.1f, float far_plane = 100.0f);
        ~Camera() = default;

        void set_position(const glm::vec3& position) { m_position = position; recalculate_view_matrix(); }
        void set_rotation(const glm::vec3& rotation) { m_rotation = rotation; recalculate_view_matrix(); }
        
        const glm::vec3& get_position() const { return m_position; }
        const glm::vec3& get_rotation() const { return m_rotation; }
        
        glm::vec3 get_forward_direction() const;
        glm::vec3 get_right_direction()   const;
        glm::vec3 get_up_direction()      const;

        const glm::mat4& get_projection_matrix()     const { return m_projection_matrix; }
        const glm::mat4& get_view_matrix()           const { return m_view_matrix; }
        const glm::mat4& get_view_projection_matrix() const { return m_view_projection_matrix; }

        void set_projection(float fov, float aspect_ratio, float near_plane, float far_plane);
        
        void on_update(float delta_time);
        void on_mouse_move(float x_offset, float y_offset, bool constrain_pitch = true);
        
        void move_forward(float delta_time);
        void move_backward(float delta_time);
        void move_right(float delta_time);
        void move_left(float delta_time);
        void move_up(float delta_time);
        void move_down(float delta_time);

        void set_mouse_sensitivity(float sensitivity) { m_mouse_sensitivity = sensitivity; }
        float get_mouse_sensitivity() const { return m_mouse_sensitivity; }

        void set_movement_speed(float speed) { m_movement_speed = speed; }
        float get_movement_speed() const { return m_movement_speed; }

    private:
        void recalculate_view_matrix();
        void recalculate_projection_matrix();
    private:
        glm::mat4 m_projection_matrix;
        glm::mat4 m_view_matrix;
        glm::mat4 m_view_projection_matrix;

        glm::vec3 m_position = { 0.0f, 0.0f, 3.0f };
        glm::vec3 m_rotation = { 0.0f, 0.0f, 0.0f };

        float m_fov = 45.0f;
        float m_aspect_ratio = 16.0f / 9.0f;
        float m_near_plane = 0.1f;
        float m_far_plane = 100.0f;

        float m_mouse_sensitivity = 0.1f;
        float m_movement_speed = 5.0f;
        bool m_first_mouse = true;
        float m_last_x = 0.0f;
        float m_last_y = 0.0f;
    };
}