#define MSP_GL_CAMERA_H_
#include <msp/datafile/objectloader.h>
+#include "camera_backend.h"
#include "placeable.h"
#include "programdata.h"
namespace Msp {
namespace GL {
-class Camera: public Placeable
+/**
+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 CameraBackend, public Placeable
{
public:
class Loader: public DataFile::ObjectLoader<Camera>
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; }
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; }
private: