#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace mbgl { class RenderTile; class SpriteAtlas; class View; class GlyphAtlas; class LineAtlas; struct FrameData; class Tile; class DebugBucket; class FillBucket; class LineBucket; class CircleBucket; class SymbolBucket; class RasterBucket; class RenderFillLayer; class RenderLineLayer; class RenderCircleLayer; class RenderSymbolLayer; class RenderRasterLayer; class RenderBackgroundLayer; class Programs; class PaintParameters; struct ClipID; namespace style { class Style; class Source; } // namespace style struct FrameData { TimePoint timePoint; float pixelRatio; MapMode mapMode; GLContextMode contextMode; MapDebugOptions debugOptions; }; class Painter : private util::noncopyable { public: Painter(gl::Context&, const TransformState&, float pixelRatio, const std::string& programCacheDir); ~Painter(); void render(const style::Style&, const FrameData&, View&, SpriteAtlas& annotationSpriteAtlas); void cleanup(); void renderClippingMask(const UnwrappedTileID&, const ClipID&); void renderTileDebug(const RenderTile&); void renderFill(PaintParameters&, FillBucket&, const RenderFillLayer&, const RenderTile&); void renderLine(PaintParameters&, LineBucket&, const RenderLineLayer&, const RenderTile&); void renderCircle(PaintParameters&, CircleBucket&, const RenderCircleLayer&, const RenderTile&); void renderSymbol(PaintParameters&, SymbolBucket&, const RenderSymbolLayer&, const RenderTile&); void renderRaster(PaintParameters&, RasterBucket&, const RenderRasterLayer&, const RenderTile&); void renderBackground(PaintParameters&, const RenderBackgroundLayer&); #ifndef NDEBUG // Renders tile clip boundaries, using stencil buffer to calculate fill color. void renderClipMasks(PaintParameters&); // Renders the depth buffer. void renderDepthBuffer(PaintParameters&); #endif bool needsAnimation() const; private: std::vector determineRenderOrder(const style::Style&); template void renderPass(PaintParameters&, RenderPass, Iterator it, Iterator end, uint32_t i, int8_t increment); mat4 matrixForTile(const UnwrappedTileID&); gl::DepthMode depthModeForSublayer(uint8_t n, gl::DepthMode::Mask) const; gl::StencilMode stencilModeForClipping(const ClipID&) const; gl::ColorMode colorModeForRenderPass() const; #ifndef NDEBUG PaintMode paintMode() const { return frame.debugOptions & MapDebugOptions::Overdraw ? PaintMode::Overdraw : PaintMode::Regular; } #else PaintMode paintMode() const { return PaintMode::Regular; } #endif private: gl::Context& context; mat4 projMatrix; std::array pixelsToGLUnits; const mat4 identityMatrix = []{ mat4 identity; matrix::identity(identity); return identity; }(); const TransformState& state; FrameData frame; int indent = 0; RenderPass pass = RenderPass::Opaque; int numSublayers = 3; uint32_t currentLayer; float depthRangeSize; const float depthEpsilon = 1.0f / (1 << 16); SpriteAtlas* spriteAtlas = nullptr; GlyphAtlas* glyphAtlas = nullptr; LineAtlas* lineAtlas = nullptr; FrameHistory frameHistory; std::unique_ptr programs; #ifndef NDEBUG std::unique_ptr overdrawPrograms; #endif gl::VertexBuffer tileVertexBuffer; gl::VertexBuffer rasterVertexBuffer; gl::IndexBuffer tileTriangleIndexBuffer; gl::IndexBuffer tileBorderIndexBuffer; gl::SegmentVector tileTriangleSegments; gl::SegmentVector tileBorderSegments; gl::SegmentVector rasterSegments; }; } // namespace mbgl