@@ -3,6 +3,7 @@ import murmur3 from '../util/murmur3';
33import { Event , ErrorEvent , Evented } from '../util/evented' ;
44import StyleChanges from './style_changes' ;
55import createStyleLayer from './create_style_layer' ;
6+ import { LayerExpressionDependencies } from './layer_expression_dependencies' ;
67import loadSprite from './load_sprite' ;
78import ImageManager from '../render/image_manager' ;
89import GlyphManager , { LocalGlyphMode } from '../render/glyph_manager' ;
@@ -262,8 +263,7 @@ export type StyleOptions = {
262263 initialConfig ?: {
263264 [ key : string ] : ConfigSpecification ;
264265 } ;
265- configDependentLayers ?: Set < string > ;
266- indoorDependentLayers ?: Set < string > ;
266+ layerExpressionDependencies ?: Map < string , LayerExpressionDependencies > ;
267267} ;
268268
269269export type StyleSetterOptions = {
@@ -384,8 +384,9 @@ class Style extends Evented<MapEvents> {
384384 _availableModels : StyleModelMap ;
385385 _markersNeedUpdate : boolean ;
386386 _brightness : number | null | undefined ;
387- _configDependentLayers : Set < string > ;
388- _indoorDependentLayers : Set < string > ;
387+ // Expression dependencies of every layer in the style tree, keyed by layer
388+ // fqid and shared by reference between the root style and its fragments.
389+ _layerExpressionDependencies : Map < string , LayerExpressionDependencies > ;
389390 _config : ConfigSpecification | null | undefined ;
390391 _initialConfig : {
391392 [ key : string ] : ConfigSpecification ;
@@ -535,8 +536,7 @@ class Style extends Evented<MapEvents> {
535536
536537 // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
537538 this . options = options . configOptions ? options . configOptions : new Map ( ) ;
538- this . _configDependentLayers = options . configDependentLayers ? options . configDependentLayers : new Set ( ) ;
539- this . _indoorDependentLayers = options . indoorDependentLayers ? options . indoorDependentLayers : new Set ( ) ;
539+ this . _layerExpressionDependencies = options . layerExpressionDependencies ? options . layerExpressionDependencies : new Map < string , LayerExpressionDependencies > ( ) ;
540540 this . _config = options . config ;
541541 this . _styleColorTheme = {
542542 lut : null ,
@@ -832,8 +832,7 @@ class Style extends Evented<MapEvents> {
832832 config,
833833 configOptions : this . options ,
834834 colorThemeOverride : importSpec [ "color-theme" ] ,
835- configDependentLayers : this . _configDependentLayers ,
836- indoorDependentLayers : this . _indoorDependentLayers
835+ layerExpressionDependencies : this . _layerExpressionDependencies
837836 } ) ;
838837
839838 // Bubble all events fired by the style to the map.
@@ -848,7 +847,7 @@ class Style extends Evented<MapEvents> {
848847 if ( ! initialLoad ) {
849848 this . updateConfigDependencies ( ) ;
850849 }
851- this . _updateLayers ( this . _indoorDependentLayers ) ;
850+ this . _updateLayers ( this . _dependentLayerIds ( ( deps ) => deps . isIndoorDependent ) ) ;
852851 this . map . _triggerCameraUpdate ( this . camera ) ;
853852
854853 // During root's initial-load batch, sibling fragments share a single
@@ -961,8 +960,7 @@ class Style extends Evented<MapEvents> {
961960 let hasPendingHdCoverage = false ;
962961 for ( const layer of layers ) {
963962 const styleLayer = createStyleLayer ( layer , this . scope , this . _styleColorTheme . lut , this . options ) ;
964- if ( styleLayer . expressionDependencies . configDependencies . size !== 0 ) this . _configDependentLayers . add ( styleLayer . fqid ) ;
965- if ( styleLayer . expressionDependencies . isIndoorDependent ) this . _indoorDependentLayers . add ( styleLayer . fqid ) ;
963+ this . _layerExpressionDependencies . set ( styleLayer . fqid , new LayerExpressionDependencies ( styleLayer ) ) ;
966964 this . _hasAppearances = this . _hasAppearances || styleLayer . getAppearances ( ) . length !== 0 ;
967965 styleLayer . setEventedParent ( this , { layer : { id : styleLayer . id } } ) ;
968966 this . _layers [ styleLayer . id ] = styleLayer ;
@@ -2778,7 +2776,7 @@ class Style extends Evented<MapEvents> {
27782776 }
27792777
27802778 updateIndoorDependentLayers ( ) {
2781- this . _updateLayers ( this . _indoorDependentLayers ) ;
2779+ this . _updateLayers ( this . _dependentLayerIds ( ( deps ) => deps . isIndoorDependent ) ) ;
27822780 this . map . _styleDirty = true ;
27832781 this . map . triggerRepaint ( ) ;
27842782 }
@@ -2907,21 +2905,29 @@ class Style extends Evented<MapEvents> {
29072905 }
29082906 }
29092907
2910- _updateLayers ( layerIds : Set < string > , condition : ( layer : TypedStyleLayer ) => boolean = ( ) => true ) {
2908+ _updateLayers ( layerIds : Iterable < string > ) {
29112909 for ( const id of layerIds ) {
29122910 const layer = this . getLayer ( id ) ;
2913- if ( layer && condition ( layer ) ) {
2911+ if ( layer ) {
29142912 layer . possiblyEvaluateVisibility ( ) ;
29152913 this . _updateLayer ( layer ) ;
29162914 this . _changes . setDirty ( ) ;
29172915 }
29182916 }
29192917 }
29202918
2919+ _dependentLayerIds ( predicate : ( deps : LayerExpressionDependencies ) => boolean ) : Array < string > {
2920+ const ids : Array < string > = [ ] ;
2921+ for ( const [ id , deps ] of this . _layerExpressionDependencies ) {
2922+ if ( predicate ( deps ) ) ids . push ( id ) ;
2923+ }
2924+ return ids ;
2925+ }
2926+
29212927 updateConfigDependencies ( configKey ?: string ) {
2922- this . _updateLayers ( this . _configDependentLayers , ( layer ) => {
2923- return configKey ? layer . expressionDependencies . configDependencies . has ( configKey ) : true ;
2924- } ) ;
2928+ this . _updateLayers ( this . _dependentLayerIds ( ( deps ) => {
2929+ return configKey ? deps . hasConfigDependency ( configKey ) : deps . isConfigDependent ;
2930+ } ) ) ;
29252931
29262932 if ( this . ambientLight ) {
29272933 this . ambientLight . updateConfig ( this . options ) ;
@@ -2998,9 +3004,7 @@ class Style extends Evented<MapEvents> {
29983004 layer . setEventedParent ( this , { layer : { id} } ) ;
29993005 }
30003006
3001- const fqid = makeFQID ( layer . source , layer . scope ) ;
3002- if ( layer . expressionDependencies . configDependencies . size !== 0 ) this . _configDependentLayers . add ( fqid ) ;
3003- if ( layer . expressionDependencies . isIndoorDependent ) this . _indoorDependentLayers . add ( fqid ) ;
3007+ this . _layerExpressionDependencies . set ( layer . fqid , new LayerExpressionDependencies ( layer ) ) ;
30043008
30053009 let index = this . _order . length ;
30063010 if ( before ) {
@@ -3125,8 +3129,7 @@ class Style extends Evented<MapEvents> {
31253129 this . _changes . setDirty ( ) ;
31263130 this . _handleLayerOrderChange ( ) ;
31273131
3128- this . _configDependentLayers . delete ( layer . fqid ) ;
3129- this . _indoorDependentLayers . delete ( layer . fqid ) ;
3132+ this . _layerExpressionDependencies . delete ( layer . fqid ) ;
31303133 this . _changes . removeLayer ( layer ) ;
31313134
31323135 const sourceCache = this . getOwnLayerSourceCache ( layer ) ;
@@ -3232,8 +3235,11 @@ class Style extends Evented<MapEvents> {
32323235 return ;
32333236 }
32343237
3238+ const dependencies = this . _layerExpressionDependencies . get ( layer . fqid ) ;
3239+
32353240 if ( filter === null || filter === undefined ) {
32363241 layer . filter = undefined ;
3242+ if ( dependencies ) dependencies . invalidateFilter ( ) ;
32373243 this . _updateLayer ( layer ) ;
32383244 return ;
32393245 }
@@ -3243,6 +3249,7 @@ class Style extends Evented<MapEvents> {
32433249 }
32443250
32453251 layer . filter = structuredClone ( filter ) ;
3252+ if ( dependencies ) dependencies . invalidateFilter ( ) ;
32463253 this . _updateLayer ( layer ) ;
32473254 }
32483255
@@ -3282,8 +3289,6 @@ class Style extends Evented<MapEvents> {
32823289 }
32833290
32843291 layer . setLayoutProperty ( name , value ) ;
3285- if ( layer . expressionDependencies . configDependencies . size !== 0 ) this . _configDependentLayers . add ( layer . fqid ) ;
3286- if ( layer . expressionDependencies . isIndoorDependent ) this . _indoorDependentLayers . add ( layer . fqid ) ;
32873292 this . _updateLayer ( layer ) ;
32883293 }
32893294
@@ -3365,8 +3370,6 @@ class Style extends Evented<MapEvents> {
33653370 }
33663371
33673372 const requiresRelayout = layer . setPaintProperty ( name , value ) ;
3368- if ( layer . expressionDependencies . configDependencies . size !== 0 ) this . _configDependentLayers . add ( layer . fqid ) ;
3369- if ( layer . expressionDependencies . isIndoorDependent ) this . _indoorDependentLayers . add ( layer . fqid ) ;
33703373 if ( requiresRelayout ) {
33713374 this . _updateLayer ( layer ) ;
33723375 }
0 commit comments