@@ -73,7 +73,6 @@ import type {PropertyValidatorOptions} from '../style-spec/validate/validate_pro
7373import type Tile from '../source/tile' ;
7474import type GeoJSONSource from '../source/geojson_source' ;
7575import type { ReplacementSource } from "../../3d-style/source/replacement_source" ;
76- import type Painter from '../render/painter' ;
7776import type SymbolStyleLayer from '../style/style_layer/symbol_style_layer' ;
7877import type {
7978 ColorThemeSpecification ,
@@ -341,7 +340,6 @@ class Style extends Evented<MapEvents> {
341340 _rtlTextPluginCallback : ( state : { pluginStatus : string ; pluginURL : string | null | undefined } ) => void ;
342341 _changes : StyleChanges ;
343342 _optionsChanged : boolean ;
344- _layerOrderChanged : boolean ;
345343 _availableImages : ImageId [ ] ;
346344 _availableModels : StyleModelMap ;
347345 _markersNeedUpdate : boolean ;
@@ -2717,7 +2715,7 @@ class Style extends Evented<MapEvents> {
27172715 }
27182716
27192717 this . _order . splice ( index , 0 , id ) ;
2720- this . _layerOrderChanged = true ;
2718+ this . _handleLayerOrderChange ( ) ;
27212719 this . _layers [ id ] = layer ;
27222720
27232721 const sourceCache = this . getOwnLayerSourceCache ( layer ) ;
@@ -2794,7 +2792,7 @@ class Style extends Evented<MapEvents> {
27942792 this . _order . splice ( newIndex , 0 , id ) ;
27952793
27962794 this . _changes . setDirty ( ) ;
2797- this . _layerOrderChanged = true ;
2795+ this . _handleLayerOrderChange ( ) ;
27982796
27992797 this . mergeLayers ( ) ;
28002798 }
@@ -2821,7 +2819,7 @@ class Style extends Evented<MapEvents> {
28212819 delete this . _layers [ id ] ;
28222820
28232821 this . _changes . setDirty ( ) ;
2824- this . _layerOrderChanged = true ;
2822+ this . _handleLayerOrderChange ( ) ;
28252823
28262824 this . _configDependentLayers . delete ( layer . fqid ) ;
28272825 this . _indoorDependentLayers . delete ( layer . fqid ) ;
@@ -4117,17 +4115,40 @@ class Style extends Evented<MapEvents> {
41174115 }
41184116 }
41194117
4118+ _handleLayerOrderChange ( ) {
4119+ this . _requestFullLabelPlacement ( ) ;
4120+ this . fire ( new Event ( 'neworder' ) ) ;
4121+ }
4122+
4123+ _requestFullLabelPlacement ( ) {
4124+ if ( ! this . pauseablePlacement ) {
4125+ this . pauseablePlacement = new PauseablePlacement ( ) ;
4126+ }
4127+
4128+ // Anything that changes our "in progress" layer and tile indices requires us
4129+ // to start over. When we start over, we do a full placement instead of incremental
4130+ // to prevent starvation.
4131+ // We need to restart placement to keep layer indices in sync.
4132+ this . pauseablePlacement . requestFullPlacement ( ) ;
4133+ }
4134+
4135+ _setLabelPlacementStale ( ) {
4136+ if ( this . placement ) {
4137+ this . placement . setStale ( ) ;
4138+ }
4139+ }
4140+
41204141 _updatePlacement (
4121- painter : Painter ,
41224142 transform : Transform ,
41234143 showCollisionBoxes : boolean ,
41244144 fadeDuration : number ,
41254145 crossSourceCollisions : boolean ,
41264146 replacementSource : ReplacementSource ,
4127- forceFullPlacement : boolean = false ,
4128- ) : {
4129- needsRerender : boolean ;
4130- } {
4147+ ) : boolean {
4148+ if ( ! this . pauseablePlacement ) {
4149+ this . pauseablePlacement = new PauseablePlacement ( ) ;
4150+ }
4151+
41314152 let symbolBucketsChanged = false ;
41324153 let placementCommitted = false ;
41334154
@@ -4156,16 +4177,6 @@ class Style extends Evented<MapEvents> {
41564177 }
41574178 this . crossTileSymbolIndex . pruneUnusedLayers ( this . _mergedOrder ) ;
41584179
4159- // Anything that changes our "in progress" layer and tile indices requires us
4160- // to start over. When we start over, we do a full placement instead of incremental
4161- // to prevent starvation.
4162- // We need to restart placement to keep layer indices in sync.
4163- forceFullPlacement = forceFullPlacement || this . _layerOrderChanged ;
4164-
4165- if ( this . _layerOrderChanged ) {
4166- this . fire ( new Event ( 'neworder' ) ) ;
4167- }
4168-
41694180 const transformChanged = Boolean ( this . placement && ! transform . equals ( this . placement . transform ) ) ;
41704181 const replacementSourceChanged = Boolean ( this . placement && ( ( this . placement . lastReplacementSourceUpdateTime !== 0 && ! replacementSource ) || this . placement . lastReplacementSourceUpdateTime !== replacementSource . updateTime ) ) ;
41714182
@@ -4175,19 +4186,12 @@ class Style extends Evented<MapEvents> {
41754186 // we will do expensive full placements on every frame.
41764187 const fullFrameUpdateRequired = ( transformChanged || replacementSourceChanged || symbolBucketsChanged || ( this . placement && this . placement . isStale ( ) ) ) && fadeDuration === 0 ;
41774188
4178- if ( forceFullPlacement || ! this . pauseablePlacement || fullFrameUpdateRequired || ( fadeDuration !== 0 && this . pauseablePlacement . isDone ( ) && ! this . placement . stillRecent ( browser . now ( ) , transform . zoom ) ) ) {
4189+ if ( this . pauseablePlacement . isFullPlacementRequested ( ) || ! this . pauseablePlacement . placement || fullFrameUpdateRequired || ( fadeDuration !== 0 && this . pauseablePlacement . isDone ( ) && ! this . placement . stillRecent ( browser . now ( ) , transform . zoom ) ) ) {
41794190 const fogState = this . fog && transform . projection . supportsFog ? this . fog . state : null ;
4180- this . pauseablePlacement = new PauseablePlacement ( transform , this . _mergedOrder , forceFullPlacement || fadeDuration === 0 , showCollisionBoxes , fadeDuration , crossSourceCollisions , this . placement , fogState , this . _buildingIndex ) ;
4181- this . _layerOrderChanged = false ;
4191+ this . pauseablePlacement = this . pauseablePlacement . startNewPlacement ( transform , this . _mergedOrder , showCollisionBoxes , fadeDuration , crossSourceCollisions , this . placement , fogState , this . _buildingIndex ) ;
41824192 }
41834193
4184- if ( this . pauseablePlacement . isDone ( ) ) {
4185- // the last placement finished running, but the next one hasn’t
4186- // started yet because of the `stillRecent` check immediately
4187- // above, so mark it stale to ensure that we request another
4188- // render frame
4189- this . placement . setStale ( ) ;
4190- } else {
4194+ if ( ! this . pauseablePlacement . isDone ( ) ) {
41914195 this . pauseablePlacement . continuePlacement ( this . _mergedOrder , this . _mergedLayers , layerTiles , layerTilesInYOrder , this . map . painter . scaleFactor ) ;
41924196
41934197 if ( this . pauseablePlacement . isDone ( ) ) {
@@ -4216,8 +4220,7 @@ class Style extends Evented<MapEvents> {
42164220 }
42174221
42184222 // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols
4219- const needsRerender = ! this . pauseablePlacement . isDone ( ) || this . placement . hasTransitions ( browser . now ( ) ) ;
4220- return { needsRerender} ;
4223+ return ! this . pauseablePlacement . isDone ( ) || this . placement . isStale ( ) || this . placement . hasTransitions ( browser . now ( ) ) ;
42214224 }
42224225
42234226 _releaseSymbolFadeTiles ( ) {
0 commit comments