diff options
Diffstat (limited to 'src/location/maps')
-rw-r--r-- | src/location/maps/qgeocameradata.cpp | 74 | ||||
-rw-r--r-- | src/location/maps/qgeocameradata_p.h | 13 | ||||
-rw-r--r-- | src/location/maps/qgeocameratiles.cpp | 91 | ||||
-rw-r--r-- | src/location/maps/qgeocameratiles_p.h | 7 | ||||
-rw-r--r-- | src/location/maps/qgeomap.cpp | 9 | ||||
-rw-r--r-- | src/location/maps/qgeomapcontroller.cpp | 10 | ||||
-rw-r--r-- | src/location/maps/qgeomapgeometry.cpp | 91 |
7 files changed, 92 insertions, 203 deletions
diff --git a/src/location/maps/qgeocameradata.cpp b/src/location/maps/qgeocameradata.cpp index 9ce169dd..54bb08ea 100644 --- a/src/location/maps/qgeocameradata.cpp +++ b/src/location/maps/qgeocameradata.cpp @@ -62,13 +62,10 @@ public: bool operator == (const QGeoCameraDataPrivate &rhs) const; QGeoCoordinate center_; - double distance_; double bearing_; double tilt_; double roll_; - double aspectRatio_; - int zoomLevel_; - double zoomFactor_; + double zoomLevel_; QWeakPointer<QGeoCoordinateInterpolator> interpolator_; }; @@ -76,36 +73,27 @@ public: QGeoCameraDataPrivate::QGeoCameraDataPrivate() : QSharedData(), center_(-27.5, 153), - distance_(0.0), bearing_(0.0), tilt_(0.0), roll_(0.0), - aspectRatio_(1.0), - zoomLevel_(9), - zoomFactor_(9.0) {} + zoomLevel_(9.0) {} QGeoCameraDataPrivate::QGeoCameraDataPrivate(const QGeoCameraDataPrivate &rhs) : QSharedData(rhs), center_(rhs.center_), - distance_(rhs.distance_), bearing_(rhs.bearing_), tilt_(rhs.tilt_), roll_(rhs.roll_), - aspectRatio_(rhs.aspectRatio_), zoomLevel_(rhs.zoomLevel_), - zoomFactor_(rhs.zoomFactor_), interpolator_(rhs.interpolator_) {} QGeoCameraDataPrivate& QGeoCameraDataPrivate::operator = (const QGeoCameraDataPrivate &rhs) { center_ = rhs.center_; - distance_ = rhs.distance_; bearing_ = rhs.bearing_; tilt_ = rhs.tilt_; roll_ = rhs.roll_; - aspectRatio_ = rhs.aspectRatio_; zoomLevel_ = rhs.zoomLevel_; - zoomFactor_ = rhs.zoomFactor_; QSharedPointer<QGeoCoordinateInterpolator> i = rhs.interpolator_.toStrongRef(); if (i) interpolator_ = i.toWeakRef(); @@ -118,13 +106,10 @@ QGeoCameraDataPrivate& QGeoCameraDataPrivate::operator = (const QGeoCameraDataPr bool QGeoCameraDataPrivate::operator == (const QGeoCameraDataPrivate &rhs) const { return ((center_ == rhs.center_) - && (distance_ == rhs.distance_) && (bearing_ == rhs.bearing_) && (tilt_ == rhs.tilt_) && (roll_ == rhs.roll_) - && (aspectRatio_ == rhs.aspectRatio_) - && (zoomLevel_ == rhs.zoomLevel_) - && (zoomFactor_ == rhs.zoomFactor_)); + && (zoomLevel_ == rhs.zoomLevel_)); } QVariant cameraInterpolator(const QGeoCameraData &start, @@ -149,7 +134,7 @@ QVariant cameraInterpolator(const QGeoCameraData &start, result.setBearing(sf * start.bearing() + ef * end.bearing()); result.setTilt(sf * start.tilt() + ef * end.tilt()); result.setRoll(sf * start.roll() + ef * end.roll()); - result.setZoomFactor(sf * start.zoomFactor() + ef * end.zoomFactor()); + result.setZoomLevel(sf * start.zoomLevel() + ef * end.zoomLevel()); return QVariant::fromValue(result); } @@ -159,7 +144,6 @@ QGeoCameraData::QGeoCameraData() { qRegisterMetaType<QGeoCameraData>(); qRegisterAnimationInterpolator<QGeoCameraData>(cameraInterpolator); - setZoomFactor(4.0); } QGeoCameraData::QGeoCameraData(const QGeoCameraData &other) @@ -225,60 +209,16 @@ double QGeoCameraData::roll() const return d->roll_; } -void QGeoCameraData::setAspectRatio(double aspectRatio) +void QGeoCameraData::setZoomLevel(double zoomFactor) { - d->aspectRatio_ = aspectRatio; + d->zoomLevel_ = zoomFactor; } -double QGeoCameraData::aspectRatio() const -{ - return d->aspectRatio_; -} - -/* - Distance and zoomLevel are only writeable for debugging purposes. - The setters will eventually go away and then zoomFactor will be - the way to set these. -*/ - -void QGeoCameraData::setDistance(double distance) -{ - d->zoomFactor_ = -1.0 * log(distance) / log(2.0); - d->distance_ = distance; -} - -double QGeoCameraData::distance() const -{ - return d->distance_; -} - -void QGeoCameraData::setZoomLevel(int zoomLevel) -{ - d->zoomLevel_ = zoomLevel; -} - -int QGeoCameraData::zoomLevel() const +double QGeoCameraData::zoomLevel() const { return d->zoomLevel_; } -void QGeoCameraData::setZoomFactor(double zoomFactor) -{ - d->zoomLevel_ = floor(zoomFactor); -// qDebug() << __FUNCTION__ << zoomFactor << d->zoomLevel_; - - // FIXME this will need some tuning - - d->distance_ = 1.0 / pow(2.0, zoomFactor); - - d->zoomFactor_ = zoomFactor; -} - -double QGeoCameraData::zoomFactor() const -{ - return d->zoomFactor_; -} - void QGeoCameraData::setCoordinateInterpolator(QSharedPointer<QGeoCoordinateInterpolator> interpolator) { d->interpolator_ = interpolator.toWeakRef(); diff --git a/src/location/maps/qgeocameradata_p.h b/src/location/maps/qgeocameradata_p.h index 675e55ba..46822a3a 100644 --- a/src/location/maps/qgeocameradata_p.h +++ b/src/location/maps/qgeocameradata_p.h @@ -90,17 +90,8 @@ public: void setRoll(double roll); double roll() const; - void setAspectRatio(double aspectRatio); - double aspectRatio() const; - - void setDistance(double distance); - double distance() const; - - void setZoomLevel(int zoomLevel); - int zoomLevel() const; - - void setZoomFactor(double zoomFactor); - double zoomFactor() const; + void setZoomLevel(double zoomLevel); + double zoomLevel() const; void setCoordinateInterpolator(QSharedPointer<QGeoCoordinateInterpolator> interpolator); QSharedPointer<QGeoCoordinateInterpolator> coordinateInterpolator() const; diff --git a/src/location/maps/qgeocameratiles.cpp b/src/location/maps/qgeocameratiles.cpp index 19f40799..87eff04d 100644 --- a/src/location/maps/qgeocameratiles.cpp +++ b/src/location/maps/qgeocameratiles.cpp @@ -83,14 +83,12 @@ public: int maxZoom_; QSet<QGeoTileSpec> tiles_; - QSet<QGeoTileSpec> tilesLeft_; - QSet<QGeoTileSpec> tilesRight_; + int intZoomLevel_; + int sideLength_; void updateMetadata(); void updateGeometry(); - double sideLength() const; - Frustum frustum() const; class LengthSorter { @@ -140,6 +138,10 @@ void QGeoCameraTiles::setCamera(const QGeoCameraData &camera) return; d->camera_ = camera; + + d->intZoomLevel_ = static_cast<int>(floor(d->camera_.zoomLevel())); + d->sideLength_ = 1 << d->intZoomLevel_; + d->updateGeometry(); } @@ -204,15 +206,11 @@ QSet<QGeoTileSpec> QGeoCameraTiles::tiles() const return d->tiles_; } -QPair<QSet<QGeoTileSpec>, QSet<QGeoTileSpec> > QGeoCameraTiles::tilesSplitByDateline() const -{ - Q_D(const QGeoCameraTiles); - return QPair<QSet<QGeoTileSpec>, QSet<QGeoTileSpec> >(d->tilesLeft_, d->tilesRight_); -} - QGeoCameraTilesPrivate::QGeoCameraTilesPrivate() : tileSize_(0), - maxZoom_(0) {} + maxZoom_(0), + intZoomLevel_(0), + sideLength_(0) {} QGeoCameraTilesPrivate::~QGeoCameraTilesPrivate() {} @@ -231,37 +229,11 @@ void QGeoCameraTilesPrivate::updateMetadata() } tiles_ = newTiles; - - newTiles.clear(); - - i = tilesLeft_.constBegin(); - end = tilesLeft_.constEnd(); - - for (; i != end; ++i) { - QGeoTileSpec tile = *i; - newTiles.insert(QGeoTileSpec(pluginString_, mapType_.mapId(), tile.zoom(), tile.x(), tile.y())); - } - - tilesLeft_ = newTiles; - - newTiles.clear(); - - i = tilesRight_.constBegin(); - end = tilesRight_.constEnd(); - - for (; i != end; ++i) { - QGeoTileSpec tile = *i; - newTiles.insert(QGeoTileSpec(pluginString_, mapType_.mapId(), tile.zoom(), tile.x(), tile.y())); - } - - tilesRight_ = newTiles; } void QGeoCameraTilesPrivate::updateGeometry() { tiles_.clear(); - tilesLeft_.clear(); - tilesRight_.clear(); // Find the frustum from the camera / screen / viewport information Frustum f = frustum(); @@ -273,31 +245,24 @@ void QGeoCameraTilesPrivate::updateGeometry() QPair<Polygon, Polygon> polygons = clipFootprintToMap(footprint); if (!polygons.first.isEmpty()) { - tilesLeft_ = tilesFromPolygon(polygons.first); - tiles_.unite(tilesLeft_); + QSet<QGeoTileSpec> tilesLeft = tilesFromPolygon(polygons.first); + tiles_.unite(tilesLeft); } if (!polygons.second.isEmpty()) { - tilesRight_ = tilesFromPolygon(polygons.second); - tiles_.unite(tilesRight_); + QSet<QGeoTileSpec> tilesRight = tilesFromPolygon(polygons.second); + tiles_.unite(tilesRight); } } -double QGeoCameraTilesPrivate::sideLength() const -{ - return double(1 << camera_.zoomLevel()); -} - Frustum QGeoCameraTilesPrivate::frustum() const { - int zpow2 = 1 << camera_.zoomLevel(); - - QDoubleVector3D center = zpow2 * QGeoProjection::coordToMercator(camera_.center()); + QDoubleVector3D center = sideLength_ * QGeoProjection::coordToMercator(camera_.center()); center.setZ(0.0); double f = qMin(screenSize_.width(), screenSize_.height()) / (1.0 * tileSize_); - double z = pow(2.0, camera_.zoomFactor() - camera_.zoomLevel()); + double z = pow(2.0, camera_.zoomLevel() - intZoomLevel_); double altitude = f / (2.0 * z); QDoubleVector3D eye = center; @@ -307,7 +272,7 @@ Frustum QGeoCameraTilesPrivate::frustum() const QDoubleVector3D side = QDoubleVector3D::normal(view, QDoubleVector3D(0.0, 1.0, 0.0)); QDoubleVector3D up = QDoubleVector3D::normal(side, view); - double nearPlane = zpow2 / (1.0 * tileSize_ * (1 << maxZoom_)); + double nearPlane = sideLength_ / (1.0 * tileSize_ * (1 << maxZoom_)); double farPlane = 3.0; double aspectRatio = 1.0 * screenSize_.width() / screenSize_.height(); @@ -539,7 +504,7 @@ QPair<Polygon, Polygon> QGeoCameraTilesPrivate::clipFootprintToMap(const Polygon bool clipY0 = false; bool clipY1 = false; - double side = sideLength(); + double side = 1.0 * sideLength_; typedef Polygon::iterator iter; typedef Polygon::const_iterator const_iter; @@ -635,18 +600,12 @@ QSet<QGeoTileSpec> QGeoCameraTilesPrivate::tilesFromPolygon(const Polygon &polyg if (numPoints == 0) return QSet<QGeoTileSpec>(); - int zoomLevel = camera_.zoomLevel(); - int minY = -1; int maxY = -1; - int zpow2 = 1 << zoomLevel; - QVector<int> tilesX(polygon.size()); QVector<int> tilesY(polygon.size()); - double side = sideLength(); - for (int i = 0; i < numPoints; ++i) { QDoubleVector2D p = polygon.at(i).toVector2D(); @@ -654,15 +613,15 @@ QSet<QGeoTileSpec> QGeoCameraTilesPrivate::tilesFromPolygon(const Polygon &polyg int x = 0; int y = 0; - if (qFuzzyCompare(p.x(), side)) - x = zpow2 - 1; + if (qFuzzyCompare(p.x(), sideLength_ * 1.0)) + x = sideLength_ - 1; else - x = static_cast<int>(p.x()) % zpow2; + x = static_cast<int>(p.x()) % sideLength_; - if (qFuzzyCompare(p.y(), side)) - y = zpow2 - 1; + if (qFuzzyCompare(p.y(), sideLength_ * 1.0)) + y = sideLength_ - 1; else - y = static_cast<int>(p.y()) % zpow2; + y = static_cast<int>(p.y()) % sideLength_; if (minY == -1) { minY = y; @@ -733,13 +692,15 @@ QSet<QGeoTileSpec> QGeoCameraTilesPrivate::tilesFromPolygon(const Polygon &polyg QSet<QGeoTileSpec> results; + int z = intZoomLevel_; + int size = map.minX.size(); for (int i = 0; i < size; ++i) { int y = map.minY + i; int minX = map.minX[i]; int maxX = map.maxX[i]; for (int x = minX; x <= maxX; ++x) { - results.insert(QGeoTileSpec(pluginString_, mapType_.mapId(), zoomLevel, x, y)); + results.insert(QGeoTileSpec(pluginString_, mapType_.mapId(), z, x, y)); } } diff --git a/src/location/maps/qgeocameratiles_p.h b/src/location/maps/qgeocameratiles_p.h index 503dbc65..2f3bbbc6 100644 --- a/src/location/maps/qgeocameratiles_p.h +++ b/src/location/maps/qgeocameratiles_p.h @@ -73,14 +73,13 @@ public: void setCamera(const QGeoCameraData &camera); void setScreenSize(const QSize &size); - void setPluginString(const QString &pluginString); - void setMapType(const QGeoMapType &mapType); - void setTileSize(int tileSize); void setMaximumZoomLevel(int maxZoom); + void setPluginString(const QString &pluginString); + void setMapType(const QGeoMapType &mapType); + QSet<QGeoTileSpec> tiles() const; - QPair<QSet<QGeoTileSpec>, QSet<QGeoTileSpec> > tilesSplitByDateline() const; private: QGeoCameraTilesPrivate *d_ptr; diff --git a/src/location/maps/qgeomap.cpp b/src/location/maps/qgeomap.cpp index 2cd424fc..84471d0f 100644 --- a/src/location/maps/qgeomap.cpp +++ b/src/location/maps/qgeomap.cpp @@ -278,11 +278,11 @@ void QGeoMapPrivate::setCameraData(const QGeoCameraData &cameraData) if (manager_) { QGeoCameraCapabilities capabilities = manager_->cameraCapabilities(); - if (cameraData_.zoomFactor() < capabilities.minimumZoomLevel()) - cameraData_.setZoomFactor(capabilities.minimumZoomLevel()); + if (cameraData_.zoomLevel() < capabilities.minimumZoomLevel()) + cameraData_.setZoomLevel(capabilities.minimumZoomLevel()); - if (cameraData_.zoomFactor() > capabilities.maximumZoomLevel()) - cameraData_.setZoomFactor(capabilities.maximumZoomLevel()); + if (cameraData_.zoomLevel() > capabilities.maximumZoomLevel()) + cameraData_.setZoomLevel(capabilities.maximumZoomLevel()); if (!capabilities.supportsBearing()) cameraData_.setBearing(0.0); @@ -301,7 +301,6 @@ void QGeoMapPrivate::setCameraData(const QGeoCameraData &cameraData) cameraData_.setRoll(0.0); } - cameraData_.setAspectRatio(aspectRatio_); cameraData_.setCoordinateInterpolator(mapGeometry_->coordinateInterpolator().toWeakRef()); cameraTiles_->setCamera(cameraData_); diff --git a/src/location/maps/qgeomapcontroller.cpp b/src/location/maps/qgeomapcontroller.cpp index e08e3960..842912d7 100644 --- a/src/location/maps/qgeomapcontroller.cpp +++ b/src/location/maps/qgeomapcontroller.cpp @@ -134,8 +134,8 @@ void QGeoMapController::cameraDataChanged(const QGeoCameraData &cameraData) if (oldCameraData_.roll() != cameraData.roll()) emit rollChanged(cameraData.roll()); - if (oldCameraData_.zoomFactor() != cameraData.zoomFactor()) - emit zoomChanged(cameraData.zoomFactor()); + if (oldCameraData_.zoomLevel() != cameraData.zoomLevel()) + emit zoomChanged(cameraData.zoomLevel()); oldCameraData_ = cameraData; } @@ -206,17 +206,17 @@ void QGeoMapController::setRoll(qreal roll) qreal QGeoMapController::zoom() const { - return map_->cameraData().zoomFactor(); + return map_->cameraData().zoomLevel(); } void QGeoMapController::setZoom(qreal zoom) { QGeoCameraData cd = map_->cameraData(); - if (zoom == cd.zoomFactor()) + if (zoom == cd.zoomLevel()) return; - cd.setZoomFactor(zoom); + cd.setZoomLevel(zoom); map_->setCameraData(cd); } diff --git a/src/location/maps/qgeomapgeometry.cpp b/src/location/maps/qgeomapgeometry.cpp index 190d4762..dda47c10 100644 --- a/src/location/maps/qgeomapgeometry.cpp +++ b/src/location/maps/qgeomapgeometry.cpp @@ -133,6 +133,9 @@ public: double scaleFactor_; + int intZoomLevel_; + int sideLength_; + QHash<QGeoTileSpec, QGLSceneNode*> nodes_; int minTileX_; @@ -200,6 +203,8 @@ void QGeoMapGeometry::setCameraData(const QGeoCameraData &cameraData) { Q_D(QGeoMapGeometry); d->cameraData_ = cameraData; + d->intZoomLevel_ = static_cast<int>(floor(d->cameraData_.zoomLevel())); + d->sideLength_ = 1 << d->intZoomLevel_; } void QGeoMapGeometry::setVisibleTiles(const QSet<QGeoTileSpec> &tiles) @@ -261,6 +266,8 @@ QGeoMapGeometryPrivate::QGeoMapGeometryPrivate() camera_(new QGLCamera()), sceneNode_(new QGLSceneNode()), scaleFactor_(10.0), + intZoomLevel_(0), + sideLength_(0), minTileX_(-1), minTileY_(-1), maxTileX_(-1), @@ -280,37 +287,33 @@ QGeoMapGeometryPrivate::~QGeoMapGeometryPrivate() QDoubleVector2D QGeoMapGeometryPrivate::screenPositionToMercator(const QPointF &pos) const { - int zpow2 = 1 << cameraData_.zoomLevel(); - double x = mercatorWidth_ * (((pos.x() - screenOffsetX_) / screenWidth_) - 0.5); x += mercatorCenterX_; - if (x > 1.0 * zpow2) - x -= 1.0 * zpow2; + if (x > 1.0 * sideLength_) + x -= 1.0 * sideLength_; if (x < 0.0) - x += 1.0 * zpow2; + x += 1.0 * sideLength_; - x /= 1.0 * zpow2; + x /= 1.0 * sideLength_; double y = mercatorHeight_ * (((pos.y() - screenOffsetY_) / screenHeight_) - 0.5); y += mercatorCenterY_; - y /= 1.0 * zpow2; + y /= 1.0 * sideLength_; return QDoubleVector2D(x, y); } QPointF QGeoMapGeometryPrivate::mercatorToScreenPosition(const QDoubleVector2D &mercator) const { - int zpow2 = 1 << cameraData_.zoomLevel(); - - double mx = zpow2 * mercator.x(); + double mx = sideLength_ * mercator.x(); double lb = mercatorCenterX_ - mercatorWidth_ / 2.0; if (lb < 0.0) - lb += zpow2; + lb += sideLength_; double ub = mercatorCenterX_ + mercatorWidth_ / 2.0; - if (zpow2 < ub) - ub -= zpow2; + if (sideLength_ < ub) + ub -= sideLength_; double m = (mx - mercatorCenterX_) / mercatorWidth_; @@ -318,28 +321,27 @@ QPointF QGeoMapGeometryPrivate::mercatorToScreenPosition(const QDoubleVector2D & if (qFuzzyCompare(ub - lb + 1.0, 1.0) || (ub < lb) ) { if (mercatorCenterX_ < ub) { if (lb < mx) { - m = (mx - mercatorCenterX_ - zpow2) / mercatorWidth_; + m = (mx - mercatorCenterX_ - sideLength_) / mercatorWidth_; } } else if (lb < mercatorCenterX_) { if (mx < ub) { - m = (mx - mercatorCenterX_ + zpow2) / mercatorWidth_; + m = (mx - mercatorCenterX_ + sideLength_) / mercatorWidth_; } } } double x = screenWidth_ * (0.5 + m); - double y = screenHeight_ * (0.5 + (zpow2 * mercator.y() - mercatorCenterY_) / mercatorHeight_); + double y = screenHeight_ * (0.5 + (sideLength_ * mercator.y() - mercatorCenterY_) / mercatorHeight_); return QPointF(x + screenOffsetX_, y + screenOffsetY_); } void QGeoMapGeometryPrivate::addTile(const QGeoTileSpec &spec, QGLTexture2D *texture) { - int zpow2 = 1 << cameraData_.zoomLevel(); int x = spec.x(); if (x < tileXWrapsBelow_) - x += zpow2; + x += sideLength_; if ((x < minTileX_) || (maxTileX_ < x) @@ -450,7 +452,6 @@ void QGeoMapGeometryPrivate::setTileBounds() iter i = visibleTiles_.constBegin(); iter end = visibleTiles_.constEnd(); - int zpow2 = 1 << cameraData_.zoomLevel(); bool hasFarLeft = false; bool hasFarRight = false; bool hasMidLeft = false; @@ -460,11 +461,11 @@ void QGeoMapGeometryPrivate::setTileBounds() int x = (*i).x(); if (x == 0) hasFarLeft = true; - else if (x == (zpow2 - 1)) + else if (x == (sideLength_ - 1)) hasFarRight = true; - else if (x == ((zpow2 / 2) - 1)) { + else if (x == ((sideLength_ / 2) - 1)) { hasMidLeft = true; - } else if (x == (zpow2 / 2)) { + } else if (x == (sideLength_ / 2)) { hasMidRight = true; } } @@ -473,9 +474,9 @@ void QGeoMapGeometryPrivate::setTileBounds() if (hasFarLeft && hasFarRight) { if (!hasMidRight) { - tileXWrapsBelow_ = zpow2 / 2; + tileXWrapsBelow_ = sideLength_ / 2; } else if (!hasMidLeft) { - tileXWrapsBelow_ = (zpow2 / 2) - 1; + tileXWrapsBelow_ = (sideLength_ / 2) - 1; } } @@ -485,7 +486,7 @@ void QGeoMapGeometryPrivate::setTileBounds() int x = tile.x(); if (tile.x() < tileXWrapsBelow_) - x += zpow2; + x += sideLength_; minTileX_ = x; maxTileX_ = x; @@ -498,7 +499,7 @@ void QGeoMapGeometryPrivate::setTileBounds() tile = *i; int x = tile.x(); if (tile.x() < tileXWrapsBelow_) - x += zpow2; + x += sideLength_; minTileX_ = qMin(minTileX_, x); maxTileX_ = qMax(maxTileX_, x); @@ -509,11 +510,9 @@ void QGeoMapGeometryPrivate::setTileBounds() void QGeoMapGeometryPrivate::setupCamera() { - int zpow2 = 1 << cameraData_.zoomLevel(); - double f = 1.0 * qMin(screenSize_.width(), screenSize_.height()); - double z = pow(2.0, cameraData_.zoomFactor() - cameraData_.zoomLevel()); + double z = pow(2.0, cameraData_.zoomLevel() - intZoomLevel_); double altitude = scaleFactor_ * f / (4.0 * z); @@ -533,10 +532,10 @@ void QGeoMapGeometryPrivate::setupCamera() double edge = scaleFactor_ * tileSize_; - QDoubleVector3D center = (zpow2 * QGeoProjection::coordToMercator(cameraData_.center())); + QDoubleVector3D center = (sideLength_ * QGeoProjection::coordToMercator(cameraData_.center())); if (center.x() < tileXWrapsBelow_) - center.setX(center.x() + 1.0 * zpow2); + center.setX(center.x() + 1.0 * sideLength_); mercatorCenterX_ = center.x(); mercatorCenterY_ = center.y(); @@ -545,12 +544,12 @@ void QGeoMapGeometryPrivate::setupCamera() center.setY(1.0 * minTileY_ - center.y()); // letter box vertically - if (useVerticalLock_ && (mercatorHeight_ > 1.0 * zpow2)) { - center.setY(-1.0 * zpow2 / 2.0); - mercatorCenterY_ = zpow2 / 2.0; - screenOffsetY_ = screenSize_.height() * (0.5 - zpow2 / (2 * mercatorHeight_)); + if (useVerticalLock_ && (mercatorHeight_ > 1.0 * sideLength_)) { + center.setY(-1.0 * sideLength_ / 2.0); + mercatorCenterY_ = sideLength_ / 2.0; + screenOffsetY_ = screenSize_.height() * (0.5 - sideLength_ / (2 * mercatorHeight_)); screenHeight_ = screenSize_.height() - 2 * screenOffsetY_; - mercatorHeight_ = 1.0 * zpow2; + mercatorHeight_ = 1.0 * sideLength_; verticalLock_ = true; } else { screenOffsetY_ = 0.0; @@ -558,10 +557,10 @@ void QGeoMapGeometryPrivate::setupCamera() verticalLock_ = false; } - if (mercatorWidth_ > 1.0 * zpow2) { - screenOffsetX_ = screenSize_.width() * (0.5 - (zpow2 / (2 * mercatorWidth_))); + if (mercatorWidth_ > 1.0 * sideLength_) { + screenOffsetX_ = screenSize_.width() * (0.5 - (sideLength_ / (2 * mercatorWidth_))); screenWidth_ = screenSize_.width() - 2 * screenOffsetX_; - mercatorWidth_ = 1.0 * zpow2; + mercatorWidth_ = 1.0 * sideLength_; } else { screenOffsetX_ = 0.0; screenWidth_ = screenSize_.width(); @@ -632,32 +631,32 @@ void QGeoMapGeometryPrivate::paintGL(QGLPainter *painter) glDisable(GL_DEPTH_TEST); - double sideLength_ = scaleFactor_ * tileSize_ * (1 << cameraData_.zoomLevel()); + double sideLength = scaleFactor_ * tileSize_ * sideLength_; QDoubleVector3D c = QDoubleVector3D(camera->center()); - c.setX(c.x() + sideLength_); + c.setX(c.x() + sideLength); camera->setCenter(c); QDoubleVector3D e = QDoubleVector3D(camera->eye()); - e.setX(e.x() + sideLength_); + e.setX(e.x() + sideLength); camera->setEye(e); painter->setCamera(camera); painter->projectionMatrix().scale(1, -1, 1); sceneNode_->draw(painter); - c.setX(c.x() - 2 * sideLength_); + c.setX(c.x() - 2 * sideLength); camera->setCenter(c); - e.setX(e.x() - 2 * sideLength_); + e.setX(e.x() - 2 * sideLength); camera->setEye(e); painter->setCamera(camera); painter->projectionMatrix().scale(1, -1, 1); sceneNode_->draw(painter); - c.setX(c.x() + sideLength_); + c.setX(c.x() + sideLength); camera->setCenter(c); - e.setX(e.x() + sideLength_); + e.setX(e.x() + sideLength); camera->setEye(e); painter->setCamera(camera); |