summaryrefslogtreecommitdiff
path: root/src/location/quickmapitems/qdeclarativepolylinemapitem_p_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/location/quickmapitems/qdeclarativepolylinemapitem_p_p.h')
-rw-r--r--src/location/quickmapitems/qdeclarativepolylinemapitem_p_p.h508
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 &center,
- 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 &center,
- 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