#include #include #include #include #include #include #include #include #include #include namespace mbgl { using namespace style; void Painter::renderFill(PaintParameters& parameters, FillBucket& bucket, const RenderFillLayer& layer, const RenderTile& tile) { const FillPaintProperties::Evaluated& properties = layer.evaluated; if (!properties.get().from.empty()) { if (pass != RenderPass::Translucent) { return; } optional imagePosA = spriteAtlas->getPattern(properties.get().from); optional imagePosB = spriteAtlas->getPattern(properties.get().to); if (!imagePosA || !imagePosB) { return; } spriteAtlas->bind(true, context, 0); auto draw = [&] (uint8_t sublayer, auto& program, const auto& drawMode, const auto& indexBuffer, const auto& segments) { program.get(properties).draw( context, drawMode, depthModeForSublayer(sublayer, gl::DepthMode::ReadWrite), stencilModeForClipping(tile.clip), colorModeForRenderPass(), FillPatternUniforms::values( tile.translatedMatrix(properties.get(), properties.get(), state), context.viewport.getCurrentValue().size, *imagePosA, *imagePosB, properties.get(), tile.id, state ), *bucket.vertexBuffer, indexBuffer, segments, bucket.paintPropertyBinders.at(layer.getID()), properties, state.getZoom(), layer.getID() ); }; draw(0, parameters.programs.fillPattern, gl::Triangles(), *bucket.triangleIndexBuffer, bucket.triangleSegments); if (!properties.get() || !layer.unevaluated.get().isUndefined()) { return; } draw(2, parameters.programs.fillOutlinePattern, gl::Lines { 2.0f }, *bucket.lineIndexBuffer, bucket.lineSegments); } else { auto draw = [&] (uint8_t sublayer, auto& program, const auto& drawMode, const auto& indexBuffer, const auto& segments) { program.get(properties).draw( context, drawMode, depthModeForSublayer(sublayer, gl::DepthMode::ReadWrite), stencilModeForClipping(tile.clip), colorModeForRenderPass(), FillProgram::UniformValues { uniforms::u_matrix::Value{ tile.translatedMatrix(properties.get(), properties.get(), state) }, uniforms::u_world::Value{ context.viewport.getCurrentValue().size }, }, *bucket.vertexBuffer, indexBuffer, segments, bucket.paintPropertyBinders.at(layer.getID()), properties, state.getZoom(), layer.getID() ); }; if (properties.get() && !layer.unevaluated.get().isUndefined() && pass == RenderPass::Translucent) { draw(2, parameters.programs.fillOutline, gl::Lines { 2.0f }, *bucket.lineIndexBuffer, bucket.lineSegments); } // Only draw the fill when it's opaque and we're drawing opaque fragments, // or when it's translucent and we're drawing translucent fragments. if ((properties.get().constantOr(Color()).a >= 1.0f && properties.get().constantOr(0) >= 1.0f) == (pass == RenderPass::Opaque)) { draw(1, parameters.programs.fill, gl::Triangles(), *bucket.triangleIndexBuffer, bucket.triangleSegments); } if (properties.get() && layer.unevaluated.get().isUndefined() && pass == RenderPass::Translucent) { draw(2, parameters.programs.fillOutline, gl::Lines { 2.0f }, *bucket.lineIndexBuffer, bucket.lineSegments); } } } } // namespace mbgl