diff options
Diffstat (limited to 'src/mbgl/util/camera.cpp')
-rw-r--r-- | src/mbgl/util/camera.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/mbgl/util/camera.cpp b/src/mbgl/util/camera.cpp index f64e24ab2d..34d27620ac 100644 --- a/src/mbgl/util/camera.cpp +++ b/src/mbgl/util/camera.cpp @@ -212,4 +212,51 @@ optional<Quaternion> Camera::orientationFromFrame(const vec3& forward, const vec return util::orientationFromPitchBearing(pitch, bearing); } } // namespace util + +void FreeCameraOptions::setLocation(const LatLngAltitude& location) { + position = util::toMercator(location.location, location.altitude); +} + +optional<LatLngAltitude> FreeCameraOptions::getLocation() const { + if (!position) { + return nullopt; + } + + const vec3 positionValue = position.value(); + if (positionValue[1] < 0.0 || positionValue[1] > 1.0) { + return nullopt; + } + + const LatLng location = {util::latFromMercatorY(positionValue[1]), util::lngFromMercatorX(positionValue[0])}; + + const double metersPerPixel = Projection::getMetersPerPixelAtLatitude(location.latitude(), 0.0); + const double worldSize = Projection::worldSize(std::pow(2.0, 0.0)); + const double altitude = positionValue[2] * worldSize * metersPerPixel; + + return LatLngAltitude{location, altitude}; +} + +void FreeCameraOptions::lookAtPoint(const LatLng& location, const optional<vec3>& upVector) { + orientation = nullopt; + if (!position) { + return; + } + + const vec3 target = util::toMercator(location, 0.0); + const vec3 forward = vec3Sub(target, position.value()); + vec3 up = upVector ? upVector.value() : vec3{{0.0, 0.0, 1.0}}; + + // Flip z-component of the up vector if it's pointing downwards + up[2] = std::abs(up[2]); + + const auto newOrientation = util::Camera::orientationFromFrame(forward, up); + if (newOrientation) { + orientation = newOrientation.value().m; + } +} + +void FreeCameraOptions::setPitchBearing(double pitch, double bearing) { + orientation = util::orientationFromPitchBearing(pitch * util::DEG2RAD, bearing * util::DEG2RAD).m; +} + } // namespace mbgl
\ No newline at end of file |