[core] Introduce Placement::placeLayers()
This commit is contained in:
@@ -146,4 +146,6 @@ private:
|
||||
bool hasRenderFailures = false;
|
||||
};
|
||||
|
||||
using RenderLayerReferences = std::vector<std::reference_wrapper<RenderLayer>>;
|
||||
|
||||
} // namespace mbgl
|
||||
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
std::vector<std::unique_ptr<RenderItem>> sourceRenderItems_,
|
||||
LineAtlas& lineAtlas_,
|
||||
PatternAtlas& patternAtlas_,
|
||||
std::vector<std::reference_wrapper<RenderLayer>> layersNeedPlacement_,
|
||||
RenderLayerReferences layersNeedPlacement_,
|
||||
Immutable<Placement> placement_,
|
||||
bool updateSymbolOpacities_)
|
||||
: RenderTree(std::move(parameters_)),
|
||||
@@ -96,7 +96,7 @@ public:
|
||||
std::vector<std::unique_ptr<RenderItem>> sourceRenderItems;
|
||||
std::reference_wrapper<LineAtlas> lineAtlas;
|
||||
std::reference_wrapper<PatternAtlas> patternAtlas;
|
||||
std::vector<std::reference_wrapper<RenderLayer>> layersNeedPlacement;
|
||||
RenderLayerReferences layersNeedPlacement;
|
||||
Immutable<Placement> placement;
|
||||
bool updateSymbolOpacities;
|
||||
};
|
||||
@@ -379,15 +379,20 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(
|
||||
}
|
||||
// Symbol placement.
|
||||
bool symbolBucketsChanged = false;
|
||||
bool symbolBucketsAdded = false;
|
||||
std::set<std::string> usedSymbolLayers;
|
||||
auto longitude = updateParameters->transformState.getLatLng().longitude();
|
||||
if (isMapModeContinuous) {
|
||||
bool symbolBucketsAdded = false;
|
||||
for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) {
|
||||
auto result = crossTileSymbolIndex.addLayer(*it, longitude);
|
||||
for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) {
|
||||
RenderLayer& layer = *it;
|
||||
auto result = crossTileSymbolIndex.addLayer(layer, longitude);
|
||||
if (isMapModeContinuous) {
|
||||
usedSymbolLayers.insert(layer.getID());
|
||||
symbolBucketsAdded = symbolBucketsAdded || (result & CrossTileSymbolIndex::AddLayerResult::BucketsAdded);
|
||||
symbolBucketsChanged = symbolBucketsChanged || (result != CrossTileSymbolIndex::AddLayerResult::NoChanges);
|
||||
}
|
||||
}
|
||||
|
||||
if (isMapModeContinuous) {
|
||||
optional<Duration> placementUpdatePeriodOverride;
|
||||
if (symbolBucketsAdded && !tiltedView) {
|
||||
// If the view is not tilted, we want *the new* symbols to show up faster, however simple setting
|
||||
@@ -403,22 +408,14 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(
|
||||
updateParameters->timePoint, updateParameters->transformState.getZoom(), placementUpdatePeriodOverride);
|
||||
symbolBucketsChanged |= renderTreeParameters->placementChanged;
|
||||
|
||||
std::set<std::string> usedSymbolLayers;
|
||||
if (renderTreeParameters->placementChanged) {
|
||||
Mutable<Placement> placement = makeMutable<Placement>(updateParameters, placementController.getPlacement());
|
||||
|
||||
for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) {
|
||||
const RenderLayer& layer = *it;
|
||||
usedSymbolLayers.insert(layer.getID());
|
||||
placement->placeLayer(layer);
|
||||
}
|
||||
|
||||
placement->commit();
|
||||
placement->placeLayers(layersNeedPlacement);
|
||||
placementController.setPlacement(std::move(placement));
|
||||
crossTileSymbolIndex.pruneUnusedLayers(usedSymbolLayers);
|
||||
for (const auto& entry : renderSources) {
|
||||
entry.second->updateFadingTiles();
|
||||
}
|
||||
placementController.setPlacement(std::move(placement));
|
||||
} else {
|
||||
placementController.setPlacementStale();
|
||||
}
|
||||
@@ -429,14 +426,10 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(
|
||||
renderTreeParameters->placementChanged = symbolBucketsChanged = !layersNeedPlacement.empty();
|
||||
if (renderTreeParameters->placementChanged) {
|
||||
Mutable<Placement> placement = makeMutable<Placement>(updateParameters);
|
||||
for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) {
|
||||
const RenderLayer& layer = *it;
|
||||
crossTileSymbolIndex.addLayer(layer, longitude);
|
||||
placement->placeLayer(layer);
|
||||
}
|
||||
placement->commit();
|
||||
placement->placeLayers(layersNeedPlacement);
|
||||
placementController.setPlacement(std::move(placement));
|
||||
}
|
||||
crossTileSymbolIndex.reset();
|
||||
renderTreeParameters->symbolFadeChange = 1.0f;
|
||||
renderTreeParameters->needsRepaint = false;
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@ namespace mbgl {
|
||||
|
||||
class RendererObserver;
|
||||
class RenderSource;
|
||||
class RenderLayer;
|
||||
class UpdateParameters;
|
||||
class RenderStaticData;
|
||||
class RenderedQueryOptions;
|
||||
@@ -129,8 +128,8 @@ private:
|
||||
// Vectors with reserved capacity of layerImpls->size() to avoid reallocation
|
||||
// on each frame.
|
||||
std::vector<Immutable<style::LayerProperties>> filteredLayersForSource;
|
||||
std::vector<std::reference_wrapper<RenderLayer>> orderedLayers;
|
||||
std::vector<std::reference_wrapper<RenderLayer>> layersNeedPlacement;
|
||||
RenderLayerReferences orderedLayers;
|
||||
RenderLayerReferences layersNeedPlacement;
|
||||
};
|
||||
|
||||
} // namespace mbgl
|
||||
|
||||
@@ -105,6 +105,13 @@ Placement::Placement(std::shared_ptr<const UpdateParameters> updateParameters_,
|
||||
|
||||
Placement::Placement() : collisionIndex({}, MapMode::Static), collisionGroups(true) {}
|
||||
|
||||
void Placement::placeLayers(const RenderLayerReferences& layers) {
|
||||
for (auto it = layers.crbegin(); it != layers.crend(); ++it) {
|
||||
placeLayer(*it);
|
||||
}
|
||||
commit();
|
||||
}
|
||||
|
||||
void Placement::placeLayer(const RenderLayer& layer) {
|
||||
std::set<uint32_t> seenCrossTileIDs;
|
||||
for (const BucketPlacementData& data : layer.getPlacementData()) {
|
||||
|
||||
@@ -108,9 +108,7 @@ class Placement {
|
||||
public:
|
||||
Placement(std::shared_ptr<const UpdateParameters>, optional<Immutable<Placement>> prevPlacement = nullopt);
|
||||
Placement();
|
||||
|
||||
void placeLayer(const RenderLayer&);
|
||||
void commit();
|
||||
void placeLayers(const RenderLayerReferences&);
|
||||
void updateLayerBuckets(const RenderLayer&, const TransformState&, bool updateOpacities) const;
|
||||
float symbolFadeChange(TimePoint now) const;
|
||||
bool hasTransitions(TimePoint now) const;
|
||||
@@ -128,6 +126,8 @@ public:
|
||||
private:
|
||||
friend SymbolBucket;
|
||||
void placeSymbolBucket(const BucketPlacementData&, std::set<uint32_t>& seenCrossTileIDs);
|
||||
void placeLayer(const RenderLayer&);
|
||||
void commit();
|
||||
// Returns `true` if bucket vertices were updated; returns `false` otherwise.
|
||||
bool updateBucketDynamicVertices(SymbolBucket&, const TransformState&, const RenderTile& tile) const;
|
||||
void updateBucketOpacities(SymbolBucket&, const TransformState&, std::set<uint32_t>&) const;
|
||||
|
||||
Reference in New Issue
Block a user