diff options
Diffstat (limited to 'src/location/quickmapitems/qdeclarativepolylinemapitem_p_p.h')
-rw-r--r-- | src/location/quickmapitems/qdeclarativepolylinemapitem_p_p.h | 508 |
1 files changed, 2 insertions, 506 deletions
diff --git a/src/location/quickmapitems/qdeclarativepolylinemapitem_p_p.h b/src/location/quickmapitems/qdeclarativepolylinemapitem_p_p.h index 3a446a10..676e6f71 100644 --- a/src/location/quickmapitems/qdeclarativepolylinemapitem_p_p.h +++ b/src/location/quickmapitems/qdeclarativepolylinemapitem_p_p.h @@ -52,28 +52,20 @@ // We mean it. // -#include <QSharedPointer> #include <QtCore/QScopedValueRollback> #include <QSGGeometryNode> #include <QSGFlatColorMaterial> -#include <QSGMaterialShader> -#include <QtPositioning/QGeoPath> -#include <QtPositioning/QGeoPolygon> -#include <QtPositioning/QGeoRectangle> -#include <QtPositioning/QGeoCircle> #include <QtLocation/private/qlocationglobal_p.h> #include <QtLocation/private/qdeclarativepolylinemapitem_p.h> -#include <QtLocation/private/qdeclarativegeomapitemutils_p.h> -#include <QtLocation/private/qdeclarativepolylinemapitem_p.h> #include <QtLocation/private/qgeomapitemgeometry_p.h> #include <QtPositioning/private/qdoublevector2d_p.h> -#include <array> - QT_BEGIN_NAMESPACE +class QSGMaterialShader; + class Q_LOCATION_PRIVATE_EXPORT QGeoMapPolylineGeometry : public QGeoMapItemGeometry { public: @@ -135,72 +127,6 @@ public: bool isSubtreeBlocked() const override; }; -class Q_LOCATION_PRIVATE_EXPORT MapPolylineMaterial : public QSGFlatColorMaterial -{ -public: - MapPolylineMaterial() - : QSGFlatColorMaterial() - { - // Passing RequiresFullMatrix is essential in order to prevent the - // batch renderer from baking in simple, translate-only transforms into - // the vertex data. The shader will rely on the fact that - // vertexCoord.xy is the Shape-space coordinate and so no modifications - // are welcome. - setFlag(Blending | RequiresFullMatrix); - } - - QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const override; - - void setGeoProjection(const QMatrix4x4 &p) - { - m_geoProjection = p; - } - - QMatrix4x4 geoProjection() const - { - return m_geoProjection; - } - - void setCenter(const QDoubleVector3D &c) - { - m_center = c; - } - - QDoubleVector3D center() const - { - return m_center; - } - - int wrapOffset() const - { - return m_wrapOffset; - } - - void setWrapOffset(int wrapOffset) - { - m_wrapOffset = wrapOffset; - } - - void setLineWidth(float lw) - { - m_lineWidth = lw; - } - - float lineWidth() const - { - return m_lineWidth; - } - - QSGMaterialType *type() const override; - int compare(const QSGMaterial *other) const override; - -protected: - QMatrix4x4 m_geoProjection; - QDoubleVector3D m_center; - int m_wrapOffset = 0; - float m_lineWidth = 1.0; -}; - class Q_LOCATION_PRIVATE_EXPORT MapPolylineNode : public MapItemGeometryNode { public: @@ -214,272 +140,6 @@ protected: QSGGeometry geometry_; }; -class Q_LOCATION_PRIVATE_EXPORT QGeoMapItemLODGeometry -{ -public: - mutable std::array<QSharedPointer<QList<QDeclarativeGeoMapItemUtils::vec2>>, 7> - m_verticesLOD; // fix it to 7, - // do not allow simplifications beyond ZL 20. This could actually be - // limited even further - mutable QList<QDeclarativeGeoMapItemUtils::vec2> *m_screenVertices; - mutable QSharedPointer<unsigned int> m_working; - - QGeoMapItemLODGeometry() - { - resetLOD(); - } - - void resetLOD() - { - // New pointer, some old LOD task might still be running and operating on the old pointers. - m_verticesLOD[0] = QSharedPointer<QList<QDeclarativeGeoMapItemUtils::vec2>>( - new QList<QDeclarativeGeoMapItemUtils::vec2>); - for (unsigned int i = 1; i < m_verticesLOD.size(); ++i) - m_verticesLOD[i] = nullptr; // allocate on first use - m_screenVertices = m_verticesLOD.front().data(); // resetting pointer to data to be LOD 0 - } - - static unsigned int zoomToLOD(unsigned int zoom); - - static unsigned int zoomForLOD(unsigned int zoom); - - bool isLODActive(unsigned int lod) const; - - void selectLOD(unsigned int zoom, double leftBound, bool /*closed*/); - - static QList<QDeclarativeGeoMapItemUtils::vec2> - getSimplified(QList<QDeclarativeGeoMapItemUtils::vec2> &wrappedPath, double leftBoundWrapped, - unsigned int zoom); - - static void enqueueSimplificationTask( - const QSharedPointer<QList<QDeclarativeGeoMapItemUtils::vec2>> - &input, // reference as it gets copied in the nested call - const QSharedPointer<QList<QDeclarativeGeoMapItemUtils::vec2>> &output, - double leftBound, unsigned int zoom, QSharedPointer<unsigned int> &working); - - void selectLODOnDataChanged(unsigned int zoom, double leftBound) const; - - bool selectLODOnLODMismatch(unsigned int zoom, double leftBound, bool closed) const - { - if (*m_working > 0) { - return false; - } - const_cast<QGeoMapItemLODGeometry *>(this)->selectLOD(zoom, - leftBound, - closed); - return true; - } -}; - -class Q_LOCATION_PRIVATE_EXPORT QGeoMapPolylineGeometryOpenGL : public QGeoMapItemGeometry, public QGeoMapItemLODGeometry -{ -public: - typedef struct { - QList<QDoubleVector2D> wrappedBboxes; - } WrappedPolyline; - - QGeoMapPolylineGeometryOpenGL() - { - m_working = QSharedPointer<unsigned int>(new unsigned int(0)); - } - - void updateSourcePoints(const QGeoMap &map, - const QGeoPolygon &poly); - - void updateSourcePoints(const QGeoMap &map, - const QGeoPath &poly); - - void updateSourcePoints(const QGeoProjectionWebMercator &p, - const QList<QDoubleVector2D> &wrappedPath, - const QGeoRectangle &boundingRectangle); - - void updateSourcePoints(const QGeoMap &map, - const QGeoRectangle &rect); - - void updateSourcePoints(const QGeoMap &map, - const QGeoCircle &circle); - - void updateScreenPoints(const QGeoMap &map, - qreal strokeWidth, - bool adjustTranslation = true); - - void updateQuickGeometry(const QGeoProjectionWebMercator &p, qreal strokeWidth = 0.0); - - bool allocateAndFillEntries(QSGGeometry *geom, - bool closed = false, - unsigned int zoom = 0) const; - void allocateAndFillLineStrip(QSGGeometry *geom, - int lod = 0) const; - - bool contains(const QPointF &point) const override - { - Q_UNUSED(point); - return false; - } - - static double distanceTo(const QDoubleVector2D &a, const QDoubleVector2D &b, const QDoubleVector2D &p) - { - double u = ((p.x() - a.x()) * (b.x() - a.x()) + (p.y() - a.y()) * (b.y() - a.y()) ) / (b - a).lengthSquared(); - QDoubleVector2D intersection(a.x() + u * (b.x() - a.x()) , a.y() + u * (b.y() - a.y()) ); - - QDoubleVector2D candidate = ( (p-a).length() < (p-b).length() ) ? a : b; - - if (u > 0 && u < 1 - && (p-intersection).length() < (p-candidate).length() ) // And it falls in the segment - candidate = intersection; - - return qAbs((candidate - p).length()); - } - // Note: this is also slightly incorrect on joins and in the beginning/end of the line - bool contains(const QPointF &point, qreal lineWidth, const QGeoProjectionWebMercator &p) const - { - const double lineHalfWidth = lineWidth * 0.5; - const QDoubleVector2D pt(point); - QDoubleVector2D a; - if (m_screenVertices->size()) - a = p.wrappedMapProjectionToItemPosition(p.wrapMapProjection(m_screenVertices->first().toDoubleVector2D())); - QDoubleVector2D b; - for (qsizetype i = 1; i < m_screenVertices->size(); ++i) { - const auto &screenVertice = m_screenVertices->at(i); - if (!a.isFinite()) { - a = p.wrappedMapProjectionToItemPosition(p.wrapMapProjection(screenVertice.toDoubleVector2D())); - continue; - } - - b = p.wrappedMapProjectionToItemPosition(p.wrapMapProjection(screenVertice.toDoubleVector2D())); - if (!b.isFinite()) { - a = b; - continue; - } - - if (b == a) - continue; - - // Heavily simplifying it here: if a point is not projectable, skip the segment. - // For a correct solution, the segment should be clipped instead. - if (distanceTo(a, b, pt) <= lineHalfWidth) - return true; - - a = b; - } - return false; - } - -public: - QDoubleVector2D m_bboxLeftBoundWrapped; - QList<WrappedPolyline> m_wrappedPolygons; - int m_wrapOffset; - - friend class QDeclarativeCircleMapItem; - friend class QDeclarativePolygonMapItem; - friend class QDeclarativeRectangleMapItem; -}; - -class Q_LOCATION_PRIVATE_EXPORT MapPolylineShaderLineStrip : public QSGMaterialShader -{ -public: - MapPolylineShaderLineStrip(); - - bool updateUniformData(RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) override; -}; - -class Q_LOCATION_PRIVATE_EXPORT MapPolylineShaderExtruded : public QSGMaterialShader -{ -public: - MapPolylineShaderExtruded(); - - bool updateUniformData(RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) override; -}; - -class Q_LOCATION_PRIVATE_EXPORT MapPolylineNodeOpenGLLineStrip : public MapItemGeometryNode -{ -public: - MapPolylineNodeOpenGLLineStrip(); - ~MapPolylineNodeOpenGLLineStrip() override; - - void update(const QColor &fillColor, - const qreal lineWidth, - const QGeoMapPolylineGeometryOpenGL *shape, - const QMatrix4x4 &geoProjection, - const QDoubleVector3D ¢er, - const Qt::PenCapStyle capStyle = Qt::SquareCap); - -protected: - MapPolylineMaterial fill_material_; - QSGGeometry geometry_; -}; - -class Q_LOCATION_PRIVATE_EXPORT MapPolylineMaterialExtruded : public MapPolylineMaterial -{ -public: - MapPolylineMaterialExtruded() : MapPolylineMaterial() - { - - } - QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const override; - - void setMiter(int m) - { - m_miter = m; - } - - int miter() const - { - return m_miter; - } - - QSGMaterialType *type() const override; - int compare(const QSGMaterial *other) const override; - - int m_miter = 0; -}; - -class Q_LOCATION_PRIVATE_EXPORT MapPolylineNodeOpenGLExtruded : public MapItemGeometryNode -{ -public: - - typedef struct MapPolylineEntry { - QDeclarativeGeoMapItemUtils::vec2 pos; - QDeclarativeGeoMapItemUtils::vec2 prev; - QDeclarativeGeoMapItemUtils::vec2 next; - float direction; - float triangletype; // es2 does not support int attribs - float vertextype; - - static const QSGGeometry::AttributeSet &attributes() - { - static const QSGGeometry::Attribute dataTri[] = { - QSGGeometry::Attribute::createWithAttributeType(0, 2, QSGGeometry::FloatType, QSGGeometry::PositionAttribute) // pos - ,QSGGeometry::Attribute::createWithAttributeType(1, 2, QSGGeometry::FloatType, QSGGeometry::UnknownAttribute) // next - ,QSGGeometry::Attribute::createWithAttributeType(2, 2, QSGGeometry::FloatType, QSGGeometry::UnknownAttribute) // previous - ,QSGGeometry::Attribute::createWithAttributeType(3, 1, QSGGeometry::FloatType, QSGGeometry::UnknownAttribute) // direction - ,QSGGeometry::Attribute::createWithAttributeType(4, 1, QSGGeometry::FloatType, QSGGeometry::UnknownAttribute) // triangletype - ,QSGGeometry::Attribute::createWithAttributeType(5, 1, QSGGeometry::FloatType, QSGGeometry::UnknownAttribute) // vertextype - }; - static const QSGGeometry::AttributeSet attrsTri = { 6, sizeof(MapPolylineNodeOpenGLExtruded::MapPolylineEntry), dataTri }; - return attrsTri; - } - } MapPolylineEntry; - - MapPolylineNodeOpenGLExtruded(); - ~MapPolylineNodeOpenGLExtruded() override; - - void update(const QColor &fillColor, - float lineWidth, - const QGeoMapPolylineGeometryOpenGL *shape, - const QMatrix4x4 &geoProjection, - const QDoubleVector3D ¢er, - const Qt::PenCapStyle capStyle = Qt::FlatCap, - bool closed = false, - unsigned int zoom = 30); - - static const QSGGeometry::AttributeSet &attributesMapPolylineTriangulated(); - -protected: - MapPolylineMaterialExtruded fill_material_; - QSGGeometry m_geometryTriangulating; -}; - class Q_LOCATION_PRIVATE_EXPORT QDeclarativePolylineMapItemPrivate { public: @@ -571,170 +231,6 @@ public: MapPolylineNode *m_node = nullptr; }; -class Q_LOCATION_PRIVATE_EXPORT QDeclarativePolylineMapItemPrivateOpenGLLineStrip: public QDeclarativePolylineMapItemPrivate -{ -public: - - QDeclarativePolylineMapItemPrivateOpenGLLineStrip(QDeclarativePolylineMapItem &poly) : QDeclarativePolylineMapItemPrivate(poly) - { - } - - QDeclarativePolylineMapItemPrivateOpenGLLineStrip(QDeclarativePolylineMapItemPrivate &other) - : QDeclarativePolylineMapItemPrivate(other) - { - } - - ~QDeclarativePolylineMapItemPrivateOpenGLLineStrip() override; - void onLinePropertiesChanged() override - { - afterViewportChanged(); - } - void markSourceDirtyAndUpdate() override - { - m_geometry.markSourceDirty(); - m_poly.polishAndUpdate(); - } - void preserveGeometry() - { - m_geometry.setPreserveGeometry(true, m_poly.m_geopath.boundingGeoRectangle().topLeft()); - } - void onMapSet() override - { - markSourceDirtyAndUpdate(); - } - void onGeoGeometryChanged() override - { - preserveGeometry(); - markSourceDirtyAndUpdate(); - } - void onGeoGeometryUpdated() override - { - preserveGeometry(); - markSourceDirtyAndUpdate(); - } - void onItemGeometryChanged() override - { - onGeoGeometryChanged(); - } - void afterViewportChanged() override - { - preserveGeometry(); - m_poly.polishAndUpdate(); - } - bool contains(const QPointF &point) const override - { - return m_geometry.contains(m_poly.mapToItem(m_poly.quickMap(), point), - m_poly.line()->width(), - static_cast<const QGeoProjectionWebMercator&>(m_poly.map()->geoProjection())); - } - void updatePolish() override - { - if (m_poly.m_geopath.path().length() == 0) { // Possibly cleared - m_geometry.clear(); - m_geometry.clear(); - m_poly.setWidth(0); - m_poly.setHeight(0); - return; - } - - QScopedValueRollback<bool> rollback(m_poly.m_updatingGeometry); - m_poly.m_updatingGeometry = true; - const qreal lineWidth = m_poly.m_line.width(); - m_geometry.updateSourcePoints(*m_poly.map(), m_poly.m_geopath); - m_geometry.markScreenDirty(); - m_geometry.updateScreenPoints(*m_poly.map(), lineWidth); - - m_poly.setWidth(m_geometry.sourceBoundingBox().width()); - m_poly.setHeight(m_geometry.sourceBoundingBox().height()); - m_poly.setPosition(1.0 * m_geometry.firstPointOffset() - QPointF(lineWidth * 0.5,lineWidth * 0.5)); - } - QSGNode * updateMapItemPaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) override - { - Q_UNUSED(data); - - if (!m_node || !oldNode) { - m_node = new MapPolylineNodeOpenGLLineStrip(); - if (oldNode) - delete oldNode; - } else { - m_node = static_cast<MapPolylineNodeOpenGLLineStrip *>(oldNode); - } - - if (m_geometry.isScreenDirty() || m_poly.m_dirtyMaterial) { - const QGeoMap *map = m_poly.map(); - const QMatrix4x4 &combinedMatrix = map->geoProjection().qsgTransform(); - const QDoubleVector3D &cameraCenter = map->geoProjection().centerMercator(); - m_node->update(m_poly.m_line.color(), // This updates only the material if the geometry is unchanged - m_poly.m_line.width(), - &m_geometry, - combinedMatrix, - cameraCenter); - m_geometry.setPreserveGeometry(false); - m_geometry.markClean(); - m_poly.m_dirtyMaterial = false; - } - return m_node; - } - - QGeoMapPolylineGeometryOpenGL m_geometry; - MapPolylineNodeOpenGLLineStrip *m_node = nullptr; -}; - -class Q_LOCATION_PRIVATE_EXPORT QDeclarativePolylineMapItemPrivateOpenGLExtruded: public QDeclarativePolylineMapItemPrivateOpenGLLineStrip -{ -public: - - QDeclarativePolylineMapItemPrivateOpenGLExtruded(QDeclarativePolylineMapItem &poly) - : QDeclarativePolylineMapItemPrivateOpenGLLineStrip(poly) - { - } - - QDeclarativePolylineMapItemPrivateOpenGLExtruded(QDeclarativePolylineMapItemPrivate &other) - : QDeclarativePolylineMapItemPrivateOpenGLLineStrip(other) - { - } - - ~QDeclarativePolylineMapItemPrivateOpenGLExtruded() override; - - QSGNode * updateMapItemPaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) override - { - Q_UNUSED(data); - const QGeoMap *map = m_poly.map(); - const QGeoProjectionWebMercator &p = static_cast<const QGeoProjectionWebMercator&>(map->geoProjection()); - const QMatrix4x4 &combinedMatrix = p.qsgTransform(); - const QDoubleVector3D &cameraCenter = p.centerMercator(); - const QColor &color = m_poly.m_line.color(); - const float lineWidth = m_poly.m_line.width(); - - MapPolylineNodeOpenGLExtruded *nodeTri = nullptr; - if (!m_nodeTri || !oldNode) { - if (oldNode) - delete oldNode; - nodeTri = new MapPolylineNodeOpenGLExtruded(); - } else { - nodeTri = static_cast<MapPolylineNodeOpenGLExtruded *>(oldNode); - } - - //TODO: update only material - if (m_geometry.isScreenDirty() || m_poly.m_dirtyMaterial) { - nodeTri->update(color, - lineWidth , - &m_geometry, - combinedMatrix, - cameraCenter, - Qt::FlatCap, - false, - m_poly.zoomForLOD(int(map->cameraData().zoomLevel()))); - m_geometry.setPreserveGeometry(false); - m_geometry.markClean(); - m_poly.m_dirtyMaterial = false; - } - m_nodeTri = nodeTri; - return nodeTri; - } - - MapPolylineNodeOpenGLExtruded *m_nodeTri = nullptr; -}; QT_END_NAMESPACE #endif // QDECLARATIVEPOLYLINEMAPITEM_P_P_H |