@deck.gl/aggregation-layers 8.8.0-alpha.6 → 8.8.0-beta.3

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.
Files changed (188) hide show
  1. package/dist/dist.dev.js +515 -407
  2. package/dist/es5/aggregation-layer.js +19 -7
  3. package/dist/es5/aggregation-layer.js.map +1 -1
  4. package/dist/es5/contour-layer/contour-layer.js +5 -5
  5. package/dist/es5/contour-layer/contour-layer.js.map +1 -1
  6. package/dist/es5/contour-layer/contour-utils.js +1 -1
  7. package/dist/es5/contour-layer/contour-utils.js.map +1 -1
  8. package/dist/es5/contour-layer/marching-squares-codes.js.map +1 -1
  9. package/dist/es5/contour-layer/marching-squares.js.map +1 -1
  10. package/dist/es5/cpu-grid-layer/cpu-grid-layer.js +5 -3
  11. package/dist/es5/cpu-grid-layer/cpu-grid-layer.js.map +1 -1
  12. package/dist/es5/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.js +1 -1
  13. package/dist/es5/gpu-grid-layer/gpu-grid-cell-layer.js +8 -12
  14. package/dist/es5/gpu-grid-layer/gpu-grid-cell-layer.js.map +1 -1
  15. package/dist/es5/gpu-grid-layer/gpu-grid-layer.js +12 -12
  16. package/dist/es5/gpu-grid-layer/gpu-grid-layer.js.map +1 -1
  17. package/dist/es5/grid-aggregation-layer.js +25 -12
  18. package/dist/es5/grid-aggregation-layer.js.map +1 -1
  19. package/dist/es5/grid-layer/grid-layer.js +18 -9
  20. package/dist/es5/grid-layer/grid-layer.js.map +1 -1
  21. package/dist/es5/heatmap-layer/heatmap-layer-utils.js.map +1 -1
  22. package/dist/es5/heatmap-layer/heatmap-layer.js +17 -6
  23. package/dist/es5/heatmap-layer/heatmap-layer.js.map +1 -1
  24. package/dist/es5/heatmap-layer/max-vs.glsl.js +1 -1
  25. package/dist/es5/heatmap-layer/triangle-layer-fragment.glsl.js +1 -1
  26. package/dist/es5/heatmap-layer/triangle-layer-vertex.glsl.js +1 -1
  27. package/dist/es5/heatmap-layer/triangle-layer.js +7 -7
  28. package/dist/es5/heatmap-layer/triangle-layer.js.map +1 -1
  29. package/dist/es5/heatmap-layer/weights-fs.glsl.js +1 -1
  30. package/dist/es5/heatmap-layer/weights-vs.glsl.js +1 -1
  31. package/dist/es5/hexagon-layer/hexagon-layer.js +16 -5
  32. package/dist/es5/hexagon-layer/hexagon-layer.js.map +1 -1
  33. package/dist/es5/index.js.map +1 -1
  34. package/dist/es5/screen-grid-layer/screen-grid-cell-layer.js +26 -19
  35. package/dist/es5/screen-grid-layer/screen-grid-cell-layer.js.map +1 -1
  36. package/dist/es5/screen-grid-layer/screen-grid-layer-vertex.glsl.js +1 -1
  37. package/dist/es5/screen-grid-layer/screen-grid-layer.js +18 -8
  38. package/dist/es5/screen-grid-layer/screen-grid-layer.js.map +1 -1
  39. package/dist/es5/types.js +2 -0
  40. package/dist/es5/types.js.map +1 -0
  41. package/dist/es5/utils/bin-sorter.js +9 -0
  42. package/dist/es5/utils/bin-sorter.js.map +1 -1
  43. package/dist/es5/utils/color-utils.js.map +1 -1
  44. package/dist/esm/aggregation-layer.js +12 -5
  45. package/dist/esm/aggregation-layer.js.map +1 -1
  46. package/dist/esm/contour-layer/contour-layer.js +6 -3
  47. package/dist/esm/contour-layer/contour-layer.js.map +1 -1
  48. package/dist/esm/contour-layer/contour-utils.js +1 -1
  49. package/dist/esm/contour-layer/contour-utils.js.map +1 -1
  50. package/dist/esm/contour-layer/marching-squares-codes.js.map +1 -1
  51. package/dist/esm/contour-layer/marching-squares.js.map +1 -1
  52. package/dist/esm/cpu-grid-layer/cpu-grid-layer.js +6 -3
  53. package/dist/esm/cpu-grid-layer/cpu-grid-layer.js.map +1 -1
  54. package/dist/esm/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.js.map +1 -1
  55. package/dist/esm/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.js +1 -1
  56. package/dist/esm/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.js.map +1 -1
  57. package/dist/esm/gpu-grid-layer/gpu-grid-cell-layer.js +8 -10
  58. package/dist/esm/gpu-grid-layer/gpu-grid-cell-layer.js.map +1 -1
  59. package/dist/esm/gpu-grid-layer/gpu-grid-layer.js +11 -9
  60. package/dist/esm/gpu-grid-layer/gpu-grid-layer.js.map +1 -1
  61. package/dist/esm/grid-aggregation-layer.js +13 -5
  62. package/dist/esm/grid-aggregation-layer.js.map +1 -1
  63. package/dist/esm/grid-layer/grid-layer.js +15 -8
  64. package/dist/esm/grid-layer/grid-layer.js.map +1 -1
  65. package/dist/esm/heatmap-layer/heatmap-layer-utils.js.map +1 -1
  66. package/dist/esm/heatmap-layer/heatmap-layer.js +22 -13
  67. package/dist/esm/heatmap-layer/heatmap-layer.js.map +1 -1
  68. package/dist/esm/heatmap-layer/max-fs.glsl.js.map +1 -1
  69. package/dist/esm/heatmap-layer/max-vs.glsl.js +1 -1
  70. package/dist/esm/heatmap-layer/max-vs.glsl.js.map +1 -1
  71. package/dist/esm/heatmap-layer/triangle-layer-fragment.glsl.js +1 -1
  72. package/dist/esm/heatmap-layer/triangle-layer-fragment.glsl.js.map +1 -1
  73. package/dist/esm/heatmap-layer/triangle-layer-vertex.glsl.js +1 -1
  74. package/dist/esm/heatmap-layer/triangle-layer-vertex.glsl.js.map +1 -1
  75. package/dist/esm/heatmap-layer/triangle-layer.js +6 -5
  76. package/dist/esm/heatmap-layer/triangle-layer.js.map +1 -1
  77. package/dist/esm/heatmap-layer/weights-fs.glsl.js +1 -1
  78. package/dist/esm/heatmap-layer/weights-fs.glsl.js.map +1 -1
  79. package/dist/esm/heatmap-layer/weights-vs.glsl.js +1 -1
  80. package/dist/esm/heatmap-layer/weights-vs.glsl.js.map +1 -1
  81. package/dist/esm/hexagon-layer/hexagon-layer.js +11 -2
  82. package/dist/esm/hexagon-layer/hexagon-layer.js.map +1 -1
  83. package/dist/esm/index.js.map +1 -1
  84. package/dist/esm/screen-grid-layer/screen-grid-cell-layer.js +16 -10
  85. package/dist/esm/screen-grid-layer/screen-grid-cell-layer.js.map +1 -1
  86. package/dist/esm/screen-grid-layer/screen-grid-layer-fragment.glsl.js.map +1 -1
  87. package/dist/esm/screen-grid-layer/screen-grid-layer-vertex.glsl.js +1 -1
  88. package/dist/esm/screen-grid-layer/screen-grid-layer-vertex.glsl.js.map +1 -1
  89. package/dist/esm/screen-grid-layer/screen-grid-layer.js +15 -7
  90. package/dist/esm/screen-grid-layer/screen-grid-layer.js.map +1 -1
  91. package/dist/esm/types.js +2 -0
  92. package/dist/esm/types.js.map +1 -0
  93. package/dist/esm/utils/bin-sorter.js +16 -0
  94. package/dist/esm/utils/bin-sorter.js.map +1 -1
  95. package/dist/esm/utils/color-utils.js.map +1 -1
  96. package/dist.min.js +1 -1
  97. package/package.json +7 -5
  98. package/src/{aggregation-layer.js → aggregation-layer.ts} +32 -15
  99. package/src/contour-layer/{contour-layer.js → contour-layer.ts} +97 -16
  100. package/src/contour-layer/{contour-utils.js → contour-utils.ts} +11 -5
  101. package/src/contour-layer/{marching-squares-codes.js → marching-squares-codes.ts} +0 -0
  102. package/src/contour-layer/{marching-squares.js → marching-squares.ts} +6 -6
  103. package/src/cpu-grid-layer/cpu-grid-layer.ts +324 -0
  104. package/src/gpu-grid-layer/{gpu-grid-cell-layer-fragment.glsl.js → gpu-grid-cell-layer-fragment.glsl.ts} +0 -0
  105. package/src/gpu-grid-layer/{gpu-grid-cell-layer-vertex.glsl.js → gpu-grid-cell-layer-vertex.glsl.ts} +0 -0
  106. package/src/gpu-grid-layer/{gpu-grid-cell-layer.js → gpu-grid-cell-layer.ts} +36 -19
  107. package/src/gpu-grid-layer/{gpu-grid-layer.js → gpu-grid-layer.ts} +125 -18
  108. package/src/{grid-aggregation-layer.js → grid-aggregation-layer.ts} +25 -13
  109. package/src/grid-layer/{grid-layer.js → grid-layer.ts} +45 -14
  110. package/src/heatmap-layer/{heatmap-layer-utils.js → heatmap-layer-utils.ts} +5 -5
  111. package/src/heatmap-layer/{heatmap-layer.js → heatmap-layer.ts} +141 -30
  112. package/src/heatmap-layer/{max-fs.glsl.js → max-fs.glsl.ts} +0 -0
  113. package/src/heatmap-layer/{max-vs.glsl.js → max-vs.glsl.ts} +0 -0
  114. package/src/heatmap-layer/{triangle-layer-fragment.glsl.js → triangle-layer-fragment.glsl.ts} +0 -0
  115. package/src/heatmap-layer/{triangle-layer-vertex.glsl.js → triangle-layer-vertex.glsl.ts} +0 -0
  116. package/src/heatmap-layer/{triangle-layer.js → triangle-layer.ts} +20 -10
  117. package/src/heatmap-layer/{weights-fs.glsl.js → weights-fs.glsl.ts} +0 -0
  118. package/src/heatmap-layer/{weights-vs.glsl.js → weights-vs.glsl.ts} +0 -0
  119. package/src/hexagon-layer/{hexagon-layer.js → hexagon-layer.ts} +194 -9
  120. package/src/index.ts +9 -0
  121. package/src/screen-grid-layer/{screen-grid-cell-layer.js → screen-grid-cell-layer.ts} +33 -15
  122. package/src/screen-grid-layer/{screen-grid-layer-fragment.glsl.js → screen-grid-layer-fragment.glsl.ts} +0 -0
  123. package/src/screen-grid-layer/{screen-grid-layer-vertex.glsl.js → screen-grid-layer-vertex.glsl.ts} +0 -0
  124. package/src/screen-grid-layer/{screen-grid-layer.js → screen-grid-layer.ts} +119 -16
  125. package/src/types.ts +10 -0
  126. package/src/utils/{bin-sorter.js → bin-sorter.ts} +26 -11
  127. package/src/utils/{color-utils.js → color-utils.ts} +1 -1
  128. package/typed/aggregation-layer.d.ts +16 -11
  129. package/typed/aggregation-layer.d.ts.map +1 -1
  130. package/typed/contour-layer/contour-layer.d.ts +71 -36
  131. package/typed/contour-layer/contour-layer.d.ts.map +1 -1
  132. package/typed/contour-layer/contour-utils.d.ts +8 -9
  133. package/typed/contour-layer/contour-utils.d.ts.map +1 -1
  134. package/typed/contour-layer/marching-squares-codes.d.ts +2 -2
  135. package/typed/contour-layer/marching-squares-codes.d.ts.map +1 -1
  136. package/typed/contour-layer/marching-squares.d.ts +6 -6
  137. package/typed/contour-layer/marching-squares.d.ts.map +1 -1
  138. package/typed/cpu-grid-layer/cpu-grid-layer.d.ts +147 -126
  139. package/typed/cpu-grid-layer/cpu-grid-layer.d.ts.map +1 -1
  140. package/typed/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.d.ts +1 -1
  141. package/typed/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.d.ts.map +1 -1
  142. package/typed/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.d.ts +1 -1
  143. package/typed/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.d.ts.map +1 -1
  144. package/typed/gpu-grid-layer/gpu-grid-cell-layer.d.ts +30 -81
  145. package/typed/gpu-grid-layer/gpu-grid-cell-layer.d.ts.map +1 -1
  146. package/typed/gpu-grid-layer/gpu-grid-layer.d.ts +93 -62
  147. package/typed/gpu-grid-layer/gpu-grid-layer.d.ts.map +1 -1
  148. package/typed/grid-aggregation-layer.d.ts +19 -6
  149. package/typed/grid-aggregation-layer.d.ts.map +1 -1
  150. package/typed/grid-layer/grid-layer.d.ts +29 -91
  151. package/typed/grid-layer/grid-layer.d.ts.map +1 -1
  152. package/typed/heatmap-layer/heatmap-layer-utils.d.ts +6 -6
  153. package/typed/heatmap-layer/heatmap-layer-utils.d.ts.map +1 -1
  154. package/typed/heatmap-layer/heatmap-layer.d.ts +102 -82
  155. package/typed/heatmap-layer/heatmap-layer.d.ts.map +1 -1
  156. package/typed/heatmap-layer/max-fs.glsl.d.ts +1 -1
  157. package/typed/heatmap-layer/max-fs.glsl.d.ts.map +1 -1
  158. package/typed/heatmap-layer/max-vs.glsl.d.ts +1 -1
  159. package/typed/heatmap-layer/max-vs.glsl.d.ts.map +1 -1
  160. package/typed/heatmap-layer/triangle-layer-fragment.glsl.d.ts +1 -1
  161. package/typed/heatmap-layer/triangle-layer-fragment.glsl.d.ts.map +1 -1
  162. package/typed/heatmap-layer/triangle-layer-vertex.glsl.d.ts +1 -1
  163. package/typed/heatmap-layer/triangle-layer-vertex.glsl.d.ts.map +1 -1
  164. package/typed/heatmap-layer/triangle-layer.d.ts +25 -8
  165. package/typed/heatmap-layer/triangle-layer.d.ts.map +1 -1
  166. package/typed/heatmap-layer/weights-fs.glsl.d.ts +1 -1
  167. package/typed/heatmap-layer/weights-fs.glsl.d.ts.map +1 -1
  168. package/typed/heatmap-layer/weights-vs.glsl.d.ts +1 -1
  169. package/typed/heatmap-layer/weights-vs.glsl.d.ts.map +1 -1
  170. package/typed/hexagon-layer/hexagon-layer.d.ts +160 -125
  171. package/typed/hexagon-layer/hexagon-layer.d.ts.map +1 -1
  172. package/typed/index.d.ts +7 -0
  173. package/typed/index.d.ts.map +1 -1
  174. package/typed/screen-grid-layer/screen-grid-cell-layer.d.ts +34 -25
  175. package/typed/screen-grid-layer/screen-grid-cell-layer.d.ts.map +1 -1
  176. package/typed/screen-grid-layer/screen-grid-layer-fragment.glsl.d.ts +1 -1
  177. package/typed/screen-grid-layer/screen-grid-layer-fragment.glsl.d.ts.map +1 -1
  178. package/typed/screen-grid-layer/screen-grid-layer-vertex.glsl.d.ts +1 -1
  179. package/typed/screen-grid-layer/screen-grid-layer-vertex.glsl.d.ts.map +1 -1
  180. package/typed/screen-grid-layer/screen-grid-layer.d.ts +91 -30
  181. package/typed/screen-grid-layer/screen-grid-layer.d.ts.map +1 -1
  182. package/typed/types.d.ts +11 -0
  183. package/typed/types.d.ts.map +1 -0
  184. package/typed/utils/bin-sorter.d.ts +27 -21
  185. package/typed/utils/bin-sorter.d.ts.map +1 -1
  186. package/typed/utils/color-utils.d.ts +2 -2
  187. package/typed/utils/color-utils.d.ts.map +1 -1
  188. package/src/cpu-grid-layer/cpu-grid-layer.js +0 -153
