#pragma once #include #include #include #include #include #if MBGL_USE_GLES2 #define GLFW_INCLUDE_ES2 #endif #define GL_GLEXT_PROTOTYPES #include class GLFWView : public mbgl::View, public mbgl::Backend { public: GLFWView(bool fullscreen = false, bool benchmark = false); ~GLFWView() override; float getPixelRatio() const; void setMap(mbgl::Map*); // 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. void setChangeStyleCallback(std::function callback); void setShouldClose(); void setWindowTitle(const std::string&); void run(); // mbgl::View implementation void updateViewBinding(); void bind() override; std::array getSize() const; std::array getFramebufferSize() const; // mbgl::Backend implementation void activate() override; void deactivate() override; void invalidate() override; private: // Window callbacks static void onKey(GLFWwindow *window, int key, int scancode, int action, int mods); static void onScroll(GLFWwindow *window, double xoffset, double yoffset); static void onWindowResize(GLFWwindow *window, int width, int height); static void onFramebufferResize(GLFWwindow *window, int width, int height); static void onMouseClick(GLFWwindow *window, int button, int action, int modifiers); static void onMouseMove(GLFWwindow *window, double x, double y); // Internal void report(float duration); void setMapChangeCallback(std::function callback); void notifyMapChange(mbgl::MapChange change) override; mbgl::Color makeRandomColor() const; mbgl::Point makeRandomPoint() const; static std::shared_ptr makeSpriteImage(int width, int height, float pixelRatio); void nextOrientation(); void addRandomPointAnnotations(int count); void addRandomLineAnnotations(int count); void addRandomShapeAnnotations(int count); void addRandomCustomPointAnnotations(int count); void clearAnnotations(); void popAnnotation(); mbgl::AnnotationIDs annotationIDs; std::vector spriteIDs; std::function mapChangeCallback; private: mbgl::Map* map = nullptr; bool fullscreen = false; const bool benchmark = false; bool tracking = false; bool rotating = false; bool pitching = false; // Frame timer int frames = 0; float frameTime = 0; double lastReported = 0; int width = 1024; int height = 768; int fbWidth; int fbHeight; float pixelRatio; double lastX = 0, lastY = 0; double lastClick = -1; std::function changeStyleCallback; mbgl::util::RunLoop runLoop; mbgl::util::Timer frameTick; GLFWwindow *window = nullptr; bool dirty = false; };