@deck.gl/aggregation-layers 8.5.5 → 8.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dist.dev.js +33 -17
- package/dist/es5/heatmap-layer/heatmap-layer.js +42 -16
- package/dist/es5/heatmap-layer/heatmap-layer.js.map +1 -1
- package/dist/esm/heatmap-layer/heatmap-layer.js +42 -14
- package/dist/esm/heatmap-layer/heatmap-layer.js.map +1 -1
- package/dist.min.js +1 -1
- package/package.json +2 -2
- package/src/heatmap-layer/heatmap-layer.js +34 -23
package/dist/dist.dev.js
CHANGED
|
@@ -15358,8 +15358,6 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
15358
15358
|
|
|
15359
15359
|
|
|
15360
15360
|
const RESOLUTION = 2; // (number of common space pixels) / (number texels)
|
|
15361
|
-
const SIZE_2K = 2048;
|
|
15362
|
-
const ZOOM_DEBOUNCE = 500; // milliseconds
|
|
15363
15361
|
const TEXTURE_OPTIONS = {
|
|
15364
15362
|
mipmaps: false,
|
|
15365
15363
|
parameters: {
|
|
@@ -15385,7 +15383,9 @@ const defaultProps = {
|
|
|
15385
15383
|
threshold: {type: 'number', min: 0, max: 1, value: 0.05},
|
|
15386
15384
|
colorDomain: {type: 'array', value: null, optional: true},
|
|
15387
15385
|
// 'SUM' or 'MEAN'
|
|
15388
|
-
aggregation: 'SUM'
|
|
15386
|
+
aggregation: 'SUM',
|
|
15387
|
+
weightsTextureSize: {type: 'number', min: 128, max: 2048, value: 2048},
|
|
15388
|
+
debounceTimeout: {type: 'number', min: 0, max: 1000, value: 500}
|
|
15389
15389
|
};
|
|
15390
15390
|
|
|
15391
15391
|
const REQUIRED_FEATURES = [
|
|
@@ -15426,6 +15426,10 @@ class HeatmapLayer extends _aggregation_layer__WEBPACK_IMPORTED_MODULE_5__["defa
|
|
|
15426
15426
|
return;
|
|
15427
15427
|
}
|
|
15428
15428
|
super.updateState(opts);
|
|
15429
|
+
this._updateHeatmapState(opts);
|
|
15430
|
+
}
|
|
15431
|
+
|
|
15432
|
+
_updateHeatmapState(opts) {
|
|
15429
15433
|
const {props, oldProps} = opts;
|
|
15430
15434
|
const changeFlags = this._getChangeFlags(opts);
|
|
15431
15435
|
|
|
@@ -15453,7 +15457,6 @@ class HeatmapLayer extends _aggregation_layer__WEBPACK_IMPORTED_MODULE_5__["defa
|
|
|
15453
15457
|
|
|
15454
15458
|
this.setState({zoom: opts.context.viewport.zoom});
|
|
15455
15459
|
}
|
|
15456
|
-
/* eslint-enable max-statements,complexity */
|
|
15457
15460
|
|
|
15458
15461
|
renderLayers() {
|
|
15459
15462
|
if (!this.state.supported) {
|
|
@@ -15576,7 +15579,9 @@ class HeatmapLayer extends _aggregation_layer__WEBPACK_IMPORTED_MODULE_5__["defa
|
|
|
15576
15579
|
|
|
15577
15580
|
_setupTextureParams() {
|
|
15578
15581
|
const {gl} = this.context;
|
|
15579
|
-
const
|
|
15582
|
+
const {weightsTextureSize} = this.props;
|
|
15583
|
+
|
|
15584
|
+
const textureSize = Math.min(weightsTextureSize, Object(_luma_gl_core__WEBPACK_IMPORTED_MODULE_2__["getParameters"])(gl, gl.MAX_TEXTURE_SIZE));
|
|
15580
15585
|
const floatTargetSupport = Object(_luma_gl_core__WEBPACK_IMPORTED_MODULE_2__["hasFeatures"])(gl, _luma_gl_core__WEBPACK_IMPORTED_MODULE_2__["FEATURES"].COLOR_ATTACHMENT_RGBA32F);
|
|
15581
15586
|
const {format, type} = Object(_heatmap_layer_utils__WEBPACK_IMPORTED_MODULE_1__["getTextureParams"])({gl, floatTargetSupport});
|
|
15582
15587
|
const weightsScale = floatTargetSupport ? 1 : 1 / 255;
|
|
@@ -15590,18 +15595,25 @@ class HeatmapLayer extends _aggregation_layer__WEBPACK_IMPORTED_MODULE_5__["defa
|
|
|
15590
15595
|
}
|
|
15591
15596
|
}
|
|
15592
15597
|
|
|
15593
|
-
|
|
15598
|
+
getShaders(type) {
|
|
15599
|
+
return super.getShaders(
|
|
15600
|
+
type === 'max-weights-transform'
|
|
15601
|
+
? {
|
|
15602
|
+
vs: _max_vs_glsl__WEBPACK_IMPORTED_MODULE_9__["default"],
|
|
15603
|
+
_fs: _max_fs_glsl__WEBPACK_IMPORTED_MODULE_10__["default"]
|
|
15604
|
+
}
|
|
15605
|
+
: {
|
|
15606
|
+
vs: _weights_vs_glsl__WEBPACK_IMPORTED_MODULE_7__["default"],
|
|
15607
|
+
_fs: _weights_fs_glsl__WEBPACK_IMPORTED_MODULE_8__["default"]
|
|
15608
|
+
}
|
|
15609
|
+
);
|
|
15610
|
+
}
|
|
15611
|
+
|
|
15612
|
+
_createWeightsTransform(shaders = {}) {
|
|
15594
15613
|
const {gl} = this.context;
|
|
15595
15614
|
let {weightsTransform} = this.state;
|
|
15596
15615
|
const {weightsTexture} = this.state;
|
|
15597
15616
|
weightsTransform?.delete();
|
|
15598
|
-
const shaders = Object(_deck_gl_core__WEBPACK_IMPORTED_MODULE_3__["_mergeShaders"])(
|
|
15599
|
-
{
|
|
15600
|
-
vs: _weights_vs_glsl__WEBPACK_IMPORTED_MODULE_7__["default"],
|
|
15601
|
-
_fs: _weights_fs_glsl__WEBPACK_IMPORTED_MODULE_8__["default"]
|
|
15602
|
-
},
|
|
15603
|
-
shaderOptions
|
|
15604
|
-
);
|
|
15605
15617
|
|
|
15606
15618
|
weightsTransform = new _luma_gl_core__WEBPACK_IMPORTED_MODULE_2__["Transform"](gl, {
|
|
15607
15619
|
id: `${this.id}-weights-transform`,
|
|
@@ -15617,7 +15629,11 @@ class HeatmapLayer extends _aggregation_layer__WEBPACK_IMPORTED_MODULE_5__["defa
|
|
|
15617
15629
|
const {gl} = this.context;
|
|
15618
15630
|
this._createTextures();
|
|
15619
15631
|
const {textureSize, weightsTexture, maxWeightsTexture} = this.state;
|
|
15620
|
-
|
|
15632
|
+
|
|
15633
|
+
const weightsTransformShaders = this.getShaders('weights-transform');
|
|
15634
|
+
this._createWeightsTransform(weightsTransformShaders);
|
|
15635
|
+
|
|
15636
|
+
const maxWeightsTransformShaders = this.getShaders('max-weights-transform');
|
|
15621
15637
|
const maxWeightTransform = new _luma_gl_core__WEBPACK_IMPORTED_MODULE_2__["Transform"](gl, {
|
|
15622
15638
|
id: `${this.id}-max-weights-transform`,
|
|
15623
15639
|
_sourceTextures: {
|
|
@@ -15625,8 +15641,7 @@ class HeatmapLayer extends _aggregation_layer__WEBPACK_IMPORTED_MODULE_5__["defa
|
|
|
15625
15641
|
},
|
|
15626
15642
|
_targetTexture: maxWeightsTexture,
|
|
15627
15643
|
_targetTextureVarying: 'outTexture',
|
|
15628
|
-
|
|
15629
|
-
_fs: _max_fs_glsl__WEBPACK_IMPORTED_MODULE_10__["default"],
|
|
15644
|
+
...maxWeightsTransformShaders,
|
|
15630
15645
|
elementCount: textureSize * textureSize
|
|
15631
15646
|
});
|
|
15632
15647
|
|
|
@@ -15810,6 +15825,7 @@ class HeatmapLayer extends _aggregation_layer__WEBPACK_IMPORTED_MODULE_5__["defa
|
|
|
15810
15825
|
|
|
15811
15826
|
_debouncedUpdateWeightmap(fromTimer = false) {
|
|
15812
15827
|
let {updateTimer} = this.state;
|
|
15828
|
+
const {debounceTimeout} = this.props;
|
|
15813
15829
|
|
|
15814
15830
|
if (fromTimer) {
|
|
15815
15831
|
updateTimer = null;
|
|
@@ -15820,7 +15836,7 @@ class HeatmapLayer extends _aggregation_layer__WEBPACK_IMPORTED_MODULE_5__["defa
|
|
|
15820
15836
|
} else {
|
|
15821
15837
|
this.setState({isWeightMapDirty: false});
|
|
15822
15838
|
clearTimeout(updateTimer);
|
|
15823
|
-
updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true),
|
|
15839
|
+
updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true), debounceTimeout);
|
|
15824
15840
|
}
|
|
15825
15841
|
|
|
15826
15842
|
this.setState({updateTimer});
|
|
@@ -54,8 +54,6 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
|
|
|
54
54
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
|
|
55
55
|
|
|
56
56
|
var RESOLUTION = 2;
|
|
57
|
-
var SIZE_2K = 2048;
|
|
58
|
-
var ZOOM_DEBOUNCE = 500;
|
|
59
57
|
var TEXTURE_OPTIONS = {
|
|
60
58
|
mipmaps: false,
|
|
61
59
|
parameters: (_parameters = {}, (0, _defineProperty2.default)(_parameters, 10240, 9729), (0, _defineProperty2.default)(_parameters, 10241, 9729), (0, _defineProperty2.default)(_parameters, 10242, 33071), (0, _defineProperty2.default)(_parameters, 10243, 33071), _parameters),
|
|
@@ -100,7 +98,19 @@ var defaultProps = {
|
|
|
100
98
|
value: null,
|
|
101
99
|
optional: true
|
|
102
100
|
},
|
|
103
|
-
aggregation: 'SUM'
|
|
101
|
+
aggregation: 'SUM',
|
|
102
|
+
weightsTextureSize: {
|
|
103
|
+
type: 'number',
|
|
104
|
+
min: 128,
|
|
105
|
+
max: 2048,
|
|
106
|
+
value: 2048
|
|
107
|
+
},
|
|
108
|
+
debounceTimeout: {
|
|
109
|
+
type: 'number',
|
|
110
|
+
min: 0,
|
|
111
|
+
max: 1000,
|
|
112
|
+
value: 500
|
|
113
|
+
}
|
|
104
114
|
};
|
|
105
115
|
var REQUIRED_FEATURES = [_core.FEATURES.BLEND_EQUATION_MINMAX, _core.FEATURES.TEXTURE_FLOAT];
|
|
106
116
|
var DIMENSIONS = {
|
|
@@ -160,6 +170,12 @@ var HeatmapLayer = function (_AggregationLayer) {
|
|
|
160
170
|
}
|
|
161
171
|
|
|
162
172
|
(0, _get2.default)((0, _getPrototypeOf2.default)(HeatmapLayer.prototype), "updateState", this).call(this, opts);
|
|
173
|
+
|
|
174
|
+
this._updateHeatmapState(opts);
|
|
175
|
+
}
|
|
176
|
+
}, {
|
|
177
|
+
key: "_updateHeatmapState",
|
|
178
|
+
value: function _updateHeatmapState(opts) {
|
|
163
179
|
var props = opts.props,
|
|
164
180
|
oldProps = opts.oldProps;
|
|
165
181
|
|
|
@@ -325,7 +341,8 @@ var HeatmapLayer = function (_AggregationLayer) {
|
|
|
325
341
|
key: "_setupTextureParams",
|
|
326
342
|
value: function _setupTextureParams() {
|
|
327
343
|
var gl = this.context.gl;
|
|
328
|
-
var
|
|
344
|
+
var weightsTextureSize = this.props.weightsTextureSize;
|
|
345
|
+
var textureSize = Math.min(weightsTextureSize, (0, _core.getParameters)(gl, 3379));
|
|
329
346
|
var floatTargetSupport = (0, _core.hasFeatures)(gl, _core.FEATURES.COLOR_ATTACHMENT_RGBA32F);
|
|
330
347
|
|
|
331
348
|
var _getTextureParams = (0, _heatmapLayerUtils.getTextureParams)({
|
|
@@ -347,20 +364,27 @@ var HeatmapLayer = function (_AggregationLayer) {
|
|
|
347
364
|
_core2.log.warn("HeatmapLayer: ".concat(this.id, " rendering to float texture not supported, fallingback to low precession format"))();
|
|
348
365
|
}
|
|
349
366
|
}
|
|
367
|
+
}, {
|
|
368
|
+
key: "getShaders",
|
|
369
|
+
value: function getShaders(type) {
|
|
370
|
+
return (0, _get2.default)((0, _getPrototypeOf2.default)(HeatmapLayer.prototype), "getShaders", this).call(this, type === 'max-weights-transform' ? {
|
|
371
|
+
vs: _maxVs.default,
|
|
372
|
+
_fs: _maxFs.default
|
|
373
|
+
} : {
|
|
374
|
+
vs: _weightsVs.default,
|
|
375
|
+
_fs: _weightsFs.default
|
|
376
|
+
});
|
|
377
|
+
}
|
|
350
378
|
}, {
|
|
351
379
|
key: "_createWeightsTransform",
|
|
352
380
|
value: function _createWeightsTransform() {
|
|
353
381
|
var _weightsTransform;
|
|
354
382
|
|
|
355
|
-
var
|
|
383
|
+
var shaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
356
384
|
var gl = this.context.gl;
|
|
357
385
|
var weightsTransform = this.state.weightsTransform;
|
|
358
386
|
var weightsTexture = this.state.weightsTexture;
|
|
359
387
|
(_weightsTransform = weightsTransform) === null || _weightsTransform === void 0 ? void 0 : _weightsTransform.delete();
|
|
360
|
-
var shaders = (0, _core2._mergeShaders)({
|
|
361
|
-
vs: _weightsVs.default,
|
|
362
|
-
_fs: _weightsFs.default
|
|
363
|
-
}, shaderOptions);
|
|
364
388
|
weightsTransform = new _core.Transform(gl, _objectSpread({
|
|
365
389
|
id: "".concat(this.id, "-weights-transform"),
|
|
366
390
|
elementCount: 1,
|
|
@@ -382,20 +406,21 @@ var HeatmapLayer = function (_AggregationLayer) {
|
|
|
382
406
|
textureSize = _this$state4.textureSize,
|
|
383
407
|
weightsTexture = _this$state4.weightsTexture,
|
|
384
408
|
maxWeightsTexture = _this$state4.maxWeightsTexture;
|
|
409
|
+
var weightsTransformShaders = this.getShaders('weights-transform');
|
|
385
410
|
|
|
386
|
-
this._createWeightsTransform();
|
|
411
|
+
this._createWeightsTransform(weightsTransformShaders);
|
|
387
412
|
|
|
388
|
-
var
|
|
413
|
+
var maxWeightsTransformShaders = this.getShaders('max-weights-transform');
|
|
414
|
+
var maxWeightTransform = new _core.Transform(gl, _objectSpread(_objectSpread({
|
|
389
415
|
id: "".concat(this.id, "-max-weights-transform"),
|
|
390
416
|
_sourceTextures: {
|
|
391
417
|
inTexture: weightsTexture
|
|
392
418
|
},
|
|
393
419
|
_targetTexture: maxWeightsTexture,
|
|
394
|
-
_targetTextureVarying: 'outTexture'
|
|
395
|
-
|
|
396
|
-
_fs: _maxFs.default,
|
|
420
|
+
_targetTextureVarying: 'outTexture'
|
|
421
|
+
}, maxWeightsTransformShaders), {}, {
|
|
397
422
|
elementCount: textureSize * textureSize
|
|
398
|
-
});
|
|
423
|
+
}));
|
|
399
424
|
this.setState({
|
|
400
425
|
weightsTexture: weightsTexture,
|
|
401
426
|
maxWeightsTexture: maxWeightsTexture,
|
|
@@ -571,6 +596,7 @@ var HeatmapLayer = function (_AggregationLayer) {
|
|
|
571
596
|
value: function _debouncedUpdateWeightmap() {
|
|
572
597
|
var fromTimer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
573
598
|
var updateTimer = this.state.updateTimer;
|
|
599
|
+
var debounceTimeout = this.props.debounceTimeout;
|
|
574
600
|
|
|
575
601
|
if (fromTimer) {
|
|
576
602
|
updateTimer = null;
|
|
@@ -587,7 +613,7 @@ var HeatmapLayer = function (_AggregationLayer) {
|
|
|
587
613
|
isWeightMapDirty: false
|
|
588
614
|
});
|
|
589
615
|
clearTimeout(updateTimer);
|
|
590
|
-
updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true),
|
|
616
|
+
updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true), debounceTimeout);
|
|
591
617
|
}
|
|
592
618
|
|
|
593
619
|
this.setState({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/heatmap-layer/heatmap-layer.js"],"names":["RESOLUTION","SIZE_2K","ZOOM_DEBOUNCE","TEXTURE_OPTIONS","mipmaps","parameters","dataFormat","DEFAULT_COLOR_DOMAIN","AGGREGATION_MODE","SUM","MEAN","defaultProps","getPosition","type","value","x","position","getWeight","intensity","min","radiusPixels","max","colorRange","defaultColorRange","threshold","colorDomain","optional","aggregation","REQUIRED_FEATURES","FEATURES","BLEND_EQUATION_MINMAX","TEXTURE_FLOAT","DIMENSIONS","data","props","HeatmapLayer","gl","context","setState","supported","log","error","id","_setupTextureParams","_setupAttributes","_setupResources","changeFlags","somethingChanged","opts","state","oldProps","_getChangeFlags","viewportChanged","boundsChanged","_updateBounds","_updateTextureRenderingBounds","dataChanged","clearTimeout","updateTimer","isWeightMapDirty","viewportZoomChanged","_debouncedUpdateWeightmap","_updateColorTexture","_updateWeightmap","zoom","viewport","weightsTexture","triPositionBuffer","triTexCoordBuffer","maxWeightsTexture","colorTexture","updateTriggers","TriangleLayerClass","getSubLayerClass","TriangleLayer","getSubLayerProps","coordinateSystem","COORDINATE_SYSTEM","DEFAULT","attributes","positions","texCoords","vertexCount","maxTexture","aggregationMode","texture","weightsTransform","maxWeightTransform","delete","AttributeManager","stats","dimensions","isAttributeChanged","isAggregationDirty","compareAll","dimension","textureSize","format","Texture2D","width","height","attributeManager","getAttributeManager","add","size","accessor","weights","positionAttributeName","Math","floatTargetSupport","COLOR_ATTACHMENT_RGBA32F","weightsScale","warn","shaderOptions","shaders","vs","weights_vs","_fs","weights_fs","Transform","elementCount","_targetTexture","_targetTextureVarying","_createTextures","_createWeightsTransform","_sourceTextures","inTexture","vs_max","fs_max","Buffer","byteLength","run","blend","depthTest","blendFunc","blendEquation","forceUpdate","viewportCorners","unproject","map","p","fround","visibleWorldBounds","newState","worldBounds","scaledCommonBounds","_worldToCommonBounds","_commonToWorldBounds","LNGLAT","normalizedCommonBounds","subData","textureBounds","projectPosition","colors","Uint8Array","setImageData","length","commonBounds","useLayerCoordinateSystem","metersPerPixel","distanceScales","metersPerUnit","uniforms","textureWidth","update","getNumInstances","clearRenderTarget","getAttributes","moduleSettings","getModuleSettings","_updateMaxWeightValue","setParameters","fromTimer","setTimeout","bind","minLong","minLat","maxLong","maxLat","offsetMode","LNGLAT_OFFSETS","METER_OFFSETS","offsetOriginCommon","coordinateOrigin","scale","bottomLeftCommon","topRightCommon","xMin","yMin","xMax","yMax","bottomLeftWorld","unprojectPosition","topRightWorld","slice","concat","AggregationLayer","layerName"],"mappings":"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","sourcesContent":["// Copyright (c) 2015 - 2019 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* global setTimeout clearTimeout */\nimport GL from '@luma.gl/constants';\nimport {\n getBounds,\n boundsContain,\n packVertices,\n scaleToAspectRatio,\n getTextureCoordinates,\n getTextureParams\n} from './heatmap-layer-utils';\nimport {Buffer, Texture2D, Transform, getParameters, FEATURES, hasFeatures} from '@luma.gl/core';\nimport {\n AttributeManager,\n COORDINATE_SYSTEM,\n log,\n _mergeShaders as mergeShaders\n} from '@deck.gl/core';\nimport TriangleLayer from './triangle-layer';\nimport AggregationLayer from '../aggregation-layer';\nimport {defaultColorRange, colorRangeToFlatArray} from '../utils/color-utils';\nimport weights_vs from './weights-vs.glsl';\nimport weights_fs from './weights-fs.glsl';\nimport vs_max from './max-vs.glsl';\nimport fs_max from './max-fs.glsl';\n\nconst RESOLUTION = 2; // (number of common space pixels) / (number texels)\nconst SIZE_2K = 2048;\nconst ZOOM_DEBOUNCE = 500; // milliseconds\nconst TEXTURE_OPTIONS = {\n mipmaps: false,\n parameters: {\n [GL.TEXTURE_MAG_FILTER]: GL.LINEAR,\n [GL.TEXTURE_MIN_FILTER]: GL.LINEAR,\n [GL.TEXTURE_WRAP_S]: GL.CLAMP_TO_EDGE,\n [GL.TEXTURE_WRAP_T]: GL.CLAMP_TO_EDGE\n },\n dataFormat: GL.RGBA\n};\nconst DEFAULT_COLOR_DOMAIN = [0, 0];\nconst AGGREGATION_MODE = {\n SUM: 0,\n MEAN: 1\n};\n\nconst defaultProps = {\n getPosition: {type: 'accessor', value: x => x.position},\n getWeight: {type: 'accessor', value: 1},\n intensity: {type: 'number', min: 0, value: 1},\n radiusPixels: {type: 'number', min: 1, max: 100, value: 50},\n colorRange: defaultColorRange,\n threshold: {type: 'number', min: 0, max: 1, value: 0.05},\n colorDomain: {type: 'array', value: null, optional: true},\n // 'SUM' or 'MEAN'\n aggregation: 'SUM'\n};\n\nconst REQUIRED_FEATURES = [\n FEATURES.BLEND_EQUATION_MINMAX, // max weight calculation\n FEATURES.TEXTURE_FLOAT // weight-map as texture\n // FEATURES.FLOAT_BLEND, // implictly supported when TEXTURE_FLOAT is supported\n];\n\nconst DIMENSIONS = {\n data: {\n props: ['radiusPixels']\n }\n};\n\nexport default class HeatmapLayer extends AggregationLayer {\n initializeState() {\n const {gl} = this.context;\n if (!hasFeatures(gl, REQUIRED_FEATURES)) {\n this.setState({supported: false});\n log.error(`HeatmapLayer: ${this.id} is not supported on this browser`)();\n return;\n }\n super.initializeState(DIMENSIONS);\n this.setState({supported: true, colorDomain: DEFAULT_COLOR_DOMAIN});\n this._setupTextureParams();\n this._setupAttributes();\n this._setupResources();\n }\n\n shouldUpdateState({changeFlags}) {\n // Need to be updated when viewport changes\n return changeFlags.somethingChanged;\n }\n\n /* eslint-disable max-statements,complexity */\n updateState(opts) {\n if (!this.state.supported) {\n return;\n }\n super.updateState(opts);\n const {props, oldProps} = opts;\n const changeFlags = this._getChangeFlags(opts);\n\n if (changeFlags.viewportChanged) {\n changeFlags.boundsChanged = this._updateBounds();\n this._updateTextureRenderingBounds();\n }\n\n if (changeFlags.dataChanged || changeFlags.boundsChanged) {\n // Update weight map immediately\n clearTimeout(this.state.updateTimer);\n this.setState({isWeightMapDirty: true});\n } else if (changeFlags.viewportZoomChanged) {\n // Update weight map when zoom stops\n this._debouncedUpdateWeightmap();\n }\n\n if (props.colorRange !== oldProps.colorRange) {\n this._updateColorTexture(opts);\n }\n\n if (this.state.isWeightMapDirty) {\n this._updateWeightmap();\n }\n\n this.setState({zoom: opts.context.viewport.zoom});\n }\n /* eslint-enable max-statements,complexity */\n\n renderLayers() {\n if (!this.state.supported) {\n return [];\n }\n const {\n weightsTexture,\n triPositionBuffer,\n triTexCoordBuffer,\n maxWeightsTexture,\n colorTexture,\n colorDomain\n } = this.state;\n const {updateTriggers, intensity, threshold, aggregation} = this.props;\n\n const TriangleLayerClass = this.getSubLayerClass('triangle', TriangleLayer);\n\n return new TriangleLayerClass(\n this.getSubLayerProps({\n id: 'triangle-layer',\n updateTriggers\n }),\n {\n // position buffer is filled with world coordinates generated from viewport.unproject\n // i.e. LNGLAT if geospatial, CARTESIAN otherwise\n coordinateSystem: COORDINATE_SYSTEM.DEFAULT,\n data: {\n attributes: {\n positions: triPositionBuffer,\n texCoords: triTexCoordBuffer\n }\n },\n vertexCount: 4,\n maxTexture: maxWeightsTexture,\n colorTexture,\n aggregationMode: AGGREGATION_MODE[aggregation] || 0,\n texture: weightsTexture,\n intensity,\n threshold,\n colorDomain\n }\n );\n }\n\n finalizeState() {\n super.finalizeState();\n const {\n weightsTransform,\n weightsTexture,\n maxWeightTransform,\n maxWeightsTexture,\n triPositionBuffer,\n triTexCoordBuffer,\n colorTexture,\n updateTimer\n } = this.state;\n weightsTransform?.delete();\n weightsTexture?.delete();\n maxWeightTransform?.delete();\n maxWeightsTexture?.delete();\n triPositionBuffer?.delete();\n triTexCoordBuffer?.delete();\n colorTexture?.delete();\n updateTimer && clearTimeout(updateTimer);\n }\n\n // PRIVATE\n\n // override Composite layer private method to create AttributeManager instance\n _getAttributeManager() {\n return new AttributeManager(this.context.gl, {\n id: this.props.id,\n stats: this.context.stats\n });\n }\n\n _getChangeFlags(opts) {\n const changeFlags = {};\n const {dimensions} = this.state;\n changeFlags.dataChanged =\n this.isAttributeChanged() || // if any attribute is changed\n this.isAggregationDirty(opts, {\n compareAll: true,\n dimension: dimensions.data\n });\n changeFlags.viewportChanged = opts.changeFlags.viewportChanged;\n\n const {zoom} = this.state;\n if (!opts.context.viewport || opts.context.viewport.zoom !== zoom) {\n changeFlags.viewportZoomChanged = true;\n }\n\n return changeFlags;\n }\n\n _createTextures() {\n const {gl} = this.context;\n const {textureSize, format, type} = this.state;\n\n this.setState({\n weightsTexture: new Texture2D(gl, {\n width: textureSize,\n height: textureSize,\n format,\n type,\n ...TEXTURE_OPTIONS\n }),\n maxWeightsTexture: new Texture2D(gl, {format, type, ...TEXTURE_OPTIONS}) // 1 X 1 texture,\n });\n }\n\n _setupAttributes() {\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: {size: 3, type: GL.DOUBLE, accessor: 'getPosition'},\n weights: {size: 1, accessor: 'getWeight'}\n });\n this.setState({positionAttributeName: 'positions'});\n }\n\n _setupTextureParams() {\n const {gl} = this.context;\n const textureSize = Math.min(SIZE_2K, getParameters(gl, gl.MAX_TEXTURE_SIZE));\n const floatTargetSupport = hasFeatures(gl, FEATURES.COLOR_ATTACHMENT_RGBA32F);\n const {format, type} = getTextureParams({gl, floatTargetSupport});\n const weightsScale = floatTargetSupport ? 1 : 1 / 255;\n this.setState({textureSize, format, type, weightsScale});\n if (!floatTargetSupport) {\n log.warn(\n `HeatmapLayer: ${\n this.id\n } rendering to float texture not supported, fallingback to low precession format`\n )();\n }\n }\n\n _createWeightsTransform(shaderOptions = {}) {\n const {gl} = this.context;\n let {weightsTransform} = this.state;\n const {weightsTexture} = this.state;\n weightsTransform?.delete();\n const shaders = mergeShaders(\n {\n vs: weights_vs,\n _fs: weights_fs\n },\n shaderOptions\n );\n\n weightsTransform = new Transform(gl, {\n id: `${this.id}-weights-transform`,\n elementCount: 1,\n _targetTexture: weightsTexture,\n _targetTextureVarying: 'weightsTexture',\n ...shaders\n });\n this.setState({weightsTransform});\n }\n\n _setupResources() {\n const {gl} = this.context;\n this._createTextures();\n const {textureSize, weightsTexture, maxWeightsTexture} = this.state;\n this._createWeightsTransform();\n const maxWeightTransform = new Transform(gl, {\n id: `${this.id}-max-weights-transform`,\n _sourceTextures: {\n inTexture: weightsTexture\n },\n _targetTexture: maxWeightsTexture,\n _targetTextureVarying: 'outTexture',\n vs: vs_max,\n _fs: fs_max,\n elementCount: textureSize * textureSize\n });\n\n this.setState({\n weightsTexture,\n maxWeightsTexture,\n maxWeightTransform,\n zoom: null,\n triPositionBuffer: new Buffer(gl, {\n byteLength: 48,\n accessor: {size: 3}\n }),\n triTexCoordBuffer: new Buffer(gl, {\n byteLength: 48,\n accessor: {size: 2}\n })\n });\n }\n\n // overwrite super class method to update transform model\n updateShaders(shaderOptions) {\n // sahder params (modules, injects) changed, update model object\n this._createWeightsTransform(shaderOptions);\n }\n\n _updateMaxWeightValue() {\n const {maxWeightTransform} = this.state;\n maxWeightTransform.run({\n parameters: {\n blend: true,\n depthTest: false,\n blendFunc: [GL.ONE, GL.ONE],\n blendEquation: GL.MAX\n }\n });\n }\n\n // Computes world bounds area that needs to be processed for generate heatmap\n _updateBounds(forceUpdate = false) {\n const {viewport} = this.context;\n\n // Unproject all 4 corners of the current screen coordinates into world coordinates (lng/lat)\n // Takes care of viewport has non zero bearing/pitch (i.e axis not aligned with world coordiante system)\n const viewportCorners = [\n viewport.unproject([0, 0]),\n viewport.unproject([viewport.width, 0]),\n viewport.unproject([viewport.width, viewport.height]),\n viewport.unproject([0, viewport.height])\n ].map(p => p.map(Math.fround));\n\n // #1: get world bounds for current viewport extends\n const visibleWorldBounds = getBounds(viewportCorners); // TODO: Change to visible bounds\n\n const newState = {visibleWorldBounds, viewportCorners};\n let boundsChanged = false;\n\n if (\n forceUpdate ||\n !this.state.worldBounds ||\n !boundsContain(this.state.worldBounds, visibleWorldBounds)\n ) {\n // #2 : convert world bounds to common (Flat) bounds\n // #3 : extend common bounds to match aspect ratio with viewport\n const scaledCommonBounds = this._worldToCommonBounds(visibleWorldBounds);\n\n // #4 :convert aligned common bounds to world bounds\n const worldBounds = this._commonToWorldBounds(scaledCommonBounds);\n\n // Clip webmercator projection limits\n if (this.props.coordinateSystem === COORDINATE_SYSTEM.LNGLAT) {\n worldBounds[1] = Math.max(worldBounds[1], -85.051129);\n worldBounds[3] = Math.min(worldBounds[3], 85.051129);\n worldBounds[0] = Math.max(worldBounds[0], -360);\n worldBounds[2] = Math.min(worldBounds[2], 360);\n }\n\n // #5: now convert world bounds to common using Layer's coordiante system and origin\n const normalizedCommonBounds = this._worldToCommonBounds(worldBounds);\n\n newState.worldBounds = worldBounds;\n newState.normalizedCommonBounds = normalizedCommonBounds;\n\n boundsChanged = true;\n }\n this.setState(newState);\n return boundsChanged;\n }\n\n _updateTextureRenderingBounds() {\n // Just render visible portion of the texture\n const {\n triPositionBuffer,\n triTexCoordBuffer,\n normalizedCommonBounds,\n viewportCorners\n } = this.state;\n\n const {viewport} = this.context;\n\n triPositionBuffer.subData(packVertices(viewportCorners, 3));\n\n const textureBounds = viewportCorners.map(p =>\n getTextureCoordinates(viewport.projectPosition(p), normalizedCommonBounds)\n );\n triTexCoordBuffer.subData(packVertices(textureBounds, 2));\n }\n\n _updateColorTexture(opts) {\n const {colorRange} = opts.props;\n let {colorTexture} = this.state;\n const colors = colorRangeToFlatArray(colorRange, false, Uint8Array);\n\n if (colorTexture) {\n colorTexture.setImageData({\n data: colors,\n width: colorRange.length\n });\n } else {\n colorTexture = new Texture2D(this.context.gl, {\n data: colors,\n width: colorRange.length,\n height: 1,\n ...TEXTURE_OPTIONS\n });\n }\n this.setState({colorTexture});\n }\n\n _updateWeightmap() {\n const {radiusPixels, colorDomain, aggregation} = this.props;\n const {weightsTransform, worldBounds, textureSize, weightsTexture, weightsScale} = this.state;\n this.state.isWeightMapDirty = false;\n\n // convert world bounds to common using Layer's coordiante system and origin\n const commonBounds = this._worldToCommonBounds(worldBounds, {\n useLayerCoordinateSystem: true\n });\n\n if (colorDomain && aggregation === 'SUM') {\n // scale color domain to weight per pixel\n const {viewport} = this.context;\n const metersPerPixel =\n (viewport.distanceScales.metersPerUnit[2] * (commonBounds[2] - commonBounds[0])) /\n textureSize;\n this.state.colorDomain = colorDomain.map(x => x * metersPerPixel * weightsScale);\n } else {\n this.state.colorDomain = colorDomain || DEFAULT_COLOR_DOMAIN;\n }\n\n const uniforms = {\n radiusPixels,\n commonBounds,\n textureWidth: textureSize,\n weightsScale\n };\n // Attribute manager sets data array count as instaceCount on model\n // we need to set that as elementCount on 'weightsTransform'\n weightsTransform.update({\n elementCount: this.getNumInstances()\n });\n weightsTransform.run({\n uniforms,\n parameters: {\n blend: true,\n depthTest: false,\n blendFunc: [GL.ONE, GL.ONE],\n blendEquation: GL.FUNC_ADD\n },\n clearRenderTarget: true,\n attributes: this.getAttributes(),\n moduleSettings: this.getModuleSettings()\n });\n this._updateMaxWeightValue();\n\n // reset filtering parameters (TODO: remove once luma issue#1193 is fixed)\n weightsTexture.setParameters({\n [GL.TEXTURE_MAG_FILTER]: GL.LINEAR,\n [GL.TEXTURE_MIN_FILTER]: GL.LINEAR\n });\n }\n\n _debouncedUpdateWeightmap(fromTimer = false) {\n let {updateTimer} = this.state;\n\n if (fromTimer) {\n updateTimer = null;\n // update\n this._updateBounds(true);\n this._updateTextureRenderingBounds();\n this.setState({isWeightMapDirty: true});\n } else {\n this.setState({isWeightMapDirty: false});\n clearTimeout(updateTimer);\n updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true), ZOOM_DEBOUNCE);\n }\n\n this.setState({updateTimer});\n }\n\n // input: worldBounds: [minLong, minLat, maxLong, maxLat]\n // input: opts.useLayerCoordinateSystem : layers coordiante system is used\n // optput: commonBounds: [minX, minY, maxX, maxY] scaled to fit the current texture\n _worldToCommonBounds(worldBounds, opts = {}) {\n const {useLayerCoordinateSystem = false} = opts;\n const [minLong, minLat, maxLong, maxLat] = worldBounds;\n const {viewport} = this.context;\n const {textureSize} = this.state;\n const {coordinateSystem} = this.props;\n\n const offsetMode =\n useLayerCoordinateSystem &&\n (coordinateSystem === COORDINATE_SYSTEM.LNGLAT_OFFSETS ||\n coordinateSystem === COORDINATE_SYSTEM.METER_OFFSETS);\n const offsetOriginCommon = offsetMode\n ? viewport.projectPosition(this.props.coordinateOrigin)\n : [0, 0];\n const size = (textureSize * RESOLUTION) / viewport.scale;\n\n let bottomLeftCommon;\n let topRightCommon;\n\n // Y-axis is flipped between World and Common bounds\n if (useLayerCoordinateSystem && !offsetMode) {\n bottomLeftCommon = this.projectPosition([minLong, minLat, 0]);\n topRightCommon = this.projectPosition([maxLong, maxLat, 0]);\n } else {\n bottomLeftCommon = viewport.projectPosition([minLong, minLat, 0]);\n topRightCommon = viewport.projectPosition([maxLong, maxLat, 0]);\n }\n // Ignore z component\n return scaleToAspectRatio(\n [\n bottomLeftCommon[0] - offsetOriginCommon[0],\n bottomLeftCommon[1] - offsetOriginCommon[1],\n topRightCommon[0] - offsetOriginCommon[0],\n topRightCommon[1] - offsetOriginCommon[1]\n ],\n size,\n size\n );\n }\n\n // input commonBounds: [xMin, yMin, xMax, yMax]\n // output worldBounds: [minLong, minLat, maxLong, maxLat]\n _commonToWorldBounds(commonBounds) {\n const [xMin, yMin, xMax, yMax] = commonBounds;\n const {viewport} = this.context;\n const bottomLeftWorld = viewport.unprojectPosition([xMin, yMin]);\n const topRightWorld = viewport.unprojectPosition([xMax, yMax]);\n\n return bottomLeftWorld.slice(0, 2).concat(topRightWorld.slice(0, 2));\n }\n}\n\nHeatmapLayer.layerName = 'HeatmapLayer';\nHeatmapLayer.defaultProps = defaultProps;\n"],"file":"heatmap-layer.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/heatmap-layer/heatmap-layer.js"],"names":["RESOLUTION","TEXTURE_OPTIONS","mipmaps","parameters","dataFormat","DEFAULT_COLOR_DOMAIN","AGGREGATION_MODE","SUM","MEAN","defaultProps","getPosition","type","value","x","position","getWeight","intensity","min","radiusPixels","max","colorRange","defaultColorRange","threshold","colorDomain","optional","aggregation","weightsTextureSize","debounceTimeout","REQUIRED_FEATURES","FEATURES","BLEND_EQUATION_MINMAX","TEXTURE_FLOAT","DIMENSIONS","data","props","HeatmapLayer","gl","context","setState","supported","log","error","id","_setupTextureParams","_setupAttributes","_setupResources","changeFlags","somethingChanged","opts","state","_updateHeatmapState","oldProps","_getChangeFlags","viewportChanged","boundsChanged","_updateBounds","_updateTextureRenderingBounds","dataChanged","clearTimeout","updateTimer","isWeightMapDirty","viewportZoomChanged","_debouncedUpdateWeightmap","_updateColorTexture","_updateWeightmap","zoom","viewport","weightsTexture","triPositionBuffer","triTexCoordBuffer","maxWeightsTexture","colorTexture","updateTriggers","TriangleLayerClass","getSubLayerClass","TriangleLayer","getSubLayerProps","coordinateSystem","COORDINATE_SYSTEM","DEFAULT","attributes","positions","texCoords","vertexCount","maxTexture","aggregationMode","texture","weightsTransform","maxWeightTransform","delete","AttributeManager","stats","dimensions","isAttributeChanged","isAggregationDirty","compareAll","dimension","textureSize","format","Texture2D","width","height","attributeManager","getAttributeManager","add","size","accessor","weights","positionAttributeName","Math","floatTargetSupport","COLOR_ATTACHMENT_RGBA32F","weightsScale","warn","vs","vs_max","_fs","fs_max","weights_vs","weights_fs","shaders","Transform","elementCount","_targetTexture","_targetTextureVarying","_createTextures","weightsTransformShaders","getShaders","_createWeightsTransform","maxWeightsTransformShaders","_sourceTextures","inTexture","Buffer","byteLength","shaderOptions","run","blend","depthTest","blendFunc","blendEquation","forceUpdate","viewportCorners","unproject","map","p","fround","visibleWorldBounds","newState","worldBounds","scaledCommonBounds","_worldToCommonBounds","_commonToWorldBounds","LNGLAT","normalizedCommonBounds","subData","textureBounds","projectPosition","colors","Uint8Array","setImageData","length","commonBounds","useLayerCoordinateSystem","metersPerPixel","distanceScales","metersPerUnit","uniforms","textureWidth","update","getNumInstances","clearRenderTarget","getAttributes","moduleSettings","getModuleSettings","_updateMaxWeightValue","setParameters","fromTimer","setTimeout","bind","minLong","minLat","maxLong","maxLat","offsetMode","LNGLAT_OFFSETS","METER_OFFSETS","offsetOriginCommon","coordinateOrigin","scale","bottomLeftCommon","topRightCommon","xMin","yMin","xMax","yMax","bottomLeftWorld","unprojectPosition","topRightWorld","slice","concat","AggregationLayer","layerName"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAsBA;;AAQA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;AAEA,IAAMA,UAAU,GAAG,CAAnB;AACA,IAAMC,eAAe,GAAG;AACtBC,EAAAA,OAAO,EAAE,KADa;AAEtBC,EAAAA,UAAU,uQAFY;AAQtBC,EAAAA,UAAU;AARY,CAAxB;AAUA,IAAMC,oBAAoB,GAAG,CAAC,CAAD,EAAI,CAAJ,CAA7B;AACA,IAAMC,gBAAgB,GAAG;AACvBC,EAAAA,GAAG,EAAE,CADkB;AAEvBC,EAAAA,IAAI,EAAE;AAFiB,CAAzB;AAKA,IAAMC,YAAY,GAAG;AACnBC,EAAAA,WAAW,EAAE;AAACC,IAAAA,IAAI,EAAE,UAAP;AAAmBC,IAAAA,KAAK,EAAE,eAAAC,CAAC;AAAA,aAAIA,CAAC,CAACC,QAAN;AAAA;AAA3B,GADM;AAEnBC,EAAAA,SAAS,EAAE;AAACJ,IAAAA,IAAI,EAAE,UAAP;AAAmBC,IAAAA,KAAK,EAAE;AAA1B,GAFQ;AAGnBI,EAAAA,SAAS,EAAE;AAACL,IAAAA,IAAI,EAAE,QAAP;AAAiBM,IAAAA,GAAG,EAAE,CAAtB;AAAyBL,IAAAA,KAAK,EAAE;AAAhC,GAHQ;AAInBM,EAAAA,YAAY,EAAE;AAACP,IAAAA,IAAI,EAAE,QAAP;AAAiBM,IAAAA,GAAG,EAAE,CAAtB;AAAyBE,IAAAA,GAAG,EAAE,GAA9B;AAAmCP,IAAAA,KAAK,EAAE;AAA1C,GAJK;AAKnBQ,EAAAA,UAAU,EAAEC,6BALO;AAMnBC,EAAAA,SAAS,EAAE;AAACX,IAAAA,IAAI,EAAE,QAAP;AAAiBM,IAAAA,GAAG,EAAE,CAAtB;AAAyBE,IAAAA,GAAG,EAAE,CAA9B;AAAiCP,IAAAA,KAAK,EAAE;AAAxC,GANQ;AAOnBW,EAAAA,WAAW,EAAE;AAACZ,IAAAA,IAAI,EAAE,OAAP;AAAgBC,IAAAA,KAAK,EAAE,IAAvB;AAA6BY,IAAAA,QAAQ,EAAE;AAAvC,GAPM;AASnBC,EAAAA,WAAW,EAAE,KATM;AAUnBC,EAAAA,kBAAkB,EAAE;AAACf,IAAAA,IAAI,EAAE,QAAP;AAAiBM,IAAAA,GAAG,EAAE,GAAtB;AAA2BE,IAAAA,GAAG,EAAE,IAAhC;AAAsCP,IAAAA,KAAK,EAAE;AAA7C,GAVD;AAWnBe,EAAAA,eAAe,EAAE;AAAChB,IAAAA,IAAI,EAAE,QAAP;AAAiBM,IAAAA,GAAG,EAAE,CAAtB;AAAyBE,IAAAA,GAAG,EAAE,IAA9B;AAAoCP,IAAAA,KAAK,EAAE;AAA3C;AAXE,CAArB;AAcA,IAAMgB,iBAAiB,GAAG,CACxBC,eAASC,qBADe,EAExBD,eAASE,aAFe,CAA1B;AAMA,IAAMC,UAAU,GAAG;AACjBC,EAAAA,IAAI,EAAE;AACJC,IAAAA,KAAK,EAAE,CAAC,cAAD;AADH;AADW,CAAnB;;IAMqBC,Y;;;;;;;;;;;;sCACD;AAAA,UACTC,EADS,GACH,KAAKC,OADF,CACTD,EADS;;AAEhB,UAAI,CAAC,uBAAYA,EAAZ,EAAgBR,iBAAhB,CAAL,EAAyC;AACvC,aAAKU,QAAL,CAAc;AAACC,UAAAA,SAAS,EAAE;AAAZ,SAAd;;AACAC,mBAAIC,KAAJ,yBAA2B,KAAKC,EAAhC;;AACA;AACD;;AACD,oHAAsBV,UAAtB;AACA,WAAKM,QAAL,CAAc;AAACC,QAAAA,SAAS,EAAE,IAAZ;AAAkBhB,QAAAA,WAAW,EAAElB;AAA/B,OAAd;;AACA,WAAKsC,mBAAL;;AACA,WAAKC,gBAAL;;AACA,WAAKC,eAAL;AACD;;;4CAEgC;AAAA,UAAdC,WAAc,QAAdA,WAAc;AAE/B,aAAOA,WAAW,CAACC,gBAAnB;AACD;;;gCAGWC,I,EAAM;AAChB,UAAI,CAAC,KAAKC,KAAL,CAAWV,SAAhB,EAA2B;AACzB;AACD;;AACD,gHAAkBS,IAAlB;;AACA,WAAKE,mBAAL,CAAyBF,IAAzB;AACD;;;wCAEmBA,I,EAAM;AAAA,UACjBd,KADiB,GACEc,IADF,CACjBd,KADiB;AAAA,UACViB,QADU,GACEH,IADF,CACVG,QADU;;AAExB,UAAML,WAAW,GAAG,KAAKM,eAAL,CAAqBJ,IAArB,CAApB;;AAEA,UAAIF,WAAW,CAACO,eAAhB,EAAiC;AAC/BP,QAAAA,WAAW,CAACQ,aAAZ,GAA4B,KAAKC,aAAL,EAA5B;;AACA,aAAKC,6BAAL;AACD;;AAED,UAAIV,WAAW,CAACW,WAAZ,IAA2BX,WAAW,CAACQ,aAA3C,EAA0D;AAExDI,QAAAA,YAAY,CAAC,KAAKT,KAAL,CAAWU,WAAZ,CAAZ;AACA,aAAKrB,QAAL,CAAc;AAACsB,UAAAA,gBAAgB,EAAE;AAAnB,SAAd;AACD,OAJD,MAIO,IAAId,WAAW,CAACe,mBAAhB,EAAqC;AAE1C,aAAKC,yBAAL;AACD;;AAED,UAAI5B,KAAK,CAACd,UAAN,KAAqB+B,QAAQ,CAAC/B,UAAlC,EAA8C;AAC5C,aAAK2C,mBAAL,CAAyBf,IAAzB;AACD;;AAED,UAAI,KAAKC,KAAL,CAAWW,gBAAf,EAAiC;AAC/B,aAAKI,gBAAL;AACD;;AAED,WAAK1B,QAAL,CAAc;AAAC2B,QAAAA,IAAI,EAAEjB,IAAI,CAACX,OAAL,CAAa6B,QAAb,CAAsBD;AAA7B,OAAd;AACD;;;mCAEc;AACb,UAAI,CAAC,KAAKhB,KAAL,CAAWV,SAAhB,EAA2B;AACzB,eAAO,EAAP;AACD;;AAHY,wBAWT,KAAKU,KAXI;AAAA,UAKXkB,cALW,eAKXA,cALW;AAAA,UAMXC,iBANW,eAMXA,iBANW;AAAA,UAOXC,iBAPW,eAOXA,iBAPW;AAAA,UAQXC,iBARW,eAQXA,iBARW;AAAA,UASXC,YATW,eASXA,YATW;AAAA,UAUXhD,WAVW,eAUXA,WAVW;AAAA,wBAY+C,KAAKW,KAZpD;AAAA,UAYNsC,cAZM,eAYNA,cAZM;AAAA,UAYUxD,SAZV,eAYUA,SAZV;AAAA,UAYqBM,SAZrB,eAYqBA,SAZrB;AAAA,UAYgCG,WAZhC,eAYgCA,WAZhC;AAcb,UAAMgD,kBAAkB,GAAG,KAAKC,gBAAL,CAAsB,UAAtB,EAAkCC,sBAAlC,CAA3B;AAEA,aAAO,IAAIF,kBAAJ,CACL,KAAKG,gBAAL,CAAsB;AACpBlC,QAAAA,EAAE,EAAE,gBADgB;AAEpB8B,QAAAA,cAAc,EAAdA;AAFoB,OAAtB,CADK,EAKL;AAGEK,QAAAA,gBAAgB,EAAEC,yBAAkBC,OAHtC;AAIE9C,QAAAA,IAAI,EAAE;AACJ+C,UAAAA,UAAU,EAAE;AACVC,YAAAA,SAAS,EAAEb,iBADD;AAEVc,YAAAA,SAAS,EAAEb;AAFD;AADR,SAJR;AAUEc,QAAAA,WAAW,EAAE,CAVf;AAWEC,QAAAA,UAAU,EAAEd,iBAXd;AAYEC,QAAAA,YAAY,EAAZA,YAZF;AAaEc,QAAAA,eAAe,EAAE/E,gBAAgB,CAACmB,WAAD,CAAhB,IAAiC,CAbpD;AAcE6D,QAAAA,OAAO,EAAEnB,cAdX;AAeEnD,QAAAA,SAAS,EAATA,SAfF;AAgBEM,QAAAA,SAAS,EAATA,SAhBF;AAiBEC,QAAAA,WAAW,EAAXA;AAjBF,OALK,CAAP;AAyBD;;;oCAEe;AACd;AADc,yBAWV,KAAK0B,KAXK;AAAA,UAGZsC,gBAHY,gBAGZA,gBAHY;AAAA,UAIZpB,cAJY,gBAIZA,cAJY;AAAA,UAKZqB,kBALY,gBAKZA,kBALY;AAAA,UAMZlB,iBANY,gBAMZA,iBANY;AAAA,UAOZF,iBAPY,gBAOZA,iBAPY;AAAA,UAQZC,iBARY,gBAQZA,iBARY;AAAA,UASZE,YATY,gBASZA,YATY;AAAA,UAUZZ,WAVY,gBAUZA,WAVY;AAYd4B,MAAAA,gBAAgB,SAAhB,IAAAA,gBAAgB,WAAhB,YAAAA,gBAAgB,CAAEE,MAAlB;AACAtB,MAAAA,cAAc,SAAd,IAAAA,cAAc,WAAd,YAAAA,cAAc,CAAEsB,MAAhB;AACAD,MAAAA,kBAAkB,SAAlB,IAAAA,kBAAkB,WAAlB,YAAAA,kBAAkB,CAAEC,MAApB;AACAnB,MAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAEmB,MAAnB;AACArB,MAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAEqB,MAAnB;AACApB,MAAAA,iBAAiB,SAAjB,IAAAA,iBAAiB,WAAjB,YAAAA,iBAAiB,CAAEoB,MAAnB;AACAlB,MAAAA,YAAY,SAAZ,IAAAA,YAAY,WAAZ,YAAAA,YAAY,CAAEkB,MAAd;AACA9B,MAAAA,WAAW,IAAID,YAAY,CAACC,WAAD,CAA3B;AACD;;;2CAKsB;AACrB,aAAO,IAAI+B,uBAAJ,CAAqB,KAAKrD,OAAL,CAAaD,EAAlC,EAAsC;AAC3CM,QAAAA,EAAE,EAAE,KAAKR,KAAL,CAAWQ,EAD4B;AAE3CiD,QAAAA,KAAK,EAAE,KAAKtD,OAAL,CAAasD;AAFuB,OAAtC,CAAP;AAID;;;oCAEe3C,I,EAAM;AACpB,UAAMF,WAAW,GAAG,EAApB;AADoB,UAEb8C,UAFa,GAEC,KAAK3C,KAFN,CAEb2C,UAFa;AAGpB9C,MAAAA,WAAW,CAACW,WAAZ,GACE,KAAKoC,kBAAL,MACA,KAAKC,kBAAL,CAAwB9C,IAAxB,EAA8B;AAC5B+C,QAAAA,UAAU,EAAE,IADgB;AAE5BC,QAAAA,SAAS,EAAEJ,UAAU,CAAC3D;AAFM,OAA9B,CAFF;AAMAa,MAAAA,WAAW,CAACO,eAAZ,GAA8BL,IAAI,CAACF,WAAL,CAAiBO,eAA/C;AAToB,UAWbY,IAXa,GAWL,KAAKhB,KAXA,CAWbgB,IAXa;;AAYpB,UAAI,CAACjB,IAAI,CAACX,OAAL,CAAa6B,QAAd,IAA0BlB,IAAI,CAACX,OAAL,CAAa6B,QAAb,CAAsBD,IAAtB,KAA+BA,IAA7D,EAAmE;AACjEnB,QAAAA,WAAW,CAACe,mBAAZ,GAAkC,IAAlC;AACD;;AAED,aAAOf,WAAP;AACD;;;sCAEiB;AAAA,UACTV,EADS,GACH,KAAKC,OADF,CACTD,EADS;AAAA,yBAEoB,KAAKa,KAFzB;AAAA,UAETgD,WAFS,gBAETA,WAFS;AAAA,UAEIC,MAFJ,gBAEIA,MAFJ;AAAA,UAEYvF,IAFZ,gBAEYA,IAFZ;AAIhB,WAAK2B,QAAL,CAAc;AACZ6B,QAAAA,cAAc,EAAE,IAAIgC,eAAJ,CAAc/D,EAAd;AACdgE,UAAAA,KAAK,EAAEH,WADO;AAEdI,UAAAA,MAAM,EAAEJ,WAFM;AAGdC,UAAAA,MAAM,EAANA,MAHc;AAIdvF,UAAAA,IAAI,EAAJA;AAJc,WAKXV,eALW,EADJ;AAQZqE,QAAAA,iBAAiB,EAAE,IAAI6B,eAAJ,CAAc/D,EAAd;AAAmB8D,UAAAA,MAAM,EAANA,MAAnB;AAA2BvF,UAAAA,IAAI,EAAJA;AAA3B,WAAoCV,eAApC;AARP,OAAd;AAUD;;;uCAEkB;AACjB,UAAMqG,gBAAgB,GAAG,KAAKC,mBAAL,EAAzB;AACAD,MAAAA,gBAAgB,CAACE,GAAjB,CAAqB;AACnBvB,QAAAA,SAAS,EAAE;AAACwB,UAAAA,IAAI,EAAE,CAAP;AAAU9F,UAAAA,IAAI,MAAd;AAA2B+F,UAAAA,QAAQ,EAAE;AAArC,SADQ;AAEnBC,QAAAA,OAAO,EAAE;AAACF,UAAAA,IAAI,EAAE,CAAP;AAAUC,UAAAA,QAAQ,EAAE;AAApB;AAFU,OAArB;AAIA,WAAKpE,QAAL,CAAc;AAACsE,QAAAA,qBAAqB,EAAE;AAAxB,OAAd;AACD;;;0CAEqB;AAAA,UACbxE,EADa,GACP,KAAKC,OADE,CACbD,EADa;AAAA,UAEbV,kBAFa,GAES,KAAKQ,KAFd,CAEbR,kBAFa;AAIpB,UAAMuE,WAAW,GAAGY,IAAI,CAAC5F,GAAL,CAASS,kBAAT,EAA6B,yBAAcU,EAAd,OAA7B,CAApB;AACA,UAAM0E,kBAAkB,GAAG,uBAAY1E,EAAZ,EAAgBP,eAASkF,wBAAzB,CAA3B;;AALoB,8BAMG,yCAAiB;AAAC3E,QAAAA,EAAE,EAAFA,EAAD;AAAK0E,QAAAA,kBAAkB,EAAlBA;AAAL,OAAjB,CANH;AAAA,UAMbZ,MANa,qBAMbA,MANa;AAAA,UAMLvF,IANK,qBAMLA,IANK;;AAOpB,UAAMqG,YAAY,GAAGF,kBAAkB,GAAG,CAAH,GAAO,IAAI,GAAlD;AACA,WAAKxE,QAAL,CAAc;AAAC2D,QAAAA,WAAW,EAAXA,WAAD;AAAcC,QAAAA,MAAM,EAANA,MAAd;AAAsBvF,QAAAA,IAAI,EAAJA,IAAtB;AAA4BqG,QAAAA,YAAY,EAAZA;AAA5B,OAAd;;AACA,UAAI,CAACF,kBAAL,EAAyB;AACvBtE,mBAAIyE,IAAJ,yBAEI,KAAKvE,EAFT;AAKD;AACF;;;+BAEU/B,I,EAAM;AACf,sHACEA,IAAI,KAAK,uBAAT,GACI;AACEuG,QAAAA,EAAE,EAAEC,cADN;AAEEC,QAAAA,GAAG,EAAEC;AAFP,OADJ,GAKI;AACEH,QAAAA,EAAE,EAAEI,kBADN;AAEEF,QAAAA,GAAG,EAAEG;AAFP,OANN;AAWD;;;8CAEqC;AAAA;;AAAA,UAAdC,OAAc,uEAAJ,EAAI;AAAA,UAC7BpF,EAD6B,GACvB,KAAKC,OADkB,CAC7BD,EAD6B;AAAA,UAE/BmD,gBAF+B,GAEX,KAAKtC,KAFM,CAE/BsC,gBAF+B;AAAA,UAG7BpB,cAH6B,GAGX,KAAKlB,KAHM,CAG7BkB,cAH6B;AAIpC,2BAAAoB,gBAAgB,UAAhB,8DAAkBE,MAAlB;AAEAF,MAAAA,gBAAgB,GAAG,IAAIkC,eAAJ,CAAcrF,EAAd;AACjBM,QAAAA,EAAE,YAAK,KAAKA,EAAV,uBADe;AAEjBgF,QAAAA,YAAY,EAAE,CAFG;AAGjBC,QAAAA,cAAc,EAAExD,cAHC;AAIjByD,QAAAA,qBAAqB,EAAE;AAJN,SAKdJ,OALc,EAAnB;AAOA,WAAKlF,QAAL,CAAc;AAACiD,QAAAA,gBAAgB,EAAhBA;AAAD,OAAd;AACD;;;sCAEiB;AAAA,UACTnD,EADS,GACH,KAAKC,OADF,CACTD,EADS;;AAEhB,WAAKyF,eAAL;;AAFgB,yBAGyC,KAAK5E,KAH9C;AAAA,UAGTgD,WAHS,gBAGTA,WAHS;AAAA,UAGI9B,cAHJ,gBAGIA,cAHJ;AAAA,UAGoBG,iBAHpB,gBAGoBA,iBAHpB;AAKhB,UAAMwD,uBAAuB,GAAG,KAAKC,UAAL,CAAgB,mBAAhB,CAAhC;;AACA,WAAKC,uBAAL,CAA6BF,uBAA7B;;AAEA,UAAMG,0BAA0B,GAAG,KAAKF,UAAL,CAAgB,uBAAhB,CAAnC;AACA,UAAMvC,kBAAkB,GAAG,IAAIiC,eAAJ,CAAcrF,EAAd;AACzBM,QAAAA,EAAE,YAAK,KAAKA,EAAV,2BADuB;AAEzBwF,QAAAA,eAAe,EAAE;AACfC,UAAAA,SAAS,EAAEhE;AADI,SAFQ;AAKzBwD,QAAAA,cAAc,EAAErD,iBALS;AAMzBsD,QAAAA,qBAAqB,EAAE;AANE,SAOtBK,0BAPsB;AAQzBP,QAAAA,YAAY,EAAEzB,WAAW,GAAGA;AARH,SAA3B;AAWA,WAAK3D,QAAL,CAAc;AACZ6B,QAAAA,cAAc,EAAdA,cADY;AAEZG,QAAAA,iBAAiB,EAAjBA,iBAFY;AAGZkB,QAAAA,kBAAkB,EAAlBA,kBAHY;AAIZvB,QAAAA,IAAI,EAAE,IAJM;AAKZG,QAAAA,iBAAiB,EAAE,IAAIgE,YAAJ,CAAWhG,EAAX,EAAe;AAChCiG,UAAAA,UAAU,EAAE,EADoB;AAEhC3B,UAAAA,QAAQ,EAAE;AAACD,YAAAA,IAAI,EAAE;AAAP;AAFsB,SAAf,CALP;AASZpC,QAAAA,iBAAiB,EAAE,IAAI+D,YAAJ,CAAWhG,EAAX,EAAe;AAChCiG,UAAAA,UAAU,EAAE,EADoB;AAEhC3B,UAAAA,QAAQ,EAAE;AAACD,YAAAA,IAAI,EAAE;AAAP;AAFsB,SAAf;AATP,OAAd;AAcD;;;kCAGa6B,a,EAAe;AAE3B,WAAKN,uBAAL,CAA6BM,aAA7B;AACD;;;4CAEuB;AAAA,UACf9C,kBADe,GACO,KAAKvC,KADZ,CACfuC,kBADe;AAEtBA,MAAAA,kBAAkB,CAAC+C,GAAnB,CAAuB;AACrBpI,QAAAA,UAAU,EAAE;AACVqI,UAAAA,KAAK,EAAE,IADG;AAEVC,UAAAA,SAAS,EAAE,KAFD;AAGVC,UAAAA,SAAS,EAAE,MAHD;AAIVC,UAAAA,aAAa;AAJH;AADS,OAAvB;AAQD;;;oCAGkC;AAAA,UAArBC,WAAqB,uEAAP,KAAO;AAAA,UAC1B1E,QAD0B,GACd,KAAK7B,OADS,CAC1B6B,QAD0B;AAKjC,UAAM2E,eAAe,GAAG,CACtB3E,QAAQ,CAAC4E,SAAT,CAAmB,CAAC,CAAD,EAAI,CAAJ,CAAnB,CADsB,EAEtB5E,QAAQ,CAAC4E,SAAT,CAAmB,CAAC5E,QAAQ,CAACkC,KAAV,EAAiB,CAAjB,CAAnB,CAFsB,EAGtBlC,QAAQ,CAAC4E,SAAT,CAAmB,CAAC5E,QAAQ,CAACkC,KAAV,EAAiBlC,QAAQ,CAACmC,MAA1B,CAAnB,CAHsB,EAItBnC,QAAQ,CAAC4E,SAAT,CAAmB,CAAC,CAAD,EAAI5E,QAAQ,CAACmC,MAAb,CAAnB,CAJsB,EAKtB0C,GALsB,CAKlB,UAAAC,CAAC;AAAA,eAAIA,CAAC,CAACD,GAAF,CAAMlC,IAAI,CAACoC,MAAX,CAAJ;AAAA,OALiB,CAAxB;AAQA,UAAMC,kBAAkB,GAAG,kCAAUL,eAAV,CAA3B;AAEA,UAAMM,QAAQ,GAAG;AAACD,QAAAA,kBAAkB,EAAlBA,kBAAD;AAAqBL,QAAAA,eAAe,EAAfA;AAArB,OAAjB;AACA,UAAIvF,aAAa,GAAG,KAApB;;AAEA,UACEsF,WAAW,IACX,CAAC,KAAK3F,KAAL,CAAWmG,WADZ,IAEA,CAAC,sCAAc,KAAKnG,KAAL,CAAWmG,WAAzB,EAAsCF,kBAAtC,CAHH,EAIE;AAGA,YAAMG,kBAAkB,GAAG,KAAKC,oBAAL,CAA0BJ,kBAA1B,CAA3B;;AAGA,YAAME,WAAW,GAAG,KAAKG,oBAAL,CAA0BF,kBAA1B,CAApB;;AAGA,YAAI,KAAKnH,KAAL,CAAW2C,gBAAX,KAAgCC,yBAAkB0E,MAAtD,EAA8D;AAC5DJ,UAAAA,WAAW,CAAC,CAAD,CAAX,GAAiBvC,IAAI,CAAC1F,GAAL,CAASiI,WAAW,CAAC,CAAD,CAApB,EAAyB,CAAC,SAA1B,CAAjB;AACAA,UAAAA,WAAW,CAAC,CAAD,CAAX,GAAiBvC,IAAI,CAAC5F,GAAL,CAASmI,WAAW,CAAC,CAAD,CAApB,EAAyB,SAAzB,CAAjB;AACAA,UAAAA,WAAW,CAAC,CAAD,CAAX,GAAiBvC,IAAI,CAAC1F,GAAL,CAASiI,WAAW,CAAC,CAAD,CAApB,EAAyB,CAAC,GAA1B,CAAjB;AACAA,UAAAA,WAAW,CAAC,CAAD,CAAX,GAAiBvC,IAAI,CAAC5F,GAAL,CAASmI,WAAW,CAAC,CAAD,CAApB,EAAyB,GAAzB,CAAjB;AACD;;AAGD,YAAMK,sBAAsB,GAAG,KAAKH,oBAAL,CAA0BF,WAA1B,CAA/B;;AAEAD,QAAAA,QAAQ,CAACC,WAAT,GAAuBA,WAAvB;AACAD,QAAAA,QAAQ,CAACM,sBAAT,GAAkCA,sBAAlC;AAEAnG,QAAAA,aAAa,GAAG,IAAhB;AACD;;AACD,WAAKhB,QAAL,CAAc6G,QAAd;AACA,aAAO7F,aAAP;AACD;;;oDAE+B;AAAA,yBAO1B,KAAKL,KAPqB;AAAA,UAG5BmB,iBAH4B,gBAG5BA,iBAH4B;AAAA,UAI5BC,iBAJ4B,gBAI5BA,iBAJ4B;AAAA,UAK5BoF,sBAL4B,gBAK5BA,sBAL4B;AAAA,UAM5BZ,eAN4B,gBAM5BA,eAN4B;AAAA,UASvB3E,QATuB,GASX,KAAK7B,OATM,CASvB6B,QATuB;AAW9BE,MAAAA,iBAAiB,CAACsF,OAAlB,CAA0B,qCAAab,eAAb,EAA8B,CAA9B,CAA1B;AAEA,UAAMc,aAAa,GAAGd,eAAe,CAACE,GAAhB,CAAoB,UAAAC,CAAC;AAAA,eACzC,8CAAsB9E,QAAQ,CAAC0F,eAAT,CAAyBZ,CAAzB,CAAtB,EAAmDS,sBAAnD,CADyC;AAAA,OAArB,CAAtB;AAGApF,MAAAA,iBAAiB,CAACqF,OAAlB,CAA0B,qCAAaC,aAAb,EAA4B,CAA5B,CAA1B;AACD;;;wCAEmB3G,I,EAAM;AAAA,UACjB5B,UADiB,GACH4B,IAAI,CAACd,KADF,CACjBd,UADiB;AAAA,UAEnBmD,YAFmB,GAEH,KAAKtB,KAFF,CAEnBsB,YAFmB;AAGxB,UAAMsF,MAAM,GAAG,uCAAsBzI,UAAtB,EAAkC,KAAlC,EAAyC0I,UAAzC,CAAf;;AAEA,UAAIvF,YAAJ,EAAkB;AAChBA,QAAAA,YAAY,CAACwF,YAAb,CAA0B;AACxB9H,UAAAA,IAAI,EAAE4H,MADkB;AAExBzD,UAAAA,KAAK,EAAEhF,UAAU,CAAC4I;AAFM,SAA1B;AAID,OALD,MAKO;AACLzF,QAAAA,YAAY,GAAG,IAAI4B,eAAJ,CAAc,KAAK9D,OAAL,CAAaD,EAA3B;AACbH,UAAAA,IAAI,EAAE4H,MADO;AAEbzD,UAAAA,KAAK,EAAEhF,UAAU,CAAC4I,MAFL;AAGb3D,UAAAA,MAAM,EAAE;AAHK,WAIVpG,eAJU,EAAf;AAMD;;AACD,WAAKqC,QAAL,CAAc;AAACiC,QAAAA,YAAY,EAAZA;AAAD,OAAd;AACD;;;uCAEkB;AAAA;;AAAA,yBACgC,KAAKrC,KADrC;AAAA,UACVhB,YADU,gBACVA,YADU;AAAA,UACIK,WADJ,gBACIA,WADJ;AAAA,UACiBE,WADjB,gBACiBA,WADjB;AAAA,yBAEkE,KAAKwB,KAFvE;AAAA,UAEVsC,gBAFU,gBAEVA,gBAFU;AAAA,UAEQ6D,WAFR,gBAEQA,WAFR;AAAA,UAEqBnD,WAFrB,gBAEqBA,WAFrB;AAAA,UAEkC9B,cAFlC,gBAEkCA,cAFlC;AAAA,UAEkD6C,YAFlD,gBAEkDA,YAFlD;AAGjB,WAAK/D,KAAL,CAAWW,gBAAX,GAA8B,KAA9B;;AAGA,UAAMqG,YAAY,GAAG,KAAKX,oBAAL,CAA0BF,WAA1B,EAAuC;AAC1Dc,QAAAA,wBAAwB,EAAE;AADgC,OAAvC,CAArB;;AAIA,UAAI3I,WAAW,IAAIE,WAAW,KAAK,KAAnC,EAA0C;AAAA,YAEjCyC,QAFiC,GAErB,KAAK7B,OAFgB,CAEjC6B,QAFiC;AAGxC,YAAMiG,cAAc,GACjBjG,QAAQ,CAACkG,cAAT,CAAwBC,aAAxB,CAAsC,CAAtC,KAA4CJ,YAAY,CAAC,CAAD,CAAZ,GAAkBA,YAAY,CAAC,CAAD,CAA1E,CAAD,GACAhE,WAFF;AAGA,aAAKhD,KAAL,CAAW1B,WAAX,GAAyBA,WAAW,CAACwH,GAAZ,CAAgB,UAAAlI,CAAC;AAAA,iBAAIA,CAAC,GAAGsJ,cAAJ,GAAqBnD,YAAzB;AAAA,SAAjB,CAAzB;AACD,OAPD,MAOO;AACL,aAAK/D,KAAL,CAAW1B,WAAX,GAAyBA,WAAW,IAAIlB,oBAAxC;AACD;;AAED,UAAMiK,QAAQ,GAAG;AACfpJ,QAAAA,YAAY,EAAZA,YADe;AAEf+I,QAAAA,YAAY,EAAZA,YAFe;AAGfM,QAAAA,YAAY,EAAEtE,WAHC;AAIfe,QAAAA,YAAY,EAAZA;AAJe,OAAjB;AAQAzB,MAAAA,gBAAgB,CAACiF,MAAjB,CAAwB;AACtB9C,QAAAA,YAAY,EAAE,KAAK+C,eAAL;AADQ,OAAxB;AAGAlF,MAAAA,gBAAgB,CAACgD,GAAjB,CAAqB;AACnB+B,QAAAA,QAAQ,EAARA,QADmB;AAEnBnK,QAAAA,UAAU,EAAE;AACVqI,UAAAA,KAAK,EAAE,IADG;AAEVC,UAAAA,SAAS,EAAE,KAFD;AAGVC,UAAAA,SAAS,EAAE,MAHD;AAIVC,UAAAA,aAAa;AAJH,SAFO;AAQnB+B,QAAAA,iBAAiB,EAAE,IARA;AASnB1F,QAAAA,UAAU,EAAE,KAAK2F,aAAL,EATO;AAUnBC,QAAAA,cAAc,EAAE,KAAKC,iBAAL;AAVG,OAArB;;AAYA,WAAKC,qBAAL;;AAGA3G,MAAAA,cAAc,CAAC4G,aAAf;AAID;;;gDAE4C;AAAA,UAAnBC,SAAmB,uEAAP,KAAO;AAAA,UACtCrH,WADsC,GACvB,KAAKV,KADkB,CACtCU,WADsC;AAAA,UAEpChC,eAFoC,GAEjB,KAAKO,KAFY,CAEpCP,eAFoC;;AAI3C,UAAIqJ,SAAJ,EAAe;AACbrH,QAAAA,WAAW,GAAG,IAAd;;AAEA,aAAKJ,aAAL,CAAmB,IAAnB;;AACA,aAAKC,6BAAL;;AACA,aAAKlB,QAAL,CAAc;AAACsB,UAAAA,gBAAgB,EAAE;AAAnB,SAAd;AACD,OAND,MAMO;AACL,aAAKtB,QAAL,CAAc;AAACsB,UAAAA,gBAAgB,EAAE;AAAnB,SAAd;AACAF,QAAAA,YAAY,CAACC,WAAD,CAAZ;AACAA,QAAAA,WAAW,GAAGsH,UAAU,CAAC,KAAKnH,yBAAL,CAA+BoH,IAA/B,CAAoC,IAApC,EAA0C,IAA1C,CAAD,EAAkDvJ,eAAlD,CAAxB;AACD;;AAED,WAAKW,QAAL,CAAc;AAACqB,QAAAA,WAAW,EAAXA;AAAD,OAAd;AACD;;;yCAKoByF,W,EAAwB;AAAA,UAAXpG,IAAW,uEAAJ,EAAI;AAAA,kCACAA,IADA,CACpCkH,wBADoC;AAAA,UACpCA,wBADoC,sCACT,KADS;;AAAA,sDAEAd,WAFA;AAAA,UAEpC+B,OAFoC;AAAA,UAE3BC,MAF2B;AAAA,UAEnBC,OAFmB;AAAA,UAEVC,MAFU;;AAAA,UAGpCpH,QAHoC,GAGxB,KAAK7B,OAHmB,CAGpC6B,QAHoC;AAAA,UAIpC+B,WAJoC,GAIrB,KAAKhD,KAJgB,CAIpCgD,WAJoC;AAAA,UAKpCpB,gBALoC,GAKhB,KAAK3C,KALW,CAKpC2C,gBALoC;AAO3C,UAAM0G,UAAU,GACdrB,wBAAwB,KACvBrF,gBAAgB,KAAKC,yBAAkB0G,cAAvC,IACC3G,gBAAgB,KAAKC,yBAAkB2G,aAFjB,CAD1B;AAIA,UAAMC,kBAAkB,GAAGH,UAAU,GACjCrH,QAAQ,CAAC0F,eAAT,CAAyB,KAAK1H,KAAL,CAAWyJ,gBAApC,CADiC,GAEjC,CAAC,CAAD,EAAI,CAAJ,CAFJ;AAGA,UAAMlF,IAAI,GAAIR,WAAW,GAAGjG,UAAf,GAA6BkE,QAAQ,CAAC0H,KAAnD;AAEA,UAAIC,gBAAJ;AACA,UAAIC,cAAJ;;AAGA,UAAI5B,wBAAwB,IAAI,CAACqB,UAAjC,EAA6C;AAC3CM,QAAAA,gBAAgB,GAAG,KAAKjC,eAAL,CAAqB,CAACuB,OAAD,EAAUC,MAAV,EAAkB,CAAlB,CAArB,CAAnB;AACAU,QAAAA,cAAc,GAAG,KAAKlC,eAAL,CAAqB,CAACyB,OAAD,EAAUC,MAAV,EAAkB,CAAlB,CAArB,CAAjB;AACD,OAHD,MAGO;AACLO,QAAAA,gBAAgB,GAAG3H,QAAQ,CAAC0F,eAAT,CAAyB,CAACuB,OAAD,EAAUC,MAAV,EAAkB,CAAlB,CAAzB,CAAnB;AACAU,QAAAA,cAAc,GAAG5H,QAAQ,CAAC0F,eAAT,CAAyB,CAACyB,OAAD,EAAUC,MAAV,EAAkB,CAAlB,CAAzB,CAAjB;AACD;;AAED,aAAO,2CACL,CACEO,gBAAgB,CAAC,CAAD,CAAhB,GAAsBH,kBAAkB,CAAC,CAAD,CAD1C,EAEEG,gBAAgB,CAAC,CAAD,CAAhB,GAAsBH,kBAAkB,CAAC,CAAD,CAF1C,EAGEI,cAAc,CAAC,CAAD,CAAd,GAAoBJ,kBAAkB,CAAC,CAAD,CAHxC,EAIEI,cAAc,CAAC,CAAD,CAAd,GAAoBJ,kBAAkB,CAAC,CAAD,CAJxC,CADK,EAOLjF,IAPK,EAQLA,IARK,CAAP;AAUD;;;yCAIoBwD,Y,EAAc;AAAA,uDACAA,YADA;AAAA,UAC1B8B,IAD0B;AAAA,UACpBC,IADoB;AAAA,UACdC,IADc;AAAA,UACRC,IADQ;;AAAA,UAE1BhI,QAF0B,GAEd,KAAK7B,OAFS,CAE1B6B,QAF0B;AAGjC,UAAMiI,eAAe,GAAGjI,QAAQ,CAACkI,iBAAT,CAA2B,CAACL,IAAD,EAAOC,IAAP,CAA3B,CAAxB;AACA,UAAMK,aAAa,GAAGnI,QAAQ,CAACkI,iBAAT,CAA2B,CAACH,IAAD,EAAOC,IAAP,CAA3B,CAAtB;AAEA,aAAOC,eAAe,CAACG,KAAhB,CAAsB,CAAtB,EAAyB,CAAzB,EAA4BC,MAA5B,CAAmCF,aAAa,CAACC,KAAd,CAAoB,CAApB,EAAuB,CAAvB,CAAnC,CAAP;AACD;;;EA9euCE,yB;;;AAif1CrK,YAAY,CAACsK,SAAb,GAAyB,cAAzB;AACAtK,YAAY,CAAC1B,YAAb,GAA4BA,YAA5B","sourcesContent":["// Copyright (c) 2015 - 2019 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* global setTimeout clearTimeout */\nimport GL from '@luma.gl/constants';\nimport {\n getBounds,\n boundsContain,\n packVertices,\n scaleToAspectRatio,\n getTextureCoordinates,\n getTextureParams\n} from './heatmap-layer-utils';\nimport {Buffer, Texture2D, Transform, getParameters, FEATURES, hasFeatures} from '@luma.gl/core';\nimport {AttributeManager, COORDINATE_SYSTEM, log} from '@deck.gl/core';\nimport TriangleLayer from './triangle-layer';\nimport AggregationLayer from '../aggregation-layer';\nimport {defaultColorRange, colorRangeToFlatArray} from '../utils/color-utils';\nimport weights_vs from './weights-vs.glsl';\nimport weights_fs from './weights-fs.glsl';\nimport vs_max from './max-vs.glsl';\nimport fs_max from './max-fs.glsl';\n\nconst RESOLUTION = 2; // (number of common space pixels) / (number texels)\nconst TEXTURE_OPTIONS = {\n mipmaps: false,\n parameters: {\n [GL.TEXTURE_MAG_FILTER]: GL.LINEAR,\n [GL.TEXTURE_MIN_FILTER]: GL.LINEAR,\n [GL.TEXTURE_WRAP_S]: GL.CLAMP_TO_EDGE,\n [GL.TEXTURE_WRAP_T]: GL.CLAMP_TO_EDGE\n },\n dataFormat: GL.RGBA\n};\nconst DEFAULT_COLOR_DOMAIN = [0, 0];\nconst AGGREGATION_MODE = {\n SUM: 0,\n MEAN: 1\n};\n\nconst defaultProps = {\n getPosition: {type: 'accessor', value: x => x.position},\n getWeight: {type: 'accessor', value: 1},\n intensity: {type: 'number', min: 0, value: 1},\n radiusPixels: {type: 'number', min: 1, max: 100, value: 50},\n colorRange: defaultColorRange,\n threshold: {type: 'number', min: 0, max: 1, value: 0.05},\n colorDomain: {type: 'array', value: null, optional: true},\n // 'SUM' or 'MEAN'\n aggregation: 'SUM',\n weightsTextureSize: {type: 'number', min: 128, max: 2048, value: 2048},\n debounceTimeout: {type: 'number', min: 0, max: 1000, value: 500}\n};\n\nconst REQUIRED_FEATURES = [\n FEATURES.BLEND_EQUATION_MINMAX, // max weight calculation\n FEATURES.TEXTURE_FLOAT // weight-map as texture\n // FEATURES.FLOAT_BLEND, // implictly supported when TEXTURE_FLOAT is supported\n];\n\nconst DIMENSIONS = {\n data: {\n props: ['radiusPixels']\n }\n};\n\nexport default class HeatmapLayer extends AggregationLayer {\n initializeState() {\n const {gl} = this.context;\n if (!hasFeatures(gl, REQUIRED_FEATURES)) {\n this.setState({supported: false});\n log.error(`HeatmapLayer: ${this.id} is not supported on this browser`)();\n return;\n }\n super.initializeState(DIMENSIONS);\n this.setState({supported: true, colorDomain: DEFAULT_COLOR_DOMAIN});\n this._setupTextureParams();\n this._setupAttributes();\n this._setupResources();\n }\n\n shouldUpdateState({changeFlags}) {\n // Need to be updated when viewport changes\n return changeFlags.somethingChanged;\n }\n\n /* eslint-disable max-statements,complexity */\n updateState(opts) {\n if (!this.state.supported) {\n return;\n }\n super.updateState(opts);\n this._updateHeatmapState(opts);\n }\n\n _updateHeatmapState(opts) {\n const {props, oldProps} = opts;\n const changeFlags = this._getChangeFlags(opts);\n\n if (changeFlags.viewportChanged) {\n changeFlags.boundsChanged = this._updateBounds();\n this._updateTextureRenderingBounds();\n }\n\n if (changeFlags.dataChanged || changeFlags.boundsChanged) {\n // Update weight map immediately\n clearTimeout(this.state.updateTimer);\n this.setState({isWeightMapDirty: true});\n } else if (changeFlags.viewportZoomChanged) {\n // Update weight map when zoom stops\n this._debouncedUpdateWeightmap();\n }\n\n if (props.colorRange !== oldProps.colorRange) {\n this._updateColorTexture(opts);\n }\n\n if (this.state.isWeightMapDirty) {\n this._updateWeightmap();\n }\n\n this.setState({zoom: opts.context.viewport.zoom});\n }\n\n renderLayers() {\n if (!this.state.supported) {\n return [];\n }\n const {\n weightsTexture,\n triPositionBuffer,\n triTexCoordBuffer,\n maxWeightsTexture,\n colorTexture,\n colorDomain\n } = this.state;\n const {updateTriggers, intensity, threshold, aggregation} = this.props;\n\n const TriangleLayerClass = this.getSubLayerClass('triangle', TriangleLayer);\n\n return new TriangleLayerClass(\n this.getSubLayerProps({\n id: 'triangle-layer',\n updateTriggers\n }),\n {\n // position buffer is filled with world coordinates generated from viewport.unproject\n // i.e. LNGLAT if geospatial, CARTESIAN otherwise\n coordinateSystem: COORDINATE_SYSTEM.DEFAULT,\n data: {\n attributes: {\n positions: triPositionBuffer,\n texCoords: triTexCoordBuffer\n }\n },\n vertexCount: 4,\n maxTexture: maxWeightsTexture,\n colorTexture,\n aggregationMode: AGGREGATION_MODE[aggregation] || 0,\n texture: weightsTexture,\n intensity,\n threshold,\n colorDomain\n }\n );\n }\n\n finalizeState() {\n super.finalizeState();\n const {\n weightsTransform,\n weightsTexture,\n maxWeightTransform,\n maxWeightsTexture,\n triPositionBuffer,\n triTexCoordBuffer,\n colorTexture,\n updateTimer\n } = this.state;\n weightsTransform?.delete();\n weightsTexture?.delete();\n maxWeightTransform?.delete();\n maxWeightsTexture?.delete();\n triPositionBuffer?.delete();\n triTexCoordBuffer?.delete();\n colorTexture?.delete();\n updateTimer && clearTimeout(updateTimer);\n }\n\n // PRIVATE\n\n // override Composite layer private method to create AttributeManager instance\n _getAttributeManager() {\n return new AttributeManager(this.context.gl, {\n id: this.props.id,\n stats: this.context.stats\n });\n }\n\n _getChangeFlags(opts) {\n const changeFlags = {};\n const {dimensions} = this.state;\n changeFlags.dataChanged =\n this.isAttributeChanged() || // if any attribute is changed\n this.isAggregationDirty(opts, {\n compareAll: true,\n dimension: dimensions.data\n });\n changeFlags.viewportChanged = opts.changeFlags.viewportChanged;\n\n const {zoom} = this.state;\n if (!opts.context.viewport || opts.context.viewport.zoom !== zoom) {\n changeFlags.viewportZoomChanged = true;\n }\n\n return changeFlags;\n }\n\n _createTextures() {\n const {gl} = this.context;\n const {textureSize, format, type} = this.state;\n\n this.setState({\n weightsTexture: new Texture2D(gl, {\n width: textureSize,\n height: textureSize,\n format,\n type,\n ...TEXTURE_OPTIONS\n }),\n maxWeightsTexture: new Texture2D(gl, {format, type, ...TEXTURE_OPTIONS}) // 1 X 1 texture,\n });\n }\n\n _setupAttributes() {\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: {size: 3, type: GL.DOUBLE, accessor: 'getPosition'},\n weights: {size: 1, accessor: 'getWeight'}\n });\n this.setState({positionAttributeName: 'positions'});\n }\n\n _setupTextureParams() {\n const {gl} = this.context;\n const {weightsTextureSize} = this.props;\n\n const textureSize = Math.min(weightsTextureSize, getParameters(gl, gl.MAX_TEXTURE_SIZE));\n const floatTargetSupport = hasFeatures(gl, FEATURES.COLOR_ATTACHMENT_RGBA32F);\n const {format, type} = getTextureParams({gl, floatTargetSupport});\n const weightsScale = floatTargetSupport ? 1 : 1 / 255;\n this.setState({textureSize, format, type, weightsScale});\n if (!floatTargetSupport) {\n log.warn(\n `HeatmapLayer: ${\n this.id\n } rendering to float texture not supported, fallingback to low precession format`\n )();\n }\n }\n\n getShaders(type) {\n return super.getShaders(\n type === 'max-weights-transform'\n ? {\n vs: vs_max,\n _fs: fs_max\n }\n : {\n vs: weights_vs,\n _fs: weights_fs\n }\n );\n }\n\n _createWeightsTransform(shaders = {}) {\n const {gl} = this.context;\n let {weightsTransform} = this.state;\n const {weightsTexture} = this.state;\n weightsTransform?.delete();\n\n weightsTransform = new Transform(gl, {\n id: `${this.id}-weights-transform`,\n elementCount: 1,\n _targetTexture: weightsTexture,\n _targetTextureVarying: 'weightsTexture',\n ...shaders\n });\n this.setState({weightsTransform});\n }\n\n _setupResources() {\n const {gl} = this.context;\n this._createTextures();\n const {textureSize, weightsTexture, maxWeightsTexture} = this.state;\n\n const weightsTransformShaders = this.getShaders('weights-transform');\n this._createWeightsTransform(weightsTransformShaders);\n\n const maxWeightsTransformShaders = this.getShaders('max-weights-transform');\n const maxWeightTransform = new Transform(gl, {\n id: `${this.id}-max-weights-transform`,\n _sourceTextures: {\n inTexture: weightsTexture\n },\n _targetTexture: maxWeightsTexture,\n _targetTextureVarying: 'outTexture',\n ...maxWeightsTransformShaders,\n elementCount: textureSize * textureSize\n });\n\n this.setState({\n weightsTexture,\n maxWeightsTexture,\n maxWeightTransform,\n zoom: null,\n triPositionBuffer: new Buffer(gl, {\n byteLength: 48,\n accessor: {size: 3}\n }),\n triTexCoordBuffer: new Buffer(gl, {\n byteLength: 48,\n accessor: {size: 2}\n })\n });\n }\n\n // overwrite super class method to update transform model\n updateShaders(shaderOptions) {\n // sahder params (modules, injects) changed, update model object\n this._createWeightsTransform(shaderOptions);\n }\n\n _updateMaxWeightValue() {\n const {maxWeightTransform} = this.state;\n maxWeightTransform.run({\n parameters: {\n blend: true,\n depthTest: false,\n blendFunc: [GL.ONE, GL.ONE],\n blendEquation: GL.MAX\n }\n });\n }\n\n // Computes world bounds area that needs to be processed for generate heatmap\n _updateBounds(forceUpdate = false) {\n const {viewport} = this.context;\n\n // Unproject all 4 corners of the current screen coordinates into world coordinates (lng/lat)\n // Takes care of viewport has non zero bearing/pitch (i.e axis not aligned with world coordiante system)\n const viewportCorners = [\n viewport.unproject([0, 0]),\n viewport.unproject([viewport.width, 0]),\n viewport.unproject([viewport.width, viewport.height]),\n viewport.unproject([0, viewport.height])\n ].map(p => p.map(Math.fround));\n\n // #1: get world bounds for current viewport extends\n const visibleWorldBounds = getBounds(viewportCorners); // TODO: Change to visible bounds\n\n const newState = {visibleWorldBounds, viewportCorners};\n let boundsChanged = false;\n\n if (\n forceUpdate ||\n !this.state.worldBounds ||\n !boundsContain(this.state.worldBounds, visibleWorldBounds)\n ) {\n // #2 : convert world bounds to common (Flat) bounds\n // #3 : extend common bounds to match aspect ratio with viewport\n const scaledCommonBounds = this._worldToCommonBounds(visibleWorldBounds);\n\n // #4 :convert aligned common bounds to world bounds\n const worldBounds = this._commonToWorldBounds(scaledCommonBounds);\n\n // Clip webmercator projection limits\n if (this.props.coordinateSystem === COORDINATE_SYSTEM.LNGLAT) {\n worldBounds[1] = Math.max(worldBounds[1], -85.051129);\n worldBounds[3] = Math.min(worldBounds[3], 85.051129);\n worldBounds[0] = Math.max(worldBounds[0], -360);\n worldBounds[2] = Math.min(worldBounds[2], 360);\n }\n\n // #5: now convert world bounds to common using Layer's coordiante system and origin\n const normalizedCommonBounds = this._worldToCommonBounds(worldBounds);\n\n newState.worldBounds = worldBounds;\n newState.normalizedCommonBounds = normalizedCommonBounds;\n\n boundsChanged = true;\n }\n this.setState(newState);\n return boundsChanged;\n }\n\n _updateTextureRenderingBounds() {\n // Just render visible portion of the texture\n const {\n triPositionBuffer,\n triTexCoordBuffer,\n normalizedCommonBounds,\n viewportCorners\n } = this.state;\n\n const {viewport} = this.context;\n\n triPositionBuffer.subData(packVertices(viewportCorners, 3));\n\n const textureBounds = viewportCorners.map(p =>\n getTextureCoordinates(viewport.projectPosition(p), normalizedCommonBounds)\n );\n triTexCoordBuffer.subData(packVertices(textureBounds, 2));\n }\n\n _updateColorTexture(opts) {\n const {colorRange} = opts.props;\n let {colorTexture} = this.state;\n const colors = colorRangeToFlatArray(colorRange, false, Uint8Array);\n\n if (colorTexture) {\n colorTexture.setImageData({\n data: colors,\n width: colorRange.length\n });\n } else {\n colorTexture = new Texture2D(this.context.gl, {\n data: colors,\n width: colorRange.length,\n height: 1,\n ...TEXTURE_OPTIONS\n });\n }\n this.setState({colorTexture});\n }\n\n _updateWeightmap() {\n const {radiusPixels, colorDomain, aggregation} = this.props;\n const {weightsTransform, worldBounds, textureSize, weightsTexture, weightsScale} = this.state;\n this.state.isWeightMapDirty = false;\n\n // convert world bounds to common using Layer's coordiante system and origin\n const commonBounds = this._worldToCommonBounds(worldBounds, {\n useLayerCoordinateSystem: true\n });\n\n if (colorDomain && aggregation === 'SUM') {\n // scale color domain to weight per pixel\n const {viewport} = this.context;\n const metersPerPixel =\n (viewport.distanceScales.metersPerUnit[2] * (commonBounds[2] - commonBounds[0])) /\n textureSize;\n this.state.colorDomain = colorDomain.map(x => x * metersPerPixel * weightsScale);\n } else {\n this.state.colorDomain = colorDomain || DEFAULT_COLOR_DOMAIN;\n }\n\n const uniforms = {\n radiusPixels,\n commonBounds,\n textureWidth: textureSize,\n weightsScale\n };\n // Attribute manager sets data array count as instaceCount on model\n // we need to set that as elementCount on 'weightsTransform'\n weightsTransform.update({\n elementCount: this.getNumInstances()\n });\n weightsTransform.run({\n uniforms,\n parameters: {\n blend: true,\n depthTest: false,\n blendFunc: [GL.ONE, GL.ONE],\n blendEquation: GL.FUNC_ADD\n },\n clearRenderTarget: true,\n attributes: this.getAttributes(),\n moduleSettings: this.getModuleSettings()\n });\n this._updateMaxWeightValue();\n\n // reset filtering parameters (TODO: remove once luma issue#1193 is fixed)\n weightsTexture.setParameters({\n [GL.TEXTURE_MAG_FILTER]: GL.LINEAR,\n [GL.TEXTURE_MIN_FILTER]: GL.LINEAR\n });\n }\n\n _debouncedUpdateWeightmap(fromTimer = false) {\n let {updateTimer} = this.state;\n const {debounceTimeout} = this.props;\n\n if (fromTimer) {\n updateTimer = null;\n // update\n this._updateBounds(true);\n this._updateTextureRenderingBounds();\n this.setState({isWeightMapDirty: true});\n } else {\n this.setState({isWeightMapDirty: false});\n clearTimeout(updateTimer);\n updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true), debounceTimeout);\n }\n\n this.setState({updateTimer});\n }\n\n // input: worldBounds: [minLong, minLat, maxLong, maxLat]\n // input: opts.useLayerCoordinateSystem : layers coordiante system is used\n // optput: commonBounds: [minX, minY, maxX, maxY] scaled to fit the current texture\n _worldToCommonBounds(worldBounds, opts = {}) {\n const {useLayerCoordinateSystem = false} = opts;\n const [minLong, minLat, maxLong, maxLat] = worldBounds;\n const {viewport} = this.context;\n const {textureSize} = this.state;\n const {coordinateSystem} = this.props;\n\n const offsetMode =\n useLayerCoordinateSystem &&\n (coordinateSystem === COORDINATE_SYSTEM.LNGLAT_OFFSETS ||\n coordinateSystem === COORDINATE_SYSTEM.METER_OFFSETS);\n const offsetOriginCommon = offsetMode\n ? viewport.projectPosition(this.props.coordinateOrigin)\n : [0, 0];\n const size = (textureSize * RESOLUTION) / viewport.scale;\n\n let bottomLeftCommon;\n let topRightCommon;\n\n // Y-axis is flipped between World and Common bounds\n if (useLayerCoordinateSystem && !offsetMode) {\n bottomLeftCommon = this.projectPosition([minLong, minLat, 0]);\n topRightCommon = this.projectPosition([maxLong, maxLat, 0]);\n } else {\n bottomLeftCommon = viewport.projectPosition([minLong, minLat, 0]);\n topRightCommon = viewport.projectPosition([maxLong, maxLat, 0]);\n }\n // Ignore z component\n return scaleToAspectRatio(\n [\n bottomLeftCommon[0] - offsetOriginCommon[0],\n bottomLeftCommon[1] - offsetOriginCommon[1],\n topRightCommon[0] - offsetOriginCommon[0],\n topRightCommon[1] - offsetOriginCommon[1]\n ],\n size,\n size\n );\n }\n\n // input commonBounds: [xMin, yMin, xMax, yMax]\n // output worldBounds: [minLong, minLat, maxLong, maxLat]\n _commonToWorldBounds(commonBounds) {\n const [xMin, yMin, xMax, yMax] = commonBounds;\n const {viewport} = this.context;\n const bottomLeftWorld = viewport.unprojectPosition([xMin, yMin]);\n const topRightWorld = viewport.unprojectPosition([xMax, yMax]);\n\n return bottomLeftWorld.slice(0, 2).concat(topRightWorld.slice(0, 2));\n }\n}\n\nHeatmapLayer.layerName = 'HeatmapLayer';\nHeatmapLayer.defaultProps = defaultProps;\n"],"file":"heatmap-layer.js"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getBounds, boundsContain, packVertices, scaleToAspectRatio, getTextureCoordinates, getTextureParams } from './heatmap-layer-utils';
|
|
2
2
|
import { Buffer, Texture2D, Transform, getParameters, FEATURES, hasFeatures } from '@luma.gl/core';
|
|
3
|
-
import { AttributeManager, COORDINATE_SYSTEM, log
|
|
3
|
+
import { AttributeManager, COORDINATE_SYSTEM, log } from '@deck.gl/core';
|
|
4
4
|
import TriangleLayer from './triangle-layer';
|
|
5
5
|
import AggregationLayer from '../aggregation-layer';
|
|
6
6
|
import { defaultColorRange, colorRangeToFlatArray } from '../utils/color-utils';
|
|
@@ -9,8 +9,6 @@ import weights_fs from './weights-fs.glsl';
|
|
|
9
9
|
import vs_max from './max-vs.glsl';
|
|
10
10
|
import fs_max from './max-fs.glsl';
|
|
11
11
|
const RESOLUTION = 2;
|
|
12
|
-
const SIZE_2K = 2048;
|
|
13
|
-
const ZOOM_DEBOUNCE = 500;
|
|
14
12
|
const TEXTURE_OPTIONS = {
|
|
15
13
|
mipmaps: false,
|
|
16
14
|
parameters: {
|
|
@@ -58,7 +56,19 @@ const defaultProps = {
|
|
|
58
56
|
value: null,
|
|
59
57
|
optional: true
|
|
60
58
|
},
|
|
61
|
-
aggregation: 'SUM'
|
|
59
|
+
aggregation: 'SUM',
|
|
60
|
+
weightsTextureSize: {
|
|
61
|
+
type: 'number',
|
|
62
|
+
min: 128,
|
|
63
|
+
max: 2048,
|
|
64
|
+
value: 2048
|
|
65
|
+
},
|
|
66
|
+
debounceTimeout: {
|
|
67
|
+
type: 'number',
|
|
68
|
+
min: 0,
|
|
69
|
+
max: 1000,
|
|
70
|
+
value: 500
|
|
71
|
+
}
|
|
62
72
|
};
|
|
63
73
|
const REQUIRED_FEATURES = [FEATURES.BLEND_EQUATION_MINMAX, FEATURES.TEXTURE_FLOAT];
|
|
64
74
|
const DIMENSIONS = {
|
|
@@ -105,6 +115,11 @@ export default class HeatmapLayer extends AggregationLayer {
|
|
|
105
115
|
}
|
|
106
116
|
|
|
107
117
|
super.updateState(opts);
|
|
118
|
+
|
|
119
|
+
this._updateHeatmapState(opts);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
_updateHeatmapState(opts) {
|
|
108
123
|
const {
|
|
109
124
|
props,
|
|
110
125
|
oldProps
|
|
@@ -279,7 +294,10 @@ export default class HeatmapLayer extends AggregationLayer {
|
|
|
279
294
|
const {
|
|
280
295
|
gl
|
|
281
296
|
} = this.context;
|
|
282
|
-
const
|
|
297
|
+
const {
|
|
298
|
+
weightsTextureSize
|
|
299
|
+
} = this.props;
|
|
300
|
+
const textureSize = Math.min(weightsTextureSize, getParameters(gl, 3379));
|
|
283
301
|
const floatTargetSupport = hasFeatures(gl, FEATURES.COLOR_ATTACHMENT_RGBA32F);
|
|
284
302
|
const {
|
|
285
303
|
format,
|
|
@@ -301,7 +319,17 @@ export default class HeatmapLayer extends AggregationLayer {
|
|
|
301
319
|
}
|
|
302
320
|
}
|
|
303
321
|
|
|
304
|
-
|
|
322
|
+
getShaders(type) {
|
|
323
|
+
return super.getShaders(type === 'max-weights-transform' ? {
|
|
324
|
+
vs: vs_max,
|
|
325
|
+
_fs: fs_max
|
|
326
|
+
} : {
|
|
327
|
+
vs: weights_vs,
|
|
328
|
+
_fs: weights_fs
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
_createWeightsTransform(shaders = {}) {
|
|
305
333
|
var _weightsTransform;
|
|
306
334
|
|
|
307
335
|
const {
|
|
@@ -314,10 +342,6 @@ export default class HeatmapLayer extends AggregationLayer {
|
|
|
314
342
|
weightsTexture
|
|
315
343
|
} = this.state;
|
|
316
344
|
(_weightsTransform = weightsTransform) === null || _weightsTransform === void 0 ? void 0 : _weightsTransform.delete();
|
|
317
|
-
const shaders = mergeShaders({
|
|
318
|
-
vs: weights_vs,
|
|
319
|
-
_fs: weights_fs
|
|
320
|
-
}, shaderOptions);
|
|
321
345
|
weightsTransform = new Transform(gl, {
|
|
322
346
|
id: "".concat(this.id, "-weights-transform"),
|
|
323
347
|
elementCount: 1,
|
|
@@ -342,9 +366,11 @@ export default class HeatmapLayer extends AggregationLayer {
|
|
|
342
366
|
weightsTexture,
|
|
343
367
|
maxWeightsTexture
|
|
344
368
|
} = this.state;
|
|
369
|
+
const weightsTransformShaders = this.getShaders('weights-transform');
|
|
345
370
|
|
|
346
|
-
this._createWeightsTransform();
|
|
371
|
+
this._createWeightsTransform(weightsTransformShaders);
|
|
347
372
|
|
|
373
|
+
const maxWeightsTransformShaders = this.getShaders('max-weights-transform');
|
|
348
374
|
const maxWeightTransform = new Transform(gl, {
|
|
349
375
|
id: "".concat(this.id, "-max-weights-transform"),
|
|
350
376
|
_sourceTextures: {
|
|
@@ -352,8 +378,7 @@ export default class HeatmapLayer extends AggregationLayer {
|
|
|
352
378
|
},
|
|
353
379
|
_targetTexture: maxWeightsTexture,
|
|
354
380
|
_targetTextureVarying: 'outTexture',
|
|
355
|
-
|
|
356
|
-
_fs: fs_max,
|
|
381
|
+
...maxWeightsTransformShaders,
|
|
357
382
|
elementCount: textureSize * textureSize
|
|
358
383
|
});
|
|
359
384
|
this.setState({
|
|
@@ -535,6 +560,9 @@ export default class HeatmapLayer extends AggregationLayer {
|
|
|
535
560
|
let {
|
|
536
561
|
updateTimer
|
|
537
562
|
} = this.state;
|
|
563
|
+
const {
|
|
564
|
+
debounceTimeout
|
|
565
|
+
} = this.props;
|
|
538
566
|
|
|
539
567
|
if (fromTimer) {
|
|
540
568
|
updateTimer = null;
|
|
@@ -551,7 +579,7 @@ export default class HeatmapLayer extends AggregationLayer {
|
|
|
551
579
|
isWeightMapDirty: false
|
|
552
580
|
});
|
|
553
581
|
clearTimeout(updateTimer);
|
|
554
|
-
updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true),
|
|
582
|
+
updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true), debounceTimeout);
|
|
555
583
|
}
|
|
556
584
|
|
|
557
585
|
this.setState({
|