@deck.gl/carto 9.0.34 → 9.1.0-beta.1

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 (242) hide show
  1. package/dist/api/basemap.d.ts +2 -1
  2. package/dist/api/basemap.d.ts.map +1 -1
  3. package/dist/api/basemap.js +3 -0
  4. package/dist/api/fetch-map.d.ts.map +1 -1
  5. package/dist/api/fetch-map.js +9 -11
  6. package/dist/api/index.d.ts +1 -4
  7. package/dist/api/index.d.ts.map +1 -1
  8. package/dist/api/index.js +3 -2
  9. package/dist/api/layer-map.d.ts.map +1 -1
  10. package/dist/api/layer-map.js +5 -2
  11. package/dist/api/parse-map.d.ts.map +1 -1
  12. package/dist/api/parse-map.js +3 -0
  13. package/dist/api/types.d.ts +0 -56
  14. package/dist/api/types.d.ts.map +1 -1
  15. package/dist/api/types.js +4 -20
  16. package/dist/basemap.d.ts +2 -1
  17. package/dist/basemap.d.ts.map +1 -1
  18. package/dist/basemap.js +4 -1
  19. package/dist/cartoRasterTile-worker.js +25 -2
  20. package/dist/cartoSpatialTile-worker.js +28 -3
  21. package/dist/cartoVectorTile-worker.js +29 -3
  22. package/dist/constants.d.ts +0 -3
  23. package/dist/constants.d.ts.map +1 -1
  24. package/dist/constants.js +3 -3
  25. package/dist/dist.dev.js +4512 -3855
  26. package/dist/index.cjs +328 -630
  27. package/dist/index.cjs.map +4 -4
  28. package/dist/index.d.ts +29 -16
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +12 -2
  31. package/dist/layers/cluster-tile-layer.d.ts +1 -1
  32. package/dist/layers/cluster-tile-layer.d.ts.map +1 -1
  33. package/dist/layers/cluster-tile-layer.js +4 -0
  34. package/dist/layers/cluster-utils.d.ts.map +1 -1
  35. package/dist/layers/cluster-utils.js +3 -0
  36. package/dist/layers/h3-tile-layer.d.ts +4 -4
  37. package/dist/layers/h3-tile-layer.d.ts.map +1 -1
  38. package/dist/layers/h3-tile-layer.js +15 -14
  39. package/dist/layers/h3-tileset-2d.d.ts.map +1 -1
  40. package/dist/layers/h3-tileset-2d.js +3 -0
  41. package/dist/layers/heatmap-tile-layer.d.ts +12 -2
  42. package/dist/layers/heatmap-tile-layer.d.ts.map +1 -1
  43. package/dist/layers/heatmap-tile-layer.js +85 -9
  44. package/dist/layers/heatmap.d.ts +69 -22
  45. package/dist/layers/heatmap.d.ts.map +1 -1
  46. package/dist/layers/heatmap.js +86 -102
  47. package/dist/layers/point-label-layer.d.ts.map +1 -1
  48. package/dist/layers/point-label-layer.js +5 -2
  49. package/dist/layers/post-process-utils.d.ts.map +1 -1
  50. package/dist/layers/post-process-utils.js +9 -5
  51. package/dist/layers/quadbin-layer.d.ts.map +1 -1
  52. package/dist/layers/quadbin-layer.js +3 -0
  53. package/dist/layers/quadbin-tile-layer.d.ts +4 -4
  54. package/dist/layers/quadbin-tile-layer.d.ts.map +1 -1
  55. package/dist/layers/quadbin-tile-layer.js +13 -12
  56. package/dist/layers/quadbin-tileset-2d.d.ts.map +1 -1
  57. package/dist/layers/quadbin-tileset-2d.js +3 -0
  58. package/dist/layers/quadbin-utils.d.ts.map +1 -1
  59. package/dist/layers/quadbin-utils.js +3 -0
  60. package/dist/layers/raster-layer-vertex.glsl.d.ts +1 -1
  61. package/dist/layers/raster-layer-vertex.glsl.d.ts.map +1 -1
  62. package/dist/layers/raster-layer-vertex.glsl.js +20 -25
  63. package/dist/layers/raster-layer.d.ts +6 -6
  64. package/dist/layers/raster-layer.d.ts.map +1 -1
  65. package/dist/layers/raster-layer.js +6 -1
  66. package/dist/layers/raster-tile-layer.d.ts +1 -1
  67. package/dist/layers/raster-tile-layer.d.ts.map +1 -1
  68. package/dist/layers/raster-tile-layer.js +14 -13
  69. package/dist/layers/schema/carto-properties-tile-loader.d.ts.map +1 -1
  70. package/dist/layers/schema/carto-properties-tile-loader.js +3 -0
  71. package/dist/layers/schema/carto-properties-tile.d.ts.map +1 -1
  72. package/dist/layers/schema/carto-properties-tile.js +3 -0
  73. package/dist/layers/schema/carto-raster-tile-loader.d.ts.map +1 -1
  74. package/dist/layers/schema/carto-raster-tile-loader.js +4 -1
  75. package/dist/layers/schema/carto-raster-tile.d.ts.map +1 -1
  76. package/dist/layers/schema/carto-raster-tile.js +3 -0
  77. package/dist/layers/schema/carto-spatial-tile-loader.d.ts.map +1 -1
  78. package/dist/layers/schema/carto-spatial-tile-loader.js +4 -1
  79. package/dist/layers/schema/carto-spatial-tile.d.ts.map +1 -1
  80. package/dist/layers/schema/carto-spatial-tile.js +3 -0
  81. package/dist/layers/schema/carto-tile.d.ts.map +1 -1
  82. package/dist/layers/schema/carto-tile.js +3 -0
  83. package/dist/layers/schema/carto-vector-tile-loader.d.ts.map +1 -1
  84. package/dist/layers/schema/carto-vector-tile-loader.js +4 -1
  85. package/dist/layers/schema/fast-pbf.d.ts.map +1 -1
  86. package/dist/layers/schema/fast-pbf.js +3 -0
  87. package/dist/layers/schema/spatialjson-utils.d.ts.map +1 -1
  88. package/dist/layers/schema/spatialjson-utils.js +3 -0
  89. package/dist/layers/schema/tile-loader-utils.d.ts.map +1 -1
  90. package/dist/layers/schema/tile-loader-utils.js +3 -0
  91. package/dist/layers/spatial-index-tile-layer.d.ts.map +1 -1
  92. package/dist/layers/spatial-index-tile-layer.js +3 -0
  93. package/dist/layers/utils.d.ts +2 -2
  94. package/dist/layers/utils.d.ts.map +1 -1
  95. package/dist/layers/utils.js +3 -0
  96. package/dist/layers/vector-tile-layer.d.ts +1 -1
  97. package/dist/layers/vector-tile-layer.d.ts.map +1 -1
  98. package/dist/layers/vector-tile-layer.js +3 -0
  99. package/dist/style/color-bins-style.d.ts.map +1 -1
  100. package/dist/style/color-bins-style.js +3 -0
  101. package/dist/style/color-categories-style.d.ts.map +1 -1
  102. package/dist/style/color-categories-style.js +3 -0
  103. package/dist/style/color-continuous-style.d.ts.map +1 -1
  104. package/dist/style/color-continuous-style.js +3 -0
  105. package/dist/style/palette.d.ts.map +1 -1
  106. package/dist/style/palette.js +3 -0
  107. package/dist/style/utils.d.ts.map +1 -1
  108. package/dist/style/utils.js +3 -0
  109. package/dist/utils.d.ts.map +1 -1
  110. package/dist/utils.js +3 -0
  111. package/dist/workers/cartoRasterTile.js +3 -0
  112. package/dist/workers/cartoSpatialTile.js +3 -0
  113. package/dist/workers/cartoVectorTile.js +3 -0
  114. package/dist.min.js +115 -101
  115. package/package.json +13 -11
  116. package/src/api/basemap.ts +6 -1
  117. package/src/api/fetch-map.ts +23 -15
  118. package/src/api/index.ts +5 -13
  119. package/src/api/layer-map.ts +6 -2
  120. package/src/api/parse-map.ts +4 -0
  121. package/src/api/types.ts +4 -75
  122. package/src/basemap.ts +6 -2
  123. package/src/constants.ts +4 -4
  124. package/src/index.ts +28 -9
  125. package/src/layers/cluster-tile-layer.ts +6 -1
  126. package/src/layers/cluster-utils.ts +4 -0
  127. package/src/layers/h3-tile-layer.ts +18 -16
  128. package/src/layers/h3-tileset-2d.ts +4 -0
  129. package/src/layers/heatmap-tile-layer.ts +115 -11
  130. package/src/layers/heatmap.ts +41 -99
  131. package/src/layers/point-label-layer.ts +6 -2
  132. package/src/layers/post-process-utils.ts +10 -5
  133. package/src/layers/quadbin-layer.ts +4 -0
  134. package/src/layers/quadbin-tile-layer.ts +16 -14
  135. package/src/layers/quadbin-tileset-2d.ts +4 -0
  136. package/src/layers/quadbin-utils.ts +4 -0
  137. package/src/layers/raster-layer-vertex.glsl.ts +21 -27
  138. package/src/layers/raster-layer.ts +7 -1
  139. package/src/layers/raster-tile-layer.ts +16 -14
  140. package/src/layers/schema/carto-properties-tile-loader.ts +4 -0
  141. package/src/layers/schema/carto-properties-tile.ts +4 -0
  142. package/src/layers/schema/carto-raster-tile-loader.ts +4 -0
  143. package/src/layers/schema/carto-raster-tile.ts +4 -0
  144. package/src/layers/schema/carto-spatial-tile-loader.ts +4 -0
  145. package/src/layers/schema/carto-spatial-tile.ts +4 -0
  146. package/src/layers/schema/carto-tile.ts +4 -0
  147. package/src/layers/schema/carto-vector-tile-loader.ts +4 -0
  148. package/src/layers/schema/fast-pbf.ts +4 -0
  149. package/src/layers/schema/spatialjson-utils.ts +4 -0
  150. package/src/layers/schema/tile-loader-utils.ts +4 -0
  151. package/src/layers/spatial-index-tile-layer.ts +4 -0
  152. package/src/layers/utils.ts +5 -1
  153. package/src/layers/vector-tile-layer.ts +5 -1
  154. package/src/style/color-bins-style.ts +4 -0
  155. package/src/style/color-categories-style.ts +4 -0
  156. package/src/style/color-continuous-style.ts +4 -0
  157. package/src/style/palette.ts +4 -0
  158. package/src/style/utils.ts +4 -0
  159. package/src/utils.ts +4 -0
  160. package/src/workers/cartoRasterTile.ts +4 -0
  161. package/src/workers/cartoSpatialTile.ts +4 -0
  162. package/src/workers/cartoVectorTile.ts +4 -0
  163. package/dist/api/carto-api-error.d.ts +0 -19
  164. package/dist/api/carto-api-error.d.ts.map +0 -1
  165. package/dist/api/carto-api-error.js +0 -48
  166. package/dist/api/common.d.ts +0 -5
  167. package/dist/api/common.d.ts.map +0 -1
  168. package/dist/api/common.js +0 -5
  169. package/dist/api/endpoints.d.ts +0 -23
  170. package/dist/api/endpoints.d.ts.map +0 -1
  171. package/dist/api/endpoints.js +0 -22
  172. package/dist/api/query.d.ts +0 -4
  173. package/dist/api/query.d.ts.map +0 -1
  174. package/dist/api/query.js +0 -26
  175. package/dist/api/request-with-parameters.d.ts +0 -9
  176. package/dist/api/request-with-parameters.d.ts.map +0 -1
  177. package/dist/api/request-with-parameters.js +0 -86
  178. package/dist/sources/base-source.d.ts +0 -5
  179. package/dist/sources/base-source.d.ts.map +0 -1
  180. package/dist/sources/base-source.js +0 -60
  181. package/dist/sources/boundary-query-source.d.ts +0 -10
  182. package/dist/sources/boundary-query-source.d.ts.map +0 -1
  183. package/dist/sources/boundary-query-source.js +0 -18
  184. package/dist/sources/boundary-table-source.d.ts +0 -8
  185. package/dist/sources/boundary-table-source.d.ts.map +0 -1
  186. package/dist/sources/boundary-table-source.js +0 -15
  187. package/dist/sources/h3-query-source.d.ts +0 -4
  188. package/dist/sources/h3-query-source.d.ts.map +0 -1
  189. package/dist/sources/h3-query-source.js +0 -22
  190. package/dist/sources/h3-table-source.d.ts +0 -4
  191. package/dist/sources/h3-table-source.d.ts.map +0 -1
  192. package/dist/sources/h3-table-source.js +0 -19
  193. package/dist/sources/h3-tileset-source.d.ts +0 -4
  194. package/dist/sources/h3-tileset-source.d.ts.map +0 -1
  195. package/dist/sources/h3-tileset-source.js +0 -6
  196. package/dist/sources/index.d.ts +0 -28
  197. package/dist/sources/index.d.ts.map +0 -1
  198. package/dist/sources/index.js +0 -13
  199. package/dist/sources/quadbin-query-source.d.ts +0 -4
  200. package/dist/sources/quadbin-query-source.d.ts.map +0 -1
  201. package/dist/sources/quadbin-query-source.js +0 -22
  202. package/dist/sources/quadbin-table-source.d.ts +0 -4
  203. package/dist/sources/quadbin-table-source.d.ts.map +0 -1
  204. package/dist/sources/quadbin-table-source.js +0 -19
  205. package/dist/sources/quadbin-tileset-source.d.ts +0 -4
  206. package/dist/sources/quadbin-tileset-source.d.ts.map +0 -1
  207. package/dist/sources/quadbin-tileset-source.js +0 -6
  208. package/dist/sources/raster-source.d.ts +0 -4
  209. package/dist/sources/raster-source.d.ts.map +0 -1
  210. package/dist/sources/raster-source.js +0 -9
  211. package/dist/sources/types.d.ts +0 -219
  212. package/dist/sources/types.d.ts.map +0 -1
  213. package/dist/sources/types.js +0 -1
  214. package/dist/sources/vector-query-source.d.ts +0 -4
  215. package/dist/sources/vector-query-source.d.ts.map +0 -1
  216. package/dist/sources/vector-query-source.js +0 -22
  217. package/dist/sources/vector-table-source.d.ts +0 -4
  218. package/dist/sources/vector-table-source.d.ts.map +0 -1
  219. package/dist/sources/vector-table-source.js +0 -19
  220. package/dist/sources/vector-tileset-source.d.ts +0 -4
  221. package/dist/sources/vector-tileset-source.d.ts.map +0 -1
  222. package/dist/sources/vector-tileset-source.js +0 -6
  223. package/src/api/carto-api-error.ts +0 -68
  224. package/src/api/common.ts +0 -6
  225. package/src/api/endpoints.ts +0 -69
  226. package/src/api/query.ts +0 -42
  227. package/src/api/request-with-parameters.ts +0 -117
  228. package/src/sources/base-source.ts +0 -79
  229. package/src/sources/boundary-query-source.ts +0 -39
  230. package/src/sources/boundary-table-source.ts +0 -33
  231. package/src/sources/h3-query-source.ts +0 -55
  232. package/src/sources/h3-table-source.ts +0 -51
  233. package/src/sources/h3-tileset-source.ts +0 -14
  234. package/src/sources/index.ts +0 -45
  235. package/src/sources/quadbin-query-source.ts +0 -56
  236. package/src/sources/quadbin-table-source.ts +0 -52
  237. package/src/sources/quadbin-tileset-source.ts +0 -14
  238. package/src/sources/raster-source.ts +0 -17
  239. package/src/sources/types.ts +0 -231
  240. package/src/sources/vector-query-source.ts +0 -57
  241. package/src/sources/vector-table-source.ts +0 -51
  242. package/src/sources/vector-tileset-source.ts +0 -14
