23 #ifndef QGLVIEWER_QGLVIEWER_H
24 #define QGLVIEWER_QGLVIEWER_H
36 class ManipulatedFrame;
37 class ManipulatedCameraFrame;
70 explicit QGLViewer(QWidget* parent=NULL,
const char* name=0,
const QGLWidget* shareWidget=0, Qt::WindowFlags flags=0)
71 : QGLWidget(parent, name, shareWidget, flags)
72 { defaultConstructor(); }
74 explicit QGLViewer(
const QGLFormat& format, QWidget* parent=0,
const char* name=0,
const QGLWidget* shareWidget=0,Qt::WindowFlags flags=0)
75 : QGLWidget(format, parent, name, shareWidget, flags)
76 { defaultConstructor(); }
78 QGLViewer(QGLContext* context, QWidget* parent,
const char* name=0,
const QGLWidget* shareWidget=0, Qt::WindowFlags flags=0)
79 : QGLWidget(context, parent, name, shareWidget, flags) {
80 defaultConstructor(); }
84 explicit QGLViewer(QWidget* parent=0,
const QGLWidget* shareWidget=0, Qt::WindowFlags flags=0);
85 explicit QGLViewer(QGLContext *context, QWidget* parent=0,
const QGLWidget* shareWidget=0, Qt::WindowFlags flags=0);
86 explicit QGLViewer(
const QGLFormat& format, QWidget* parent=0,
const QGLWidget* shareWidget=0, Qt::WindowFlags flags=0);
128 void setAxisIsDrawn(
bool draw=
true) { axisIsDrawn_ = draw; Q_EMIT axisIsDrawnChanged(draw); update(); }
130 void setGridIsDrawn(
bool draw=
true) { gridIsDrawn_ = draw; Q_EMIT gridIsDrawnChanged(draw); update(); }
132 void setFPSIsDisplayed(
bool display=
true) { FPSIsDisplayed_ = display; Q_EMIT FPSIsDisplayedChanged(display); update(); }
134 void setTextIsEnabled(
bool enable=
true) { textIsEnabled_ = enable; Q_EMIT textIsEnabledChanged(enable); update(); }
135 void setCameraIsEdited(
bool edit=
true);
311 float aspectRatio()
const {
return static_cast<float>(width())/static_cast<float>(height()); }
351 virtual QSize
sizeHint()
const {
return QSize(600, 400); }
354 void setFullScreen(
bool fullScreen=
true);
355 void setStereoDisplay(
bool stereo=
true);
360 void toggleCameraMode();
363 bool cameraIsInRotateMode()
const;
370 static void drawArrow(
float length=1.0f,
float radius=-1.0f,
int nbSubdivisions=12);
372 static void drawAxis(
float length=1.0f);
373 static void drawGrid(
float size=1.0f,
int nbSubdivisions=10);
375 virtual void startScreenCoordinatesSystem(
bool upward=
false)
const;
376 virtual void stopScreenCoordinatesSystem()
const;
378 void drawText(
int x,
int y,
const QString& text,
const QFont& fnt=QFont());
379 void displayMessage(
const QString& message,
int delay=2000);
383 virtual void drawLight(GLenum light,
float scale = 1.0f)
const;
388 void drawVectorial() { paintGL(); }
391 friend void drawVectorial(
void* param);
405 virtual void updateGL();
408 static QImage convertToGLFormat(
const QImage & image);
410 void qglColor(
const QColor& color)
const;
412 void qglClearColor(
const QColor& color)
const;
415 bool isValid()
const;
418 bool isSharing()
const;
421 virtual void makeCurrent();
426 bool hasMouseTracking ()
const;
429 virtual void resize(
int width,
int height);
431 virtual void setMouseTracking(
bool enable);
435 bool autoBufferSwap()
const;
438 void setAutoBufferSwap(
bool on);
457 const QString& snapshotFilename()
const;
507 void saveSnapshot(
bool automatic=
true,
bool overwrite=
false);
510 void saveSnapshot(
const QString& fileName,
bool overwrite=
false);
511 void setSnapshotFileName(
const QString& name);
519 bool openSnapshotFormatDialog();
520 void snapshotToClipboard();
523 bool saveImageSnapshot(
const QString& fileName);
531 class TileRegion {
public :
double xMin, yMin, xMax, yMax, textScale; };
553 if (tileRegion_ == NULL)
557 if (f.pixelSize() == -1)
558 f.setPointSizeF(f.pointSizeF() * tileRegion_->textScale);
560 f.setPixelSize(f.pixelSize() * tileRegion_->textScale);
570 GLuint bufferTextureId()
const;
583 void copyBufferToTexture(GLint internalFormat, GLenum format=GL_NONE);
617 virtual void startAnimation();
618 virtual void stopAnimation();
630 virtual void animate() { Q_EMIT animateNeeded(); }
632 void toggleAnimation() {
if (animationIsStarted()) stopAnimation();
else startAnimation(); }
640 void viewerInitialized();
659 void drawFinished(
bool automatic);
664 void animateNeeded();
672 void axisIsDrawnChanged(
bool drawn);
674 void gridIsDrawnChanged(
bool drawn);
676 void FPSIsDisplayedChanged(
bool displayed);
678 void textIsEnabledChanged(
bool enabled);
680 void cameraIsEditedChanged(
bool edited);
682 void stereoChanged(
bool on);
687 void pointSelected(
const QMouseEvent* e);
713 virtual QString
helpString()
const {
return tr(
"No help available."); }
715 virtual QString mouseString()
const;
716 virtual QString keyboardString()
const;
727 virtual void aboutQGLViewer();
742 virtual void resizeGL(
int width,
int height);
743 virtual void initializeGL();
762 virtual void init() { Q_EMIT viewerInitialized(); }
764 virtual void paintGL();
765 virtual void preDraw();
766 virtual void preDrawStereo(
bool leftBuffer=
true);
784 virtual void fastDraw();
785 virtual void postDraw();
791 virtual void mousePressEvent(QMouseEvent *);
792 virtual void mouseMoveEvent(QMouseEvent *);
793 virtual void mouseReleaseEvent(QMouseEvent *);
794 virtual void mouseDoubleClickEvent(QMouseEvent *);
795 virtual void wheelEvent(QWheelEvent *);
796 virtual void keyPressEvent(QKeyEvent *);
797 virtual void keyReleaseEvent(QKeyEvent *);
798 virtual void timerEvent(QTimerEvent *);
799 virtual void closeEvent(QCloseEvent *);
847 virtual void select(
const QMouseEvent* event);
848 virtual void select(
const QPoint& point);
850 void setSelectBufferSize(
int size);
862 virtual void beginSelection(
const QPoint& point);
886 virtual void endSelection(
const QPoint& point);
905 enum KeyboardAction { DRAW_AXIS, DRAW_GRID, DISPLAY_FPS, ENABLE_TEXT, EXIT_VIEWER,
906 SAVE_SCREENSHOT, CAMERA_MODE, FULL_SCREEN, STEREO, ANIMATION, HELP, EDIT_CAMERA,
907 MOVE_CAMERA_LEFT, MOVE_CAMERA_RIGHT, MOVE_CAMERA_UP, MOVE_CAMERA_DOWN,
908 INCREASE_FLYSPEED, DECREASE_FLYSPEED, SNAPSHOT_TO_CLIPBOARD };
910 unsigned int shortcut(KeyboardAction action)
const;
913 int keyboardAccelerator(KeyboardAction action)
const;
914 Qt::Key keyFrameKey(
int index)
const;
915 Qt::KeyboardModifiers playKeyFramePathStateKey()
const;
917 Qt::KeyboardModifiers addKeyFrameStateKey()
const;
918 Qt::KeyboardModifiers playPathStateKey()
const;
920 Qt::Key pathKey(
int index)
const;
921 Qt::KeyboardModifiers addKeyFrameKeyboardModifiers()
const;
922 Qt::KeyboardModifiers playPathKeyboardModifiers()
const;
925 void setShortcut(KeyboardAction action,
unsigned int key);
927 void setKeyboardAccelerator(KeyboardAction action,
int key);
929 void setKeyDescription(
int key, QString description);
930 void clearShortcuts();
935 virtual void setKeyFrameKey(
int index,
int key);
936 virtual void setPlayKeyFramePathStateKey(
int buttonState);
938 virtual void setPlayPathStateKey(
int buttonState);
939 virtual void setAddKeyFrameStateKey(
int buttonState);
941 virtual void setPathKey(
int key,
int index = 0);
942 virtual void setPlayPathKeyboardModifiers(Qt::KeyboardModifiers modifiers);
943 virtual void setAddKeyFrameKeyboardModifiers(Qt::KeyboardModifiers modifiers);
960 enum ClickAction { NO_CLICK_ACTION, ZOOM_ON_PIXEL, ZOOM_TO_FIT, SELECT, RAP_FROM_PIXEL, RAP_IS_CENTER,
961 CENTER_FRAME, CENTER_SCENE, SHOW_ENTIRE_SCENE, ALIGN_FRAME, ALIGN_CAMERA };
970 ROTATE, ZOOM, TRANSLATE,
971 MOVE_FORWARD, LOOK_AROUND, MOVE_BACKWARD,
972 SCREEN_ROTATE, ROLL, DRIVE,
973 SCREEN_TRANSLATE, ZOOM_ON_REGION };
976 MouseAction mouseAction(
int state)
const;
977 int mouseHandler(
int state)
const;
978 int mouseButtonState(MouseHandler handler, MouseAction action,
bool withConstraint=
true)
const;
979 ClickAction clickAction(
int state,
bool doubleClick, Qt::MouseButtons buttonsBefore)
const;
980 void getClickButtonState(ClickAction action,
int& state,
bool& doubleClick, Qt::MouseButtons& buttonsBefore)
const;
981 int wheelButtonState(MouseHandler handler, MouseAction action,
bool withConstraint=
true)
const;
984 MouseAction mouseAction(Qt::Key key, Qt::KeyboardModifiers modifiers, Qt::MouseButton button)
const;
985 int mouseHandler(Qt::Key key, Qt::KeyboardModifiers modifiers, Qt::MouseButton button)
const;
987 void getMouseActionBinding(MouseHandler handler, MouseAction action,
bool withConstraint,
988 Qt::Key& key, Qt::KeyboardModifiers& modifiers, Qt::MouseButton& button)
const;
990 ClickAction clickAction(Qt::Key key, Qt::KeyboardModifiers modifiers, Qt::MouseButton button,
991 bool doubleClick=
false, Qt::MouseButtons buttonsBefore=Qt::NoButton)
const;
993 void getClickActionBinding(ClickAction action, Qt::Key& key, Qt::KeyboardModifiers& modifiers,
994 Qt::MouseButton& button,
bool& doubleClick, Qt::MouseButtons& buttonsBefore)
const;
996 MouseAction wheelAction(Qt::Key key, Qt::KeyboardModifiers modifiers)
const;
997 int wheelHandler(Qt::Key key, Qt::KeyboardModifiers modifiers)
const;
999 void getWheelActionBinding(MouseHandler handler, MouseAction action,
bool withConstraint,
1000 Qt::Key& key, Qt::KeyboardModifiers& modifiers)
const;
1004 void setMouseBinding(
int state, MouseHandler handler, MouseAction action,
bool withConstraint=
true);
1005 void setMouseBinding(
int state, ClickAction action,
bool doubleClick=
false, Qt::MouseButtons buttonsBefore=Qt::NoButton);
1006 void setMouseBindingDescription(
int state, QString description,
bool doubleClick=
false, Qt::MouseButtons buttonsBefore=Qt::NoButton);
1009 void setMouseBinding(Qt::KeyboardModifiers modifiers, Qt::MouseButton buttons, MouseHandler handler, MouseAction action,
bool withConstraint=
true);
1010 void setMouseBinding(Qt::KeyboardModifiers modifiers, Qt::MouseButton button, ClickAction action,
bool doubleClick=
false, Qt::MouseButtons buttonsBefore=Qt::NoButton);
1011 void setWheelBinding(Qt::KeyboardModifiers modifiers, MouseHandler handler, MouseAction action,
bool withConstraint=
true);
1012 void setMouseBindingDescription(Qt::KeyboardModifiers modifiers, Qt::MouseButton button, QString description,
bool doubleClick=
false, Qt::MouseButtons buttonsBefore=Qt::NoButton);
1014 void setMouseBinding(Qt::Key key, Qt::KeyboardModifiers modifiers, Qt::MouseButton buttons, MouseHandler handler, MouseAction action,
bool withConstraint=
true);
1015 void setMouseBinding(Qt::Key key, Qt::KeyboardModifiers modifiers, Qt::MouseButton button, ClickAction action,
bool doubleClick=
false, Qt::MouseButtons buttonsBefore=Qt::NoButton);
1016 void setWheelBinding(Qt::Key key, Qt::KeyboardModifiers modifiers, MouseHandler handler, MouseAction action,
bool withConstraint=
true);
1017 void setMouseBindingDescription(Qt::Key key, Qt::KeyboardModifiers modifiers, Qt::MouseButton button, QString description,
bool doubleClick=
false, Qt::MouseButtons buttonsBefore=Qt::NoButton);
1019 void clearMouseBindings();
1022 MouseAction wheelAction(Qt::KeyboardModifiers modifiers)
const;
1023 int wheelHandler(Qt::KeyboardModifiers modifiers)
const;
1025 void setHandlerKeyboardModifiers(MouseHandler handler, Qt::KeyboardModifiers modifiers);
1026 void setHandlerStateKey(MouseHandler handler,
int buttonState);
1027 void setMouseStateKey(MouseHandler handler,
int buttonState);
1039 QString stateFileName()
const;
1040 virtual QDomElement domElement(
const QString& name, QDomDocument& document)
const;
1043 virtual void initFromDOMElement(
const QDomElement& element);
1044 virtual void saveStateToFile();
1045 virtual bool restoreStateFromFile();
1062 void saveToFile(
const QString& fileName=QString::null);
1063 bool restoreFromFile(
const QString& fileName=QString::null);
1067 static void saveStateToFileForAllViewers();
1085 static const QList<QGLViewer*>&
QGLViewerPool() {
return QGLViewer::QGLViewerPool_; }
1095 static int QGLViewerIndex(
const QGLViewer*
const viewer) {
return QGLViewer::QGLViewerPool_.indexOf(const_cast<QGLViewer*>(viewer)); }
1102 virtual void setVisualHintsMask(
int mask,
int delay = 2000);
1103 virtual void drawVisualHints();
1106 virtual void resetVisualHints();
1112 void delayedFullScreen() { move(prevPos_); setFullScreen(); }
1122 void defaultConstructor();
1124 void handleKeyboardAction(KeyboardAction
id);
1128 bool cameraIsEdited_;
1129 float previousCameraZClippingCoefficient_;
1130 int previousPathId_;
1131 void connectAllCameraKFIInterpolatedSignals(
bool connection=
true);
1134 QColor backgroundColor_, foregroundColor_;
1139 bool FPSIsDisplayed_;
1140 bool textIsEnabled_;
1146 bool animationStarted_;
1147 int animationPeriod_;
1148 int animationTimerId_;
1152 unsigned int fpsCounter_;
1158 bool displayMessage_;
1159 QTimer messageTimer_;
1163 bool manipulatedFrameIsACamera_;
1167 bool mouseGrabberIsAManipulatedFrame_;
1168 bool mouseGrabberIsAManipulatedCameraFrame_;
1169 QMap<size_t, bool> disabledMouseGrabbers_;
1172 int selectRegionWidth_, selectRegionHeight_;
1173 int selectBufferSize_;
1174 GLuint* selectBuffer_;
1175 int selectedObjectId_;
1181 void setDefaultShortcuts();
1182 QString cameraPathKeysString()
const;
1183 QMap<KeyboardAction, QString> keyboardActionDescription_;
1184 QMap<KeyboardAction, unsigned int> keyboardBinding_;
1185 QMap<int, QString> keyDescription_;
1188 QMap<Qt::Key, int> pathIndex_;
1189 Qt::KeyboardModifiers addKeyFrameKeyboardModifiers_, playPathKeyboardModifiers_;
1192 GLuint bufferTextureId_;
1193 float bufferTextureMaxU_, bufferTextureMaxV_;
1194 int bufferTextureWidth_, bufferTextureHeight_;
1195 unsigned int previousBufferTextureFormat_;
1196 int previousBufferTextureInternalFormat_;
1200 struct MouseActionPrivate {
1201 MouseHandler handler;
1203 bool withConstraint;
1207 struct MouseBindingPrivate {
1208 const Qt::KeyboardModifiers modifiers;
1209 const Qt::MouseButton button;
1212 MouseBindingPrivate(Qt::KeyboardModifiers m, Qt::MouseButton b, Qt::Key k)
1213 : modifiers(m), button(b), key(k) {}
1216 bool operator<(
const MouseBindingPrivate& mbp)
const
1219 return key < mbp.key;
1220 if (modifiers != mbp.modifiers)
1221 return modifiers < mbp.modifiers;
1222 return button < mbp.button;
1227 struct WheelBindingPrivate {
1228 const Qt::KeyboardModifiers modifiers;
1231 WheelBindingPrivate(Qt::KeyboardModifiers m, Qt::Key k)
1232 : modifiers(m), key(k) {}
1235 bool operator<(
const WheelBindingPrivate& wbp)
const
1238 return key < wbp.key;
1239 return modifiers < wbp.modifiers;
1244 struct ClickBindingPrivate {
1245 const Qt::KeyboardModifiers modifiers;
1246 const Qt::MouseButton button;
1247 const bool doubleClick;
1248 const Qt::MouseButtons buttonsBefore;
1251 ClickBindingPrivate(Qt::KeyboardModifiers m, Qt::MouseButton b,
bool dc, Qt::MouseButtons bb, Qt::Key k)
1252 : modifiers(m), button(b), doubleClick(dc), buttonsBefore(bb), key(k) {}
1255 bool operator<(
const ClickBindingPrivate& cbp)
const
1258 return key < cbp.key;
1259 if (buttonsBefore != cbp.buttonsBefore)
1260 return buttonsBefore < cbp.buttonsBefore;
1261 if (modifiers != cbp.modifiers)
1262 return modifiers < cbp.modifiers;
1263 if (button != cbp.button)
1264 return button < cbp.button;
1265 return doubleClick != cbp.doubleClick;
1269 static QString formatClickActionPrivate(ClickBindingPrivate cbp);
1270 static bool isValidShortcutKey(
int key);
1272 QMap<ClickBindingPrivate, QString> mouseDescription_;
1274 void setDefaultMouseBindings();
1275 void performClickAction(ClickAction ca,
const QMouseEvent*
const e);
1276 QMap<MouseBindingPrivate, MouseActionPrivate> mouseBinding_;
1277 QMap<WheelBindingPrivate, MouseActionPrivate> wheelBinding_;
1278 QMap<ClickBindingPrivate, ClickAction> clickBinding_;
1279 Qt::Key currentlyPressedKey_;
1282 void initializeSnapshotFormats();
1283 QImage frameBufferSnapshot();
1284 QString snapshotFileName_, snapshotFormat_;
1285 int snapshotCounter_, snapshotQuality_;
1286 TileRegion* tileRegion_;
1289 static QList<QGLViewer*> QGLViewerPool_;
1292 QString stateFileName_;
1295 QTabWidget* helpWidget_;
1298 #endif // QGLVIEWER_QGLVIEWER_H