]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/camera.h
Check the flat qualifier from the correct member
[libs/gl.git] / source / render / camera.h
index 0dd599298b3baed315f6d647cd932150feaa2511..59a0ac2e62f677c4c356339a97f5c794515d7562 100644 (file)
@@ -8,6 +8,20 @@
 namespace Msp {
 namespace GL {
 
+/**
+Represents a point of view in 3D space.
+
+A Camera provides two matrices.  The view matrix is the inverse of the camera's
+model matrix and transforms coordinates from world space to eye space (the
+camera's object space).  The projection matrix transforms coordinates from eye
+space to clip space. 
+
+Orientation of the Camera is determined by look direction and up direction.
+Look direction corresponds to the negative Z axis direction in eye space.  The
+YZ plane of eye space is aligned to the plane formed by the look and up
+directions.  Setting the up direction to the opposite of gravity direction is
+an easy way to keep the camera upright.
+*/
 class Camera: public Placeable
 {
 public:
@@ -43,16 +57,33 @@ private:
        Matrix view_matrix;
        Matrix proj_matrix;
        ProgramData shdata;
+       Vector4 frustum_planes[6];
 
 public:
        Camera();
 
+       void copy_parameters(const Camera &);
+
+       /** Sets the camera projection to perspective, characterised by the vertical
+       field of view.  Horizontal FoV is computed with the aspect ratio. */
        void set_field_of_view(const Geometry::Angle<float> &);
+
+       /** Sets the camera projection to orthogonal, characterized by the size of
+       the projection region. */
        void set_orthographic(float, float);
+
        void set_aspect_ratio(float);
        void set_depth_clip(float, float);
+
+       /** Sets the direction of the frustum axis, which corresponds to the center
+       of the screen.  The offset is expressed in terms of the neutral frustum such
+       that -1 is the left or bottom edge and 1 is the right or top edge. */
        void set_frustum_axis(float, float);
+
+       /** Apply a rotation to the view frustum after projection.  This can be used
+       with rotated displayes without affecting the camera's orientation. */
        void set_frustum_rotation(const Geometry::Angle<float> &);
+
        const Geometry::Angle<float> &get_field_of_view() const { return fov; }
        bool is_orthographic() const { return fov==Geometry::Angle<float>::zero(); }
        float get_orthographic_width() const { return height*aspect; }
@@ -91,11 +122,15 @@ public:
        Vector4 unproject(const Vector4 &) const;
        Vector3 unproject(const Vector3 &) const;
 
+       /** Returns a ProgramData object containing the camera matrices. */
        const ProgramData &get_shader_data() const { return shdata; }
 
+       bool is_in_frustum(const Renderable &) const;
+
 private:
        void update_projection_matrix();
        void update_object_matrix();
+       void update_frustum_planes();
 
 public:
        void set_debug_name(const std::string &);