/* QGLView Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef GLCAMERA_H #define GLCAMERA_H #include "globject.h" class Camera; //extern QMatrix4x4 globCameraMatrix; //extern Camera * currentCamera; class Camera: public GLObjectBase { friend class QGLView; friend class GLParticlesSystem; friend QDataStream & operator <<(QDataStream & s, const GLObjectBase * p); friend QDataStream & operator >>(QDataStream & s, GLObjectBase *& p); public: Camera(); void setPos(const QVector3D & p) {pos_ = p; anglesFromPoints(); buildTransform();} void setAim(const QVector3D & p) {aim_ = p; anglesFromPoints(); buildTransform();} void move(const QVector3D & p) {pos_ += p; aim_ += p; buildTransform();} void move(const float & x, const float & y = 0., const float & z = 0.) {pos_ += QVector3D(x, y, z); aim_ += QVector3D(x, y, z); buildTransform();} void moveForward(const float & x, bool withZ = true); void moveBackward(const float & x, bool withZ = true) {moveForward(-x, withZ);} void moveLeft(const float & x, bool withZ = true); void moveRight(const float & x, bool withZ = true) {moveLeft(-x, withZ);} void moveUp(const float & x, bool onlyZ = false); void moveDown(const float & x, bool onlyZ = false) {moveUp(-x, onlyZ);} void rotateZ(const float & a); void rotateXY(const float & a); void rotateRoll(const float & a) {angles_.setX(angles_.x() + a); buildTransform();} void orbitZ(const float & a); void orbitXY(const float & a); void panZ(const float & a); void panXY(const float & a); void setFOV(const float & f) {fov_ = f;} void setAngles(const QVector3D & a) {setRotation(a);} void setAngleZ(const float & a); void setAngleXY(const float & a); void setAngleRoll(const float & a) {angles_.setX(a); buildTransform();} void setAngleLowerLimitXY(const float & a) {angle_limit_lower_xy = a; buildTransform();} void setAngleUpperLimitXY(const float & a) {angle_limit_upper_xy = a; buildTransform();} void setAngleLimitsXY(const float & lower, const float & upper) {angle_limit_lower_xy = lower; angle_limit_upper_xy = upper; buildTransform();} void setDepthStart(const float & d) {depth_start = d;} void setDepthEnd(const float & d) {depth_end = d;} void setMirrorX(bool yes) {mirror_x = yes;} void setMirrorY(bool yes) {mirror_y = yes;} void flyCloser(const float & s); void flyFarer(const float & s); void flyToDistance(const float & d); QVector3D aim() const {return aim_;} QVector3D angles() const {return rotation();} QVector3D direction() const {return (aim_ - pos_).normalized();} QVector3D directionXY() const {QVector3D tv = aim_ - pos_; return QVector3D(tv.x(), tv.y(), 0.).normalized();} float FOV() const {return fov_;} float distance() const {return (pos_ - aim_).length();} float angleZ() const {return angles_.z();} float angleXY() const {return angles_.y();} float angleRoll() const {return angles_.x();} float angleLowerLimitXY() const {return angle_limit_lower_xy;} float angleUpperLimitXY() const {return angle_limit_upper_xy;} float depthStart() const {return depth_start;} float depthEnd() const {return depth_end;} bool isMirrorX() const {return mirror_x;} bool isMirrorY() const {return mirror_y;} void anglesFromPoints(); void apply(const GLfloat & aspect = 1.); void assign(const Camera & c); virtual GLObjectBase * clone(bool withChildren = true); QMatrix4x4 offsetMatrix() const; private: QVector3D aim_, offset_; GLfloat fov_; GLfloat depth_start; GLfloat depth_end; GLfloat angle_limit_lower_xy; GLfloat angle_limit_upper_xy; bool mirror_x; bool mirror_y; }; #endif // GLCAMERA_H