Merge branch 'master' of github.com:mapbox/llmr-native into variant
This commit is contained in:
@@ -34,22 +34,23 @@ public:
|
||||
|
||||
/* position */
|
||||
void moveBy(double dx, double dy, double duration = 0);
|
||||
// void setLonLat(double lon, double lat);
|
||||
void setLonLat(double lon, double lat, double duration = 0);
|
||||
void getLonLat(double &lon, double &lat) const;
|
||||
void resetPosition();
|
||||
|
||||
/* scale */
|
||||
void scaleBy(double ds, double cx = -1, double cy = -1, double duration = 0);
|
||||
void setScale(double scale, double cx = -1, double cy = -1, double duration = 0);
|
||||
double getScale() const;
|
||||
// void setZoom(double zoom);
|
||||
// void setLonLatZoom(double lon, double lat, double zoom);
|
||||
// double getZoom() const;
|
||||
// void getLonLatZoom(double &lon, double &lat, double &zoom) const;
|
||||
// void resetZoom();
|
||||
void setZoom(double zoom, double duration = 0);
|
||||
double getZoom() const;
|
||||
void setLonLatZoom(double lon, double lat, double zoom, double duration = 0);
|
||||
void getLonLatZoom(double &lon, double &lat, double &zoom) const;
|
||||
void resetZoom();
|
||||
|
||||
/* rotation */
|
||||
void rotateBy(double cx, double cy, double sx, double sy, double ex, double ey);
|
||||
void setAngle(double angle, double cx = -1, double cy = -1);
|
||||
void rotateBy(double cx, double cy, double sx, double sy, double ex, double ey, double duration = 0);
|
||||
void setAngle(double angle, double cx = -1, double cy = -1, double duration = 0);
|
||||
double getAngle() const;
|
||||
void resetNorth();
|
||||
|
||||
|
||||
@@ -24,13 +24,14 @@ public:
|
||||
// Relative changes
|
||||
void moveBy(double dx, double dy, double duration = 0);
|
||||
void scaleBy(double ds, double cx = -1, double cy = -1, double duration = 0);
|
||||
void rotateBy(double cx, double cy, double sx, double sy, double ex, double ey);
|
||||
void rotateBy(double cx, double cy, double sx, double sy, double ex, double ey, double duration = 0);
|
||||
|
||||
// Absolute changes
|
||||
void setScale(double scale, double cx = -1, double cy = -1, double duration = 0);
|
||||
void setAngle(double angle, double duration = 0);
|
||||
void setZoom(double zoom);
|
||||
void setLonLat(double lon, double lat);
|
||||
void setZoom(double zoom, double duration = 0);
|
||||
void setLonLat(double lon, double lat, double duration = 0);
|
||||
void setLonLatZoom(double lon, double lat, double zoom, double duration = 0);
|
||||
|
||||
// Getters
|
||||
void matrixFor(mat4& matrix, const vec3<int32_t>& id) const;
|
||||
@@ -39,12 +40,13 @@ public:
|
||||
double getScale() const;
|
||||
double getAngle() const;
|
||||
void getLonLat(double& lon, double& lat) const;
|
||||
|
||||
void getLonLatZoom(double& lon, double& lat, double& zoom) const;
|
||||
|
||||
// Temporary
|
||||
void mapCornersToBox(uint32_t z, box& b) const;
|
||||
|
||||
private:
|
||||
void setScaleXY(double new_scale, double xn, double yn, double duration = 0);
|
||||
double pixel_x() const;
|
||||
double pixel_y() const;
|
||||
|
||||
|
||||
@@ -75,14 +75,40 @@ void Map::scaleBy(double ds, double cx, double cy, double duration) {
|
||||
settings.save();
|
||||
}
|
||||
|
||||
void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double ey) {
|
||||
transform.rotateBy(cx, cy, sx, sy, ex, ey);
|
||||
void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double ey, double duration) {
|
||||
transform.rotateBy(cx, cy, sx, sy, ex, ey, duration);
|
||||
update();
|
||||
|
||||
settings.angle = transform.getAngle();
|
||||
settings.save();
|
||||
}
|
||||
|
||||
void Map::setLonLat(double lon, double lat, double duration) {
|
||||
transform.setLonLat(lon, lat, duration);
|
||||
update();
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.save();
|
||||
}
|
||||
|
||||
void Map::getLonLat(double &lon, double &lat) const {
|
||||
transform.getLonLat(lon, lat);
|
||||
}
|
||||
|
||||
void Map::setLonLatZoom(double lon, double lat, double zoom, double duration) {
|
||||
transform.setLonLatZoom(lon, lat, zoom, duration);
|
||||
style.cascade(transform.getZoom());
|
||||
update();
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.scale = transform.getScale();
|
||||
settings.save();
|
||||
}
|
||||
|
||||
void Map::getLonLatZoom(double &lon, double &lat, double &zoom) const {
|
||||
transform.getLonLatZoom(lon, lat, zoom);
|
||||
}
|
||||
|
||||
void Map::setScale(double scale, double cx, double cy, double duration) {
|
||||
transform.setScale(scale, cx, cy, duration);
|
||||
style.cascade(transform.getZoom());
|
||||
@@ -93,19 +119,33 @@ void Map::setScale(double scale, double cx, double cy, double duration) {
|
||||
settings.save();
|
||||
}
|
||||
|
||||
void Map::setAngle(double angle, double x, double y) {
|
||||
void Map::setZoom(double zoom, double duration) {
|
||||
transform.setZoom(zoom, duration);
|
||||
style.cascade(transform.getZoom());
|
||||
update();
|
||||
|
||||
transform.getLonLat(settings.longitude, settings.latitude);
|
||||
settings.scale = transform.getScale();
|
||||
settings.save();
|
||||
}
|
||||
|
||||
double Map::getZoom() const {
|
||||
return transform.getZoom();
|
||||
}
|
||||
|
||||
void Map::setAngle(double angle, double x, double y, double duration) {
|
||||
double dx = 0, dy = 0;
|
||||
|
||||
if (x >= 0 && y >= 0) {
|
||||
dx = (transform.width / 2) - x;
|
||||
dy = (transform.height / 2) - y;
|
||||
transform.moveBy(dx, dy);
|
||||
transform.moveBy(dx, dy, duration);
|
||||
}
|
||||
|
||||
transform.setAngle(angle);
|
||||
transform.setAngle(angle, duration);
|
||||
|
||||
if (x >= 0 && y >= 0) {
|
||||
transform.moveBy(-dx, -dy);
|
||||
transform.moveBy(-dx, -dy, duration);
|
||||
}
|
||||
|
||||
update();
|
||||
@@ -124,7 +164,7 @@ double Map::getAngle() const {
|
||||
}
|
||||
|
||||
void Map::resetNorth() {
|
||||
transform.setAngle(0, 0.5); // 500 ms
|
||||
transform.setAngle(0, 0.5);
|
||||
update();
|
||||
|
||||
settings.angle = transform.getAngle();
|
||||
@@ -144,6 +184,10 @@ void Map::resetPosition() {
|
||||
settings.save();
|
||||
}
|
||||
|
||||
void Map::resetZoom() {
|
||||
setZoom(0);
|
||||
}
|
||||
|
||||
void Map::toggleDebug() {
|
||||
settings.debug = !settings.debug;
|
||||
update();
|
||||
|
||||
@@ -59,7 +59,7 @@ void Transform::scaleBy(double ds, double cx, double cy, double duration) {
|
||||
}
|
||||
|
||||
|
||||
void Transform::rotateBy(double anchor_x, double anchor_y, double start_x, double start_y, double end_x, double end_y) {
|
||||
void Transform::rotateBy(double anchor_x, double anchor_y, double start_x, double start_y, double end_x, double end_y, double duration) {
|
||||
double center_x = width / 2, center_y = height / 2;
|
||||
|
||||
const double begin_center_x = start_x - center_x;
|
||||
@@ -83,7 +83,7 @@ void Transform::rotateBy(double anchor_x, double anchor_y, double start_x, doubl
|
||||
|
||||
const double ang = angle + util::angle_between(first_x, first_y, second_x, second_y);
|
||||
|
||||
setAngle(ang);
|
||||
setAngle(ang, duration);
|
||||
}
|
||||
|
||||
void Transform::setAngle(double new_angle, double duration) {
|
||||
@@ -97,6 +97,23 @@ void Transform::setAngle(double new_angle, double duration) {
|
||||
}
|
||||
}
|
||||
|
||||
void Transform::setScaleXY(double new_scale, double xn, double yn, double duration) {
|
||||
if (duration == 0) {
|
||||
scale = new_scale;
|
||||
x = xn;
|
||||
y = yn;
|
||||
} else {
|
||||
animations.emplace_front(scale, new_scale, scale, duration);
|
||||
animations.emplace_front(x, xn, x, duration);
|
||||
animations.emplace_front(y, yn, y, duration);
|
||||
}
|
||||
|
||||
const double s = scale * size;
|
||||
zc = s / 2;
|
||||
Bc = s / 360;
|
||||
Cc = s / (2 * M_PI);
|
||||
}
|
||||
|
||||
void Transform::setScale(double new_scale, double cx, double cy, double duration) {
|
||||
if (new_scale < min_scale) {
|
||||
new_scale = min_scale;
|
||||
@@ -104,6 +121,11 @@ void Transform::setScale(double new_scale, double cx, double cy, double duration
|
||||
new_scale = max_scale;
|
||||
}
|
||||
|
||||
if (cx < 0 || cy < 0) {
|
||||
cx = width / 2;
|
||||
cy = height / 2;
|
||||
}
|
||||
|
||||
const double factor = new_scale / scale;
|
||||
const double dx = (cx - width / 2) * (1.0 - factor);
|
||||
const double dy = (cy - height / 2) * (1.0 - factor);
|
||||
@@ -111,30 +133,34 @@ void Transform::setScale(double new_scale, double cx, double cy, double duration
|
||||
double xn = x * factor + dx;
|
||||
double yn = y * factor + dy;
|
||||
|
||||
if (duration == 0) {
|
||||
x = xn;
|
||||
y = yn;
|
||||
scale = new_scale;
|
||||
} else {
|
||||
animations.emplace_front(x, xn, x, duration);
|
||||
animations.emplace_front(y, yn, y, duration);
|
||||
animations.emplace_front(scale, new_scale, scale, duration);
|
||||
}
|
||||
setScaleXY(new_scale, xn, yn, duration);
|
||||
}
|
||||
|
||||
const double s = scale * size;
|
||||
void Transform::setZoom(double zoom, double duration) {
|
||||
setScale(pow(2.0, zoom), -1, -1, duration);
|
||||
}
|
||||
|
||||
void Transform::setLonLat(double lon, double lat, double duration) {
|
||||
const double f = fmin(fmax(sin(D2R * lat), -0.9999), 0.9999);
|
||||
double xn = -round(lon * Bc);
|
||||
double yn = round(0.5 * Cc * log((1 + f) / (1 - f)));
|
||||
|
||||
setScaleXY(scale, xn, yn, duration);
|
||||
}
|
||||
|
||||
void Transform::setLonLatZoom(double lon, double lat, double zoom, double duration) {
|
||||
double new_scale = pow(2.0, zoom);
|
||||
|
||||
const double s = new_scale * size;
|
||||
zc = s / 2;
|
||||
Bc = s / 360;
|
||||
Cc = s / (2 * M_PI);
|
||||
}
|
||||
|
||||
void Transform::setZoom(double zoom) {
|
||||
setScale(pow(2.0, zoom));
|
||||
}
|
||||
|
||||
void Transform::setLonLat(double lon, double lat) {
|
||||
const double f = fmin(fmax(sin(D2R * lat), -0.9999), 0.9999);
|
||||
x = -round(lon * Bc);
|
||||
y = round(0.5 * Cc * log((1 + f) / (1 - f)));
|
||||
double xn = -round(lon * Bc);
|
||||
double yn = round(0.5 * Cc * log((1 + f) / (1 - f)));
|
||||
|
||||
setScaleXY(new_scale, xn, yn, duration);
|
||||
}
|
||||
|
||||
void Transform::getLonLat(double &lon, double &lat) const {
|
||||
@@ -142,6 +168,11 @@ void Transform::getLonLat(double &lon, double &lat) const {
|
||||
lat = R2D * (2 * atan(exp(y / Cc)) - 0.5 * M_PI);
|
||||
}
|
||||
|
||||
void Transform::getLonLatZoom(double& lon, double& lat, double& zoom) const {
|
||||
getLonLat(lon, lat);
|
||||
zoom = getZoom();
|
||||
}
|
||||
|
||||
double Transform::pixel_x() const {
|
||||
const double center = (width - scale * size) / 2;
|
||||
return center + x;
|
||||
|
||||
Reference in New Issue
Block a user