added nav-mesh support to indoor-map
some fixes/changes
This commit is contained in:
@@ -42,7 +42,8 @@ SOURCES += \
|
|||||||
params/MetaEditWidget.cpp \
|
params/MetaEditWidget.cpp \
|
||||||
params/MetaEditModel.cpp \
|
params/MetaEditModel.cpp \
|
||||||
mapview/2D/MapView2D.cpp \
|
mapview/2D/MapView2D.cpp \
|
||||||
misc/LINTView.cpp
|
misc/LINTView.cpp \
|
||||||
|
mapview/3DNavMesh/QNavMeshSettings.cpp
|
||||||
|
|
||||||
|
|
||||||
HEADERS += MainWindow.h \
|
HEADERS += MainWindow.h \
|
||||||
@@ -165,13 +166,18 @@ HEADERS += MainWindow.h \
|
|||||||
mapview/2D/tools/ToolNewBeacon.h \
|
mapview/2D/tools/ToolNewBeacon.h \
|
||||||
mapview/2D/tools/ToolNewGroundTruth.h \
|
mapview/2D/tools/ToolNewGroundTruth.h \
|
||||||
mapview/2D/tools/ToolNewPOI.h \
|
mapview/2D/tools/ToolNewPOI.h \
|
||||||
mapview/3D/MV3DElementElevator.h
|
mapview/3D/MV3DElementElevator.h \
|
||||||
|
mapview/3DNavMesh/NavMeshView.h \
|
||||||
|
mapview/3DNavMesh/NavMeshRenderer.h \
|
||||||
|
mapview/3DNavMesh/NavMeshModel.h \
|
||||||
|
mapview/3DNavMesh/QNavMeshSettings.h
|
||||||
|
|
||||||
|
|
||||||
FORMS += MainWindow.ui
|
FORMS += MainWindow.ui
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
../Indoor/lib/tinyxml/tinyxml2.cpp
|
../Indoor/lib/tinyxml/tinyxml2.cpp \
|
||||||
|
../Indoor/lib/Recast/*.cpp
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
res.qrc
|
res.qrc
|
||||||
|
|||||||
@@ -87,8 +87,9 @@ MainController::MainController() {
|
|||||||
connect(mw->getActionWidget(), SIGNAL(onSave()), this, SLOT(onSave()));
|
connect(mw->getActionWidget(), SIGNAL(onSave()), this, SLOT(onSave()));
|
||||||
|
|
||||||
// 3D view change
|
// 3D view change
|
||||||
connect(mw, SIGNAL(onShow3DFloorplan()), this, SLOT(onShow3DFloorplan()));
|
connect(mw, SIGNAL(onShow3DFloorplan(bool)), this, SLOT(onSetShow3DFloorplan(bool)));
|
||||||
connect(mw, SIGNAL(onShow3DGrid()), this, SLOT(onShow3DGrid()));
|
connect(mw, SIGNAL(onShow3DGrid(bool)), this, SLOT(onSetShow3DGrid(bool)));
|
||||||
|
connect(mw, SIGNAL(onShow3DNavMesh(bool)), this, SLOT(onSetShow3DNavMesh(bool)));
|
||||||
|
|
||||||
// 3D grid view config
|
// 3D grid view config
|
||||||
connect(mw, &MainWindow::onGridNodeColorImp, [&] () {mw->getMapView3D()->getGridRenderer()->setNodeColorMode(GridRendererColorMode::SHOW_NODE_IMPORTANCE);} );
|
connect(mw, &MainWindow::onGridNodeColorImp, [&] () {mw->getMapView3D()->getGridRenderer()->setNodeColorMode(GridRendererColorMode::SHOW_NODE_IMPORTANCE);} );
|
||||||
@@ -99,8 +100,9 @@ MainController::MainController() {
|
|||||||
//mapModel->load("../IndoorMap/maps/SHL38_no_elev.xml");
|
//mapModel->load("../IndoorMap/maps/SHL38_no_elev.xml");
|
||||||
//mapModel->load("/apps/testmap.xml");
|
//mapModel->load("/apps/testmap.xml");
|
||||||
//mapModel->load("/apps/map24b.xml");
|
//mapModel->load("/apps/map24b.xml");
|
||||||
|
//mapModel->load("/apps/SHL41.xml");
|
||||||
|
|
||||||
mapModel->load("/apps/SHL41.xml");
|
mapModel->load("/mnt/vm/paper/diss/data/maps/SHL41_nm.xml");
|
||||||
|
|
||||||
//mapModel->load("/apps/paper/diss/data/maps/map_elevator2.xml");
|
//mapModel->load("/apps/paper/diss/data/maps/map_elevator2.xml");
|
||||||
//mapModel->load("/apps/paper/diss/data/maps/map_issue6.xml");
|
//mapModel->load("/apps/paper/diss/data/maps/map_issue6.xml");
|
||||||
@@ -145,12 +147,16 @@ void MainController::onLayerVisibilityChanged(MapLayer *layer, const bool visibl
|
|||||||
(void) visible;
|
(void) visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainController::onShow3DFloorplan() {
|
void MainController::onSetShow3DFloorplan(bool show) {
|
||||||
mw->getMapView3D()->showFloorplan();
|
mw->getMapView3D()->setShowFloorplan(show);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainController::onShow3DGrid() {
|
void MainController::onSetShow3DGrid(bool show) {
|
||||||
mw->getMapView3D()->showGrid();
|
mw->getMapView3D()->setShowGrid(show);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainController::onSetShow3DNavMesh(bool show) {
|
||||||
|
mw->getMapView3D()->setShowNavMesh(show);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainController::layerSelected(QModelIndex idx) {
|
void MainController::layerSelected(QModelIndex idx) {
|
||||||
|
|||||||
@@ -65,8 +65,9 @@ public slots:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void onShow3DFloorplan();
|
void onSetShow3DFloorplan(bool show);
|
||||||
void onShow3DGrid();
|
void onSetShow3DGrid(bool show);
|
||||||
|
void onSetShow3DNavMesh(bool show);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -114,14 +114,16 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
|
|||||||
// ui->layTree->addWidget(actionWidget);
|
// ui->layTree->addWidget(actionWidget);
|
||||||
|
|
||||||
|
|
||||||
// show mode
|
// // show mode (radio buttons)
|
||||||
QActionGroup* grpMode = new QActionGroup(this);
|
// QActionGroup* grpMode = new QActionGroup(this);
|
||||||
grpMode->addAction(ui->actShow3DFloorplan);
|
// grpMode->addAction(ui->actShow3DFloorplan);
|
||||||
grpMode->addAction(ui->actShow3DGrid);
|
// grpMode->addAction(ui->actShow3DGrid);
|
||||||
|
// grpMode->addAction(ui->actShow3DNavMesh);
|
||||||
|
|
||||||
connect(ui->actShow2D, SIGNAL(triggered(bool)), this, SIGNAL(onShow2D()));
|
connect(ui->actShow2D, SIGNAL(triggered(bool)), this, SIGNAL(onShow2D()));
|
||||||
connect(ui->actShow3DGrid, SIGNAL(triggered(bool)), this, SIGNAL(onShow3DGrid()));
|
connect(ui->actShow3DGrid, SIGNAL(triggered(bool)), this, SIGNAL(onShow3DGrid(bool)));
|
||||||
connect(ui->actShow3DFloorplan, SIGNAL(triggered(bool)), this, SIGNAL(onShow3DFloorplan()));
|
connect(ui->actShow3DFloorplan, SIGNAL(triggered(bool)), this, SIGNAL(onShow3DFloorplan(bool)));
|
||||||
|
connect(ui->actShow3DNavMesh, SIGNAL(triggered(bool)), this, SIGNAL(onShow3DNavMesh(bool)));
|
||||||
|
|
||||||
|
|
||||||
// node coloring
|
// node coloring
|
||||||
|
|||||||
@@ -40,8 +40,9 @@ public:
|
|||||||
signals:
|
signals:
|
||||||
|
|
||||||
void onShow2D();
|
void onShow2D();
|
||||||
void onShow3DFloorplan();
|
void onShow3DFloorplan(bool show);
|
||||||
void onShow3DGrid();
|
void onShow3DGrid(bool show);
|
||||||
|
void onShow3DNavMesh(bool show);
|
||||||
void onGridShowEdges(bool);
|
void onGridShowEdges(bool);
|
||||||
void onGridNodeColorImp();
|
void onGridNodeColorImp();
|
||||||
void onGridNodeColorType();
|
void onGridNodeColorType();
|
||||||
|
|||||||
@@ -23,30 +23,31 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>777</width>
|
<width>777</width>
|
||||||
<height>26</height>
|
<height>30</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuView">
|
<widget class="QMenu" name="menuView">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>View</string>
|
<string>&View</string>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menu3D">
|
<widget class="QMenu" name="menu3D">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>3D</string>
|
<string>&3D</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actShow3DFloorplan"/>
|
<addaction name="actShow3DFloorplan"/>
|
||||||
<addaction name="actShow3DGrid"/>
|
<addaction name="actShow3DGrid"/>
|
||||||
|
<addaction name="actShow3DNavMesh"/>
|
||||||
</widget>
|
</widget>
|
||||||
<addaction name="actShow2D"/>
|
<addaction name="actShow2D"/>
|
||||||
<addaction name="menu3D"/>
|
<addaction name="menu3D"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menuGridf">
|
<widget class="QMenu" name="menuGridf">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Grid</string>
|
<string>&Grid</string>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuNode_color">
|
<widget class="QMenu" name="menuNode_color">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>node color</string>
|
<string>&node color</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actGridNodeColorType"/>
|
<addaction name="actGridNodeColorType"/>
|
||||||
<addaction name="actGridNodeColorImportance"/>
|
<addaction name="actGridNodeColorImportance"/>
|
||||||
@@ -62,15 +63,18 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>2D</string>
|
<string>&2D</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actShow3DFloorplan">
|
<action name="actShow3DFloorplan">
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Floorplan</string>
|
<string>&Floorplan</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actGridShowEdges">
|
<action name="actGridShowEdges">
|
||||||
@@ -78,7 +82,7 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>show edges</string>
|
<string>&show edges</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actGridNodeColorType">
|
<action name="actGridNodeColorType">
|
||||||
@@ -86,7 +90,7 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>node type</string>
|
<string>&node type</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actGridNodeColorImportance">
|
<action name="actGridNodeColorImportance">
|
||||||
@@ -94,7 +98,7 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>node importance</string>
|
<string>node &importance</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actShow3DGrid">
|
<action name="actShow3DGrid">
|
||||||
@@ -102,7 +106,20 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Grid</string>
|
<string>&Grid</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionNavMesh">
|
||||||
|
<property name="text">
|
||||||
|
<string>NavMesh</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actShow3DNavMesh">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&NavMesh</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
|
|||||||
@@ -104,8 +104,8 @@ public:
|
|||||||
QLinearGradient gradient(p.s.xms(part.start.x), p.s.yms(part.start.y), p.s.xms(part.end.x), p.s.yms(part.end.y));
|
QLinearGradient gradient(p.s.xms(part.start.x), p.s.yms(part.start.y), p.s.xms(part.end.x), p.s.yms(part.end.y));
|
||||||
const float p1 = 0.1 + clamp01( part.start.z / floor->height) * 0.8;
|
const float p1 = 0.1 + clamp01( part.start.z / floor->height) * 0.8;
|
||||||
const float p2 = 0.1 + clamp01( part.end.z / floor->height) * 0.8;
|
const float p2 = 0.1 + clamp01( part.end.z / floor->height) * 0.8;
|
||||||
gradient.setColorAt(0, QColor(p1*255, p1*255, p1*255, 128));
|
gradient.setColorAt(0, QColor(p1*128, p1*128, p1*255, 128));
|
||||||
gradient.setColorAt(1, QColor(p2*255, p2*255, p2*255, 128));
|
gradient.setColorAt(1, QColor(p2*128, p2*128, p2*255, 128));
|
||||||
p.setBrush(gradient);
|
p.setBrush(gradient);
|
||||||
p.setPen(QColor(0,0,0,128));
|
p.setPen(QColor(0,0,0,128));
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ protected:
|
|||||||
|
|
||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
|
|
||||||
glColor3f(1.0, 0.55, 0.55);
|
//glColor3f(1.0, 0.55, 0.55);
|
||||||
|
glColor3f(0.3, 0.3, 0.3);
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
|
|
||||||
const std::vector<Floorplan::StairPart> parts = stair->getParts();
|
const std::vector<Floorplan::StairPart> parts = stair->getParts();
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
#include "../3DGrid/GridModel.h"
|
#include "../3DGrid/GridModel.h"
|
||||||
#include "../3DGrid/GridRenderer.h"
|
#include "../3DGrid/GridRenderer.h"
|
||||||
|
|
||||||
|
#include "../3DNavMesh/NavMeshModel.h"
|
||||||
|
#include "../3DNavMesh/NavMeshRenderer.h"
|
||||||
|
|
||||||
MapView3D::MapView3D(QWidget *parent) : QGLWidget(parent) {
|
MapView3D::MapView3D(QWidget *parent) : QGLWidget(parent) {
|
||||||
|
|
||||||
rot.x = 45;
|
rot.x = 45;
|
||||||
@@ -180,12 +183,20 @@ void MapView3D::wheelEvent(QWheelEvent* e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MapView3D::showFloorplan() {
|
void MapView3D::setShowFloorplan(bool show) {
|
||||||
if (gridModel) {delete gridModel; gridModel = nullptr;}
|
|
||||||
|
this->showFloorplan = show;
|
||||||
|
|
||||||
|
//if (gridModel) {delete gridModel; gridModel = nullptr;}
|
||||||
|
//if (navMeshModel) {delete navMeshModel; navMeshModel = nullptr;}
|
||||||
update();
|
update();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapView3D::showGrid() {
|
void MapView3D::setShowGrid(bool show) {
|
||||||
|
|
||||||
|
this->showGrid = show;
|
||||||
|
if (!show) {update(); return;}
|
||||||
|
|
||||||
// delete the previous grid (if any)
|
// delete the previous grid (if any)
|
||||||
if (gridModel) {delete gridModel; gridModel = nullptr;}
|
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() {
|
void MapView3D::draw() {
|
||||||
|
|
||||||
if (gridModel) {
|
// solid floorplan parts
|
||||||
|
if (showFloorplan) {
|
||||||
// show grid
|
|
||||||
gridRenderer->paintGL(gridModel->getGrid());
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
std::vector<MapModelElement*> elements = getModel()->getVisibleElements();
|
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) {
|
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();}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
class MapModel;
|
class MapModel;
|
||||||
class GridModel;
|
class GridModel;
|
||||||
class GridRenderer;
|
class GridRenderer;
|
||||||
|
class NavMeshRenderer;
|
||||||
|
class NavMeshModel;
|
||||||
|
|
||||||
class MapView3D : public QGLWidget {
|
class MapView3D : public QGLWidget {
|
||||||
|
|
||||||
@@ -34,13 +36,27 @@ public:
|
|||||||
/** get the renderer to use for the grid */
|
/** get the renderer to use for the grid */
|
||||||
GridRenderer* getGridRenderer() {return gridRenderer;}
|
GridRenderer* getGridRenderer() {return gridRenderer;}
|
||||||
|
|
||||||
|
/** get the renderer to use for the NavMesh */
|
||||||
|
NavMeshRenderer* getNavMeshRenderer() {return navMeshRenderer;}
|
||||||
|
|
||||||
|
|
||||||
|
// /** show 3D rendered floorplan */
|
||||||
|
// void showFloorplan();
|
||||||
|
|
||||||
|
// /** show 3D rendered grid derived from the floorplan */
|
||||||
|
// void showGrid();
|
||||||
|
|
||||||
|
// /** show 3D rendered NavMesh derived from the floorplan */
|
||||||
|
// void showNavMesh();
|
||||||
|
|
||||||
/** show 3D rendered floorplan */
|
/** show 3D rendered floorplan */
|
||||||
void showFloorplan();
|
void setShowFloorplan(bool show);
|
||||||
|
|
||||||
/** show 3D rendered grid derived from the floorplan */
|
/** show 3D rendered grid derived from the floorplan */
|
||||||
void showGrid();
|
void setShowGrid(bool show);
|
||||||
|
|
||||||
|
/** show 3D rendered NavMesh derived from the floorplan */
|
||||||
|
void setShowNavMesh(bool show);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -50,6 +66,13 @@ private:
|
|||||||
GridModel* gridModel = nullptr;
|
GridModel* gridModel = nullptr;
|
||||||
GridRenderer* gridRenderer = nullptr;
|
GridRenderer* gridRenderer = nullptr;
|
||||||
|
|
||||||
|
NavMeshModel* navMeshModel = nullptr;
|
||||||
|
NavMeshRenderer* navMeshRenderer = nullptr;
|
||||||
|
|
||||||
|
bool showFloorplan = true;
|
||||||
|
bool showGrid = false;
|
||||||
|
bool showNavMesh = false;
|
||||||
|
|
||||||
Point3 rot;
|
Point3 rot;
|
||||||
Point3 center;
|
Point3 center;
|
||||||
Point3 scale;
|
Point3 scale;
|
||||||
@@ -67,6 +90,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void initializeGL();
|
void initializeGL();
|
||||||
void paintGL();
|
void paintGL();
|
||||||
void resizeGL(int width, int height);
|
void resizeGL(int width, int height);
|
||||||
|
|||||||
85
mapview/3DNavMesh/NavMeshModel.h
Normal file
85
mapview/3DNavMesh/NavMeshModel.h
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#ifndef NAVMESHMODEL_H
|
||||||
|
#define NAVMESHMODEL_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <Indoor/floorplan/v2/Floorplan.h>
|
||||||
|
#include <Indoor/navMesh/NavMesh.h>
|
||||||
|
#include <Indoor/navMesh/NavMeshFactory.h>
|
||||||
|
#include <Indoor/navMesh/NavMeshFactoryListener.h>
|
||||||
|
|
||||||
|
#include <QProgressDialog>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QProgressBar>
|
||||||
|
#include "QNavMeshSettings.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* used for 3D NavMesh rendering
|
||||||
|
*/
|
||||||
|
class NavMeshModel {
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
NM::NavMesh<NM::NavMeshTriangle> navMesh;
|
||||||
|
NM::NavMeshSettings settings;
|
||||||
|
Floorplan::IndoorMap* im;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
NavMeshModel() : navMesh() {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
NM::NavMesh<NM::NavMeshTriangle>* getNavMesh() {return &navMesh;}
|
||||||
|
|
||||||
|
|
||||||
|
class Listener : public NM::NavMeshFactoryListener {
|
||||||
|
|
||||||
|
private:
|
||||||
|
QDialog dlg;
|
||||||
|
QLabel* lbl1;
|
||||||
|
QProgressBar* bar1;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Listener() {
|
||||||
|
QVBoxLayout* lay = new QVBoxLayout(&dlg);
|
||||||
|
lbl1 = new QLabel(); lay->addWidget(lbl1);
|
||||||
|
bar1 = new QProgressBar(); lay->addWidget(bar1);
|
||||||
|
dlg.resize(350, 90);
|
||||||
|
dlg.setWindowTitle("NavMesh building");
|
||||||
|
dlg.show();
|
||||||
|
}
|
||||||
|
~Listener() {
|
||||||
|
dlg.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onNavMeshBuildUpdateMajor(const std::string& what) override {
|
||||||
|
lbl1->setText(what.c_str());
|
||||||
|
QApplication::processEvents();
|
||||||
|
}
|
||||||
|
void onNavMeshBuildUpdateMajor(const int cnt, const int cur) override {
|
||||||
|
bar1->setValue(cur*100/cnt);
|
||||||
|
QApplication::processEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
void rebuild(Floorplan::IndoorMap* im) {
|
||||||
|
|
||||||
|
Listener l;
|
||||||
|
|
||||||
|
QNavMeshSettings qs(&settings);
|
||||||
|
qs.exec();
|
||||||
|
|
||||||
|
if (qs.ok) {
|
||||||
|
NM::NavMeshFactory<NM::NavMeshTriangle> fac(&navMesh, settings);
|
||||||
|
fac.build(im, &l);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // NAVMESHMODEL_H
|
||||||
172
mapview/3DNavMesh/NavMeshRenderer.h
Normal file
172
mapview/3DNavMesh/NavMeshRenderer.h
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
#ifndef NAVMESHRENDERER_H
|
||||||
|
#define NAVMESHRENDERER_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <Indoor/navMesh/NavMesh.h>
|
||||||
|
#include <Indoor/navMesh/NavMeshTriangle.h>
|
||||||
|
#include <Indoor/navMesh/NavMeshType.h>
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QGLWidget>
|
||||||
|
|
||||||
|
//enum class GridRendererColorMode {
|
||||||
|
// SHOW_NODE_TYPE,
|
||||||
|
// SHOW_NODE_IMPORTANCE,
|
||||||
|
//};
|
||||||
|
|
||||||
|
class NavMeshRenderer {
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// settings
|
||||||
|
//GridRendererColorMode colorMode = GridRendererColorMode::SHOW_NODE_IMPORTANCE;
|
||||||
|
bool showEdges = false;
|
||||||
|
|
||||||
|
struct Color {
|
||||||
|
float r,g,b;
|
||||||
|
Color() : r(1), g(0), b(0) {;}
|
||||||
|
Color(float r, float g, float b) : r(r), g(g), b(b) {;}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** node color depending on the node's type. see ctor */
|
||||||
|
Color colors[200];
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/** ctor */
|
||||||
|
NavMeshRenderer() {
|
||||||
|
|
||||||
|
colors[GridNode::TYPE_FLOOR] = Color(0.4, 0.4, 0.4);
|
||||||
|
colors[GridNode::TYPE_STAIR] = Color(0,0,1);
|
||||||
|
colors[GridNode::TYPE_ELEVATOR] = Color(0,0,1);
|
||||||
|
colors[GridNode::TYPE_DOOR] = Color(0.0, 0.0, 0.0);
|
||||||
|
|
||||||
|
colors[GridNode::TYPE_OUTDOOR] = Color(0.0, 0.5, 0.0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// void setNodeColorMode(const GridRendererColorMode mode) {this->colorMode = mode;}
|
||||||
|
void setShowEdges(const bool show) {this->showEdges = show;}
|
||||||
|
|
||||||
|
|
||||||
|
/** render the given grid using GL commands */
|
||||||
|
void paintGL(NM::NavMesh<NM::NavMeshTriangle>* navMesh, QGLWidget* dst) {
|
||||||
|
|
||||||
|
if (navMesh == nullptr) {return;}
|
||||||
|
|
||||||
|
// QPainter qp;
|
||||||
|
// qp.begin(dst);
|
||||||
|
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
|
||||||
|
const float s = 2;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
glBegin(GL_TRIANGLES);
|
||||||
|
for (const NM::NavMeshTriangle* tria : *navMesh) {
|
||||||
|
|
||||||
|
// // get the color to use
|
||||||
|
// switch(colorMode) {
|
||||||
|
// case GridRendererColorMode::SHOW_NODE_TYPE: {
|
||||||
|
// const Color c = colors[n.getType()];
|
||||||
|
// glColor3f(c.r, c.g, c.b);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// case GridRendererColorMode::SHOW_NODE_IMPORTANCE: {
|
||||||
|
// const float xx = n.navImportance - 0.6;
|
||||||
|
// glColor3f(xx, xx, xx);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
switch (tria->getType()) {
|
||||||
|
case (int) NM::NavMeshType::FLOOR_INDOOR: glColor3f(0.8, 0.8, 0.8); break;
|
||||||
|
case (int) NM::NavMeshType::FLOOR_OUTDOOR: glColor3f(0.1, 0.8, 0.1); break;
|
||||||
|
case (int) NM::NavMeshType::DOOR: glColor3f(0.7, 0.7, 0.8); break;
|
||||||
|
case (int) NM::NavMeshType::STAIR_LEVELED: glColor3f(0.5, 0.5, 0.5); break;
|
||||||
|
case (int) NM::NavMeshType::STAIR_SKEWED: glColor3f(0.6, 0.6, 0.6); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
glVertex3f(tria->getP1().x, tria->getP1().z, tria->getP1().y);
|
||||||
|
glVertex3f(tria->getP2().x, tria->getP2().z, tria->getP2().y);
|
||||||
|
glVertex3f(tria->getP3().x, tria->getP3().z, tria->getP3().y);
|
||||||
|
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
|
||||||
|
glEnable(GL_MULTISAMPLE);
|
||||||
|
//glEnable(GL_LINE_SMOOTH);
|
||||||
|
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
//glColor3f(0.2,0.2,0.2);
|
||||||
|
for (const NM::NavMeshTriangle* tria : *navMesh) {
|
||||||
|
|
||||||
|
switch (tria->getType()) {
|
||||||
|
case (int) NM::NavMeshType::FLOOR_INDOOR: glColor3f(0.6, 0.6, 0.6); break;
|
||||||
|
case (int) NM::NavMeshType::FLOOR_OUTDOOR: glColor3f(0.0, 0.6, 0.0); break;
|
||||||
|
case (int) NM::NavMeshType::DOOR: glColor3f(0.5, 0.5, 0.6); break;
|
||||||
|
case (int) NM::NavMeshType::STAIR_LEVELED: glColor3f(0.4, 0.4, 0.4); break;
|
||||||
|
case (int) NM::NavMeshType::STAIR_SKEWED: glColor3f(0.4, 0.4, 0.4); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
glVertex3f(tria->getP1().x, tria->getP1().z+0.01, tria->getP1().y);
|
||||||
|
glVertex3f(tria->getP2().x, tria->getP2().z+0.01, tria->getP2().y);
|
||||||
|
|
||||||
|
glVertex3f(tria->getP2().x, tria->getP2().z+0.01, tria->getP2().y);
|
||||||
|
glVertex3f(tria->getP3().x, tria->getP3().z+0.01, tria->getP3().y);
|
||||||
|
|
||||||
|
glVertex3f(tria->getP3().x, tria->getP3().z+0.01, tria->getP3().y);
|
||||||
|
glVertex3f(tria->getP1().x, tria->getP1().z+0.01, tria->getP1().y);
|
||||||
|
|
||||||
|
// glBegin(GL_LINE_LOOP);
|
||||||
|
// glVertex3f(tria->getP1().x, tria->getP1().z+0.01, tria->getP1().y);
|
||||||
|
// glVertex3f(tria->getP2().x, tria->getP2().z+0.01, tria->getP2().y);
|
||||||
|
// glVertex3f(tria->getP3().x, tria->getP3().z+0.01, tria->getP3().y);
|
||||||
|
// glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
glEnd();
|
||||||
|
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
|
||||||
|
|
||||||
|
// qp.drawText(20,20, "sdfsdkflsdfjasfklsdklfsdklfsdf");
|
||||||
|
// qp.drawText(20,-20, "sdfsdkflsdfjasfklsdklfsdklfsdf");
|
||||||
|
// qp.drawText(0.5,0.5, "sdfsdkflsdfjasfklsdklfsdklfsdf");
|
||||||
|
// qp.end();
|
||||||
|
|
||||||
|
// renderText(1,1,1, "123");
|
||||||
|
|
||||||
|
const QString str1 = "Triangles: " + QString::number(navMesh->getNumTriangles());
|
||||||
|
const QString str2 = "Size: ~" + QString::number(navMesh->getNumTriangles() * sizeof(NM::NavMeshTriangle) / 1024) + " kB";
|
||||||
|
|
||||||
|
glColor3f(0.0, 0.0, 0.0);
|
||||||
|
dst->renderText(20,20, str1);
|
||||||
|
dst->renderText(20,35, str2);
|
||||||
|
|
||||||
|
// dst->renderText(0,0, "2342342342342423423423423423423432");
|
||||||
|
// dst->renderText(0.1, 0.1, 0.1, "lsdfsdfsdfsdfsdfsdfsdfol");
|
||||||
|
}
|
||||||
|
|
||||||
|
// std::vector<MyNode> lint() {
|
||||||
|
// std::vector<MyNode> vec;
|
||||||
|
// lintStair(vec);
|
||||||
|
// return vec;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void lintStair(std::vector<MyNode>& vec) {
|
||||||
|
// for (MyNode& n1 : *grid) {
|
||||||
|
// if (n1.getNumNeighbors() <= 5) { vec.push_back(n1);}
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // NAVMESHRENDERER_H
|
||||||
87
mapview/3DNavMesh/QNavMeshSettings.cpp
Normal file
87
mapview/3DNavMesh/QNavMeshSettings.cpp
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
#include "QNavMeshSettings.h"
|
||||||
|
|
||||||
|
#include <Indoor/navMesh/NavMeshSettings.h>
|
||||||
|
|
||||||
|
#include <QGridLayout>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QSlider>
|
||||||
|
#include <QSlider>
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
|
||||||
|
QNavMeshSettings::QNavMeshSettings(NM::NavMeshSettings* settings, QWidget* parent) : QDialog(parent) {
|
||||||
|
|
||||||
|
QGridLayout* lay = new QGridLayout(this);
|
||||||
|
this->setLayout(lay);
|
||||||
|
int row = 0;
|
||||||
|
|
||||||
|
this->setWindowTitle("NavMesh Settings");
|
||||||
|
this->setMinimumWidth(350);
|
||||||
|
|
||||||
|
// MAX QUALITY
|
||||||
|
{
|
||||||
|
lay->addWidget(new QLabel("smallest element"), row, 0);
|
||||||
|
QLabel* lblQuality = new QLabel("");
|
||||||
|
lay->addWidget(lblQuality, row, 2);
|
||||||
|
QSlider* sldQuality = new QSlider(Qt::Orientation::Horizontal); sldQuality->setMinimum(10); sldQuality->setMaximum(30);
|
||||||
|
connect(sldQuality, &QSlider::valueChanged, [settings, sldQuality, lblQuality] () {
|
||||||
|
settings->maxQuality_m = sldQuality->value() / 100.0f;
|
||||||
|
lblQuality->setText(QString("%1 m").arg(settings->maxQuality_m, 5, 'f', 2, 0));
|
||||||
|
});
|
||||||
|
sldQuality->setValue(settings->maxQuality_m * 100.0f);
|
||||||
|
lay->addWidget(sldQuality, row, 1);
|
||||||
|
++row;
|
||||||
|
}
|
||||||
|
|
||||||
|
// AGENT HEIGHT
|
||||||
|
{
|
||||||
|
lay->addWidget(new QLabel("agent height"), row, 0);
|
||||||
|
QLabel* lblHeight = new QLabel("");
|
||||||
|
lay->addWidget(lblHeight, row, 2);
|
||||||
|
QSlider* sldHeight = new QSlider(Qt::Orientation::Horizontal); sldHeight->setMinimum(10); sldHeight->setMaximum(200);
|
||||||
|
connect(sldHeight, &QSlider::valueChanged, [settings, sldHeight, lblHeight] () {
|
||||||
|
settings->agentHeight = sldHeight->value() / 100.0f;
|
||||||
|
lblHeight->setText(QString("%1 m").arg(settings->agentHeight, 5, 'f', 2, 0));
|
||||||
|
});
|
||||||
|
sldHeight->setValue(settings->agentHeight * 100.0f);
|
||||||
|
lay->addWidget(sldHeight, row, 1);
|
||||||
|
++row;
|
||||||
|
}
|
||||||
|
|
||||||
|
// AGENT RADIUS
|
||||||
|
{
|
||||||
|
lay->addWidget(new QLabel("agent radius"), row, 0);
|
||||||
|
QLabel* lblRadius = new QLabel("");
|
||||||
|
lay->addWidget(lblRadius, row, 2);
|
||||||
|
QSlider* sldRadius = new QSlider(Qt::Orientation::Horizontal); sldRadius->setMinimum(5); sldRadius->setMaximum(60);
|
||||||
|
connect(sldRadius, &QSlider::valueChanged, [settings, sldRadius, lblRadius] () {
|
||||||
|
settings->agentRadius = sldRadius->value() / 100.0f;
|
||||||
|
lblRadius->setText(QString("%1 m").arg(settings->agentRadius, 5, 'f', 2, 0));
|
||||||
|
});
|
||||||
|
sldRadius->setValue(settings->agentRadius * 100.0f);
|
||||||
|
lay->addWidget(sldRadius, row, 1);
|
||||||
|
++row;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// MAX EDGE LENGTH
|
||||||
|
{
|
||||||
|
lay->addWidget(new QLabel("max edge length"), row, 0);
|
||||||
|
QLabel* lblMaxEdgeLength = new QLabel("");
|
||||||
|
lay->addWidget(lblMaxEdgeLength, row, 2);
|
||||||
|
QSlider* sdlMaxEdgeLength = new QSlider(Qt::Orientation::Horizontal); sdlMaxEdgeLength->setMinimum(300); sdlMaxEdgeLength->setMaximum(2000);
|
||||||
|
connect(sdlMaxEdgeLength, &QSlider::valueChanged, [settings, sdlMaxEdgeLength, lblMaxEdgeLength] () {
|
||||||
|
settings->edgeMaxLen = sdlMaxEdgeLength->value() / 100.0f;
|
||||||
|
lblMaxEdgeLength->setText(QString("%1 m").arg(settings->edgeMaxLen, 5, 'f', 2, 0));
|
||||||
|
});
|
||||||
|
sdlMaxEdgeLength->setValue(settings->edgeMaxLen * 100.0f);
|
||||||
|
lay->addWidget(sdlMaxEdgeLength, row, 1);
|
||||||
|
++row;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDialogButtonBox* box = new QDialogButtonBox(QDialogButtonBox::StandardButton::Ok | QDialogButtonBox::StandardButton::Close);
|
||||||
|
lay->addWidget(box, row, 0, 1, 3);
|
||||||
|
|
||||||
|
connect(box, &QDialogButtonBox::accepted, [&] () {ok = true; close();});
|
||||||
|
connect(box, &QDialogButtonBox::rejected, [&] () {ok = false; close();});
|
||||||
|
|
||||||
|
}
|
||||||
24
mapview/3DNavMesh/QNavMeshSettings.h
Normal file
24
mapview/3DNavMesh/QNavMeshSettings.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#ifndef QNAVMESHSETTINGS_H
|
||||||
|
#define QNAVMESHSETTINGS_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
namespace NM {
|
||||||
|
class NavMeshSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
class QNavMeshSettings : public QDialog {
|
||||||
|
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
QNavMeshSettings(NM::NavMeshSettings* settings, QWidget* parent = nullptr);
|
||||||
|
|
||||||
|
bool ok = false;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // QNAVMESHSETTINGS_H
|
||||||
@@ -58,6 +58,11 @@ public:
|
|||||||
/** get the underlying model */
|
/** get the underlying model */
|
||||||
Floorplan::Floor& getFloor() {return *floor;}
|
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;}
|
std::string getLayerName() const override {return floor->name;}
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ public:
|
|||||||
bool isVisible() const {return visible;}
|
bool isVisible() const {return visible;}
|
||||||
|
|
||||||
/** make this layer visible */
|
/** make this layer visible */
|
||||||
void setVisible(const bool visible) {
|
virtual void setVisible(const bool visible) {
|
||||||
this->visible = visible;
|
this->visible = visible;
|
||||||
onVisibilityChanged(visible);
|
onVisibilityChanged(visible);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user