From 44fd6dcf7c0ef477a8108f878834cadf01a625f2 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Thu, 16 May 2019 11:02:52 +0300 Subject: [core] Placement accepts RenderLayer instances --- src/mbgl/renderer/layers/render_symbol_layer.cpp | 6 +++- src/mbgl/renderer/render_layer.hpp | 2 ++ src/mbgl/renderer/renderer_impl.cpp | 4 +-- src/mbgl/text/placement.cpp | 45 +++++++----------------- src/mbgl/text/placement.hpp | 4 +-- 5 files changed, 24 insertions(+), 37 deletions(-) diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 53b141816d..219ea43430 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -686,8 +686,12 @@ void RenderSymbolLayer::setRenderTiles(RenderTiles tiles, const TransformState& for (RenderTile& renderTile : renderTiles) { auto bucket = renderTile.tile.getBucket(*baseImpl); if (bucket && bucket->bucketLeaderID == getID()) { + auto& layout = bucket->layout; + bool pitchWithMap = layout.get() == style::AlignmentType::Map; + bool rotateWithMap = layout.get() == style::AlignmentType::Map; + // Only place this layer if it's the "group leader" for the bucket - placementData.push_back({*bucket, renderTile}); + placementData.push_back({*bucket, renderTile, pitchWithMap, rotateWithMap}); } } } diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index 271e38f320..dc2f4cb5d7 100644 --- a/src/mbgl/renderer/render_layer.hpp +++ b/src/mbgl/renderer/render_layer.hpp @@ -31,6 +31,8 @@ class LayerPlacementData { public: std::reference_wrapper bucket; std::reference_wrapper tile; + bool pitchWithMap; + bool rotateWithMap; }; class RenderLayer { diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 85f97f78aa..4ca7f3847b 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -327,7 +327,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { if (placementChanged) { usedSymbolLayers.insert(symbolLayer.getID()); - placement->placeLayer(*symbolLayer.getSymbolInterface(), projMatrix, updateParameters.debugOptions & MapDebugOptions::Collision); + placement->placeLayer(symbolLayer, projMatrix, updateParameters.debugOptions & MapDebugOptions::Collision); } } @@ -342,7 +342,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { if (placementChanged || symbolBucketsChanged) { for (auto it = symbolLayers.rbegin(); it != symbolLayers.rend(); ++it) { const RenderLayer& symbolLayer = *it; - placement->updateLayerOpacities(*symbolLayer.getSymbolInterface()); + placement->updateLayerOpacities(symbolLayer); } } } diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 0b888211b6..8a6b21717c 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -72,27 +72,17 @@ Placement::Placement(const TransformState& state_, MapMode mapMode_, style::Tran } } -void Placement::placeLayer(const RenderLayerSymbolInterface& symbolInterface, const mat4& projMatrix, bool showCollisionBoxes) { +void Placement::placeLayer(const RenderLayer& layer, const mat4& projMatrix, bool showCollisionBoxes) { std::unordered_set seenCrossTileIDs; - for (const RenderTile& renderTile : symbolInterface.getRenderTiles()) { - assert(renderTile.tile.isRenderable()); + for (const auto& item : layer.getPlacementData()) { + RenderTile& renderTile = item.tile; assert(renderTile.tile.kind == Tile::Kind::Geometry); auto& geometryTile = static_cast(renderTile.tile); - auto bucket = symbolInterface.getSymbolBucket(renderTile); - if (!bucket) { - continue; - } - SymbolBucket& symbolBucket = *bucket; - - if (symbolBucket.bucketLeaderID != symbolInterface.layerID()) { - // Only place this layer if it's the "group leader" for the bucket - continue; - } - - auto& layout = symbolBucket.layout; + Bucket& bucket = item.bucket; + auto& symbolBucket = static_cast(bucket); const float pixelsToTileUnits = renderTile.id.pixelsToTileUnits(1, state.getZoom()); @@ -104,14 +94,14 @@ void Placement::placeLayer(const RenderLayerSymbolInterface& symbolInterface, co matrix::multiply(posMatrix, projMatrix, posMatrix); mat4 textLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, - layout.get() == style::AlignmentType::Map, - layout.get() == style::AlignmentType::Map, + item.pitchWithMap, + item.rotateWithMap, state, pixelsToTileUnits); mat4 iconLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, - layout.get() == style::AlignmentType::Map, - layout.get() == style::AlignmentType::Map, + item.pitchWithMap, + item.rotateWithMap, state, pixelsToTileUnits); @@ -406,21 +396,12 @@ void Placement::commit(TimePoint now) { fadeStartTime = placementChanged ? commitTime : prevPlacement->fadeStartTime; } -void Placement::updateLayerOpacities(const RenderLayerSymbolInterface& symbolInterface) { +void Placement::updateLayerOpacities(const RenderLayer& layer) { std::set seenCrossTileIDs; - for (const RenderTile& renderTile : symbolInterface.getRenderTiles()) { - assert(renderTile.tile.isRenderable()); + for (const auto& item : layer.getPlacementData()) { + Bucket& bucket = item.bucket; + auto& symbolBucket = static_cast(bucket); - auto bucket = symbolInterface.getSymbolBucket(renderTile); - if (!bucket) { - continue; - } - SymbolBucket& symbolBucket = *bucket; - - if (symbolBucket.bucketLeaderID != symbolInterface.layerID()) { - // Only update opacities this layer if it's the "group leader" for the bucket - continue; - } updateBucketOpacities(symbolBucket, seenCrossTileIDs); } } diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 10ed642c4e..96af27a89e 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -92,9 +92,9 @@ private: class Placement { public: Placement(const TransformState&, MapMode, style::TransitionOptions, const bool crossSourceCollisions, std::unique_ptr prevPlacementOrNull = nullptr); - void placeLayer(const RenderLayerSymbolInterface&, const mat4&, bool showCollisionBoxes); + void placeLayer(const RenderLayer&, const mat4&, bool showCollisionBoxes); void commit(TimePoint); - void updateLayerOpacities(const RenderLayerSymbolInterface&); + void updateLayerOpacities(const RenderLayer&); float symbolFadeChange(TimePoint now) const; bool hasTransitions(TimePoint now) const; -- cgit v1.2.1