worked on 3D display
some ui changes refactoring new icons
This commit is contained in:
308
IndoorMap.pro
308
IndoorMap.pro
@@ -17,168 +17,164 @@ DEFINES += WITH_ASSERTIONS
|
||||
DEFINES += WITH_DEBUG_LOG
|
||||
|
||||
INCLUDEPATH += \
|
||||
../
|
||||
../
|
||||
|
||||
|
||||
|
||||
SOURCES += \
|
||||
lib/gpc/gpc.cpp \
|
||||
main.cpp \
|
||||
MainWindow.cpp \
|
||||
MainController.cpp \
|
||||
mapview/2D/tools/ToolSelector.cpp \
|
||||
mapview/2D/tools/Tool.cpp \
|
||||
params/ElementParamWidget.cpp \
|
||||
params/LayerParamWidget.cpp \
|
||||
params/ActionWidget.cpp \
|
||||
params/ToolBox.cpp \
|
||||
mapview/model/MapModel.cpp \
|
||||
tree/MapTreeModel.cpp \
|
||||
mapview/3D/MapView3D.cpp \
|
||||
params/StairBuilder.cpp \
|
||||
mapview/2D/tools/Tools.cpp \
|
||||
params/LayerTree.cpp \
|
||||
mapview/2D/tools/ToolMeasure.cpp \
|
||||
params/MetaEditWidget.cpp \
|
||||
params/MetaEditModel.cpp \
|
||||
mapview/2D/MapView2D.cpp \
|
||||
misc/LINTView.cpp \
|
||||
mapview/3DNavMesh/QNavMeshSettings.cpp \
|
||||
mapview/3D/misc/Cube.cpp \
|
||||
mapview/3D/misc/Shader.cpp \
|
||||
mapview/3D/misc/Window.cpp
|
||||
lib/gpc/gpc.cpp \
|
||||
main.cpp \
|
||||
MainWindow.cpp \
|
||||
MainController.cpp \
|
||||
mapview/2D/tools/ToolSelector.cpp \
|
||||
mapview/2D/tools/Tool.cpp \
|
||||
params/ElementParamWidget.cpp \
|
||||
params/LayerParamWidget.cpp \
|
||||
params/ActionWidget.cpp \
|
||||
params/ToolBox.cpp \
|
||||
mapview/model/MapModel.cpp \
|
||||
tree/MapTreeModel.cpp \
|
||||
mapview/3D/MapView3D.cpp \
|
||||
params/StairBuilder.cpp \
|
||||
mapview/2D/tools/Tools.cpp \
|
||||
params/LayerTree.cpp \
|
||||
mapview/2D/tools/ToolMeasure.cpp \
|
||||
params/MetaEditWidget.cpp \
|
||||
params/MetaEditModel.cpp \
|
||||
mapview/2D/MapView2D.cpp \
|
||||
misc/LINTView.cpp \
|
||||
mapview/3DNavMesh/QNavMeshSettings.cpp \
|
||||
mapview/3D/misc/Cube.cpp \
|
||||
mapview/3D/misc/Shader.cpp \
|
||||
mapview/3D/misc/Window.cpp \
|
||||
mapview/3D/misc/Outline.cpp \
|
||||
mapview/3D/misc/Handrail.cpp
|
||||
|
||||
|
||||
HEADERS += MainWindow.h \
|
||||
mapview/model/MapLayer.h \
|
||||
mapview/model/MapModel.h \
|
||||
tree/MapTreeModel.h \
|
||||
MainController.h \
|
||||
mapview/model/MapLayers.h \
|
||||
params/ElementParamWidget.h \
|
||||
params/LayerParamWidget.h \
|
||||
params/ActionWidget.h \
|
||||
params/ToolBoxWidget.h \
|
||||
UIHelper.h \
|
||||
mapview/model/MapModelElement.h \
|
||||
mapview/model/IHasAttributes.h \
|
||||
mapview/model/IHasMAC.h \
|
||||
mapview/model/IHasMaterial.h \
|
||||
mapview/model/IHasName.h \
|
||||
mapview/model/IHasObstacleType.h \
|
||||
mapview/model/IHasPosition3D.h \
|
||||
mapview/2D/MV2DElementFloorObstacleLine.h \
|
||||
mapview/2D/MV2DElement.h \
|
||||
mapview/2D/MV2DElementFloorOutlinePolygon.h \
|
||||
mapview/2D/MV2DElementBeacon.h \
|
||||
mapview/2D/MV2DElementAccessPoint.h \
|
||||
mapview/2D/MV2DElementFloorObstacleCircle.h \
|
||||
mapview/2D/MV2DElementFloorObstacleDoor.h \
|
||||
mapview/2D/MapViewElementHelper.h \
|
||||
mapview/2D/MV2DElementFloorUnderlay.h \
|
||||
mapview/2D/MV2DElementPOI.h \
|
||||
mapview/2D/MV2DElementStair.h \
|
||||
mapview/2D/tools/ToolMoveMap.h \
|
||||
mapview/2D/tools/Tools.h \
|
||||
mapview/2D/tools/ToolRuler.h \
|
||||
mapview/2D/tools/ToolMapZoom.h \
|
||||
mapview/2D/tools/ToolSelector.h \
|
||||
mapview/2D/tools/ToolMapGrid.h \
|
||||
mapview/2D/tools/Tool.h \
|
||||
mapview/model/MMFloorObstacleCircle.h \
|
||||
mapview/model/MMFloorObstacleLine.h \
|
||||
mapview/model/MMFloorOutlinePolygon.h \
|
||||
mapview/model/MMFloor.h \
|
||||
mapview/model/MMFloors.h \
|
||||
mapview/model/MMFloorObstacles.h \
|
||||
mapview/model/MMFloorOutline.h \
|
||||
mapview/model/MMRoot.h \
|
||||
mapview/model/MMFloorAccessPoint.h \
|
||||
mapview/model/MMFloorBeacon.h \
|
||||
mapview/model/MMFloorAccessPoints.h \
|
||||
mapview/model/MMFloorBeacons.h \
|
||||
mapview/model/IHasFile.h \
|
||||
mapview/model/MMFloorUnderlayImage.h \
|
||||
mapview/model/IHasParams.h \
|
||||
mapview/model/MMFloorUnderlays.h \
|
||||
mapview/model/MMFloorPOIs.h \
|
||||
mapview/model/MMFloorPOI.h \
|
||||
mapview/3D/MapView3D.h \
|
||||
mapview/3D/MV3DElement.h \
|
||||
mapview/3D/MV3DElementFloorObstacleWall.h \
|
||||
mapview/3D/MV3DElementFloorObstaclePillar.h \
|
||||
mapview/3D/MV3DElementAccessPoint.h \
|
||||
mapview/3D/misc/Cube.h \
|
||||
mapview/3D/MV3DElementFloorOutlinePolygon.h \
|
||||
mapview/3D/MV3DElementFloorOutline.h \
|
||||
mapview/3D/misc/Polygon.h \
|
||||
mapview/grid/MapView3DGrid.h \
|
||||
mapview/grid/MapModelGrid.h \
|
||||
mapview/3DGrid/GridModel.h \
|
||||
mapview/3DGrid/GridRenderer.h \
|
||||
mapview/3DGrid/MyNode.h \
|
||||
mapview/3D/MV3DElementStair.h \
|
||||
mapview/model/MMFloorStair.h \
|
||||
mapview/model/MMFloorStairs.h \
|
||||
params/StairBuilder.h \
|
||||
misc/GnuplotExport.h \
|
||||
exp.h \
|
||||
ray.h \
|
||||
mapview/model/MMFloorObstacleDoor.h \
|
||||
mapview/elements/MV2DElementFloorObstacleDoor.h \
|
||||
mapview/model/IHasDoorType.h \
|
||||
mapview/3D/MV3DElementFloorObstacleDoor.h \
|
||||
mapview/3D/misc/Plane.h \
|
||||
mapview/elements/HasMoveableNodes.h \
|
||||
mapview/2D/MapView2D.h \
|
||||
mapview/2D/Painter.h \
|
||||
mapview/2D/Scaler.h \
|
||||
mapview/2D/MV2DElementElevator.h \
|
||||
mapview/model/MMFloorElevators.h \
|
||||
mapview/model/MMFloorElevator.h \
|
||||
params/LayerTree.h \
|
||||
params/EditFields.h \
|
||||
mapview/2D/ClickDist.h \
|
||||
mapview/2D/tools/ToolMeasure.h \
|
||||
mapview/model/IHasEditableMeta.h \
|
||||
params/MetaEditWidget.h \
|
||||
params/MetaEditModel.h \
|
||||
mapview/model/MapLayerListener.h \
|
||||
mapview/model/MapModelListener.h \
|
||||
mapview/model/MMFloorOutlinePolygonCombined.h \
|
||||
mapview/model/MMFloorFingerprints.h \
|
||||
mapview/model/MMFloorFingerprintLocation.h \
|
||||
mapview/2D/MV2DElementFingerprintLocation.h \
|
||||
mapview/model/MapLayer.h \
|
||||
mapview/model/MapModel.h \
|
||||
tree/MapTreeModel.h \
|
||||
MainController.h \
|
||||
mapview/model/MapLayers.h \
|
||||
params/ElementParamWidget.h \
|
||||
params/LayerParamWidget.h \
|
||||
params/ActionWidget.h \
|
||||
params/ToolBoxWidget.h \
|
||||
UIHelper.h \
|
||||
mapview/model/MapModelElement.h \
|
||||
mapview/model/IHasAttributes.h \
|
||||
mapview/model/IHasMAC.h \
|
||||
mapview/model/IHasMaterial.h \
|
||||
mapview/model/IHasName.h \
|
||||
mapview/model/IHasObstacleType.h \
|
||||
mapview/model/IHasPosition3D.h \
|
||||
mapview/2D/MV2DElementFloorObstacleLine.h \
|
||||
mapview/2D/MV2DElement.h \
|
||||
mapview/2D/MV2DElementFloorOutlinePolygon.h \
|
||||
mapview/2D/MV2DElementBeacon.h \
|
||||
mapview/2D/MV2DElementAccessPoint.h \
|
||||
mapview/2D/MV2DElementFloorObstacleCircle.h \
|
||||
mapview/2D/MV2DElementFloorObstacleDoor.h \
|
||||
mapview/2D/MapViewElementHelper.h \
|
||||
mapview/2D/MV2DElementFloorUnderlay.h \
|
||||
mapview/2D/MV2DElementPOI.h \
|
||||
mapview/2D/MV2DElementStair.h \
|
||||
mapview/2D/tools/ToolMoveMap.h \
|
||||
mapview/2D/tools/Tools.h \
|
||||
mapview/2D/tools/ToolRuler.h \
|
||||
mapview/2D/tools/ToolMapZoom.h \
|
||||
mapview/2D/tools/ToolSelector.h \
|
||||
mapview/2D/tools/ToolMapGrid.h \
|
||||
mapview/2D/tools/Tool.h \
|
||||
mapview/model/MMFloorObstacleCircle.h \
|
||||
mapview/model/MMFloorObstacleLine.h \
|
||||
mapview/model/MMFloorOutlinePolygon.h \
|
||||
mapview/model/MMFloor.h \
|
||||
mapview/model/MMFloors.h \
|
||||
mapview/model/MMFloorObstacles.h \
|
||||
mapview/model/MMFloorOutline.h \
|
||||
mapview/model/MMRoot.h \
|
||||
mapview/model/MMFloorAccessPoint.h \
|
||||
mapview/model/MMFloorBeacon.h \
|
||||
mapview/model/MMFloorAccessPoints.h \
|
||||
mapview/model/MMFloorBeacons.h \
|
||||
mapview/model/IHasFile.h \
|
||||
mapview/model/MMFloorUnderlayImage.h \
|
||||
mapview/model/IHasParams.h \
|
||||
mapview/model/MMFloorUnderlays.h \
|
||||
mapview/model/MMFloorPOIs.h \
|
||||
mapview/model/MMFloorPOI.h \
|
||||
mapview/3D/MapView3D.h \
|
||||
mapview/3D/MV3DElement.h \
|
||||
mapview/3D/MV3DElementFloorObstacleWall.h \
|
||||
mapview/3D/MV3DElementFloorObstaclePillar.h \
|
||||
mapview/3D/MV3DElementAccessPoint.h \
|
||||
mapview/3D/misc/Cube.h \
|
||||
mapview/3D/MV3DElementFloorOutlinePolygon.h \
|
||||
mapview/3D/MV3DElementFloorOutline.h \
|
||||
mapview/3D/misc/Polygon.h \
|
||||
mapview/3DGrid/GridModel.h \
|
||||
mapview/3DGrid/GridRenderer.h \
|
||||
mapview/3DGrid/MyNode.h \
|
||||
mapview/3D/MV3DElementStair.h \
|
||||
mapview/model/MMFloorStair.h \
|
||||
mapview/model/MMFloorStairs.h \
|
||||
params/StairBuilder.h \
|
||||
misc/GnuplotExport.h \
|
||||
mapview/model/MMFloorObstacleDoor.h \
|
||||
mapview/model/IHasDoorType.h \
|
||||
mapview/3D/MV3DElementFloorObstacleDoor.h \
|
||||
mapview/3D/misc/Plane.h \ mapview/2D/MapView2D.h \
|
||||
mapview/2D/Painter.h \
|
||||
mapview/2D/Scaler.h \
|
||||
mapview/2D/MV2DElementElevator.h \
|
||||
mapview/model/MMFloorElevators.h \
|
||||
mapview/model/MMFloorElevator.h \
|
||||
params/LayerTree.h \
|
||||
params/EditFields.h \
|
||||
mapview/2D/ClickDist.h \
|
||||
mapview/2D/tools/ToolMeasure.h \
|
||||
mapview/model/IHasEditableMeta.h \
|
||||
params/MetaEditWidget.h \
|
||||
params/MetaEditModel.h \
|
||||
mapview/model/MapLayerListener.h \
|
||||
mapview/model/MapModelListener.h \
|
||||
mapview/model/MMFloorOutlinePolygonCombined.h \
|
||||
mapview/model/MMFloorFingerprints.h \
|
||||
mapview/model/MMFloorFingerprintLocation.h \
|
||||
mapview/2D/MV2DElementFingerprintLocation.h \
|
||||
mapview/3D/MV3DElementFingerprintLocation.h \
|
||||
mapview/model/MMFloorGroundTruthPoints.h \
|
||||
mapview/model/MMFloorGroundTruthPoint.h \
|
||||
mapview/2D/MV2DElementGroundTruthPoint.h \
|
||||
misc/LINTView.h \
|
||||
mapview/2D/tools/ToolNewElement.h \
|
||||
mapview/2D/tools/ToolNewDoor.h \
|
||||
mapview/2D/tools/ToolNewWall.h \
|
||||
mapview/2D/tools/ToolNewStair.h \
|
||||
mapview/2D/tools/ToolNewElevator.h \
|
||||
mapview/2D/tools/ToolNewOutline.h \
|
||||
mapview/model/MMRegistration.h \
|
||||
mapview/model/MMRegistrationPoint.h \
|
||||
mapview/2D/MV2DElementRegistrationPoint.h \
|
||||
mapview/3D/MV3DElementRegistrationPoint.h \
|
||||
mapview/2D/tools/ToolNewFingerprint.h \
|
||||
mapview/2D/tools/ToolNewAccessPoint.h \
|
||||
mapview/2D/tools/ToolNewBeacon.h \
|
||||
mapview/2D/tools/ToolNewGroundTruth.h \
|
||||
mapview/2D/tools/ToolNewPOI.h \
|
||||
mapview/3D/MV3DElementElevator.h \
|
||||
mapview/3DNavMesh/NavMeshView.h \
|
||||
mapview/3DNavMesh/NavMeshRenderer.h \
|
||||
mapview/3DNavMesh/NavMeshModel.h \
|
||||
mapview/3DNavMesh/QNavMeshSettings.h \
|
||||
fixC11.h \
|
||||
mapview/3D/misc/Shader.h \
|
||||
mapview/3D/misc/Camera.h \
|
||||
mapview/3D/misc/Renderable3D.h \
|
||||
mapview/3D/misc/Window.h
|
||||
mapview/model/MMFloorGroundTruthPoints.h \
|
||||
mapview/model/MMFloorGroundTruthPoint.h \
|
||||
mapview/2D/MV2DElementGroundTruthPoint.h \
|
||||
misc/LINTView.h \
|
||||
mapview/2D/tools/ToolNewElement.h \
|
||||
mapview/2D/tools/ToolNewDoor.h \
|
||||
mapview/2D/tools/ToolNewWall.h \
|
||||
mapview/2D/tools/ToolNewStair.h \
|
||||
mapview/2D/tools/ToolNewElevator.h \
|
||||
mapview/2D/tools/ToolNewOutline.h \
|
||||
mapview/model/MMRegistration.h \
|
||||
mapview/model/MMRegistrationPoint.h \
|
||||
mapview/2D/MV2DElementRegistrationPoint.h \
|
||||
mapview/3D/MV3DElementRegistrationPoint.h \
|
||||
mapview/2D/tools/ToolNewFingerprint.h \
|
||||
mapview/2D/tools/ToolNewAccessPoint.h \
|
||||
mapview/2D/tools/ToolNewBeacon.h \
|
||||
mapview/2D/tools/ToolNewGroundTruth.h \
|
||||
mapview/2D/tools/ToolNewPOI.h \
|
||||
mapview/3D/MV3DElementElevator.h \
|
||||
mapview/3DNavMesh/NavMeshRenderer.h \
|
||||
mapview/3DNavMesh/NavMeshModel.h \
|
||||
mapview/3DNavMesh/QNavMeshSettings.h \
|
||||
fixC11.h \
|
||||
mapview/3D/misc/Shader.h \
|
||||
mapview/3D/misc/Camera.h \
|
||||
mapview/3D/misc/Renderable3D.h \
|
||||
mapview/3D/misc/Window.h \
|
||||
mapview/3D/misc/Outline.h \
|
||||
mapview/3D/misc/Handrail.h
|
||||
|
||||
|
||||
FORMS += MainWindow.ui
|
||||
@@ -188,8 +184,8 @@ SOURCES += \
|
||||
../Indoor/lib/Recast/*.cpp
|
||||
|
||||
RESOURCES += \
|
||||
res.qrc
|
||||
res.qrc
|
||||
|
||||
DISTFILES += \
|
||||
res/icons/polygon.svg
|
||||
res/icons/polygon.svg
|
||||
|
||||
|
||||
@@ -93,6 +93,10 @@ MainController::MainController() {
|
||||
connect(mw, SIGNAL(onShow3DGrid(bool)), this, SLOT(onSetShow3DGrid(bool)));
|
||||
connect(mw, SIGNAL(onShow3DNavMesh(bool)), this, SLOT(onSetShow3DNavMesh(bool)));
|
||||
|
||||
connect(mapView3D, SIGNAL(onShow3DFloorplan(bool)), this, SLOT(onSetShow3DFloorplan(bool)));
|
||||
connect(mapView3D, SIGNAL(onShow3DGrid(bool)), this, SLOT(onSetShow3DGrid(bool)));
|
||||
connect(mapView3D, SIGNAL(onShow3DNavMesh(bool)), this, SLOT(onSetShow3DNavMesh(bool)));
|
||||
|
||||
// 3D grid view config
|
||||
connect(mw, &MainWindow::onGridNodeColorImp, [&] () {mw->getMapView3D()->getGridRenderer()->setNodeColorMode(GridRendererColorMode::SHOW_NODE_IMPORTANCE);} );
|
||||
connect(mw, &MainWindow::onGridNodeColorType, [&] () {mw->getMapView3D()->getGridRenderer()->setNodeColorMode(GridRendererColorMode::SHOW_NODE_TYPE);} );
|
||||
@@ -104,8 +108,8 @@ MainController::MainController() {
|
||||
//mapModel->load("/apps/map24b.xml");
|
||||
//mapModel->load("/apps/SHL41.xml");
|
||||
|
||||
//mapModel->load("/mnt/vm/paper/diss/data/maps/SHL41_nm.xml");
|
||||
mapModel->load("/apps/paper/diss/data/maps/SHL41_nm.xml");
|
||||
mapModel->load("/mnt/vm/paper/diss/data/maps/SHL41_nm.xml");
|
||||
//mapModel->load("/apps/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_issue6.xml");
|
||||
@@ -117,7 +121,7 @@ MainController::MainController() {
|
||||
//mapModel->load("../IndoorMap/maps/APs.xml");
|
||||
|
||||
//mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/CAR/CAR9.xml");
|
||||
//mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/UAH/UAH9.xml");
|
||||
//mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/UAH/UAH9.xml");
|
||||
//mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/UJI-TI/UJI-TI4.xml");
|
||||
//mapModel->load("/mnt/data/workspaces/IPIN2016/IPIN2016/competition/maps/UJI-UB/UJI-UB4.xml");
|
||||
//mapModel->load("/mnt/data/workspaces/Indoor/tests/data/WalkHeadingMap.xml");
|
||||
@@ -128,26 +132,26 @@ MainController::MainController() {
|
||||
}
|
||||
|
||||
void MainController::onLayerChanged(MapLayer* layer) {
|
||||
(void) layer;
|
||||
mw->getMapView2D()->update();
|
||||
mw->getMapView3D()->update();
|
||||
(void) layer;
|
||||
mw->getMapView2D()->update();
|
||||
mw->getMapView3D()->update();
|
||||
mw->getLINT()->update(mapModel->getMap());
|
||||
}
|
||||
|
||||
void MainController::onLayerElementAdded(MapLayer* layer, MapModelElement* elem) {
|
||||
(void) layer;
|
||||
mapSelector->focus(mw->getMapView2D(), elem);
|
||||
(void) layer;
|
||||
mapSelector->focus(mw->getMapView2D(), elem);
|
||||
mw->getLINT()->update(mapModel->getMap());
|
||||
}
|
||||
|
||||
void MainController::onLayerElementRemoved(MapLayer* layer, const MapModelElement* elem) {
|
||||
(void) layer;
|
||||
(void) elem;
|
||||
(void) layer;
|
||||
(void) elem;
|
||||
}
|
||||
|
||||
void MainController::onLayerVisibilityChanged(MapLayer *layer, const bool visible) {
|
||||
(void) layer;
|
||||
(void) visible;
|
||||
(void) layer;
|
||||
(void) visible;
|
||||
}
|
||||
|
||||
void MainController::onSetShow3DFloorplan(bool show) {
|
||||
@@ -163,40 +167,40 @@ void MainController::onSetShow3DNavMesh(bool show) {
|
||||
}
|
||||
|
||||
void MainController::layerSelected(QModelIndex idx) {
|
||||
mw->getMapView2D()->layerChange();
|
||||
MapLayer* ml = static_cast<MapLayer*>(idx.internalPointer());
|
||||
mapModel->setSelectedLayer(ml);
|
||||
mw->getMapView2D()->layerChange();
|
||||
mw->getMapView3D()->layerChange();
|
||||
mw->getLayerParamWidget()->setElement(ml);
|
||||
mw->getToolBoxWidget()->setSelectedLayer(ml);
|
||||
mw->getMapView2D()->layerChange();
|
||||
MapLayer* ml = static_cast<MapLayer*>(idx.internalPointer());
|
||||
mapModel->setSelectedLayer(ml);
|
||||
mw->getMapView2D()->layerChange();
|
||||
mw->getMapView3D()->layerChange();
|
||||
mw->getLayerParamWidget()->setElement(ml);
|
||||
mw->getToolBoxWidget()->setSelectedLayer(ml);
|
||||
mw->getLINT()->update(mapModel->getMap());
|
||||
}
|
||||
void MainController::curMapElementChanged() {
|
||||
mw->getElementParamWidget()->refresh();
|
||||
mw->getElementParamWidget()->refresh();
|
||||
mw->getLINT()->update(mapModel->getMap());
|
||||
}
|
||||
|
||||
void MainController::mapElementSelected(MapModelElement* el) {
|
||||
mw->getElementParamWidget()->setElement(el);
|
||||
mw->getElementParamWidget()->setElement(el);
|
||||
mw->getLINT()->update(mapModel->getMap());
|
||||
}
|
||||
|
||||
void MainController::onMapModelAboutToReset() {
|
||||
mw->getLayerParamWidget()->setElement(nullptr);
|
||||
mw->getToolBoxWidget()->setSelectedLayer(nullptr);
|
||||
mw->getMapView2D()->update();
|
||||
mw->getLayerParamWidget()->setElement(nullptr);
|
||||
mw->getToolBoxWidget()->setSelectedLayer(nullptr);
|
||||
mw->getMapView2D()->update();
|
||||
mw->getMapView3D()->update();
|
||||
//mw->getToolBoxWidget()->
|
||||
}
|
||||
|
||||
void MainController::onMapModelNeedsRepaint() {
|
||||
mw->getMapView2D()->update();
|
||||
mw->getMapView2D()->update();
|
||||
mw->getLINT()->update(mapModel->getMap());
|
||||
}
|
||||
|
||||
void MainController::onMapModelReset() {
|
||||
mw->getTree()->expandAll();
|
||||
mw->getTree()->expandAll();
|
||||
mw->getLINT()->update(mapModel->getMap());
|
||||
}
|
||||
|
||||
@@ -209,16 +213,16 @@ void MainController::onNew() {
|
||||
}
|
||||
|
||||
void MainController::onLoad() {
|
||||
QString file = QFileDialog::getOpenFileName(mw, "open a map");
|
||||
if (file != "") {
|
||||
mapModel->load(file.toStdString());
|
||||
QString file = QFileDialog::getOpenFileName(mw, "open a map");
|
||||
if (file != "") {
|
||||
mapModel->load(file.toStdString());
|
||||
mw->getLINT()->update(mapModel->getMap());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainController::onSave() {
|
||||
QString file = QFileDialog::getSaveFileName(mw, "save the map");
|
||||
if (file != "") {
|
||||
mapModel->save(file.toStdString());
|
||||
}
|
||||
QString file = QFileDialog::getSaveFileName(mw, "save the map");
|
||||
if (file != "") {
|
||||
mapModel->save(file.toStdString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,47 +17,6 @@
|
||||
<layout class="QGridLayout" name="gridLayout_2"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusBar"/>
|
||||
<widget class="QMenuBar" name="menuBar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>777</width>
|
||||
<height>30</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuView">
|
||||
<property name="title">
|
||||
<string>&View</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menu3D">
|
||||
<property name="title">
|
||||
<string>&3D</string>
|
||||
</property>
|
||||
<addaction name="actShow3DFloorplan"/>
|
||||
<addaction name="actShow3DGrid"/>
|
||||
<addaction name="actShow3DNavMesh"/>
|
||||
</widget>
|
||||
<addaction name="actShow2D"/>
|
||||
<addaction name="menu3D"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuGridf">
|
||||
<property name="title">
|
||||
<string>&Grid</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuNode_color">
|
||||
<property name="title">
|
||||
<string>&node color</string>
|
||||
</property>
|
||||
<addaction name="actGridNodeColorType"/>
|
||||
<addaction name="actGridNodeColorImportance"/>
|
||||
</widget>
|
||||
<addaction name="actGridShowEdges"/>
|
||||
<addaction name="menuNode_color"/>
|
||||
</widget>
|
||||
<addaction name="menuView"/>
|
||||
<addaction name="menuGridf"/>
|
||||
</widget>
|
||||
<action name="actShow2D">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
|
||||
@@ -6,11 +6,10 @@
|
||||
|
||||
#include "misc/Cube.h"
|
||||
#include "misc/Window.h"
|
||||
#include "misc/Handrail.h"
|
||||
|
||||
#include "MV3DElement.h"
|
||||
|
||||
|
||||
|
||||
class MV3DElementFloorObstacleWall : public MV3DElement {
|
||||
|
||||
Floorplan::Floor* f;
|
||||
@@ -52,9 +51,10 @@ protected:
|
||||
const Point3 pos(cen2.x, cen2.y, atHeight + height/2);
|
||||
|
||||
// div by 2.01 to prevent overlapps and z-fi
|
||||
const float sx = from.getDistance(to) / 2.02f;
|
||||
const float sy = thickness_m / 2.02f;
|
||||
const float sz = height / 2.02f; // prevent overlaps
|
||||
const float div = 2.015f; // prevent overlaps
|
||||
const float sx = from.getDistance(to) / div;
|
||||
const float sy = thickness_m / div;
|
||||
const float sz = height / div;
|
||||
const Point3 size(sx, sy, sz);
|
||||
const Point3 rot(0,0,deg);
|
||||
|
||||
@@ -72,71 +72,6 @@ protected:
|
||||
|
||||
};
|
||||
|
||||
struct Handrail : public Renderable3D {
|
||||
|
||||
Point2 from;
|
||||
Point2 to;
|
||||
float atHeight;
|
||||
float height;
|
||||
|
||||
Handrail(const Point2 from, const Point2 to, float atHeight, float height) :
|
||||
from(from), to(to), atHeight(atHeight), height(height) {;}
|
||||
|
||||
void render(const RenderSettings& rs) override {
|
||||
|
||||
float y1 = atHeight;
|
||||
float y2 = atHeight + height;
|
||||
|
||||
// polygon edges
|
||||
Point3 p1 = Point3(from.x, y1, from.y);
|
||||
Point3 p2 = Point3(to.x, y1, to.y);
|
||||
|
||||
Point3 p3 = Point3(from.x, y2, from.y);
|
||||
Point3 p4 = Point3(to.x, y2, to.y);
|
||||
|
||||
/*
|
||||
|
||||
TODO_GL
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
glBegin(GL_LINES);
|
||||
|
||||
glColor3f(0.9, 0.9, 0.9);
|
||||
|
||||
// top
|
||||
glVertex3f(p3.x, p3.y, p3.z);
|
||||
glVertex3f(p4.x, p4.y, p4.z);
|
||||
|
||||
// start bar
|
||||
glVertex3f(p1.x, p1.y, p1.z);
|
||||
glVertex3f(p3.x, p3.y, p3.z);
|
||||
|
||||
// end bar
|
||||
glVertex3f(p2.x, p2.y, p2.z);
|
||||
glVertex3f(p4.x, p4.y, p4.z);
|
||||
|
||||
glColor3f(0.6, 0.6, 0.6);
|
||||
|
||||
// intermediate bars
|
||||
const Point3 d1 = p2-p1;
|
||||
const Point3 d2 = p4-p3;
|
||||
const int numBars = d2.length() / 1;
|
||||
for (int i = 1; i < numBars; ++i) {
|
||||
const Point3 s = p1 + d1 * i / numBars;
|
||||
const Point3 e = p3 + d2 * i / numBars;
|
||||
glVertex3f(s.x, s.y, s.z);
|
||||
glVertex3f(e.x, e.y, e.z);
|
||||
}
|
||||
|
||||
glEnd();
|
||||
glEnable(GL_LIGHTING);
|
||||
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/** repaint me */
|
||||
void render(const RenderSettings& rs) override {
|
||||
|
||||
|
||||
@@ -8,114 +8,44 @@
|
||||
|
||||
#include "../../lib/gpc/gpc.h"
|
||||
#include "misc/Polygon.h"
|
||||
|
||||
#include "misc/Shader.h"
|
||||
#include "misc/Outline.h"
|
||||
|
||||
class MV3DElementFloorOutline : public MV3DElement {
|
||||
|
||||
Floorplan::Floor* f;
|
||||
Floorplan::FloorOutline* out;
|
||||
|
||||
struct ToRender {
|
||||
struct Temp {
|
||||
Point2 cacheSum;
|
||||
Polygon* pol = nullptr;
|
||||
std::vector<std::vector<Point3>> trias;
|
||||
};
|
||||
|
||||
std::unordered_map<std::string, ToRender*> elements;
|
||||
Temp tempIndoor;
|
||||
Temp tempOutdoor;
|
||||
|
||||
Outline outlineIndoor;
|
||||
Outline outlineOutdoor;
|
||||
|
||||
public:
|
||||
|
||||
/** ctor */
|
||||
MV3DElementFloorOutline(Floorplan::Floor* f, Floorplan::FloorOutline* out) : f(f), out(out) {
|
||||
;
|
||||
|
||||
outlineOutdoor.setColor(0.0, 0.5, 0.0);
|
||||
outlineIndoor.setColor(0.2, 0.2, 0.2);
|
||||
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** repaint me */
|
||||
void render(const RenderSettings& rs) override {
|
||||
|
||||
rebuildIfNeeded();
|
||||
|
||||
rs.shader->bind();
|
||||
|
||||
glDisable(GL_CULL_FACE);
|
||||
|
||||
QMatrix4x4 mat;
|
||||
rs.shader->setModelMatrix(mat);
|
||||
|
||||
for (auto& it : elements) {
|
||||
|
||||
//Polygon& pol = it.second->pol;
|
||||
std::vector<std::vector<Point3>>& trias = it.second->trias;
|
||||
|
||||
if (it.first == "outdoor") {
|
||||
rs.shader->setColor(0.0, 0.5, 0.0);
|
||||
} else {
|
||||
rs.shader->setColor(0.2, 0.2, 0.2);
|
||||
}
|
||||
|
||||
std::vector<float> values;
|
||||
std::vector<float> normals;
|
||||
|
||||
for (const std::vector<Point3>& tria : trias) {
|
||||
for (int i = 2; i < tria.size(); ++i) {
|
||||
|
||||
const Point3 p1 = tria[i-2];
|
||||
const Point3 p2 = tria[i-1];
|
||||
const Point3 p3 = tria[i-0];
|
||||
|
||||
values.push_back(p1.x); values.push_back(p1.y); values.push_back(p1.z);
|
||||
values.push_back(p2.x); values.push_back(p2.y); values.push_back(p2.z);
|
||||
values.push_back(p3.x); values.push_back(p3.y); values.push_back(p3.z);
|
||||
|
||||
normals.push_back(0); normals.push_back(1); normals.push_back(0);
|
||||
normals.push_back(0); normals.push_back(1); normals.push_back(0);
|
||||
normals.push_back(0); normals.push_back(1); normals.push_back(0);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
rs.shader->setVertices(values.data());
|
||||
rs.shader->setNormals(normals.data());
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, values.size() / 3);
|
||||
rs.shader->unsetVertices();
|
||||
rs.shader->unsetNormals();
|
||||
|
||||
/*
|
||||
|
||||
TODO_GL
|
||||
|
||||
if (it.first == "outdoor") {
|
||||
glColor3f(0.0, 0.5, 0.0);
|
||||
} else {
|
||||
glColor3f(0.2, 0.2, 0.2);
|
||||
}
|
||||
|
||||
glDisable(GL_CULL_FACE);
|
||||
for (const std::vector<Point3>& tria : trias) {
|
||||
glNormal3f(0, 1, 0);
|
||||
glBegin(GL_TRIANGLE_STRIP);
|
||||
for (const Point3& p3 : tria) {
|
||||
glVertex3f(p3.x, p3.z, p3.y);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
glEnable(GL_CULL_FACE);
|
||||
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
glEnable(GL_CULL_FACE);
|
||||
|
||||
rs.shader->release();
|
||||
outlineIndoor.render(rs);
|
||||
outlineOutdoor.render(rs);
|
||||
|
||||
}
|
||||
|
||||
@@ -124,17 +54,12 @@ protected:
|
||||
auto filterIndoor = [] (const Floorplan::FloorOutlinePolygon* p) {return p->outdoor == false;};
|
||||
auto filterOutdoor = [] (const Floorplan::FloorOutlinePolygon* p) {return p->outdoor == true;};
|
||||
|
||||
if (elements.empty()) {
|
||||
elements["indoor"] = new ToRender();
|
||||
elements["outdoor"] = new ToRender();
|
||||
}
|
||||
|
||||
rebuildIfNeeded(filterIndoor, elements["indoor"]);
|
||||
rebuildIfNeeded(filterOutdoor, elements["outdoor"]);
|
||||
rebuildIfNeeded(filterIndoor, outlineIndoor, tempIndoor);
|
||||
rebuildIfNeeded(filterOutdoor, outlineOutdoor, tempOutdoor);
|
||||
|
||||
}
|
||||
|
||||
template <typename Filter> void rebuildIfNeeded(Filter include, ToRender* dst) {
|
||||
template <typename Filter> void rebuildIfNeeded(Filter include, Outline& dst, Temp& tmp) {
|
||||
|
||||
const std::vector<Floorplan::FloorOutlinePolygon*>& polys = *out;
|
||||
|
||||
@@ -148,25 +73,28 @@ protected:
|
||||
}
|
||||
|
||||
// already up to date?
|
||||
if (cacheSum == dst->cacheSum) {return;}
|
||||
dst->cacheSum = cacheSum;
|
||||
if (cacheSum == tmp.cacheSum) {return;}
|
||||
tmp.cacheSum = cacheSum;
|
||||
|
||||
// rebuild
|
||||
std::vector<gpc_polygon> add;
|
||||
std::vector<gpc_polygon> rem;
|
||||
if (dst->pol) {delete dst->pol;}
|
||||
dst->pol = new Polygon();
|
||||
if (tmp.pol) {delete tmp.pol;}
|
||||
tmp.pol = new Polygon();
|
||||
|
||||
for (Floorplan::FloorOutlinePolygon* poly : polys) {
|
||||
if (!include(poly)) {continue;}
|
||||
switch (poly->method) {
|
||||
case Floorplan::OutlineMethod::ADD: dst->pol->add(poly->poly); break;
|
||||
case Floorplan::OutlineMethod::REMOVE: dst->pol->remove(poly->poly); break;
|
||||
case Floorplan::OutlineMethod::ADD: tmp.pol->add(poly->poly); break;
|
||||
case Floorplan::OutlineMethod::REMOVE: tmp.pol->remove(poly->poly); break;
|
||||
default: throw 1;
|
||||
}
|
||||
}
|
||||
|
||||
dst->trias = dst->pol->get(f->atHeight);
|
||||
//dst->trias = dst->pol->get(f->atHeight);
|
||||
std::vector<std::vector<Point3>> trias = tmp.pol->get(f->atHeight);
|
||||
dst.clear();
|
||||
dst.add(trias);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "misc/Cube.h"
|
||||
#include "MV3DElement.h"
|
||||
#include "misc/Shader.h"
|
||||
|
||||
class MV3DElementStair : public MV3DElement {
|
||||
|
||||
@@ -24,7 +25,54 @@ protected:
|
||||
/** repaint me */
|
||||
void render(const RenderSettings& rs) override {
|
||||
|
||||
glDisable(GL_CULL_FACE);
|
||||
//glDisable(GL_CULL_FACE);
|
||||
|
||||
|
||||
std::vector<float> vertices;
|
||||
std::vector<float> normals;
|
||||
|
||||
const std::vector<Floorplan::StairPart> parts = stair->getParts();
|
||||
const std::vector<Floorplan::Quad3> quads = Floorplan::getQuads(parts, floor);
|
||||
|
||||
for (int i = 0; i < (int) parts.size(); ++i) {
|
||||
|
||||
//const Floorplan::StairPart& part = parts[i];
|
||||
const Floorplan::Quad3& quad = quads[i];
|
||||
|
||||
//const Floorplan::Quad3 quad = part.getQuad(floor);
|
||||
const Point3 p1 = quad.p2-quad.p1;
|
||||
const Point3 p2 = quad.p4-quad.p1;
|
||||
|
||||
Point3 n = Math::normal(p1,p2);
|
||||
if (n.z < 0) {n = -n;}
|
||||
|
||||
vertices.insert(vertices.end(), {quad.p1.x, quad.p1.y, quad.p1.z});
|
||||
vertices.insert(vertices.end(), {quad.p2.x, quad.p2.y, quad.p2.z});
|
||||
vertices.insert(vertices.end(), {quad.p3.x, quad.p3.y, quad.p3.z});
|
||||
|
||||
vertices.insert(vertices.end(), {quad.p3.x, quad.p3.y, quad.p3.z});
|
||||
vertices.insert(vertices.end(), {quad.p4.x, quad.p4.y, quad.p4.z});
|
||||
vertices.insert(vertices.end(), {quad.p1.x, quad.p1.y, quad.p1.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});
|
||||
|
||||
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});
|
||||
|
||||
}
|
||||
|
||||
rs.shader->bind();
|
||||
rs.shader->setModelMatrix(QMatrix4x4());
|
||||
rs.shader->setColor(1.0, 0.55, 0.55);
|
||||
rs.shader->setVertices(vertices.data());
|
||||
rs.shader->setNormals(normals.data());
|
||||
glDrawArrays(GL_TRIANGLES, 0, vertices.size()/3);
|
||||
rs.shader->unsetVertices();
|
||||
rs.shader->unsetNormals();
|
||||
rs.shader->release();
|
||||
|
||||
/*
|
||||
TODO_GL
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include "../3DNavMesh/NavMeshModel.h"
|
||||
#include "../3DNavMesh/NavMeshRenderer.h"
|
||||
|
||||
#include <QPushButton>
|
||||
|
||||
MapView3D::MapView3D(QWidget *parent) : QOpenGLWidget(parent) {
|
||||
|
||||
rot.x = 0;
|
||||
@@ -21,12 +23,51 @@ MapView3D::MapView3D(QWidget *parent) : QOpenGLWidget(parent) {
|
||||
center.y = 0;
|
||||
center.z = 0;
|
||||
|
||||
scale.x = 0.05f;
|
||||
scale.y = 0.05f;
|
||||
scale.z = 0.05f;
|
||||
scale.x = 1.0f;
|
||||
scale.y = 1.0f;
|
||||
scale.z = 1.0f;
|
||||
|
||||
gridRenderer = new GridRenderer();
|
||||
|
||||
QString style = "QPushButton:checked{\
|
||||
background-color: rgb(200, 200, 230);\
|
||||
border: none; \
|
||||
}";
|
||||
|
||||
QPushButton* btnFloorplan = new QPushButton(UIHelper::getIcon("floorplan"), "", this);
|
||||
btnFloorplan->setGeometry(16, 16, 32, 32);
|
||||
btnFloorplan->setCheckable(true);
|
||||
btnFloorplan->setChecked(true);
|
||||
btnFloorplan->setStyleSheet(style);
|
||||
connect(btnFloorplan, &QPushButton::toggled, [btnFloorplan,this] () {
|
||||
emit onShow3DFloorplan(btnFloorplan->isChecked());
|
||||
});
|
||||
|
||||
QPushButton* btnPerspective = new QPushButton(UIHelper::getIcon("perspective"), "", this);
|
||||
btnPerspective->setGeometry(16, 16+8+32, 32, 32);
|
||||
connect(btnPerspective, &QPushButton::clicked, [this] () {
|
||||
usePerspectiveProjection = !usePerspectiveProjection;
|
||||
emit update();
|
||||
});
|
||||
|
||||
QPushButton* btnGrid = new QPushButton(UIHelper::getIcon("grid"), "", this);
|
||||
btnGrid->setCheckable(true);
|
||||
btnGrid->setChecked(false);
|
||||
btnGrid->setGeometry(16+16+32, 16, 32, 32);
|
||||
btnGrid->setStyleSheet(style);
|
||||
connect(btnGrid, &QPushButton::toggled, [btnGrid, this] () {
|
||||
emit onShow3DGrid(btnGrid->isChecked());
|
||||
});
|
||||
|
||||
QPushButton* btnNavMesh = new QPushButton(UIHelper::getIcon("mesh"), "", this);
|
||||
btnNavMesh->setCheckable(true);
|
||||
btnNavMesh->setChecked(false);
|
||||
btnNavMesh->setGeometry(16+16+32+16+32, 16, 32, 32);
|
||||
btnNavMesh->setStyleSheet(style);
|
||||
connect(btnNavMesh, &QPushButton::toggled, [btnNavMesh, this] () {
|
||||
emit onShow3DNavMesh(btnNavMesh->isChecked());
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -36,53 +77,13 @@ void MapView3D::initializeGL() {
|
||||
|
||||
QOpenGLWidget::initializeGL();
|
||||
|
||||
glCullFace(GL_FRONT);
|
||||
// this should be the default!!
|
||||
glCullFace(GL_BACK);
|
||||
glFrontFace(GL_CCW);
|
||||
//glDisable(GL_CULL_FACE);
|
||||
glEnable(GL_CULL_FACE);
|
||||
|
||||
// culling, lighting, depth-test, ...
|
||||
// additional settings
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
//glShadeModel(GL_SMOOTH);
|
||||
|
||||
// glEnable(GL_MULTISAMPLE);
|
||||
// glEnable(GL_LINE_SMOOTH);
|
||||
|
||||
/*
|
||||
|
||||
TODO_GL
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
glEnable(GL_LIGHT1);
|
||||
|
||||
|
||||
// GLfloat light0_position [] = {+50, 50, +50, 1};
|
||||
// GLfloat light1_position [] = {-50, 50, -50, 1};
|
||||
|
||||
// glLightfv ( GL_LIGHT0, GL_POSITION, light0_position );
|
||||
// glLightfv ( GL_LIGHT1, GL_POSITION, light1_position );
|
||||
|
||||
GLfloat light_diffuse []={ 0.7, 0.7, 0.7, 1.0 };
|
||||
glLightfv ( GL_LIGHT0, GL_DIFFUSE, light_diffuse );
|
||||
glLightfv ( GL_LIGHT1, GL_DIFFUSE, light_diffuse );
|
||||
|
||||
|
||||
// otherwise scaling the scene kills lighting normals!
|
||||
glEnable(GL_NORMALIZE);
|
||||
|
||||
// allow using glColor3(r,g,b)
|
||||
glEnable(GL_COLOR_MATERIAL);
|
||||
|
||||
// GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
|
||||
// GLfloat mat_shininess[] = { 50.0 };
|
||||
// glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
|
||||
// glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
|
||||
|
||||
*/
|
||||
|
||||
// background color
|
||||
//glClearColor(Qt::white);
|
||||
glClearColor(1,1,1,1);
|
||||
|
||||
}
|
||||
@@ -91,71 +92,13 @@ void MapView3D::paintGL() {
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
/*
|
||||
|
||||
TODO_GL
|
||||
|
||||
glLoadIdentity();
|
||||
|
||||
glScalef(+1, -1, +1);
|
||||
|
||||
// 3) scale
|
||||
glScalef(scale.x, scale.y, scale.z);
|
||||
|
||||
// 2) rotate around center
|
||||
glRotatef(rot.x, 1.0, 0.0, 0.0);
|
||||
glRotatef(rot.z, 0.0, 1.0, 0.0);
|
||||
glRotatef(rot.y, 0.0, 0.0, 1.0);
|
||||
|
||||
// 1) post translate (mouse moving)
|
||||
glTranslatef(center.x, center.z, center.y);
|
||||
|
||||
// 0) swap the y axis
|
||||
//glScalef(+1, -1, +1);
|
||||
|
||||
GLfloat light0_position [] = {100, 50, 100, 1};
|
||||
glLightfv ( GL_LIGHT0, GL_POSITION, light0_position );
|
||||
GLfloat light1_position [] = {0, 50, 0, 1};
|
||||
glLightfv ( GL_LIGHT1, GL_POSITION, light1_position );
|
||||
|
||||
|
||||
// // 1) translate into center
|
||||
// glTranslatef(tra.x, tra.y, tra.z);
|
||||
|
||||
*/
|
||||
|
||||
draw();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void MapView3D::resizeGL(int width, int height) {
|
||||
|
||||
//int side = qMin(width, height);
|
||||
//glViewport((width - side) / 2, (height - side) / 2, side, side);
|
||||
|
||||
|
||||
|
||||
//glViewport(0, 0, width, height);
|
||||
|
||||
/*
|
||||
TODO_GL
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
//glOrtho(-2, +2, -2, +2, 1.0, 25.0);
|
||||
//glFrustum(-1,1, -1,1, 0.1,20);
|
||||
viewport.size.x = 2.0f;
|
||||
viewport.size.y = 2.0f * height / width;
|
||||
const float w = viewport.size.x;
|
||||
const float h = viewport.size.y;
|
||||
glOrtho(-w, +w, -h, +h, -20, +20);
|
||||
//glScalef(1,-1,1);
|
||||
|
||||
//glFrustum(+w, -w, -h, +h, -20, +20);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
*/
|
||||
glViewport(0, 0, width, height);
|
||||
|
||||
}
|
||||
|
||||
@@ -175,9 +118,9 @@ void MapView3D::mouseMoveEvent(QMouseEvent* e) {
|
||||
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, 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 = vec.rot(-rot.x/180*M_PI, -rot.y/180*M_PI, -rot.z/180*M_PI);
|
||||
vec /= scale;
|
||||
center += vec;
|
||||
}
|
||||
@@ -256,45 +199,44 @@ void MapView3D::draw() {
|
||||
|
||||
static RenderSettings rs = RenderSettings(new Shader());
|
||||
|
||||
glViewport(0, 0, width(), height());
|
||||
|
||||
//glCullFace(GL_FRONT);
|
||||
//glFrontFace(GL_CCW);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
|
||||
// view
|
||||
QMatrix4x4 V;
|
||||
|
||||
V.translate(0,0,-30);
|
||||
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.z, center.y);
|
||||
V.translate(0,0,-50);
|
||||
V.translate(center.x, center.y, center.z);
|
||||
|
||||
// V.lookAt(QVector3D(30,-25,25), QVector3D(30,10,0), QVector3D(0,1,0));
|
||||
|
||||
|
||||
// projection
|
||||
QMatrix4x4 P;
|
||||
float aspect = (float) width() / (float) height();
|
||||
float w = 2.0f;
|
||||
float h = 2.0f * height() / width();
|
||||
viewport.size.x = w;
|
||||
viewport.size.y = h;
|
||||
//P.ortho(-w, +w, +h, -h, 0.1f, +30); // glOrtho(-w, +w, -h, +h, -20, +20);
|
||||
P.perspective(45.0f, aspect, 0.01, 100);
|
||||
|
||||
if (usePerspectiveProjection) {
|
||||
float w = width() / 30;
|
||||
float h = height() / 30;
|
||||
viewport.size.x = w;
|
||||
viewport.size.y = h;
|
||||
P.perspective(45.0f, aspect, 0.01, 100);
|
||||
} 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);
|
||||
}
|
||||
|
||||
rs.shader->bind();
|
||||
rs.shader->setViewMatrix(V);
|
||||
rs.shader->setProjectionMatrix(P);
|
||||
|
||||
Cube cube(Point3(0,0,0), 1);
|
||||
cube.setColor(1,0,0);
|
||||
cube.render(rs);
|
||||
|
||||
/*
|
||||
// solid floorplan parts
|
||||
if (showFloorplan) {
|
||||
|
||||
@@ -305,12 +247,12 @@ void MapView3D::draw() {
|
||||
|
||||
}
|
||||
|
||||
if (showGrid && gridModel) {
|
||||
gridRenderer->paintGL(gridModel->getGrid());
|
||||
}
|
||||
// if (showGrid && gridModel) {
|
||||
// gridRenderer->paintGL(gridModel->getGrid());
|
||||
// }
|
||||
|
||||
if (showNavMesh && navMeshModel) {
|
||||
navMeshRenderer->paintGL(navMeshModel->getNavMesh(), this);
|
||||
navMeshRenderer->render(rs, navMeshModel->getNavMesh(), this);
|
||||
}
|
||||
|
||||
// transparant floorplan parts
|
||||
@@ -322,7 +264,7 @@ void MapView3D::draw() {
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -18,6 +18,8 @@ class MapView3D : public QOpenGLWidget {
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
bool usePerspectiveProjection = false;
|
||||
|
||||
public:
|
||||
|
||||
MapView3D(QWidget* parent = 0);
|
||||
@@ -102,6 +104,12 @@ protected:
|
||||
void mouseReleaseEvent(QMouseEvent* e);
|
||||
void wheelEvent(QWheelEvent* e);
|
||||
|
||||
signals:
|
||||
|
||||
void onShow3DFloorplan(bool show);
|
||||
void onShow3DGrid(bool show);
|
||||
void onShow3DNavMesh(bool show);
|
||||
|
||||
private:
|
||||
void draw();
|
||||
|
||||
|
||||
@@ -2,217 +2,52 @@
|
||||
#include "Shader.h"
|
||||
#include <QtOpenGL>
|
||||
|
||||
//static float cube_vertices[] = {
|
||||
//1 -1.0000, -1.0000, -1.0000,
|
||||
//2 -1.0000, 1.0000, -1.0000,
|
||||
//3 1.0000, 1.0000, -1.0000,
|
||||
//4 1.0000, -1.0000, -1.0000,
|
||||
//5 -1.0000, -1.0000, 1.0000,
|
||||
//6 1.0000, -1.0000, 1.0000,
|
||||
//7 1.0000, 1.0000, 1.0000,
|
||||
//8 -1.0000, 1.0000, 1.0000,
|
||||
//};
|
||||
|
||||
//static int cube_vertex_indices[] = {
|
||||
// 1, 2, 3,
|
||||
// 3, 4, 1,
|
||||
// 5, 6, 7,
|
||||
// 7, 8, 5,
|
||||
// 1, 4, 6,
|
||||
// 6, 5, 1,
|
||||
// 4, 3, 7,
|
||||
// 7, 6, 4,
|
||||
// 3, 2, 8,
|
||||
// 8, 7, 3,
|
||||
|
||||
// 2, 1, 5,
|
||||
// 5, 8, 2,
|
||||
//};
|
||||
|
||||
static float cube_vertices[] = {
|
||||
|
||||
-1, -1, -1, -1, +1, -1, +1, +1, -1,
|
||||
+1, +1, -1, +1, -1, -1, -1, -1, -1,
|
||||
|
||||
-1, -1, 0,
|
||||
+1, -1, 0,
|
||||
0, +1, 0,
|
||||
-1, -1, +1, +1, -1, +1, +1, +1, +1,
|
||||
+1, +1, +1, -1, +1, +1, -1, -1, +1,
|
||||
|
||||
// -1.0000, -1.0000, -1.0000, -1.0000, 1.0000, -1.0000, 1.0000, 1.0000, -1.0000,
|
||||
// 1.0000, 1.0000, -1.0000, 1.0000, -1.0000, -1.0000, -1.0000, -1.0000, -1.0000,
|
||||
-1, -1, -1, +1, -1, -1, +1, -1, +1,
|
||||
+1, -1, +1, -1, -1, +1, -1, -1, -1,
|
||||
|
||||
// -1.0000, -1.0000, 1.0000, 1.0000, -1.0000, 1.0000, 1.0000, 1.0000, 1.0000,
|
||||
// 1.0000, 1.0000, 1.0000, -1.0000, 1.0000, 1.0000, -1.0000, -1.0000, 1.0000,
|
||||
+1, -1, -1, +1, +1, -1, +1, +1, +1,
|
||||
+1, +1, +1, +1, -1, +1, +1, -1, -1,
|
||||
|
||||
// -1.0000, -1.0000, -1.0000, 1.0000, -1.0000, -1.0000, 1.0000, -1.0000, 1.0000,
|
||||
// 1.0000, -1.0000, 1.0000, -1.0000, -1.0000, 1.0000, -1.0000, -1.0000, -1.0000,
|
||||
+1, +1, -1, -1, +1, -1, -1, +1, +1,
|
||||
-1, +1, +1, +1, +1, +1, +1, +1, -1,
|
||||
|
||||
// 1.0000, -1.0000, -1.0000, 1.0000, 1.0000, -1.0000, 1.0000, 1.0000, 1.0000,
|
||||
// 1.0000, 1.0000, 1.0000, 1.0000, -1.0000, 1.0000, 1.0000, -1.0000, -1.0000,
|
||||
|
||||
// 1.0000, 1.0000, -1.0000, -1.0000, 1.0000, -1.0000, -1.0000, 1.0000, 1.0000,
|
||||
// -1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, 1.0000, -1.0000,
|
||||
|
||||
// -1.0000, 1.0000, -1.0000, -1.0000, -1.0000, -1.0000, -1.0000, -1.0000, 1.0000,
|
||||
// -1.0000, -1.0000, 1.0000, -1.0000, 1.0000, 1.0000, -1.0000, 1.0000, -1.0000,
|
||||
-1, +1, -1, -1, -1, -1, -1, -1, +1,
|
||||
-1, -1, +1, -1, +1, +1, -1, +1, -1,
|
||||
|
||||
};
|
||||
|
||||
//static float cube_normals[] = {
|
||||
// 0.0000, 0.0000, -1.0000,
|
||||
// 0.0000, 0.0000, 1.0000,
|
||||
// 0.0000, -1.0000, 0.0000,
|
||||
// 1.0000, 0.0000, 0.0000,
|
||||
// 0.0000, 1.0000, 0.0000,
|
||||
// -1.0000, 0.0000, 0.0000,
|
||||
//};
|
||||
|
||||
static float cube_normals[] = {
|
||||
0.0000, 0.0000, -1.0000, 0.0000, 0.0000, -1.0000, 0.0000, 0.0000, -1.0000,
|
||||
0.0000, 0.0000, -1.0000, 0.0000, 0.0000, -1.0000, 0.0000, 0.0000, -1.0000,
|
||||
|
||||
0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 1.0000,
|
||||
0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 1.0000,
|
||||
0, 0, -1, 0, 0, -1, 0, 0, -1,
|
||||
0, 0, -1, 0, 0, -1, 0, 0, -1,
|
||||
|
||||
0.0000, -1.0000, 0.0000, 0.0000, -1.0000, 0.0000, 0.0000, -1.0000, 0.0000,
|
||||
0.0000, -1.0000, 0.0000, 0.0000, -1.0000, 0.0000, 0.0000, -1.0000, 0.0000,
|
||||
0, 0, +1, 0, 0, +1, 0, 0, +1,
|
||||
0, 0, +1, 0, 0, +1, 0, 0, +1,
|
||||
|
||||
1.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000,
|
||||
1.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000,
|
||||
0, -1, 0, 0, -1, 0, 0, -1, 0,
|
||||
0, -1, 0, 0, -1, 0, 0, -1, 0,
|
||||
|
||||
0.0000, 1.0000, 0.0000,0.0000, 1.0000, 0.0000,0.0000, 1.0000, 0.0000,
|
||||
0.0000, 1.0000, 0.0000,0.0000, 1.0000, 0.0000,0.0000, 1.0000, 0.0000,
|
||||
1, 0, 0, 1, 0, 0, 1, 0, 0,
|
||||
1, 0, 0, 1, 0, 0, 1, 0, 0,
|
||||
|
||||
0, +1, 0, 0, +1, 0, 0, +1, 0,
|
||||
0, +1, 0, 0, +1, 0, 0, +1, 0,
|
||||
|
||||
-1, 0, 0, -1, 0, 0, -1, 0, 0,
|
||||
-1, 0, 0, -1, 0, 0, -1, 0, 0,
|
||||
|
||||
-1.0000, 0.0000, 0.0000,-1.0000, 0.0000, 0.0000,-1.0000, 0.0000, 0.0000,
|
||||
-1.0000, 0.0000, 0.0000,-1.0000, 0.0000, 0.0000,-1.0000, 0.0000, 0.0000,
|
||||
};
|
||||
|
||||
//static int cube_normal_indices[] = {
|
||||
// 1, 1, 1,
|
||||
// 1, 1, 1,
|
||||
// 2, 2, 2,
|
||||
// 2, 2, 2,
|
||||
// 3, 3, 3,
|
||||
// 3, 3, 3,
|
||||
// 4, 4, 4,
|
||||
// 4, 4, 4,
|
||||
// 5, 5, 5,
|
||||
// 5, 5, 5,
|
||||
// 6, 6, 6,
|
||||
// 6, 6, 6,
|
||||
//};
|
||||
|
||||
|
||||
|
||||
//static float cube_vertices[] = {
|
||||
|
||||
// // bottom
|
||||
// +1, -1, -1,
|
||||
// +1, -1, +1,
|
||||
// -1, -1, +1,
|
||||
|
||||
// -1, -1, +1,
|
||||
// -1, -1, -1,
|
||||
// +1, -1, -1,
|
||||
|
||||
// // top
|
||||
// -1, +1, -1,
|
||||
// -1, +1, +1,
|
||||
// +1, +1, +1,
|
||||
|
||||
// +1, +1, +1,
|
||||
// +1, +1, -1,
|
||||
// -1, +1, -1,
|
||||
|
||||
// // left
|
||||
// -1, -1, -1,
|
||||
// -1, -1, +1,
|
||||
// -1, +1, +1,
|
||||
|
||||
// -1, +1, +1,
|
||||
// -1, +1, -1,
|
||||
// -1, -1, -1,
|
||||
|
||||
// // right
|
||||
// +1, +1, -1,
|
||||
// +1, +1, +1,
|
||||
// +1, -1, +1,
|
||||
|
||||
// +1, -1, +1,
|
||||
// +1, -1, -1,
|
||||
// +1, +1, -1,
|
||||
|
||||
// // front
|
||||
// +1, +1, +1,
|
||||
// -1, +1, +1,
|
||||
// -1, -1, +1,
|
||||
|
||||
// -1, -1, +1,
|
||||
// +1, -1, +1,
|
||||
// +1, +1, +1,
|
||||
|
||||
// // rear
|
||||
// +1, -1, -1,
|
||||
// -1, -1, -1,
|
||||
// -1, +1, -1,
|
||||
|
||||
// -1, +1, -1,
|
||||
// +1, +1, -1,
|
||||
// +1, -1, -1,
|
||||
|
||||
//};
|
||||
|
||||
//static float cube_normals[] = {
|
||||
|
||||
// // bottom
|
||||
// 0,-1,0,
|
||||
// 0,-1,0,
|
||||
// 0,-1,0,
|
||||
// 0,-1,0,
|
||||
// 0,-1,0,
|
||||
// 0,-1,0,
|
||||
|
||||
// // top
|
||||
// 0,+1,0,
|
||||
// 0,+1,0,
|
||||
// 0,+1,0,
|
||||
// 0,+1,0,
|
||||
// 0,+1,0,
|
||||
// 0,+1,0,
|
||||
|
||||
// // left
|
||||
// -1,0,0,
|
||||
// -1,0,0,
|
||||
// -1,0,0,
|
||||
// -1,0,0,
|
||||
// -1,0,0,
|
||||
// -1,0,0,
|
||||
|
||||
// // right
|
||||
// +1,0,0,
|
||||
// +1,0,0,
|
||||
// +1,0,0,
|
||||
// +1,0,0,
|
||||
// +1,0,0,
|
||||
// +1,0,0,
|
||||
|
||||
// // front
|
||||
// 0,0,+1,
|
||||
// 0,0,+1,
|
||||
// 0,0,+1,
|
||||
// 0,0,+1,
|
||||
// 0,0,+1,
|
||||
// 0,0,+1,
|
||||
|
||||
// // rear
|
||||
// 0,0,-1,
|
||||
// 0,0,-1,
|
||||
// 0,0,-1,
|
||||
// 0,0,-1,
|
||||
// 0,0,-1,
|
||||
// 0,0,-1,
|
||||
|
||||
//};
|
||||
|
||||
static Shader* shader = nullptr;
|
||||
//static Shader* shader = nullptr;
|
||||
|
||||
Cube::Cube(Point3 pos, float size) : pos(pos), size(size,size,size), rot(0,0,0) {
|
||||
|
||||
@@ -228,29 +63,23 @@ void Cube::setColor(float r, float g, float b) {
|
||||
|
||||
void Cube::render(const RenderSettings& rs) {
|
||||
|
||||
|
||||
|
||||
rs.shader->bind();
|
||||
|
||||
QMatrix4x4 mat;
|
||||
mat.translate(pos.x, pos.y, pos.z);
|
||||
mat.rotate(rot.x, 1, 0, 0);
|
||||
mat.rotate(rot.y, 0, 1, 0);
|
||||
mat.rotate(rot.z, 0, 0, 1);
|
||||
mat.rotate(rot.x, +1, 0, 0);
|
||||
mat.rotate(rot.y, 0, +1, 0);
|
||||
mat.rotate(rot.z, 0, 0, +1);
|
||||
mat.scale(size.x, size.y, size.z);
|
||||
|
||||
|
||||
// mat.scale(0.1, 0.1, 0.1);
|
||||
rs.shader->setModelMatrix(mat);
|
||||
// shader->setViewMatrix(V);
|
||||
// shader->setProjectionMatrix(P);
|
||||
|
||||
rs.shader->setColor(color.x, color.y, color.z);
|
||||
|
||||
rs.shader->setVertices(cube_vertices);
|
||||
rs.shader->setNormals(cube_normals);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 1*3);
|
||||
//glDrawElements(GL_TRIANGLES, 12, GL_INT, cube_vertex_indices);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 12*3);
|
||||
//glDrawElements(GL_TRIANGLES, +12, GL_INT, cube_vertex_indices);
|
||||
rs.shader->unsetVertices();
|
||||
rs.shader->unsetNormals();
|
||||
|
||||
|
||||
101
mapview/3D/misc/Handrail.cpp
Normal file
101
mapview/3D/misc/Handrail.cpp
Normal file
@@ -0,0 +1,101 @@
|
||||
#include "Handrail.h"
|
||||
|
||||
#include <Indoor/geo/Point3.h>
|
||||
#include "Shader.h"
|
||||
|
||||
Handrail::Handrail(const Point2 from, const Point2 to, float atHeight, float height) :
|
||||
from(from), to(to), atHeight(atHeight), height(height) {
|
||||
|
||||
;
|
||||
|
||||
}
|
||||
|
||||
void Handrail::render(const RenderSettings& rs) {
|
||||
|
||||
rs.shader->bind();
|
||||
rs.shader->setColor(0.8, 0.8, 0.8);
|
||||
rs.shader->setModelMatrix(QMatrix4x4());
|
||||
|
||||
const float z1 = atHeight;
|
||||
const float z2 = atHeight + height;
|
||||
|
||||
// polygon edges
|
||||
Point3 p1 = Point3(from.x, from.y, z1);
|
||||
Point3 p2 = Point3(to.x, to.y, z1);
|
||||
|
||||
Point3 p3 = Point3(from.x, from.y, z2);
|
||||
Point3 p4 = Point3(to.x, to.y, z2);
|
||||
|
||||
std::vector<float> vertices;
|
||||
|
||||
// top
|
||||
vertices.insert( vertices.end(), {p3.x, p3.y, p3.z} );
|
||||
vertices.insert( vertices.end(), {p4.x, p4.y, p4.z} );
|
||||
|
||||
// start bar
|
||||
vertices.insert( vertices.end(), {p1.x, p1.y, p1.z} );
|
||||
vertices.insert( vertices.end(), {p3.x, p3.y, p3.z} );
|
||||
|
||||
// end bar
|
||||
vertices.insert( vertices.end(), {p2.x, p2.y, p2.z} );
|
||||
vertices.insert( vertices.end(), {p4.x, p4.y, p4.z} );
|
||||
|
||||
// intermediate bars
|
||||
const Point3 d1 = p2-p1;
|
||||
const Point3 d2 = p4-p3;
|
||||
const int numBars = d2.length() / 1;
|
||||
for (int i = 1; i < numBars; ++i) {
|
||||
const Point3 s = p1 + d1 * i / numBars;
|
||||
const Point3 e = p3 + d2 * i / numBars;
|
||||
vertices.insert( vertices.end(), {s.x, s.y, s.z} );
|
||||
vertices.insert( vertices.end(), {e.x, e.y, e.z} );
|
||||
}
|
||||
|
||||
rs.shader->setVertices(vertices.data());
|
||||
glDrawArrays(GL_LINES, 0, vertices.size() / 3);
|
||||
rs.shader->unsetVertices();
|
||||
|
||||
rs.shader->release();
|
||||
|
||||
/*
|
||||
|
||||
TODO_GL
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
glBegin(GL_LINES);
|
||||
|
||||
glColor3f(0.9, 0.9, 0.9);
|
||||
|
||||
// top
|
||||
glVertex3f(p3.x, p3.y, p3.z);
|
||||
glVertex3f(p4.x, p4.y, p4.z);
|
||||
|
||||
// start bar
|
||||
glVertex3f(p1.x, p1.y, p1.z);
|
||||
glVertex3f(p3.x, p3.y, p3.z);
|
||||
|
||||
// end bar
|
||||
glVertex3f(p2.x, p2.y, p2.z);
|
||||
glVertex3f(p4.x, p4.y, p4.z);
|
||||
|
||||
glColor3f(0.6, 0.6, 0.6);
|
||||
|
||||
// intermediate bars
|
||||
const Point3 d1 = p2-p1;
|
||||
const Point3 d2 = p4-p3;
|
||||
const int numBars = d2.length() / 1;
|
||||
for (int i = 1; i < numBars; ++i) {
|
||||
const Point3 s = p1 + d1 * i / numBars;
|
||||
const Point3 e = p3 + d2 * i / numBars;
|
||||
glVertex3f(s.x, s.y, s.z);
|
||||
glVertex3f(e.x, e.y, e.z);
|
||||
}
|
||||
|
||||
glEnd();
|
||||
glEnable(GL_LIGHTING);
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
}
|
||||
25
mapview/3D/misc/Handrail.h
Normal file
25
mapview/3D/misc/Handrail.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#ifndef HANDRAIL_H
|
||||
#define HANDRAIL_H
|
||||
|
||||
|
||||
#include "Renderable3D.h"
|
||||
#include <Indoor/geo/Point2.h>
|
||||
|
||||
class Handrail : public Renderable3D {
|
||||
|
||||
private:
|
||||
|
||||
Point2 from;
|
||||
Point2 to;
|
||||
float atHeight;
|
||||
float height;
|
||||
|
||||
public:
|
||||
|
||||
Handrail(const Point2 from, const Point2 to, float atHeight, float height);
|
||||
|
||||
void render(const RenderSettings& rs) override;
|
||||
|
||||
};
|
||||
|
||||
#endif // HANDRAIL_H
|
||||
73
mapview/3D/misc/Outline.cpp
Normal file
73
mapview/3D/misc/Outline.cpp
Normal file
@@ -0,0 +1,73 @@
|
||||
#include "Outline.h"
|
||||
|
||||
#include <QMatrix4x4>
|
||||
#include <Indoor/geo/Point3.h>
|
||||
#include <QOpenGLWidget>
|
||||
#include "Shader.h"
|
||||
|
||||
Outline::Outline() {
|
||||
|
||||
}
|
||||
|
||||
void Outline::render(const RenderSettings& rs) {
|
||||
|
||||
rs.shader->bind();
|
||||
|
||||
// identity
|
||||
QMatrix4x4 mat;
|
||||
rs.shader->setModelMatrix(mat);
|
||||
|
||||
// show both sides
|
||||
//glDisable(GL_CULL_FACE);
|
||||
glEnable(GL_CULL_FACE);
|
||||
|
||||
rs.shader->setColor(color.x, color.y, color.z);
|
||||
rs.shader->setVertices(vertices.data());
|
||||
rs.shader->setNormals(normals.data());
|
||||
glDrawArrays(GL_TRIANGLES, 0, vertices.size() / 3);
|
||||
rs.shader->unsetVertices();
|
||||
rs.shader->unsetNormals();
|
||||
|
||||
|
||||
|
||||
rs.shader->release();
|
||||
|
||||
}
|
||||
|
||||
void Outline::setColor(float r, float g, float b) {
|
||||
color = Point3(r,g,b);
|
||||
}
|
||||
|
||||
void Outline::clear() {
|
||||
normals.clear();
|
||||
vertices.clear();
|
||||
}
|
||||
|
||||
void Outline::add(std::vector<std::vector<Point3>>& triangles) {
|
||||
|
||||
for (const std::vector<Point3>& tria : triangles) {
|
||||
for (size_t i = 2; i < tria.size(); ++i) {
|
||||
|
||||
const Point3 p1 = tria[i-2];
|
||||
const Point3 p2 = tria[i-1];
|
||||
const Point3 p3 = tria[i-0];
|
||||
|
||||
const Point3 n = cross(p2-p1, p3-p1);
|
||||
if (n.z < 0) {
|
||||
vertices.push_back(p1.x); vertices.push_back(p1.y); vertices.push_back(p1.z);
|
||||
vertices.push_back(p3.x); vertices.push_back(p3.y); vertices.push_back(p3.z);
|
||||
vertices.push_back(p2.x); vertices.push_back(p2.y); vertices.push_back(p2.z);
|
||||
} else {
|
||||
vertices.push_back(p1.x); vertices.push_back(p1.y); vertices.push_back(p1.z);
|
||||
vertices.push_back(p2.x); vertices.push_back(p2.y); vertices.push_back(p2.z);
|
||||
vertices.push_back(p3.x); vertices.push_back(p3.y); vertices.push_back(p3.z);
|
||||
}
|
||||
|
||||
normals.push_back(0); normals.push_back(0); normals.push_back(1);
|
||||
normals.push_back(0); normals.push_back(0); normals.push_back(1);
|
||||
normals.push_back(0); normals.push_back(0); normals.push_back(1);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
33
mapview/3D/misc/Outline.h
Normal file
33
mapview/3D/misc/Outline.h
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef OUTLINE_H
|
||||
#define OUTLINE_H
|
||||
|
||||
|
||||
#include "Renderable3D.h"
|
||||
#include <vector>
|
||||
#include <Indoor/geo/Point3.h>
|
||||
|
||||
class Outline : public Renderable3D {
|
||||
|
||||
private:
|
||||
|
||||
std::vector<float> vertices;
|
||||
std::vector<float> normals;
|
||||
Point3 color;
|
||||
|
||||
public:
|
||||
|
||||
Outline();
|
||||
|
||||
|
||||
|
||||
virtual void render(const RenderSettings& rs) override;
|
||||
|
||||
void setColor(float r, float g, float b);
|
||||
|
||||
void clear();
|
||||
|
||||
void add(std::vector<std::vector<Point3>>&);
|
||||
|
||||
};
|
||||
|
||||
#endif // OUTLINE_H
|
||||
@@ -6,27 +6,41 @@ Shader::Shader() {
|
||||
addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, R"(
|
||||
attribute highp vec3 a_vertex;
|
||||
attribute highp vec3 a_normal;
|
||||
attribute lowp vec4 a_color;
|
||||
uniform highp mat4 M;
|
||||
uniform highp mat4 V;
|
||||
uniform highp mat4 P;
|
||||
varying highp vec3 normal;
|
||||
varying highp vec3 v_normal;
|
||||
varying lowp vec4 v_color;
|
||||
varying lowp vec4 v_vertex;
|
||||
void main() {
|
||||
gl_Position = vec4(a_vertex, 1.0);
|
||||
normal = normalize( V*M*vec4(a_normal, 0.0) );
|
||||
gl_Position = P * V * M * vec4(a_vertex, 1.0);
|
||||
v_normal = (V * M * vec4(a_normal, 0.0)).xyz;
|
||||
v_color = a_color;
|
||||
v_vertex = V * M * vec4(a_vertex, 1.0);
|
||||
}
|
||||
)");
|
||||
|
||||
addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, R"(
|
||||
uniform vec4 color;
|
||||
varying highp vec3 normal;
|
||||
uniform bool useNormal;
|
||||
uniform bool useVertexColor;
|
||||
varying highp vec3 v_normal;
|
||||
varying lowp vec4 v_color;
|
||||
varying lowp vec4 v_vertex;
|
||||
void main() {
|
||||
float intensity = dot( normal, normalize(vec3(-1,-1,-3)) );
|
||||
gl_FragColor.rgb = color.rgb * intensity;
|
||||
gl_FragColor.a = color.a;
|
||||
vec3 lightPos = vec3(0,0,0); // camera
|
||||
//vec3 lightVec = normalize(vec3(0,0,1));
|
||||
vec3 lightVec = normalize(lightPos - v_vertex.xyz);
|
||||
float intensity = useNormal ? 0.3 + 0.7 * dot( normalize(v_normal), lightVec ) : 1.0; // light at camera pos
|
||||
vec4 col = useVertexColor ? v_color : color;
|
||||
gl_FragColor.rgb = col.rgb * intensity;
|
||||
gl_FragColor.a = col.a;
|
||||
}
|
||||
)");
|
||||
|
||||
//bindAttributeLocation("vertices", 0);
|
||||
|
||||
if (!link()) {
|
||||
std::cout << log().toStdString() << std::endl;
|
||||
throw std::runtime_error("shader link error");
|
||||
@@ -36,15 +50,25 @@ Shader::Shader() {
|
||||
|
||||
|
||||
void Shader::setModelMatrix(const QMatrix4x4& m) {
|
||||
//setUniformValue(getUniform("M"), m);
|
||||
setUniformValue(getUniform("M"), m);
|
||||
}
|
||||
|
||||
void Shader::setViewMatrix(const QMatrix4x4& m) {
|
||||
//setUniformValue(getUniform("V"), m);
|
||||
setUniformValue(getUniform("V"), m);
|
||||
}
|
||||
|
||||
void Shader::setProjectionMatrix(const QMatrix4x4& m) {
|
||||
//setUniformValue(getUniform("P"), m);
|
||||
setUniformValue(getUniform("P"), m);
|
||||
}
|
||||
|
||||
void Shader::setUseNormals(bool use) {
|
||||
int loc = getUniform("useNormal");
|
||||
setUniformValue(loc, use);
|
||||
}
|
||||
|
||||
void Shader::setUseVertexColor(bool use) {
|
||||
int loc = getUniform("useVertexColor");
|
||||
setUniformValue(loc, use);
|
||||
}
|
||||
|
||||
int Shader::getUniform(const char* name) {
|
||||
@@ -52,7 +76,6 @@ int Shader::getUniform(const char* name) {
|
||||
if (loc == -1) {throw std::runtime_error("error");}
|
||||
return loc;
|
||||
}
|
||||
|
||||
int Shader::getAttribute(const char* name) {
|
||||
int loc = attributeLocation(name);
|
||||
if (loc == -1) {throw std::runtime_error("error");}
|
||||
@@ -78,11 +101,25 @@ void Shader::unsetVertices() {
|
||||
}
|
||||
|
||||
void Shader::setNormals(const float* values) {
|
||||
setUseNormals(true);
|
||||
const int loc = getAttribute("a_normal");
|
||||
enableAttributeArray(loc);
|
||||
setAttributeArray(loc, GL_FLOAT, values, 3);
|
||||
}
|
||||
void Shader::unsetNormals() {
|
||||
setUseNormals(false);
|
||||
const int loc = getAttribute("a_normal");
|
||||
disableAttributeArray(loc);
|
||||
}
|
||||
|
||||
void Shader::setVertexColor(const float* values) {
|
||||
setUseVertexColor(true);
|
||||
const int loc = getAttribute("a_color");
|
||||
enableAttributeArray(loc);
|
||||
setAttributeArray(loc, GL_FLOAT, values, 4); // RGBA!!!
|
||||
}
|
||||
void Shader::unsetVertexColor() {
|
||||
setUseVertexColor(false);
|
||||
const int loc = getAttribute("a_color");
|
||||
disableAttributeArray(loc);
|
||||
}
|
||||
|
||||
@@ -21,9 +21,14 @@ public:
|
||||
void setVertices(const float*);
|
||||
void unsetVertices();
|
||||
|
||||
void setUseNormals(bool use);
|
||||
void setNormals(const float*);
|
||||
void unsetNormals();
|
||||
|
||||
void setVertexColor(const float*);
|
||||
void unsetVertexColor();
|
||||
void setUseVertexColor(bool use);
|
||||
|
||||
int getUniform(const char*);
|
||||
int getAttribute(const char*);
|
||||
|
||||
|
||||
@@ -9,12 +9,10 @@
|
||||
#include <Indoor/navMesh/NavMeshType.h>
|
||||
|
||||
#include <QPainter>
|
||||
#include <QGLWidget>
|
||||
#include <QOpenGLWidget>
|
||||
|
||||
//enum class GridRendererColorMode {
|
||||
// SHOW_NODE_TYPE,
|
||||
// SHOW_NODE_IMPORTANCE,
|
||||
//};
|
||||
#include "../3D/misc/Renderable3D.h"
|
||||
#include "../3D/misc/Shader.h"
|
||||
|
||||
class NavMeshRenderer {
|
||||
|
||||
@@ -53,10 +51,88 @@ public:
|
||||
|
||||
|
||||
/** render the given grid using GL commands */
|
||||
void paintGL(NM::NavMesh<NM::NavMeshTriangle>* navMesh, QGLWidget* dst) {
|
||||
void render(const RenderSettings& rs, NM::NavMesh<NM::NavMeshTriangle>* navMesh, QOpenGLWidget* dst) {
|
||||
|
||||
if (navMesh == nullptr) {return;}
|
||||
|
||||
|
||||
rs.shader->bind();
|
||||
rs.shader->setModelMatrix(QMatrix4x4());
|
||||
|
||||
std::vector<float> vertices;
|
||||
std::vector<float> colors;
|
||||
|
||||
for (const NM::NavMeshTriangle* tria : *navMesh) {
|
||||
|
||||
Point3 color;
|
||||
|
||||
switch (tria->getType()) {
|
||||
case (int) NM::NavMeshType::FLOOR_INDOOR: color = Point3(0.8, 0.8, 0.8); break;
|
||||
case (int) NM::NavMeshType::FLOOR_OUTDOOR: color = Point3(0.1, 0.8, 0.1); break;
|
||||
case (int) NM::NavMeshType::DOOR: color = Point3(0.7, 0.7, 0.8); break;
|
||||
case (int) NM::NavMeshType::STAIR_LEVELED: color = Point3(0.5, 0.5, 0.5); break;
|
||||
case (int) NM::NavMeshType::STAIR_SKEWED: color = Point3(0.6, 0.6, 0.6); break;
|
||||
}
|
||||
|
||||
vertices.insert(vertices.end(), {tria->getP1().x, tria->getP1().y, tria->getP1().z});
|
||||
vertices.insert(vertices.end(), {tria->getP3().x, tria->getP3().y, tria->getP3().z});
|
||||
vertices.insert(vertices.end(), {tria->getP2().x, tria->getP2().y, tria->getP2().z});
|
||||
|
||||
colors.insert(colors.end(), {color.x, color.y, color.z, 1});
|
||||
colors.insert(colors.end(), {color.x, color.y, color.z, 1});
|
||||
colors.insert(colors.end(), {color.x, color.y, color.z, 1});
|
||||
|
||||
}
|
||||
|
||||
rs.shader->setVertices(vertices.data());
|
||||
rs.shader->setVertexColor(colors.data());
|
||||
glDrawArrays(GL_TRIANGLES, 0, vertices.size()/3);
|
||||
rs.shader->unsetVertices();
|
||||
rs.shader->unsetVertexColor();
|
||||
|
||||
vertices.clear();
|
||||
colors.clear();
|
||||
|
||||
for (const NM::NavMeshTriangle* tria : *navMesh) {
|
||||
|
||||
Point3 color;
|
||||
|
||||
switch (tria->getType()) {
|
||||
case (int) NM::NavMeshType::FLOOR_INDOOR: color = Point3(0.6, 0.6, 0.6); break;
|
||||
case (int) NM::NavMeshType::FLOOR_OUTDOOR: color = Point3(0.0, 0.6, 0.0); break;
|
||||
case (int) NM::NavMeshType::DOOR: color = Point3(0.5, 0.5, 0.6); break;
|
||||
case (int) NM::NavMeshType::STAIR_LEVELED: color = Point3(0.4, 0.4, 0.4); break;
|
||||
case (int) NM::NavMeshType::STAIR_SKEWED: color = Point3(0.4, 0.4, 0.4); break;
|
||||
}
|
||||
|
||||
const float o = 0.001f;
|
||||
vertices.insert(vertices.end(), {tria->getP1().x, tria->getP1().y, tria->getP1().z+o});
|
||||
vertices.insert(vertices.end(), {tria->getP2().x, tria->getP2().y, tria->getP2().z+o});
|
||||
|
||||
vertices.insert(vertices.end(), {tria->getP2().x, tria->getP2().y, tria->getP2().z+o});
|
||||
vertices.insert(vertices.end(), {tria->getP3().x, tria->getP3().y, tria->getP3().z+o});
|
||||
|
||||
vertices.insert(vertices.end(), {tria->getP3().x, tria->getP3().y, tria->getP3().z+o});
|
||||
vertices.insert(vertices.end(), {tria->getP1().x, tria->getP1().y, tria->getP1().z+o});
|
||||
|
||||
colors.insert(colors.end(), {color.x, color.y, color.z, 1});
|
||||
colors.insert(colors.end(), {color.x, color.y, color.z, 1});
|
||||
colors.insert(colors.end(), {color.x, color.y, color.z, 1});
|
||||
colors.insert(colors.end(), {color.x, color.y, color.z, 1});
|
||||
colors.insert(colors.end(), {color.x, color.y, color.z, 1});
|
||||
colors.insert(colors.end(), {color.x, color.y, color.z, 1});
|
||||
|
||||
}
|
||||
|
||||
rs.shader->setVertices(vertices.data());
|
||||
rs.shader->setVertexColor(colors.data());
|
||||
glDrawArrays(GL_LINES, 0, vertices.size()/3);
|
||||
rs.shader->unsetVertices();
|
||||
rs.shader->unsetVertexColor();
|
||||
|
||||
rs.shader->release();
|
||||
|
||||
|
||||
/*
|
||||
|
||||
TODO_GL
|
||||
@@ -68,21 +144,7 @@ public:
|
||||
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;
|
||||
|
||||
4
res.qrc
4
res.qrc
@@ -20,5 +20,9 @@
|
||||
<file>res/icons/fingerprint.svg</file>
|
||||
<file>res/icons/gtp.svg</file>
|
||||
<file>res/icons/registration.svg</file>
|
||||
<file>res/icons/mesh.svg</file>
|
||||
<file>res/icons/perspective.svg</file>
|
||||
<file>res/icons/floorplan.svg</file>
|
||||
<file>res/icons/grid.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
107
res/icons/floorplan.svg
Normal file
107
res/icons/floorplan.svg
Normal file
@@ -0,0 +1,107 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 59 59" style="enable-background:new 0 0 59 59;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M14,7c0-3.859-3.141-7-7-7S0,3.141,0,7v45h0.003C0.003,52.02,0,52.04,0,52.06C0,55.887,3.113,59,6.94,59H59V7H14z M2,7
|
||||
c0-2.421,1.731-4.444,4.02-4.901C6.072,2.603,6.483,3,7,3s0.928-0.397,0.98-0.901C10.269,2.556,12,4.579,12,7v40.105
|
||||
C10.729,45.807,8.957,45,7,45c-0.243,0-0.482,0.013-0.719,0.037c-0.106,0.011-0.21,0.032-0.315,0.048
|
||||
c-0.128,0.019-0.257,0.034-0.383,0.06c-0.138,0.028-0.271,0.068-0.405,0.104C5.09,45.273,5,45.291,4.913,45.318
|
||||
c-0.167,0.053-0.329,0.116-0.491,0.181c-0.049,0.02-0.101,0.035-0.15,0.056c-0.199,0.084-0.392,0.18-0.582,0.282
|
||||
c-0.008,0.004-0.017,0.008-0.025,0.012C3.049,46.184,2.487,46.608,2,47.105V7z M57,57H6.94C4.216,57,2,54.784,2,52
|
||||
c0-2.757,2.243-5,5-5s5,2.243,5,5h2V9h43V57z"/>
|
||||
<path d="M46.017,21.001c0.176,0.123,0.377,0.183,0.576,0.183c0.314,0,0.623-0.147,0.818-0.423c0.318-0.451,0.211-1.075-0.24-1.395
|
||||
l-1.634-1.153c-0.453-0.317-1.075-0.21-1.395,0.24c-0.318,0.451-0.211,1.075,0.24,1.395L46.017,21.001z"/>
|
||||
<path d="M50.92,24.461c0.175,0.123,0.376,0.183,0.575,0.183c0.314,0,0.623-0.147,0.818-0.424c0.318-0.451,0.21-1.075-0.241-1.394
|
||||
l-1.635-1.153c-0.451-0.317-1.074-0.21-1.394,0.241c-0.318,0.451-0.21,1.075,0.241,1.394L50.92,24.461z"/>
|
||||
<path d="M37,41c0,0.553,0.447,1,1,1h2c0.553,0,1-0.447,1-1s-0.447-1-1-1h-2C37.447,40,37,40.447,37,41z"/>
|
||||
<path d="M51,27.383v2c0,0.553,0.447,1,1,1s1-0.447,1-1v-2c0-0.553-0.447-1-1-1S51,26.83,51,27.383z"/>
|
||||
<path d="M41.115,17.541c0.176,0.123,0.377,0.183,0.576,0.183c0.314,0,0.623-0.147,0.818-0.423c0.318-0.451,0.211-1.075-0.24-1.395
|
||||
l-1.634-1.153c-0.453-0.317-1.075-0.21-1.395,0.24c-0.318,0.451-0.211,1.075,0.24,1.395L41.115,17.541z"/>
|
||||
<path d="M43,41c0,0.553,0.447,1,1,1h2c0.553,0,1-0.447,1-1s-0.447-1-1-1h-2C43.447,40,43,40.447,43,41z"/>
|
||||
<path d="M29,41c0-0.553-0.447-1-1-1h-2c-0.553,0-1,0.447-1,1s0.447,1,1,1h2C28.553,42,29,41.553,29,41z"/>
|
||||
<path d="M52,36.383c0.553,0,1-0.447,1-1v-2c0-0.553-0.447-1-1-1s-1,0.447-1,1v2C51,35.936,51.447,36.383,52,36.383z"/>
|
||||
<path d="M36.213,14.081c0.176,0.123,0.377,0.183,0.576,0.183c0.314,0,0.623-0.147,0.818-0.423c0.318-0.451,0.211-1.075-0.24-1.395
|
||||
l-1.634-1.153c-0.453-0.316-1.075-0.209-1.395,0.24c-0.318,0.451-0.211,1.075,0.24,1.395L36.213,14.081z"/>
|
||||
<path d="M51,40h-1c-0.553,0-1,0.447-1,1s0.447,1,1,1h3v-2.617c0-0.553-0.447-1-1-1s-1,0.447-1,1V40z"/>
|
||||
<path d="M20,42h2c0.553,0,1-0.447,1-1s-0.447-1-1-1h-2c-0.553,0-1,0.447-1,1S19.447,42,20,42z"/>
|
||||
<path d="M18,28c0.553,0,1-0.447,1-1v-2c0-0.553-0.447-1-1-1s-1,0.447-1,1v2C17,27.553,17.447,28,18,28z"/>
|
||||
<path d="M20.452,23.27c0.199,0,0.4-0.06,0.576-0.183l1.634-1.153c0.451-0.319,0.559-0.943,0.24-1.395
|
||||
c-0.318-0.45-0.941-0.558-1.395-0.24l-1.634,1.153c-0.451,0.319-0.559,0.943-0.24,1.395C19.829,23.122,20.138,23.27,20.452,23.27z"
|
||||
/>
|
||||
<path d="M25.354,19.81c0.199,0,0.4-0.06,0.576-0.183l1.634-1.153c0.451-0.319,0.559-0.943,0.24-1.395
|
||||
c-0.319-0.449-0.941-0.557-1.395-0.24l-1.634,1.153c-0.451,0.319-0.559,0.943-0.24,1.395C24.73,19.662,25.039,19.81,25.354,19.81z"
|
||||
/>
|
||||
<path d="M18,34c0.553,0,1-0.447,1-1v-2c0-0.553-0.447-1-1-1s-1,0.447-1,1v2C17,33.553,17.447,34,18,34z"/>
|
||||
<path d="M30.256,16.35c0.199,0,0.4-0.06,0.576-0.183l1.634-1.153c0.451-0.319,0.559-0.943,0.24-1.395
|
||||
c-0.319-0.449-0.94-0.559-1.395-0.24l-1.634,1.153c-0.451,0.319-0.559,0.943-0.24,1.395C29.633,16.202,29.941,16.35,30.256,16.35z"
|
||||
/>
|
||||
<path d="M31,41c0,0.553,0.447,1,1,1h2c0.553,0,1-0.447,1-1s-0.447-1-1-1h-2C31.447,40,31,40.447,31,41z"/>
|
||||
<path d="M18,40c0.553,0,1-0.447,1-1v-2c0-0.553-0.447-1-1-1s-1,0.447-1,1v2C17,39.553,17.447,40,18,40z"/>
|
||||
<path d="M41,54h13v-8H41V54z M43,48h9v4h-9V48z"/>
|
||||
<path d="M22,30v2c0,0.553,0.447,1,1,1s1-0.447,1-1v-2c0-0.553-0.447-1-1-1S22,29.447,22,30z"/>
|
||||
<path d="M31,27c-0.553,0-1,0.447-1,1v2c0,0.553,0.447,1,1,1s1-0.447,1-1v-2C32,27.447,31.553,27,31,27z"/>
|
||||
<path d="M25,29h2c0.553,0,1-0.447,1-1s-0.447-1-1-1h-2c-0.553,0-1,0.447-1,1S24.447,29,25,29z"/>
|
||||
<path d="M26,36c0-0.553-0.447-1-1-1h-2c-0.553,0-1,0.447-1,1s0.447,1,1,1h2C25.553,37,26,36.553,26,36z"/>
|
||||
<path d="M29,37h2c0.553,0,1-0.447,1-1v-2c0-0.553-0.447-1-1-1s-1,0.447-1,1v1h-1c-0.553,0-1,0.447-1,1S28.447,37,29,37z"/>
|
||||
<path d="M40,28c0,0.553,0.447,1,1,1h2c0.553,0,1-0.447,1-1s-0.447-1-1-1h-2C40.447,27,40,27.447,40,28z"/>
|
||||
<path d="M46,28v2c0,0.553,0.447,1,1,1s1-0.447,1-1v-2c0-0.553-0.447-1-1-1S46,27.447,46,28z"/>
|
||||
<path d="M47,37c0.553,0,1-0.447,1-1v-2c0-0.553-0.447-1-1-1s-1,0.447-1,1v1h-1c-0.553,0-1,0.447-1,1s0.447,1,1,1H47z"/>
|
||||
<path d="M39,33c0.553,0,1-0.447,1-1v-2c0-0.553-0.447-1-1-1s-1,0.447-1,1v2C38,32.553,38.447,33,39,33z"/>
|
||||
<path d="M39,37h2c0.553,0,1-0.447,1-1s-0.447-1-1-1h-2c-0.553,0-1,0.447-1,1S38.447,37,39,37z"/>
|
||||
<path d="M38,46h-5c-0.553,0-1,0.447-1,1s0.447,1,1,1h5c0.553,0,1-0.447,1-1S38.553,46,38,46z"/>
|
||||
<path d="M38,49h-7c-0.553,0-1,0.447-1,1s0.447,1,1,1h7c0.553,0,1-0.447,1-1S38.553,49,38,49z"/>
|
||||
<path d="M38,52H28c-0.553,0-1,0.447-1,1s0.447,1,1,1h10c0.553,0,1-0.447,1-1S38.553,52,38,52z"/>
|
||||
<circle cx="4" cy="5" r="1"/>
|
||||
<circle cx="10" cy="5" r="1"/>
|
||||
<circle cx="7" cy="8" r="1"/>
|
||||
<circle cx="4" cy="11" r="1"/>
|
||||
<circle cx="10" cy="11" r="1"/>
|
||||
<circle cx="4" cy="17" r="1"/>
|
||||
<circle cx="10" cy="17" r="1"/>
|
||||
<circle cx="7" cy="14" r="1"/>
|
||||
<circle cx="7" cy="20" r="1"/>
|
||||
<circle cx="4" cy="23" r="1"/>
|
||||
<circle cx="10" cy="23" r="1"/>
|
||||
<circle cx="4" cy="29" r="1"/>
|
||||
<circle cx="10" cy="29" r="1"/>
|
||||
<circle cx="7" cy="26" r="1"/>
|
||||
<circle cx="7" cy="32" r="1"/>
|
||||
<circle cx="4" cy="35" r="1"/>
|
||||
<circle cx="10" cy="35" r="1"/>
|
||||
<circle cx="4" cy="41" r="1"/>
|
||||
<circle cx="10" cy="41" r="1"/>
|
||||
<circle cx="7" cy="38" r="1"/>
|
||||
<circle cx="7" cy="44" r="1"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.0 KiB |
45
res/icons/grid.svg
Normal file
45
res/icons/grid.svg
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<polygon points="32,32 64,32 64,0 0,0 0,64 32,64 "/>
|
||||
<path d="M96,0v32h64v128H32V96H0v416h512V0H96z M160,480H32V352h128V480z M160,320H32V192h128V320z M320,480H192V352h128V480z
|
||||
M320,320H192V192h128V320z M320,160H192V32h128V160z M480,480H352V352h128V480z M480,320H352V192h128V320z M480,160H352V32h128
|
||||
V160z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 899 B |
95
res/icons/mesh.svg
Normal file
95
res/icons/mesh.svg
Normal file
@@ -0,0 +1,95 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512.001 512.001" style="enable-background:new 0 0 512.001 512.001;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M502.119,377.125c-13.239,4.385-26.744,8.435-40.219,12.11c-3.507-9.345-11.323-16.593-21.017-19.323
|
||||
c-2.774-36.168-10.07-60.945-16.45-78.778c8.672-5.182,14.656-14.398,15.351-25.037c22.545-5.337,45.085-11.71,67.063-18.988
|
||||
c3.94-1.306,6.076-5.557,4.771-9.496c-1.305-3.941-5.557-6.075-9.496-4.772c-21.293,7.052-43.123,13.236-64.962,18.432
|
||||
c-4.909-11.068-15.995-18.813-28.862-18.813c-2.349,0-4.634,0.266-6.838,0.754c-6.71-18.498-13.386-41.911-16.034-75.265
|
||||
c12.649-3.858,21.943-15.461,22.346-29.258c33.444-6.48,66.758-15.161,99.075-25.863c3.888-1.287,6.059-5.61,4.771-9.497
|
||||
c-1.288-3.887-5.609-6.056-9.496-4.771c-31.799,10.531-64.582,19.068-97.491,25.431c-3.866-7.942-10.969-14.025-19.581-16.534
|
||||
c2.61-40.118,10.99-66.578,18.923-87.242c1.487-3.874-0.448-8.221-4.322-9.708c-3.876-1.484-8.222,0.448-9.709,4.322
|
||||
c-8.363,21.785-17.201,49.686-19.912,91.981c-12.963,2.595-23.081,13.156-25.017,26.342c-27.306,3.125-54.987,4.827-82.418,5.06
|
||||
c-2.911-11.795-12.467-20.999-24.456-23.391c2.003-43.955,10.44-71.458,19.328-94.607c1.487-3.874-0.448-8.221-4.322-9.708
|
||||
c-3.875-1.484-8.222,0.448-9.709,4.322c-8.984,23.404-18.364,53.608-20.373,100.665c-10.09,2.969-18.097,10.846-21.234,20.864
|
||||
c-27.676-1.925-55.475-5.348-82.802-10.204c-1.598-14.051-12.454-25.33-26.305-27.566c3.182-35.347,10.957-59.406,18.238-78.372
|
||||
c1.487-3.874-0.448-8.221-4.322-9.708c-3.875-1.485-8.222,0.447-9.709,4.322c-7.836,20.414-16.22,46.431-19.405,85.034
|
||||
c-7.099,2.419-13.069,7.293-16.886,13.614C43.593,99.086,26.545,94.08,9.881,88.56c-3.94-1.303-8.191,0.833-9.496,4.771
|
||||
c-1.305,3.941,0.832,8.192,4.771,9.497c16.752,5.548,33.885,10.589,51.019,15.021c-0.037,0.626-0.062,1.256-0.062,1.892
|
||||
c0,13.577,8.619,25.179,20.672,29.624c2.158,40.025,9.679,67.23,17.347,88.464c-5.418,3.65-9.644,8.935-11.971,15.141
|
||||
c-24.344-5.545-48.633-12.297-72.281-20.129c-3.943-1.305-8.192,0.832-9.496,4.772c-1.305,3.94,0.832,8.191,4.771,9.497
|
||||
c24.618,8.152,49.917,15.158,75.261,20.876c1.957,15.538,15.244,27.599,31.304,27.599c1.763,0,3.491-0.152,5.176-0.432
|
||||
c7.729,21.387,15.296,49.063,16.849,91.251c-8.552,2.878-15.479,9.316-19,17.554c-35.467-6.511-70.723-15.525-104.866-26.834
|
||||
c-3.94-1.304-8.191,0.832-9.497,4.771c-1.305,3.941,0.832,8.192,4.771,9.497c34.894,11.556,70.926,20.763,107.172,27.401
|
||||
c0.946,12.131,8.773,22.353,19.576,26.76c-2.182,20.197-6.034,38.282-12.039,56.597c-1.227,3.74,0.738,7.903,4.403,9.339
|
||||
c3.967,1.554,8.553-0.613,9.878-4.656c6.285-19.165,10.331-38.064,12.638-59.098c12.148-1.151,22.306-9.215,26.497-20.205
|
||||
c27.394,2.857,55.2,4.32,82.721,4.32c0.464,0,0.944-0.004,1.411-0.005c2.523,10.293,10.103,18.619,19.949,22.18
|
||||
c-2.294,16.908-5.798,32.293-10.989,48.125c-1.227,3.74,0.738,7.903,4.403,9.339c3.968,1.554,8.553-0.613,9.878-4.656
|
||||
c5.529-16.861,9.243-33.226,11.661-51.23c13.764-1.862,24.738-12.623,26.914-26.285c29.02-2.312,58.156-6.248,86.747-11.716
|
||||
c4.563,6.927,11.774,11.958,20.184,13.636c-1.726,25.98-5.975,48.633-13.28,70.912c-1.227,3.74,0.738,7.903,4.403,9.339
|
||||
c3.968,1.554,8.553-0.613,9.878-4.656c7.865-23.985,12.36-48.314,14.096-76.272c11.82-3.486,20.769-13.717,22.381-26.219
|
||||
c14.47-3.902,28.991-8.241,43.21-12.949c3.94-1.306,6.076-5.557,4.771-9.497C510.311,377.956,506.059,375.822,502.119,377.125z
|
||||
M408.298,247.49c9.116,0,16.532,7.416,16.532,16.532c0,9.116-7.416,16.532-16.532,16.532s-16.532-7.416-16.532-16.532
|
||||
S399.183,247.49,408.298,247.49z M376.236,111.224c9.116,0,16.532,7.416,16.532,16.532c0,9.116-7.416,16.532-16.532,16.532
|
||||
s-16.532-7.416-16.532-16.532C359.704,118.641,367.12,111.224,376.236,111.224z M231.955,119.24
|
||||
c9.116,0,16.532,7.416,16.532,16.532s-7.416,16.532-16.532,16.532c-9.116,0-16.532-7.416-16.532-16.532
|
||||
S222.84,119.24,231.955,119.24z M71.143,119.741c0-9.116,7.416-16.532,16.532-16.532s16.532,7.416,16.532,16.532
|
||||
s-7.416,16.532-16.532,16.532S71.143,128.857,71.143,119.741z M91.932,151.007c11.541-1.564,21.116-9.386,25.19-19.93
|
||||
c27.655,4.886,55.778,8.337,83.777,10.279c2.212,12.334,11.609,22.199,23.691,25.1c3.8,38.007,12.824,64.147,22.136,87.213
|
||||
c-6.473,4.256-11.297,10.822-13.278,18.521c-30.086-0.87-60.376-3.501-90.173-7.837c0.001-0.111,0.008-0.22,0.008-0.332
|
||||
c0-17.403-14.159-31.561-31.561-31.561c-1.175,0-2.335,0.07-3.477,0.195C101.128,212.919,94.154,187.742,91.932,151.007z
|
||||
M111.722,280.554c-9.116,0-16.532-7.416-16.532-16.532s7.416-16.532,16.532-16.532s16.532,7.416,16.532,16.532
|
||||
C128.254,273.137,120.837,280.554,111.722,280.554z M143.784,432.85c-9.116,0-16.532-7.416-16.532-16.532
|
||||
s7.416-16.532,16.532-16.532c9.116,0,16.532,7.416,16.532,16.532S152.9,432.85,143.784,432.85z M257.415,416.814
|
||||
c-0.468,0-0.949,0.005-1.414,0.005c-26.907,0-54.094-1.427-80.881-4.21c-1.65-14.025-12.526-25.265-26.38-27.459
|
||||
c-1.704-44.378-9.814-73.451-18.012-95.95c3.603-2.726,6.606-6.205,8.77-10.203c30.977,4.574,62.495,7.331,93.79,8.225
|
||||
c3.256,13.959,15.794,24.392,30.73,24.392c1.594,0,3.16-0.121,4.691-0.351c7.464,25.159,11.135,51.028,11.741,82.442
|
||||
C269.123,396.523,260.198,405.473,257.415,416.814z M247.486,280.053c0-9.116,7.416-16.532,16.532-16.532
|
||||
c9.116,0,16.532,7.416,16.532,16.532c0,9.116-7.416,16.532-16.532,16.532C254.902,296.585,247.486,289.169,247.486,280.053z
|
||||
M288.065,440.866c-9.116,0-16.532-7.416-16.532-16.532s7.416-16.532,16.532-16.532s16.532,7.416,16.532,16.532
|
||||
S297.18,440.866,288.065,440.866z M400.784,400.287c0,1.003,0.052,1.994,0.144,2.973c-27.352,5.149-55.197,8.871-82.933,11.08
|
||||
c-3.422-10.219-11.934-18.12-22.516-20.678c-0.636-33.137-4.734-61.405-12.811-88.167c6.138-4.512,10.59-11.185,12.223-18.89
|
||||
c11.2-0.548,22.5-1.327,33.661-2.347c4.133-0.378,7.177-4.034,6.799-8.167c-0.377-4.133-4.04-7.181-8.167-6.799
|
||||
c-10.865,0.993-21.864,1.752-32.769,2.288c-3.712-13.299-15.929-23.088-30.397-23.088c-1.05,0-2.088,0.054-3.112,0.154
|
||||
c-9.175-22.643-17.504-46.601-21.213-82.275c11.286-2.855,20.164-11.805,22.924-23.128c27.895-0.232,56.044-1.958,83.815-5.124
|
||||
c3.678,10.547,12.8,18.558,23.987,20.652c2.84,36.268,10.217,61.393,17.503,81.178c-6.624,5.616-10.904,13.908-11.161,23.192
|
||||
c-5.863,0.915-11.753,1.787-17.596,2.564c-4.114,0.547-7.007,4.324-6.46,8.439c0.502,3.778,3.729,6.526,7.439,6.526
|
||||
c0.33,0,0.663-0.021,0.999-0.066c6.241-0.829,12.536-1.763,18.795-2.746c5.136,10.486,15.918,17.726,28.36,17.726
|
||||
c0.587,0,1.17-0.019,1.75-0.051c6.014,16.706,12.953,39.922,15.723,73.885C411.514,372.453,400.784,385.138,400.784,400.287z
|
||||
M432.345,416.819c-9.116,0-16.532-7.416-16.532-16.532c0-9.116,7.416-16.532,16.532-16.532s16.532,7.416,16.532,16.532
|
||||
C448.877,409.402,441.461,416.819,432.345,416.819z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.0 KiB |
53
res/icons/perspective.svg
Normal file
53
res/icons/perspective.svg
Normal file
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 481.72 481.72" style="enable-background:new 0 0 481.72 481.72;" xml:space="preserve">
|
||||
<g>
|
||||
<path d="M474.993,412.91l-83.7-48.4l0.1-151.2c0-0.1,0-0.1,0-0.2c0-0.1,0-0.3,0-0.4c0-0.3,0-0.5-0.1-0.8c0-0.1,0-0.2,0-0.4
|
||||
c0-0.4-0.1-0.7-0.2-1c0-0.1-0.1-0.3-0.1-0.4c-0.1-0.3-0.1-0.6-0.2-0.8c0-0.1-0.1-0.2-0.1-0.3c-0.1-0.4-0.3-0.7-0.4-1.1
|
||||
c0-0.1-0.1-0.2-0.1-0.3c-0.2-0.4-0.3-0.7-0.5-1.1l0,0l0,0c-0.2-0.3-0.4-0.7-0.6-1c-0.1-0.1-0.1-0.2-0.2-0.3
|
||||
c-0.2-0.3-0.5-0.6-0.7-0.9c-0.1-0.1-0.2-0.2-0.2-0.2c-0.2-0.2-0.4-0.4-0.6-0.6c-0.1-0.1-0.2-0.2-0.3-0.3c-0.3-0.2-0.5-0.5-0.8-0.7
|
||||
c-0.1-0.1-0.2-0.2-0.3-0.2c-0.2-0.1-0.4-0.3-0.6-0.4c-0.1-0.1-0.3-0.2-0.4-0.2l-0.1-0.1l-131.5-76v-95.9c0-7.5-6-13.5-13.5-13.5
|
||||
s-13.5,6-13.5,13.5v96.7l-130.4,75.2l-0.1,0.1c-0.1,0.1-0.3,0.2-0.4,0.2c-0.2,0.1-0.4,0.3-0.6,0.4c-0.1,0.1-0.2,0.2-0.3,0.2
|
||||
c-0.3,0.2-0.5,0.4-0.8,0.7c-0.1,0.1-0.2,0.2-0.3,0.3c-0.2,0.2-0.4,0.4-0.6,0.6c-0.1,0.1-0.2,0.2-0.2,0.2c-0.2,0.3-0.5,0.6-0.7,0.9
|
||||
c-0.1,0.1-0.1,0.2-0.2,0.3c-0.5,0.7-0.9,1.4-1.2,2.1c0,0.1-0.1,0.2-0.1,0.3c-0.2,0.3-0.3,0.7-0.4,1.1c0,0.1-0.1,0.2-0.1,0.3
|
||||
c-0.1,0.3-0.2,0.6-0.2,0.8c0,0.1-0.1,0.3-0.1,0.4c-0.1,0.3-0.1,0.7-0.2,1.1c0,0.1,0,0.2,0,0.4c0,0.3,0,0.5-0.1,0.8
|
||||
c0,0.1,0,0.3,0,0.4c0,0.1,0,0.1,0,0.2l-0.1,152.3l-82.5,47.6c-6.5,3.7-8.7,12-5,18.4c2.5,4.3,7,6.8,11.7,6.8c2.3,0,4.6-0.6,6.7-1.8
|
||||
l83.4-48.1l129.9,75.1c0,0,0.1,0,0.1,0.1c0.5,0.3,1,0.5,1.5,0.7h0.1c0.5,0.2,0.9,0.3,1.4,0.5c0.1,0,0.3,0.1,0.4,0.1
|
||||
c0.4,0.1,0.8,0.2,1.2,0.2c0.1,0,0.3,0,0.4,0.1c0.5,0.1,1.1,0.1,1.6,0.1l0,0c0.5,0,1.1,0,1.6-0.1c0.1,0,0.3,0,0.4-0.1
|
||||
c0.4-0.1,0.8-0.1,1.2-0.2c0.1,0,0.3-0.1,0.4-0.1c0.5-0.1,1-0.3,1.4-0.5h0.1c0.5-0.2,1-0.5,1.5-0.7c0,0,0.1,0,0.1-0.1l131-75.5
|
||||
l83.7,48.4c2.1,1.2,4.5,1.8,6.7,1.8c4.7,0,9.2-2.4,11.7-6.7C483.593,424.91,481.393,416.61,474.993,412.91z M226.593,428.41
|
||||
l-110.6-64l0.1-127.8l110.6,64L226.593,428.41z M240.093,277.21l-110.6-64l110.7-63.8l110.6,64L240.093,277.21z M364.293,364.51
|
||||
l-110.7,63.8l0.1-127.8l110.6-63.8V364.51z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
Reference in New Issue
Block a user