#include #include #include #include #include #include #include #include namespace mbgl { using namespace style; void Painter::renderBackground(PaintParameters& parameters, const BackgroundLayer& layer) { // Note that for bottommost layers without a pattern, the background color is drawn with // glClear rather than this method. const BackgroundPaintProperties::Evaluated& properties = layer.impl->paint.evaluated; if (!properties.get().to.empty()) { optional imagePosA = spriteAtlas->getPosition( properties.get().from, SpritePatternMode::Repeating); optional imagePosB = spriteAtlas->getPosition( properties.get().to, SpritePatternMode::Repeating); if (!imagePosA || !imagePosB) return; spriteAtlas->bind(true, context, 0); for (const auto& tileID : util::tileCover(state, state.getIntegerZoom())) { parameters.programs.fillPattern.draw( context, gl::Triangles(), depthModeForSublayer(0, gl::DepthMode::ReadOnly), gl::StencilMode::disabled(), colorModeForRenderPass(), FillPatternUniforms::values( matrixForTile(tileID), properties.get(), context.viewport.getCurrentValue().size, *imagePosA, *imagePosB, properties.get(), tileID, state ), tileVertexBuffer, tileTriangleIndexBuffer, tileTriangleSegments ); } } else { for (const auto& tileID : util::tileCover(state, state.getIntegerZoom())) { parameters.programs.fill.draw( context, gl::Triangles(), depthModeForSublayer(0, gl::DepthMode::ReadOnly), gl::StencilMode::disabled(), colorModeForRenderPass(), FillProgram::UniformValues { uniforms::u_matrix::Value{ matrixForTile(tileID) }, uniforms::u_opacity::Value{ properties.get() }, uniforms::u_color::Value{ properties.get() }, uniforms::u_outline_color::Value{ properties.get() }, uniforms::u_world::Value{ context.viewport.getCurrentValue().size }, }, tileVertexBuffer, tileTriangleIndexBuffer, tileTriangleSegments ); } } } } // namespace mbgl