@@ -1,15 +1,48 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {ShaderModule} from '@luma.gl/shadertools';
1
6
  import {getResolution} from 'quadbin';
2
7
 
3
- import {Accessor, CompositeLayer, CompositeLayerProps, DefaultProps, Layer} from '@deck.gl/core';
8
+ import {
9
+ Accessor,
10
+ Color,
11
+ CompositeLayer,
12
+ CompositeLayerProps,
13
+ DefaultProps,
14
+ Layer,
15
+ UpdateParameters
16
+ } from '@deck.gl/core';
4
17
  import {SolidPolygonLayer} from '@deck.gl/layers';
5
18
 
6
19
  import {HeatmapProps, heatmap} from './heatmap';
7
20
  import {RTTModifier, PostProcessModifier} from './post-process-utils';
8
21
  import QuadbinTileLayer, {QuadbinTileLayerProps} from './quadbin-tile-layer';
9
22
  import {TilejsonPropType} from './utils';
10
- import {TilejsonResult} from '../sources';
23
+ import {TilejsonResult} from '@carto/api-client';
11
24
  import {_Tile2DHeader as Tile2DHeader} from '@deck.gl/geo-layers';
25
+ import {Texture, TextureProps} from '@luma.gl/core';
26
+
27
+ const defaultColorRange: Color[] = [
28
+ [255, 255, 178],
29
+ [254, 217, 118],
30
+ [254, 178, 76],
31
+ [253, 141, 60],
32
+ [240, 59, 32],
33
+ [189, 0, 38]
34
+ ];
12
35
 
