#include #include #include #include #include #include #include #include #include namespace mbgl { using namespace style; RenderBackgroundLayer::RenderBackgroundLayer(Immutable _impl) : RenderLayer(style::LayerType::Background, _impl), unevaluated(impl().paint.untransitioned()) { } const style::BackgroundLayer::Impl& RenderBackgroundLayer::impl() const { return static_cast(*baseImpl); } std::unique_ptr RenderBackgroundLayer::createBucket(const BucketParameters &, const std::vector &) const { assert(false); return nullptr; } void RenderBackgroundLayer::transition(const TransitionParameters ¶meters) { unevaluated = impl().paint.transitioned(parameters, std::move(unevaluated)); } void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters ¶meters) { evaluated = unevaluated.evaluate(parameters); passes = evaluated.get() > 0 ? RenderPass::Translucent : RenderPass::None; } bool RenderBackgroundLayer::hasTransition() const { return unevaluated.hasTransition(); } void RenderBackgroundLayer::render(Painter& painter, PaintParameters& parameters, RenderSource*) { // Note that for bottommost layers without a pattern, the background color is drawn with // glClear rather than this method. style::FillPaintProperties::PossiblyEvaluated properties; properties.get() = evaluated.get(); properties.get() = { evaluated.get() }; properties.get() = { evaluated.get() }; const FillProgram::PaintPropertyBinders paintAttibuteData(properties, 0); if (!evaluated.get().to.empty()) { optional imagePosA = painter.imageManager->getPattern(evaluated.get().from); optional imagePosB = painter.imageManager->getPattern(evaluated.get().to); if (!imagePosA || !imagePosB) return; painter.imageManager->bind(painter.context, 0); for (const auto& tileID : util::tileCover(painter.state, painter.state.getIntegerZoom())) { parameters.programs.fillPattern.get(properties).draw( painter.context, gl::Triangles(), painter.depthModeForSublayer(0, gl::DepthMode::ReadOnly), gl::StencilMode::disabled(), painter.colorModeForRenderPass(), FillPatternUniforms::values( painter.matrixForTile(tileID), painter.context.viewport.getCurrentValue().size, painter.imageManager->getPixelSize(), *imagePosA, *imagePosB, evaluated.get(), tileID, painter.state ), painter.tileVertexBuffer, painter.quadTriangleIndexBuffer, painter.tileTriangleSegments, paintAttibuteData, properties, painter.state.getZoom(), getID() ); } } else { for (const auto& tileID : util::tileCover(painter.state, painter.state.getIntegerZoom())) { parameters.programs.fill.get(properties).draw( painter.context, gl::Triangles(), painter.depthModeForSublayer(0, gl::DepthMode::ReadOnly), gl::StencilMode::disabled(), painter.colorModeForRenderPass(), FillProgram::UniformValues { uniforms::u_matrix::Value{ painter.matrixForTile(tileID) }, uniforms::u_world::Value{ painter.context.viewport.getCurrentValue().size }, }, painter.tileVertexBuffer, painter.quadTriangleIndexBuffer, painter.tileTriangleSegments, paintAttibuteData, properties, painter.state.getZoom(), getID() ); } } } } // namespace mbgl