* [core] update shaders for line property functions update deps, define device pixel ratio for all shaders [core] create ShaderParameter struct to store pixel ratio and overdraw param repair rebase errs update shaders to include pixel ratio make sure collision_box never overdraws update test suite, move shaders to Painter::render so the correct pixel ratio is applied move shader compiling back to the Painter constructor rebase from shader --> program refactor re-factor parameters for collisionBox and debug programs remove unused vars from line-program, move blur math to shader update core files remove unecessary files update shaders PR, remove comments bump test suite sha fix formatting, incorporate feedback refactor program.hpp * [core] remove line transformations that were moved to the shaders, bump shader sha * [core] shorten ProgramParameter instantiation * [core] bump shader+test suite shas
88 lines
2.8 KiB
C++
88 lines
2.8 KiB
C++
#include <mbgl/renderer/painter.hpp>
|
|
#include <mbgl/renderer/paint_parameters.hpp>
|
|
#include <mbgl/renderer/line_bucket.hpp>
|
|
#include <mbgl/renderer/render_tile.hpp>
|
|
#include <mbgl/style/layers/line_layer.hpp>
|
|
#include <mbgl/style/layers/line_layer_impl.hpp>
|
|
#include <mbgl/programs/programs.hpp>
|
|
#include <mbgl/programs/line_program.hpp>
|
|
#include <mbgl/sprite/sprite_atlas.hpp>
|
|
#include <mbgl/geometry/line_atlas.hpp>
|
|
|
|
namespace mbgl {
|
|
|
|
using namespace style;
|
|
|
|
void Painter::renderLine(PaintParameters& parameters,
|
|
LineBucket& bucket,
|
|
const LineLayer& layer,
|
|
const RenderTile& tile) {
|
|
if (pass == RenderPass::Opaque) {
|
|
return;
|
|
}
|
|
|
|
const auto& properties = layer.impl->paint;
|
|
|
|
auto draw = [&] (auto& program, auto&& uniformValues) {
|
|
program.draw(
|
|
context,
|
|
gl::Triangles(),
|
|
depthModeForSublayer(0, gl::DepthMode::ReadOnly),
|
|
stencilModeForClipping(tile.clip),
|
|
colorModeForRenderPass(),
|
|
std::move(uniformValues),
|
|
*bucket.vertexBuffer,
|
|
*bucket.indexBuffer,
|
|
bucket.segments
|
|
);
|
|
};
|
|
|
|
if (!properties.lineDasharray.value.from.empty()) {
|
|
const LinePatternCap cap = bucket.layout.lineCap == LineCapType::Round
|
|
? LinePatternCap::Round : LinePatternCap::Square;
|
|
LinePatternPos posA = lineAtlas->getDashPosition(properties.lineDasharray.value.from, cap);
|
|
LinePatternPos posB = lineAtlas->getDashPosition(properties.lineDasharray.value.to, cap);
|
|
|
|
lineAtlas->bind(context, 0);
|
|
|
|
draw(parameters.programs.lineSDF,
|
|
LineSDFProgram::uniformValues(
|
|
properties,
|
|
frame.pixelRatio,
|
|
tile,
|
|
state,
|
|
posA,
|
|
posB,
|
|
layer.impl->dashLineWidth,
|
|
lineAtlas->getSize().width));
|
|
|
|
} else if (!properties.linePattern.value.from.empty()) {
|
|
optional<SpriteAtlasPosition> posA = spriteAtlas->getPosition(
|
|
properties.linePattern.value.from, SpritePatternMode::Repeating);
|
|
optional<SpriteAtlasPosition> posB = spriteAtlas->getPosition(
|
|
properties.linePattern.value.to, SpritePatternMode::Repeating);
|
|
|
|
if (!posA || !posB)
|
|
return;
|
|
|
|
spriteAtlas->bind(true, context, 0);
|
|
|
|
draw(parameters.programs.linePattern,
|
|
LinePatternProgram::uniformValues(
|
|
properties,
|
|
tile,
|
|
state,
|
|
*posA,
|
|
*posB));
|
|
|
|
} else {
|
|
draw(parameters.programs.line,
|
|
LineProgram::uniformValues(
|
|
properties,
|
|
tile,
|
|
state));
|
|
}
|
|
}
|
|
|
|
} // namespace mbgl
|