[core] Add feature state support to queryRenderedFeatures API

This commit is contained in:
Juha Alanen
2019-08-21 15:40:11 +03:00
committed by Juha Alanen
parent 8e19be9d9c
commit 598df1897d
10 changed files with 43 additions and 17 deletions

View File

@@ -49,7 +49,7 @@ RenderAnnotationSource::queryRenderedFeatures(const ScreenLineString& geometry,
const std::unordered_map<std::string, const RenderLayer*>& layers,
const RenderedQueryOptions& options,
const mat4& projMatrix) const {
return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options, projMatrix);
return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options, projMatrix, {});
}
std::vector<Feature> RenderAnnotationSource::querySourceFeatures(const SourceQueryOptions&) const {

View File

@@ -8,6 +8,7 @@
#include <mbgl/math/minmax.hpp>
#include <mbgl/style/filter.hpp>
#include <mbgl/tile/tile_id.hpp>
#include <mbgl/renderer/source_state.hpp>
#include <mapbox/geometry/envelope.hpp>
@@ -48,7 +49,8 @@ void FeatureIndex::query(
const RenderedQueryOptions& queryOptions,
const UnwrappedTileID& tileID,
const std::unordered_map<std::string, const RenderLayer*>& layers,
const float additionalQueryPadding) const {
const float additionalQueryPadding,
const SourceFeatureState& sourceFeatureState) const {
if (!tileData) {
return;
@@ -74,7 +76,7 @@ void FeatureIndex::query(
if (indexedFeature.sortIndex == previousSortIndex) continue;
previousSortIndex = indexedFeature.sortIndex;
addFeature(result, indexedFeature, queryOptions, tileID.canonical, layers, queryGeometry, transformState, pixelsToTileUnits, posMatrix);
addFeature(result, indexedFeature, queryOptions, tileID.canonical, layers, queryGeometry, transformState, pixelsToTileUnits, posMatrix, &sourceFeatureState);
}
}
@@ -113,7 +115,7 @@ FeatureIndex::lookupSymbolFeatures(const std::vector<IndexedSubfeature>& symbolF
for (const auto& symbolFeature : sortedFeatures) {
mat4 unusedMatrix;
addFeature(result, symbolFeature, queryOptions, tileID.canonical, layers, GeometryCoordinates(), {}, 0, unusedMatrix);
addFeature(result, symbolFeature, queryOptions, tileID.canonical, layers, GeometryCoordinates(), {}, 0, unusedMatrix, nullptr);
}
return result;
}
@@ -127,7 +129,8 @@ void FeatureIndex::addFeature(
const GeometryCoordinates& queryGeometry,
const TransformState& transformState,
const float pixelsToTileUnits,
const mat4& posMatrix) const {
const mat4& posMatrix,
const SourceFeatureState* sourceFeatureState) const {
// Lazily calculated.
std::unique_ptr<GeometryTileLayer> sourceLayer;
@@ -148,6 +151,13 @@ void FeatureIndex::addFeature(
geometryTileFeature = sourceLayer->getFeature(indexedFeature.index);
assert(geometryTileFeature);
}
FeatureState state;
if (sourceFeatureState) {
optional<std::string> idStr = featureIDtoString(geometryTileFeature->getID());
if (idStr) {
sourceFeatureState->getState(state, sourceLayer->getName(), *idStr);
}
}
bool needsCrossTileIndex = renderLayer->baseImpl->getTypeInfo()->crossTileIndex == style::LayerTypeInfo::CrossTileIndex::Required;
if (!needsCrossTileIndex &&
@@ -159,7 +169,11 @@ void FeatureIndex::addFeature(
continue;
}
result[layerID].emplace_back(convertFeature(*geometryTileFeature, tileID));
Feature feature = convertFeature(*geometryTileFeature, tileID);
feature.source = renderLayer->baseImpl->source;
feature.sourceLayer = sourceLayer->getName();
feature.state = state;
result[layerID].emplace_back(feature);
}
}

View File

@@ -16,6 +16,7 @@ namespace mbgl {
class RenderedQueryOptions;
class RenderLayer;
class TransformState;
class SourceFeatureState;
class CollisionIndex;
@@ -68,7 +69,8 @@ public:
const RenderedQueryOptions& options,
const UnwrappedTileID&,
const std::unordered_map<std::string, const RenderLayer*>&,
const float additionalQueryPadding) const;
const float additionalQueryPadding,
const SourceFeatureState& sourceFeatureState) const;
static optional<GeometryCoordinates> translateQueryGeometry(
const GeometryCoordinates& queryGeometry,
@@ -96,7 +98,8 @@ private:
const GeometryCoordinates& queryGeometry,
const TransformState& transformState,
const float pixelsToTileUnits,
const mat4& posMatrix) const;
const mat4& posMatrix,
const SourceFeatureState* sourceFeatureState) const;
GridIndex<IndexedSubfeature> grid;
unsigned int sortIndex = 0;

