56QSGNode *QGeoMapMapboxGLPrivate::updateSceneGraph(QSGNode *node, QQuickWindow *window)
60 if (m_viewportSize.isEmpty()) {
65 QMapboxGL *map =
nullptr;
67 QOpenGLContext *currentCtx = QOpenGLContext::currentContext();
69 qWarning(
"QOpenGLContext is NULL!");
70 qWarning() <<
"You are running on QSG backend " << QSGContext::backend();
71 qWarning(
"The MapboxGL plugin works with both Desktop and ES 2.0+ OpenGL versions.");
72 qWarning(
"Verify that your Qt is built with OpenGL, and what kind of OpenGL.");
73 qWarning(
"To force using a specific OpenGL version, check QSurfaceFormat::setRenderableType and QSurfaceFormat::setDefaultFormat");
78 QSGMapboxGLTextureNode *mbglNode =
new QSGMapboxGLTextureNode(m_settings, m_viewportSize, window->devicePixelRatio(), q);
79 QObject::connect(mbglNode->map(), &QMapboxGL::mapChanged, q, &QGeoMapMapboxGL::onMapChanged);
80 m_syncState = MapTypeSync | CameraDataSync | ViewportSync | VisibleAreaSync;
83 QSGMapboxGLRenderNode *mbglNode =
new QSGMapboxGLRenderNode(m_settings, m_viewportSize, window->devicePixelRatio(), q);
84 QObject::connect(mbglNode->map(), &QMapboxGL::mapChanged, q, &QGeoMapMapboxGL::onMapChanged);
85 m_syncState = MapTypeSync | CameraDataSync | ViewportSync | VisibleAreaSync;
89 map = (m_useFBO) ?
static_cast<QSGMapboxGLTextureNode *>(node)->map()
90 :
static_cast<QSGMapboxGLRenderNode *>(node)->map();
92 if (m_syncState & MapTypeSync) {
93 m_developmentMode = m_activeMapType.name().startsWith(
"mapbox://")
94 && m_settings.accessToken() == developmentToken;
96 map->setStyleUrl(m_activeMapType.name());
99 if (m_syncState & VisibleAreaSync) {
100 if (m_visibleArea.isEmpty()) {
101 map->setMargins(QMargins());
103 QMargins margins(m_visibleArea.x(),
105 m_viewportSize.width() - m_visibleArea.width() - m_visibleArea.x(),
106 m_viewportSize.height() - m_visibleArea.height() - m_visibleArea.y());
107 map->setMargins(margins);
111 if (m_syncState & CameraDataSync || m_syncState & VisibleAreaSync) {
112 map->setZoom(zoomLevelFrom256(m_cameraData.zoomLevel() ,
MBGL_TILE_SIZE));
113 map->setBearing(m_cameraData.bearing());
114 map->setPitch(m_cameraData.tilt());
116 QGeoCoordinate coordinate = m_cameraData.center();
117 map->setCoordinate(QMapbox::Coordinate(coordinate.latitude(), coordinate.longitude()));
120 if (m_syncState & ViewportSync) {
122 static_cast<QSGMapboxGLTextureNode *>(node)->resize(m_viewportSize, window->devicePixelRatio());
124 map->resize(m_viewportSize);
129 syncStyleChanges(map);
133 static_cast<QSGMapboxGLTextureNode *>(node)->render(window);
136 threadedRenderingHack(window, map);
138 m_syncState = NoSync;
148void QGeoMapMapboxGLPrivate::addMapItem(QDeclarativeGeoMapItemBase *item)
150 Q_Q(QGeoMapMapboxGL);
152 switch (item->itemType()) {
153 case QGeoMap::NoItem:
154 case QGeoMap::MapQuickItem:
155 case QGeoMap::CustomMapItem:
157 case QGeoMap::MapRectangle: {
158 QDeclarativeRectangleMapItem *mapItem =
static_cast<QDeclarativeRectangleMapItem *>(item);
159 QObject::connect(mapItem, &QQuickItem::visibleChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
160 QObject::connect(mapItem, &QDeclarativeGeoMapItemBase::mapItemOpacityChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
161 QObject::connect(mapItem, &QDeclarativeRectangleMapItem::bottomRightChanged, q, &QGeoMapMapboxGL::onMapItemGeometryChanged);
162 QObject::connect(mapItem, &QDeclarativeRectangleMapItem::topLeftChanged, q, &QGeoMapMapboxGL::onMapItemGeometryChanged);
163 QObject::connect(mapItem, &QDeclarativeRectangleMapItem::colorChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
164 QObject::connect(mapItem->border(), &QDeclarativeMapLineProperties::colorChanged, q, &QGeoMapMapboxGL::onMapItemSubPropertyChanged);
165 QObject::connect(mapItem->border(), &QDeclarativeMapLineProperties::widthChanged, q, &QGeoMapMapboxGL::onMapItemUnsupportedPropertyChanged);
167 case QGeoMap::MapCircle: {
168 QDeclarativeCircleMapItem *mapItem =
static_cast<QDeclarativeCircleMapItem *>(item);
169 QObject::connect(mapItem, &QQuickItem::visibleChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
170 QObject::connect(mapItem, &QDeclarativeGeoMapItemBase::mapItemOpacityChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
171 QObject::connect(mapItem, &QDeclarativeCircleMapItem::centerChanged, q, &QGeoMapMapboxGL::onMapItemGeometryChanged);
172 QObject::connect(mapItem, &QDeclarativeCircleMapItem::radiusChanged, q, &QGeoMapMapboxGL::onMapItemGeometryChanged);
173 QObject::connect(mapItem, &QDeclarativeCircleMapItem::colorChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
174 QObject::connect(mapItem->border(), &QDeclarativeMapLineProperties::colorChanged, q, &QGeoMapMapboxGL::onMapItemSubPropertyChanged);
175 QObject::connect(mapItem->border(), &QDeclarativeMapLineProperties::widthChanged, q, &QGeoMapMapboxGL::onMapItemUnsupportedPropertyChanged);
177 case QGeoMap::MapPolygon: {
178 QDeclarativePolygonMapItem *mapItem =
static_cast<QDeclarativePolygonMapItem *>(item);
179 QObject::connect(mapItem, &QQuickItem::visibleChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
180 QObject::connect(mapItem, &QDeclarativeGeoMapItemBase::mapItemOpacityChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
181 QObject::connect(mapItem, &QDeclarativePolygonMapItem::pathChanged, q, &QGeoMapMapboxGL::onMapItemGeometryChanged);
182 QObject::connect(mapItem, &QDeclarativePolygonMapItem::colorChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
183 QObject::connect(mapItem->border(), &QDeclarativeMapLineProperties::colorChanged, q, &QGeoMapMapboxGL::onMapItemSubPropertyChanged);
184 QObject::connect(mapItem->border(), &QDeclarativeMapLineProperties::widthChanged, q, &QGeoMapMapboxGL::onMapItemUnsupportedPropertyChanged);
186 case QGeoMap::MapPolyline: {
187 QDeclarativePolylineMapItem *mapItem =
static_cast<QDeclarativePolylineMapItem *>(item);
188 QObject::connect(mapItem, &QQuickItem::visibleChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
189 QObject::connect(mapItem, &QDeclarativeGeoMapItemBase::mapItemOpacityChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
190 QObject::connect(mapItem, &QDeclarativePolylineMapItem::pathChanged, q, &QGeoMapMapboxGL::onMapItemGeometryChanged);
191 QObject::connect(mapItem->line(), &QDeclarativeMapLineProperties::colorChanged, q, &QGeoMapMapboxGL::onMapItemSubPropertyChanged);
192 QObject::connect(mapItem->line(), &QDeclarativeMapLineProperties::widthChanged, q, &QGeoMapMapboxGL::onMapItemSubPropertyChanged);
196 QObject::connect(item, &QDeclarativeGeoMapItemBase::mapItemOpacityChanged, q, &QGeoMapMapboxGL::onMapItemPropertyChanged);
198 m_styleChanges << QMapboxGLStyleChange::addMapItem(item, m_mapItemsBefore);
200 emit q->sgNodeChanged();