OpenMesh: OpenMesh/Apps/QtViewer/QGLViewerWidget.hh Source File

| OpenMesh

QGLViewerWidget.hh
1 /* ========================================================================= *
2 * *
3 * OpenMesh *
4 * Copyright (c) 2001-2022, RWTH-Aachen University *
5 * Department of Computer Graphics and Multimedia *
6 * All rights reserved. *
7 * www.openmesh.org *
8 * *
9 *---------------------------------------------------------------------------*
10 * This file is part of OpenMesh. *
11 *---------------------------------------------------------------------------*
12 * *
13 * Redistribution and use in source and binary forms, with or without *
14 * modification, are permitted provided that the following conditions *
15 * are met: *
16 * *
17 * 1. Redistributions of source code must retain the above copyright notice, *
18 * this list of conditions and the following disclaimer. *
19 * *
20 * 2. Redistributions in binary form must reproduce the above copyright *
21 * notice, this list of conditions and the following disclaimer in the *
22 * documentation and/or other materials provided with the distribution. *
23 * *
24 * 3. Neither the name of the copyright holder nor the names of its *
25 * contributors may be used to endorse or promote products derived from *
26 * this software without specific prior written permission. *
27 * *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39 * *
40 * ========================================================================= */
41
42
43
44
45 #ifndef OPENMESHAPPS_QGLVIEWERWIDGET_HH
46 #define OPENMESHAPPS_QGLVIEWERWIDGET_HH
47
48
49 //== INCLUDES =================================================================
50 #include <OpenMesh/Core/Geometry/VectorT.hh>
51 #include <string>
52 #include <vector>
53 #include <map>
54 #if QT_VERSION_MAJOR < 6
55 #include <QGLWidget>
56 #else
57 #include <QtOpenGLWidgets/QOpenGLWidget>
58 #endif
59
60 //== FORWARD DECLARATIONS =====================================================
61
62 class QMenu;
63 class QActionGroup;
64 class QAction;
65
66 //== CLASS DEFINITION =========================================================
67
68 #if QT_VERSION_MAJOR < 6
69 class QGLViewerWidget : public QGLWidget
70 #else
71 class QGLViewerWidget : public QOpenGLWidget
72 #endif
73 {
74 Q_OBJECT
75
76
77 public:
78 #if QT_VERSION_MAJOR < 6
79 typedef QGLWidget Super;
80 #else
81 typedef QOpenGLWidget Super;
82 #endif
83
84 // Default constructor.
85 explicit QGLViewerWidget( QWidget* _parent=0 );
86
87 // Destructor.
88 virtual ~QGLViewerWidget();
89
90 private:
91
92 void init(void);
93
94 public:
95
96 #if QT_VERSION_MAJOR > 5
97 /* Updates the gui - used to provide backwards compability */
98 void updateGL();
99 #endif
100
101 /* Sets the center and size of the whole scene.
102 The _center is used as fixpoint for rotations and for adjusting
103 the camera/viewer (see view_all()). */
104 void set_scene_pos( const OpenMesh::Vec3f& _center, float _radius );
105
106 /* view the whole scene: the eye point is moved far enough from the
107 center so that the whole scene is visible. */
108 void view_all();
109
111 QAction *add_draw_mode(const std::string& _s);
112
114 void del_draw_mode(const std::string& _s);
115
116 const std::string& current_draw_mode() const
117 { return draw_mode_ ? draw_mode_names_[draw_mode_-1] : nomode_; }
118
119 float radius() const { return radius_; }
120 const OpenMesh::Vec3f& center() const { return center_; }
121
122 const GLdouble* modelview_matrix() const { return modelview_matrix_; }
123 const GLdouble* projection_matrix() const { return projection_matrix_; }
124
125 float fovy() const { return 45.0f; }
126
127 QAction* findAction(const char *name);
128 void addAction(QAction* action, const char* name);
129 void removeAction(const char* name);
130 void removeAction(QAction* action);
131
132 protected:
133
134 // draw the scene: will be called by the painGL() method.
135 virtual void draw_scene(const std::string& _draw_mode);
136
137 double performance(void);
138
139 void setDefaultMaterial(void);
140 void setDefaultLight(void);
141
142 private slots:
143
144 // popup menu clicked
145 void slotDrawMode(QAction *_mode);
146 void slotSnapshot( void );
147
148
149 private: // inherited
150
151 // initialize OpenGL states (triggered by Qt)
152 void initializeGL();
153
154 // draw the scene (triggered by Qt)
155 void paintGL();
156
157 // handle resize events (triggered by Qt)
158 void resizeGL( int w, int h );
159
160 protected:
161
162 // Qt mouse events
163 virtual void mousePressEvent( QMouseEvent* );
164 virtual void mouseReleaseEvent( QMouseEvent* );
165 virtual void mouseMoveEvent( QMouseEvent* );
166 virtual void wheelEvent( QWheelEvent* );
167 virtual void keyPressEvent( QKeyEvent* );
168
169 private:
170
171 // updates projection matrix
172 void update_projection_matrix();
173
174 // translate the scene and update modelview matrix
175 void translate(const OpenMesh::Vec3f& _trans);
176
177 // rotate the scene (around its center) and update modelview matrix
178 void rotate(const OpenMesh::Vec3f& _axis, float _angle);
179
180 OpenMesh::Vec3f center_;
181 float radius_;
182
183 GLdouble projection_matrix_[16],
184 modelview_matrix_[16];
185
186
187 // popup menu for draw mode selection
188 QMenu* popup_menu_;
189 QActionGroup* draw_modes_group_;
190 typedef std::map<QString,QAction*> ActionMap;
191 ActionMap names_to_actions;
192 unsigned int draw_mode_;
193 unsigned int n_draw_modes_;
194 std::vector<std::string> draw_mode_names_;
195 static std::string nomode_;
196
197
198
199 // virtual trackball: map 2D screen point to unit sphere
200 bool map_to_sphere(const QPoint& _point, OpenMesh::Vec3f& _result);
201
202 QPoint last_point_2D_;
203 OpenMesh::Vec3f last_point_3D_;
204 bool last_point_ok_;
205
206 };
207
208
209 //=============================================================================
210 #endif // OPENMESHAPPS_QGLVIEWERWIDGET_HH
211 //=============================================================================
212
QGLViewerWidget
Definition: QGLViewerWidget.hh:73
QGLViewerWidget::add_draw_mode
QAction * add_draw_mode(const std::string &_s)
add draw mode to popup menu, and return the QAction created
Definition: QGLViewerWidget.cc:650
QGLViewerWidget::del_draw_mode
void del_draw_mode(const std::string &_s)
delete draw mode from popup menu
Definition: QGLViewerWidget.cc:717
OpenMesh::VectorT< float, 3 >