@@ -18,18 +18,32 @@
18
18
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  // THE SOFTWARE.
20
20
 
21
- import AggregationLayer from './aggregation-layer';
21
+ import AggregationLayer, {AggregationLayerProps} from './aggregation-layer';
22
22
  import GPUGridAggregator from './utils/gpu-grid-aggregation/gpu-grid-aggregator';
23
23
  import {Buffer} from '@luma.gl/core';
24
- import {log} from '@deck.gl/core';
24
+ import {LayerContext, log, UpdateParameters} from '@deck.gl/core';
25
25
  import GL from '@luma.gl/constants';
26
26
  import BinSorter from './utils/bin-sorter';
27
27
  import {pointToDensityGridDataCPU} from './cpu-grid-layer/grid-aggregator';
28
28
 
29
- export default class GridAggregationLayer extends AggregationLayer {
30
- initializeState({dimensions}) {
29
+ export type GridAggregationLayerProps<DataT = any> = AggregationLayerProps<DataT>;
30
+
31
+ export default abstract class GridAggregationLayer<
32
+ ExtraPropsT = {}
33
+ > extends AggregationLayer<ExtraPropsT> {
34
+ static layerName = 'GridAggregationLayer';
35
+
36
+ state!: AggregationLayer['state'] & {
37
+ aggregationDataDirty?: any;
38
+ aggregationWeightsDirty?: any;
39
+ gpuAggregation?: any;
40
+ getValue?: () => any;
41
+ sortedBins?: BinSorter;
42
+ };
43
+
44
+ initializeAggregationLayer({dimensions}) {
31
45
  const {gl} = this.context;
32
- super.initializeState(dimensions);
46
+ super.initializeAggregationLayer(dimensions);
33
47
  this.setState({
34
48
  // CPU aggregation results
35
49
  layerData: {},
@@ -38,7 +52,7 @@ export default class GridAggregationLayer extends AggregationLayer {
38
52
  });
39
53
  }
40
54
 
41
- updateState(opts) {
55
+ updateState(opts: UpdateParameters<this>) {
42
56
  // get current attributes
43
57
  super.updateState(opts);
44
58
 
@@ -68,16 +82,16 @@ export default class GridAggregationLayer extends AggregationLayer {
68
82
  this.setState({aggregationDirty});
69
83
  }
70
84
 
71
- finalizeState() {
85
+ finalizeState(context: LayerContext) {
72
86
  const {count} = this.state.weights;
73
87
  if (count && count.aggregationBuffer) {
74
88
  count.aggregationBuffer.delete();
75
89
  }
76
90
  this.state.gpuGridAggregator?.delete();
77
- super.finalizeState();
91
+ super.finalizeState(context);
78
92
  }
79
93
 
80
- updateShaders(shaders) {
94
+ updateShaders(shaders: any): void {
81
95
  if (this.state.gpuAggregation) {
82
96
  this.state.gpuGridAggregator.updateShaders(shaders);
83
97
  }
@@ -179,10 +193,10 @@ export default class GridAggregationLayer extends AggregationLayer {
179
193
  this.setState({sortedBins});
180
194
  }
181
195
 
182
- _uploadAggregationResults() {
196
+ _uploadAggregationResults(): void {
183
197
  const {numCol, numRow} = this.state;
184
198
  const {data} = this.state.layerData;
185
- const {aggregatedBins, minValue, maxValue, totalCount} = this.state.sortedBins;
199
+ const {aggregatedBins, minValue, maxValue, totalCount} = this.state.sortedBins!;
186
200
 
187
201
  const ELEMENTCOUNT = 4;
188
202
  const aggregationSize = numCol * numRow * ELEMENTCOUNT;
@@ -200,5 +214,3 @@ export default class GridAggregationLayer extends AggregationLayer {
200
214
  this.updateResults({aggregationData, maxMinData, maxData, minData});
201
215
  }
202
216
  }
203
-
204
- GridAggregationLayer.layerName = 'GridAggregationLayer';
@@ -1,28 +1,62 @@
1
- import {CompositeLayer} from '@deck.gl/core';
1
+ import {
2
+ CompositeLayer,
3
+ CompositeLayerProps,
4
+ Layer,
5
+ UpdateParameters,
6
+ DefaultProps
7
+ } from '@deck.gl/core';
2
8
  import GPUGridAggregator from '../utils/gpu-grid-aggregation/gpu-grid-aggregator';
3
- import GPUGridLayer from '../gpu-grid-layer/gpu-grid-layer';
4
- import CPUGridLayer from '../cpu-grid-layer/cpu-grid-layer';
9
+ import GPUGridLayer, {_GPUGridLayerProps} from '../gpu-grid-layer/gpu-grid-layer';
10
+ import CPUGridLayer, {_CPUGridLayerProps} from '../cpu-grid-layer/cpu-grid-layer';
5
11
 
6
- const defaultProps = {
12
+ const defaultProps: DefaultProps<GridLayerProps> = {
7
13
  ...GPUGridLayer.defaultProps,
8
14
  ...CPUGridLayer.defaultProps,
9
15
  gpuAggregation: false
10
16
  };
11
17
 
12
- export default class GridLayer extends CompositeLayer {
18
+ /** All properties supported by GridLayer. */
19
+ export type GridLayerProps<DataT = any> = _GridLayerProps<DataT> & CompositeLayerProps<DataT>;
20
+
21
+ /** Properties added by GridLayer. */
22
+ type _GridLayerProps<DataT> = _CPUGridLayerProps<DataT> &
23
+ _GPUGridLayerProps<DataT> & {
24
+ /**
25
+ * Whether the aggregation should be performed in high-precision 64-bit mode.
26
+ * @default false
27
+ */
28
+ fp64?: boolean;
29
+
30
+ /**
31
+ * When set to true, aggregation is performed on GPU, provided other conditions are met.
32
+ * @default false
33
+ */
34
+ gpuAggregation?: boolean;
35
+ };
36
+
37
+ export default class GridLayer<DataT = any, ExtraPropsT = {}> extends CompositeLayer<
38
+ ExtraPropsT & Required<_GridLayerProps<DataT>>
39
+ > {
40
+ static layerName = 'GridLayer';
41
+ static defaultProps = defaultProps;
42
+
43
+ state!: CompositeLayer['state'] & {
44
+ useGPUAggregation: boolean;
45
+ };
46
+
13
47
  initializeState() {
14
48
  this.state = {
15
49
  useGPUAggregation: true
16
50
  };
17
51
  }
18
52
 
19
- updateState({oldProps, props, changeFlags}) {
20
- const newState = {};
21
- newState.useGPUAggregation = this.canUseGPUAggregation(props);
22
- this.setState(newState);
53
+ updateState({props}: UpdateParameters<this>) {
54
+ this.setState({
55
+ useGPUAggregation: this.canUseGPUAggregation(props)
56
+ });
23
57
  }
24
58
 
25
- renderLayers() {
59
+ renderLayers(): Layer {
26
60
  const {data, updateTriggers} = this.props;
27
61
  const id = this.state.useGPUAggregation ? 'GPU' : 'CPU';
28
62
  const LayerType = this.state.useGPUAggregation
@@ -42,7 +76,7 @@ export default class GridLayer extends CompositeLayer {
42
76
 
43
77
  // Private methods
44
78
 
45
- canUseGPUAggregation(props) {
79
+ canUseGPUAggregation(props: GridLayer['props']) {
46
80
  const {
47
81
  gpuAggregation,
48
82
  lowerPercentile,
@@ -73,6 +107,3 @@ export default class GridLayer extends CompositeLayer {
73
107
  return true;
74
108
  }
75
109
  }
76
-
77
- GridLayer.layerName = 'GridLayer';
78
- GridLayer.defaultProps = defaultProps;
@@ -1,7 +1,7 @@
1
1
  import GL from '@luma.gl/constants';
2
2
  import {isWebGL2} from '@luma.gl/core';
3
3
 
4
- export function getBounds(points) {
4
+ export function getBounds(points: number[][]): number[] {
5
5
  // Now build bounding box in world space (aligned to world coordiante system)
6
6
  const x = points.map(p => p[0]);
7
7
  const y = points.map(p => p[1]);
@@ -15,7 +15,7 @@ export function getBounds(points) {
15
15
  }
16
16
 
17
17
  // true if currentBounds contains targetBounds, false otherwise
18
- export function boundsContain(currentBounds, targetBounds) {
18
+ export function boundsContain(currentBounds: number[], targetBounds: number[]): boolean {
19
19
  if (
20
20
  targetBounds[0] >= currentBounds[0] &&
21
21
  targetBounds[2] <= currentBounds[2] &&
@@ -30,7 +30,7 @@ export function boundsContain(currentBounds, targetBounds) {
30
30
  const scratchArray = new Float32Array(12);
31
31
 
32
32
  // For given rectangle bounds generates two triangles vertices that coverit completely
33
- export function packVertices(points, dimensions = 2) {
33
+ export function packVertices(points: number[][], dimensions: number = 2): Float32Array {
34
34
  let index = 0;
35
35
  for (const point of points) {
36
36
  for (let i = 0; i < dimensions; i++) {
@@ -41,7 +41,7 @@ export function packVertices(points, dimensions = 2) {
41
41
  }
42
42
 
43
43
  // Expands boundingBox:[xMin, yMin, xMax, yMax] to match aspect ratio of given width and height
44
- export function scaleToAspectRatio(boundingBox, width, height) {
44
+ export function scaleToAspectRatio(boundingBox: number[], width: number, height: number): number[] {
45
45
  const [xMin, yMin, xMax, yMax] = boundingBox;
46
46
 
47
47
  const currentWidth = xMax - xMin;
@@ -73,7 +73,7 @@ export function scaleToAspectRatio(boundingBox, width, height) {
73
73
  }
74
74
 
75
75
  // Get texture coordiante of point inside a bounding box
76
- export function getTextureCoordinates(point, bounds) {
76
+ export function getTextureCoordinates(point: number[], bounds: number[]) {
77
77
  const [xMin, yMin, xMax, yMax] = bounds;
78
78
  return [(point[0] - xMin) / (xMax - xMin), (point[1] - yMin) / (yMax - yMin)];
79
79
  }
@@ -29,14 +29,28 @@ import {
29
29
  getTextureParams
30
30
  } from './heatmap-layer-utils';
31
31
  import {Buffer, Texture2D, Transform, getParameters, FEATURES, hasFeatures} from '@luma.gl/core';
32
- import {AttributeManager, COORDINATE_SYSTEM, log} from '@deck.gl/core';
32
+ import {
33
+ Accessor,
34
+ AccessorFunction,
35
+ AttributeManager,
36
+ ChangeFlags,
37
+ Color,
38
+ COORDINATE_SYSTEM,
39
+ Layer,
40
+ LayerContext,
41
+ LayersList,
42
+ log,
43
+ Position,
44
+ UpdateParameters,
45
+ DefaultProps
46
+ } from '@deck.gl/core';
33
47
  import TriangleLayer from './triangle-layer';
34
- import AggregationLayer from '../aggregation-layer';
48
+ import AggregationLayer, {AggregationLayerProps} from '../aggregation-layer';
35
49
  import {defaultColorRange, colorRangeToFlatArray} from '../utils/color-utils';
36
- import weights_vs from './weights-vs.glsl';
37
- import weights_fs from './weights-fs.glsl';
38
- import vs_max from './max-vs.glsl';
39
- import fs_max from './max-fs.glsl';
50
+ import weightsVs from './weights-vs.glsl';
51
+ import weightsFs from './weights-fs.glsl';
52
+ import vsMax from './max-vs.glsl';
53
+ import fsMax from './max-fs.glsl';
40
54
 
41
55
  const RESOLUTION = 2; // (number of common space pixels) / (number texels)
42
56
  const TEXTURE_OPTIONS = {
@@ -55,7 +69,7 @@ const AGGREGATION_MODE = {
55
69
  MEAN: 1
56
70
  };
57
71
 
58
- const defaultProps = {
72
+ const defaultProps: DefaultProps<HeatmapLayerProps> = {
59
73
  getPosition: {type: 'accessor', value: x => x.position},
60
74
  getWeight: {type: 'accessor', value: 1},
61
75
  intensity: {type: 'number', min: 0, value: 1},
@@ -85,7 +99,104 @@ const DIMENSIONS = {
85
99
  }
86
100
  };
87
101
 
88
- export default class HeatmapLayer extends AggregationLayer {
102
+ export type HeatmapLayerProps<DataT = any> = _HeatmapLayerProps<DataT> &
103
+ AggregationLayerProps<DataT>;
104
+
105
+ type _HeatmapLayerProps<DataT> = {
106
+ /**
107
+ * Radius of the circle in pixels, to which the weight of an object is distributed.
108
+ *
109
+ * @default 30
110
+ */
111
+ radiusPixels?: number;
112
+
113
+ /**
114
+ * Specified as an array of colors [color1, color2, ...].
115
+ *
116
+ * @default `6-class YlOrRd` - [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6)
117
+ */
118
+ colorRange?: Color[];
119
+
120
+ /**
121
+ * Value that is multiplied with the total weight at a pixel to obtain the final weight.
122
+ *
123
+ * @default 1
124
+ */
125
+ intensity?: number;
126
+
127
+ /**
128
+ * Ratio of the fading weight to the max weight, between `0` and `1`.
129
+ *
130
+ * For example, `0.1` affects all pixels with weight under 10% of the max.
131
+ *
132
+ * Ignored when `colorDomain` is specified.
133
+ * @default 0.05
134
+ */
135
+ threshold?: number;
136
+
137
+ /**
138
+ * Controls how weight values are mapped to the `colorRange`, as an array of two numbers [`minValue`, `maxValue`].
139
+ *
140
+ * @default null
141
+ */
142
+ colorDomain?: [number, number] | null;
143
+
144
+ /**
145
+ * Defines the type of aggregation operation
146
+ *
147
+ * V valid values are 'SUM', 'MEAN'.
148
+ *
149
+ * @default 'SUM'
150
+ */
151
+ aggregation?: 'SUM' | 'MEAN';
152
+
153
+ /**
154
+ * Specifies the size of weight texture.
155
+ * @default 2048
156
+ */
157
+ weightsTextureSize?: number;
158
+
159
+ /**
160
+ * Interval in milliseconds during which changes to the viewport don't trigger aggregation.
161
+ *
162
+ * @default 500
163
+ */
164
+ debounceTimeout?: number;
165
+
166
+ /**
167
+ * Method called to retrieve the position of each object.
168
+ *
169
+ * @default d => d.position
170
+ */
171
+ getPosition?: AccessorFunction<DataT, Position>;
172
+
173
+ /**
174
+ * The weight of each object.
175
+ *
176
+ * @default 1
177
+ */
178
+ getWeight?: Accessor<DataT, number>;
179
+ };
180
+
181
+ export default class HeatmapLayer<DataT = any, ExtraPropsT = {}> extends AggregationLayer<
182
+ ExtraPropsT & Required<_HeatmapLayerProps<DataT>>
183
+ > {
184
+ static layerName = 'HeatmapLayer';
185
+ static defaultProps = defaultProps;
186
+
187
+ state!: AggregationLayer['state'] & {
188
+ supported: boolean;
189
+ colorDomain?: number[];
190
+ isWeightMapDirty?: boolean;
191
+ weightsTexture?: Texture2D;
192
+ zoom?: number;
193
+ worldBounds?: number[];
194
+ normalizedCommonBounds?: number[];
195
+ updateTimer?: any;
196
+ triPositionBuffer?: Buffer;
197
+ triTexCoordBuffer?: Buffer;
198
+ };
199
+
89
200
  initializeState() {
90
201
  const {gl} = this.context;
91
202
  if (!hasFeatures(gl, REQUIRED_FEATURES)) {
@@ -93,20 +204,20 @@ export default class HeatmapLayer extends AggregationLayer {
93
204
  log.error(`HeatmapLayer: ${this.id} is not supported on this browser`)();
94
205
  return;
95
206
  }
96
- super.initializeState(DIMENSIONS);
207
+ super.initializeAggregationLayer(DIMENSIONS);
97
208
  this.setState({supported: true, colorDomain: DEFAULT_COLOR_DOMAIN});
98
209
  this._setupTextureParams();
99
210
  this._setupAttributes();
100
211
  this._setupResources();
101
212
  }
102
213
 
103
- shouldUpdateState({changeFlags}) {
214
+ shouldUpdateState({changeFlags}: UpdateParameters<this>) {
104
215
  // Need to be updated when viewport changes
105
216
  return changeFlags.somethingChanged;
106
217
  }
107
218
 
108
219
  /* eslint-disable max-statements,complexity */
109
- updateState(opts) {
220
+ updateState(opts: UpdateParameters<this>) {
110
221
  if (!this.state.supported) {
111
222
  return;
112
223
  }
@@ -114,7 +225,7 @@ export default class HeatmapLayer extends AggregationLayer {
114
225
  this._updateHeatmapState(opts);
115
226
  }
116
227
 
117
- _updateHeatmapState(opts) {
228
+ _updateHeatmapState(opts: UpdateParameters<this>) {
118
229
  const {props, oldProps} = opts;
119
230
  const changeFlags = this._getChangeFlags(opts);
120
231
 
@@ -144,7 +255,7 @@ export default class HeatmapLayer extends AggregationLayer {
144
255
  this.setState({zoom: opts.context.viewport.zoom});
145
256
  }
146
257
 
147
- renderLayers() {
258
+ renderLayers(): LayersList | Layer {
148
259
  if (!this.state.supported) {
149
260
  return [];
150
261
  }
@@ -187,8 +298,8 @@ export default class HeatmapLayer extends AggregationLayer {
187
298
  );
188
299
  }
189
300
 
190
- finalizeState() {
191
- super.finalizeState();
301
+ finalizeState(context: LayerContext) {
302
+ super.finalizeState(context);
192
303
  const {
193
304
  weightsTransform,
194
305
  weightsTexture,
@@ -221,8 +332,11 @@ export default class HeatmapLayer extends AggregationLayer {
221
332
  });
222
333
  }
223
334
 
224
- _getChangeFlags(opts) {
225
- const changeFlags = {};
335
+ _getChangeFlags(opts: UpdateParameters<this>) {
336
+ const changeFlags: Partial<ChangeFlags> & {
337
+ boundsChanged?: boolean;
338
+ viewportZoomChanged?: boolean;
339
+ } = {};
226
340
  const {dimensions} = this.state;
227
341
  changeFlags.dataChanged =
228
342
  this.isAttributeChanged() || // if any attribute is changed
@@ -257,7 +371,7 @@ export default class HeatmapLayer extends AggregationLayer {
257
371
  }
258
372
 
259
373
  _setupAttributes() {
260
- const attributeManager = this.getAttributeManager();
374
+ const attributeManager = this.getAttributeManager()!;
261
375
  attributeManager.add({
262
376
  positions: {size: 3, type: GL.DOUBLE, accessor: 'getPosition'},
263
377
  weights: {size: 1, accessor: 'getWeight'}
@@ -285,12 +399,12 @@ export default class HeatmapLayer extends AggregationLayer {
285
399
  return super.getShaders(
286
400
  type === 'max-weights-transform'
287
401
  ? {
288
- vs: vs_max,
289
- _fs: fs_max
402
+ vs: vsMax,
403
+ _fs: fsMax
290
404
  }
291
405
  : {
292
- vs: weights_vs,
293
- _fs: weights_fs
406
+ vs: weightsVs,
407
+ _fs: weightsFs
294
408
  }
295
409
  );
296
410
  }
@@ -366,7 +480,7 @@ export default class HeatmapLayer extends AggregationLayer {
366
480
  }
367
481
 
368
482
  // Computes world bounds area that needs to be processed for generate heatmap
369
- _updateBounds(forceUpdate = false) {
483
+ _updateBounds(forceUpdate: any = false): boolean {
370
484
  const {viewport} = this.context;
371
485
 
372
486
  // Unproject all 4 corners of the current screen coordinates into world coordinates (lng/lat)
@@ -381,7 +495,7 @@ export default class HeatmapLayer extends AggregationLayer {
381
495
  // #1: get world bounds for current viewport extends
382
496
  const visibleWorldBounds = getBounds(viewportCorners); // TODO: Change to visible bounds
383
497
 
384
- const newState = {visibleWorldBounds, viewportCorners};
498
+ const newState: Partial<HeatmapLayer['state']> = {visibleWorldBounds, viewportCorners};
385
499
  let boundsChanged = false;
386
500
 
387
501
  if (
@@ -426,7 +540,7 @@ export default class HeatmapLayer extends AggregationLayer {
426
540
  triPositionBuffer.subData(packVertices(viewportCorners, 3));
427
541
 
428
542
  const textureBounds = viewportCorners.map(p =>
429
- getTextureCoordinates(viewport.projectPosition(p), normalizedCommonBounds)
543
+ getTextureCoordinates(viewport.projectPosition(p), normalizedCommonBounds!)
430
544
  );
431
545
  triTexCoordBuffer.subData(packVertices(textureBounds, 2));
432
546
  }
@@ -434,7 +548,7 @@ export default class HeatmapLayer extends AggregationLayer {
434
548
  _updateColorTexture(opts) {
435
549
  const {colorRange} = opts.props;
436
550
  let {colorTexture} = this.state;
437
- const colors = colorRangeToFlatArray(colorRange, false, Uint8Array);
551
+ const colors = colorRangeToFlatArray(colorRange, false, Uint8Array as any);
438
552
 
439
553
  if (colorTexture) {
440
554
  colorTexture.setImageData({
@@ -527,7 +641,7 @@ export default class HeatmapLayer extends AggregationLayer {
527
641
  // input: worldBounds: [minLong, minLat, maxLong, maxLat]
528
642
  // input: opts.useLayerCoordinateSystem : layers coordiante system is used
529
643
  // optput: commonBounds: [minX, minY, maxX, maxY] scaled to fit the current texture
530
- _worldToCommonBounds(worldBounds, opts = {}) {
644
+ _worldToCommonBounds(worldBounds, opts: {useLayerCoordinateSystem?: boolean} = {}) {
531
645
  const {useLayerCoordinateSystem = false} = opts;
532
646
  const [minLong, minLat, maxLong, maxLat] = worldBounds;
533
647
  const {viewport} = this.context;
@@ -578,6 +692,3 @@ export default class HeatmapLayer extends AggregationLayer {
578
692
  return bottomLeftWorld.slice(0, 2).concat(topRightWorld.slice(0, 2));
579
693
  }
580
694
  }
581
-
582
- HeatmapLayer.layerName = 'HeatmapLayer';
583
- HeatmapLayer.defaultProps = defaultProps;
@@ -19,19 +19,31 @@
19
19
  // THE SOFTWARE.
20
20
 
21
21
  import GL from '@luma.gl/constants';
22
- import {Model, Geometry} from '@luma.gl/core';
23
- import {Layer, project32} from '@deck.gl/core';
22
+ import {Model, Geometry, Texture2D} from '@luma.gl/core';
23
+ import {Layer, LayerContext, project32} from '@deck.gl/core';
24
24
  import vs from './triangle-layer-vertex.glsl';
25
25
  import fs from './triangle-layer-fragment.glsl';
26
26
 
27
- export default class TriangleLayer extends Layer {
27
+ type _TriangleLayerProps = {
28
+ colorDomain: number[];
29
+ aggregationMode: string;
30
+ threshold: number;
31
+ intensity: number;
32
+ vertexCount: number;
33
+ colorTexture: Texture2D;
34
+ maxTexture: Texture2D;
35
+ texture: Texture2D;
36
+ };
37
+
38
+ export default class TriangleLayer extends Layer<_TriangleLayerProps> {
39
+ static layerName = 'TriangleLayer';
40
+
28
41
  getShaders() {
29
42
  return {vs, fs, modules: [project32]};
30
43
  }
31
44
 
32
- initializeState() {
33
- const {gl} = this.context;
34
- const attributeManager = this.getAttributeManager();
45
+ initializeState({gl}: LayerContext): void {
46
+ const attributeManager = this.getAttributeManager()!;
35
47
  attributeManager.add({
36
48
  positions: {size: 3, noAlloc: true},
37
49
  texCoords: {size: 2, noAlloc: true}
@@ -41,7 +53,7 @@ export default class TriangleLayer extends Layer {
41
53
  });
42
54
  }
43
55
 
44
- _getModel(gl) {
56
+ _getModel(gl: WebGLRenderingContext): Model {
45
57
  const {vertexCount} = this.props;
46
58
 
47
59
  return new Model(gl, {
@@ -54,7 +66,7 @@ export default class TriangleLayer extends Layer {
54
66
  });
55
67
  }
56
68
 
57
- draw({uniforms}) {
69
+ draw({uniforms}): void {
58
70
  const {model} = this.state;
59
71
 
60
72
  const {texture, maxTexture, colorTexture, intensity, threshold, aggregationMode, colorDomain} =
@@ -74,5 +86,3 @@ export default class TriangleLayer extends Layer {
74
86
  .draw();
75
87
  }
76
88
  }
77
-
78
- TriangleLayer.layerName = 'TriangleLayer';