[core] Avoid RenderStyle dependency in query code

This commit is contained in:
John Firebaugh
2017-08-12 11:20:49 -07:00
parent 3d3648387b
commit e706ed4b2e
21 changed files with 78 additions and 96 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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