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