added nav-mesh support to indoor-map

some fixes/changes
This commit is contained in:
2018-01-16 12:43:45 +01:00
parent 281ef3f7dc
commit 4dda7e656b
16 changed files with 524 additions and 60 deletions

View File

@@ -7,6 +7,9 @@
#include "../3DGrid/GridModel.h"
#include "../3DGrid/GridRenderer.h"
#include "../3DNavMesh/NavMeshModel.h"
#include "../3DNavMesh/NavMeshRenderer.h"
MapView3D::MapView3D(QWidget *parent) : QGLWidget(parent) {
rot.x = 45;
@@ -180,12 +183,20 @@ void MapView3D::wheelEvent(QWheelEvent* e) {
}
void MapView3D::showFloorplan() {
if (gridModel) {delete gridModel; gridModel = nullptr;}
void MapView3D::setShowFloorplan(bool show) {
this->showFloorplan = show;
//if (gridModel) {delete gridModel; gridModel = nullptr;}
//if (navMeshModel) {delete navMeshModel; navMeshModel = nullptr;}
update();
}
void MapView3D::showGrid() {
void MapView3D::setShowGrid(bool show) {
this->showGrid = show;
if (!show) {update(); return;}
// delete the previous grid (if any)
if (gridModel) {delete gridModel; gridModel = nullptr;}
@@ -203,31 +214,53 @@ void MapView3D::showGrid() {
}
void MapView3D::setShowNavMesh(bool show) {
this->showNavMesh = show;
if (!show) {update(); return;}
// delete the previous grid (if any)
if (navMeshModel) {delete navMeshModel; navMeshModel = nullptr;}
// build a new model
NavMeshModel* nm = new NavMeshModel();
Floorplan::IndoorMap* im = getModel()->getMap();
nm->rebuild(im);
// remember
this->navMeshModel = nm;
// update UI
update();
}
void MapView3D::draw() {
if (gridModel) {
// show grid
gridRenderer->paintGL(gridModel->getGrid());
} else {
// solid floorplan parts
if (showFloorplan) {
std::vector<MapModelElement*> elements = getModel()->getVisibleElements();
// order: transparent last
auto func = [] (const MapModelElement* e1, const MapModelElement* e2) {
if (e1->getMV3D() == nullptr) {return false;}
if (e2->getMV3D() == nullptr) {return true;}
const bool e1t = e1->getMV3D()->isTransparent();
const bool e2t = e2->getMV3D()->isTransparent();
return e1t < e2t;
};
std::sort(elements.begin(), elements.end(), func);
// show floorplan
for (MapModelElement* el : elements) {
if (el->getMV3D()) {el->getMV3D()->paintGL();}
if (el->getMV3D() && !el->getMV3D()->isTransparent()) {el->getMV3D()->paintGL();}
}
}
if (showGrid) {
gridRenderer->paintGL(gridModel->getGrid());
}
if (showNavMesh) {
navMeshRenderer->paintGL(navMeshModel->getNavMesh(), this);
}
// transparant floorplan parts
if (showFloorplan) {
std::vector<MapModelElement*> elements = getModel()->getVisibleElements();
for (MapModelElement* el : elements) {
if (el->getMV3D() && el->getMV3D()->isTransparent()) {el->getMV3D()->paintGL();}
}
}