QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
CityMapGeometry.cc
Go to the documentation of this file.
1#include "CityMapGeometry.h"
2
3#include "Fact.h"
4#include "OsmParser.h"
6#include "SettingsManager.h"
8#include "Viewer3DSettings.h"
9
10QGC_LOGGING_CATEGORY(CityMapGeometryLog, "Viewer3d.CityMapGeometry")
11
13 : _modelName(QStringLiteral("city_map_default_name"))
14{
16
17 _setOsmFilePath(viewer3DSettings->osmFilePath()->rawValue());
18 connect(viewer3DSettings->osmFilePath(), &Fact::rawValueChanged, this, &CityMapGeometry::_setOsmFilePath);
19}
20
21void CityMapGeometry::setModelName(const QString &modelName)
22{
23 if (_modelName == modelName) {
24 return;
25 }
26 _modelName = modelName;
27 emit modelNameChanged();
28}
29
30void CityMapGeometry::_setOsmFilePath(const QVariant &value)
31{
32 _clearViewer();
33 _osmFilePath = value.toString();
34 qCDebug(CityMapGeometryLog) << "OSM file path set to:" << _osmFilePath;
35 emit osmFilePathChanged();
36 _loadOsmMap();
37}
38
40{
41 if (_mapProvider == newMapProvider) {
42 return;
43 }
44
45 if (_osmParser) {
46 disconnect(_osmParser, &OsmParser::buildingLevelHeightChanged, this, &CityMapGeometry::_updateViewer);
47 }
48 if (_mapProvider) {
49 disconnect(_mapProvider, &Viewer3DMapProvider::mapChanged, this, &CityMapGeometry::_updateViewer);
50 }
51
52 _mapProvider = newMapProvider;
53 _osmParser = qobject_cast<OsmParser*>(_mapProvider);
54
55 if (_osmParser) {
56 connect(_osmParser, &OsmParser::buildingLevelHeightChanged, this, &CityMapGeometry::_updateViewer);
57 }
58 if (_mapProvider) {
59 connect(_mapProvider, &Viewer3DMapProvider::mapChanged, this, &CityMapGeometry::_updateViewer);
60 }
61
62 emit mapProviderChanged();
63 _loadOsmMap();
64}
65
66bool CityMapGeometry::_loadOsmMap()
67{
68 if (!_osmParser) {
69 return false;
70 }
71
72 _osmParser->parseOsmFile(_osmFilePath);
73 return true;
74}
75
76void CityMapGeometry::_updateViewer()
77{
78 clear();
79
80 if (!_osmParser) {
81 qCDebug(CityMapGeometryLog) << "updateViewer: no OSM parser set";
82 return;
83 }
84
85 if (_osmParser->mapLoaded()) {
86 _vertexData = _osmParser->buildingToMesh();
87 qCDebug(CityMapGeometryLog) << "Building mesh generated:" << _vertexData.size() << "bytes";
88
89 constexpr int stride = 3 * sizeof(float);
90 if (!_vertexData.isEmpty()) {
91 setVertexData(_vertexData);
92 setStride(stride);
93 setPrimitiveType(QQuick3DGeometry::PrimitiveType::Triangles);
94 addAttribute(QQuick3DGeometry::Attribute::PositionSemantic,
95 0,
96 QQuick3DGeometry::Attribute::F32Type);
97 }
98 update();
99 }
100}
101
102void CityMapGeometry::_clearViewer()
103{
104 clear();
105 _vertexData.clear();
106 update();
107}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void osmFilePathChanged()
QString modelName() const
void mapProviderChanged()
void setMapProvider(Viewer3DMapProvider *newMapProvider)
void modelNameChanged()
void setModelName(const QString &modelName)
void rawValueChanged(const QVariant &value)
void parseOsmFile(const QString &filePath)
Definition OsmParser.cc:72
void buildingLevelHeightChanged()
bool mapLoaded() const override
Definition OsmParser.h:28
QByteArray buildingToMesh()
Definition OsmParser.cc:81
Viewer3DSettings * viewer3DSettings() const
static SettingsManager * instance()