summaryrefslogtreecommitdiff
path: root/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h')
-rw-r--r--src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h326
1 files changed, 1 insertions, 325 deletions
diff --git a/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h b/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h
index 7c5eb9ac..20871847 100644
--- a/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h
+++ b/src/location/quickmapitems/qdeclarativepolygonmapitem_p_p.h
@@ -57,20 +57,13 @@
#include <QtGui/QMatrix4x4>
#include <QtGui/QColor>
-#include <QSGGeometryNode>
#include <QSGFlatColorMaterial>
-#include <QtPositioning/QGeoPath>
-#include <QtPositioning/QGeoRectangle>
-#include <QtPositioning/QGeoPolygon>
-
#include <QtLocation/private/qlocationglobal_p.h>
#include <QtLocation/private/qgeomapitemgeometry_p.h>
-#include <QtLocation/private/qdeclarativegeomapitembase_p.h>
-#include <QtLocation/private/qdeclarativepolylinemapitem_p.h>
-#include <QtLocation/private/qdeclarativegeomapitemutils_p.h>
#include <QtLocation/private/qdeclarativepolygonmapitem_p.h>
#include <QtLocation/private/qdeclarativepolylinemapitem_p_p.h>
+
#include <QtPositioning/private/qdoublevector2d_p.h>
QT_BEGIN_NAMESPACE
@@ -92,123 +85,6 @@ protected:
bool assumeSimple_ = false;
};
-class Q_LOCATION_PRIVATE_EXPORT QGeoMapPolygonGeometryOpenGL : public QGeoMapItemGeometry
-{
-public:
- typedef struct {
- QList<QDoubleVector2D> wrappedBboxes;
- } WrappedPolygon;
- QGeoMapPolygonGeometryOpenGL();
- ~QGeoMapPolygonGeometryOpenGL() override {}
-
- // Temporary method for compatibility in MapCircleObject. Remove when MapObjects are ported.
- void updateSourcePoints(const QGeoMap &map,
- const QList<QDoubleVector2D> &path);
-
- void updateSourcePoints(const QGeoMap &map,
- const QList<QGeoCoordinate> &perimeter);
-
- void updateSourcePoints(const QGeoMap &map,
- const QGeoPolygon &poly);
-
- void updateSourcePoints(const QGeoMap &map,
- const QGeoRectangle &rect);
-
- void updateScreenPoints(const QGeoMap &map, qreal strokeWidth = 0.0, const QColor &strokeColor = Qt::transparent);
- void updateQuickGeometry(const QGeoProjectionWebMercator &p, qreal strokeWidth = 0.0);
-
- void allocateAndFillPolygon(QSGGeometry *geom) const
- {
-
- const QList<QDeclarativeGeoMapItemUtils::vec2> &vx = m_screenVertices;
- const QList<quint32> &ix = m_screenIndices;
-
- geom->allocate(vx.size(), ix.size());
- if (geom->indexType() == QSGGeometry::UnsignedShortType) {
- quint16 *its = geom->indexDataAsUShort();
- for (qsizetype i = 0; i < ix.size(); ++i)
- its[i] = ix[i];
- } else if (geom->indexType() == QSGGeometry::UnsignedIntType) {
- quint32 *its = geom->indexDataAsUInt();
- for (qsizetype i = 0; i < ix.size(); ++i)
- its[i] = ix[i];
- }
-
- QSGGeometry::Point2D *pts = geom->vertexDataAsPoint2D();
- for (qsizetype i = 0; i < vx.size(); ++i)
- pts[i].set(vx[i].x, vx[i].y);
- }
-
- QList<QDeclarativeGeoMapItemUtils::vec2> m_screenVertices;
- QList<quint32> m_screenIndices;
- QDoubleVector2D m_bboxLeftBoundWrapped;
- QList<WrappedPolygon> m_wrappedPolygons;
- int m_wrapOffset = 0;
-};
-
-class Q_LOCATION_PRIVATE_EXPORT MapPolygonShader : public QSGMaterialShader
-{
-public:
- MapPolygonShader();
-
- bool updateUniformData(RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect) override;
-};
-
-class Q_LOCATION_PRIVATE_EXPORT MapPolygonMaterial : public QSGFlatColorMaterial
-{
-public:
- MapPolygonMaterial()
- : 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;
- }
-
- int compare(const QSGMaterial *other) const override;
- QSGMaterialType *type() const override;
-
-protected:
- QMatrix4x4 m_geoProjection;
- QDoubleVector3D m_center;
- int m_wrapOffset = 0;
-};
-
class Q_LOCATION_PRIVATE_EXPORT MapPolygonNode : public MapItemGeometryNode
{
@@ -225,22 +101,6 @@ private:
QSGGeometry geometry_;
};
-class Q_LOCATION_PRIVATE_EXPORT MapPolygonNodeGL : public MapItemGeometryNode
-{
-
-public:
- MapPolygonNodeGL();
- ~MapPolygonNodeGL() override;
-
- void update(const QColor &fillColor,
- const QGeoMapPolygonGeometryOpenGL *fillShape,
- const QMatrix4x4 &geoProjection,
- const QDoubleVector3D &center);
-
- MapPolygonMaterial fill_material_;
- QSGGeometry geometry_;
-};
-
class Q_LOCATION_PRIVATE_EXPORT QDeclarativePolygonMapItemPrivate
{
public:
@@ -352,190 +212,6 @@ public:
MapPolygonNode *m_node = nullptr;
};
-class Q_LOCATION_PRIVATE_EXPORT QDeclarativePolygonMapItemPrivateOpenGL: public QDeclarativePolygonMapItemPrivate
-{
-public:
- struct RootNode : public QSGNode /*QSGTransformNode*/, public VisibleNode
- {
- RootNode() { }
-
- bool isSubtreeBlocked() const override
- {
- return subtreeBlocked();
- }
- };
-
- QDeclarativePolygonMapItemPrivateOpenGL(QDeclarativePolygonMapItem &polygon) : QDeclarativePolygonMapItemPrivate(polygon)
- {
- }
-
- QDeclarativePolygonMapItemPrivateOpenGL(QDeclarativePolygonMapItemPrivate &other)
- : QDeclarativePolygonMapItemPrivate(other)
- {
- }
-
- ~QDeclarativePolygonMapItemPrivateOpenGL() override;
-
- void markScreenDirtyAndUpdate()
- {
- // preserveGeometry is cleared in updateMapItemPaintNode
- m_geometry.markScreenDirty();
- m_borderGeometry.markScreenDirty();
- m_poly.polishAndUpdate();
- }
- void onLinePropertiesChanged() override
- {
- m_poly.m_dirtyMaterial = true;
- afterViewportChanged();
- }
- void markSourceDirtyAndUpdate() override
- {
- // preserveGeometry is cleared in updateMapItemPaintNode
- m_geometry.markSourceDirty();
- m_borderGeometry.markSourceDirty();
- m_poly.polishAndUpdate();
- }
- void preserveGeometry()
- {
- m_geometry.setPreserveGeometry(true, m_poly.m_geopoly.boundingGeoRectangle().topLeft());
- m_borderGeometry.setPreserveGeometry(true, m_poly.m_geopoly.boundingGeoRectangle().topLeft());
- }
- void afterViewportChanged() override // This is called when the camera changes, or visibleArea changes.
- {
- // preserveGeometry is cleared in updateMapItemPaintNode
- preserveGeometry();
- markScreenDirtyAndUpdate();
- }
- void onMapSet() override
- {
- markSourceDirtyAndUpdate();
- }
- void onGeoGeometryChanged() override
- {
- preserveGeometry();
- markSourceDirtyAndUpdate();
- }
- void onGeoGeometryUpdated() override
- {
- preserveGeometry();
- markSourceDirtyAndUpdate();
- }
- void onItemGeometryChanged() override
- {
- onGeoGeometryChanged();
- }
- void updatePolish() override
- {
- if (m_poly.m_geopoly.perimeter().length() == 0) { // Possibly cleared
- m_geometry.clear();
- m_borderGeometry.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_border.width();
- const QColor &lineColor = m_poly.m_border.color();
- const QColor &fillColor = m_poly.color();
- if (fillColor.alpha() != 0) {
- m_geometry.updateSourcePoints(*m_poly.map(), m_poly.m_geopoly);
- m_geometry.markScreenDirty();
- m_geometry.updateScreenPoints(*m_poly.map(), lineWidth, lineColor);
- } else {
- m_geometry.clearBounds();
- }
-
- QGeoMapItemGeometry * geom = &m_geometry;
- m_borderGeometry.clearScreen();
- if (lineColor.alpha() != 0 && lineWidth > 0) {
- m_borderGeometry.updateSourcePoints(*m_poly.map(), m_poly.m_geopoly);
- m_borderGeometry.markScreenDirty();
- m_borderGeometry.updateScreenPoints(*m_poly.map(), lineWidth);
- geom = &m_borderGeometry;
- }
- m_poly.setWidth(geom->sourceBoundingBox().width());
- m_poly.setHeight(geom->sourceBoundingBox().height());
- m_poly.setPosition(1.0 * geom->firstPointOffset() - QPointF(lineWidth * 0.5,lineWidth * 0.5));
- }
- QSGNode * updateMapItemPaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *data) override
- {
- Q_UNUSED(data);
-
- if (!m_rootNode || !oldNode) {
- m_rootNode = new RootNode();
- m_node = new MapPolygonNodeGL();
- m_rootNode->appendChildNode(m_node);
- m_polylinenode = new MapPolylineNodeOpenGLExtruded();
- m_rootNode->appendChildNode(m_polylinenode);
- m_rootNode->markDirty(QSGNode::DirtyNodeAdded);
- if (oldNode)
- delete oldNode;
- } else {
- m_rootNode = static_cast<RootNode *>(oldNode);
- }
-
- const QGeoMap *map = m_poly.map();
- const QMatrix4x4 &combinedMatrix = map->geoProjection().qsgTransform();
- const QDoubleVector3D &cameraCenter = map->geoProjection().centerMercator();
-
- if (m_borderGeometry.isScreenDirty()) {
- /* Do the border update first */
- m_polylinenode->update(m_poly.m_border.color(),
- float(m_poly.m_border.width()),
- &m_borderGeometry,
- combinedMatrix,
- cameraCenter,
- Qt::SquareCap,
- true,
- 30); // No LOD for polygons just yet.
- // First figure out what to do with holes.
- m_borderGeometry.setPreserveGeometry(false);
- m_borderGeometry.markClean();
- } else {
- m_polylinenode->setSubtreeBlocked(true);
- }
- if (m_geometry.isScreenDirty()) {
- m_node->update(m_poly.m_color,
- &m_geometry,
- combinedMatrix,
- cameraCenter);
- m_geometry.setPreserveGeometry(false);
- m_geometry.markClean();
- } else {
- m_node->setSubtreeBlocked(true);
- }
-
- m_rootNode->setSubtreeBlocked(false);
- return m_rootNode;
- }
- bool contains(const QPointF &point) const override
- {
- const qreal lineWidth = m_poly.m_border.width();
- const QColor &lineColor = m_poly.m_border.color();
- const QRectF &bounds = (lineColor.alpha() != 0 && lineWidth > 0) ? m_borderGeometry.sourceBoundingBox() : m_geometry.sourceBoundingBox();
- if (bounds.contains(point)) {
- QDeclarativeGeoMap *m = m_poly.quickMap();
- if (m) {
- const QGeoCoordinate crd = m->toCoordinate(m->mapFromItem(&m_poly, point));
- return m_poly.m_geopoly.contains(crd) || m_borderGeometry.contains(m_poly.mapToItem(m_poly.quickMap(), point),
- m_poly.border()->width(),
- static_cast<const QGeoProjectionWebMercator&>(m_poly.map()->geoProjection()));
- } else {
- return true;
- }
- }
- return false;
- }
-
- QGeoMapPolygonGeometryOpenGL m_geometry;
- QGeoMapPolylineGeometryOpenGL m_borderGeometry;
- RootNode *m_rootNode = nullptr;
- MapPolygonNodeGL *m_node = nullptr;
- MapPolylineNodeOpenGLExtruded *m_polylinenode = nullptr;
-};
-
QT_END_NAMESPACE
#endif // QDECLARATIVEPOLYGONMAPITEM_P_P_H