00001 #ifndef _VIEW_H_
00002 #define _VIEW_H_
00003
00004 #include "Vec3D.h"
00005 #include "MathHelper.h"
00006 #include "Matrix.h"
00007 #include "BBox3D.h"
00008
00009
00010
00011
00012
00013 namespace FemViewer {
00014
00015 class BBox3D;
00016 class Tile;
00017 class ViewManager;
00018 class Camera;
00019
00020
00021 class View
00022 {
00023 friend class Camera;
00024 typedef fvmath::CVec3f vec3d;
00025 public:
00026
00027 enum ProjType {
00028 ePerspective = 0,
00029 eParallel
00030 };
00031
00032 View ();
00033
00034 View (const View& pView);
00035
00036 View (const CVec3f& pCenter);
00037
00038 View (const CVec3f& pCenter,
00039 const CVec3f& pDirection);
00040
00041 View (const int pProjType,
00042 const CVec3f& pCenter,
00043 const CVec3f& pDirection,
00044 const CVec3f& pUp,
00045 const float pDistance,
00046 const float pFOVDegrees);
00047
00048 View (const BBox3D& pBBox3D, const int pType);
00049
00050 View (const BBox3D& pBBox3D, View& pReferenceView);
00051
00052 View (const int pProjType,
00053 const BBox3D& pBBox3D,
00054 const CVec3f& pDirection,
00055 const CVec3f& pUp
00056 );
00057
00058 ~View();
00059
00060 void drawCenter () const;
00061
00062 void dump (ViewManager& pViewManager) const;
00063
00064 void dump (std::ostream& pOstream) const;
00065
00066 CVec3f getPosition() const;
00067
00068 void initCamera(const Tile& pTile) ;
00069 void adjustToPlane(fvmath::CVec3f n,fvmath::CVec3f p,const float distane);
00070 void setUp();
00071
00072 Matrix<float>& getCameraMatrix() { return w2c; }
00073 const Matrix<float>& getCameraMatrix() const { return w2c; }
00074
00075 Matrix<float>& getProjectionMatrix() { return c2p; }
00076 const Matrix<float>& getProjectionMatrix() const { return c2p; }
00077
00078 View& operator= (const View& pView);
00079
00080 void rotate (const float pDeltaX,
00081 const float pDeltaY);
00082
00083 void scaleFOV (const float pFOVFactor);
00084
00085 void setCenter (const CVec3f& pCenter);
00086
00087 void translate (const float pDeltaX,
00088 const float pDeltaY);
00089
00090 const CVec3f& getDirection() const;
00091 int GetType() const { return type; }
00092
00093 float getDistance() const;
00094
00095 float getNearClipDistance() const;
00096 float getFarClipDistance () const;
00097
00098 void SwitchProjection(int projection);
00099 public:
00100
00101 static const CVec3f vDefaultCenter;
00102 static const CVec3f vDefaultDirection;
00103 static const float fDeafultRadious;
00104 static const float fDefaultDistance;
00105 static const float fDefaultFOVDegrees;
00106 static const CVec3f vDefaultUp;
00107 static const float fInitialObjectDistanceFactor;
00108 static const float fMaxFOVDegrees;
00109 static const float fMinFOVDegrees;
00110 static const float Identity[4][3];
00111 static const bool bOrthoState;
00112
00113 void ajust(const BBox3D& pBBox3D);
00114
00115 void init (const int pProjType = ePerspective,
00116 const CVec3f& pCenter = vDefaultCenter,
00117 const CVec3f& pDirection = vDefaultDirection,
00118 const CVec3f& pUp = vDefaultUp,
00119 const float pDistance = fDefaultDistance,
00120 const float pFOVDegrees = fDefaultFOVDegrees);
00121
00122
00123
00124 #ifdef FV_CHECK_INVARIANTS
00125 void invariants() const;
00126 #endif // #ifdef GLV_BEBUG
00127 Matrix<float> c2p;
00128 Matrix<float> w2c;
00129 int type;
00130 CVec3f vCenter;
00131 CVec3f vDirection;
00132 CVec3f vUp;
00133
00134 float Distance;
00135 float FOVDegrees;
00136
00137
00138
00139
00140 };
00141
00142 }
00143
00144 #endif
00145