#ifndef OPENGL_WIDGET_HH #define OPENGL_WIDGET_HH #include "opengl_mesh.hh" #include #include #include #include #include #include #define FOV 70 class Painter { public: virtual void draw(QOpenGLExtraFunctions *f) const = 0; }; class OpenGLWidget : public QOpenGLWidget, public QOpenGLExtraFunctions { Q_OBJECT QMatrix4x4 rot, rot_start, proj; GLfloat cam_dist = 1; QPoint mouse_pos; QOpenGLShaderProgram main_program; QOpenGLShaderProgram skybox_program; QOpenGLShaderProgram line_program; GLuint skybox_tex; GLuint skybox_vao; GLuint skybox_vbo; OpenGLMesh *ground; void loadSkybox(); void loadGround(); const Painter *painter = nullptr; protected: virtual void mousePressEvent(QMouseEvent *e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent *e); virtual void wheelEvent(QWheelEvent *e); public: static OpenGLWidget *instance; QVector meshes; OpenGLWidget(QWidget *parent=nullptr); ~OpenGLWidget(); void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; void setPainter(const Painter *p); QOpenGLShaderProgram *getMainProgram(); QOpenGLShaderProgram *getLineProgram(); signals: void initialized(); }; #endif