#ifndef MAPVIEW_H #define MAPVIEW_H #include <../misc/fixc11.h> #include #include #include #include #include #include #include "elements/Path.h" #include "elements/ColorPoints.h" #include "elements/Object.h" #include "../nav/State.h" namespace Floorplan { class IndoorMap; } class Renderable; class Path; class MapView3D : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT private: QMatrix4x4 matProject; QMatrix4x4 matView; QVector3D lightPos; QVector3D eyePos; RenderParams renderParams; QBasicTimer timer; std::vector elements; Path* pathToDest = nullptr; Path* pathWalked = nullptr; ColorPoints* colorPoints = nullptr; Object* leDude = nullptr; struct LookAt { QVector3D eye_m = QVector3D(0,0,1); QVector3D dir = QVector3D(1,0,-0.1); float ax = 0; float ay = 0; QMatrix4x4 dirRot; QVector3D getDir() const {return this->dirRot * this->dir;} LookAt() { dirRot.setToIdentity(); } } lookAt; struct MouseState { float x = 0; float y = 0; bool down = false; } mouseState; void rebuildLookat(); void clear(); public: MapView3D(QWidget* parent = 0); /** set the map to display */ void setMap(Floorplan::IndoorMap* map); /** the position to look at + looking direction */ void setLookAt(const Point3 pos, const Point3 dir = Point3(1, 0, -0.1)); /** set the eye's looking direction (looking from eye into this direction) */ void setLookDir(const Point3 dir); /** set the eye's position (looking from here) */ void setLookEye(const Point3 eye_m); /** do not render elements higher than the given height */ void setClipAbove(const float height_m) {renderParams.clipAboveHeight_m = height_m;} /** set the currently estimated position */ void setCurrentEstimation(const Point3 pos, const Point3 dir); /** set the path to the destination MUST BE CALLED FROM THE MAIN THREAD */ void setPathToDestination(const std::vector& path); /** set the path to disply. MUST BE CALLED FROM THE MAIN THREAD */ template void setPathToDestination(const DijkstraPath* path) {this->pathToDest->set(*path);} /** set the path to disply. MUST BE CALLED FROM THE MAIN THREAD*/ Q_INVOKABLE void setPathToDestination(const void* path) { setPathToDestination( (const DijkstraPath*) path); } /** set the walked path. MUST BE CALLED FROM THE MAIN THREAD */ void setPathWalked(const std::vector& path); /** set the walked path. MUST BE CALLED FROM THE MAIN THREAD */ Q_INVOKABLE void setPathWalked(const void* path) { this->pathWalked->set( *((const std::vector*) path)); } /** NOTE: must be called from Qt's main thread! */ void showGridImportance(Grid* grid) { this->colorPoints->setFromGridImportance(grid); } /** NOTE: must be called from Qt's main thread! */ Q_INVOKABLE void showParticles(const void* particles) { showParticles((const std::vector>*) particles); } /** NOTE: must be called from Qt's main thread! */ void showParticles(const std::vector>* particles) { this->colorPoints->setFromParticles(*particles); } enum RenderMode { NORMAL, TRANSPARENT, OUTLINE, }; RenderMode renderMode = RenderMode::NORMAL; void toggleRenderMode(); public slots: void mousePressEvent(QMouseEvent*); void mouseMoveEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void keyPressEvent(QKeyEvent*); protected: void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE; void initializeGL(); void paintGL(); void resizeGL(int width, int height); private: bool isGLInitialized = false; void draw(); }; #endif // MAPVIEW_H