From 3274780dda19ec953617f75c2cf4e2a402ceee45 Mon Sep 17 00:00:00 2001 From: zmiao Date: Wed, 13 Nov 2019 14:10:29 +0200 Subject: add updateMatrix --- src/mbgl/map/transform.cpp | 7 +++++++ src/mbgl/map/transform_state.cpp | 36 +++++++++++++++++++----------------- src/mbgl/map/transform_state.hpp | 6 ++++-- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index 511c222417..ce0a932a34 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -57,6 +57,7 @@ void Transform::resize(const Size size) { state.setSize(size); state.constrain(); + state.updateMatrix(); observer.onCameraDidChange(MapObserver::CameraChangeMode::Immediate); } @@ -157,6 +158,7 @@ void Transform::easeTo(const CameraOptions& camera, const AnimationOptions& anim state.setPitch(std::min(maxPitch, util::interpolate(startPitch, pitch, t))); } }, duration); + state.updateMatrix(); } /** This method implements an “optimal path” animation, as detailed in: @@ -330,6 +332,8 @@ void Transform::flyTo(const CameraOptions &camera, const AnimationOptions &anima state.setPitch(std::min(maxPitch, util::interpolate(startPitch, pitch, k))); } }, duration); + state.updateMatrix(); + } #pragma mark - Position @@ -405,6 +409,7 @@ double Transform::getPitch() const { void Transform::setNorthOrientation(NorthOrientation orientation) { state.setNorthOrientation( orientation); state.constrain(); + state.updateMatrix(); } NorthOrientation Transform::getNorthOrientation() const { @@ -416,6 +421,7 @@ NorthOrientation Transform::getNorthOrientation() const { void Transform::setConstrainMode(mbgl::ConstrainMode mode) { state.setConstrainMode(mode); state.constrain(); + state.updateMatrix(); } ConstrainMode Transform::getConstrainMode() const { @@ -438,6 +444,7 @@ void Transform::setProjectionMode(const ProjectionMode& options) { state.setAxonometric(options.axonometric.value_or(state.getAxonometric())); state.setXSkew(options.xSkew.value_or(state.getXSkew())); state.setYSkew(options.ySkew.value_or(state.getYSkew())); + state.updateMatrix(); } ProjectionMode Transform::getProjectionMode() const { diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp index 7123253075..42e248bdc9 100644 --- a/src/mbgl/map/transform_state.cpp +++ b/src/mbgl/map/transform_state.cpp @@ -108,15 +108,17 @@ void TransformState::getProjMatrix(mat4& projMatrix, uint16_t nearZ, bool aligne } } +void TransformState::updateMatrix() { + coordiMatrix = coordinatePointMatrix(); + mat4 mat = coordiMatrix; + + bool err = matrix::invert(invertedMatrix, mat); + + if (err) throw std::runtime_error("failed to invert coordinatePointMatrix"); +} + void TransformState::setSize(const Size& size_) { size = size_; -// coordiMatrix = coordinatePointMatrix(); -// mat4 mat = coordiMatrix; -// -// bool err = matrix::invert(invertedMatrix, mat); -// -// if (err) throw std::runtime_error("failed to invert coordinatePointMatrix"); - } #pragma mark - Dimensions @@ -292,11 +294,11 @@ ScreenCoordinate TransformState::latLngToScreenCoordinate(const LatLng& latLng) return {}; } - mat4 mat = coordinatePointMatrix(); + // mat4 mat = coordinatePointMatrix(); vec4 p; Point pt = Projection::project(latLng, scale) / util::tileSize; vec4 c = {{ pt.x, pt.y, 0, 1 }}; - matrix::transformMat4(p, c, mat); + matrix::transformMat4(p, c, coordiMatrix); return { p[0] / p[3], size.height - p[1] / p[3] }; } @@ -306,12 +308,12 @@ TileCoordinate TransformState::screenCoordinateToTileCoordinate(const ScreenCoor } float targetZ = 0; - mat4 mat = coordinatePointMatrix(); + // mat4 mat = coordinatePointMatrix(); - mat4 inverted; - bool err = matrix::invert(inverted, mat); + // mat4 inverted; + // bool err = matrix::invert(inverted, mat); - if (err) throw std::runtime_error("failed to invert coordinatePointMatrix"); + // if (err) throw std::runtime_error("failed to invert coordinatePointMatrix"); double flippedY = size.height - point.y; @@ -323,8 +325,8 @@ TileCoordinate TransformState::screenCoordinateToTileCoordinate(const ScreenCoor vec4 coord1; vec4 point0 = {{ point.x, flippedY, 0, 1 }}; vec4 point1 = {{ point.x, flippedY, 1, 1 }}; - matrix::transformMat4(coord0, point0, inverted); - matrix::transformMat4(coord1, point1, inverted); + matrix::transformMat4(coord0, point0, invertedMatrix); + matrix::transformMat4(coord1, point1, invertedMatrix); double w0 = coord0[3]; double w1 = coord1[3]; @@ -449,11 +451,11 @@ float TransformState::maxPitchScaleFactor() const { return {}; } auto latLng = screenCoordinateToLatLng({ 0, static_cast(getSize().height) }); - mat4 mat = coordinatePointMatrix(); + // mat4 mat = coordinatePointMatrix(); Point pt = Projection::project(latLng, scale) / util::tileSize; vec4 p = {{ pt.x, pt.y, 0, 1 }}; vec4 topPoint; - matrix::transformMat4(topPoint, p, mat); + matrix::transformMat4(topPoint, p, coordiMatrix); return topPoint[3] / getCameraToCenterDistance(); } diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp index 621a810a5f..165e4fcec6 100644 --- a/src/mbgl/map/transform_state.hpp +++ b/src/mbgl/map/transform_state.hpp @@ -119,6 +119,8 @@ public: void moveLatLng(const LatLng&, const ScreenCoordinate&); void setLatLngZoom(const LatLng &latLng, double zoom); + + void updateMatrix(); private: bool rotatedNorth() const; void constrain(double& scale, double& x, double& y) const; @@ -176,8 +178,8 @@ private: double Bc = Projection::worldSize(scale) / util::DEGREES_MAX; double Cc = Projection::worldSize(scale) / util::M2PI; - // mat4 coordiMatrix; - // mat4 invertedMatrix; + mat4 coordiMatrix; + mat4 invertedMatrix; }; } // namespace mbgl -- cgit v1.2.1