00001 #ifndef CAMERA_H
00002 #define CAMERA_H
00003
00004 #include "Types.h"
00005 #include "Util.h"
00006 #include "TransformNode.h"
00007 #include "BindingInterface.h"
00008
00009 namespace RenderTools {
00010
00011 class Camera : public BindingInterface, public TransformNode {
00012 public:
00013
00014 enum CamMode {
00015 NONE = 0x00,
00016 ORBIT = 0x01,
00017 DRAG = 0x02,
00018 DOLLY = 0x04,
00019 TRACK = 0x08,
00020 ZOOM = 0x10,
00021 ROLL = 0x20
00022 };
00023
00024 enum CamType{
00025 ORTHO,
00026 PERSPECTIVE
00027 };
00028
00029 public:
00030
00031 Camera( void );
00032 virtual ~Camera( void );
00033
00034 static PropertyPtr create( const XMLNodePtr & xml = XMLNodePtr() );
00035 virtual void createProperties( void );
00036 virtual const string getTypeName( bool ofComponent = false ) const;
00037
00038 virtual void onPropertyEvent( const PropertyEvent & e );
00039 virtual void onInitialize( void );
00040 virtual void onBind( int unit );
00041 virtual void onUnbind( int unit );
00042
00043 static void drawGrid( int size = 100, int stp = 10 );
00044 void setMode( CamMode mode, bool send = true );
00045 const int getMode( void ) const;
00046 void setType( CamType type, bool send = true );
00047 const CamType getType( void ) const;
00048 void setFOV( float s, bool send = true );
00049 const float getFOV( void ) const;
00050 void setNear( float s, bool send = true );
00051 const float getNear( void ) const;
00052 void setFar( float s, bool send = true );
00053 const float getFar( void ) const;
00054 void setEye( const Vec3 & v, bool send = true );
00055 const Vec3 & getEye( void ) const;
00056 void setCenter( const Vec3 & v, bool send = true );
00057 const Vec3 & getCenter( void ) const;
00058 void setRoll( float deg, bool send = true );
00059 const float getRoll( void ) const;
00060 void setZoom( float f, bool send = true );
00061 const float getZoom( void ) const;
00062 void setFlip( bool state, bool send = true );
00063 const bool getFlip( void ) const;
00064 void setFlop( bool state, bool send = true );
00065 const bool getFlop( void ) const;
00066 void setViewport( const Vec4 &, bool send = true );
00067 const Vec4 & getViewport( void ) const;
00068 void setScreen( const Vec2 &, bool send = true );
00069 const Vec2 & getScreen( void ) const;
00070 void pushMode( void );
00071 void popMode( void );
00072 void initViewport( const Vec2 &, bool send = true );
00073 void setDistance( float dist, bool send = true );
00074 float getDistance( void ) const;
00075 void frame( const NAABB & b, float scale = 1.0f, bool send = true );
00076 void reshape( int w, int h, bool send = true );
00077 void move( const Vec3 & v, bool send = true );
00078 void rectZoom( const Vec2 & p1, const Vec2& p2, bool send = true );
00079 Vec3 global2Screen( const Vec3 & global );
00080 Vec3 screen2Global( const Vec3 & screen );
00081 void getProjectionPyramid( Vec3 & p1, Vec3 & p2, Vec3 & p3, Vec3 & p4, Vec3 & apex, Vec3 & m1, Vec3 & m2 );
00082 Rectangle project( const NAABB & box );
00083 Rectangle project( const AABB & box, const Mat4 & mat );
00084 Rectangle project( const Vec3 & p, float r );
00085 bool clipNear( Vec3 & l1, Vec3 & l2 );
00086 float getOrthoWidth( void ) const;
00087 float getOrthoHeight( void ) const;
00088 float getOrthoWidthZoomed( void ) const;
00089 float getOrthoHeightZoomed( void ) const;
00090 Vec4 getOrthoZoomed( void ) const;
00091 void setOrtho( const Vec4 &, bool send = true );
00092 const Vec4 & getOrtho( void ) const;
00093 Vec4 & getOrtho( void );
00094 void setOrthoHeight( float x, float y, float h, bool send = true );
00095 void setOrthoWidth( float x, float y, float w, bool send = true );
00096
00097 Camera & operator = ( const Camera & c );
00098 Camera & operator += ( const Camera & c );
00099 Camera & operator *= ( const float f );
00100
00101 static CameraPtr getCurrent( void );
00102
00103 private:
00104
00105 Vec3 m_eye;
00106 Vec3 m_center;
00107 float m_zoom;
00108 float m_nearc;
00109 float m_farc;
00110 float m_fovy;
00111 float m_roll;
00112 Mat4 m_local;
00113 Vec4 m_nearPlane;
00114 Vec2 m_screen;
00115 Vec2 m_screenInit;
00116 Vec4 m_vp;
00117 CamType m_type;
00118 CamMode m_mode;
00119 CamMode m_modePushed;
00120 float m_aspect;
00121 bool m_flip;
00122 bool m_flop;
00123 Vec4 m_ortho;
00124
00125 float m_shiftDelta;
00126 float m_camShift;
00127
00128 static CameraPtr s_current;
00129 };
00130
00131 inline EnumList getCamModeEnums( void ){
00132 EnumList r;
00133 r.push_back("NONE");
00134 r.push_back("ORBIT");
00135 r.push_back("DRAG");
00136 r.push_back("DOLLY");
00137 r.push_back("TRACK");
00138 r.push_back("ZOOM");
00139 r.push_back("ROLL");
00140 return( r );
00141 }
00142
00143 inline EnumList getCamTypeEnums( void ){
00144 EnumList r;
00145 r.push_back("ORTHO");
00146 r.push_back("PERSPECTIVE");
00147 return( r );
00148 }
00149
00150 struct CamTypeStruct {
00151 CamTypeStruct( Camera::CamType * e = 0 ):
00152 m_value( e ){
00153 }
00154
00155 bool operator == ( const CamTypeStruct & v2 ){
00156 return( m_value == v2.m_value );
00157 }
00158 bool operator != ( const CamTypeStruct & v2 ){
00159 return( ! ( m_value == v2.m_value ) );
00160 }
00161 Camera::CamType operator [] ( const unsigned int i ){
00162 return( * m_value );
00163 }
00164
00165 Camera::CamType * m_value;
00166 };
00167
00168 struct CamModeStruct {
00169 CamModeStruct( Camera::CamMode * e = 0 ):
00170 m_value( e ){
00171 }
00172
00173 bool operator == ( const CamModeStruct & v2 ){
00174 return( m_value == v2.m_value );
00175 }
00176 bool operator != ( const CamModeStruct & v2 ){
00177 return( ! ( m_value == v2.m_value ) );
00178 }
00179 Camera::CamMode operator [] ( const unsigned int i ){
00180 return( * m_value );
00181 }
00182
00183 Camera::CamMode * m_value;
00184 };
00185
00186 inline ostream & operator << ( ostream & s, const CamTypeStruct & v ){
00187 switch( * v.m_value ){
00188 case Camera::ORTHO:
00189 s << string( "ORTHO" );
00190 break;
00191 case Camera::PERSPECTIVE:
00192 s << string( "PERSPECTIVE" );
00193 break;
00194 default:
00195 s << string( "PERSPECTIVE" );
00196 }
00197 return( s );
00198 }
00199
00200 inline istream & operator >> ( istream & s, CamTypeStruct & v ){
00201 string value;
00202 s >> value;
00203
00204 if( ! s.fail() ){
00205 if( value == "ORTHO" ){
00206 * v.m_value = Camera::ORTHO;
00207 }
00208 else if( value == "PERSPECTIVE" ){
00209 * v.m_value = Camera::PERSPECTIVE;
00210 }
00211 }
00212 return( s );
00213 }
00214
00215 inline ostream & operator << ( ostream & s, const CamModeStruct & v ){
00216 switch( * v.m_value ){
00217 case Camera::NONE:
00218 s << string( "NONE " );
00219 break;
00220 case Camera::ORBIT:
00221 s << string( "ORBIT " );
00222 break;
00223 case Camera::DRAG:
00224 s << string( "DRAG " );
00225 break;
00226 case Camera::DOLLY:
00227 s << string( "DOLLY " );
00228 break;
00229 case Camera::TRACK:
00230 s << string( "TRACK " );
00231 break;
00232 case Camera::ZOOM:
00233 s << string( "ZOOM " );
00234 break;
00235 case Camera::ROLL:
00236 s << string( "ROLL " );
00237 break;
00238 default:
00239 s << string( "NONE " );
00240 break;
00241 }
00242 return( s );
00243 }
00244
00245 inline istream & operator >> ( istream & s, CamModeStruct & v ){
00246 string value;
00247 s >> value;
00248
00249 if( value == "NONE" ){
00250 * v.m_value = Camera::NONE;
00251 }
00252 else if( value == "ORBIT" ){
00253 * v.m_value = Camera::ORBIT;
00254 }
00255 else if( value == "DRAG" ){
00256 * v.m_value = Camera::DRAG;
00257 }
00258 else if( value == "DOLLY" ){
00259 * v.m_value = Camera::DOLLY;
00260 }
00261 else if( value == "TRACK" ){
00262 * v.m_value = Camera::TRACK;
00263 }
00264 else if( value == "ZOOM" ){
00265 * v.m_value = Camera::ZOOM;
00266 }
00267 else if( value == "ROLL" ){
00268 * v.m_value = Camera::ROLL;
00269 }
00270 else{
00271 * v.m_value = Camera::NONE;
00272 }
00273
00274 return( s );
00275 }
00276
00277 };
00278
00279 #endif
00280
00281