QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
Viewer3DTerrainTexture.cc
Go to the documentation of this file.
2
3#include "FlightMapSettings.h"
5#include "QGCMapEngine.h"
6#include "QGCMapUrlEngine.h"
7#include "SettingsManager.h"
9
10QGC_LOGGING_CATEGORY(Viewer3DTerrainTextureLog, "Viewer3d.Viewer3DTerrainTexture")
11
13 : _flightMapSettings(SettingsManager::instance()->flightMapSettings())
14{
15 _onMapTypeChanged();
16
17 connect(_flightMapSettings->mapType(), &Fact::rawValueChanged, this, &Viewer3DTerrainTexture::_onMapTypeChanged);
18}
19
20void Viewer3DTerrainTexture::loadTexture()
21{
22 _setTextureLoaded(false);
23 setTextureGeometryDone(false);
24 setTextureDownloadProgress(0.0f);
25
26 if (!_mapProvider || !_mapProvider->mapLoaded()) {
27 qCDebug(Viewer3DTerrainTextureLog) << "loadTexture: no map provider or map not loaded";
28 return;
29 }
30
31 if (!_terrainTileLoader) {
32 _terrainTileLoader = new Viewer3DTileQuery(this);
33 }
34
35 connect(_terrainTileLoader, &Viewer3DTileQuery::loadingMapCompleted, this, &Viewer3DTerrainTexture::_updateTexture, Qt::UniqueConnection);
36 connect(_terrainTileLoader, &Viewer3DTileQuery::textureGeometryReady, this, &Viewer3DTerrainTexture::setTextureGeometry, Qt::UniqueConnection);
37 connect(_terrainTileLoader, &Viewer3DTileQuery::mapTileDownloaded, this, &Viewer3DTerrainTexture::setTextureDownloadProgress, Qt::UniqueConnection);
38
39 const auto [bbMin, bbMax] = _mapProvider->mapBoundingBox();
40 _terrainTileLoader->adaptiveMapTilesLoader(_mapType, _mapId, bbMin, bbMax);
41}
42
43void Viewer3DTerrainTexture::_updateTexture()
44{
45 qCDebug(Viewer3DTerrainTextureLog) << "Texture loaded:" << _terrainTileLoader->mapSize();
46 setSize(_terrainTileLoader->mapSize());
47 setFormat(QQuick3DTextureData::RGBA32F);
48 setHasTransparency(false);
49
50 setTextureData(_terrainTileLoader->mapData());
51 _setTextureLoaded(true);
52 setTextureGeometryDone(true);
53 disconnect(_terrainTileLoader, &Viewer3DTileQuery::mapTileDownloaded, this, &Viewer3DTerrainTexture::setTextureDownloadProgress);
54 disconnect(_terrainTileLoader, &Viewer3DTileQuery::loadingMapCompleted, this, &Viewer3DTerrainTexture::_updateTexture);
55
56 _terrainTileLoader->deleteLater();
57 _terrainTileLoader = nullptr;
58 setTextureDownloadProgress(100.0f);
59}
60
61void Viewer3DTerrainTexture::_onMapTypeChanged()
62{
63 _mapType = _flightMapSettings->mapProvider()->rawValue().toString()
64 + QStringLiteral(" ")
65 + _flightMapSettings->mapType()->rawValue().toString();
66
67 const int mapId = UrlFactory::getQtMapIdFromProviderType(_mapType);
68
69 if (mapId == _mapId) {
70 return;
71 }
72
73 qCDebug(Viewer3DTerrainTextureLog) << "Map type changed:" << _mapType << "mapId:" << mapId;
74 _mapId = mapId;
75 loadTexture();
76}
77
78void Viewer3DTerrainTexture::setRoiMinCoordinate(const QGeoCoordinate &newRoiMinCoordinate)
79{
80 if (_roiMinCoordinate == newRoiMinCoordinate) {
81 return;
82 }
83 _roiMinCoordinate = newRoiMinCoordinate;
85}
86
87void Viewer3DTerrainTexture::setRoiMaxCoordinate(const QGeoCoordinate &newRoiMaxCoordinate)
88{
89 if (_roiMaxCoordinate == newRoiMaxCoordinate) {
90 return;
91 }
92 _roiMaxCoordinate = newRoiMaxCoordinate;
94}
95
96void Viewer3DTerrainTexture::setMapProvider(Viewer3DMapProvider *newMapProvider)
97{
98 if (_mapProvider == newMapProvider) {
99 return;
100 }
101
102 if (_mapProvider) {
103 disconnect(_mapProvider, &Viewer3DMapProvider::mapChanged, this, &Viewer3DTerrainTexture::loadTexture);
104 }
105
106 _mapProvider = newMapProvider;
107
108 if (_mapProvider) {
109 connect(_mapProvider, &Viewer3DMapProvider::mapChanged, this, &Viewer3DTerrainTexture::loadTexture);
110 // Handle late binding: provider may already have a loaded map before this object is wired.
111 loadTexture();
112 }
113
114 emit mapProviderChanged();
115}
116
117void Viewer3DTerrainTexture::setTileCount(const QSize &newTileCount)
118{
119 if (_tileCount == newTileCount) {
120 return;
121 }
122 _tileCount = newTileCount;
123 emit tileCountChanged();
124}
125
126void Viewer3DTerrainTexture::setTextureGeometryDone(bool newTextureGeometryDone)
127{
128 if (_textureGeometryDone == newTextureGeometryDone) {
129 return;
130 }
131 _textureGeometryDone = newTextureGeometryDone;
133}
134
135void Viewer3DTerrainTexture::setTextureDownloadProgress(float newTextureDownloadProgress)
136{
137 if (qFuzzyCompare(_textureDownloadProgress, newTextureDownloadProgress)) {
138 return;
139 }
140 _textureDownloadProgress = newTextureDownloadProgress;
142}
143
144void Viewer3DTerrainTexture::setTextureGeometry(const Viewer3DTileQuery::TileStatistics_t &tileInfo)
145{
146 setRoiMinCoordinate(tileInfo.coordinateMin);
147 setRoiMaxCoordinate(tileInfo.coordinateMax);
148 setTileCount(tileInfo.tileCounts);
149}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void rawValueChanged(const QVariant &value)
Fact *mapType READ mapType CONSTANT Fact * mapType()
Fact *mapProvider READ mapProvider CONSTANT Fact * mapProvider()
Provides access to all app settings.
static int getQtMapIdFromProviderType(QStringView type)
virtual std::pair< QGeoCoordinate, QGeoCoordinate > mapBoundingBox() const =0
virtual bool mapLoaded() const =0
void textureDownloadProgressChanged()
void textureGeometryReady(TileStatistics_t tileInfo)
void mapTileDownloaded(float progress)
void adaptiveMapTilesLoader(const QString &mapType, int mapId, const QGeoCoordinate &coordinateMin, const QGeoCoordinate &coordinateMax)
QByteArray mapData() const
QSize mapSize() const
void loadingMapCompleted()