ARGoS
3
A parallel, multi-engine simulator for swarm robotics
|
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