diff options
Diffstat (limited to 'src/mbgl/renderer/painter_circle.cpp')
-rw-r--r-- | src/mbgl/renderer/painter_circle.cpp | 70 |
1 files changed, 35 insertions, 35 deletions
diff --git a/src/mbgl/renderer/painter_circle.cpp b/src/mbgl/renderer/painter_circle.cpp index 462ed59ebf..9db7272dab 100644 --- a/src/mbgl/renderer/painter_circle.cpp +++ b/src/mbgl/renderer/painter_circle.cpp @@ -2,11 +2,11 @@ #include <mbgl/renderer/paint_parameters.hpp> #include <mbgl/renderer/circle_bucket.hpp> #include <mbgl/renderer/render_tile.hpp> - #include <mbgl/style/layers/circle_layer.hpp> #include <mbgl/style/layers/circle_layer_impl.hpp> - #include <mbgl/shader/shaders.hpp> +#include <mbgl/shader/circle_uniforms.hpp> +#include <mbgl/gl/context.hpp> namespace mbgl { @@ -16,42 +16,42 @@ void Painter::renderCircle(PaintParameters& parameters, CircleBucket& bucket, const CircleLayer& layer, const RenderTile& tile) { - // Abort early. - if (pass == RenderPass::Opaque) return; - - context.stencilTest = frame.mapMode == MapMode::Still; - context.depthFunc = gl::DepthTestFunction::LessEqual; - context.depthTest = true; - context.depthMask = false; - setDepthSublayer(0); - - const CirclePaintProperties& properties = layer.impl->paint; - auto& circleShader = parameters.shaders.circle; - - context.program = circleShader.getID(); - - circleShader.u_matrix = tile.translatedMatrix(properties.circleTranslate, - properties.circleTranslateAnchor, - state); - - if (properties.circlePitchScale == CirclePitchScaleType::Map) { - circleShader.u_extrude_scale = {{ - pixelsToGLUnits[0] * state.getAltitude(), - pixelsToGLUnits[1] * state.getAltitude() - }}; - circleShader.u_scale_with_map = true; - } else { - circleShader.u_extrude_scale = pixelsToGLUnits; - circleShader.u_scale_with_map = false; + if (pass == RenderPass::Opaque) { + return; } - circleShader.u_devicepixelratio = frame.pixelRatio; - circleShader.u_color = properties.circleColor; - circleShader.u_radius = properties.circleRadius; - circleShader.u_blur = properties.circleBlur; - circleShader.u_opacity = properties.circleOpacity; + const CirclePaintProperties& properties = layer.impl->paint; - bucket.drawCircles(circleShader, context, paintMode()); + context.draw({ + depthModeForSublayer(0, gl::DepthMode::ReadOnly), + frame.mapMode == MapMode::Still + ? stencilModeForClipping(tile.clip) + : gl::StencilMode::disabled(), + colorModeForRenderPass(), + parameters.shaders.circle, + CircleUniforms::values( + tile.translatedMatrix(properties.circleTranslate.value, + properties.circleTranslateAnchor.value, + state), + properties.circleOpacity.value, + properties.circleColor.value, + properties.circleRadius.value, + properties.circleBlur.value, + properties.circlePitchScale.value == CirclePitchScaleType::Map, + properties.circlePitchScale.value == CirclePitchScaleType::Map + ? std::array<float, 2> {{ + pixelsToGLUnits[0] * state.getAltitude(), + pixelsToGLUnits[1] * state.getAltitude() + }} + : pixelsToGLUnits, + frame.pixelRatio + ), + gl::Segmented<gl::Triangles>( + *bucket.vertexBuffer, + *bucket.indexBuffer, + bucket.segments + ) + }); } } // namespace mbgl |