summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-05-16 11:02:52 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-05-19 18:15:33 +0300
commit44fd6dcf7c0ef477a8108f878834cadf01a625f2 (patch)
treef721f60e8d8a8cf1223db51a3b73bfd7dbc7cf35
parentfebe696d4b790a3623b276e2e520acfd2a15d8f8 (diff)
downloadqtlocation-mapboxgl-44fd6dcf7c0ef477a8108f878834cadf01a625f2.tar.gz
[core] Placement accepts RenderLayer instances
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.cpp6
-rw-r--r--src/mbgl/renderer/render_layer.hpp2
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp4
-rw-r--r--src/mbgl/text/placement.cpp45
-rw-r--r--src/mbgl/text/placement.hpp4
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<SymbolBucket>(*baseImpl);
if (bucket && bucket->bucketLeaderID == getID()) {
+ auto& layout = bucket->layout;
+ bool pitchWithMap = layout.get<style::TextPitchAlignment>() == style::AlignmentType::Map;
+ bool rotateWithMap = layout.get<style::TextRotationAlignment>() == 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> bucket;
std::reference_wrapper<RenderTile> 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<uint32_t> 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<GeometryTile&>(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<SymbolBucket&>(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::TextPitchAlignment>() == style::AlignmentType::Map,
- layout.get<style::TextRotationAlignment>() == style::AlignmentType::Map,
+ item.pitchWithMap,
+ item.rotateWithMap,
state,
pixelsToTileUnits);
mat4 iconLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix,
- layout.get<style::IconPitchAlignment>() == style::AlignmentType::Map,
- layout.get<style::IconRotationAlignment>() == 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<uint32_t> 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<SymbolBucket&>(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<Placement> 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;