36
+ const TEXTURE_PROPS: TextureProps = {
37
+ format: 'rgba8unorm',
38
+ mipmaps: false,
39
+ sampler: {
40
+ minFilter: 'linear',
41
+ magFilter: 'linear',
42
+ addressModeU: 'clamp-to-edge',
43
+ addressModeV: 'clamp-to-edge'
44
+ }
45
+ };
13
46
  /**
14
47
  * Computes the unit density (inverse of cell area)
15
48
  */
@@ -18,6 +51,39 @@ function unitDensityForCell(cell: bigint) {
18
51
  return Math.pow(4.0, cellResolution);
19
52
  }
20
53
 
54
+ /**
55
+ * Converts a colorRange array to a flat array with 4 components per color
56
+ */
57
+ function colorRangeToFlatArray(colorRange: Color[]): Uint8Array {
58
+ const flatArray = new Uint8Array(colorRange.length * 4);
59
+ let index = 0;
60
+
61
+ for (let i = 0; i < colorRange.length; i++) {
62
+ const color = colorRange[i];
63
+ flatArray[index++] = color[0];
64
+ flatArray[index++] = color[1];
65
+ flatArray[index++] = color[2];
66
+ flatArray[index++] = Number.isFinite(color[3]) ? (color[3] as number) : 255;
67
+ }
68
+
69
+ return flatArray;
70
+ }
71
+
72
+ const uniformBlock = `\
73
+ uniform densityUniforms {
74
+ float factor;
75
+ } density;
76
+ `;
77
+
78
+ type DensityProps = {factor: number};
79
+ const densityUniforms = {
80
+ name: 'density',
81
+ vs: uniformBlock,
82
+ uniformTypes: {
83
+ factor: 'f32'
84
+ }
85
+ } as const satisfies ShaderModule<DensityProps>;
86
+
21
87
  // Modified polygon layer to draw offscreen and output value expected by heatmap
