// Filename: matrixLens.I // Created by: drose (12Dec01) // //////////////////////////////////////////////////////////////////// // // PANDA 3D SOFTWARE // Copyright (c) Carnegie Mellon University. All rights reserved. // // All use of this software is subject to the terms of the revised BSD // license. You should have received a copy of this license along // with this source code in a file named "LICENSE." // //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // Function: MatrixLens::Constructor // Access: Public // Description: //////////////////////////////////////////////////////////////////// INLINE MatrixLens:: MatrixLens() : _user_mat(LMatrix4f::ident_mat()), _ml_flags(0) { // The default film size for a MatrixLens is 2, which makes the // default range for both X and Y be [-1, 1]. This also, // incidentally, makes the film_mat be identity. set_film_size(2.0f); } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::Copy Constructor // Access: Public // Description: //////////////////////////////////////////////////////////////////// INLINE MatrixLens:: MatrixLens(const MatrixLens ©) : Lens(copy), _user_mat(copy._user_mat), _left_eye_mat(copy._left_eye_mat), _right_eye_mat(copy._right_eye_mat), _ml_flags(copy._ml_flags) { } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::Copy Assignment Operator // Access: Public // Description: //////////////////////////////////////////////////////////////////// INLINE void MatrixLens:: operator = (const MatrixLens ©) { Lens::operator = (copy); _user_mat = copy._user_mat; _left_eye_mat = copy._left_eye_mat; _right_eye_mat = copy._right_eye_mat; _ml_flags = copy._ml_flags; } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::set_user_mat // Access: Published // Description: Explicitly specifies the projection matrix. This // matrix should convert X and Y to the range // [-film_size/2, film_size/2], where (-fs/2,-fs/2) is // the lower left corner of the screen and (fs/2, fs/2) // is the upper right. Z should go to the range [-1, // 1], where -1 is the far plane and 1 is the near // plane. Note that this is a left-handed Y-up // coordinate system. // // The default film_size for a MatrixLens is 2, so the // default range is [-1, 1] for both X and Y. This is // consistent with the GL conventions for projection // matrices. //////////////////////////////////////////////////////////////////// INLINE void MatrixLens:: set_user_mat(const LMatrix4f &user_mat) { _user_mat = user_mat; adjust_comp_flags(CF_mat, 0); } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::get_user_mat // Access: Published // Description: Returns the explicit projection matrix as set by the // user. This does not include transforms on the lens // or film (e.g. a film offset or view hpr). //////////////////////////////////////////////////////////////////// INLINE const LMatrix4f &MatrixLens:: get_user_mat() const { return _user_mat; } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::set_left_eye_mat // Access: Published // Description: Sets a custom projection matrix for the left eye. // This is only used if the lens is attached to a stereo // camera, in which case the left eye matrix will be // used to draw the scene in the left eye (but the // center matrix--the user_mat--will still be used to // cull the scene). // // This matrix should not be too different from the // center matrix (set by set_user_mat()) or culling // errors may become obvious. //////////////////////////////////////////////////////////////////// INLINE void MatrixLens:: set_left_eye_mat(const LMatrix4f &left_eye_mat) { _left_eye_mat = left_eye_mat; _ml_flags |= MF_has_left_eye; adjust_comp_flags(CF_mat, 0); } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::clear_left_eye_mat // Access: Published // Description: Removes the custom projection matrix set for the left // eye, and uses the center matrix (set by set_user_mat) // instead. //////////////////////////////////////////////////////////////////// INLINE void MatrixLens:: clear_left_eye_mat() { _ml_flags &= ~MF_has_left_eye; adjust_comp_flags(CF_mat, 0); } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::has_left_eye_mat // Access: Published // Description: Returns true if the camera has a custom projection // matrix set for the left eye, or false if the center // matrix (set by set_user_mat) will be used for the // left eye. //////////////////////////////////////////////////////////////////// INLINE bool MatrixLens:: has_left_eye_mat() const { return (_ml_flags & MF_has_left_eye) != 0; } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::get_left_eye_mat // Access: Published // Description: Returns the custom projection matrix for the left // eye, if any, or the center matrix if there is no // custom matrix set for the left eye. //////////////////////////////////////////////////////////////////// INLINE const LMatrix4f &MatrixLens:: get_left_eye_mat() const { if ((_ml_flags & MF_has_left_eye) != 0) { return _left_eye_mat; } return _user_mat; } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::set_right_eye_mat // Access: Published // Description: Sets a custom projection matrix for the right eye. // This is only used if the lens is attached to a stereo // camera, in which case the right eye matrix will be // used to draw the scene in the right eye (but the // center matrix--the user_mat--will still be used to // cull the scene). // // This matrix should not be too different from the // center matrix (set by set_user_mat()) or culling // errors may become obvious. //////////////////////////////////////////////////////////////////// INLINE void MatrixLens:: set_right_eye_mat(const LMatrix4f &right_eye_mat) { _right_eye_mat = right_eye_mat; _ml_flags |= MF_has_right_eye; adjust_comp_flags(CF_mat, 0); } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::clear_right_eye_mat // Access: Published // Description: Removes the custom projection matrix set for the right // eye, and uses the center matrix (set by set_user_mat) // instead. //////////////////////////////////////////////////////////////////// INLINE void MatrixLens:: clear_right_eye_mat() { _ml_flags &= ~MF_has_right_eye; adjust_comp_flags(CF_mat, 0); } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::has_right_eye_mat // Access: Published // Description: Returns true if the camera has a custom projection // matrix set for the right eye, or false if the center // matrix (set by set_user_mat) will be used for the // right eye. //////////////////////////////////////////////////////////////////// INLINE bool MatrixLens:: has_right_eye_mat() const { return (_ml_flags & MF_has_right_eye) != 0; } //////////////////////////////////////////////////////////////////// // Function: MatrixLens::get_right_eye_mat // Access: Published // Description: Returns the custom projection matrix for the right // eye, if any, or the center matrix if there is no // custom matrix set for the right eye. //////////////////////////////////////////////////////////////////// INLINE const LMatrix4f &MatrixLens:: get_right_eye_mat() const { if ((_ml_flags & MF_has_right_eye) != 0) { return _right_eye_mat; } return _user_mat; }