diff options
Diffstat (limited to 'src/mbgl/renderer/layers/render_circle_layer.cpp')
-rw-r--r-- | src/mbgl/renderer/layers/render_circle_layer.cpp | 136 |
1 files changed, 71 insertions, 65 deletions
diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index e7496df074..7b8744bd30 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -24,6 +24,77 @@ RenderCircleLayer::RenderCircleLayer(Immutable<style::CircleLayer::Impl> _impl) unevaluated(impl(baseImpl).paint.untransitioned()) { } +RenderCircleLayer::~RenderCircleLayer() = default; + +LayerRenderer RenderCircleLayer::createRenderer() { + return [](PaintParameters& parameters, const LayerRenderItem& renderItem) { + if (parameters.pass == RenderPass::Opaque) { + return; + } + const auto& renderTiles = renderItem.renderTiles; + const auto& baseImpl = *renderItem.evaluatedProperties->baseImpl; + + for (const RenderTile& tile : renderTiles) { + const LayerRenderData* renderData = tile.getLayerRenderData(baseImpl); + if (!renderData) { + continue; + } + auto& bucket = static_cast<CircleBucket&>(*renderData->bucket); + const auto& evaluated = getEvaluated<CircleLayerProperties>(renderData->layerProperties); + const bool scaleWithMap = evaluated.get<CirclePitchScale>() == CirclePitchScaleType::Map; + const bool pitchWithMap = evaluated.get<CirclePitchAlignment>() == AlignmentType::Map; + const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(baseImpl.id); + + auto& programInstance = parameters.programs.getCircleLayerPrograms().circle; + + const auto allUniformValues = programInstance.computeAllUniformValues( + CircleProgram::LayoutUniformValues { + uniforms::matrix::Value( + tile.translatedMatrix(evaluated.get<CircleTranslate>(), + evaluated.get<CircleTranslateAnchor>(), + parameters.state) + ), + uniforms::scale_with_map::Value( scaleWithMap ), + uniforms::extrude_scale::Value( pitchWithMap + ? std::array<float, 2> {{ + tile.id.pixelsToTileUnits(1, parameters.state.getZoom()), + tile.id.pixelsToTileUnits(1, parameters.state.getZoom()) }} + : parameters.pixelsToGLUnits ), + uniforms::device_pixel_ratio::Value( parameters.pixelRatio ), + uniforms::camera_to_center_distance::Value( parameters.state.getCameraToCenterDistance() ), + uniforms::pitch_with_map::Value( pitchWithMap ) + }, + paintPropertyBinders, + evaluated, + parameters.state.getZoom() + ); + const auto allAttributeBindings = programInstance.computeAllAttributeBindings( + *bucket.vertexBuffer, + paintPropertyBinders, + evaluated + ); + + renderItem.checkRenderability(parameters, programInstance.activeBindingCount(allAttributeBindings)); + + programInstance.draw( + parameters.context, + *parameters.renderPass, + gfx::Triangles(), + parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), + gfx::StencilMode::disabled(), + parameters.colorModeForRenderPass(), + gfx::CullFaceMode::disabled(), + *bucket.indexBuffer, + bucket.segments, + allUniformValues, + allAttributeBindings, + CircleProgram::TextureBindings{}, + baseImpl.id + ); + } + }; +} + void RenderCircleLayer::transition(const TransitionParameters& parameters) { unevaluated = impl(baseImpl).paint.transitioned(parameters, std::move(unevaluated)); } @@ -52,71 +123,6 @@ bool RenderCircleLayer::hasCrossfade() const { return false; } -void RenderCircleLayer::render(PaintParameters& parameters) { - if (parameters.pass == RenderPass::Opaque) { - return; - } - - for (const RenderTile& tile : renderTiles) { - const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl); - if (!renderData) { - continue; - } - auto& bucket = static_cast<CircleBucket&>(*renderData->bucket); - const auto& evaluated = getEvaluated<CircleLayerProperties>(renderData->layerProperties); - const bool scaleWithMap = evaluated.get<CirclePitchScale>() == CirclePitchScaleType::Map; - const bool pitchWithMap = evaluated.get<CirclePitchAlignment>() == AlignmentType::Map; - const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); - - auto& programInstance = parameters.programs.getCircleLayerPrograms().circle; - - const auto allUniformValues = programInstance.computeAllUniformValues( - CircleProgram::LayoutUniformValues { - uniforms::matrix::Value( - tile.translatedMatrix(evaluated.get<CircleTranslate>(), - evaluated.get<CircleTranslateAnchor>(), - parameters.state) - ), - uniforms::scale_with_map::Value( scaleWithMap ), - uniforms::extrude_scale::Value( pitchWithMap - ? std::array<float, 2> {{ - tile.id.pixelsToTileUnits(1, parameters.state.getZoom()), - tile.id.pixelsToTileUnits(1, parameters.state.getZoom()) }} - : parameters.pixelsToGLUnits ), - uniforms::device_pixel_ratio::Value( parameters.pixelRatio ), - uniforms::camera_to_center_distance::Value( parameters.state.getCameraToCenterDistance() ), - uniforms::pitch_with_map::Value( pitchWithMap ) - }, - paintPropertyBinders, - evaluated, - parameters.state.getZoom() - ); - const auto allAttributeBindings = programInstance.computeAllAttributeBindings( - *bucket.vertexBuffer, - paintPropertyBinders, - evaluated - ); - - checkRenderability(parameters, programInstance.activeBindingCount(allAttributeBindings)); - - programInstance.draw( - parameters.context, - *parameters.renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - *bucket.indexBuffer, - bucket.segments, - allUniformValues, - allAttributeBindings, - CircleProgram::TextureBindings{}, - getID() - ); - } -} - GeometryCoordinate projectPoint(const GeometryCoordinate& p, const mat4& posMatrix, const Size& size) { vec4 pos = {{ static_cast<double>(p.x), static_cast<double>(p.y), 0, 1 }}; matrix::transformMat4(pos, pos, posMatrix); |