diff --git a/libs/geom/include/psemek/geom/camera.hpp b/libs/geom/include/psemek/geom/camera.hpp index 0283d738..7969bcff 100644 --- a/libs/geom/include/psemek/geom/camera.hpp +++ b/libs/geom/include/psemek/geom/camera.hpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace psemek::geom { @@ -31,6 +32,24 @@ namespace psemek::geom virtual ~camera() = default; }; + struct window_camera + : camera + { + float width, height; + + matrix view() const override; + matrix projection() const override; + }; + + struct orthographic_camera + : camera + { + geom::box box; + + matrix view() const override; + matrix projection() const override; + }; + struct perspective_camera : camera { diff --git a/libs/geom/source/camera.cpp b/libs/geom/source/camera.cpp index 83c591fe..1bb8ef7b 100644 --- a/libs/geom/source/camera.cpp +++ b/libs/geom/source/camera.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -68,6 +69,26 @@ namespace psemek::geom return p; } + matrix window_camera::view() const + { + return matrix::identity(); + } + + matrix window_camera::projection() const + { + return orthographic({{ {0.f, width}, {height, 0.f}, {-1.f, 1.f} }}).homogeneous_matrix(); + } + + matrix orthographic_camera::view() const + { + return matrix::identity(); + } + + matrix orthographic_camera::projection() const + { + return orthographic(box).homogeneous_matrix(); + } + matrix perspective_camera::projection() const { return perspective(fov_x, fov_y, near_clip, far_clip).homogeneous_matrix();