[core] Placement accepts RenderLayer instances

This commit is contained in:
Mikhail Pozdnyakov
2019-05-16 11:02:52 +03:00
parent febe696d4b
commit 44fd6dcf7c
5 changed files with 24 additions and 37 deletions

View File

@@ -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});
}
}
}

View File

@@ -31,6 +31,8 @@ class LayerPlacementData {
public:
std::reference_wrapper<Bucket> bucket;
std::reference_wrapper<RenderTile> tile;
bool pitchWithMap;
bool rotateWithMap;
};
class RenderLayer {

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}

View File

@@ -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;