in modules/aggregation-layers/src/screen-grid-layer/screen-grid-layer.js [167:227]
updateAggregationState(opts) {
const cellSize = opts.props.cellSizePixels;
const cellSizeChanged = opts.oldProps.cellSizePixels !== cellSize;
const {viewportChanged} = opts.changeFlags;
let gpuAggregation = opts.props.gpuAggregation;
if (this.state.gpuAggregation !== opts.props.gpuAggregation) {
if (gpuAggregation && !GPUGridAggregator.isSupported(this.context.gl)) {
log.warn('GPU Grid Aggregation not supported, falling back to CPU')();
gpuAggregation = false;
}
}
const gpuAggregationChanged = gpuAggregation !== this.state.gpuAggregation;
this.setState({
gpuAggregation
});
const positionsChanged = this.isAttributeChanged(POSITION_ATTRIBUTE_NAME);
const {dimensions} = this.state;
const {data, weights} = dimensions;
const aggregationDataDirty =
positionsChanged ||
gpuAggregationChanged ||
viewportChanged ||
this.isAggregationDirty(opts, {
compareAll: gpuAggregation, // check for all (including extentions props) when using gpu aggregation
dimension: data
});
const aggregationWeightsDirty = this.isAggregationDirty(opts, {dimension: weights});
this.setState({
aggregationDataDirty,
aggregationWeightsDirty
});
const {viewport} = this.context;
if (viewportChanged || cellSizeChanged) {
const {width, height} = viewport;
const numCol = Math.ceil(width / cellSize);
const numRow = Math.ceil(height / cellSize);
this.allocateResources(numRow, numCol);
this.setState({
// transformation from clipspace to screen(pixel) space
scaling: [width / 2, -height / 2, 1],
gridOffset: {xOffset: cellSize, yOffset: cellSize},
width,
height,
numCol,
numRow
});
}
if (aggregationWeightsDirty) {
this._updateAccessors(opts);
}
if (aggregationDataDirty || aggregationWeightsDirty) {
this._resetResults();
}
}