View File

@@ -127,7 +127,7 @@ RenderTileSource::queryRenderedFeatures(const ScreenLineString& geometry,
const std::unordered_map<std::string, const RenderLayer*>& layers,
const RenderedQueryOptions& options,
const mat4& projMatrix) const {
return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options, projMatrix);
return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options, projMatrix, featureState);
}
std::vector<Feature> RenderTileSource::querySourceFeatures(const SourceQueryOptions& options) const {

View File

@@ -283,7 +283,8 @@ std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRendered
const TransformState& transformState,
const std::unordered_map<std::string, const RenderLayer*>& layers,
const RenderedQueryOptions& options,
const mat4& projMatrix) const {
const mat4& projMatrix,
const SourceFeatureState& featureState) const {
std::unordered_map<std::string, std::vector<Feature>> result;
if (renderedTiles.empty() || geometry.empty()) {
return result;
@@ -336,7 +337,8 @@ std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRendered
transformState,
layers,
options,
projMatrix);
projMatrix,
featureState);
}
return result;

View File

@@ -54,7 +54,8 @@ public:
const TransformState& transformState,
const std::unordered_map<std::string, const RenderLayer*>&,
const RenderedQueryOptions& options,
const mat4& projMatrix) const;
const mat4& projMatrix,
const mbgl::SourceFeatureState& featureState) const;
std::vector<Feature> querySourceFeatures(const SourceQueryOptions&) const;

View File

@@ -308,7 +308,8 @@ void GeometryTile::queryRenderedFeatures(
const TransformState& transformState,
const std::unordered_map<std::string, const RenderLayer*>& layers,
const RenderedQueryOptions& options,
const mat4& projMatrix) {
const mat4& projMatrix,
const SourceFeatureState& featureState) {
if (!getData()) return;
@@ -327,7 +328,8 @@ void GeometryTile::queryRenderedFeatures(
options,
id.toUnwrapped(),
layers,
queryPadding * transformState.maxPitchScaleFactor());
queryPadding * transformState.maxPitchScaleFactor(),
featureState);
}
void GeometryTile::querySourceFeatures(

View File

@@ -54,7 +54,8 @@ public:
const TransformState&,
const std::unordered_map<std::string, const RenderLayer*>& layers,
const RenderedQueryOptions& options,
const mat4& projMatrix) override;
const mat4& projMatrix,
const SourceFeatureState& featureState) override;
void querySourceFeatures(
std::vector<Feature>& result,

View File

@@ -45,7 +45,8 @@ void Tile::queryRenderedFeatures(
const TransformState&,
const std::unordered_map<std::string, const RenderLayer*>&,
const RenderedQueryOptions&,
const mat4&) {}
const mat4&,
const SourceFeatureState&) {}
float Tile::getQueryPadding(const std::unordered_map<std::string, const RenderLayer*>&) {
return 0;

View File

@@ -28,6 +28,7 @@ class TileRenderData;
class RenderedQueryOptions;
class SourceQueryOptions;
class CollisionIndex;
class SourceFeatureState;
namespace gfx {
class UploadPass;
@@ -73,7 +74,8 @@ public:
const TransformState&,
const std::unordered_map<std::string, const RenderLayer*>&,
const RenderedQueryOptions& options,
const mat4& projMatrix);
const mat4& projMatrix,
const SourceFeatureState& featureState);
virtual void querySourceFeatures(
std::vector<Feature>& result,