diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-04-14 17:01:41 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-04-14 22:30:40 +0300 |
commit | 364ea4b3b7a61c37ffdc5f7b74b1030b7360fe86 (patch) | |
tree | 7091668d247b57ecd450f5c43d9b4fc766503ee3 | |
parent | 3ba2fc6ea2e0d3ac0cd3c238bc1385ff97150b5c (diff) | |
download | qtlocation-mapboxgl-364ea4b3b7a61c37ffdc5f7b74b1030b7360fe86.tar.gz |
[core] RenderCircleLayer fixes
-rw-r--r-- | src/mbgl/renderer/layers/render_circle_layer.cpp | 120 |
1 files changed, 52 insertions, 68 deletions
diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index a85b82b2d2..ffcc0be1b5 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -19,26 +19,18 @@ namespace { struct RenderableSegment { RenderableSegment(const Segment<CircleAttributes>& segment_, - CircleProgram& programInstance_, - const CircleBucket& bucket_, - const CircleProgram::UniformValues& allUniformValues_, - const CircleProgram::AttributeBindings& allAttributeBindings_, + const RenderTile& tile_, + const LayerRenderData* renderData_, float sortKey_) - : segment(segment_), - programInstance(programInstance_), - bucket(bucket_), - allUniformValues(allUniformValues_), - allAttributeBindings(allAttributeBindings_), - sortKey(sortKey_) {} + : segment(segment_), tile(tile_), renderData(renderData_), sortKey(sortKey_) {} const Segment<CircleAttributes>& segment; - CircleProgram& programInstance; - const CircleBucket& bucket; - const CircleProgram::UniformValues& allUniformValues; - const CircleProgram::AttributeBindings& allAttributeBindings; + const RenderTile& tile; + const LayerRenderData* renderData; const float sortKey; friend bool operator<(const RenderableSegment& lhs, const RenderableSegment& rhs) { + if (lhs.sortKey == rhs.sortKey) return lhs.tile.id < rhs.tile.id; return lhs.sortKey < rhs.sortKey; } }; @@ -88,27 +80,20 @@ void RenderCircleLayer::render(PaintParameters& parameters) { if (parameters.pass == RenderPass::Opaque) { return; } - - const bool sortFeaturesByKey = !impl_cast(baseImpl).layout.get<CircleSortKey>().isUndefined(); - std::multiset<RenderableSegment> renderableSegments{}; - - for (const RenderTile& tile : *renderTiles) { - const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); - 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()); + const auto drawTile = [&](const RenderTile& tile, const LayerRenderData* data, const auto& segments) { + auto& circleBucket = static_cast<CircleBucket&>(*data->bucket); + const auto& evaluated = getEvaluated<CircleLayerProperties>(data->layerProperties); + const bool scaleWithMap = evaluated.template get<CirclePitchScale>() == CirclePitchScaleType::Map; + const bool pitchWithMap = evaluated.template get<CirclePitchAlignment>() == AlignmentType::Map; + const auto& paintPropertyBinders = circleBucket.paintPropertyBinders.at(getID()); auto& programInstance = parameters.programs.getCircleLayerPrograms().circle; - - const auto allUniformValues = CircleProgram::computeAllUniformValues( - CircleProgram::LayoutUniformValues{ - uniforms::matrix::Value(tile.translatedMatrix( - evaluated.get<CircleTranslate>(), evaluated.get<CircleTranslateAnchor>(), parameters.state)), + using LayoutUniformValues = CircleProgram::LayoutUniformValues; + const auto& allUniformValues = CircleProgram::computeAllUniformValues( + LayoutUniformValues( + uniforms::matrix::Value(tile.translatedMatrix(evaluated.template get<CircleTranslate>(), + evaluated.template 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()), @@ -116,52 +101,51 @@ void RenderCircleLayer::render(PaintParameters& parameters) { : parameters.pixelsToGLUnits), uniforms::device_pixel_ratio::Value(parameters.pixelRatio), uniforms::camera_to_center_distance::Value(parameters.state.getCameraToCenterDistance()), - uniforms::pitch_with_map::Value(pitchWithMap)}, + uniforms::pitch_with_map::Value(pitchWithMap)), paintPropertyBinders, evaluated, parameters.state.getZoom()); - const auto allAttributeBindings = - CircleProgram::computeAllAttributeBindings(*bucket.vertexBuffer, paintPropertyBinders, evaluated); + const auto& allAttributeBindings = + CircleProgram::computeAllAttributeBindings(*circleBucket.vertexBuffer, paintPropertyBinders, evaluated); checkRenderability(parameters, CircleProgram::activeBindingCount(allAttributeBindings)); - if (sortFeaturesByKey) { - for (auto& segment : bucket.segments) { - renderableSegments.emplace( - segment, programInstance, bucket, allUniformValues, allAttributeBindings, segment.sortKey); - } - } else { - 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()); + programInstance.draw(parameters.context, + *parameters.renderPass, + gfx::Triangles(), + parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), + gfx::StencilMode::disabled(), + parameters.colorModeForRenderPass(), + gfx::CullFaceMode::disabled(), + *circleBucket.indexBuffer, + segments, + allUniformValues, + allAttributeBindings, + CircleProgram::TextureBindings{}, + getID()); + }; + + const bool sortFeaturesByKey = !impl_cast(baseImpl).layout.get<CircleSortKey>().isUndefined(); + std::multiset<RenderableSegment> renderableSegments; + + for (const RenderTile& renderTile : *renderTiles) { + const LayerRenderData* renderData = getRenderDataForPass(renderTile, parameters.pass); + if (!renderData) { + continue; + } + auto& bucket = static_cast<CircleBucket&>(*renderData->bucket); + if (!sortFeaturesByKey) { + drawTile(renderTile, renderData, bucket.segments); + continue; + } + for (auto& segment : bucket.segments) { + renderableSegments.emplace(segment, renderTile, renderData, segment.sortKey); } } if (sortFeaturesByKey) { for (const auto& renderable : renderableSegments) { - renderable.programInstance.draw(parameters.context, - *parameters.renderPass, - gfx::Triangles(), - parameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), - gfx::StencilMode::disabled(), - parameters.colorModeForRenderPass(), - gfx::CullFaceMode::disabled(), - *renderable.bucket.indexBuffer, - renderable.segment, - renderable.allUniformValues, - renderable.allAttributeBindings, - CircleProgram::TextureBindings{}, - getID()); + drawTile(renderable.tile, renderable.renderData, renderable.segment); } } } |