[core] Avoid RenderStyle dependency in query code
This commit is contained in:
@@ -60,9 +60,9 @@ std::vector<std::reference_wrapper<RenderTile>> RenderAnnotationSource::getRende
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
RenderAnnotationSource::queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const {
|
||||
return tilePyramid.queryRenderedFeatures(geometry, transformState, style, options);
|
||||
return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options);
|
||||
}
|
||||
|
||||
std::vector<Feature> RenderAnnotationSource::querySourceFeatures(const SourceQueryOptions&) const {
|
||||
|
||||
@@ -26,7 +26,7 @@ public:
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const final;
|
||||
|
||||
std::vector<Feature>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#include <mbgl/geometry/feature_index.hpp>
|
||||
#include <mbgl/renderer/render_style.hpp>
|
||||
#include <mbgl/renderer/render_layer.hpp>
|
||||
#include <mbgl/renderer/query.hpp>
|
||||
#include <mbgl/renderer/layers/render_symbol_layer.hpp>
|
||||
@@ -32,19 +31,6 @@ void FeatureIndex::insert(const GeometryCollection& geometries,
|
||||
}
|
||||
}
|
||||
|
||||
static bool vectorContains(const std::vector<std::string>& vector, const std::string& s) {
|
||||
return std::find(vector.begin(), vector.end(), s) != vector.end();
|
||||
}
|
||||
|
||||
static bool vectorsIntersect(const std::vector<std::string>& vectorA, const std::vector<std::string>& vectorB) {
|
||||
for (const auto& a : vectorA) {
|
||||
if (vectorContains(vectorB, a)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool topDown(const IndexedSubfeature& a, const IndexedSubfeature& b) {
|
||||
return a.sortIndex > b.sortIndex;
|
||||
}
|
||||
@@ -53,30 +39,17 @@ static bool topDownSymbols(const IndexedSubfeature& a, const IndexedSubfeature&
|
||||
return a.sortIndex < b.sortIndex;
|
||||
}
|
||||
|
||||
static int16_t getAdditionalQueryRadius(const RenderedQueryOptions& queryOptions,
|
||||
const RenderStyle& style,
|
||||
static int16_t getAdditionalQueryRadius(const std::vector<const RenderLayer*>& layers,
|
||||
const GeometryTile& tile,
|
||||
const float pixelsToTileUnits) {
|
||||
|
||||
// Determine the additional radius needed factoring in property functions
|
||||
float additionalRadius = 0;
|
||||
auto getQueryRadius = [&](const RenderLayer& layer) {
|
||||
auto bucket = tile.getBucket(*layer.baseImpl);
|
||||
if (bucket) {
|
||||
additionalRadius = std::max(additionalRadius, bucket->getQueryRadius(layer) * pixelsToTileUnits);
|
||||
}
|
||||
};
|
||||
|
||||
if (queryOptions.layerIDs) {
|
||||
for (const auto& layerID : *queryOptions.layerIDs) {
|
||||
const RenderLayer* layer = style.getRenderLayer(layerID);
|
||||
if (layer) {
|
||||
getQueryRadius(*layer);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (const RenderLayer* layer : style.getRenderLayers()) {
|
||||
getQueryRadius(*layer);
|
||||
for (const auto& layer : layers) {
|
||||
auto bucket = tile.getBucket(*layer->baseImpl);
|
||||
if (bucket) {
|
||||
additionalRadius = std::max(additionalRadius, bucket->getQueryRadius(*layer) * pixelsToTileUnits);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,13 +65,13 @@ void FeatureIndex::query(
|
||||
const RenderedQueryOptions& queryOptions,
|
||||
const GeometryTileData& geometryTileData,
|
||||
const CanonicalTileID& tileID,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const CollisionTile* collisionTile,
|
||||
const GeometryTile& tile) const {
|
||||
|
||||
// Determine query radius
|
||||
const float pixelsToTileUnits = util::EXTENT / tileSize / scale;
|
||||
const int16_t additionalRadius = getAdditionalQueryRadius(queryOptions, style, tile, pixelsToTileUnits);
|
||||
const int16_t additionalRadius = getAdditionalQueryRadius(layers, tile, pixelsToTileUnits);
|
||||
|
||||
// Query the grid index
|
||||
mapbox::geometry::box<int16_t> box = mapbox::geometry::envelope(queryGeometry);
|
||||
@@ -113,7 +86,7 @@ void FeatureIndex::query(
|
||||
if (indexedFeature.sortIndex == previousSortIndex) continue;
|
||||
previousSortIndex = indexedFeature.sortIndex;
|
||||
|
||||
addFeature(result, indexedFeature, queryGeometry, queryOptions, geometryTileData, tileID, style, bearing, pixelsToTileUnits);
|
||||
addFeature(result, indexedFeature, queryGeometry, queryOptions, geometryTileData, tileID, layers, bearing, pixelsToTileUnits);
|
||||
}
|
||||
|
||||
// Query symbol features, if they've been placed.
|
||||
@@ -124,7 +97,7 @@ void FeatureIndex::query(
|
||||
std::vector<IndexedSubfeature> symbolFeatures = collisionTile->queryRenderedSymbols(queryGeometry, scale);
|
||||
std::sort(symbolFeatures.begin(), symbolFeatures.end(), topDownSymbols);
|
||||
for (const auto& symbolFeature : symbolFeatures) {
|
||||
addFeature(result, symbolFeature, queryGeometry, queryOptions, geometryTileData, tileID, style, bearing, pixelsToTileUnits);
|
||||
addFeature(result, symbolFeature, queryGeometry, queryOptions, geometryTileData, tileID, layers, bearing, pixelsToTileUnits);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,30 +108,39 @@ void FeatureIndex::addFeature(
|
||||
const RenderedQueryOptions& options,
|
||||
const GeometryTileData& geometryTileData,
|
||||
const CanonicalTileID& tileID,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const float bearing,
|
||||
const float pixelsToTileUnits) const {
|
||||
|
||||
auto& layerIDs = bucketLayerIDs.at(indexedFeature.bucketName);
|
||||
if (options.layerIDs && !vectorsIntersect(layerIDs, *options.layerIDs)) {
|
||||
return;
|
||||
}
|
||||
auto getRenderLayer = [&] (const std::string& layerID) -> const RenderLayer* {
|
||||
for (const auto& layer : layers) {
|
||||
if (layer->getID() == layerID) {
|
||||
return layer;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
auto sourceLayer = geometryTileData.getLayer(indexedFeature.sourceLayerName);
|
||||
assert(sourceLayer);
|
||||
// Lazily calculated.
|
||||
std::unique_ptr<GeometryTileLayer> sourceLayer;
|
||||
std::unique_ptr<GeometryTileFeature> geometryTileFeature;
|
||||
|
||||
auto geometryTileFeature = sourceLayer->getFeature(indexedFeature.index);
|
||||
assert(geometryTileFeature);
|
||||
|
||||
for (const auto& layerID : layerIDs) {
|
||||
if (options.layerIDs && !vectorContains(*options.layerIDs, layerID)) {
|
||||
for (const std::string& layerID : bucketLayerIDs.at(indexedFeature.bucketName)) {
|
||||
const RenderLayer* renderLayer = getRenderLayer(layerID);
|
||||
if (!renderLayer) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto renderLayer = style.getRenderLayer(layerID);
|
||||
if (!renderLayer ||
|
||||
(!renderLayer->is<RenderSymbolLayer>() &&
|
||||
!renderLayer->queryIntersectsFeature(queryGeometry, *geometryTileFeature, tileID.z, bearing, pixelsToTileUnits))) {
|
||||
if (!geometryTileFeature) {
|
||||
sourceLayer = geometryTileData.getLayer(indexedFeature.sourceLayerName);
|
||||
assert(sourceLayer);
|
||||
|
||||
geometryTileFeature = sourceLayer->getFeature(indexedFeature.index);
|
||||
assert(geometryTileFeature);
|
||||
}
|
||||
|
||||
if (!renderLayer->is<RenderSymbolLayer>() &&
|
||||
!renderLayer->queryIntersectsFeature(queryGeometry, *geometryTileFeature, tileID.z, bearing, pixelsToTileUnits)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace mbgl {
|
||||
|
||||
class GeometryTile;
|
||||
class RenderedQueryOptions;
|
||||
class RenderStyle;
|
||||
class RenderLayer;
|
||||
|
||||
class CollisionTile;
|
||||
class CanonicalTileID;
|
||||
@@ -42,7 +42,7 @@ public:
|
||||
const RenderedQueryOptions& options,
|
||||
const GeometryTileData&,
|
||||
const CanonicalTileID&,
|
||||
const RenderStyle&,
|
||||
const std::vector<const RenderLayer*>&,
|
||||
const CollisionTile*,
|
||||
const GeometryTile& tile) const;
|
||||
|
||||
@@ -63,7 +63,7 @@ private:
|
||||
const RenderedQueryOptions& options,
|
||||
const GeometryTileData&,
|
||||
const CanonicalTileID&,
|
||||
const RenderStyle&,
|
||||
const std::vector<const RenderLayer*>&,
|
||||
const float bearing,
|
||||
const float pixelsToTileUnits) const;
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ namespace mbgl {
|
||||
class PaintParameters;
|
||||
class TransformState;
|
||||
class RenderTile;
|
||||
class RenderStyle;
|
||||
class RenderLayer;
|
||||
class RenderedQueryOptions;
|
||||
class SourceQueryOptions;
|
||||
@@ -63,7 +62,7 @@ public:
|
||||
virtual std::unordered_map<std::string, std::vector<Feature>>
|
||||
queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const = 0;
|
||||
|
||||
virtual std::vector<Feature>
|
||||
|
||||
@@ -373,24 +373,28 @@ RenderData RenderStyle::getRenderData(MapDebugOptions debugOptions, float angle)
|
||||
std::vector<Feature> RenderStyle::queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderedQueryOptions& options) const {
|
||||
std::unordered_map<std::string, std::vector<Feature>> resultsByLayer;
|
||||
|
||||
std::vector<const RenderLayer*> layers;
|
||||
if (options.layerIDs) {
|
||||
std::unordered_set<std::string> sourceIDs;
|
||||
for (const auto& layerID : *options.layerIDs) {
|
||||
if (const RenderLayer* layer = getRenderLayer(layerID)) {
|
||||
sourceIDs.emplace(layer->baseImpl->source);
|
||||
}
|
||||
}
|
||||
for (const auto& sourceID : sourceIDs) {
|
||||
if (RenderSource* renderSource = getRenderSource(sourceID)) {
|
||||
auto sourceResults = renderSource->queryRenderedFeatures(geometry, transformState, *this, options);
|
||||
std::move(sourceResults.begin(), sourceResults.end(), std::inserter(resultsByLayer, resultsByLayer.begin()));
|
||||
layers.emplace_back(layer);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (const auto& entry : renderSources) {
|
||||
auto sourceResults = entry.second->queryRenderedFeatures(geometry, transformState, *this, options);
|
||||
for (const auto& entry : renderLayers) {
|
||||
layers.emplace_back(entry.second.get());
|
||||
}
|
||||
}
|
||||
|
||||
std::unordered_set<std::string> sourceIDs;
|
||||
for (const RenderLayer* layer : layers) {
|
||||
sourceIDs.emplace(layer->baseImpl->source);
|
||||
}
|
||||
|
||||
std::unordered_map<std::string, std::vector<Feature>> resultsByLayer;
|
||||
for (const auto& sourceID : sourceIDs) {
|
||||
if (RenderSource* renderSource = getRenderSource(sourceID)) {
|
||||
auto sourceResults = renderSource->queryRenderedFeatures(geometry, transformState, layers, options);
|
||||
std::move(sourceResults.begin(), sourceResults.end(), std::inserter(resultsByLayer, resultsByLayer.begin()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,9 +75,9 @@ std::vector<std::reference_wrapper<RenderTile>> RenderGeoJSONSource::getRenderTi
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
RenderGeoJSONSource::queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const {
|
||||
return tilePyramid.queryRenderedFeatures(geometry, transformState, style, options);
|
||||
return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options);
|
||||
}
|
||||
|
||||
std::vector<Feature> RenderGeoJSONSource::querySourceFeatures(const SourceQueryOptions& options) const {
|
||||
|
||||
@@ -30,7 +30,7 @@ public:
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const final;
|
||||
|
||||
std::vector<Feature>
|
||||
|
||||
@@ -83,7 +83,7 @@ void RenderImageSource::finishRender(PaintParameters& parameters) {
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
RenderImageSource::queryRenderedFeatures(const ScreenLineString&,
|
||||
const TransformState&,
|
||||
const RenderStyle&,
|
||||
const std::vector<const RenderLayer*>&,
|
||||
const RenderedQueryOptions&) const {
|
||||
return std::unordered_map<std::string, std::vector<Feature>> {};
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ public:
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const final;
|
||||
|
||||
std::vector<Feature> querySourceFeatures(const SourceQueryOptions&) const final;
|
||||
|
||||
@@ -73,7 +73,7 @@ std::vector<std::reference_wrapper<RenderTile>> RenderRasterSource::getRenderTil
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
RenderRasterSource::queryRenderedFeatures(const ScreenLineString&,
|
||||
const TransformState&,
|
||||
const RenderStyle&,
|
||||
const std::vector<const RenderLayer*>&,
|
||||
const RenderedQueryOptions&) const {
|
||||
return std::unordered_map<std::string, std::vector<Feature>> {};
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ public:
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const final;
|
||||
|
||||
std::vector<Feature>
|
||||
|
||||
@@ -76,9 +76,9 @@ std::vector<std::reference_wrapper<RenderTile>> RenderVectorSource::getRenderTil
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
RenderVectorSource::queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const {
|
||||
return tilePyramid.queryRenderedFeatures(geometry, transformState, style, options);
|
||||
return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options);
|
||||
}
|
||||
|
||||
std::vector<Feature> RenderVectorSource::querySourceFeatures(const SourceQueryOptions& options) const {
|
||||
|
||||
@@ -26,7 +26,7 @@ public:
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const final;
|
||||
|
||||
std::vector<Feature>
|
||||
|
||||
@@ -206,7 +206,7 @@ void TilePyramid::removeStaleTiles(const std::set<OverscaledTileID>& retain) {
|
||||
|
||||
std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) const {
|
||||
std::unordered_map<std::string, std::vector<Feature>> result;
|
||||
if (renderTiles.empty() || geometry.empty()) {
|
||||
@@ -249,7 +249,7 @@ std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRendered
|
||||
renderTile.tile.queryRenderedFeatures(result,
|
||||
tileSpaceQueryGeometry,
|
||||
transformState,
|
||||
style,
|
||||
layers,
|
||||
options);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace mbgl {
|
||||
class PaintParameters;
|
||||
class TransformState;
|
||||
class RenderTile;
|
||||
class RenderStyle;
|
||||
class RenderLayer;
|
||||
class RenderedQueryOptions;
|
||||
class SourceQueryOptions;
|
||||
class TileParameters;
|
||||
@@ -50,7 +50,7 @@ public:
|
||||
std::unordered_map<std::string, std::vector<Feature>>
|
||||
queryRenderedFeatures(const ScreenLineString& geometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>&,
|
||||
const RenderedQueryOptions& options) const;
|
||||
|
||||
std::vector<Feature> querySourceFeatures(const SourceQueryOptions&) const;
|
||||
|
||||
@@ -214,7 +214,7 @@ void GeometryTile::queryRenderedFeatures(
|
||||
std::unordered_map<std::string, std::vector<Feature>>& result,
|
||||
const GeometryCoordinates& queryGeometry,
|
||||
const TransformState& transformState,
|
||||
const RenderStyle& style,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) {
|
||||
|
||||
if (!featureIndex || !data) return;
|
||||
@@ -227,7 +227,7 @@ void GeometryTile::queryRenderedFeatures(
|
||||
options,
|
||||
*data,
|
||||
id.canonical,
|
||||
style,
|
||||
layers,
|
||||
collisionTile.get(),
|
||||
*this);
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
namespace mbgl {
|
||||
|
||||
class GeometryTileData;
|
||||
class RenderStyle;
|
||||
class RenderLayer;
|
||||
class SourceQueryOptions;
|
||||
class TileParameters;
|
||||
@@ -56,7 +55,7 @@ public:
|
||||
std::unordered_map<std::string, std::vector<Feature>>& result,
|
||||
const GeometryCoordinates& queryGeometry,
|
||||
const TransformState&,
|
||||
const RenderStyle&,
|
||||
const std::vector<const RenderLayer*>& layers,
|
||||
const RenderedQueryOptions& options) override;
|
||||
|
||||
void querySourceFeatures(
|
||||
|
||||
@@ -33,7 +33,7 @@ void Tile::queryRenderedFeatures(
|
||||
std::unordered_map<std::string, std::vector<Feature>>&,
|
||||
const GeometryCoordinates&,
|
||||
const TransformState&,
|
||||
const RenderStyle&,
|
||||
const std::vector<const RenderLayer*>&,
|
||||
const RenderedQueryOptions&) {}
|
||||
|
||||
void Tile::querySourceFeatures(
|
||||
|
||||
@@ -23,7 +23,7 @@ class DebugBucket;
|
||||
class TransformState;
|
||||
class TileObserver;
|
||||
class PlacementConfig;
|
||||
class RenderStyle;
|
||||
class RenderLayer;
|
||||
class RenderedQueryOptions;
|
||||
class SourceQueryOptions;
|
||||
|
||||
@@ -61,7 +61,7 @@ public:
|
||||
std::unordered_map<std::string, std::vector<Feature>>& result,
|
||||
const GeometryCoordinates& queryGeometry,
|
||||
const TransformState&,
|
||||
const RenderStyle&,
|
||||
const std::vector<const RenderLayer*>&,
|
||||
const RenderedQueryOptions& options);
|
||||
|
||||
virtual void querySourceFeatures(
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include <mbgl/util/default_thread_pool.hpp>
|
||||
#include <mbgl/util/run_loop.hpp>
|
||||
#include <mbgl/map/transform.hpp>
|
||||
#include <mbgl/renderer/render_style.hpp>
|
||||
#include <mbgl/renderer/tile_parameters.hpp>
|
||||
#include <mbgl/renderer/query.hpp>
|
||||
#include <mbgl/text/collision_tile.hpp>
|
||||
@@ -31,7 +30,6 @@ public:
|
||||
AnnotationManager annotationManager { style };
|
||||
HeadlessBackend backend;
|
||||
BackendScope scope { backend };
|
||||
RenderStyle renderStyle { threadPool, fileSource };
|
||||
ImageManager imageManager;
|
||||
GlyphManager glyphManager { fileSource };
|
||||
|
||||
@@ -93,7 +91,7 @@ TEST(AnnotationTile, Issue8289) {
|
||||
TransformState transformState;
|
||||
RenderedQueryOptions options;
|
||||
|
||||
tile.queryRenderedFeatures(result, queryGeometry, transformState, test.renderStyle, options);
|
||||
tile.queryRenderedFeatures(result, queryGeometry, transformState, {}, options);
|
||||
|
||||
EXPECT_TRUE(result.empty());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user