summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/layers/render_circle_layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/layers/render_circle_layer.cpp')
-rw-r--r--src/mbgl/renderer/layers/render_circle_layer.cpp53
1 files changed, 46 insertions, 7 deletions
diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp
index c80b7bd27d..22e515e603 100644
--- a/src/mbgl/renderer/layers/render_circle_layer.cpp
+++ b/src/mbgl/renderer/layers/render_circle_layer.cpp
@@ -2,6 +2,9 @@
#include <mbgl/renderer/buckets/circle_bucket.hpp>
#include <mbgl/renderer/painter.hpp>
#include <mbgl/renderer/render_tile.hpp>
+#include <mbgl/renderer/paint_parameters.hpp>
+#include <mbgl/programs/programs.hpp>
+#include <mbgl/programs/circle_program.hpp>
#include <mbgl/tile/tile.hpp>
#include <mbgl/style/layers/circle_layer_impl.hpp>
#include <mbgl/geometry/feature_index.hpp>
@@ -10,6 +13,8 @@
namespace mbgl {
+using namespace style;
+
RenderCircleLayer::RenderCircleLayer(Immutable<style::CircleLayer::Impl> _impl)
: RenderLayer(style::LayerType::Circle, _impl),
unevaluated(impl().paint.untransitioned()) {
@@ -44,14 +49,48 @@ bool RenderCircleLayer::hasTransition() const {
}
void RenderCircleLayer::render(Painter& painter, PaintParameters& parameters, RenderSource*) {
+ if (painter.pass == RenderPass::Opaque) {
+ return;
+ }
+
+ const bool scaleWithMap = evaluated.get<CirclePitchScale>() == CirclePitchScaleType::Map;
+ const bool pitchWithMap = evaluated.get<CirclePitchAlignment>() == AlignmentType::Map;
+
for (const RenderTile& tile : renderTiles) {
- Bucket* bucket = tile.tile.getBucket(*baseImpl);
- assert(dynamic_cast<CircleBucket*>(bucket));
- painter.renderCircle(
- parameters,
- *reinterpret_cast<CircleBucket*>(bucket),
- *this,
- tile);
+ assert(dynamic_cast<CircleBucket*>(tile.tile.getBucket(*baseImpl)));
+ CircleBucket& bucket = *reinterpret_cast<CircleBucket*>(tile.tile.getBucket(*baseImpl));
+
+ parameters.programs.circle.get(evaluated).draw(
+ painter.context,
+ gl::Triangles(),
+ painter.depthModeForSublayer(0, gl::DepthMode::ReadOnly),
+ painter.frame.mapMode == MapMode::Still
+ ? painter.stencilModeForClipping(tile.clip)
+ : gl::StencilMode::disabled(),
+ painter.colorModeForRenderPass(),
+ CircleProgram::UniformValues {
+ uniforms::u_matrix::Value{
+ tile.translatedMatrix(evaluated.get<CircleTranslate>(),
+ evaluated.get<CircleTranslateAnchor>(),
+ painter.state)
+ },
+ uniforms::u_scale_with_map::Value{ scaleWithMap },
+ uniforms::u_extrude_scale::Value{ pitchWithMap
+ ? std::array<float, 2> {{
+ tile.id.pixelsToTileUnits(1, painter.state.getZoom()),
+ tile.id.pixelsToTileUnits(1, painter.state.getZoom()) }}
+ : painter.pixelsToGLUnits },
+ uniforms::u_camera_to_center_distance::Value{ painter.state.getCameraToCenterDistance() },
+ uniforms::u_pitch_with_map::Value{ pitchWithMap }
+ },
+ *bucket.vertexBuffer,
+ *bucket.indexBuffer,
+ bucket.segments,
+ bucket.paintPropertyBinders.at(getID()),
+ evaluated,
+ painter.state.getZoom(),
+ getID()
+ );
}
}