]> git.tdb.fi Git - libs/game.git/blob - source/game/camera.h
Add a view sub-library, including a Camera component
[libs/game.git] / source / game / camera.h
1 #ifndef MSP_GAME_CAMERA_H_
2 #define MSP_GAME_CAMERA_H_
3
4 #include <msp/geometry/angle.h>
5 #include <msp/linal/vector.h>
6 #include "component.h"
7
8 namespace Msp::Game {
9
10 enum class CameraScaling
11 {
12         ORIGINAL_SIZE,
13         SCALE_TO_FIT,
14         SCALE_TO_COVER,
15         STRETCH_TO_FIT
16 };
17
18 struct CameraSetup
19 {
20         Geometry::Angle<float> field_of_view_y = Geometry::Angle<float>::from_degrees(60);
21         LinAl::Vector<float, 2> size = { 16.0f/9.0f, 1.0f };
22         float near_clip = 0.1f;
23         float far_clip = 100.0f;
24         CameraScaling scaling = CameraScaling::SCALE_TO_FIT;
25         std::string sequence_name;
26 };
27
28 class Camera: public Component
29 {
30 public:
31         using Setup = CameraSetup;
32
33 private:
34         const Setup &setup;
35         Geometry::Angle<float> fov_y;
36         LinAl::Vector<float, 2> size;
37         float height;
38         float near_clip;
39         float far_clip;
40
41 public:
42         Camera(Handle<Entity>, const Setup &);
43
44         void set_field_of_view(Geometry::Angle<float>, float);
45         void set_size(const LinAl::Vector<float, 2> &);
46         bool is_orthographic() const { return fov_y==Geometry::Angle<float>::zero(); }
47         Geometry::Angle<float> get_fov_vertical() const { return fov_y; }
48         Geometry::Angle<float> get_fov_horizontal() const { return Geometry::atan(tan(fov_y/2.0f)*get_aspect())*2.0f; }
49         const LinAl::Vector<float, 2> &get_size() const { return size; }
50         float get_aspect() const { return size.x/size.y; }
51         float get_near_clip() const { return near_clip; }
52         float get_far_clip() const { return far_clip; }
53         CameraScaling get_scaling() const { return setup.scaling; }
54         const std::string &get_sequence_name() const { return setup.sequence_name; }
55 };
56
57 } // namespace Msp::Game
58
59 #endif