| [d238e7] | 1 | /* | 
|---|
|  | 2 | * GLWorldView.hpp | 
|---|
|  | 3 | * | 
|---|
|  | 4 | *  Created on: Auf 11, 2010 | 
|---|
|  | 5 | *      Author: heber | 
|---|
|  | 6 | */ | 
|---|
|  | 7 |  | 
|---|
|  | 8 | #ifndef GLWORLDVIEW_HPP_ | 
|---|
|  | 9 | #define GLWORLDVIEW_HPP_ | 
|---|
|  | 10 |  | 
|---|
|  | 11 | // include config.h | 
|---|
|  | 12 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 13 | #include <config.h> | 
|---|
|  | 14 | #endif | 
|---|
|  | 15 |  | 
|---|
| [4269ca] | 16 | #include <Qt3D/qglview.h> | 
|---|
| [d238e7] | 17 |  | 
|---|
| [02ce36] | 18 | #include "CodePatterns/Observer/Observer.hpp" | 
|---|
| [7188b1] | 19 |  | 
|---|
|  | 20 | #include "World.hpp" | 
|---|
|  | 21 |  | 
|---|
| [3e93332] | 22 | class molecule; | 
|---|
| [907636] | 23 | class QKeyEvent; | 
|---|
|  | 24 | class GLWorldScene; | 
|---|
| [d238e7] | 25 | class QGLPainter; | 
|---|
| [0e5d14] | 26 | class QToolBar; | 
|---|
| [585f78] | 27 | class QTimer; | 
|---|
| [d238e7] | 28 |  | 
|---|
|  | 29 | /** This class is the view on the 3D representation of the World, i.e. the whole | 
|---|
|  | 30 | * of all molecules (consisting of atoms). | 
|---|
|  | 31 | * | 
|---|
|  | 32 | */ | 
|---|
| [7188b1] | 33 | class GLWorldView : public QGLView, public Observer | 
|---|
| [d238e7] | 34 | { | 
|---|
| [06ebf5] | 35 | Q_OBJECT | 
|---|
| [d238e7] | 36 | public: | 
|---|
| [06ebf5] | 37 | GLWorldView(QWidget *parent=0); | 
|---|
|  | 38 | virtual ~GLWorldView(); | 
|---|
| [d238e7] | 39 |  | 
|---|
| [0e5d14] | 40 | void addToolBarActions(QToolBar *toolbar); | 
|---|
| [26ed25] | 41 | void createDomainBox(); | 
|---|
|  | 42 | void createDreiBein(); | 
|---|
| [0e5d14] | 43 |  | 
|---|
| [7188b1] | 44 | // Observer functions | 
|---|
|  | 45 | void update(Observable *publisher); | 
|---|
|  | 46 | void subjectKilled(Observable *publisher); | 
|---|
|  | 47 | void recieveNotification(Observable *publisher, Notification_ptr notification); | 
|---|
|  | 48 |  | 
|---|
| [d238e7] | 49 | public slots: | 
|---|
| [65487f] | 50 | void changeSignalled(); | 
|---|
| [585f78] | 51 | void checkChanges(); | 
|---|
|  | 52 | void sceneChangeSignalled(); | 
|---|
| [407638e] | 53 | void sceneHoverSignalled(const atom *_atom); | 
|---|
| [d238e7] | 54 |  | 
|---|
| [7188b1] | 55 | signals: | 
|---|
|  | 56 | void changed(); | 
|---|
|  | 57 | void atomInserted(const atom *_atom); | 
|---|
|  | 58 | void atomRemoved(const atom *_atom); | 
|---|
| [53059e] | 59 | void moleculeInserted(const molecule *_molecule); | 
|---|
| [c67518] | 60 | void moleculeRemoved(const molecule *_molecule); | 
|---|
| [3927ef] | 61 | void worldSelectionChanged(); | 
|---|
| [407638e] | 62 | void hoverChanged(const atom *_atom); | 
|---|
| [7188b1] | 63 |  | 
|---|
| [d238e7] | 64 | protected: | 
|---|
| [06ebf5] | 65 | void initializeGL(QGLPainter *painter); | 
|---|
|  | 66 | void paintGL(QGLPainter *painter); | 
|---|
| [e8c636] | 67 | void drawDomainBox(QGLPainter *painter) const; | 
|---|
|  | 68 | void drawDreiBein(QGLPainter *painter); | 
|---|
| [8880c9] | 69 |  | 
|---|
|  | 70 | // input functions | 
|---|
|  | 71 | void mousePressEvent(QMouseEvent *event); | 
|---|
|  | 72 | void mouseMoveEvent(QMouseEvent *event); | 
|---|
|  | 73 | void keyPressEvent(QKeyEvent *event); | 
|---|
|  | 74 | void wheelEvent(QWheelEvent *event); | 
|---|
| [d238e7] | 75 |  | 
|---|
| [e13b34] | 76 | // camera functions | 
|---|
|  | 77 | enum CameraControlModeType{ | 
|---|
|  | 78 | Rotate, | 
|---|
|  | 79 | Translate | 
|---|
|  | 80 | }; | 
|---|
|  | 81 |  | 
|---|
|  | 82 | void setCameraControlMode(CameraControlModeType mode); | 
|---|
|  | 83 | CameraControlModeType getCameraControlMode(bool inverted = false); | 
|---|
|  | 84 | public slots: | 
|---|
|  | 85 | void fitCameraToDomain(); | 
|---|
|  | 86 | void setCameraControlModeRotation(); | 
|---|
|  | 87 | void setCameraControlModeTranslation(); | 
|---|
| [8e7dd9] | 88 | void setCameraStereoModeDisable(); | 
|---|
|  | 89 | void setCameraStereoModeHardware(); | 
|---|
|  | 90 | void setCameraStereoModeLeftRight(); | 
|---|
|  | 91 | void setCameraStereoModeRightLeft(); | 
|---|
|  | 92 | void setCameraStereoModeTopBottom(); | 
|---|
|  | 93 | void setCameraStereoModeBottomTop(); | 
|---|
|  | 94 | void setCameraStereoModeAnaglyph(); | 
|---|
| [e13b34] | 95 |  | 
|---|
|  | 96 | protected: | 
|---|
|  | 97 | CameraControlModeType cameraControlMode; | 
|---|
|  | 98 |  | 
|---|
| [d238e7] | 99 | private: | 
|---|
| [06ebf5] | 100 | GLWorldScene *worldscene; | 
|---|
| [65487f] | 101 |  | 
|---|
|  | 102 | bool changesPresent; | 
|---|
| [3927ef] | 103 | bool processingSelectionChanged; // workaround to prevent a loop in (atom_iterator <-> observer) | 
|---|
| [8880c9] | 104 |  | 
|---|
|  | 105 | QPointF lastMousePos; | 
|---|
| [e8c636] | 106 |  | 
|---|
| [26ed25] | 107 | QGLSceneNode *meshDomainBox; | 
|---|
|  | 108 | QGLSceneNode *meshDreiBein; | 
|---|
|  | 109 |  | 
|---|
| [e8c636] | 110 | QGLMaterial *domainBoxMaterial; | 
|---|
|  | 111 | QGLMaterial *dreiBeinMaterial[3]; | 
|---|
| [585f78] | 112 |  | 
|---|
|  | 113 | QTimer *redrawTimer; | 
|---|
|  | 114 | bool needsRedraw; | 
|---|
| [8e7dd9] | 115 |  | 
|---|
|  | 116 | double defaultEyeSeparation; | 
|---|
| [d238e7] | 117 | }; | 
|---|
|  | 118 |  | 
|---|
|  | 119 |  | 
|---|
|  | 120 |  | 
|---|
| [02ce36] | 121 | //#include "CodePatterns/Observer/Observer.hpp" | 
|---|
| [d238e7] | 122 | //#include "LinearAlgebra/Vector.hpp" | 
|---|
|  | 123 | //#include "changetypes.hpp" | 
|---|
|  | 124 | // | 
|---|
|  | 125 | //class atom; | 
|---|
|  | 126 | //class element; | 
|---|
|  | 127 | //class molecule; | 
|---|
|  | 128 | // | 
|---|
|  | 129 | //class GLMoleculeView : public QGLWidget, public Observer | 
|---|
|  | 130 | //{ | 
|---|
|  | 131 | //    Q_OBJECT | 
|---|
|  | 132 | // | 
|---|
|  | 133 | //public: | 
|---|
|  | 134 | // | 
|---|
|  | 135 | //    GLMoleculeView( QWidget* parent); | 
|---|
|  | 136 | //    ~GLMoleculeView(); | 
|---|
|  | 137 | // | 
|---|
|  | 138 | //public slots: | 
|---|
|  | 139 | // | 
|---|
|  | 140 | //    void    setXRotation( int degrees ); | 
|---|
|  | 141 | //    void    setYRotation( int degrees ); | 
|---|
|  | 142 | //    void    setZRotation( int degrees ); | 
|---|
|  | 143 | //    void    setScale( int distance ); | 
|---|
|  | 144 | //    void    setLightPosition( int *light ); | 
|---|
|  | 145 | //    void    setLightDiffuse( int *light ); | 
|---|
|  | 146 | //    void    setLightAmbient( int *light ); | 
|---|
|  | 147 | //    void    createDialogLight(); | 
|---|
|  | 148 | //    void    toggleMultiViewEnabled(); | 
|---|
|  | 149 | // | 
|---|
|  | 150 | //    void    init( QLabel *ptr ); | 
|---|
|  | 151 | //    void    initCoordinates(QLabel *ptr); | 
|---|
|  | 152 | //    void    createView(); | 
|---|
|  | 153 | //    void    hearMoleculeSelected(molecule *mol); | 
|---|
|  | 154 | //    void    hearAtomSelected(molecule *mol, atom *Walker); | 
|---|
|  | 155 | //    void    hearMoleculeChanged(molecule *mol, enum ChangesinMolecule type); | 
|---|
|  | 156 | //    void    hearAtomChanged(molecule *mol, atom *Walker, enum ChangesinAtom type); | 
|---|
|  | 157 | //    void    hearElementChanged(element *Runner, enum ChangesinElement type); | 
|---|
|  | 158 | //    void    hearMoleculeAdded(molecule *mol); | 
|---|
|  | 159 | //    void    hearAtomAdded(molecule *mol, atom *Walker); | 
|---|
|  | 160 | //    void    hearMoleculeRemoved(molecule *mol); | 
|---|
|  | 161 | //    void    hearAtomRemoved(molecule *mol, atom *Walker); | 
|---|
|  | 162 | // | 
|---|
|  | 163 | //signals: | 
|---|
|  | 164 | //    void    notifyMoleculeSelected( molecule *mol ); | 
|---|
|  | 165 | //    void    notifyAtomSelected( molecule *mol, atom *Walker ); | 
|---|
|  | 166 | //    void    notifyMoleculeChanged( molecule *mol, enum ChangesinMolecule type ); | 
|---|
|  | 167 | //    void    notifyAtomChanged( molecule *mol, atom *Walker, enum ChangesinAtom type ); | 
|---|
|  | 168 | //    void    notifyElementChanged( element *Runner, enum ChangesinElement type ); | 
|---|
|  | 169 | //    void    notifyMoleculeAdded( molecule *mol); | 
|---|
|  | 170 | //    void    notifyElementAdded( element *Runner); | 
|---|
|  | 171 | //    void    notifyAtomAdded( molecule *mol, atom *Walker ); | 
|---|
|  | 172 | //    void    notifyMoleculeRemoved( molecule *mol ); | 
|---|
|  | 173 | //    void    notifyAtomRemoved( molecule *mol, atom *Walker ); | 
|---|
|  | 174 | // | 
|---|
|  | 175 | //protected: | 
|---|
|  | 176 | // | 
|---|
|  | 177 | //    void    initializeGL(); | 
|---|
|  | 178 | //    void    paintGL(); | 
|---|
|  | 179 | //    void    resizeGL( int w, int h ); | 
|---|
|  | 180 | //    void    makeSphere(const Vector &x, double radius, const unsigned char color[3]); | 
|---|
|  | 181 | //    void    makeCylinder(const Vector &x, const Vector &y, double radius, double height, const unsigned char color[3]); | 
|---|
|  | 182 | //    void mousePressEvent(QMouseEvent* event); | 
|---|
|  | 183 | //    void mouseReleaseEvent(QMouseEvent* event); | 
|---|
|  | 184 | // | 
|---|
|  | 185 | //public: | 
|---|
|  | 186 | // | 
|---|
|  | 187 | //    /** Update function as we are an Observer. | 
|---|
|  | 188 | //     * | 
|---|
|  | 189 | //     * @param publisher ref to Observable | 
|---|
|  | 190 | //     */ | 
|---|
|  | 191 | //    void update(Observable *publisher); | 
|---|
|  | 192 | // | 
|---|
|  | 193 | //    /** | 
|---|
|  | 194 | //     * This method is called when a special named change | 
|---|
|  | 195 | //     * of the Observable occured | 
|---|
|  | 196 | //     */ | 
|---|
|  | 197 | //    void recieveNotification(Observable *publisher, Notification_ptr notification); | 
|---|
|  | 198 | // | 
|---|
|  | 199 | //    /** | 
|---|
|  | 200 | //     * This method is called when the observed object is destroyed. | 
|---|
|  | 201 | //     */ | 
|---|
|  | 202 | //    void subjectKilled(Observable *publisher); | 
|---|
|  | 203 | // | 
|---|
|  | 204 | // | 
|---|
|  | 205 | //private: | 
|---|
|  | 206 | // | 
|---|
|  | 207 | //    typedef std::map< size_t, node > AtomNodeMap; | 
|---|
|  | 208 | //    typedef std::map< std::pair< size_t, size_t> , node > BondNodeMap; | 
|---|
|  | 209 | //    typedef std::map< size_t, QGLMaterial *> ElementMaterialMap; | 
|---|
|  | 210 | // | 
|---|
|  | 211 | //    ElementMaterialMap ElementNoMaterialMap; | 
|---|
|  | 212 | //    AtomNodeMap AtomsinSceneMap; | 
|---|
|  | 213 | //    BondNodeMap BondsinSceneMap; | 
|---|
|  | 214 | // | 
|---|
|  | 215 | //    QGLMaterial* getMaterial(size_t); | 
|---|
|  | 216 | //    QGLSceneNode* getAtom(size_t); | 
|---|
|  | 217 | //    QGLSceneNode* getBond(size_t, size_t); | 
|---|
|  | 218 | // | 
|---|
|  | 219 | //    // old stuff | 
|---|
|  | 220 | // | 
|---|
|  | 221 | //    GLuint object;  // call list for the scene to be rendered | 
|---|
|  | 222 | //    GLfloat xRot, yRot, zRot, scale;  // rotation angles and scaling (zoom) | 
|---|
|  | 223 | //    Vector position;  //!< position of observer | 
|---|
|  | 224 | //    Vector view;      //!< point along line of view | 
|---|
|  | 225 | //    Vector top;       //!< giving upwards direction | 
|---|
|  | 226 | //    Vector X,Y,Z;     //!< vectors defining the coordinate system | 
|---|
|  | 227 | //    int width;        //!< width of window | 
|---|
|  | 228 | //    int height;       //!< height of window | 
|---|
|  | 229 | // | 
|---|
|  | 230 | //  QLabel *StatusBar;  //!< pointer to status bar for messages | 
|---|
|  | 231 | //  QLabel *CoordinatesBar; //!< pointer to coordinates bar for view port | 
|---|
|  | 232 | // | 
|---|
|  | 233 | //  GLfloat LightPosition[4];        //!< Light Position | 
|---|
|  | 234 | //  GLfloat LightDiffuse[4];         //!< Diffuse Light Values | 
|---|
|  | 235 | //  GLfloat LightAmbient[4];        //!< Ambient Light Values | 
|---|
|  | 236 | // | 
|---|
|  | 237 | //  QPoint LeftButtonPos;     //!< mouse position on mousePressEvent for LeftButton | 
|---|
|  | 238 | //  QPoint MiddleButtonPos;   //!< mouse position on mousePressEvent for MidButton | 
|---|
|  | 239 | //  QPoint RightButtonPos;    //!< mouse position on mousePressEvent for RightButton | 
|---|
|  | 240 | // | 
|---|
|  | 241 | //  unsigned char SelectionColor[3] ; //!< highlight color | 
|---|
|  | 242 | // | 
|---|
|  | 243 | //  bool isSignaller; | 
|---|
|  | 244 | // | 
|---|
|  | 245 | //  bool MultiViewEnabled;    //!< if true, split screen into four parts with additional xy,xz,yz views | 
|---|
|  | 246 | //}; | 
|---|
|  | 247 |  | 
|---|
|  | 248 | #endif /* GLWORLDVIEW_HPP_ */ | 
|---|