22
88
  class RTTSolidPolygonLayer extends RTTModifier(SolidPolygonLayer) {
23
89
  static layerName = 'RTTSolidPolygonLayer';
@@ -25,16 +91,13 @@ class RTTSolidPolygonLayer extends RTTModifier(SolidPolygonLayer) {
25
91
  getShaders(type) {
26
92
  const shaders = super.getShaders(type);
27
93
  shaders.inject = {
28
- 'vs:#decl': `
29
- uniform float densityFactor;
30
- `,
31
94
  'vs:#main-end': `
32
95
  // Value from getWeight accessor
33
96
  float weight = elevations;
34
97
 
35
98
  // Keep "power" delivered to screen constant when tiles update
36
- // by outputting normalized density
37
- weight *= densityFactor;
99
+ // by outputting normalized density
100
+ weight *= density.factor;
38
101
 
39
102
  // Pack float into 3 channels to pass to heatmap shader
40
103
  // SCALE value important, as we don't want to saturate
@@ -47,15 +110,18 @@ uniform float densityFactor;
47
110
  vColor = vec4(mod(vec3(weight, floor(weight / SHIFT.yz)), 256.0), 255.0) / 255.0;
48
111
  `
49
112
  };
113
+ shaders.modules = [...shaders.modules, densityUniforms];
50
114
  return shaders;
51
115
  }
52
116
 
53
117
  draw(this, opts: any) {
54
118
  const cell = this.props!.data[0];
55
119
  const maxDensity = this.props.elevationScale;
56
- const densityFactor = unitDensityForCell(cell.id) / maxDensity;
120
+ const densityProps: DensityProps = {
121
+ factor: unitDensityForCell(cell.id) / maxDensity
122
+ };
57
123
  for (const model of this.state.models) {
58
- model.setUniforms({densityFactor});
124
+ model.shaderInputs.setProps({density: densityProps});
59
125
  }
60
126
 
61
127
  super.draw(opts);
@@ -70,6 +136,7 @@ const defaultProps: DefaultProps<HeatmapTileLayerProps> = {
70
136
  getWeight: {type: 'accessor', value: 1},
71
137
  onMaxDensityChange: {type: 'function', optional: true, value: null},
72
138
  colorDomain: {type: 'array', value: [0, 1]},
139
+ colorRange: defaultColorRange,
73
140
  intensity: {type: 'number', value: 1},
74
141
  radiusPixels: {type: 'number', min: 0, max: 100, value: 20}
75
142
  };
@@ -83,6 +150,13 @@ export type HeatmapTileLayerProps<DataT = unknown> = _HeatmapTileLayerProps<Data
83
150
  /** Properties added by HeatmapTileLayer. */
84
151
  type _HeatmapTileLayerProps<DataT> = QuadbinTileLayerProps<DataT> &
85
152
  HeatmapProps & {
153
+ /**
154
+ * Specified as an array of colors [color1, color2, ...].
155
+ *
156
+ * @default `6-class YlOrRd` - [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6)
157
+ */
158
+ colorRange: Color[];
159
+
86
160
  /**
87
161
  * The weight of each object.
88
162
  *
@@ -101,6 +175,7 @@ class HeatmapTileLayer<DataT = any, ExtraProps extends {} = {}> extends Composit
101
175
  static defaultProps = defaultProps;
102
176
 
103
177
  state!: {
178
+ colorTexture?: Texture;
104
179
  isLoaded: boolean;
105
180
  tiles: Set<Tile2DHeader>;
106
181
  viewportChanged?: boolean;
@@ -119,12 +194,19 @@ class HeatmapTileLayer<DataT = any, ExtraProps extends {} = {}> extends Composit
119
194
  return changeFlags.somethingChanged;
120
195
  }
121
196
 
197
+ updateState(opts: UpdateParameters<this>) {
198
+ const {props, oldProps} = opts;
199
+ super.updateState(opts);
200
+ if (props.colorRange !== oldProps.colorRange) {
201
+ this._updateColorTexture(opts);
202
+ }
203
+ }
204
+
122
205
  renderLayers(): Layer {
123
206
  const {
124
207
  data,
125
208
  getWeight,
126
209
  colorDomain,
127
- colorRange,
128
210
  intensity,
129
211
  radiusPixels,
130
212
  _subLayerProps,
@@ -183,12 +265,13 @@ class HeatmapTileLayer<DataT = any, ExtraProps extends {} = {}> extends Composit
183
265
 
184
266
  colorDomain,
185
267
 
186
- colorRange,
187
268
  radiusPixels,
188
269
  intensity,
189
270
  _subLayerProps: subLayerProps,
190
271
  refinementStrategy: 'no-overlap',
191
272
 
273
+ colorTexture: this.state.colorTexture,
274
+
192
275
  // Disable line rendering
193
276
  extruded: false,
194
277
  stroked: false,
@@ -231,6 +314,27 @@ class HeatmapTileLayer<DataT = any, ExtraProps extends {} = {}> extends Composit
231
314
  })
232
315
  );
233
316
  }
317
+
318
+ _updateColorTexture(opts) {
319
+ const {colorRange} = opts.props;
320
+ let {colorTexture} = this.state;
321
+ const colors = colorRangeToFlatArray(colorRange);
322
+
323
+ if (colorTexture && colorTexture?.width === colorRange.length) {
324
+ // TODO(v9): Unclear whether `setSubImageData` is a public API, or what to use if not.
325
+ (colorTexture as any).setSubImageData({data: colors});
326
+ } else {
327
+ colorTexture?.destroy();
328
+ // @ts-ignore TODO v9.1
329
+ colorTexture = this.context.device.createTexture({
330
+ ...TEXTURE_PROPS,
331
+ data: colors,
332
+ width: colorRange.length,
333
+ height: 1
334
+ });
335
+ }
336
+ this.setState({colorTexture});
337
+ }
234
338
  }
235
339
 
236
340
  export default HeatmapTileLayer;
@@ -1,54 +1,32 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import type {ShaderPass} from '@luma.gl/shadertools';
2
- import {Color} from '@deck.gl/core';
3
- const glsl = (s: TemplateStringsArray) => `${s}`;
6
+ import {Texture} from '@luma.gl/core';
4
7
 
5
8
  /**
6
9
  * @filter Heatmap
7
10
  * @param radiusPixels Blur radius in pixels, controls smoothness of heatmap
8
11
  * @param colorDomain Domain to apply to values prior to applying color scale
9
- * @param color1-6 Colors to use in color scale
12
+ * @param colorTexture 1D RGB lookup texture for color scale
13
+ * @param intensity Multiplier to apply to value
14
+ * @param opacity Output opacity
10
15
  */
11
16
 
12
- const fs = glsl`\
17
+ const fs = /* glsl */ `\
13
18
  uniform heatmapUniforms {
14
- vec2 delta;
15
- float radiusPixels;
16
19
  vec2 colorDomain;
17
- vec3 color1;
18
- vec3 color2;
19
- vec3 color3;
20
- vec3 color4;
21
- vec3 color5;
22
- vec3 color6;
20
+ vec2 delta;
23
21
  float intensity;
24
22
  float opacity;
23
+ float radiusPixels;
25
24
  } heatmap;
26
25
 
27
- const vec4 STOPS = vec4(0.2, 0.4, 0.6, 0.8);
26
+ uniform sampler2D colorTexture;
28
27
 
29
28
  vec3 colorGradient(float value) {
30
- vec3 c1;
31
- vec3 c2;
32
- vec2 range;
33
- if (value < STOPS.x) {
34
- range = vec2(0.0, STOPS.x);
35
- c1 = heatmap.color1; c2 = heatmap.color2;
36
- } else if (value < STOPS.y) {
37
- range = STOPS.xy;
38
- c1 = heatmap.color2; c2 = heatmap.color3;
39
- } else if (value < STOPS.z) {
40
- range = STOPS.yz;
41
- c1 = heatmap.color3; c2 = heatmap.color4;
42
- } else if (value < STOPS.w) {
43
- range = STOPS.zw;
44
- c1 = heatmap.color4; c2 = heatmap.color5;
45
- } else {
46
- range = vec2(STOPS.w, 1.0);
47
- c1 = heatmap.color5; c2 = heatmap.color6;
48
- }
49
-
50
- float f = (clamp(value, 0.0, 1.0) - range.x) / (range.y - range.x);
51
- return mix(c1, c2, f) / 255.0;
29
+ return texture(colorTexture, vec2(value, 0.5)).rgb;
52
30
  }
53
31
 
54
32
  const vec3 SHIFT = vec3(1.0, 256.0, 256.0 * 256.0);
@@ -115,15 +93,6 @@ vec4 heatmap_sampleColor(sampler2D source, vec2 texSize, vec2 texCoord) {
115
93
  }
116
94
  `;
117
95
 
118
- const defaultColorRange: Color[] = [
119
- [255, 255, 178],
120
- [254, 217, 118],
121
- [254, 178, 76],
122
- [253, 141, 60],
123
- [240, 59, 32],
124
- [189, 0, 38]
125
- ];
126
-
127
96
  export type HeatmapProps = {
128
97
  /**
129
98
  * Radius of the heatmap blur in pixels, to which the weight of a cell is distributed.
@@ -132,94 +101,67 @@ export type HeatmapProps = {
132
101
  */
133
102
  radiusPixels?: number;
134
103
  /**
135
- * Controls how weight values are mapped to the `colorRange`, as an array of two numbers [`minValue`, `maxValue`].
104
+ * Controls how weight values are mapped to the colors in `colorTexture`, as an array of two numbers [`minValue`, `maxValue`].
136
105
  *
137
106
  * @default [0, 1]
138
107
  */
139
108
  colorDomain?: [number, number];
140
- /**
141
- * Specified as an array of colors [color1, color2, ...].
142
- *
143
- * @default `6-class YlOrRd` - [colorbrewer](http://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=6)
144
- */
145
- colorRange: Color[];
146
109
  /**
147
110
  * Value that is multiplied with the total weight at a pixel to obtain the final weight. A value larger than 1 biases the output color towards the higher end of the spectrum, and a value less than 1 biases the output color towards the lower end of the spectrum.
148
111
  */
149
112
  intensity?: number;
113
+ /**
114
+ * Color LUT for color gradient
115
+ */
116
+ colorTexture: Texture;
150
117
  opacity: number;
151
118
  };
152
119
 
153
- export type HeatmapUniforms = {
154
- delta?: [number, number];
155
- radiusPixels?: number;
156
- colorDomain?: [number, number];
157
- color1?: [number, number, number];
158
- color2?: [number, number, number];
159
- color3?: [number, number, number];
160
- color4?: [number, number, number];
161
- color5?: [number, number, number];
162
- color6?: [number, number, number];
163
- intensity: number;
164
- opacity?: number;
120
+ type PassProps = {
121
+ delta: [number, number];
165
122
  };
166
123
 
167
- export const heatmap: ShaderPass<HeatmapProps, HeatmapUniforms> = {
124
+ export const heatmap = {
168
125
  name: 'heatmap',
169
126
  uniformPropTypes: {
170
- delta: {value: [0, 1]},
171
- radiusPixels: {value: 20, min: 0, softMax: 100},
172
127
  colorDomain: {value: [0, 1]},
173
- color1: {value: [0, 0, 0]},
174
- color2: {value: [0, 0, 0]},
175
- color3: {value: [0, 0, 0]},
176
- color4: {value: [0, 0, 0]},
177
- color5: {value: [0, 0, 0]},
178
- color6: {value: [0, 0, 0]},
128
+ delta: {value: [0, 1]},
179
129
  intensity: {value: 1, min: 0.1, max: 10},
180
- opacity: {value: 1, min: 0, max: 1}
130
+ opacity: {value: 1, min: 0, max: 1},
131
+ radiusPixels: {value: 20, min: 0, softMax: 100}
181
132
  },
182
133
  uniformTypes: {
183
- delta: 'vec2<f32>',
184
- radiusPixels: 'f32',
185
134
  colorDomain: 'vec2<f32>',
186
- color1: 'vec3<f32>',
187
- color2: 'vec3<f32>',
188
- color3: 'vec3<f32>',
189
- color4: 'vec3<f32>',
190
- color5: 'vec3<f32>',
191
- color6: 'vec3<f32>',
135
+ delta: 'vec2<f32>',
192
136
  intensity: 'f32',
193
- opacity: 'f32'
137
+ opacity: 'f32',
138
+ radiusPixels: 'f32'
194
139
  },
195
- // @ts-expect-error stricter luma gl types
140
+ // @ts-ignore TODO v9.1
196
141
  getUniforms: opts => {
142
+ if (!opts) return {};
197
143
  const {
198
- delta = [1, 0],
199
- colorRange = defaultColorRange,
200
- radiusPixels = 20,
201
144
  colorDomain = [0, 1],
145
+ colorTexture,
146
+ delta = [1, 0],
202
147
  intensity = 1,
203
- opacity = 1
204
- } = opts as HeatmapProps & {delta: [number, number]};
205
- const [color1, color2, color3, color4, color5, color6] = colorRange;
148
+ opacity = 1,
149
+ radiusPixels = 20
150
+ } = opts;
206
151
  return {
207
- delta,
208
- color1,
209
- color2,
210
- color3,
211
- color4,
212
- color5,
213
- color6,
214
- radiusPixels,
215
152
  colorDomain,
153
+ colorTexture,
154
+ delta,
216
155
  intensity,
217
- opacity
156
+ opacity,
157
+ radiusPixels
218
158
  };
219
159
  },
220
160
  fs,
221
161
  passes: [
162
+ // @ts-expect-error Seems typing in luma.gl should be Partial<>
222
163
  {sampler: true, uniforms: {delta: [1, 0]}},
164
+ // @ts-expect-error Seems typing in luma.gl should be Partial<>
223
165
  {sampler: true, uniforms: {delta: [0, 1]}}
224
166
  ]
225
- };
167
+ } as const satisfies ShaderPass<HeatmapProps & PassProps>;
@@ -1,3 +1,7 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import {
2
6
  Accessor,
3
7
  Color,
@@ -24,10 +28,10 @@ class EnhancedTextBackgroundLayer extends TextBackgroundLayer {
24
28
 
25
29
  // Modify shader so that the padding is offset by the pixel offset to ensure the padding
26
30
  // always captures the anchor point. As padding is uniform we cannot pass it a per-label value
27
- vs = vs.replaceAll('padding.', '_padding.');
31
+ vs = vs.replaceAll('textBackground.padding.', '_padding.');
28
32
  vs = vs.replace(
29
33
  'void main(void) {',
30
- 'void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);'
34
+ 'void main(void) {\n vec4 _padding = textBackground.padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);'
31
35
  );
32
36
 
33
37
  return {...shaders, vs};
@@ -1,3 +1,7 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import {Framebuffer, TextureProps} from '@luma.gl/core';
2
6
  import {
3
7
  CompositeLayer,
@@ -64,8 +68,8 @@ export function RTTModifier(BaseLayer) {
64
68
  static layerName = `RTT-${BaseLayer.layerName}`;
65
69
 
66
70
  draw(this: RTTLayer, opts: any) {
67
- const {moduleParameters} = opts;
68
- const {picking} = moduleParameters;
71
+ const {shaderModuleProps} = opts;
72
+ const {picking} = shaderModuleProps;
69
73
  const postProcessLayer = getPostProcessLayer(this);
70
74
 
71
75
  if (!picking.isActive) {
@@ -130,10 +134,11 @@ export function PostProcessModifier<T extends Constructor<DrawableCompositeLayer
130
134
 
131
135
  _resizeBuffers(this: PostProcessLayer, opts: any) {
132
136
  // TODO we could likely render to a smaller buffer for better perf
133
- const {moduleParameters} = opts;
137
+ const {shaderModuleProps} = opts;
134
138
  const {viewport} = this.context;
135
- const width = moduleParameters.devicePixelRatio * viewport.width;
136
- const height = moduleParameters.devicePixelRatio * viewport.height;
139
+ const {devicePixelRatio} = shaderModuleProps.project;
140
+ const width = devicePixelRatio * viewport.width;
141
+ const height = devicePixelRatio * viewport.height;
137
142
  this.internalState.renderBuffers.forEach((fbo: Framebuffer) => fbo.resize({width, height}));
138
143
  }
139
144
 
@@ -1,3 +1,7 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import {AccessorFunction, DefaultProps} from '@deck.gl/core';
2
6
  import {
3
7
  _GeoCellLayer as GeoCellLayer,
@@ -1,9 +1,13 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import {CompositeLayer, CompositeLayerProps, Layer, LayersList, DefaultProps} from '@deck.gl/core';
2
6
  import QuadbinLayer, {QuadbinLayerProps} from './quadbin-layer';
3
7
  import QuadbinTileset2D from './quadbin-tileset-2d';
4
8
  import SpatialIndexTileLayer, {SpatialIndexTileLayerProps} from './spatial-index-tile-layer';
5
9
  import {hexToBigInt} from 'quadbin';
6
- import type {TilejsonResult} from '../sources/types';
10
+ import type {TilejsonResult} from '@carto/api-client';
7
11
  import {injectAccessToken, TilejsonPropType} from './utils';
8
12
  import {DEFAULT_TILE_SIZE} from '../constants';
9
13
 
@@ -46,22 +50,20 @@ export default class QuadbinTileLayer<
46
50
  return loadOptions;
47
51
  }
48
52
 
49
- renderLayers(): Layer | null | LayersList {
53
+ renderLayers(): SpatialIndexTileLayer | null {
50
54
  const tileJSON = this.props.data as TilejsonResult;
51
55
  if (!tileJSON) return null;
52
56
 
53
57
  const {tiles: data, maxresolution: maxZoom} = tileJSON;
54
- return [
55
- // @ts-ignore
56
- new SpatialIndexTileLayer(this.props, {
57
- id: `quadbin-tile-layer-${this.props.id}`,
58
- data,
59
- // TODO: Tileset2D should be generic over TileIndex type
60
- TilesetClass: QuadbinTileset2D as any,
61
- renderSubLayers,
62
- maxZoom,
63
- loadOptions: this.getLoadOptions()
64
- })
65
- ];
58
+ const SubLayerClass = this.getSubLayerClass('spatial-index-tile', SpatialIndexTileLayer);
59
+ return new SubLayerClass(this.props, {
60
+ id: `quadbin-tile-layer-${this.props.id}`,
61
+ data,
62
+ // TODO: Tileset2D should be generic over TileIndex type
63
+ TilesetClass: QuadbinTileset2D as any,
64
+ renderSubLayers,
65
+ maxZoom,
66
+ loadOptions: this.getLoadOptions()
67
+ });
66
68
  }
67
69
  }
@@ -1,3 +1,7 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import {_Tileset2D as Tileset2D} from '@deck.gl/geo-layers';
2
6
  import {bigIntToHex, cellToParent, cellToTile, getResolution, tileToCell} from 'quadbin';
3
7
 
@@ -1,3 +1,7 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import {worldToLngLat} from '@math.gl/web-mercator';
2
6
  import {cellToTile} from 'quadbin';
3
7
 
@@ -1,3 +1,7 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  export default `\
2
6
  #version 300 es
3
7
  #define SHADER_NAME raster-layer-vertex-shader
@@ -11,16 +15,6 @@ in vec4 instanceLineColors;
11
15
 
12
16
  in vec3 instancePickingColors;
13
17
 
14
- // Custom uniforms
15
- uniform float opacity;
16
- uniform bool extruded;
17
- uniform bool stroked;
18
- uniform bool isStroke;
19
- uniform float coverage;
20
- uniform float elevationScale;
21
- uniform float widthScale;
22
- uniform vec3 offset;
23
-
24
18
  // Result
25
19
  out vec4 vColor;
26
20
  #ifdef FLAT_SHADING
@@ -29,25 +23,25 @@ out vec4 position_commonspace;
29
23
 
30
24
  void main(void) {
31
25
  // Rather than positioning using attribute, layout pixel grid using gl_InstanceID
32
- vec2 common_position = offset.xy;
33
- float scale = offset.z;
26
+ vec2 common_position = column.offset.xy;
27
+ float scale = column.widthScale; // Re-use widthScale prop to pass cell scale
34
28
 
35
29
  int yIndex = - (gl_InstanceID / BLOCK_WIDTH);
36
30
  int xIndex = gl_InstanceID + (yIndex * BLOCK_WIDTH);
37
- common_position += scale * vec2(float(xIndex), float(yIndex));
31
+ common_position += scale * vec2(float(xIndex), float(yIndex - 1));
38
32
 
39
- vec4 color = isStroke ? instanceLineColors : instanceFillColors;
33
+ vec4 color = column.isStroke ? instanceLineColors : instanceFillColors;
40
34
 
41
35
  // if alpha == 0.0 or z < 0.0, do not render element
42
36
  float shouldRender = float(color.a > 0.0 && instanceElevations >= 0.0);
43
- float cellWidth = coverage * scale;
37
+ float cellWidth = column.coverage * scale;
44
38
 
45
39
  // Get position directly from quadbin, rather than projecting
46
40
  // Important to set geometry.position before using project_ methods below
47
41
  // as geometry.worldPosition is not set (we don't know our lat/long)
48
42
  geometry.position = vec4(common_position, 0.0, 1.0);
49
- if (project_uProjectionMode == PROJECTION_MODE_WEB_MERCATOR_AUTO_OFFSET) {
50
- geometry.position.xyz -= project_uCommonOrigin;
43
+ if (project.projectionMode == PROJECTION_MODE_WEB_MERCATOR_AUTO_OFFSET) {
44
+ geometry.position.xyz -= project.commonOrigin;
51
45
  }
52
46
 
53
47
  // calculate elevation, if 3d not enabled set to 0
@@ -56,11 +50,11 @@ void main(void) {
56
50
  // calculate stroke offset
57
51
  float strokeOffsetRatio = 1.0;
58
52
 
59
- if (extruded) {
60
- elevation = instanceElevations * (positions.z + 1.0) / 2.0 * elevationScale;
61
- } else if (stroked) {
62
- float halfOffset = project_pixel_size(widthScale) / cellWidth;
63
- if (isStroke) {
53
+ if (column.extruded) {
54
+ elevation = instanceElevations * (positions.z + 1.0) / 2.0 * column.elevationScale;
55
+ } else if (column.stroked) {
56
+ float halfOffset = project_pixel_size(column.widthScale) / cellWidth;
57
+ if (column.isStroke) {
64
58
  strokeOffsetRatio -= sign(positions.z) * halfOffset;
65
59
  } else {
66
60
  strokeOffsetRatio -= halfOffset;
@@ -81,16 +75,16 @@ void main(void) {
81
75
  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);
82
76
 
83
77
  // Light calculations
84
- if (extruded && !isStroke) {
78
+ if (column.extruded && !column.isStroke) {
85
79
  #ifdef FLAT_SHADING
86
80
  position_commonspace = geometry.position;
87
- vColor = vec4(color.rgb, color.a * opacity);
81
+ vColor = vec4(color.rgb, color.a * layer.opacity);
88
82
  #else
89
- vec3 lightColor = lighting_getLightColor(color.rgb, project_uCameraPosition, geometry.position.xyz, geometry.normal);
90
- vColor = vec4(lightColor, color.a * opacity);
83
+ vec3 lightColor = lighting_getLightColor(color.rgb, project.cameraPosition, geometry.position.xyz, geometry.normal);
84
+ vColor = vec4(lightColor, color.a * layer.opacity);
91
85
  #endif
92
86
  } else {
93
- vColor = vec4(color.rgb, color.a * opacity);
87
+ vColor = vec4(color.rgb, color.a * layer.opacity);
94
88
  }
95
89
 
96
90
  DECKGL_FILTER_COLOR(vColor, geometry);
@@ -1,3 +1,7 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
1
5
  import {
2
6
  Accessor,
3
7
  CompositeLayer,
@@ -113,7 +117,8 @@ export default class RasterLayer<DataT = any, ExtraProps = {}> extends Composite
113
117
 
114
118
  const blockSize = data.blockSize ?? 0;
115
119
  const [xOffset, yOffset, scale] = quadbinToOffset(tileIndex);
116
- const offset = [xOffset, yOffset, scale / blockSize];
120
+ const offset = [xOffset, yOffset];
121
+ const lineWidthScale = scale / blockSize;
117
122
 
118
123
  // Filled Column Layer
119
124
  const CellLayer = this.getSubLayerClass('column', RasterColumnLayer);
@@ -136,6 +141,7 @@ export default class RasterLayer<DataT = any, ExtraProps = {}> extends Composite
136
141
  },
137
142
  dataComparator: wrappedDataComparator,
138
143
  offset,
144
+ lineWidthScale, // Re-use widthScale prop to pass cell scale,
139
145
  highlightedObjectIndex,
140
146
  highlightColor
141
147
  }