#include #include #include #include #include #include #include #include namespace mbgl { using namespace style; void Painter::renderBackground(PaintParameters& parameters, const RenderBackgroundLayer& layer) { // Note that for bottommost layers without a pattern, the background color is drawn with // glClear rather than this method. const BackgroundPaintProperties::Evaluated& background = layer.evaluated; style::FillPaintProperties::Evaluated properties; properties.get() = background.get(); properties.get() = { background.get() }; properties.get() = { background.get() }; const FillProgram::PaintPropertyBinders paintAttibuteData(properties, 0); if (!background.get().to.empty()) { optional imagePosA = spriteAtlas->getPattern(background.get().from); optional imagePosB = spriteAtlas->getPattern(background.get().to); 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), context.viewport.getCurrentValue().size, *imagePosA, *imagePosB, background.get(), tileID, state ), tileVertexBuffer, tileTriangleIndexBuffer, tileTriangleSegments, paintAttibuteData, properties, state.getZoom() ); } } 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_world::Value{ context.viewport.getCurrentValue().size }, }, tileVertexBuffer, tileTriangleIndexBuffer, tileTriangleSegments, paintAttibuteData, properties, state.getZoom() ); } } } } // namespace mbgl