diff --git a/IndoorMap.pro b/IndoorMap.pro index b4037bb..bff8d55 100644 --- a/IndoorMap.pro +++ b/IndoorMap.pro @@ -56,7 +56,6 @@ HEADERS += MainWindow.h \ mapview/model/MapModel.h \ tree/MapTreeModel.h \ MainController.h \ - mapview/model/MapLayers.h \ params/ElementParamWidget.h \ params/LayerParamWidget.h \ params/ActionWidget.h \ @@ -174,7 +173,10 @@ HEADERS += MainWindow.h \ mapview/3D/navMesh/NavMeshModel.h \ mapview/3D/navMesh/NavMeshRenderer.h \ mapview/3D/navMesh/QNavMeshSettings.h \ - mapview/3D/misc/TriangleData.h + mapview/3D/misc/TriangleData.h \ + mapview/3D/floorplan/FloorplanRendererModel.h \ + mapview/3D/floorplan/FloorplanRenderer.h \ + mapview/3D/floorplan/RenderTriangle.h FORMS += MainWindow.ui diff --git a/MainController.cpp b/MainController.cpp index 008661e..b445da5 100644 --- a/MainController.cpp +++ b/MainController.cpp @@ -111,6 +111,9 @@ MainController::MainController() { //mapModel->load("/mnt/vm/paper/diss/data/maps/SHL41_nm.xml"); //mapModel->load("/apps/paper/diss/data/maps/SHL41_nm.xml"); + mapModel->load("/mnt/sdcard/SHL41_nm.xml"); + + //mapModel->load("/apps/paper/diss/data/maps/map_elevator2.xml"); //mapModel->load("/apps/paper/diss/data/maps/map_issue6.xml"); @@ -147,11 +150,13 @@ void MainController::onLayerElementAdded(MapLayer* layer, MapModelElement* elem) void MainController::onLayerElementRemoved(MapLayer* layer, const MapModelElement* elem) { (void) layer; (void) elem; + mw->getMapView3D()->layerChange(); } void MainController::onLayerVisibilityChanged(MapLayer *layer, const bool visible) { (void) layer; (void) visible; + mw->getMapView3D()->layerChange(); } void MainController::onSetShow3DFloorplan(bool show) { @@ -202,6 +207,7 @@ void MainController::onMapModelNeedsRepaint() { void MainController::onMapModelReset() { mw->getTree()->expandAll(); mw->getLINT()->update(mapModel->getMap()); + mw->getMapView3D()->layerChange(); } diff --git a/main.cpp b/main.cpp index 7527daa..ed98f72 100644 --- a/main.cpp +++ b/main.cpp @@ -12,6 +12,7 @@ int main(int argc, char *argv[]) { //ray(); QApplication a(argc, argv); + //a.setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, false); // touch-events are NOT translated to mouse events! QString str = R"( diff --git a/mapview/2D/MapView2D.cpp b/mapview/2D/MapView2D.cpp index 3b8c26b..f3c15b6 100644 --- a/mapview/2D/MapView2D.cpp +++ b/mapview/2D/MapView2D.cpp @@ -101,50 +101,29 @@ void MapView2D::mouseReleaseEvent(QMouseEvent* e) { // android bool MapView2D::event(QEvent* event) { - if (event->type() == QEvent::Gesture) { return gestureEvent(static_cast(event)); } else { return QWidget::event(event); } - } bool MapView2D::gestureEvent(QGestureEvent* event) { - //qCDebug(lcExample) << "gestureEvent():" << event; if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) { //swipeTriggered(static_cast(swipe)); } else if (QGesture *pan = event->gesture(Qt::PanGesture)) panTriggered(static_cast(pan)); + return true; if (QGesture *pinch = event->gesture(Qt::PinchGesture)) { pinchTriggered(static_cast(pinch)); + return true; } - return true; + return false; } void MapView2D::pinchTriggered(QPinchGesture* gesture) { - tools.pinchTriggered(this, gesture); update(); - -// QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags(); -// if (changeFlags & QPinchGesture::RotationAngleChanged) { -//// qreal rotationDelta = gesture->rotationAngle() - gesture->lastRotationAngle(); -//// rotationAngle += rotationDelta; -//// qCDebug(lcExample) << "pinchTriggered(): rotate by" << -//// rotationDelta << "->" << rotationAngle; -// } -// if (changeFlags & QPinchGesture::ScaleFactorChanged) { -//// currentStepScaleFactor = gesture->totalScaleFactor(); -//// qCDebug(lcExample) << "pinchTriggered(): zoom by" << -//// gesture->scaleFactor() << "->" << currentStepScaleFactor; -// std::cout << gesture->totalScaleFactor() << std::endl; -// } -// if (gesture->state() == Qt::GestureFinished) { -//// scaleFactor *= currentStepScaleFactor; -//// currentStepScaleFactor = 1; -// } -// update(); } void MapView2D::panTriggered(QPanGesture* gesture) { diff --git a/mapview/3D/MapView3D.cpp b/mapview/3D/MapView3D.cpp index 313783e..70b5444 100644 --- a/mapview/3D/MapView3D.cpp +++ b/mapview/3D/MapView3D.cpp @@ -11,6 +11,9 @@ #include "../3D/navMesh/NavMeshModel.h" #include "../3D/navMesh/NavMeshRenderer.h" +#include "../3D/floorplan/FloorplanRenderer.h" +#include "../3D/floorplan/FloorplanRendererModel.h" + #include MapView3D::MapView3D(QWidget *parent) : QOpenGLWidget(parent) { @@ -29,6 +32,9 @@ MapView3D::MapView3D(QWidget *parent) : QOpenGLWidget(parent) { gridRenderer = new GridRenderer(); + floorplanRenderer = new FloorplanRenderer(); + floorplanRendererModel = new FloorplanRendererModel(); + QString style = "QPushButton:checked{\ background-color: rgb(200, 200, 230);\ border: none; \ @@ -68,6 +74,18 @@ MapView3D::MapView3D(QWidget *parent) : QOpenGLWidget(parent) { emit onShow3DNavMesh(btnNavMesh->isChecked()); }); + // android + setAttribute(Qt::WA_AcceptTouchEvents, true); + grabGesture(Qt::PanGesture); + grabGesture(Qt::PinchGesture); + + auto format = QSurfaceFormat(); + //format.setVersion(4,3); + format.setSamples(4); + //format.setProfile(QSurfaceFormat::CoreProfile); + + setFormat(format); + } @@ -84,22 +102,17 @@ void MapView3D::initializeGL() { // additional settings glEnable(GL_DEPTH_TEST); - glClearColor(1,1,1,1); + glClearColor(0.9, 0.9, 1.0, 1.0); } void MapView3D::paintGL() { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - draw(); - } void MapView3D::resizeGL(int width, int height) { - glViewport(0, 0, width, height); - } @@ -117,18 +130,22 @@ void MapView3D::mouseMoveEvent(QMouseEvent* e) { rot.z -= dx/2.0f; rot.x -= dy/2.0f; } else if (mouse.btn == 4) { - //Point3 vec(-dx / width() * 2 * viewport.size.x, 0, +dy / height() * 2 * viewport.size.y); - Point3 vec(-dx / width() * 2 * viewport.size.x, +dy / height() * 2 * viewport.size.y, 0); - //Point3 vec(-dx * 2 / width() , 0, +dy * 2 / height()); - vec = vec.rot(-rot.x/180*M_PI, -rot.y/180*M_PI, -rot.z/180*M_PI); - vec /= scale; - center += vec; + moveXY(dx, dy); } mouse.x = e->x(); mouse.y = e->y(); update(); } +void MapView3D::moveXY(float dx, float dy) { + //Point3 vec(-dx / width() * 2 * viewport.size.x, 0, +dy / height() * 2 * viewport.size.y); + Point3 vec(-dx / width() * 2 * viewport.size.x, +dy / height() * 2 * viewport.size.y, 0); + //Point3 vec(-dx * 2 / width() , 0, +dy * 2 / height()); + vec = vec.rot(-rot.x/180*M_PI, -rot.y/180*M_PI, -rot.z/180*M_PI); + vec /= scale; + center += vec; +} + void MapView3D::mouseReleaseEvent(QMouseEvent* e) { (void) e; update(); @@ -140,14 +157,52 @@ void MapView3D::wheelEvent(QWheelEvent* e) { update(); } +// android +bool MapView3D::event(QEvent* event) { + if (event->type() == QEvent::Gesture) { + return gestureEvent(static_cast(event)); + //} else if (event->type() == QEvent::TouchBegin) { + // return true; + //} else if (event->type() == QEvent::TouchUpdate) { + // return true; + } else { + return QWidget::event(event); + } +} + +bool MapView3D::gestureEvent(QGestureEvent* event) { + if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) { + //swipeTriggered(static_cast(swipe)); + } else if (QGesture *pan = event->gesture(Qt::PanGesture)) + panTriggered(static_cast(pan)); + return true; + if (QGesture *pinch = event->gesture(Qt::PinchGesture)) { + pinchTriggered(static_cast(pinch)); + return true; + } + return false; +} + +void MapView3D::pinchTriggered(QPinchGesture* gesture) { + update(); +} + +void MapView3D::panTriggered(QPanGesture* gesture) { + moveXY(gesture->delta().x(), gesture->delta().y()); + update(); +} + + + + void MapView3D::setShowFloorplan(bool show) { this->showFloorplan = show; + if (!show) {update(); return;} - //if (gridModel) {delete gridModel; gridModel = nullptr;} - //if (navMeshModel) {delete navMeshModel; navMeshModel = nullptr;} - update(); + // refresh + layerChange(); } @@ -193,26 +248,32 @@ void MapView3D::setShowNavMesh(bool show) { } +void MapView3D::layerChange() { + + // todo: layers?? + Floorplan::IndoorMap* im = getModel()->getMap(); + this->floorplanRendererModel->rebuild(im); + update(); + +} + #include "misc/Shader.h" void MapView3D::draw() { static RenderSettings rs = RenderSettings(new Shader()); - - // view QMatrix4x4 V; - V.translate(0,0,-30); + V.translate(0,0,-50); // above the building V.scale(scale.x, scale.y, scale.z); V.rotate(rot.x, 1.0, 0.0, 0.0); V.rotate(rot.y, 0.0, 1.0, 0.0); V.rotate(rot.z, 0.0, 0.0, 1.0); V.translate(center.x, center.y, center.z); -// V.lookAt(QVector3D(30,-25,25), QVector3D(30,10,0), QVector3D(0,1,0)); - + float far = 200; // TODO // projection QMatrix4x4 P; @@ -223,30 +284,34 @@ void MapView3D::draw() { float h = height() / 30; viewport.size.x = w; viewport.size.y = h; - P.perspective(45.0f, aspect, 0.01, 100); + P.perspective(45.0f, aspect, 0.01, far); } else { // default size: 50 * 50/aspect meters float w = 50.0f; float h = 50.0f * height() / width(); viewport.size.x = w; viewport.size.y = h; - P.ortho(-w, +w, -h, +h, 0.1f, +100); + P.ortho(-w, +w, -h, +h, 0.1f, +far); } rs.shader->bind(); rs.shader->setViewMatrix(V); rs.shader->setProjectionMatrix(P); - // solid floorplan parts - if (showFloorplan) { - - std::vector elements = getModel()->getVisibleElements(); - for (MapModelElement* el : elements) { - if (el->getMV3D() && !el->getMV3D()->isTransparent()) {el->getMV3D()->render(rs);} - } - + if (floorplanRenderer && floorplanRendererModel) { + floorplanRenderer->renderSolid(rs, floorplanRendererModel->getTriaSolid() ); } +// // solid floorplan parts +// if (showFloorplan) { + +// std::vector elements = getModel()->getVisibleElements(); +// for (MapModelElement* el : elements) { +// if (el->getMV3D() && !el->getMV3D()->isTransparent()) {el->getMV3D()->render(rs);} +// } + +// } + // if (showGrid && gridModel) { // gridRenderer->paintGL(gridModel->getGrid()); // } @@ -255,14 +320,18 @@ void MapView3D::draw() { navMeshRenderer->render(rs, navMeshModel->getNavMesh(), this); } - // transparant floorplan parts - if (showFloorplan) { +// // transparant floorplan parts +// if (showFloorplan) { - std::vector elements = getModel()->getVisibleElements(); - for (MapModelElement* el : elements) { - if (el->getMV3D() && el->getMV3D()->isTransparent()) {el->getMV3D()->render(rs);} - } +// std::vector elements = getModel()->getVisibleElements(); +// for (MapModelElement* el : elements) { +// if (el->getMV3D() && el->getMV3D()->isTransparent()) {el->getMV3D()->render(rs);} +// } +// } + + if (floorplanRenderer && floorplanRendererModel) { + floorplanRenderer->renderTransp(rs, floorplanRendererModel->getTriaTransp() ); } diff --git a/mapview/3D/MapView3D.h b/mapview/3D/MapView3D.h index e14c9cf..0d1de3c 100644 --- a/mapview/3D/MapView3D.h +++ b/mapview/3D/MapView3D.h @@ -13,6 +13,8 @@ class GridModel; class GridRenderer; class NavMeshRenderer; class NavMeshModel; +class FloorplanRenderer; +class FloorplanRendererModel; class MapView3D : public QOpenGLWidget { @@ -30,13 +32,17 @@ public: update(); } - void layerChange() { - update(); - } + /** redraw on layer change */ + void layerChange(); + /** get the underlying data-model */ MapModel* getModel() {return model;} + + /** get the renderer to use for the floorplan */ + FloorplanRenderer* getFloorplanRenderer() {return floorplanRenderer;} + /** get the renderer to use for the grid */ GridRenderer* getGridRenderer() {return gridRenderer;} @@ -67,6 +73,9 @@ private: /** the underlying data-model */ MapModel* model = nullptr; + FloorplanRenderer* floorplanRenderer = nullptr; + FloorplanRendererModel* floorplanRendererModel = nullptr; + GridModel* gridModel = nullptr; GridRenderer* gridRenderer = nullptr; @@ -104,6 +113,16 @@ protected: void mouseReleaseEvent(QMouseEvent* e); void wheelEvent(QWheelEvent* e); + // android + bool event(QEvent *e) override; + bool gestureEvent(QGestureEvent* event); + void pinchTriggered(QPinchGesture* gesture); + void panTriggered(QPanGesture* gesture); + +private: + + void moveXY(float dx, float dy); + signals: void onShow3DFloorplan(bool show); diff --git a/mapview/3D/floorplan/FloorplanRenderer.h b/mapview/3D/floorplan/FloorplanRenderer.h new file mode 100644 index 0000000..284f0ac --- /dev/null +++ b/mapview/3D/floorplan/FloorplanRenderer.h @@ -0,0 +1,72 @@ +#ifndef FLOORPLANRENDERER_H +#define FLOORPLANRENDERER_H + +#include +#include +#include +#include + +#include +#include + +#include "../misc/Renderable3D.h" +#include "../misc/Shader.h" +#include "../misc/TriangleData.h" + +#include + +#include "RenderTriangle.h" + +class FloorplanRenderer { + +public: + + /** ctor */ + FloorplanRenderer() { + ; + } + + /** render the given grid using GL commands */ + void renderSolid(const RenderSettings& rs, const RenderTriangle& rt) { + + rs.shader->bind(); + rs.shader->setModelMatrix(QMatrix4x4()); + + rs.shader->setVertices(rt.getVertices().data()); + rs.shader->setNormals(rt.getNormals().data()); + rs.shader->setVertexColor(rt.getRGBA().data()); + glDrawArrays(GL_TRIANGLES, 0, rt.getVertices().size()/3); + rs.shader->unsetVertices(); + rs.shader->unsetNormals(); + rs.shader->unsetVertexColor(); + + rs.shader->release(); + + } + + /** render the given grid using GL commands */ + void renderTransp(const RenderSettings& rs, const RenderTriangle& rt) { + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + rs.shader->bind(); + rs.shader->setModelMatrix(QMatrix4x4()); + + rs.shader->setVertices(rt.getVertices().data()); + rs.shader->setNormals(rt.getNormals().data()); + rs.shader->setVertexColor(rt.getRGBA().data()); + glDrawArrays(GL_TRIANGLES, 0, rt.getVertices().size()/3); + rs.shader->unsetVertices(); + rs.shader->unsetNormals(); + rs.shader->unsetVertexColor(); + + rs.shader->release(); + + glDisable(GL_BLEND); + + } + +}; + +#endif // FLOORPLANRENDERER_H diff --git a/mapview/3D/floorplan/FloorplanRendererModel.h b/mapview/3D/floorplan/FloorplanRendererModel.h new file mode 100644 index 0000000..8334340 --- /dev/null +++ b/mapview/3D/floorplan/FloorplanRendererModel.h @@ -0,0 +1,110 @@ +#ifndef FLOORPLANRENDERERMODEL_H +#define FLOORPLANRENDERERMODEL_H + +#include +#include +#include +#include +#include + +#include "RenderTriangle.h" + +/** + * model for rendering the floorplan + */ +class FloorplanRendererModel { + +private: + + Floorplan::IndoorMap* im; + Ray3D::FloorplanMesh mesh; + + RenderTriangle triaSolid; + RenderTriangle triaTransp; + + struct Material { + int r, g, b, a; + Material(int r, int g, int b, int a) : r(r), g(g), b(b), a(a) {;} + }; + + const std::vector mats = { + + Material(0,128,0,255), // ground outdoor + Material(64,64,64,255), // ground outdoor + Material(255,96,96,255), // stair + Material(220,220,220,255), // handrail + + Material(200,200,255,96), // door (glass) + Material(200,160,150,255), // door (wood) + + Material(128,128,128,255), // concrete + Material(200,200,255,96), // glass + + Material(200,200,200,255), // default + + }; + + int getMaterial(const Ray3D::Obstacle3D& o) const { + + if (o.type == Ray3D::Obstacle3D::Type::GROUND_OUTDOOR) {return 0;} + if (o.type == Ray3D::Obstacle3D::Type::GROUND_INDOOR) {return 1;} + if (o.type == Ray3D::Obstacle3D::Type::STAIR) {return 2;} + if (o.type == Ray3D::Obstacle3D::Type::HANDRAIL) {return 3;} + + if (o.type == Ray3D::Obstacle3D::Type::DOOR && o.mat == Floorplan::Material::GLASS) {return 4;} + if (o.type == Ray3D::Obstacle3D::Type::DOOR) {return 5;} + + if (o.mat == Floorplan::Material::CONCRETE) {return 6;} + if (o.mat == Floorplan::Material::GLASS) {return 7;} + + return 8; + + } + + +public: + + /** ctor */ + FloorplanRendererModel() { + ; + } + + Ray3D::FloorplanMesh& getMesh() { + return mesh; + } + + const RenderTriangle& getTriaSolid() { + return triaSolid; + } + + const RenderTriangle& getTriaTransp() { + return triaTransp; + } + + void rebuild(Floorplan::IndoorMap* im) { + + // rebuild the mesh + Ray3D::ModelFactory fac(im); + mesh = fac.getMesh(); + + triaTransp.clear(); + triaSolid.clear(); + + for (const Ray3D::Obstacle3D& obs : mesh.elements) { + const int matID = getMaterial(obs); + const Material& mat = mats[matID]; + for (const Triangle3& tria : obs.triangles) { + const Point3 n = cross(tria.p2-tria.p1, tria.p3-tria.p1).normalized(); + if (mat.a != 255) { + triaTransp.addTriangle(tria.p1, tria.p2, tria.p3, n, mat.r/255.0f, mat.g/255.0f, mat.b/255.0f, mat.a/255.0f); + } else { + triaSolid.addTriangle(tria.p1, tria.p2, tria.p3, n, mat.r/255.0f, mat.g/255.0f, mat.b/255.0f, mat.a/255.0f); + } + } + } + + } + +}; + +#endif // FLOORPLANRENDERERMODEL_H diff --git a/mapview/3D/floorplan/RenderTriangle.h b/mapview/3D/floorplan/RenderTriangle.h new file mode 100644 index 0000000..d91afa6 --- /dev/null +++ b/mapview/3D/floorplan/RenderTriangle.h @@ -0,0 +1,78 @@ +#ifndef RENDERTRIANGLE_H +#define RENDERTRIANGLE_H + + +#include +#include + +class RenderTriangle { + + std::vector vertices; + std::vector normals; + std::vector rgba; + +public: + + void addTriangle(Point3 p1, Point3 p2, Point3 p3) { + + vertices.insert(vertices.end(), {p1.x, p1.y, p1.z}); + vertices.insert(vertices.end(), {p2.x, p2.y, p2.z}); + vertices.insert(vertices.end(), {p3.x, p3.y, p3.z}); + + } + + void addTriangle(Point3 p1, Point3 p2, Point3 p3, const Point3 n) { + + vertices.insert(vertices.end(), {p1.x, p1.y, p1.z}); + vertices.insert(vertices.end(), {p2.x, p2.y, p2.z}); + vertices.insert(vertices.end(), {p3.x, p3.y, p3.z}); + + normals.insert(normals.end(), {n.x, n.y, n.z}); + normals.insert(normals.end(), {n.x, n.y, n.z}); + normals.insert(normals.end(), {n.x, n.y, n.z}); + + } + + void addTriangle(Point3 p1, Point3 p2, Point3 p3, const Point3 n, const float r, const float g, const float b, const float a) { + + vertices.insert(vertices.end(), {p1.x, p1.y, p1.z}); + vertices.insert(vertices.end(), {p2.x, p2.y, p2.z}); + vertices.insert(vertices.end(), {p3.x, p3.y, p3.z}); + + normals.insert(normals.end(), {n.x, n.y, n.z}); + normals.insert(normals.end(), {n.x, n.y, n.z}); + normals.insert(normals.end(), {n.x, n.y, n.z}); + + rgba.insert(rgba.end(), {r,g,b,a}); + rgba.insert(rgba.end(), {r,g,b,a}); + rgba.insert(rgba.end(), {r,g,b,a}); + + } + + + void addLine(Point3 p1, Point3 p2, const float r, const float g, const float b, const float a) { + + vertices.insert(vertices.end(), {p1.x, p1.y, p1.z}); + vertices.insert(vertices.end(), {p2.x, p2.y, p2.z}); + + rgba.insert(rgba.end(), {r,g,b,a}); + rgba.insert(rgba.end(), {r,g,b,a}); + + } + + void clear() { + vertices.clear(); + normals.clear(); + rgba.clear(); + } + + const std::vector& getVertices() const {return vertices;} + + const std::vector& getNormals() const {return normals;} + + const std::vector& getRGBA() const {return rgba;} + +}; + + +#endif // RENDERTRIANGLE_H diff --git a/mapview/3D/misc/Polygon.h b/mapview/3D/misc/Polygon.h index 6aa1757..8b5536c 100644 --- a/mapview/3D/misc/Polygon.h +++ b/mapview/3D/misc/Polygon.h @@ -1,6 +1,7 @@ #ifndef POLYGON_H #define POLYGON_H + #include #include "../../../lib/gpc/gpc.h" diff --git a/mapview/3D/misc/TriangleData.h b/mapview/3D/misc/TriangleData.h index b80a050..c685232 100644 --- a/mapview/3D/misc/TriangleData.h +++ b/mapview/3D/misc/TriangleData.h @@ -45,7 +45,6 @@ public: rgba.insert(rgba.end(), {r,g,b,a}); rgba.insert(rgba.end(), {r,g,b,a}); rgba.insert(rgba.end(), {r,g,b,a}); - rgba.insert(rgba.end(), {r,g,b,a}); } diff --git a/mapview/model/MMFloor.h b/mapview/model/MMFloor.h index 602de36..356bd8e 100644 --- a/mapview/model/MMFloor.h +++ b/mapview/model/MMFloor.h @@ -50,6 +50,15 @@ public: } + bool isVisible() const override { + return floor->enabled; + } + + void setVisible(const bool visible) override { + floor->enabled = visible; + onVisibilityChanged(visible); + } + /** ctor. new floor. */ MMFloor(MapLayer* parent) : MapLayer(parent), floor(nullptr) { throw "not yet implemented"; @@ -58,12 +67,6 @@ public: /** get the underlying model */ Floorplan::Floor& getFloor() {return *floor;} - virtual void setVisible(const bool visible) override { - floor->enabled = visible; - MapLayer::setVisible(visible); - } - - std::string getLayerName() const override {return floor->name;} virtual int getNumParams() const override { diff --git a/mapview/model/MMFloorAccessPoints.h b/mapview/model/MMFloorAccessPoints.h index 9b6ffab..70f82c2 100644 --- a/mapview/model/MMFloorAccessPoints.h +++ b/mapview/model/MMFloorAccessPoints.h @@ -27,6 +27,15 @@ public: } + bool isVisible() const override { + return floor->accesspoints.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->accesspoints.enabled = visible; + onVisibilityChanged(visible); + } + std::string getLayerName() const override {return "APs";} //TODO: check diff --git a/mapview/model/MMFloorBeacons.h b/mapview/model/MMFloorBeacons.h index b8aa252..c84b400 100644 --- a/mapview/model/MMFloorBeacons.h +++ b/mapview/model/MMFloorBeacons.h @@ -27,6 +27,15 @@ public: } + bool isVisible() const override { + return floor->beacons.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->beacons.enabled = visible; + onVisibilityChanged(visible); + } + std::string getLayerName() const override {return "Beacons";} //TODO: check diff --git a/mapview/model/MMFloorElevators.h b/mapview/model/MMFloorElevators.h index 8798d15..ca35d1a 100644 --- a/mapview/model/MMFloorElevators.h +++ b/mapview/model/MMFloorElevators.h @@ -29,6 +29,15 @@ public: } + bool isVisible() const override { + return floor->elevators.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->elevators.enabled = visible; + onVisibilityChanged(visible); + } + std::string getLayerName() const override {return "Elevators";} //TODO: check diff --git a/mapview/model/MMFloorFingerprints.h b/mapview/model/MMFloorFingerprints.h index 39e1a2d..c253edb 100644 --- a/mapview/model/MMFloorFingerprints.h +++ b/mapview/model/MMFloorFingerprints.h @@ -27,6 +27,15 @@ public: } + bool isVisible() const override { + return floor->fpLocations.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->fpLocations.enabled = visible; + onVisibilityChanged(visible); + } + /** get the corresponding floor from the underlying model */ Floorplan::Floor* getFloor() {return floor;} diff --git a/mapview/model/MMFloorGroundTruthPoints.h b/mapview/model/MMFloorGroundTruthPoints.h index 02cff90..edb8409 100644 --- a/mapview/model/MMFloorGroundTruthPoints.h +++ b/mapview/model/MMFloorGroundTruthPoints.h @@ -25,6 +25,15 @@ public: } + bool isVisible() const override { + return floor->gtpoints.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->gtpoints.enabled = visible; + onVisibilityChanged(visible); + } + /** get the corresponding floor from the underlying model */ Floorplan::Floor* getFloor() {return floor;} diff --git a/mapview/model/MMFloorObstacles.h b/mapview/model/MMFloorObstacles.h index 02dac5e..ef8da91 100644 --- a/mapview/model/MMFloorObstacles.h +++ b/mapview/model/MMFloorObstacles.h @@ -35,6 +35,15 @@ public: } + bool isVisible() const override { + return floor->obstacles.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->obstacles.enabled = visible; + onVisibilityChanged(visible); + } + /** get the corresponding floor from the underlying model */ Floorplan::Floor* getFloor() {return floor;} diff --git a/mapview/model/MMFloorOutline.h b/mapview/model/MMFloorOutline.h index 73b464a..49280a3 100644 --- a/mapview/model/MMFloorOutline.h +++ b/mapview/model/MMFloorOutline.h @@ -36,6 +36,14 @@ public: } + bool isVisible() const override { + return floor->outline.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->outline.enabled = visible; + onVisibilityChanged(visible); + } /** get the corresponding floor from the underlying model */ Floorplan::Floor* getFloor() {return floor;} diff --git a/mapview/model/MMFloorPOIs.h b/mapview/model/MMFloorPOIs.h index 20b3ebf..51f99ed 100644 --- a/mapview/model/MMFloorPOIs.h +++ b/mapview/model/MMFloorPOIs.h @@ -25,6 +25,15 @@ public: } + bool isVisible() const override { + return floor->pois.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->pois.enabled = visible; + onVisibilityChanged(visible); + } + /** get the corresponding floor from the underlying model */ Floorplan::Floor* getFloor() {return floor;} diff --git a/mapview/model/MMFloorStairs.h b/mapview/model/MMFloorStairs.h index c138719..e11b02f 100644 --- a/mapview/model/MMFloorStairs.h +++ b/mapview/model/MMFloorStairs.h @@ -30,6 +30,15 @@ public: } + bool isVisible() const override { + return floor->stairs.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->stairs.enabled = visible; + onVisibilityChanged(visible); + } + MMFloorStair* create(Floorplan::StairFreeform* stair) { // add to underlying model diff --git a/mapview/model/MMFloorUnderlays.h b/mapview/model/MMFloorUnderlays.h index e50260d..a0d67c2 100644 --- a/mapview/model/MMFloorUnderlays.h +++ b/mapview/model/MMFloorUnderlays.h @@ -28,6 +28,15 @@ public: } + bool isVisible() const override { + return floor->underlays.enabled; + } + + void setVisible(const bool visible) override { + this-> floor->underlays.enabled = visible; + onVisibilityChanged(visible); + } + //TODO: check void createImage(const Point2 center) { diff --git a/mapview/model/MMFloors.h b/mapview/model/MMFloors.h index fa63e8a..6d3d99d 100644 --- a/mapview/model/MMFloors.h +++ b/mapview/model/MMFloors.h @@ -13,6 +13,7 @@ class MMFloors : public MapLayer { private: + bool visible = true; Floorplan::IndoorMap* map; public: @@ -27,6 +28,15 @@ public: } + bool isVisible() const override { + return visible; + } + + void setVisible(const bool visible) override { + this->visible = visible; + onVisibilityChanged(visible); + } + std::string getLayerName() const override {return "floors";} /** get the underlying model */ diff --git a/mapview/model/MMRegistration.h b/mapview/model/MMRegistration.h index bf9c450..d980a48 100644 --- a/mapview/model/MMRegistration.h +++ b/mapview/model/MMRegistration.h @@ -27,6 +27,15 @@ public: } + bool isVisible() const override { + return map->earthReg.enabled; + } + + void setVisible(const bool visible) override { + map->earthReg.enabled = visible; + onVisibilityChanged(visible); + } + //TODO: check MMRegistrationPoint* create(Floorplan::EarthPosMapPos* reg) { diff --git a/mapview/model/MMRoot.h b/mapview/model/MMRoot.h index c4755c3..765d89a 100644 --- a/mapview/model/MMRoot.h +++ b/mapview/model/MMRoot.h @@ -29,6 +29,14 @@ public: } + bool isVisible() const override { + return true; + } + + void setVisible(const bool) override { + throw "error"; + } + /** get the underlying model */ Floorplan::IndoorMap* getMap() {return map;} diff --git a/mapview/model/MapLayer.h b/mapview/model/MapLayer.h index 0e7e69a..2537494 100644 --- a/mapview/model/MapLayer.h +++ b/mapview/model/MapLayer.h @@ -50,17 +50,17 @@ protected: MapLayerType type; /** whether this layer is visible */ - bool visible; + //bool visible; public: /** ctor */ - MapLayer(MapLayer* parent) : parent(parent), type(MapLayerType::UNKNOWN), visible(true) { + MapLayer(MapLayer* parent) : parent(parent), type(MapLayerType::UNKNOWN) { if (parent) {parent->addSublayer(this);} // attach myself as child of my parent } /** ctor */ - MapLayer(MapLayer* parent, MapLayerType type) : parent(parent), type(type), visible(true) { + MapLayer(MapLayer* parent, MapLayerType type) : parent(parent), type(type) { if (parent) {parent->addSublayer(this);} // attach myself as child of my parent } @@ -104,14 +104,15 @@ public: void removeSublayer(const MapLayer* layer) { sublayers.erase(std::remove(sublayers.begin(), sublayers.end(), layer), sublayers.end()); } /** is this layer currently visible? */ - bool isVisible() const {return visible;} +// bool isVisible() const {return visible;} + virtual bool isVisible() const = 0; /** make this layer visible */ - virtual void setVisible(const bool visible) { - this->visible = visible; - onVisibilityChanged(visible); - } - +// virtual void setVisible(const bool visible) { +// this->visible = visible; +// onVisibilityChanged(visible); +// } + virtual void setVisible(const bool visible) = 0; /** get all sub-layers within this layer */ const std::vector& getSubLayers() const {return sublayers;} @@ -145,7 +146,7 @@ public: } } -private: +protected: void onElemAdded(MapModelElement* e) { if (parent) {parent->onElemAdded(e);} @@ -182,6 +183,14 @@ public: std::string getLayerName() const override {return "root";} + bool isVisible() const override { + return true; + } + + void setVisible(const bool visible) override { + throw "error"; + } + }; diff --git a/mapview/model/MapLayers.h b/mapview/model/MapLayers.h deleted file mode 100644 index bfc60f4..0000000 --- a/mapview/model/MapLayers.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef MAPLAYERFLOOR_H -#define MAPLAYERFLOOR_H - -#include "MapLayer.h" -#include - -#include "../model/MMFloorObstacleLine.h" -#include "../model/MMFloorObstacleCircle.h" -#include "../model/MMFloorOutlinePolygon.h" -#include "../model/MMFloorBeacon.h" - - -/* -class MapLayerFloorOutlineAdd : public TypedMapLayer { -private: - Floorplan::Floor& floor; -public: - MapLayerFloorOutlineAdd(MapLayer* parent, Floorplan::Floor& floor) : TypedMapLayer(parent, MapLayerType::FLOOR_GROUND_ADD), floor(floor) {;} - std::string getLayerName() const override {return "add";} - Floorplan::Floor& getFloor() {return floor;} - std::vector getElements() const override { - std::vector vec; - for (Floorplan::FloorOutlinePolygon& p : floor.outline.add) {vec.push_back(new MapViewElementFloorOutlinePolygon(floor, p, MapViewElementFloorOutlinePolygon::Type::ADD));} - return vec; - } - void create(const Floorplan::FloorOutlinePolygon& poly) { - floor.outline.add.push_back(poly); - } - virtual size_t getNumElements() const override {return floor.outline.add.size();} -}; - -class MapLayerFloorOutlineRemove : public TypedMapLayer { -private: - Floorplan::Floor& floor; -public: - MapLayerFloorOutlineRemove(MapLayer* parent, Floorplan::Floor& floor) : TypedMapLayer(parent, MapLayerType::FLOOR_GROUND_REMOVE), floor(floor) {;} - std::string getLayerName() const override {return "remove";} - Floorplan::Floor& getFloor() {return floor;} - std::vector getElements() const override { - std::vector vec; - for (Floorplan::FloorOutlinePolygon& p : floor.outline.remove) {vec.push_back(new MapViewElementFloorOutlinePolygon(floor, p, MapViewElementFloorOutlinePolygon::Type::REMOVE));} - return vec; - } - void create(const Floorplan::FloorOutlinePolygon& poly) { - floor.outline.remove.push_back(poly); - } - virtual size_t getNumElements() const override {return floor.outline.remove.size();} -}; - - - - - -class MapLayerFloorOutlinePolygon : public TypedMapLayer { -private: - Floorplan::Floor& floor; -public: - MapLayerFloorOutlinePolygon(MapLayer* parent, Floorplan::Floor& floor) : TypedMapLayer(parent, MapLayerType::FLOOR_GROUND), floor(floor) { - new MapLayerFloorOutlineAdd(this, floor); - new MapLayerFloorOutlineRemove(this, floor); - } - std::string getLayerName() const override {return "ground";} - Floorplan::Floor& getFloor() {return floor;} -}; -*/ - - - - - - -#endif // MAPLAYERFLOOR_H diff --git a/params/ToolBoxWidget.cpp b/params/ToolBoxWidget.cpp index bed5d01..35bf4fc 100644 --- a/params/ToolBoxWidget.cpp +++ b/params/ToolBoxWidget.cpp @@ -8,7 +8,7 @@ #include #include -#include "../mapview/model/MapLayers.h" +//#include "../mapview/model/MapLayers.h" #include "../mapview/2D/MapView2D.h" #include "../mapview/model/MapModel.h"