ARGoS  3
A parallel, multi-engine simulator for swarm robotics
plugins/simulator/visualizations/qt-opengl/qtopengl_widget.h
Go to the documentation of this file.
00001 
00007 #ifndef QTOPENGL_WIDGET_H
00008 #define QTOPENGL_WIDGET_H
00009 
00010 namespace argos {
00011    class CQTOpenGLWidget;
00012    class CQTOpenGLMainWindow;
00013    class CSpace;
00014    class CSimulator;
00015    class CQTOpenGLBox;
00016    class CQTOpenGLUserFunctions;
00017    class CPositionalEntity;
00018    class CControllableEntity;
00019    class CEmbodiedEntity;
00020 }
00021 
00022 #ifdef QTOPENGL_WITH_SDL
00023 #   include <argos3/plugins/simulator/visualizations/qt-opengl/qtopengl_joystick.h>
00024 #endif
00025 
00026 #include <argos3/plugins/simulator/visualizations/qt-opengl/qtopengl_camera.h>
00027 #include <argos3/core/simulator/entity/entity.h>
00028 #include <argos3/core/utility/datatypes/datatypes.h>
00029 #include <QGLWidget>
00030 
00031 #ifdef __APPLE__
00032 #include <glu.h>
00033 #else
00034 #include <GL/glu.h>
00035 #endif
00036 
00037 namespace argos {
00038 
00039    /****************************************/
00040    /****************************************/
00041 
00042    class CQTOpenGLOperationDrawNormal : public CEntityOperation<CQTOpenGLOperationDrawNormal, CQTOpenGLWidget, void> {
00043    public:
00044       virtual ~CQTOpenGLOperationDrawNormal() {}
00045    };
00046 
00047    class CQTOpenGLOperationDrawSelected : public CEntityOperation<CQTOpenGLOperationDrawSelected, CQTOpenGLWidget, void> {
00048    public:
00049       virtual ~CQTOpenGLOperationDrawSelected() {}
00050    };
00051 
00052 #define REGISTER_QTOPENGL_ENTITY_OPERATION(ACTION, OPERATION, ENTITY)   \
00053    REGISTER_ENTITY_OPERATION(ACTION, CQTOpenGLWidget, OPERATION, void, ENTITY);
00054 
00055    /****************************************/
00056    /****************************************/
00057 
00058    class CQTOpenGLWidget : public QGLWidget {
00059 
00060       Q_OBJECT
00061 
00062     public:
00063 
00064       struct SFrameGrabData {
00065          bool Grabbing;
00066          QString Directory;
00067          QString BaseName;
00068          QString Format;
00069          SInt32 Quality;
00070 
00071          SFrameGrabData() :
00072             Grabbing(false),
00073             Directory("."),
00074             BaseName("frame_"),
00075             Format("png"),
00076             Quality(-1) {}
00077 
00078          void Init(TConfigurationNode& t_tree);
00079       };
00080 
00081       struct SSelectionInfo {
00082          bool IsSelected;
00083          size_t Index;
00084 
00085          SSelectionInfo() :
00086             IsSelected(false),
00087             Index(0) {}
00088       };
00089 
00090    public:
00091 
00092       CQTOpenGLWidget(const QGLFormat& c_format,
00093                       QWidget* pc_parent,
00094                       CQTOpenGLMainWindow* pc_main_window,
00095                       CQTOpenGLUserFunctions& c_user_functions);
00096       virtual ~CQTOpenGLWidget();
00097 
00098       virtual void initializeGL();
00099       virtual void resizeGL(int n_width,
00100                             int n_height);
00101       virtual void paintEvent(QPaintEvent*);
00102 
00103       void DrawScene();
00104 
00105       void SelectInScene(UInt32 un_x,
00106                          UInt32 un_y);
00107 
00108       void DrawPositionalEntity(CPositionalEntity& c_entity);
00109 
00110       void DrawRays(CControllableEntity& c_entity);
00111 
00112       void DrawBoundingBox(CEmbodiedEntity& c_entity);
00113 
00114       inline virtual int heightForWidth(int w) const {
00115          return (w * 3) / 4;
00116       }
00117 
00118       inline virtual QSize sizeHint() const {
00119          return QSize(1024,768);
00120       }
00121 
00122       inline virtual QSize minimumSize() const {
00123          return QSize(320,240);
00124       }
00125 
00126       inline CQTOpenGLUserFunctions& GetUserFunctions() {
00127          return m_cUserFunctions;
00128       }
00129 
00130       inline CQTOpenGLCamera& GetCamera() {
00131          return m_cCamera;
00132       }
00133 
00134       inline SFrameGrabData& GetFrameGrabData() {
00135          return m_sFrameGrabData;
00136       }
00137 
00138       inline void SetInvertMouse(bool b_InvertMouse) {
00139           m_bInvertMouse = b_InvertMouse;
00140       }
00141 
00142    signals:
00143 
00144       void StepDone(int n_step);
00145       void SimulationDone();
00146       void EntitySelected(size_t un_index);
00147       void EntityDeselected(size_t un_index);
00148 
00149    public slots:
00150 
00151       void PlayPauseSimulation(bool b_play);
00152       void FastForwardPauseSimulation(bool b_play);
00153       void StepSimulation();
00154       void StopSimulation();
00155       void ResetSimulation();
00156       void SetAntiAliasing(bool b_antialias_on);
00157       void SetDrawFrameEvery(int n_every);
00158       void SetGrabFrame(bool b_grab_on);
00159       void SetCamera(int n_camera);
00160       void SetCameraFocalLength(double f_length);
00161 
00162    protected:
00163 
00164       void InitializeArena();
00165       void DrawArena();
00166       void DrawAxes();
00167 
00168       virtual void timerEvent(QTimerEvent* pc_event);
00169       virtual void mouseMoveEvent(QMouseEvent* pc_event);
00170       virtual void mousePressEvent(QMouseEvent* pc_event);
00171       virtual void mouseReleaseEvent(QMouseEvent* pc_event);
00172       virtual void keyPressEvent(QKeyEvent* pc_event);
00173       virtual void keyReleaseEvent(QKeyEvent* pc_event);
00174       virtual void resizeEvent(QResizeEvent* pc_event);
00175       void reactToKeyEvent();
00176 
00177    private:
00178 
00179       CQTOpenGLMainWindow* pcMainWindow;
00180       CQTOpenGLUserFunctions& m_cUserFunctions;
00181 
00182       SInt32 nTimerId;
00183       bool m_bAntiAliasing;
00184       bool m_bFastForwarding;
00185       SInt32 m_nDrawFrameEvery;
00186       SInt32 m_nFrameCounter;
00187 
00188       bool m_bMouseGrabbed;
00189       bool m_bShiftPressed;
00190       QPoint m_cMouseGrabPos;
00191       bool m_bInvertMouse;
00192       SSelectionInfo m_sSelectionInfo;
00193 
00194       CSimulator& m_cSimulator;
00195       CSpace& m_cSpace;
00196 
00197       bool   m_bUsingFloorTexture;
00198       GLuint m_unFloorTexture;
00199       GLuint m_unGroundTexture;
00200       GLuint m_unCeilingTexture;
00201       GLuint m_unBoxTexture;
00202 
00203       GLfloat* m_pfLightAmbient;
00204       GLfloat* m_pfLightDiffuse;
00205       GLfloat* m_pfLight0Position;
00206       GLfloat* m_pfLight1Position;
00207 
00208       GLuint m_unArenaList;
00209       GLuint m_unFloorList;
00210       GLuint* m_punSelectionBuffer;
00211 
00212 #ifdef QTOPENGL_WITH_SDL
00213       CQTOpenGLJoystick m_cJoystick;
00214 #endif
00215       CQTOpenGLCamera m_cCamera;
00216       SFrameGrabData m_sFrameGrabData;
00217 
00218       enum EDirection {
00219          DIRECTION_UP = 1,
00220          DIRECTION_DOWN,
00221          DIRECTION_LEFT,
00222          DIRECTION_RIGHT,
00223          DIRECTION_FORWARDS,
00224          DIRECTION_BACKWARDS,
00225       };
00226 
00227       QMap<EDirection, int> m_mapPressedKeys;
00228    };
00229 
00230 }
00231 
00232 #endif