in modules/layers/src/icon-layer/icon-layer.js [127:177]
updateState({oldProps, props, changeFlags}) {
super.updateState({props, oldProps, changeFlags});
const attributeManager = this.getAttributeManager();
const {iconAtlas, iconMapping, data, getIcon} = props;
const {iconManager} = this.state;
iconManager.setProps({loadOptions: props.loadOptions});
let iconMappingChanged = false;
const prePacked = iconAtlas || this.internalState.isAsyncPropLoading('iconAtlas');
// prepacked iconAtlas from user
if (prePacked) {
if (oldProps.iconAtlas !== props.iconAtlas) {
iconManager.setProps({iconAtlas, autoPacking: false});
}
if (oldProps.iconMapping !== props.iconMapping) {
iconManager.setProps({iconMapping});
iconMappingChanged = true;
}
} else {
// otherwise, use autoPacking
iconManager.setProps({autoPacking: true});
}
if (
changeFlags.dataChanged ||
(changeFlags.updateTriggersChanged &&
(changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getIcon))
) {
iconManager.setProps({data, getIcon});
iconMappingChanged = true;
}
if (iconMappingChanged) {
attributeManager.invalidate('instanceOffsets');
attributeManager.invalidate('instanceIconFrames');
attributeManager.invalidate('instanceColorModes');
}
if (changeFlags.extensionsChanged) {
const {gl} = this.context;
if (this.state.model) {
this.state.model.delete();
}
this.setState({model: this._getModel(gl)});
attributeManager.invalidateAll();
}
}