void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, int mods) { GLFWView *view = reinterpret_cast<GLFWView *>(glfwGetWindowUserPointer(window)); if (action == GLFW_RELEASE) { switch (key) { case GLFW_KEY_ESCAPE: glfwSetWindowShouldClose(window, true); break; case GLFW_KEY_TAB: view->map->cycleDebugOptions(); break; case GLFW_KEY_X: if (!mods) view->map->resetPosition(); break; case GLFW_KEY_S: if (view->changeStyleCallback) view->changeStyleCallback(); break; case GLFW_KEY_R: if (!mods) { static const mbgl::PropertyTransition transition { { mbgl::Milliseconds(300) } }; if (view->map->hasClass("night")) { view->map->removeClass("night", transition); } else { view->map->addClass("night", transition); } } break; case GLFW_KEY_N: if (!mods) view->map->resetNorth(); break; case GLFW_KEY_Z: view->nextOrientation(); break; case GLFW_KEY_Q: view->clearAnnotations(); break; case GLFW_KEY_P: { view->addRandomCustomPointAnnotations(1); } break; case GLFW_KEY_A: { // XXX Fix precision loss in flyTo: // https://github.com/mapbox/mapbox-gl-native/issues/4298 static const std::vector<mbgl::LatLng> places = { mbgl::LatLng { -16.796665, -179.999983 }, // Dateline monument mbgl::LatLng { 12.9810542, 77.6345551 }, // Mapbox Bengaluru, India mbgl::LatLng { -13.15607,-74.21773 }, // Mapbox Peru mbgl::LatLng { 37.77572, -122.4158818 }, // Mapbox SF, USA mbgl::LatLng { 38.91318,-77.03255 }, // Mapbox DC, USA }; static size_t nextPlace = 0; mbgl::CameraOptions cameraOptions; cameraOptions.center = places[nextPlace++]; cameraOptions.zoom = 20; cameraOptions.pitch = 30; mbgl::AnimationOptions animationOptions(mbgl::Seconds(10)); view->map->flyTo(cameraOptions, animationOptions); nextPlace = nextPlace % places.size(); } break; } } if (action == GLFW_RELEASE || action == GLFW_REPEAT) { switch (key) { case GLFW_KEY_W: view->popAnnotation(); break; case GLFW_KEY_1: view->addRandomPointAnnotations(1); break; case GLFW_KEY_2: view->addRandomPointAnnotations(10); break; case GLFW_KEY_3: view->addRandomPointAnnotations(100); break; case GLFW_KEY_4: view->addRandomPointAnnotations(1000); break; case GLFW_KEY_5: view->addRandomPointAnnotations(10000); break; case GLFW_KEY_6: view->addRandomPointAnnotations(100000); break; case GLFW_KEY_7: view->addRandomShapeAnnotations(1); break; case GLFW_KEY_8: view->addRandomShapeAnnotations(10); break; case GLFW_KEY_9: view->addRandomShapeAnnotations(100); break; case GLFW_KEY_0: view->addRandomShapeAnnotations(1000); break; } } }
void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, int mods) { auto *view = reinterpret_cast<GLFWView *>(glfwGetWindowUserPointer(window)); if (action == GLFW_RELEASE) { if (key != GLFW_KEY_R || key != GLFW_KEY_S) view->animateRouteCallback = nullptr; switch (key) { case GLFW_KEY_ESCAPE: glfwSetWindowShouldClose(window, true); break; case GLFW_KEY_TAB: view->map->cycleDebugOptions(); break; case GLFW_KEY_X: if (!mods) view->map->resetPosition(); break; case GLFW_KEY_S: if (view->changeStyleCallback) view->changeStyleCallback(); break; #if not MBGL_USE_GLES2 case GLFW_KEY_B: { auto debug = view->map->getDebug(); if (debug & mbgl::MapDebugOptions::StencilClip) { debug &= ~mbgl::MapDebugOptions::StencilClip; debug |= mbgl::MapDebugOptions::DepthBuffer; } else if (debug & mbgl::MapDebugOptions::DepthBuffer) { debug &= ~mbgl::MapDebugOptions::DepthBuffer; } else { debug |= mbgl::MapDebugOptions::StencilClip; } view->map->setDebug(debug); } break; #endif // MBGL_USE_GLES2 case GLFW_KEY_N: if (!mods) view->map->resetNorth(); break; case GLFW_KEY_Z: view->nextOrientation(); break; case GLFW_KEY_Q: { auto result = view->map->queryPointAnnotations({ {}, { double(view->getSize().width), double(view->getSize().height) } }); printf("visible point annotations: %lu\n", result.size()); } break; case GLFW_KEY_P: view->pauseResumeCallback(); break; case GLFW_KEY_C: view->clearAnnotations(); break; case GLFW_KEY_K: view->addRandomCustomPointAnnotations(1); break; case GLFW_KEY_L: view->addRandomLineAnnotations(1); break; case GLFW_KEY_A: { // XXX Fix precision loss in flyTo: // https://github.com/mapbox/mapbox-gl-native/issues/4298 static const std::vector<mbgl::LatLng> places = { mbgl::LatLng { -16.796665, -179.999983 }, // Dateline monument mbgl::LatLng { 12.9810542, 77.6345551 }, // Mapbox Bengaluru, India mbgl::LatLng { -13.15607,-74.21773 }, // Mapbox Peru mbgl::LatLng { 37.77572, -122.4158818 }, // Mapbox SF, USA mbgl::LatLng { 38.91318,-77.03255 }, // Mapbox DC, USA }; static size_t nextPlace = 0; mbgl::CameraOptions cameraOptions; cameraOptions.center = places[nextPlace++]; cameraOptions.zoom = 20; cameraOptions.pitch = 30; mbgl::AnimationOptions animationOptions(mbgl::Seconds(10)); view->map->flyTo(cameraOptions, animationOptions); nextPlace = nextPlace % places.size(); } break; case GLFW_KEY_R: { view->show3DExtrusions = true; view->toggle3DExtrusions(view->show3DExtrusions); if (view->animateRouteCallback) break; view->animateRouteCallback = [](mbgl::Map* routeMap) { static mapbox::cheap_ruler::CheapRuler ruler { 40.7 }; // New York static mapbox::geojson::geojson route { mapbox::geojson::parse(mbgl::platform::glfw::route) }; const auto& geometry = route.get<mapbox::geometry::geometry<double>>(); const auto& lineString = geometry.get<mapbox::geometry::line_string<double>>(); static double routeDistance = ruler.lineDistance(lineString); static double routeProgress = 0; routeProgress += 0.0005; if (routeProgress > 1.0) routeProgress = 0; double distance = routeProgress * routeDistance; auto point = ruler.along(lineString, distance); auto latLng = routeMap->getLatLng(); routeMap->setLatLng({ point.y, point.x }); double bearing = ruler.bearing({ latLng.longitude(), latLng.latitude() }, point); double easing = bearing - routeMap->getBearing(); easing += easing > 180.0 ? -360.0 : easing < -180 ? 360.0 : 0; routeMap->setBearing(routeMap->getBearing() + (easing / 20)); routeMap->setPitch(60.0); routeMap->setZoom(18.0); }; view->animateRouteCallback(view->map); } break; case GLFW_KEY_E: view->toggle3DExtrusions(!view->show3DExtrusions); break; } } if (action == GLFW_RELEASE || action == GLFW_REPEAT) { switch (key) { case GLFW_KEY_W: view->popAnnotation(); break; case GLFW_KEY_1: view->addRandomPointAnnotations(1); break; case GLFW_KEY_2: view->addRandomPointAnnotations(10); break; case GLFW_KEY_3: view->addRandomPointAnnotations(100); break; case GLFW_KEY_4: view->addRandomPointAnnotations(1000); break; case GLFW_KEY_5: view->addRandomPointAnnotations(10000); break; case GLFW_KEY_6: view->addRandomPointAnnotations(100000); break; case GLFW_KEY_7: view->addRandomShapeAnnotations(1); break; case GLFW_KEY_8: view->addRandomShapeAnnotations(10); break; case GLFW_KEY_9: view->addRandomShapeAnnotations(100); break; case GLFW_KEY_0: view->addRandomShapeAnnotations(1000); break; } } }