diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/map/map.cpp | 45 | ||||
-rw-r--r-- | src/mbgl/style/style.hpp | 6 |
2 files changed, 44 insertions, 7 deletions
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index b452eddbb0..ff36bd7264 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -47,7 +47,8 @@ struct StillImageRequest { class Map::Impl : public style::Observer { public: - Impl(Backend&, + Impl(Map&, + Backend&, float pixelRatio, FileSource&, Scheduler&, @@ -67,6 +68,7 @@ public: void loadStyleJSON(const std::string&); + Map& map; Backend& backend; FileSource& fileSource; Scheduler& scheduler; @@ -90,6 +92,7 @@ public: std::string styleURL; std::string styleJSON; bool styleMutated = false; + bool cameraMutated = false; std::unique_ptr<AsyncRequest> styleRequest; @@ -108,7 +111,8 @@ Map::Map(Backend& backend, GLContextMode contextMode, ConstrainMode constrainMode, ViewportMode viewportMode) - : impl(std::make_unique<Impl>(backend, + : impl(std::make_unique<Impl>(*this, + backend, pixelRatio, fileSource, scheduler, @@ -119,7 +123,8 @@ Map::Map(Backend& backend, impl->transform.resize(size); } -Map::Impl::Impl(Backend& backend_, +Map::Impl::Impl(Map& map_, + Backend& backend_, float pixelRatio_, FileSource& fileSource_, Scheduler& scheduler_, @@ -127,7 +132,8 @@ Map::Impl::Impl(Backend& backend_, GLContextMode contextMode_, ConstrainMode constrainMode_, ViewportMode viewportMode_) - : backend(backend_), + : map(map_), + backend(backend_), fileSource(fileSource_), scheduler(scheduler_), transform([this](MapChange change) { backend.notifyMapChange(change); }, @@ -388,6 +394,14 @@ void Map::Impl::loadStyleJSON(const std::string& json) { // force style cascade, causing all pending transitions to complete. style->cascade(Clock::now(), mode); + if (!cameraMutated) { + // Zoom first because it may constrain subsequent operations. + map.setZoom(map.getDefaultZoom()); + map.setLatLng(map.getDefaultLatLng()); + map.setBearing(map.getDefaultBearing()); + map.setPitch(map.getDefaultPitch()); + } + updateFlags |= Update::Classes | Update::RecalculateStyle | Update::AnnotationStyle; asyncUpdate.send(); } @@ -435,16 +449,19 @@ CameraOptions Map::getCameraOptions(optional<EdgeInsets> padding) const { } void Map::jumpTo(const CameraOptions& camera) { + impl->cameraMutated = true; impl->transform.jumpTo(camera); impl->onUpdate(camera.zoom ? Update::RecalculateStyle : Update::Repaint); } void Map::easeTo(const CameraOptions& camera, const AnimationOptions& animation) { + impl->cameraMutated = true; impl->transform.easeTo(camera, animation); impl->onUpdate(camera.zoom ? Update::RecalculateStyle : Update::Repaint); } void Map::flyTo(const CameraOptions& camera, const AnimationOptions& animation) { + impl->cameraMutated = true; impl->transform.flyTo(camera, animation); impl->onUpdate(Update::RecalculateStyle); } @@ -452,29 +469,35 @@ void Map::flyTo(const CameraOptions& camera, const AnimationOptions& animation) #pragma mark - Position void Map::moveBy(const ScreenCoordinate& point, const Duration& duration) { + impl->cameraMutated = true; impl->transform.moveBy(point, duration); impl->onUpdate(Update::Repaint); } void Map::setLatLng(const LatLng& latLng, const Duration& duration) { + impl->cameraMutated = true; setLatLng(latLng, optional<ScreenCoordinate> {}, duration); } void Map::setLatLng(const LatLng& latLng, optional<EdgeInsets> padding, const Duration& duration) { + impl->cameraMutated = true; impl->transform.setLatLng(latLng, padding, duration); impl->onUpdate(Update::Repaint); } void Map::setLatLng(const LatLng& latLng, optional<ScreenCoordinate> anchor, const Duration& duration) { + impl->cameraMutated = true; impl->transform.setLatLng(latLng, anchor, duration); impl->onUpdate(Update::Repaint); } LatLng Map::getLatLng(optional<EdgeInsets> padding) const { + impl->cameraMutated = true; return impl->transform.getLatLng(padding); } void Map::resetPosition(optional<EdgeInsets> padding) { + impl->cameraMutated = true; CameraOptions camera; camera.angle = 0; camera.pitch = 0; @@ -489,11 +512,13 @@ void Map::resetPosition(optional<EdgeInsets> padding) { #pragma mark - Scale void Map::scaleBy(double ds, optional<ScreenCoordinate> anchor, const Duration& duration) { + impl->cameraMutated = true; impl->transform.scaleBy(ds, anchor, duration); impl->onUpdate(Update::RecalculateStyle); } void Map::setScale(double scale, optional<ScreenCoordinate> anchor, const Duration& duration) { + impl->cameraMutated = true; impl->transform.setScale(scale, anchor, duration); impl->onUpdate(Update::RecalculateStyle); } @@ -503,10 +528,12 @@ double Map::getScale() const { } void Map::setZoom(double zoom, const Duration& duration) { + impl->cameraMutated = true; setZoom(zoom, {}, duration); } void Map::setZoom(double zoom, optional<EdgeInsets> padding, const Duration& duration) { + impl->cameraMutated = true; impl->transform.setZoom(zoom, padding, duration); impl->onUpdate(Update::RecalculateStyle); } @@ -516,10 +543,12 @@ double Map::getZoom() const { } void Map::setLatLngZoom(const LatLng& latLng, double zoom, const Duration& duration) { + impl->cameraMutated = true; setLatLngZoom(latLng, zoom, {}, duration); } void Map::setLatLngZoom(const LatLng& latLng, double zoom, optional<EdgeInsets> padding, const Duration& duration) { + impl->cameraMutated = true; impl->transform.setLatLngZoom(latLng, zoom, padding, duration); impl->onUpdate(Update::RecalculateStyle); } @@ -591,6 +620,7 @@ CameraOptions Map::cameraForLatLngs(const std::vector<LatLng>& latLngs, optional } void Map::resetZoom() { + impl->cameraMutated = true; setZoom(0); } @@ -630,20 +660,24 @@ Size Map::getSize() const { #pragma mark - Rotation void Map::rotateBy(const ScreenCoordinate& first, const ScreenCoordinate& second, const Duration& duration) { + impl->cameraMutated = true; impl->transform.rotateBy(first, second, duration); impl->onUpdate(Update::Repaint); } void Map::setBearing(double degrees, const Duration& duration) { + impl->cameraMutated = true; setBearing(degrees, EdgeInsets(), duration); } void Map::setBearing(double degrees, optional<ScreenCoordinate> anchor, const Duration& duration) { + impl->cameraMutated = true; impl->transform.setAngle(-degrees * util::DEG2RAD, anchor, duration); impl->onUpdate(Update::Repaint); } void Map::setBearing(double degrees, optional<EdgeInsets> padding, const Duration& duration) { + impl->cameraMutated = true; impl->transform.setAngle(-degrees * util::DEG2RAD, padding, duration); impl->onUpdate(Update::Repaint); } @@ -653,6 +687,7 @@ double Map::getBearing() const { } void Map::resetNorth(const Duration& duration) { + impl->cameraMutated = true; impl->transform.setAngle(0, duration); impl->onUpdate(Update::Repaint); } @@ -660,10 +695,12 @@ void Map::resetNorth(const Duration& duration) { #pragma mark - Pitch void Map::setPitch(double pitch, const Duration& duration) { + impl->cameraMutated = true; setPitch(pitch, {}, duration); } void Map::setPitch(double pitch, optional<ScreenCoordinate> anchor, const Duration& duration) { + impl->cameraMutated = true; impl->transform.setPitch(pitch * util::DEG2RAD, anchor, duration); impl->onUpdate(Update::Repaint); } diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index 14aef5de42..8e05400885 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -115,9 +115,9 @@ private: // Defaults std::string name; LatLng defaultLatLng; - double defaultZoom; - double defaultBearing; - double defaultPitch; + double defaultZoom = 0; + double defaultBearing = 0; + double defaultPitch = 0; std::vector<std::unique_ptr<Layer>>::const_iterator findLayer(const std::string& layerID) const; void reloadLayerSource(Layer&); |