[core] Add feature state support to queryRenderedFeatures API
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user