/**************************************************************************** ** ** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtLocation module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QGEOTILEDMAPSCENE_P_P_H #define QGEOTILEDMAPSCENE_P_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qgeotiledmapscene_p.h" #include "qgeocameradata_p.h" #include "qgeotilespec_p.h" #include #include #include #include QT_BEGIN_NAMESPACE class Q_LOCATION_PRIVATE_EXPORT QGeoTiledMapTileContainerNode : public QSGTransformNode { public: void addChild(const QGeoTileSpec &spec, QSGImageNode *node) { tiles.insert(spec, node); appendChildNode(node); } QHash tiles; }; class Q_LOCATION_PRIVATE_EXPORT QGeoTiledMapRootNode : public QSGClipNode { public: QGeoTiledMapRootNode() : isTextureLinear(false) , geometry(QSGGeometry::defaultAttributes_Point2D(), 4) , root(new QSGTransformNode()) , tiles(new QGeoTiledMapTileContainerNode()) , wrapLeft(new QGeoTiledMapTileContainerNode()) , wrapRight(new QGeoTiledMapTileContainerNode()) { setIsRectangular(true); setGeometry(&geometry); root->appendChildNode(tiles); root->appendChildNode(wrapLeft); root->appendChildNode(wrapRight); appendChildNode(root); } ~QGeoTiledMapRootNode() { qDeleteAll(textures); } void setClipRect(const QRect &rect) { if (rect != clipRect) { QSGGeometry::updateRectGeometry(&geometry, rect); QSGClipNode::setClipRect(rect); clipRect = rect; markDirty(DirtyGeometry); } } void updateTiles(QGeoTiledMapTileContainerNode *root, QGeoTiledMapScenePrivate *d, double camAdjust, QQuickWindow *window); bool isTextureLinear; QSGGeometry geometry; QRect clipRect; QSGTransformNode *root; QGeoTiledMapTileContainerNode *tiles; // The majority of the tiles QGeoTiledMapTileContainerNode *wrapLeft; // When zoomed out, the tiles that wrap around on the left. QGeoTiledMapTileContainerNode *wrapRight; // When zoomed out, the tiles that wrap around on the right QHash textures; #ifdef QT_LOCATION_DEBUG double m_sideLengthPixel; QMap> m_droppedTiles; #endif }; class Q_LOCATION_PRIVATE_EXPORT QGeoTiledMapScenePrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QGeoTiledMapScene) public: QGeoTiledMapScenePrivate(); ~QGeoTiledMapScenePrivate(); void addTile(const QGeoTileSpec &spec, QSharedPointer texture); void setVisibleTiles(const QSet &visibleTiles); void removeTiles(const QSet &oldTiles); bool buildGeometry(const QGeoTileSpec &spec, QSGImageNode *imageNode, bool &overzooming); void updateTileBounds(const QSet &tiles); void setupCamera(); inline bool isTiltedOrRotated() const { return (m_cameraData.tilt() > 0.0) || (m_cameraData.bearing() > 0.0); } public: QSize m_screenSize; // in pixels int m_tileSize = 0; // the pixel resolution for each tile QGeoCameraData m_cameraData; QRectF m_visibleArea; QSet m_visibleTiles; QDoubleVector3D m_cameraUp; QDoubleVector3D m_cameraEye; QDoubleVector3D m_cameraCenter; QMatrix4x4 m_projectionMatrix; // scales up the tile geometry and the camera altitude, resulting in no visible effect // other than to control the accuracy of the render by keeping the values in a sensible range double m_scaleFactor = #ifdef QT_LOCATION_DEBUG 1.0; #else 10.0; #endif // rounded down, positive zoom is zooming in, corresponding to reduced altitude int m_intZoomLevel = 0; // mercatorToGrid transform // the number of tiles in each direction for the whole map (earth) at the current zoom level. // it is 1< > m_textures; QList m_updatedTextures; // tilesToGrid transform int m_minTileX = -1; // the minimum tile index, i.e. 0 to sideLength which is 1<< zoomLevel int m_minTileY = -1; int m_maxTileX = -1; int m_maxTileY = -1; int m_tileXWrapsBelow = 0; // the wrap point as a tile index bool m_linearScaling = false; bool m_dropTextures = false; #ifdef QT_LOCATION_DEBUG double m_sideLengthPixel; QGeoTiledMapRootNode *m_mapRoot = nullptr; #endif }; QT_END_NAMESPACE #endif // QGEOTILEDMAPSCENE_P_P_H