Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 #ifndef __VCGLIB_WRAP_GUI_VIEW_H
00074 #define __VCGLIB_WRAP_GUI_VIEW_H
00075
00076
00077
00078
00079
00080
00081
00082
00083 #include <vcg/space/point3.h>
00084 #include <vcg/space/plane3.h>
00085 #include <vcg/space/line3.h>
00086 #include <vcg/math/matrix44.h>
00087 #include <wrap/gl/math.h>
00088
00089 #ifdef WIN32
00090 #include <windows.h>
00091 #endif
00092
00093 #if defined(__APPLE__)
00094 #include <OpenGL/gl.h>
00095 #else
00096 #include <GL/gl.h>
00097 #endif
00098
00099 namespace vcg {
00109 template <class T> class View {
00110 public:
00111 View();
00112 void GetView();
00113 void SetView(const float *_proj, const float *_modelview, const int *_viewport);
00114 Point3<T> Project(const Point3<T> &p) const;
00115 Point3<T> UnProject(const Point3<T> &p) const;
00116 Point3<T> ViewPoint() const;
00117
00119 Plane3<T> ViewPlaneFromModel(const Point3<T> &p);
00120
00122 Line3<T> ViewLineFromModel(const Point3<T> &p);
00123
00125 Line3<T> ViewLineFromWindow(const Point3<T> &p);
00126
00128 Point3<T> NormDevCoordToWindowCoord(const Point3<T> &p) const;
00129
00131 Point3<T> WindowCoordToNormDevCoord(const Point3<T> &p) const;
00132
00133 Matrix44<T> proj;
00134 Matrix44<T> model;
00135 Matrix44<T> matrix;
00136 Matrix44<T> inverse;
00137 int viewport[4];
00138 bool isOrtho;
00139 };
00140
00141 template <class T> View<T>::View() {
00142 isOrtho=false;
00143 }
00144
00145 template <class T> void View<T>::GetView() {
00146 glGetv(GL_PROJECTION_MATRIX,proj);
00147 glGetv(GL_MODELVIEW_MATRIX,model);
00148 glGetIntegerv(GL_VIEWPORT, (GLint*)viewport);
00149
00150 if(proj[3][3]==0) isOrtho = false;
00151 else isOrtho = true;
00152
00153 matrix = proj*model;
00154 inverse = vcg::Inverse(matrix);
00155 }
00156
00157 template <class T> void View<T>::SetView(const float *_proj,
00158 const float *_modelview,
00159 const int *_viewport) {
00160 for(int i = 0; i < 4; i++) {
00161 for(int k =0; k < 4; k++) {
00162 proj[i][k] = _proj[4*i+k];
00163 model[i][k] = _modelview[4*i+k];
00164 }
00165 viewport[i] = _viewport[i];
00166 }
00167 matrix = proj*model;
00168 inverse = matrix;
00169 Invert(inverse);
00170 }
00171
00172 template <class T> Point3<T> View<T>::ViewPoint() const {
00173 if(isOrtho) return vcg::Inverse(model)* Point3<T>(0, 0, 3);
00174 return vcg::Inverse(model)* Point3<T>(0, 0, 0);
00175 }
00176
00177 template <class T> Plane3<T> View<T>::ViewPlaneFromModel(const Point3<T> &p)
00178 {
00179
00180 Matrix44<T> imodel = vcg::Inverse(model);
00181 Point3<T> vp=ViewPoint();
00182 vcg::Point3f n = imodel * vcg::Point3<T>(0.0f, 0, -1.0f) - vp;
00183
00184 Plane3<T> pl;
00185 pl.Init(p, n);
00186 return pl;
00187 }
00188
00189
00190 template <class T> Line3<T> View<T>::ViewLineFromModel(const Point3<T> &p)
00191 {
00192 Line3<T> line;
00193 Point3<T> vp=ViewPoint();
00194 if(isOrtho){
00195 line.SetOrigin(p);
00196 line.SetDirection(- vp );
00197 } else {
00198 line.SetOrigin(vp);
00199 line.SetDirection(p - vp);
00200 }
00201 return line;
00202 }
00203
00204
00205 template <class T> Line3<T> View<T>::ViewLineFromWindow(const Point3<T> &p)
00206 {
00207 Line3<T> line;
00208 Point3<T> vp=ViewPoint();
00209 Point3<T> pp=UnProject(p);
00210
00211 if(isOrtho){
00212 line.SetOrigin(pp);
00213 line.SetDirection(- vp );
00214 } else {
00215 line.SetOrigin(vp);
00216 line.SetDirection(pp-vp);
00217 }
00218 return line;
00219 }
00220
00221 template <class T> Point3<T> View<T>::Project(const Point3<T> &p) const {
00222 Point3<T> r;
00223 r = matrix * p;
00224 return NormDevCoordToWindowCoord(r);
00225 }
00226
00227 template <class T> Point3<T> View<T>::UnProject(const Point3<T> &p) const {
00228 Point3<T> s = WindowCoordToNormDevCoord(p);
00229 s = inverse * s ;
00230 return s;
00231 }
00232
00233
00234
00235
00236
00237
00238 template <class T> Point3<T> View<T>::NormDevCoordToWindowCoord(const Point3<T> &p) const {
00239 Point3<T> a;
00240 a[0] = (p[0]+1)*(viewport[2]/(T)2.0)+viewport[0];
00241 a[1] = (p[1]+1)*(viewport[3]/(T)2.0)+viewport[1];
00242
00243 a[2] = (p[2]+1)/2;
00244 return a;
00245 }
00246
00247
00248 template <class T> Point3<T> View<T>::WindowCoordToNormDevCoord(const Point3<T> &p) const {
00249 Point3<T> a;
00250 a[0] = (p[0]- viewport[0])/ (viewport[2]/(T)2.0) - 1;
00251 a[1] = (p[1]- viewport[1])/ (viewport[3]/(T)2.0) - 1;
00252
00253 a[2] = 2*p[2] - 1;
00254 return a;
00255 }
00256
00257
00258 }
00259
00260 #endif