diff options
Diffstat (limited to 'platform/glfw')
-rw-r--r-- | platform/glfw/glfw_renderer_frontend.cpp | 41 | ||||
-rw-r--r-- | platform/glfw/glfw_renderer_frontend.hpp | 29 | ||||
-rw-r--r-- | platform/glfw/glfw_view.cpp | 23 | ||||
-rw-r--r-- | platform/glfw/glfw_view.hpp | 26 | ||||
-rw-r--r-- | platform/glfw/main.cpp | 148 | ||||
-rw-r--r-- | platform/glfw/settings_json.cpp | 3 | ||||
-rw-r--r-- | platform/glfw/settings_json.hpp | 4 |
7 files changed, 176 insertions, 98 deletions
diff --git a/platform/glfw/glfw_renderer_frontend.cpp b/platform/glfw/glfw_renderer_frontend.cpp new file mode 100644 index 0000000000..73205f1c56 --- /dev/null +++ b/platform/glfw/glfw_renderer_frontend.cpp @@ -0,0 +1,41 @@ +#include "glfw_renderer_frontend.hpp" + +#include <mbgl/renderer/renderer.hpp> + +GLFWRendererFrontend::GLFWRendererFrontend(std::unique_ptr<mbgl::Renderer> renderer_, GLFWView& glfwView_) + : glfwView(glfwView_) + , renderer(std::move(renderer_)) { + glfwView.setRenderFrontend(this); +} + +GLFWRendererFrontend::~GLFWRendererFrontend() = default; + +void GLFWRendererFrontend::reset() { + assert(renderer); + renderer.reset(); +} + +void GLFWRendererFrontend::setObserver(mbgl::RendererObserver& observer) { + assert(renderer); + renderer->setObserver(&observer); +} + +void GLFWRendererFrontend::update(std::shared_ptr<mbgl::UpdateParameters> params) { + updateParameters = std::move(params); + glfwView.invalidate(); +} + +void GLFWRendererFrontend::render() { + assert(renderer); + + if (!updateParameters) return; + + mbgl::BackendScope guard { glfwView, mbgl::BackendScope::ScopeType::Implicit }; + + renderer->render(*updateParameters); +} + +mbgl::Renderer* GLFWRendererFrontend::getRenderer() { + assert(renderer); + return renderer.get(); +} diff --git a/platform/glfw/glfw_renderer_frontend.hpp b/platform/glfw/glfw_renderer_frontend.hpp new file mode 100644 index 0000000000..c992fe20fe --- /dev/null +++ b/platform/glfw/glfw_renderer_frontend.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "glfw_view.hpp" +#include <mbgl/renderer/renderer_frontend.hpp> + +#include <memory> + +namespace mbgl { +class Renderer; +} // namespace mbgl + +class GLFWRendererFrontend : public mbgl::RendererFrontend { +public: + GLFWRendererFrontend(std::unique_ptr<mbgl::Renderer>, GLFWView&); + ~GLFWRendererFrontend() override; + + void reset() override; + void setObserver(mbgl::RendererObserver&) override; + + void update(std::shared_ptr<mbgl::UpdateParameters>) override; + void render(); + + mbgl::Renderer* getRenderer(); + +private: + GLFWView& glfwView; + std::unique_ptr<mbgl::Renderer> renderer; + std::shared_ptr<mbgl::UpdateParameters> updateParameters; +}; diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index 1beaf2b52b..8fc2fba283 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -1,4 +1,5 @@ #include "glfw_view.hpp" +#include "glfw_renderer_frontend.hpp" #include "ny_route.hpp" #include <mbgl/annotation/annotation.hpp> @@ -10,7 +11,8 @@ #include <mbgl/util/platform.hpp> #include <mbgl/util/string.hpp> #include <mbgl/util/chrono.hpp> -#include <mbgl/map/backend_scope.hpp> +#include <mbgl/renderer/renderer.hpp> +#include <mbgl/renderer/backend_scope.hpp> #include <mbgl/map/camera.hpp> #include <mapbox/cheap_ruler.hpp> @@ -108,6 +110,7 @@ GLFWView::GLFWView(bool fullscreen_, bool benchmark_) printf("- Press `N` to reset north\n"); printf("- Press `R` to enable the route demo\n"); printf("- Press `E` to insert an example building extrusion layer\n"); + printf("- Press `O` to toggle online connectivity\n"); printf("- Press `Z` to cycle through north orientations\n"); printf("- Prezz `X` to cycle through the viewport modes\n"); printf("- Press `A` to cycle through Mapbox offices in the world + dateline monument\n"); @@ -142,6 +145,10 @@ void GLFWView::setMap(mbgl::Map *map_) { map->addAnnotationImage(makeImage("default_marker", 22, 22, 1)); } +void GLFWView::setRenderFrontend(GLFWRendererFrontend* rendererFrontend_) { + rendererFrontend = rendererFrontend_; +} + void GLFWView::updateAssumedState() { assumeFramebufferBinding(0); assumeViewport(0, 0, getFramebufferSize()); @@ -170,6 +177,9 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, if (!mods) view->map->resetPosition(); break; + case GLFW_KEY_O: + view->onlineStatusCallback(); + break; case GLFW_KEY_S: if (view->changeStyleCallback) view->changeStyleCallback(); @@ -196,7 +206,7 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action, view->nextOrientation(); break; case GLFW_KEY_Q: { - auto result = view->map->queryPointAnnotations({ {}, { double(view->getSize().width), double(view->getSize().height) } }); + auto result = view->rendererFrontend->getRenderer()->queryPointAnnotations({ {}, { double(view->getSize().width), double(view->getSize().height) } }); printf("visible point annotations: %lu\n", result.size()); } break; case GLFW_KEY_P: @@ -489,16 +499,16 @@ void GLFWView::run() { glfwPollEvents(); - if (dirty) { + if (dirty && rendererFrontend) { + dirty = false; const double started = glfwGetTime(); if (animateRouteCallback) animateRouteCallback(map); activate(); - mbgl::BackendScope scope { *this, mbgl::BackendScope::ScopeType::Implicit }; - map->render(*this); + rendererFrontend->render(); glfwSwapBuffers(window); @@ -507,7 +517,6 @@ void GLFWView::run() { invalidate(); } - dirty = false; } }; @@ -531,7 +540,7 @@ mbgl::Size GLFWView::getFramebufferSize() const { return { static_cast<uint32_t>(fbWidth), static_cast<uint32_t>(fbHeight) }; } -mbgl::gl::ProcAddress GLFWView::initializeExtension(const char* name) { +mbgl::gl::ProcAddress GLFWView::getExtensionFunctionPointer(const char* name) { return glfwGetProcAddress(name); } diff --git a/platform/glfw/glfw_view.hpp b/platform/glfw/glfw_view.hpp index 366fe4fd68..35f17b723a 100644 --- a/platform/glfw/glfw_view.hpp +++ b/platform/glfw/glfw_view.hpp @@ -1,15 +1,15 @@ #pragma once #include <mbgl/map/map.hpp> -#include <mbgl/map/view.hpp> -#include <mbgl/map/backend.hpp> +#include <mbgl/renderer/renderer_backend.hpp> #include <mbgl/util/run_loop.hpp> #include <mbgl/util/timer.hpp> #include <mbgl/util/geometry.hpp> struct GLFWwindow; +class GLFWRendererFrontend; -class GLFWView : public mbgl::View, public mbgl::Backend { +class GLFWView : public mbgl::RendererBackend, public mbgl::MapObserver { public: GLFWView(bool fullscreen = false, bool benchmark = false); ~GLFWView() override; @@ -17,6 +17,8 @@ public: float getPixelRatio() const; void setMap(mbgl::Map*); + + void setRenderFrontend(GLFWRendererFrontend*); // Callback called when the user presses the key mapped to style change. // The expected action is to set a new style, different to the current one. @@ -26,19 +28,23 @@ public: pauseResumeCallback = callback; }; + void setOnlineStatusCallback(std::function<void()> callback) { + onlineStatusCallback = callback; + } + void setShouldClose(); void setWindowTitle(const std::string&); void run(); + + void invalidate(); - // mbgl::View implementation - void bind() override; mbgl::Size getSize() const; - mbgl::Size getFramebufferSize() const; + mbgl::Size getFramebufferSize() const override; - // mbgl::Backend implementation - void invalidate() override; + // mbgl::RendererBackend implementation + void bind() override; void updateAssumedState() override; // mbgl::MapObserver implementation @@ -46,7 +52,7 @@ public: protected: // mbgl::Backend implementation - mbgl::gl::ProcAddress initializeExtension(const char*) override; + mbgl::gl::ProcAddress getExtensionFunctionPointer(const char*) override; void activate() override; void deactivate() override; @@ -83,6 +89,7 @@ private: void toggle3DExtrusions(bool visible); mbgl::Map* map = nullptr; + GLFWRendererFrontend* rendererFrontend = nullptr; bool fullscreen = false; const bool benchmark = false; @@ -108,6 +115,7 @@ private: std::function<void()> changeStyleCallback; std::function<void()> pauseResumeCallback; + std::function<void()> onlineStatusCallback; std::function<void(mbgl::Map*)> animateRouteCallback; mbgl::util::RunLoop runLoop; diff --git a/platform/glfw/main.cpp b/platform/glfw/main.cpp index 7192475835..c4e0ecf692 100644 --- a/platform/glfw/main.cpp +++ b/platform/glfw/main.cpp @@ -1,4 +1,5 @@ #include "glfw_view.hpp" +#include "glfw_renderer_frontend.hpp" #include "settings_json.hpp" #include <mbgl/util/default_styles.hpp> @@ -7,11 +8,13 @@ #include <mbgl/util/default_thread_pool.hpp> #include <mbgl/storage/default_file_source.hpp> #include <mbgl/style/style.hpp> +#include <mbgl/renderer/renderer.hpp> + +#include <args/args.hxx> #include <csignal> -#include <getopt.h> #include <fstream> -#include <sstream> +#include <iostream> #include <cstdlib> #include <cstdio> #include <array> @@ -32,69 +35,48 @@ void quit_handler(int) { } int main(int argc, char *argv[]) { - bool fullscreen = false; - bool benchmark = false; - std::string style; - double latitude = 0, longitude = 0; - double bearing = 0, zoom = 1, pitch = 0; - bool skipConfig = false; - - const struct option long_options[] = { - {"fullscreen", no_argument, nullptr, 'f'}, - {"benchmark", no_argument, nullptr, 'b'}, - {"style", required_argument, nullptr, 's'}, - {"lon", required_argument, nullptr, 'x'}, - {"lat", required_argument, nullptr, 'y'}, - {"zoom", required_argument, nullptr, 'z'}, - {"bearing", required_argument, nullptr, 'r'}, - {"pitch", required_argument, nullptr, 'p'}, - {nullptr, 0, nullptr, 0} - }; - - while (true) { - int option_index = 0; - int opt = getopt_long(argc, argv, "fbs:", long_options, &option_index); - if (opt == -1) break; - switch (opt) - { - case 0: - if (long_options[option_index].flag != nullptr) - break; - case 'f': - fullscreen = true; - break; - case 'b': - benchmark = true; - break; - case 's': - style = std::string("asset://") + std::string(optarg); - break; - case 'x': - longitude = atof(optarg); - skipConfig = true; - break; - case 'y': - latitude = atof(optarg); - skipConfig = true; - break; - case 'z': - zoom = atof(optarg); - skipConfig = true; - break; - case 'r': - bearing = atof(optarg); - skipConfig = true; - break; - case 'p': - pitch = atof(optarg); - skipConfig = true; - break; - default: - break; - } - + args::ArgumentParser argumentParser("Mapbox GL GLFW example"); + args::HelpFlag helpFlag(argumentParser, "help", "Display this help menu", {'h', "help"}); + + args::Flag fullscreenFlag(argumentParser, "fullscreen", "Toggle fullscreen", {'f', "fullscreen"}); + args::Flag benchmarkFlag(argumentParser, "benchmark", "Toggle benchmark", {'b', "benchmark"}); + args::Flag offlineFlag(argumentParser, "offline", "Toggle offline", {'o', "offline"}); + + args::ValueFlag<std::string> styleValue(argumentParser, "URL", "Map stylesheet", {'s', "style"}); + args::ValueFlag<double> lonValue(argumentParser, "degrees", "Longitude", {'x', "lon"}); + args::ValueFlag<double> latValue(argumentParser, "degrees", "Latitude", {'y', "lat"}); + args::ValueFlag<double> zoomValue(argumentParser, "number", "Zoom level", {'z', "zoom"}); + args::ValueFlag<double> bearingValue(argumentParser, "degrees", "Bearing", {'b', "bearing"}); + args::ValueFlag<double> pitchValue(argumentParser, "degrees", "Pitch", {'p', "pitch"}); + + try { + argumentParser.ParseCLI(argc, argv); + } catch (args::Help) { + std::cout << argumentParser; + exit(0); + } catch (args::ParseError e) { + std::cerr << e.what() << std::endl; + std::cerr << argumentParser; + exit(1); + } catch (args::ValidationError e) { + std::cerr << e.what() << std::endl; + std::cerr << argumentParser; + exit(2); } + // Load settings + mbgl::Settings_JSON settings; + settings.online = !offlineFlag; + if (lonValue) settings.longitude = args::get(lonValue); + if (latValue) settings.latitude = args::get(latValue); + if (zoomValue) settings.zoom = args::get(zoomValue); + if (bearingValue) settings.bearing = args::get(bearingValue); + if (pitchValue) settings.pitch = args::get(pitchValue); + + const bool fullscreen = fullscreenFlag ? args::get(fullscreenFlag) : false; + const bool benchmark = benchmarkFlag ? args::get(benchmarkFlag) : false; + std::string style = styleValue ? args::get(styleValue) : ""; + // sigint handling struct sigaction sigIntHandler; sigIntHandler.sa_handler = quit_handler; @@ -110,6 +92,10 @@ int main(int argc, char *argv[]) { view = &backend; mbgl::DefaultFileSource fileSource("/tmp/mbgl-cache.db", "."); + if (!settings.online) { + fileSource.setOnlineStatus(false); + mbgl::Log::Warning(mbgl::Event::Setup, "Application is offline. Press `O` to toggle online status."); + } // Set access token if present const char *token = getenv("MAPBOX_ACCESS_TOKEN"); @@ -120,26 +106,26 @@ int main(int argc, char *argv[]) { } mbgl::ThreadPool threadPool(4); - - mbgl::Map map(backend, view->getSize(), view->getPixelRatio(), fileSource, threadPool); + GLFWRendererFrontend rendererFrontend { std::make_unique<mbgl::Renderer>(backend, view->getPixelRatio(), fileSource, threadPool), backend }; + mbgl::Map map(rendererFrontend, backend, view->getSize(), view->getPixelRatio(), fileSource, threadPool); backend.setMap(&map); - // Load settings - mbgl::Settings_JSON settings; - - if (skipConfig) { - map.setLatLngZoom(mbgl::LatLng(latitude, longitude), zoom); - map.setBearing(bearing); - map.setPitch(pitch); - mbgl::Log::Info(mbgl::Event::General, "Location: %f/%f (z%.2f, %.2f deg)", latitude, longitude, zoom, bearing); - } else { - map.setLatLngZoom(mbgl::LatLng(settings.latitude, settings.longitude), settings.zoom); - map.setBearing(settings.bearing); - map.setPitch(settings.pitch); - map.setDebug(mbgl::MapDebugOptions(settings.debug)); + if (!style.empty() && style.find("://") == std::string::npos) { + style = std::string("file://") + style; } + map.setLatLngZoom(mbgl::LatLng(settings.latitude, settings.longitude), settings.zoom); + map.setBearing(settings.bearing); + map.setPitch(settings.pitch); + map.setDebug(mbgl::MapDebugOptions(settings.debug)); + + view->setOnlineStatusCallback([&settings, &fileSource]() { + settings.online = !settings.online; + fileSource.setOnlineStatus(settings.online); + mbgl::Log::Info(mbgl::Event::Setup, "Application is %s. Press `O` to toggle online status.", settings.online ? "online" : "offline"); + }); + view->setChangeStyleCallback([&map] () { static uint8_t currentStyleIndex; @@ -191,13 +177,11 @@ int main(int argc, char *argv[]) { settings.bearing = map.getBearing(); settings.pitch = map.getPitch(); settings.debug = mbgl::EnumType(map.getDebug()); - if (!skipConfig) { - settings.save(); - } + settings.save(); mbgl::Log::Info(mbgl::Event::General, R"(Exit location: --lat="%f" --lon="%f" --zoom="%f" --bearing "%f")", settings.latitude, settings.longitude, settings.zoom, settings.bearing); view = nullptr; return 0; -}
\ No newline at end of file +} diff --git a/platform/glfw/settings_json.cpp b/platform/glfw/settings_json.cpp index 2ba1038dc7..5b6aa4e0da 100644 --- a/platform/glfw/settings_json.cpp +++ b/platform/glfw/settings_json.cpp @@ -14,6 +14,7 @@ void Settings_JSON::load() { file >> bearing; file >> pitch; file >> debug; + file >> online; } } @@ -26,6 +27,7 @@ void Settings_JSON::save() { file << bearing << std::endl; file << pitch << std::endl; file << debug << std::endl; + file << online << std::endl; } } @@ -36,6 +38,7 @@ void Settings_JSON::clear() { bearing = 0; pitch = 0; debug = 0; + online = true; } } // namespace mbgl diff --git a/platform/glfw/settings_json.hpp b/platform/glfw/settings_json.hpp index eb23b28bc8..c89accb8af 100644 --- a/platform/glfw/settings_json.hpp +++ b/platform/glfw/settings_json.hpp @@ -17,8 +17,12 @@ public: double zoom = 0; double bearing = 0; double pitch = 0; + bool axonometric = false; + double xSkew = 0.0; + double ySkew = 1.0; EnumType debug = 0; + bool online = true; }; } // namespace mbgl |