#ifndef MBGL_RENDERER_PAINTER #define MBGL_RENDERER_PAINTER #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class Transform; class Style; class Tile; class GlyphAtlas; class Source; class StyleSource; class FillBucket; class LineBucket; class IconBucket; class TextBucket; class RasterBucket; struct FillProperties; struct CompositeProperties; class LayerDescription; class RasterTileData; class Painter : private util::noncopyable { public: Painter(Map &map); ~Painter(); void setup(); // Perform cleanup tasks that prepare shutting down the app. This doesn't mean that the // app will be shut down. That means all operations must be automatically be reversed (e.g. through // lazy initialization) in case rendering continues. void cleanup(); void clear(); // Updates the default matrices to the current viewport dimensions. void changeMatrix(); // Renders a particular layer from a tile. void renderTileLayer(const Tile& tile, std::shared_ptr layer_desc); // Renders debug information for a tile. void renderTileDebug(const Tile& tile); // Renders the backdrop of the OpenGL view. This also paints in areas where we don't have any // tiles whatsoever. void renderMatte(); // Renders the red debug frame around a tile, visualizing its perimeter. void renderDebugFrame(); void renderDebugText(DebugBucket& bucket); void renderDebugText(const std::vector &strings); void renderFill(FillBucket& bucket, const FillProperties& properties, const Tile::ID& id, const mat4 &mat); void renderFill(FillBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void renderLine(LineBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void renderIcon(IconBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void renderText(TextBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void renderRaster(RasterBucket& bucket, std::shared_ptr layer_desc, const Tile::ID& id); void preparePrerender(PrerenderedTexture &texture); void finishPrerender(PrerenderedTexture &texture); template void renderPrerenderedTexture(PrerenderedTexture &texture, const Properties &properties); void resize(); // Changes whether debug information is drawn onto the map void setDebug(bool enabled); // Opaque/Translucent pass setting void setOpaque(); void setTranslucent(); // Configures the painter strata that is used for early z-culling of fragments. void setStrata(float strata); void drawClippingMasks(const std::set> &sources); void drawClippingMask(const mat4& matrix, const ClipID& clip); void clearFramebuffers(); void resetFramebuffer(); void bindFramebuffer(); void pushFramebuffer(); GLuint popFramebuffer(); void discardFramebuffers(); void drawComposite(GLuint texture, const CompositeProperties &properties); bool needsAnimation() const; private: void setupShaders(); const mat4 &translatedMatrix(const std::array &translation, const Tile::ID &id, TranslateAnchorType anchor = TranslateAnchorType::Default); void prepareTile(const Tile& tile); public: void useProgram(uint32_t program); void lineWidth(float lineWidth); void depthMask(bool value); public: mat4 matrix; mat4 vtxMatrix; mat4 projMatrix; mat4 nativeMatrix; mat4 extrudeMatrix; // used to composite images and flips the geometry upside down const mat4 flipMatrix = []{ mat4 flipMatrix; matrix::ortho(flipMatrix, 0, 4096, -4096, 0, 0, 1); matrix::translate(flipMatrix, flipMatrix, 0, -4096, 0); return flipMatrix; }(); private: Map& map; FrameHistory frameHistory; bool debug = false; uint32_t gl_program = 0; float gl_lineWidth = 0; bool gl_depthMask = true; std::array gl_viewport = {{ 0, 0 }}; float strata = 0; enum { Opaque, Translucent } pass = Opaque; const float strata_epsilon = 1.0f / (1 << 16); public: std::unique_ptr plainShader; std::unique_ptr outlineShader; std::unique_ptr lineShader; std::unique_ptr linejoinShader; std::unique_ptr patternShader; std::unique_ptr iconShader; std::unique_ptr rasterShader; std::unique_ptr textShader; std::unique_ptr dotShader; std::unique_ptr compositeShader; std::unique_ptr gaussianShader; // Set up the stencil quad we're using to generate the stencil mask. VertexBuffer tileStencilBuffer = { // top left triangle 0, 0, 4096, 0, 0, 4096, // bottom right triangle 4096, 0, 0, 4096, 4096, 4096 }; VertexArrayObject coveringPlainArray; VertexArrayObject coveringPatternArray; VertexArrayObject coveringRasterArray; VertexArrayObject coveringGaussianArray; VertexArrayObject compositeArray; VertexArrayObject matteArray; // Set up the tile boundary lines we're using to draw the tile outlines. VertexBuffer tileBorderBuffer = { 0, 0, 4096, 0, 4096, 4096, 0, 4096, 0, 0 }; VertexArrayObject tileBorderArray; // Framebuffer management std::vector fbos; std::vector fbos_color; GLuint fbo_depth_stencil; int fbo_level = -1; bool fbo_depth_stencil_valid = false; }; } #endif