@deck.gl/aggregation-layers 9.0.35 → 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 (318) hide show
  1. package/dist/common/aggregation-layer.d.ts +30 -0
  2. package/dist/common/aggregation-layer.d.ts.map +1 -0
  3. package/dist/common/aggregation-layer.js +69 -0
  4. package/dist/common/aggregator/aggregator.d.ts +76 -0
  5. package/dist/common/aggregator/aggregator.d.ts.map +1 -0
  6. package/dist/common/aggregator/aggregator.js +4 -0
  7. package/dist/common/aggregator/cpu-aggregator/aggregate.d.ts +27 -0
  8. package/dist/common/aggregator/cpu-aggregator/aggregate.d.ts.map +1 -0
  9. package/dist/common/aggregator/cpu-aggregator/aggregate.js +66 -0
  10. package/dist/common/aggregator/cpu-aggregator/cpu-aggregator.d.ts +70 -0
  11. package/dist/common/aggregator/cpu-aggregator/cpu-aggregator.d.ts.map +1 -0
  12. package/dist/common/aggregator/cpu-aggregator/cpu-aggregator.js +139 -0
  13. package/dist/common/aggregator/cpu-aggregator/sort-bins.d.ts +15 -0
  14. package/dist/common/aggregator/cpu-aggregator/sort-bins.d.ts.map +1 -0
  15. package/dist/common/aggregator/cpu-aggregator/sort-bins.js +43 -0
  16. package/dist/common/aggregator/cpu-aggregator/vertex-accessor.d.ts +21 -0
  17. package/dist/common/aggregator/cpu-aggregator/vertex-accessor.d.ts.map +1 -0
  18. package/dist/common/aggregator/cpu-aggregator/vertex-accessor.js +55 -0
  19. package/dist/common/aggregator/gpu-aggregator/aggregation-transform-uniforms.d.ts +18 -0
  20. package/dist/common/aggregator/gpu-aggregator/aggregation-transform-uniforms.d.ts.map +1 -0
  21. package/dist/common/aggregator/gpu-aggregator/aggregation-transform-uniforms.js +20 -0
  22. package/dist/common/aggregator/gpu-aggregator/bin-sorter-uniforms.d.ts +14 -0
  23. package/dist/common/aggregator/gpu-aggregator/bin-sorter-uniforms.d.ts.map +1 -0
  24. package/dist/common/aggregator/gpu-aggregator/bin-sorter-uniforms.js +17 -0
  25. package/dist/common/aggregator/gpu-aggregator/utils.d.ts +6 -0
  26. package/dist/common/aggregator/gpu-aggregator/utils.d.ts.map +1 -0
  27. package/dist/common/aggregator/gpu-aggregator/utils.js +24 -0
  28. package/dist/common/aggregator/gpu-aggregator/webgl-aggregation-transform.d.ts +24 -0
  29. package/dist/common/aggregator/gpu-aggregator/webgl-aggregation-transform.d.ts.map +1 -0
  30. package/dist/common/aggregator/gpu-aggregator/webgl-aggregation-transform.js +215 -0
  31. package/dist/common/aggregator/gpu-aggregator/webgl-aggregator.d.ts +81 -0
  32. package/dist/common/aggregator/gpu-aggregator/webgl-aggregator.d.ts.map +1 -0
  33. package/dist/common/aggregator/gpu-aggregator/webgl-aggregator.js +201 -0
  34. package/dist/common/aggregator/gpu-aggregator/webgl-bin-sorter.d.ts +38 -0
  35. package/dist/common/aggregator/gpu-aggregator/webgl-bin-sorter.d.ts.map +1 -0
  36. package/dist/common/aggregator/gpu-aggregator/webgl-bin-sorter.js +223 -0
  37. package/dist/common/aggregator/index.d.ts +6 -0
  38. package/dist/common/aggregator/index.d.ts.map +1 -0
  39. package/dist/common/aggregator/index.js +5 -0
  40. package/dist/common/types.d.ts +11 -0
  41. package/dist/common/types.d.ts.map +1 -0
  42. package/dist/common/types.js +4 -0
  43. package/dist/common/utils/bounds-utils.d.ts +10 -0
  44. package/dist/common/utils/bounds-utils.d.ts.map +1 -0
  45. package/dist/common/utils/bounds-utils.js +20 -0
  46. package/dist/common/utils/color-utils.d.ts +10 -0
  47. package/dist/common/utils/color-utils.d.ts.map +1 -0
  48. package/dist/common/utils/color-utils.js +65 -0
  49. package/dist/common/utils/prop-utils.d.ts.map +1 -0
  50. package/dist/common/utils/prop-utils.js +12 -0
  51. package/dist/common/utils/scale-utils.d.ts +46 -0
  52. package/dist/common/utils/scale-utils.d.ts.map +1 -0
  53. package/dist/common/utils/scale-utils.js +180 -0
  54. package/dist/contour-layer/bin-options-uniforms.d.ts +13 -0
  55. package/dist/contour-layer/bin-options-uniforms.d.ts.map +1 -0
  56. package/dist/contour-layer/bin-options-uniforms.js +17 -0
  57. package/dist/contour-layer/contour-layer.d.ts +42 -50
  58. package/dist/contour-layer/contour-layer.d.ts.map +1 -1
  59. package/dist/contour-layer/contour-layer.js +232 -192
  60. package/dist/contour-layer/contour-utils.d.ts +36 -15
  61. package/dist/contour-layer/contour-utils.d.ts.map +1 -1
  62. package/dist/contour-layer/contour-utils.js +24 -29
  63. package/dist/contour-layer/marching-squares-codes.d.ts.map +1 -1
  64. package/dist/contour-layer/marching-squares-codes.js +3 -0
  65. package/dist/contour-layer/marching-squares.d.ts +22 -6
  66. package/dist/contour-layer/marching-squares.d.ts.map +1 -1
  67. package/dist/contour-layer/marching-squares.js +71 -68
  68. package/dist/contour-layer/value-reader.d.ts +10 -0
  69. package/dist/contour-layer/value-reader.d.ts.map +1 -0
  70. package/dist/contour-layer/value-reader.js +46 -0
  71. package/dist/dist.dev.js +4842 -4081
  72. package/dist/grid-layer/bin-options-uniforms.d.ts +13 -0
  73. package/dist/grid-layer/bin-options-uniforms.d.ts.map +1 -0
  74. package/dist/grid-layer/bin-options-uniforms.js +17 -0
  75. package/dist/grid-layer/grid-cell-layer-vertex.glsl.d.ts +3 -0
  76. package/dist/grid-layer/grid-cell-layer-vertex.glsl.d.ts.map +1 -0
  77. package/dist/grid-layer/grid-cell-layer-vertex.glsl.js +51 -0
  78. package/dist/grid-layer/grid-cell-layer.d.ts +32 -0
  79. package/dist/grid-layer/grid-cell-layer.d.ts.map +1 -0
  80. package/dist/grid-layer/grid-cell-layer.js +93 -0
  81. package/dist/grid-layer/grid-layer-uniforms.d.ts +21 -0
  82. package/dist/grid-layer/grid-layer-uniforms.d.ts.map +1 -0
  83. package/dist/grid-layer/grid-layer-uniforms.js +23 -0
  84. package/dist/grid-layer/grid-layer.d.ts +175 -13
  85. package/dist/grid-layer/grid-layer.d.ts.map +1 -1
  86. package/dist/grid-layer/grid-layer.js +342 -46
  87. package/dist/{aggregation-layer.d.ts → heatmap-layer/aggregation-layer.d.ts} +1 -0
  88. package/dist/heatmap-layer/aggregation-layer.d.ts.map +1 -0
  89. package/dist/{aggregation-layer.js → heatmap-layer/aggregation-layer.js} +6 -21
  90. package/dist/heatmap-layer/heatmap-layer-uniforms.d.ts +30 -0
  91. package/dist/heatmap-layer/heatmap-layer-uniforms.d.ts.map +1 -0
  92. package/dist/heatmap-layer/heatmap-layer-uniforms.js +32 -0
  93. package/dist/heatmap-layer/heatmap-layer-utils.d.ts +1 -1
  94. package/dist/heatmap-layer/heatmap-layer-utils.d.ts.map +1 -1
  95. package/dist/heatmap-layer/heatmap-layer-utils.js +3 -0
  96. package/dist/heatmap-layer/heatmap-layer.d.ts +6 -4
  97. package/dist/heatmap-layer/heatmap-layer.d.ts.map +1 -1
  98. package/dist/heatmap-layer/heatmap-layer.js +43 -33
  99. package/dist/heatmap-layer/max-fs.glsl.d.ts.map +1 -1
  100. package/dist/heatmap-layer/max-fs.glsl.js +3 -0
  101. package/dist/heatmap-layer/max-vs.glsl.d.ts +1 -1
  102. package/dist/heatmap-layer/max-vs.glsl.d.ts.map +1 -1
  103. package/dist/heatmap-layer/max-vs.glsl.js +6 -4
  104. package/dist/heatmap-layer/triangle-layer-fragment.glsl.d.ts +1 -1
  105. package/dist/heatmap-layer/triangle-layer-fragment.glsl.d.ts.map +1 -1
  106. package/dist/heatmap-layer/triangle-layer-fragment.glsl.js +5 -23
  107. package/dist/heatmap-layer/triangle-layer-uniforms.d.ts +22 -0
  108. package/dist/heatmap-layer/triangle-layer-uniforms.d.ts.map +1 -0
  109. package/dist/heatmap-layer/triangle-layer-uniforms.js +22 -0
  110. package/dist/heatmap-layer/triangle-layer-vertex.glsl.d.ts +1 -1
  111. package/dist/heatmap-layer/triangle-layer-vertex.glsl.d.ts.map +1 -1
  112. package/dist/heatmap-layer/triangle-layer-vertex.glsl.js +10 -30
  113. package/dist/heatmap-layer/triangle-layer.d.ts +4 -10
  114. package/dist/heatmap-layer/triangle-layer.d.ts.map +1 -1
  115. package/dist/heatmap-layer/triangle-layer.js +17 -30
  116. package/dist/heatmap-layer/weights-fs.glsl.d.ts.map +1 -1
  117. package/dist/heatmap-layer/weights-fs.glsl.js +3 -0
  118. package/dist/heatmap-layer/weights-vs.glsl.d.ts +1 -1
  119. package/dist/heatmap-layer/weights-vs.glsl.d.ts.map +1 -1
  120. package/dist/heatmap-layer/weights-vs.glsl.js +6 -7
  121. package/dist/hexagon-layer/bin-options-uniforms.d.ts +14 -0
  122. package/dist/hexagon-layer/bin-options-uniforms.d.ts.map +1 -0
  123. package/dist/hexagon-layer/bin-options-uniforms.js +17 -0
  124. package/dist/hexagon-layer/hexagon-cell-layer-vertex.glsl.d.ts +3 -0
  125. package/dist/hexagon-layer/hexagon-cell-layer-vertex.glsl.d.ts.map +1 -0
  126. package/dist/hexagon-layer/hexagon-cell-layer-vertex.glsl.js +55 -0
  127. package/dist/hexagon-layer/hexagon-cell-layer.d.ts +29 -0
  128. package/dist/hexagon-layer/hexagon-cell-layer.d.ts.map +1 -0
  129. package/dist/hexagon-layer/hexagon-cell-layer.js +94 -0
  130. package/dist/hexagon-layer/hexagon-layer-uniforms.d.ts +19 -0
  131. package/dist/hexagon-layer/hexagon-layer-uniforms.d.ts.map +1 -0
  132. package/dist/hexagon-layer/hexagon-layer-uniforms.js +21 -0
  133. package/dist/hexagon-layer/hexagon-layer.d.ts +84 -54
  134. package/dist/hexagon-layer/hexagon-layer.d.ts.map +1 -1
  135. package/dist/hexagon-layer/hexagon-layer.js +307 -123
  136. package/dist/hexagon-layer/hexbin.d.ts +17 -0
  137. package/dist/hexagon-layer/hexbin.d.ts.map +1 -0
  138. package/dist/hexagon-layer/hexbin.js +69 -0
  139. package/dist/index.cjs +3025 -2946
  140. package/dist/index.cjs.map +4 -4
  141. package/dist/index.d.ts +7 -13
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +5 -27
  144. package/dist/screen-grid-layer/bin-options-uniforms.d.ts +11 -0
  145. package/dist/screen-grid-layer/bin-options-uniforms.d.ts.map +1 -0
  146. package/dist/screen-grid-layer/bin-options-uniforms.js +15 -0
  147. package/dist/screen-grid-layer/screen-grid-cell-layer.d.ts +11 -16
  148. package/dist/screen-grid-layer/screen-grid-cell-layer.d.ts.map +1 -1
  149. package/dist/screen-grid-layer/screen-grid-cell-layer.js +52 -134
  150. package/dist/screen-grid-layer/screen-grid-layer-fragment.glsl.d.ts +1 -1
  151. package/dist/screen-grid-layer/screen-grid-layer-fragment.glsl.d.ts.map +1 -1
  152. package/dist/screen-grid-layer/screen-grid-layer-fragment.glsl.js +4 -24
  153. package/dist/screen-grid-layer/screen-grid-layer-uniforms.d.ts +17 -0
  154. package/dist/screen-grid-layer/screen-grid-layer-uniforms.d.ts.map +1 -0
  155. package/dist/screen-grid-layer/screen-grid-layer-uniforms.js +19 -0
  156. package/dist/screen-grid-layer/screen-grid-layer-vertex.glsl.d.ts +1 -1
  157. package/dist/screen-grid-layer/screen-grid-layer-vertex.glsl.d.ts.map +1 -1
  158. package/dist/screen-grid-layer/screen-grid-layer-vertex.glsl.js +21 -62
  159. package/dist/screen-grid-layer/screen-grid-layer.d.ts +33 -40
  160. package/dist/screen-grid-layer/screen-grid-layer.d.ts.map +1 -1
  161. package/dist/screen-grid-layer/screen-grid-layer.js +157 -174
  162. package/dist.min.js +401 -382
  163. package/package.json +10 -9
  164. package/src/common/aggregation-layer.ts +107 -0
  165. package/src/common/aggregator/aggregator.ts +88 -0
  166. package/src/common/aggregator/cpu-aggregator/aggregate.ts +101 -0
  167. package/src/common/aggregator/cpu-aggregator/cpu-aggregator.ts +203 -0
  168. package/src/common/aggregator/cpu-aggregator/sort-bins.ts +63 -0
  169. package/src/common/aggregator/cpu-aggregator/vertex-accessor.ts +86 -0
  170. package/src/common/aggregator/gpu-aggregator/aggregation-transform-uniforms.ts +33 -0
  171. package/src/common/aggregator/gpu-aggregator/bin-sorter-uniforms.ts +27 -0
  172. package/src/common/aggregator/gpu-aggregator/utils.ts +27 -0
  173. package/src/common/aggregator/gpu-aggregator/webgl-aggregation-transform.ts +247 -0
  174. package/src/common/aggregator/gpu-aggregator/webgl-aggregator.ts +274 -0
  175. package/src/common/aggregator/gpu-aggregator/webgl-bin-sorter.ts +258 -0
  176. package/src/common/aggregator/index.ts +10 -0
  177. package/src/{types.ts → common/types.ts} +10 -4
  178. package/src/common/utils/bounds-utils.ts +34 -0
  179. package/src/common/utils/color-utils.ts +86 -0
  180. package/src/common/utils/prop-utils.ts +13 -0
  181. package/src/common/utils/scale-utils.ts +236 -0
  182. package/src/contour-layer/bin-options-uniforms.ts +26 -0
  183. package/src/contour-layer/contour-layer.ts +300 -265
  184. package/src/contour-layer/contour-utils.ts +68 -39
  185. package/src/contour-layer/marching-squares-codes.ts +4 -0
  186. package/src/contour-layer/marching-squares.ts +93 -82
  187. package/src/contour-layer/value-reader.ts +65 -0
  188. package/src/grid-layer/bin-options-uniforms.ts +26 -0
  189. package/src/grid-layer/grid-cell-layer-vertex.glsl.ts +68 -0
  190. package/src/grid-layer/grid-cell-layer.ts +141 -0
  191. package/src/grid-layer/grid-layer-uniforms.ts +37 -0
  192. package/src/grid-layer/grid-layer.ts +614 -73
  193. package/src/{aggregation-layer.ts → heatmap-layer/aggregation-layer.ts} +6 -21
  194. package/src/heatmap-layer/heatmap-layer-uniforms.ts +50 -0
  195. package/src/heatmap-layer/heatmap-layer-utils.ts +9 -1
  196. package/src/heatmap-layer/heatmap-layer.ts +59 -36
  197. package/src/heatmap-layer/max-fs.glsl.ts +4 -0
  198. package/src/heatmap-layer/max-vs.glsl.ts +7 -4
  199. package/src/heatmap-layer/triangle-layer-fragment.glsl.ts +5 -23
  200. package/src/heatmap-layer/triangle-layer-uniforms.ts +37 -0
  201. package/src/heatmap-layer/triangle-layer-vertex.glsl.ts +10 -30
  202. package/src/heatmap-layer/triangle-layer.ts +26 -31
  203. package/src/heatmap-layer/weights-fs.glsl.ts +4 -0
  204. package/src/heatmap-layer/weights-vs.glsl.ts +7 -7
  205. package/src/hexagon-layer/bin-options-uniforms.ts +27 -0
  206. package/src/hexagon-layer/hexagon-cell-layer-vertex.glsl.ts +73 -0
  207. package/src/hexagon-layer/hexagon-cell-layer.ts +141 -0
  208. package/src/hexagon-layer/hexagon-layer-uniforms.ts +34 -0
  209. package/src/hexagon-layer/hexagon-layer.ts +454 -186
  210. package/src/hexagon-layer/hexbin.ts +79 -0
  211. package/src/index.ts +21 -34
  212. package/src/screen-grid-layer/bin-options-uniforms.ts +23 -0
  213. package/src/screen-grid-layer/screen-grid-cell-layer.ts +71 -156
  214. package/src/screen-grid-layer/screen-grid-layer-fragment.glsl.ts +4 -24
  215. package/src/screen-grid-layer/screen-grid-layer-uniforms.ts +31 -0
  216. package/src/screen-grid-layer/screen-grid-layer-vertex.glsl.ts +21 -64
  217. package/src/screen-grid-layer/screen-grid-layer.ts +194 -222
  218. package/dist/aggregation-layer.d.ts.map +0 -1
  219. package/dist/cpu-grid-layer/cpu-grid-layer.d.ts +0 -158
  220. package/dist/cpu-grid-layer/cpu-grid-layer.d.ts.map +0 -1
  221. package/dist/cpu-grid-layer/cpu-grid-layer.js +0 -130
  222. package/dist/cpu-grid-layer/grid-aggregator.d.ts +0 -35
  223. package/dist/cpu-grid-layer/grid-aggregator.d.ts.map +0 -1
  224. package/dist/cpu-grid-layer/grid-aggregator.js +0 -141
  225. package/dist/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.d.ts +0 -3
  226. package/dist/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.d.ts.map +0 -1
  227. package/dist/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.js +0 -30
  228. package/dist/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.d.ts +0 -3
  229. package/dist/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.d.ts.map +0 -1
  230. package/dist/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.js +0 -112
  231. package/dist/gpu-grid-layer/gpu-grid-cell-layer.d.ts +0 -48
  232. package/dist/gpu-grid-layer/gpu-grid-cell-layer.d.ts.map +0 -1
  233. package/dist/gpu-grid-layer/gpu-grid-cell-layer.js +0 -146
  234. package/dist/gpu-grid-layer/gpu-grid-layer.d.ts +0 -99
  235. package/dist/gpu-grid-layer/gpu-grid-layer.d.ts.map +0 -1
  236. package/dist/gpu-grid-layer/gpu-grid-layer.js +0 -289
  237. package/dist/grid-aggregation-layer.d.ts +0 -67
  238. package/dist/grid-aggregation-layer.d.ts.map +0 -1
  239. package/dist/grid-aggregation-layer.js +0 -173
  240. package/dist/hexagon-layer/hexagon-aggregator.d.ts +0 -27
  241. package/dist/hexagon-layer/hexagon-aggregator.d.ts.map +0 -1
  242. package/dist/hexagon-layer/hexagon-aggregator.js +0 -112
  243. package/dist/types.d.ts +0 -12
  244. package/dist/types.d.ts.map +0 -1
  245. package/dist/types.js +0 -1
  246. package/dist/utils/aggregation-operation-utils.d.ts +0 -19
  247. package/dist/utils/aggregation-operation-utils.d.ts.map +0 -1
  248. package/dist/utils/aggregation-operation-utils.js +0 -94
  249. package/dist/utils/bin-sorter.d.ts +0 -52
  250. package/dist/utils/bin-sorter.d.ts.map +0 -1
  251. package/dist/utils/bin-sorter.js +0 -167
  252. package/dist/utils/color-utils.d.ts +0 -3
  253. package/dist/utils/color-utils.d.ts.map +0 -1
  254. package/dist/utils/color-utils.js +0 -53
  255. package/dist/utils/cpu-aggregator.d.ts +0 -169
  256. package/dist/utils/cpu-aggregator.d.ts.map +0 -1
  257. package/dist/utils/cpu-aggregator.js +0 -421
  258. package/dist/utils/gpu-grid-aggregation/aggregate-all-fs.glsl.d.ts +0 -3
  259. package/dist/utils/gpu-grid-aggregation/aggregate-all-fs.glsl.d.ts.map +0 -1
  260. package/dist/utils/gpu-grid-aggregation/aggregate-all-fs.glsl.js +0 -36
  261. package/dist/utils/gpu-grid-aggregation/aggregate-all-vs.glsl.d.ts +0 -3
  262. package/dist/utils/gpu-grid-aggregation/aggregate-all-vs.glsl.d.ts.map +0 -1
  263. package/dist/utils/gpu-grid-aggregation/aggregate-all-vs.glsl.js +0 -42
  264. package/dist/utils/gpu-grid-aggregation/aggregate-to-grid-fs.glsl.d.ts +0 -3
  265. package/dist/utils/gpu-grid-aggregation/aggregate-to-grid-fs.glsl.d.ts.map +0 -1
  266. package/dist/utils/gpu-grid-aggregation/aggregate-to-grid-fs.glsl.js +0 -30
  267. package/dist/utils/gpu-grid-aggregation/aggregate-to-grid-vs.glsl.d.ts +0 -3
  268. package/dist/utils/gpu-grid-aggregation/aggregate-to-grid-vs.glsl.d.ts.map +0 -1
  269. package/dist/utils/gpu-grid-aggregation/aggregate-to-grid-vs.glsl.js +0 -61
  270. package/dist/utils/gpu-grid-aggregation/gpu-grid-aggregator-constants.d.ts +0 -38
  271. package/dist/utils/gpu-grid-aggregation/gpu-grid-aggregator-constants.d.ts.map +0 -1
  272. package/dist/utils/gpu-grid-aggregation/gpu-grid-aggregator-constants.js +0 -41
  273. package/dist/utils/gpu-grid-aggregation/gpu-grid-aggregator-utils.d.ts +0 -1
  274. package/dist/utils/gpu-grid-aggregation/gpu-grid-aggregator-utils.d.ts.map +0 -1
  275. package/dist/utils/gpu-grid-aggregation/gpu-grid-aggregator-utils.js +0 -1
  276. package/dist/utils/gpu-grid-aggregation/gpu-grid-aggregator.d.ts +0 -76
  277. package/dist/utils/gpu-grid-aggregation/gpu-grid-aggregator.d.ts.map +0 -1
  278. package/dist/utils/gpu-grid-aggregation/gpu-grid-aggregator.js +0 -555
  279. package/dist/utils/gpu-grid-aggregation/transform-mean-vs.glsl.d.ts +0 -3
  280. package/dist/utils/gpu-grid-aggregation/transform-mean-vs.glsl.d.ts.map +0 -1
  281. package/dist/utils/gpu-grid-aggregation/transform-mean-vs.glsl.js +0 -32
  282. package/dist/utils/grid-aggregation-utils.d.ts +0 -30
  283. package/dist/utils/grid-aggregation-utils.d.ts.map +0 -1
  284. package/dist/utils/grid-aggregation-utils.js +0 -114
  285. package/dist/utils/prop-utils.d.ts.map +0 -1
  286. package/dist/utils/prop-utils.js +0 -28
  287. package/dist/utils/resource-utils.d.ts +0 -14
  288. package/dist/utils/resource-utils.d.ts.map +0 -1
  289. package/dist/utils/resource-utils.js +0 -38
  290. package/dist/utils/scale-utils.d.ts +0 -15
  291. package/dist/utils/scale-utils.d.ts.map +0 -1
  292. package/dist/utils/scale-utils.js +0 -184
  293. package/src/cpu-grid-layer/cpu-grid-layer.ts +0 -329
  294. package/src/cpu-grid-layer/grid-aggregator.ts +0 -184
  295. package/src/gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.ts +0 -35
  296. package/src/gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.ts +0 -143
  297. package/src/gpu-grid-layer/gpu-grid-cell-layer.ts +0 -201
  298. package/src/gpu-grid-layer/gpu-grid-layer.ts +0 -455
  299. package/src/grid-aggregation-layer.ts +0 -243
  300. package/src/hexagon-layer/hexagon-aggregator.ts +0 -127
  301. package/src/utils/aggregation-operation-utils.ts +0 -118
  302. package/src/utils/bin-sorter.ts +0 -218
  303. package/src/utils/color-utils.ts +0 -57
  304. package/src/utils/cpu-aggregator.ts +0 -503
  305. package/src/utils/gpu-grid-aggregation/aggregate-all-fs.glsl.ts +0 -40
  306. package/src/utils/gpu-grid-aggregation/aggregate-all-vs.glsl.ts +0 -54
  307. package/src/utils/gpu-grid-aggregation/aggregate-to-grid-fs.glsl.ts +0 -35
  308. package/src/utils/gpu-grid-aggregation/aggregate-to-grid-vs.glsl.ts +0 -79
  309. package/src/utils/gpu-grid-aggregation/gpu-grid-aggregator-constants.ts +0 -46
  310. package/src/utils/gpu-grid-aggregation/gpu-grid-aggregator-utils.ts +0 -0
  311. package/src/utils/gpu-grid-aggregation/gpu-grid-aggregator.md +0 -155
  312. package/src/utils/gpu-grid-aggregation/gpu-grid-aggregator.ts +0 -690
  313. package/src/utils/gpu-grid-aggregation/transform-mean-vs.glsl.ts +0 -38
  314. package/src/utils/grid-aggregation-utils.ts +0 -147
  315. package/src/utils/prop-utils.ts +0 -29
  316. package/src/utils/resource-utils.ts +0 -53
  317. package/src/utils/scale-utils.js +0 -219
  318. /package/dist/{utils → common/utils}/prop-utils.d.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["index.js", "screen-grid-layer/screen-grid-layer.js", "utils/gpu-grid-aggregation/gpu-grid-aggregator.js", "utils/gpu-grid-aggregation/gpu-grid-aggregator-constants.js", "utils/aggregation-operation-utils.js", "utils/gpu-grid-aggregation/aggregate-to-grid-vs.glsl.js", "utils/gpu-grid-aggregation/aggregate-to-grid-fs.glsl.js", "utils/gpu-grid-aggregation/aggregate-all-vs.glsl.js", "utils/gpu-grid-aggregation/aggregate-all-fs.glsl.js", "utils/gpu-grid-aggregation/transform-mean-vs.glsl.js", "utils/resource-utils.js", "screen-grid-layer/screen-grid-cell-layer.js", "utils/color-utils.js", "screen-grid-layer/screen-grid-layer-vertex.glsl.js", "screen-grid-layer/screen-grid-layer-fragment.glsl.js", "grid-aggregation-layer.js", "aggregation-layer.js", "utils/prop-utils.js", "utils/scale-utils.js", "utils/bin-sorter.js", "cpu-grid-layer/grid-aggregator.js", "utils/grid-aggregation-utils.js", "cpu-grid-layer/cpu-grid-layer.js", "utils/cpu-aggregator.js", "hexagon-layer/hexagon-layer.js", "hexagon-layer/hexagon-aggregator.js", "contour-layer/contour-layer.js", "contour-layer/marching-squares.js", "contour-layer/marching-squares-codes.js", "contour-layer/contour-utils.js", "grid-layer/grid-layer.js", "gpu-grid-layer/gpu-grid-layer.js", "gpu-grid-layer/gpu-grid-cell-layer.js", "gpu-grid-layer/gpu-grid-cell-layer-vertex.glsl.js", "gpu-grid-layer/gpu-grid-cell-layer-fragment.glsl.js", "heatmap-layer/heatmap-layer-utils.js", "heatmap-layer/heatmap-layer.js", "heatmap-layer/triangle-layer.js", "heatmap-layer/triangle-layer-vertex.glsl.js", "heatmap-layer/triangle-layer-fragment.glsl.js", "heatmap-layer/weights-vs.glsl.js", "heatmap-layer/weights-fs.glsl.js", "heatmap-layer/max-vs.glsl.js", "heatmap-layer/max-fs.glsl.js"],
4
- "sourcesContent": ["// Copyright (c) 2015 - 2017 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.\nexport { default as ScreenGridLayer } from \"./screen-grid-layer/screen-grid-layer.js\";\nexport { default as CPUGridLayer } from \"./cpu-grid-layer/cpu-grid-layer.js\";\nexport { default as HexagonLayer } from \"./hexagon-layer/hexagon-layer.js\";\nexport { default as ContourLayer } from \"./contour-layer/contour-layer.js\";\nexport { default as GridLayer } from \"./grid-layer/grid-layer.js\";\nexport { default as GPUGridLayer } from \"./gpu-grid-layer/gpu-grid-layer.js\";\nexport { AGGREGATION_OPERATION } from \"./utils/aggregation-operation-utils.js\";\n// experimental export\nexport { default as HeatmapLayer } from \"./heatmap-layer/heatmap-layer.js\";\nexport { default as _GPUGridAggregator } from \"./utils/gpu-grid-aggregation/gpu-grid-aggregator.js\";\nexport { default as _CPUAggregator } from \"./utils/cpu-aggregator.js\";\nexport { default as _AggregationLayer } from \"./aggregation-layer.js\";\nexport { default as _BinSorter } from \"./utils/bin-sorter.js\";\n", "// Copyright (c) 2015 - 2017 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.\nimport { log } from '@deck.gl/core';\nimport GPUGridAggregator from \"../utils/gpu-grid-aggregation/gpu-grid-aggregator.js\";\nimport { AGGREGATION_OPERATION, getValueFunc } from \"../utils/aggregation-operation-utils.js\";\nimport ScreenGridCellLayer from \"./screen-grid-cell-layer.js\";\nimport GridAggregationLayer from \"../grid-aggregation-layer.js\";\nimport { getFloatTexture } from \"../utils/resource-utils.js\";\nconst defaultProps = {\n ...ScreenGridCellLayer.defaultProps,\n getPosition: { type: 'accessor', value: (d) => d.position },\n getWeight: { type: 'accessor', value: 1 },\n gpuAggregation: false, // TODO(v9): Re-enable GPU aggregation.\n aggregation: 'SUM'\n};\nconst POSITION_ATTRIBUTE_NAME = 'positions';\nconst DIMENSIONS = {\n data: {\n props: ['cellSizePixels']\n },\n weights: {\n props: ['aggregation'],\n accessors: ['getWeight']\n }\n};\n/** Aggregates data into histogram bins and renders them as a grid. */\nclass ScreenGridLayer extends GridAggregationLayer {\n initializeState() {\n super.initializeAggregationLayer({\n dimensions: DIMENSIONS,\n // @ts-expect-error\n getCellSize: props => props.cellSizePixels // TODO\n });\n const weights = {\n count: {\n size: 1,\n operation: AGGREGATION_OPERATION.SUM,\n needMax: true,\n maxTexture: getFloatTexture(this.context.device, { id: `${this.id}-max-texture` })\n }\n };\n this.setState({\n supported: true,\n projectPoints: true, // aggregation in screen space\n weights,\n subLayerData: { attributes: {} },\n maxTexture: weights.count.maxTexture,\n positionAttributeName: 'positions',\n posOffset: [0, 0],\n translation: [1, -1]\n });\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n [POSITION_ATTRIBUTE_NAME]: {\n size: 3,\n accessor: 'getPosition',\n type: 'float64',\n fp64: this.use64bitPositions()\n },\n // this attribute is used in gpu aggregation path only\n count: { size: 3, accessor: 'getWeight' }\n });\n }\n shouldUpdateState({ changeFlags }) {\n return this.state.supported && changeFlags.somethingChanged;\n }\n updateState(opts) {\n super.updateState(opts);\n }\n renderLayers() {\n if (!this.state.supported) {\n return [];\n }\n const { maxTexture, numRow, numCol, weights } = this.state;\n const { updateTriggers } = this.props;\n const { aggregationBuffer } = weights.count;\n const CellLayerClass = this.getSubLayerClass('cells', ScreenGridCellLayer);\n return new CellLayerClass(this.props, this.getSubLayerProps({\n id: 'cell-layer',\n updateTriggers\n }), {\n data: { attributes: { instanceCounts: aggregationBuffer } },\n maxTexture,\n numInstances: numRow * numCol\n });\n }\n finalizeState(context) {\n super.finalizeState(context);\n const { aggregationBuffer, maxBuffer, maxTexture } = this.state;\n aggregationBuffer?.delete();\n maxBuffer?.delete();\n maxTexture?.delete();\n }\n getPickingInfo({ info }) {\n const { index } = info;\n if (index >= 0) {\n const { gpuGridAggregator, gpuAggregation, weights } = this.state;\n // Get count aggregation results\n const aggregationResults = gpuAggregation\n ? gpuGridAggregator.getData('count')\n : weights.count;\n // Each instance (one cell) is aggregated into single pixel,\n // Get current instance's aggregation details.\n info.object = GPUGridAggregator.getAggregationData({\n pixelIndex: index,\n ...aggregationResults\n });\n }\n return info;\n }\n // Aggregation Overrides\n updateResults({ aggregationData, maxData }) {\n const { count } = this.state.weights;\n count.aggregationData = aggregationData;\n count.aggregationBuffer.write(aggregationData);\n count.maxData = maxData;\n count.maxTexture.setImageData({ data: maxData });\n }\n /* eslint-disable complexity, max-statements */\n updateAggregationState(opts) {\n const cellSize = opts.props.cellSizePixels;\n const cellSizeChanged = opts.oldProps.cellSizePixels !== cellSize;\n const { viewportChanged } = opts.changeFlags;\n let gpuAggregation = opts.props.gpuAggregation;\n if (this.state.gpuAggregation !== opts.props.gpuAggregation) {\n if (gpuAggregation && !GPUGridAggregator.isSupported(this.context.device)) {\n log.warn('GPU Grid Aggregation not supported, falling back to CPU')();\n gpuAggregation = false;\n }\n }\n const gpuAggregationChanged = gpuAggregation !== this.state.gpuAggregation;\n this.setState({\n gpuAggregation\n });\n const positionsChanged = this.isAttributeChanged(POSITION_ATTRIBUTE_NAME);\n const { dimensions } = this.state;\n const { data, weights } = dimensions;\n const aggregationDataDirty = positionsChanged ||\n gpuAggregationChanged ||\n viewportChanged ||\n this.isAggregationDirty(opts, {\n compareAll: gpuAggregation, // check for all (including extentions props) when using gpu aggregation\n dimension: data\n });\n const aggregationWeightsDirty = this.isAggregationDirty(opts, { dimension: weights });\n this.setState({\n aggregationDataDirty,\n aggregationWeightsDirty\n });\n const { viewport } = this.context;\n if (viewportChanged || cellSizeChanged) {\n const { width, height } = viewport;\n const numCol = Math.ceil(width / cellSize);\n const numRow = Math.ceil(height / cellSize);\n this.allocateResources(numRow, numCol);\n this.setState({\n // transformation from clipspace to screen(pixel) space\n scaling: [width / 2, -height / 2, 1],\n gridOffset: { xOffset: cellSize, yOffset: cellSize },\n width,\n height,\n numCol,\n numRow\n });\n }\n if (aggregationWeightsDirty) {\n this._updateAccessors(opts);\n }\n if (aggregationDataDirty || aggregationWeightsDirty) {\n this._resetResults();\n }\n }\n /* eslint-enable complexity, max-statements */\n // Private\n _updateAccessors(opts) {\n const { getWeight, aggregation, data } = opts.props;\n const { count } = this.state.weights;\n if (count) {\n count.getWeight = getWeight;\n count.operation = AGGREGATION_OPERATION[aggregation];\n }\n this.setState({ getValue: getValueFunc(aggregation, getWeight, { data }) });\n }\n _resetResults() {\n const { count } = this.state.weights;\n if (count) {\n count.aggregationData = null;\n }\n }\n}\nScreenGridLayer.layerName = 'ScreenGridLayer';\nScreenGridLayer.defaultProps = defaultProps;\nexport default ScreenGridLayer;\n", "// Copyright (c) 2015 - 2018 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.\nimport { Model, TextureTransform } from '@luma.gl/engine';\nimport { fp64arithmetic } from '@luma.gl/shadertools';\nimport { GL } from '@luma.gl/constants';\nimport { project32, _mergeShaders as mergeShaders, getShaderAssembler } from '@deck.gl/core';\nimport { DEFAULT_RUN_PARAMS, MAX_32_BIT_FLOAT, MIN_BLEND_EQUATION, MAX_BLEND_EQUATION, MAX_MIN_BLEND_EQUATION, EQUATION_MAP, DEFAULT_WEIGHT_PARAMS, PIXEL_SIZE } from \"./gpu-grid-aggregator-constants.js\";\nimport { AGGREGATION_OPERATION } from \"../aggregation-operation-utils.js\";\nimport AGGREGATE_TO_GRID_VS from \"./aggregate-to-grid-vs.glsl.js\";\nimport AGGREGATE_TO_GRID_FS from \"./aggregate-to-grid-fs.glsl.js\";\nimport AGGREGATE_ALL_VS from \"./aggregate-all-vs.glsl.js\";\nimport AGGREGATE_ALL_FS from \"./aggregate-all-fs.glsl.js\";\nimport TRANSFORM_MEAN_VS from \"./transform-mean-vs.glsl.js\";\nimport { getFloatTexture, getFramebuffer } from \"./../resource-utils.js\";\nconst BUFFER_NAMES = ['aggregationBuffer', 'maxMinBuffer', 'minBuffer', 'maxBuffer'];\nconst ARRAY_BUFFER_MAP = {\n maxData: 'maxBuffer',\n minData: 'minBuffer',\n maxMinData: 'maxMinBuffer'\n};\nconst REQUIRED_FEATURES = [\n 'float32-renderable-webgl',\n 'texture-blend-float-webgl'\n];\nexport default class GPUGridAggregator {\n // Decode and return aggregation data of given pixel.\n static getAggregationData({ aggregationData, maxData, minData, maxMinData, pixelIndex }) {\n const index = pixelIndex * PIXEL_SIZE;\n const results = {};\n if (aggregationData) {\n results.cellCount = aggregationData[index + 3];\n results.cellWeight = aggregationData[index];\n }\n if (maxMinData) {\n results.maxCellWieght = maxMinData[0];\n results.minCellWeight = maxMinData[3];\n }\n else {\n if (maxData) {\n results.maxCellWieght = maxData[0];\n results.totalCount = maxData[3];\n }\n if (minData) {\n results.minCellWeight = minData[0];\n results.totalCount = minData[3];\n }\n }\n return results;\n }\n // Decodes and retuns counts and weights of all cells\n static getCellData({ countsData, size = 1 }) {\n const numCells = countsData.length / 4;\n const cellWeights = new Float32Array(numCells * size);\n const cellCounts = new Uint32Array(numCells);\n for (let i = 0; i < numCells; i++) {\n // weights in RGB channels\n for (let sizeIndex = 0; sizeIndex < size; sizeIndex++) {\n cellWeights[i * size + sizeIndex] = countsData[i * 4 + sizeIndex];\n }\n // count in Alpha channel\n cellCounts[i] = countsData[i * 4 + 3];\n }\n return { cellCounts, cellWeights };\n }\n static isSupported(device) {\n return REQUIRED_FEATURES.every(feature => device.features.has(feature));\n }\n constructor(device, props = {}) {\n // DEBUG ONLY\n // static logData({aggregationBuffer, minBuffer, maxBuffer, maxMinBuffer, limit = 10}) {\n // if (aggregationBuffer) {\n // console.log('Aggregation Data:');\n // const agrData = aggregationBuffer.getData();\n // for (let index = 0; index < agrData.length && limit > 0; index += 4) {\n // if (agrData[index + 3] > 0) {\n // console.log(\n // `index: ${index} weights: ${agrData[index]} ${agrData[index + 1]} ${\n // agrData[index + 2]\n // } count: ${agrData[index + 3]}`\n // );\n // limit--;\n // }\n // }\n // }\n // const obj = {minBuffer, maxBuffer, maxMinBuffer};\n // for (const key in obj) {\n // if (obj[key]) {\n // const data = obj[key].getData();\n // console.log(`${key} data : R: ${data[0]} G: ${data[1]} B: ${data[2]} A: ${data[3]}`);\n // }\n // }\n // }\n this.state = {\n // per weight GPU resources\n weightAttributes: {},\n textures: {},\n meanTextures: {},\n buffers: {},\n framebuffers: {},\n maxMinFramebuffers: {},\n minFramebuffers: {},\n maxFramebuffers: {},\n equations: {},\n shaderOptions: {},\n modelDirty: false,\n // common resources to be deleted\n resources: {},\n // results\n results: {}\n };\n this.id = props.id || 'gpu-grid-aggregator';\n this.device = device;\n const REQUIRED_FEATURES = [\n 'float32-renderable-webgl' // render to float texture\n ];\n this._hasGPUSupport = REQUIRED_FEATURES.every(feature => device.features.has(feature));\n if (this._hasGPUSupport) {\n this._setupModels();\n }\n }\n // Delete owned resources.\n delete() {\n const { gridAggregationModel, allAggregationModel, meanTransform } = this;\n const { textures, framebuffers, maxMinFramebuffers, minFramebuffers, maxFramebuffers, meanTextures, resources } = this.state;\n gridAggregationModel?.destroy();\n allAggregationModel?.destroy();\n meanTransform?.destroy();\n deleteResources([\n framebuffers,\n textures,\n maxMinFramebuffers,\n minFramebuffers,\n maxFramebuffers,\n meanTextures,\n resources\n ]);\n }\n // Perform aggregation and retun the results\n run(opts = {}) {\n // reset results\n this.setState({ results: {} });\n const aggregationParams = this._normalizeAggregationParams(opts);\n return this._runAggregation(aggregationParams);\n }\n // Reads aggregation data into JS Array object\n // For WebGL1, data is available in JS Array objects already.\n // For WebGL2, data is read from Buffer objects and cached for subsequent queries.\n getData(weightId) {\n const data = {};\n const results = this.state.results;\n if (!results[weightId].aggregationData) {\n // cache the results if reading from the buffer (WebGL2 path)\n results[weightId].aggregationData = results[weightId].aggregationBuffer.getData();\n }\n data.aggregationData = results[weightId].aggregationData;\n // Check for optional results\n for (const arrayName in ARRAY_BUFFER_MAP) {\n const bufferName = ARRAY_BUFFER_MAP[arrayName];\n if (results[weightId][arrayName] || results[weightId][bufferName]) {\n // cache the result\n results[weightId][arrayName] =\n results[weightId][arrayName] || results[weightId][bufferName].getData();\n data[arrayName] = results[weightId][arrayName];\n }\n }\n return data;\n }\n updateShaders(shaderOptions = {}) {\n this.setState({ shaderOptions, modelDirty: true });\n }\n // PRIVATE\n _normalizeAggregationParams(opts) {\n const aggregationParams = { ...DEFAULT_RUN_PARAMS, ...opts };\n const { weights } = aggregationParams;\n if (weights) {\n aggregationParams.weights = normalizeWeightParams(weights);\n }\n return aggregationParams;\n }\n // Update priveate state\n setState(updateObject) {\n Object.assign(this.state, updateObject);\n }\n // GPU Aggregation methods\n _getAggregateData(opts) {\n const results = {};\n const { textures, framebuffers, maxMinFramebuffers, minFramebuffers, maxFramebuffers, resources } = this.state;\n const { weights } = opts;\n for (const id in weights) {\n results[id] = {};\n const { needMin, needMax, combineMaxMin } = weights[id];\n results[id].aggregationTexture = textures[id];\n results[id].aggregationBuffer = this.device.readPixelsToBufferWebGL(framebuffers[id], {\n target: weights[id].aggregationBuffer, // update if a buffer is provided\n sourceType: 5126\n });\n if (needMin && needMax && combineMaxMin) {\n results[id].maxMinBuffer = this.device.readPixelsToBufferWebGL(maxMinFramebuffers[id], {\n target: weights[id].maxMinBuffer, // update if a buffer is provided\n sourceType: 5126\n });\n results[id].maxMinTexture = resources[`${id}-maxMinTexture`];\n }\n else {\n if (needMin) {\n results[id].minBuffer = this.device.readPixelsToBufferWebGL(minFramebuffers[id], {\n target: weights[id].minBuffer, // update if a buffer is provided\n sourceType: 5126\n });\n results[id].minTexture = resources[`${id}-minTexture`];\n }\n if (needMax) {\n results[id].maxBuffer = this.device.readPixelsToBufferWebGL(maxFramebuffers[id], {\n target: weights[id].maxBuffer, // update if a buffer is provided\n sourceType: 5126\n });\n results[id].maxTexture = resources[`${id}-maxTexture`];\n }\n }\n }\n this._trackGPUResultBuffers(results, weights);\n return results;\n }\n _renderAggregateData(opts) {\n const { cellSize, projectPoints, attributes, moduleSettings, numCol, numRow, weights, translation, scaling } = opts;\n const { maxMinFramebuffers, minFramebuffers, maxFramebuffers } = this.state;\n const gridSize = [numCol, numRow];\n const parameters = {\n blend: true,\n depthTest: false,\n blendFunc: [1, 1]\n };\n const uniforms = {\n cellSize,\n gridSize,\n projectPoints,\n translation,\n scaling\n };\n for (const id in weights) {\n const { needMin, needMax } = weights[id];\n const combineMaxMin = needMin && needMax && weights[id].combineMaxMin;\n this._renderToWeightsTexture({\n id,\n parameters,\n moduleSettings,\n uniforms,\n gridSize,\n attributes,\n weights\n });\n if (combineMaxMin) {\n this._renderToMaxMinTexture({\n id,\n parameters: { ...parameters, blendEquation: MAX_MIN_BLEND_EQUATION },\n gridSize,\n minOrMaxFb: maxMinFramebuffers[id],\n clearParams: { clearColor: [0, 0, 0, MAX_32_BIT_FLOAT] },\n combineMaxMin\n });\n }\n else {\n if (needMin) {\n this._renderToMaxMinTexture({\n id,\n parameters: { ...parameters, blendEquation: MIN_BLEND_EQUATION },\n gridSize,\n minOrMaxFb: minFramebuffers[id],\n clearParams: { clearColor: [MAX_32_BIT_FLOAT, MAX_32_BIT_FLOAT, MAX_32_BIT_FLOAT, 0] },\n combineMaxMin\n });\n }\n if (needMax) {\n this._renderToMaxMinTexture({\n id,\n parameters: { ...parameters, blendEquation: MAX_BLEND_EQUATION },\n gridSize,\n minOrMaxFb: maxFramebuffers[id],\n clearParams: { clearColor: [0, 0, 0, 0] },\n combineMaxMin\n });\n }\n }\n }\n }\n // render all aggregated grid-cells to generate Min, Max or MaxMin data texture\n _renderToMaxMinTexture(opts) {\n const { id, gridSize, minOrMaxFb, combineMaxMin, clearParams = {} } = opts;\n const { framebuffers } = this.state;\n const { allAggregationModel } = this;\n this.device.withParametersWebGL({\n ...clearParams,\n framebuffer: minOrMaxFb,\n viewport: [0, 0, gridSize[0], gridSize[1]]\n }, () => {\n this.device.clearWebGL({ color: true });\n // allAggregationModel.setParameters(parameters);\n allAggregationModel.setUniforms({ gridSize, combineMaxMin });\n allAggregationModel.setBindings({ uSampler: framebuffers[id].texture });\n allAggregationModel.draw();\n // TODO - we need to create a render pass for the aggregation\n // allAggregationModel.draw(renderPass);\n });\n }\n // render all data points to aggregate weights\n _renderToWeightsTexture(opts) {\n const { id, parameters, moduleSettings, uniforms, gridSize, weights } = opts;\n const { framebuffers, equations, weightAttributes } = this.state;\n const { gridAggregationModel } = this;\n const { operation } = weights[id];\n const clearColor = operation === AGGREGATION_OPERATION.MIN\n ? [MAX_32_BIT_FLOAT, MAX_32_BIT_FLOAT, MAX_32_BIT_FLOAT, 0]\n : [0, 0, 0, 0];\n this.device.withParametersWebGL({\n framebuffer: framebuffers[id],\n viewport: [0, 0, gridSize[0], gridSize[1]],\n clearColor\n }, () => {\n this.device.clearWebGL({ color: true });\n const attributes = { weights: weightAttributes[id] };\n gridAggregationModel.draw({\n parameters: { ...parameters, blendEquation: equations[id] },\n moduleSettings,\n uniforms,\n attributes\n });\n });\n if (operation === AGGREGATION_OPERATION.MEAN) {\n const { meanTextures, textures } = this.state;\n const transformOptions = {\n _sourceTextures: { aggregationValues: meanTextures[id] }, // contains aggregated data\n _targetTexture: textures[id], // store mean values,\n elementCount: textures[id].width * textures[id].height\n };\n if (this.meanTransform) {\n this.meanTransform.update(transformOptions);\n }\n else {\n this.meanTransform = getMeanTransform(this.device, transformOptions);\n }\n this.meanTransform.run({\n parameters: {\n blend: false,\n depthTest: false\n }\n });\n // update framebuffer with mean results so device.readPixelsToBufferWebGL returns mean values\n framebuffers[id].attach({ [36064]: textures[id] });\n }\n }\n _runAggregation(opts) {\n this._updateModels(opts);\n this._setupFramebuffers(opts);\n this._renderAggregateData(opts);\n const results = this._getAggregateData(opts);\n this.setState({ results });\n return results;\n }\n // set up framebuffer for each weight\n /* eslint-disable complexity, max-depth, max-statements*/\n _setupFramebuffers(opts) {\n const { textures, framebuffers, maxMinFramebuffers, minFramebuffers, maxFramebuffers, meanTextures, equations } = this.state;\n const { weights } = opts;\n const { numCol, numRow } = opts;\n const framebufferSize = { width: numCol, height: numRow };\n for (const id in weights) {\n const { needMin, needMax, combineMaxMin, operation } = weights[id];\n textures[id] =\n weights[id].aggregationTexture ||\n textures[id] ||\n getFloatTexture(this.device, { id: `${id}-texture`, width: numCol, height: numRow });\n textures[id].resize(framebufferSize);\n let texture = textures[id];\n if (operation === AGGREGATION_OPERATION.MEAN) {\n // For MEAN, we first aggregatet into a temp texture\n meanTextures[id] =\n meanTextures[id] ||\n getFloatTexture(this.device, { id: `${id}-mean-texture`, width: numCol, height: numRow });\n meanTextures[id].resize(framebufferSize);\n texture = meanTextures[id];\n }\n if (framebuffers[id]) {\n framebuffers[id].attach({ [36064]: texture });\n }\n else {\n framebuffers[id] = getFramebuffer(this.device, {\n id: `${id}-fb`,\n width: numCol,\n height: numRow,\n texture\n });\n }\n framebuffers[id].resize(framebufferSize);\n equations[id] = EQUATION_MAP[operation] || EQUATION_MAP[AGGREGATION_OPERATION.SUM];\n // For min/max framebuffers will use default size 1X1\n if (needMin || needMax) {\n if (needMin && needMax && combineMaxMin) {\n if (!maxMinFramebuffers[id]) {\n texture = weights[id].maxMinTexture || this._getMinMaxTexture(`${id}-maxMinTexture`);\n maxMinFramebuffers[id] = getFramebuffer(this.device, { id: `${id}-maxMinFb`, texture });\n }\n }\n else {\n if (needMin) {\n if (!minFramebuffers[id]) {\n texture = weights[id].minTexture || this._getMinMaxTexture(`${id}-minTexture`);\n minFramebuffers[id] = getFramebuffer(this.device, {\n id: `${id}-minFb`,\n texture\n });\n }\n }\n if (needMax) {\n if (!maxFramebuffers[id]) {\n texture = weights[id].maxTexture || this._getMinMaxTexture(`${id}-maxTexture`);\n maxFramebuffers[id] = getFramebuffer(this.device, {\n id: `${id}-maxFb`,\n texture\n });\n }\n }\n }\n }\n }\n }\n /* eslint-enable complexity, max-depth, max-statements */\n _getMinMaxTexture(name) {\n const { resources } = this.state;\n if (!resources[name]) {\n resources[name] = getFloatTexture(this.device, { id: 'resourceName' });\n }\n return resources[name];\n }\n _setupModels({ numCol = 0, numRow = 0 } = {}) {\n const { shaderOptions } = this.state;\n this.gridAggregationModel?.destroy();\n this.gridAggregationModel = getAggregationModel(this.device, shaderOptions);\n if (!this.allAggregationModel) {\n const instanceCount = numCol * numRow;\n this.allAggregationModel = getAllAggregationModel(this.device, instanceCount);\n }\n }\n // set up buffers for all weights\n _setupWeightAttributes(opts) {\n const { weightAttributes } = this.state;\n const { weights } = opts;\n for (const id in weights) {\n weightAttributes[id] = opts.attributes[id];\n }\n }\n /** GPU Aggregation results are provided in Buffers, if new Buffer objects are created track them for later deletion. */\n /* eslint-disable max-depth */\n _trackGPUResultBuffers(results, weights) {\n const { resources } = this.state;\n for (const id in results) {\n if (results[id]) {\n for (const bufferName of BUFFER_NAMES) {\n if (results[id][bufferName] && weights[id][bufferName] !== results[id][bufferName]) {\n // No result buffer is provided in weights object, `device.readPixelsToBufferWebGL` has created a new Buffer object\n // collect the new buffer for garabge collection\n const name = `gpu-result-${id}-${bufferName}`;\n if (resources[name]) {\n resources[name].delete();\n }\n resources[name] = results[id][bufferName];\n }\n }\n }\n }\n }\n /* eslint-enable max-depth */\n _updateModels(opts) {\n const { vertexCount, attributes, numCol, numRow } = opts;\n const { modelDirty } = this.state;\n if (modelDirty) {\n this._setupModels(opts);\n this.setState({ modelDirty: false });\n }\n // this maps color/elevation to weight name.\n this._setupWeightAttributes(opts);\n this.gridAggregationModel.setVertexCount(vertexCount);\n this.gridAggregationModel.setAttributes(attributes);\n this.allAggregationModel.setInstanceCount(numCol * numRow);\n }\n}\n// HELPER METHODS\nfunction normalizeWeightParams(weights) {\n const result = {};\n for (const id in weights) {\n result[id] = { ...DEFAULT_WEIGHT_PARAMS, ...weights[id] };\n }\n return result;\n}\nfunction deleteResources(resources) {\n resources = Array.isArray(resources) ? resources : [resources];\n resources.forEach(obj => {\n for (const name in obj) {\n obj[name].delete();\n }\n });\n}\nfunction getAggregationModel(device, shaderOptions) {\n const shaders = mergeShaders({\n vs: AGGREGATE_TO_GRID_VS,\n fs: AGGREGATE_TO_GRID_FS,\n modules: [fp64arithmetic, project32]\n }, shaderOptions);\n return new Model(device, {\n id: 'Grid-Aggregation-Model',\n vertexCount: 1,\n drawMode: 0,\n shaderAssembler: getShaderAssembler(),\n ...shaders\n });\n}\nfunction getAllAggregationModel(device, instanceCount) {\n return new Model(device, {\n id: 'All-Aggregation-Model',\n vs: AGGREGATE_ALL_VS,\n fs: AGGREGATE_ALL_FS,\n modules: [fp64arithmetic],\n vertexCount: 1,\n topology: 'point-list',\n isInstanced: true,\n instanceCount,\n attributes: {\n // @ts-expect-error\n position: [0, 0]\n }\n });\n}\nfunction getMeanTransform(device, opts) {\n return new TextureTransform(device, {\n vs: TRANSFORM_MEAN_VS,\n _targetTextureVarying: 'meanValues',\n ...opts\n });\n}\n", "import { GL } from '@luma.gl/constants';\nimport { AGGREGATION_OPERATION } from \"../aggregation-operation-utils.js\";\nexport const DEFAULT_RUN_PARAMS = {\n projectPoints: false,\n viewport: null,\n createBufferObjects: true,\n moduleSettings: {}\n};\nexport const MAX_32_BIT_FLOAT = 3.402823466e38;\nexport const MIN_BLEND_EQUATION = [32775, 32774];\nexport const MAX_BLEND_EQUATION = [32776, 32774];\nexport const MAX_MIN_BLEND_EQUATION = [32776, 32775];\nexport const EQUATION_MAP = {\n [AGGREGATION_OPERATION.SUM]: 32774,\n [AGGREGATION_OPERATION.MEAN]: 32774,\n [AGGREGATION_OPERATION.MIN]: MIN_BLEND_EQUATION,\n [AGGREGATION_OPERATION.MAX]: MAX_BLEND_EQUATION\n};\nexport const ELEMENTCOUNT = 4;\nexport const DEFAULT_WEIGHT_PARAMS = {\n size: 1,\n operation: AGGREGATION_OPERATION.SUM,\n needMin: false,\n needMax: false,\n combineMaxMin: false\n};\nexport const PIXEL_SIZE = 4; // RGBA32F\nexport const WEIGHT_SIZE = 3;\nexport const MAX_MIN_TEXTURE_OPTS = {\n format: 34836,\n type: 5126,\n border: 0,\n mipmaps: false,\n sampler: {\n minFilter: 'nearest',\n magFilter: 'nearest'\n },\n dataFormat: 6408,\n width: 1,\n height: 1\n};\n", "// 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.\nexport const AGGREGATION_OPERATION = {\n SUM: 1,\n MEAN: 2,\n MIN: 3,\n MAX: 4\n};\nfunction sumReducer(accu, cur) {\n return accu + cur;\n}\nfunction maxReducer(accu, cur) {\n return cur > accu ? cur : accu;\n}\nfunction minReducer(accu, cur) {\n return cur < accu ? cur : accu;\n}\nexport function getMean(pts, accessor) {\n if (Number.isFinite(accessor)) {\n return pts.length ? accessor : null;\n }\n const filtered = pts.map(accessor).filter(Number.isFinite);\n return filtered.length ? filtered.reduce(sumReducer, 0) / filtered.length : null;\n}\nexport function getSum(pts, accessor) {\n if (Number.isFinite(accessor)) {\n return pts.length ? pts.length * accessor : null;\n }\n const filtered = pts.map(accessor).filter(Number.isFinite);\n return filtered.length ? filtered.reduce(sumReducer, 0) : null;\n}\nexport function getMax(pts, accessor) {\n if (Number.isFinite(accessor)) {\n return pts.length ? accessor : null;\n }\n const filtered = pts.map(accessor).filter(Number.isFinite);\n return filtered.length ? filtered.reduce(maxReducer, -Infinity) : null;\n}\nexport function getMin(pts, accessor) {\n if (Number.isFinite(accessor)) {\n return pts.length ? accessor : null;\n }\n const filtered = pts.map(accessor).filter(Number.isFinite);\n return filtered.length ? filtered.reduce(minReducer, Infinity) : null;\n}\n// Function to convert from aggregation/accessor props (like colorAggregation and getColorWeight) to getValue prop (like getColorValue)\nexport function getValueFunc(aggregation, accessor, context) {\n const op = AGGREGATION_OPERATION[aggregation] || AGGREGATION_OPERATION.SUM;\n accessor = wrapAccessor(accessor, context);\n switch (op) {\n case AGGREGATION_OPERATION.MIN:\n return pts => getMin(pts, accessor);\n case AGGREGATION_OPERATION.SUM:\n return pts => getSum(pts, accessor);\n case AGGREGATION_OPERATION.MEAN:\n return pts => getMean(pts, accessor);\n case AGGREGATION_OPERATION.MAX:\n return pts => getMax(pts, accessor);\n default:\n return null;\n }\n}\nfunction wrapAccessor(accessor, context = {}) {\n if (Number.isFinite(accessor)) {\n return accessor;\n }\n return pt => {\n context.index = pt.index;\n return accessor(pt.source, context);\n };\n}\nexport function wrapGetValueFunc(getValue, context = {}) {\n return pts => {\n context.indices = pts.map(pt => pt.index);\n return getValue(pts.map(pt => pt.source), context);\n };\n}\n", "// Copyright (c) 2015 - 2018 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.\nexport default `\\\n#version 300 es\n#define SHADER_NAME gpu-aggregation-to-grid-vs\nin vec3 positions;\nin vec3 positions64Low;\nin vec3 weights;\nuniform vec2 cellSize;\nuniform vec2 gridSize;\nuniform bool projectPoints;\nuniform vec2 translation;\nuniform vec3 scaling;\nout vec3 vWeights;\nvec2 project_to_pixel(vec4 pos) {\nvec4 result;\npos.xy = pos.xy/pos.w;\nresult = pos + vec4(translation, 0., 0.);\nresult.xy = scaling.z > 0. ? result.xy * scaling.xy : result.xy;\nreturn result.xy;\n}\nvoid main(void) {\nvWeights = weights;\nvec4 windowPos = vec4(positions, 1.);\nif (projectPoints) {\nwindowPos = project_position_to_clipspace(positions, positions64Low, vec3(0));\n}\nvec2 pos = project_to_pixel(windowPos);\nvec2 pixelXY64[2];\npixelXY64[0] = vec2(pos.x, 0.);\npixelXY64[1] = vec2(pos.y, 0.);\nvec2 gridXY64[2];\ngridXY64[0] = div_fp64(pixelXY64[0], vec2(cellSize.x, 0));\ngridXY64[1] = div_fp64(pixelXY64[1], vec2(cellSize.y, 0));\nfloat x = floor(gridXY64[0].x);\nfloat y = floor(gridXY64[1].x);\npos = vec2(x, y);\npos = (pos * (2., 2.) / (gridSize)) - (1., 1.);\nvec2 offset = 1.0 / gridSize;\npos = pos + offset;\ngl_Position = vec4(pos, 0.0, 1.0);\ngl_PointSize = 1.0;\n}\n`;\n", "// Copyright (c) 2015 - 2018 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.\nexport default `\\\n#version 300 es\n#define SHADER_NAME gpu-aggregation-to-grid-fs\nprecision highp float;\nin vec3 vWeights;\nout vec4 fragColor;\nvoid main(void) {\nfragColor = vec4(vWeights, 1.0);\nDECKGL_FILTER_COLOR(fragColor, geometry);\n}\n`;\n", "// Copyright (c) 2015 - 2018 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.\nexport default `\\\n#version 300 es\n#define SHADER_NAME gpu-aggregation-all-vs-64\nin vec2 position;\nuniform ivec2 gridSize;\nout vec2 vTextureCoord;\nvoid main(void) {\nvec2 pos = vec2(-1.0, -1.0);\nvec2 offset = 1.0 / vec2(gridSize);\npos = pos + offset;\ngl_Position = vec4(pos, 0.0, 1.0);\nint yIndex = gl_InstanceID / gridSize[0];\nint xIndex = gl_InstanceID - (yIndex * gridSize[0]);\nvec2 yIndexFP64 = vec2(float(yIndex), 0.);\nvec2 xIndexFP64 = vec2(float(xIndex), 0.);\nvec2 gridSizeYFP64 = vec2(gridSize[1], 0.);\nvec2 gridSizeXFP64 = vec2(gridSize[0], 0.);\nvec2 texCoordXFP64 = div_fp64(yIndexFP64, gridSizeYFP64);\nvec2 texCoordYFP64 = div_fp64(xIndexFP64, gridSizeXFP64);\nvTextureCoord = vec2(texCoordYFP64.x, texCoordXFP64.x);\ngl_PointSize = 1.0;\n}\n`;\n", "// Copyright (c) 2015 - 2018 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.\nexport default `\\\n#version 300 es\n#define SHADER_NAME gpu-aggregation-all-fs\nprecision highp float;\nin vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform bool combineMaxMin;\nout vec4 fragColor;\nvoid main(void) {\nvec4 textureColor = texture(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));\nif (textureColor.a == 0.) {\ndiscard;\n}\nfragColor.rgb = textureColor.rgb;\nfragColor.a = combineMaxMin ? textureColor.r : textureColor.a;\n}\n`;\n", "// Copyright (c) 2015 - 2018 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.\nexport default `\\\n#version 300 es\n#define SHADER_NAME gpu-aggregation-transform-mean-vs\nin vec4 aggregationValues;\nout vec4 meanValues;\nvoid main()\n{\nbool isCellValid = bool(aggregationValues.w > 0.);\nmeanValues.xyz = isCellValid ? aggregationValues.xyz/aggregationValues.w : vec3(0, 0, 0);\nmeanValues.w = aggregationValues.w;\ngl_PointSize = 1.0;\n}\n`;\n", "const DEFAULT_PARAMETERS = {\n minFilter: 'nearest',\n magFilter: 'nearest'\n};\n// TODO - not working\nexport function getFloatTexture(device, opts) {\n const { width = 1, height = 1, data = null, parameters = DEFAULT_PARAMETERS } = opts;\n const texture = device.createTexture({\n data,\n format: 'rgba32float', // device.info.type === 'webgl2' ? 'rgba32float' : GL.RGBA,\n // type: GL.FLOAT,\n // border: 0,\n mipmaps: false,\n sampler: parameters,\n // dataFormat: GL.RGBA,\n width,\n height\n // ts-expect-error\n // unpackFlipY\n });\n return texture;\n}\nexport function getFramebuffer(device, opts) {\n const { id, width = 1, height = 1, texture } = opts;\n const fb = device.createFramebuffer({\n id,\n width,\n height,\n colorAttachments: [texture]\n });\n return fb;\n}\nexport function getFloatArray(array, size, fillValue = 0) {\n if (!array || array.length < size) {\n return new Float32Array(size).fill(fillValue);\n }\n return array;\n}\n", "// 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.\nimport { Model, Geometry } from '@luma.gl/engine';\nimport { Layer, log, picking } from '@deck.gl/core';\nimport { defaultColorRange, colorRangeToFlatArray } from \"../utils/color-utils.js\";\nimport vs from \"./screen-grid-layer-vertex.glsl.js\";\nimport fs from \"./screen-grid-layer-fragment.glsl.js\";\nconst DEFAULT_MINCOLOR = [0, 0, 0, 0];\nconst DEFAULT_MAXCOLOR = [0, 255, 0, 255];\nconst COLOR_PROPS = ['minColor', 'maxColor', 'colorRange', 'colorDomain'];\nconst defaultProps = {\n cellSizePixels: { type: 'number', value: 100, min: 1 },\n cellMarginPixels: { type: 'number', value: 2, min: 0, max: 5 },\n colorDomain: null,\n colorRange: defaultColorRange\n};\nclass ScreenGridCellLayer extends Layer {\n getShaders() {\n return { vs, fs, modules: [picking] };\n }\n initializeState() {\n const attributeManager = this.getAttributeManager();\n attributeManager.addInstanced({\n // eslint-disable-next-line @typescript-eslint/unbound-method\n instancePositions: { size: 3, update: this.calculateInstancePositions },\n instanceCounts: { size: 4, noAlloc: true }\n });\n this.setState({\n model: this._getModel()\n });\n }\n shouldUpdateState({ changeFlags }) {\n // 'instanceCounts' buffer contetns change on viewport change.\n return changeFlags.somethingChanged;\n }\n updateState(params) {\n super.updateState(params);\n const { oldProps, props, changeFlags } = params;\n const attributeManager = this.getAttributeManager();\n if (props.numInstances !== oldProps.numInstances) {\n attributeManager.invalidateAll();\n }\n else if (oldProps.cellSizePixels !== props.cellSizePixels) {\n attributeManager.invalidate('instancePositions');\n }\n this._updateUniforms(oldProps, props, changeFlags);\n }\n draw({ uniforms }) {\n const { parameters, maxTexture } = this.props;\n const minColor = this.props.minColor || DEFAULT_MINCOLOR;\n const maxColor = this.props.maxColor || DEFAULT_MAXCOLOR;\n // If colorDomain not specified we use default domain [1, maxCount]\n // maxCount value will be sampled form maxTexture in vertex shader.\n const colorDomain = this.props.colorDomain || [1, 0];\n const model = this.state.model;\n model.setUniforms(uniforms);\n model.setBindings({\n maxTexture\n });\n model.setUniforms({\n // @ts-expect-error stricter luma gl types\n minColor,\n // @ts-expect-error stricter luma gl types\n maxColor,\n colorDomain\n });\n model.setParameters({\n depthWriteEnabled: false,\n // How to specify depth mask in WebGPU?\n // depthMask: false,\n ...parameters\n });\n model.draw(this.context.renderPass);\n }\n calculateInstancePositions(attribute, { numInstances }) {\n const { width, height } = this.context.viewport;\n const { cellSizePixels } = this.props;\n const numCol = Math.ceil(width / cellSizePixels);\n const { value, size } = attribute;\n for (let i = 0; i < numInstances; i++) {\n const x = i % numCol;\n const y = Math.floor(i / numCol);\n value[i * size + 0] = ((x * cellSizePixels) / width) * 2 - 1;\n value[i * size + 1] = 1 - ((y * cellSizePixels) / height) * 2;\n value[i * size + 2] = 0;\n }\n }\n // Private Methods\n _getModel() {\n return new Model(this.context.device, {\n ...this.getShaders(),\n id: this.props.id,\n bufferLayout: this.getAttributeManager().getBufferLayouts(),\n geometry: new Geometry({\n topology: 'triangle-list',\n attributes: {\n // prettier-ignore\n positions: new Float32Array([\n 0, 0, 0,\n 1, 0, 0,\n 1, 1, 0,\n 0, 0, 0,\n 1, 1, 0,\n 0, 1, 0,\n ])\n }\n }),\n isInstanced: true\n });\n }\n _shouldUseMinMax() {\n const { minColor, maxColor, colorDomain, colorRange } = this.props;\n if (minColor || maxColor) {\n log.deprecated('ScreenGridLayer props: minColor and maxColor', 'colorRange, colorDomain')();\n return true;\n }\n // minColor and maxColor not supplied, check if colorRange or colorDomain supplied.\n // NOTE: colorDomain and colorRange are experimental features, use them only when supplied.\n if (colorDomain || colorRange) {\n return false;\n }\n // None specified, use default minColor and maxColor\n return true;\n }\n _updateUniforms(oldProps, props, changeFlags) {\n const model = this.state.model;\n if (COLOR_PROPS.some(key => oldProps[key] !== props[key])) {\n model.setUniforms({ shouldUseMinMax: this._shouldUseMinMax() });\n }\n if (oldProps.colorRange !== props.colorRange) {\n model.setUniforms({ colorRange: colorRangeToFlatArray(props.colorRange) });\n }\n if (oldProps.cellMarginPixels !== props.cellMarginPixels ||\n oldProps.cellSizePixels !== props.cellSizePixels ||\n changeFlags.viewportChanged) {\n const { width, height } = this.context.viewport;\n const { cellSizePixels, cellMarginPixels } = this.props;\n const margin = cellSizePixels > cellMarginPixels ? cellMarginPixels : 0;\n const cellScale = new Float32Array([\n ((cellSizePixels - margin) / width) * 2,\n (-(cellSizePixels - margin) / height) * 2,\n 1\n ]);\n // @ts-expect-error stricter luma gl types\n model.setUniforms({ cellScale });\n }\n }\n}\nScreenGridCellLayer.layerName = 'ScreenGridCellLayer';\nScreenGridCellLayer.defaultProps = defaultProps;\nexport default ScreenGridCellLayer;\n", "// Copyright (c) 2015 - 2017 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.\nexport const defaultColorRange = [\n [255, 255, 178],\n [254, 217, 118],\n [254, 178, 76],\n [253, 141, 60],\n [240, 59, 32],\n [189, 0, 38]\n];\n// Converts a colorRange array to a flat array with 4 components per color\nexport function colorRangeToFlatArray(colorRange, normalize = false, ArrayType = Float32Array) {\n let flatArray;\n if (Number.isFinite(colorRange[0])) {\n // its already a flat array.\n flatArray = new ArrayType(colorRange);\n }\n else {\n // flatten it\n flatArray = new ArrayType(colorRange.length * 4);\n let index = 0;\n for (let i = 0; i < colorRange.length; i++) {\n const color = colorRange[i];\n flatArray[index++] = color[0];\n flatArray[index++] = color[1];\n flatArray[index++] = color[2];\n flatArray[index++] = Number.isFinite(color[3]) ? color[3] : 255;\n }\n }\n if (normalize) {\n for (let i = 0; i < flatArray.length; i++) {\n flatArray[i] /= 255;\n }\n }\n return flatArray;\n}\n", "// Copyright (c) 2015 - 2017 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.\nexport default `\\\n#version 300 es\n#define SHADER_NAME screen-grid-layer-vertex-shader\n#define RANGE_COUNT 6\nin vec3 positions;\nin vec3 instancePositions;\nin vec4 instanceCounts;\nin vec3 instancePickingColors;\nuniform float opacity;\nuniform vec3 cellScale;\nuniform vec4 minColor;\nuniform vec4 maxColor;\nuniform vec4 colorRange[RANGE_COUNT];\nuniform vec2 colorDomain;\nuniform bool shouldUseMinMax;\nuniform sampler2D maxTexture;\nout vec4 vColor;\nout float vSampleCount;\nvec4 quantizeScale(vec2 domain, vec4 range[RANGE_COUNT], float value) {\nvec4 outColor = vec4(0., 0., 0., 0.);\nif (value >= domain.x && value <= domain.y) {\nfloat domainRange = domain.y - domain.x;\nif (domainRange <= 0.) {\noutColor = colorRange[0];\n} else {\nfloat rangeCount = float(RANGE_COUNT);\nfloat rangeStep = domainRange / rangeCount;\nfloat idx = floor((value - domain.x) / rangeStep);\nidx = clamp(idx, 0., rangeCount - 1.);\nint intIdx = int(idx);\noutColor = colorRange[intIdx];\n}\n}\noutColor = outColor / 255.;\nreturn outColor;\n}\nvoid main(void) {\nvSampleCount = instanceCounts.a;\nfloat weight = instanceCounts.r;\nfloat maxWeight = texture(maxTexture, vec2(0.5)).r;\nfloat step = weight / maxWeight;\nvec4 minMaxColor = mix(minColor, maxColor, step) / 255.;\nvec2 domain = colorDomain;\nfloat domainMaxValid = float(colorDomain.y != 0.);\ndomain.y = mix(maxWeight, colorDomain.y, domainMaxValid);\nvec4 rangeColor = quantizeScale(domain, colorRange, weight);\nfloat rangeMinMax = float(shouldUseMinMax);\nvec4 color = mix(rangeColor, minMaxColor, rangeMinMax);\nvColor = vec4(color.rgb, color.a * opacity);\npicking_setPickingColor(instancePickingColors);\ngl_Position = vec4(instancePositions + positions * cellScale, 1.);\n}\n`;\n", "// Copyright (c) 2015 - 2017 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/* fragment shader for the grid-layer */\nexport default `\\\n#version 300 es\n#define SHADER_NAME screen-grid-layer-fragment-shader\nprecision highp float;\nin vec4 vColor;\nin float vSampleCount;\nout vec4 fragColor;\nvoid main(void) {\nif (vSampleCount <= 0.0) {\ndiscard;\n}\nfragColor = vColor;\nDECKGL_FILTER_COLOR(fragColor, geometry);\n}\n`;\n", "// Copyright (c) 2015 - 2017 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.\nimport { GL } from '@luma.gl/constants';\nimport { log } from '@deck.gl/core';\nimport AggregationLayer from \"./aggregation-layer.js\";\nimport GPUGridAggregator from \"./utils/gpu-grid-aggregation/gpu-grid-aggregator.js\";\nimport BinSorter from \"./utils/bin-sorter.js\";\nimport { pointToDensityGridDataCPU } from \"./cpu-grid-layer/grid-aggregator.js\";\nclass GridAggregationLayer extends AggregationLayer {\n initializeAggregationLayer({ dimensions }) {\n super.initializeAggregationLayer(dimensions);\n this.setState({\n // CPU aggregation results\n layerData: {},\n gpuGridAggregator: new GPUGridAggregator(this.context.device, {\n id: `${this.id}-gpu-aggregator`\n }),\n cpuGridAggregator: pointToDensityGridDataCPU\n });\n }\n updateState(opts) {\n // get current attributes\n super.updateState(opts);\n this.updateAggregationState(opts);\n const { aggregationDataDirty, aggregationWeightsDirty, gpuAggregation } = this.state;\n if (this.getNumInstances() <= 0) {\n return;\n }\n let aggregationDirty = false;\n // CPU aggregation is two steps\n // 1. Create bins (based on cellSize and position) 2. Aggregate weights for each bin\n // For GPU aggregation both above steps are combined into one step\n // step-1\n if (aggregationDataDirty || (gpuAggregation && aggregationWeightsDirty)) {\n this._updateAggregation(opts);\n aggregationDirty = true;\n }\n // step-2 (Applicalbe for CPU aggregation only)\n if (!gpuAggregation && (aggregationDataDirty || aggregationWeightsDirty)) {\n this._updateWeightBins();\n this._uploadAggregationResults();\n aggregationDirty = true;\n }\n this.setState({ aggregationDirty });\n }\n finalizeState(context) {\n const { count } = this.state.weights;\n if (count && count.aggregationBuffer) {\n count.aggregationBuffer.delete();\n }\n this.state.gpuGridAggregator?.delete();\n super.finalizeState(context);\n }\n updateShaders(shaders) {\n if (this.state.gpuAggregation) {\n this.state.gpuGridAggregator.updateShaders(shaders);\n }\n }\n // Methods that can be overriden by subclasses for customizations\n updateAggregationState(opts) {\n // Sublayers should implement this method.\n log.assert(false);\n }\n allocateResources(numRow, numCol) {\n if (this.state.numRow !== numRow || this.state.numCol !== numCol) {\n const dataBytes = numCol * numRow * 4 * 4;\n const { weights } = this.state;\n for (const name in weights) {\n const weight = weights[name];\n if (weight.aggregationBuffer) {\n weight.aggregationBuffer.delete();\n }\n weight.aggregationBuffer = this.context.device.createBuffer({\n byteLength: dataBytes,\n // @ts-expect-error legacy\n accessor: {\n size: 4,\n type: 5126,\n divisor: 1\n }\n });\n }\n }\n }\n updateResults({ aggregationData, maxMinData, maxData, minData }) {\n const { count } = this.state.weights;\n if (count) {\n count.aggregationData = aggregationData;\n count.maxMinData = maxMinData;\n count.maxData = maxData;\n count.minData = minData;\n }\n }\n // Private\n _updateAggregation(opts) {\n const { cpuGridAggregator, gpuGridAggregator, gridOffset, posOffset, translation = [0, 0], scaling = [0, 0, 0], boundingBox, projectPoints, gpuAggregation, numCol, numRow } = this.state;\n const { props } = opts;\n const { viewport } = this.context;\n const attributes = this.getAttributes();\n const vertexCount = this.getNumInstances();\n if (!gpuAggregation) {\n const result = cpuGridAggregator(props, {\n gridOffset,\n projectPoints,\n attributes,\n viewport,\n posOffset,\n boundingBox\n });\n this.setState({\n layerData: result\n });\n }\n else {\n const { weights } = this.state;\n gpuGridAggregator.run({\n weights,\n cellSize: [gridOffset.xOffset, gridOffset.yOffset],\n numCol,\n numRow,\n translation,\n scaling,\n vertexCount,\n projectPoints,\n attributes,\n moduleSettings: this.getModuleSettings()\n });\n }\n }\n _updateWeightBins() {\n const { getValue } = this.state;\n const sortedBins = new BinSorter(this.state.layerData.data || [], { getValue });\n this.setState({ sortedBins });\n }\n _uploadAggregationResults() {\n const { numCol, numRow } = this.state;\n const { data } = this.state.layerData;\n const { aggregatedBins, minValue, maxValue, totalCount } = this.state.sortedBins;\n const ELEMENTCOUNT = 4;\n const aggregationSize = numCol * numRow * ELEMENTCOUNT;\n const aggregationData = new Float32Array(aggregationSize).fill(0);\n for (const bin of aggregatedBins) {\n const { lonIdx, latIdx } = data[bin.i];\n const { value, counts } = bin;\n const cellIndex = (lonIdx + latIdx * numCol) * ELEMENTCOUNT;\n aggregationData[cellIndex] = value;\n aggregationData[cellIndex + ELEMENTCOUNT - 1] = counts;\n }\n const maxMinData = new Float32Array([maxValue, 0, 0, minValue]);\n const maxData = new Float32Array([maxValue, 0, 0, totalCount]);\n const minData = new Float32Array([minValue, 0, 0, totalCount]);\n this.updateResults({ aggregationData, maxMinData, maxData, minData });\n }\n}\nGridAggregationLayer.layerName = 'GridAggregationLayer';\nexport default GridAggregationLayer;\n", "// Copyright (c) 2015 - 2017 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.\nimport { CompositeLayer, AttributeManager, _compareProps as compareProps } from '@deck.gl/core';\nimport { filterProps } from \"./utils/prop-utils.js\";\nclass AggregationLayer extends CompositeLayer {\n initializeAggregationLayer(dimensions) {\n super.initializeState(this.context);\n this.setState({\n // Layer props , when changed doesn't require updating aggregation\n ignoreProps: filterProps(this.constructor._propTypes, dimensions.data.props),\n dimensions\n });\n }\n updateState(opts) {\n super.updateState(opts);\n const { changeFlags } = opts;\n if (changeFlags.extensionsChanged) {\n const shaders = this.getShaders({});\n if (shaders && shaders.defines) {\n shaders.defines.NON_INSTANCED_MODEL = 1;\n }\n this.updateShaders(shaders);\n }\n // Explictly call to update attributes as 'CompositeLayer' doesn't call this\n this._updateAttributes();\n }\n updateAttributes(changedAttributes) {\n // Super classes, can refer to state.changedAttributes to determine what\n // attributes changed\n this.setState({ changedAttributes });\n }\n getAttributes() {\n return this.getAttributeManager().getAttributes();\n }\n getModuleSettings() {\n // For regular layer draw this happens during draw cycle (_drawLayersInViewport) not during update cycle\n // For aggregation layers this is called during updateState to update aggregation data\n // NOTE: it is similar to LayerPass._getModuleParameters() but doesn't inlcude `effects` it is not needed for aggregation\n const { viewport, mousePosition, device } = this.context;\n const moduleSettings = Object.assign(Object.create(this.props), {\n viewport,\n mousePosition,\n picking: {\n isActive: 0\n },\n // @ts-expect-error TODO - assuming WebGL context\n devicePixelRatio: device.canvasContext.cssToDeviceRatio()\n });\n return moduleSettings;\n }\n updateShaders(shaders) {\n // Default implemention is empty, subclasses can update their Model objects if needed\n }\n /**\n * Checks if aggregation is dirty\n * @param {Object} updateOpts - object {props, oldProps, changeFlags}\n * @param {Object} params - object {dimension, compareAll}\n * @param {Object} params.dimension - {props, accessors} array of props and/or accessors\n * @param {Boolean} params.compareAll - when `true` it will include non layer props for comparision\n * @returns {Boolean} - returns true if dimensions' prop or accessor is changed\n **/\n isAggregationDirty(updateOpts, params = {}) {\n const { props, oldProps, changeFlags } = updateOpts;\n const { compareAll = false, dimension } = params;\n const { ignoreProps } = this.state;\n const { props: dataProps, accessors = [] } = dimension;\n const { updateTriggersChanged } = changeFlags;\n if (changeFlags.dataChanged) {\n return true;\n }\n if (updateTriggersChanged) {\n if (updateTriggersChanged.all) {\n return true;\n }\n for (const accessor of accessors) {\n if (updateTriggersChanged[accessor]) {\n return true;\n }\n }\n }\n if (compareAll) {\n if (changeFlags.extensionsChanged) {\n return true;\n }\n // Compare non layer props too (like extension props)\n // ignoreprops refers to all Layer props other than aggregation props that need to be comapred\n return compareProps({\n oldProps,\n newProps: props,\n ignoreProps,\n propTypes: this.constructor._propTypes\n });\n }\n // Compare props of the dimension\n for (const name of dataProps) {\n if (props[name] !== oldProps[name]) {\n return true;\n }\n }\n return false;\n }\n /**\n * Checks if an attribute is changed\n * @param {String} name - name of the attribute\n * @returns {Boolean} - `true` if attribute `name` is changed, `false` otherwise,\n * If `name` is not passed or `undefiend`, `true` if any attribute is changed, `false` otherwise\n **/\n isAttributeChanged(name) {\n const { changedAttributes } = this.state;\n if (!name) {\n // if name not specified return true if any attribute is changed\n return !isObjectEmpty(changedAttributes);\n }\n return changedAttributes && changedAttributes[name] !== undefined;\n }\n // Private\n // override Composite layer private method to create AttributeManager instance\n _getAttributeManager() {\n return new AttributeManager(this.context.device, {\n id: this.props.id,\n stats: this.context.stats\n });\n }\n}\nAggregationLayer.layerName = 'AggregationLayer';\nexport default AggregationLayer;\n// Helper methods\n// Returns true if given object is empty, false otherwise.\nfunction isObjectEmpty(obj) {\n let isEmpty = true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const key in obj) {\n isEmpty = false;\n break;\n }\n return isEmpty;\n}\n", "// 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.\nexport function filterProps(props, filterKeys) {\n const filteredProps = {};\n for (const key in props) {\n if (!filterKeys.includes(key)) {\n filteredProps[key] = props[key];\n }\n }\n return filteredProps;\n}\n", "// Copyright (c) 2015 - 2017 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.\nimport { log } from '@deck.gl/core';\n// a scale function wrapper just like d3-scales\nexport function getScale(domain, range, scaleFunction) {\n const scale = scaleFunction;\n scale.domain = () => domain;\n scale.range = () => range;\n return scale;\n}\n// Quantize scale is similar to linear scales,\n// except it uses a discrete rather than continuous range\n// return a quantize scale function\nexport function getQuantizeScale(domain, range) {\n const scaleFunction = value => quantizeScale(domain, range, value);\n return getScale(domain, range, scaleFunction);\n}\n// return a linear scale function\nexport function getLinearScale(domain, range) {\n const scaleFunction = value => linearScale(domain, range, value);\n return getScale(domain, range, scaleFunction);\n}\nexport function getQuantileScale(domain, range) {\n // calculate threshold\n const sortedDomain = domain.sort(ascending);\n let i = 0;\n const n = Math.max(1, range.length);\n const thresholds = new Array(n - 1);\n while (++i < n) {\n thresholds[i - 1] = threshold(sortedDomain, i / n);\n }\n const scaleFunction = value => thresholdsScale(thresholds, range, value);\n scaleFunction.thresholds = () => thresholds;\n return getScale(domain, range, scaleFunction);\n}\nfunction ascending(a, b) {\n return a - b;\n}\nfunction threshold(domain, fraction) {\n const domainLength = domain.length;\n if (fraction <= 0 || domainLength < 2) {\n return domain[0];\n }\n if (fraction >= 1) {\n return domain[domainLength - 1];\n }\n const domainFraction = (domainLength - 1) * fraction;\n const lowIndex = Math.floor(domainFraction);\n const low = domain[lowIndex];\n const high = domain[lowIndex + 1];\n return low + (high - low) * (domainFraction - lowIndex);\n}\nfunction bisectRight(a, x) {\n let lo = 0;\n let hi = a.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (ascending(a[mid], x) > 0) {\n hi = mid;\n }\n else {\n lo = mid + 1;\n }\n }\n return lo;\n}\n// return a quantize scale function\nfunction thresholdsScale(thresholds, range, value) {\n return range[bisectRight(thresholds, value)];\n}\n// ordinal Scale\nfunction ordinalScale(domain, domainMap, range, value) {\n const key = `${value}`;\n let d = domainMap.get(key);\n if (d === undefined) {\n // update the domain\n d = domain.push(value);\n domainMap.set(key, d);\n }\n return range[(d - 1) % range.length];\n}\nexport function getOrdinalScale(domain, range) {\n const domainMap = new Map();\n const uniqueDomain = [];\n for (const d of domain) {\n const key = `${d}`;\n if (!domainMap.has(key)) {\n domainMap.set(key, uniqueDomain.push(d));\n }\n }\n const scaleFunction = value => ordinalScale(uniqueDomain, domainMap, range, value);\n return getScale(domain, range, scaleFunction);\n}\n// Quantize scale is similar to linear scales,\n// except it uses a discrete rather than continuous range\nexport function quantizeScale(domain, range, value) {\n const domainRange = domain[1] - domain[0];\n if (domainRange <= 0) {\n log.warn('quantizeScale: invalid domain, returning range[0]')();\n return range[0];\n }\n const step = domainRange / range.length;\n const idx = Math.floor((value - domain[0]) / step);\n const clampIdx = Math.max(Math.min(idx, range.length - 1), 0);\n return range[clampIdx];\n}\n// Linear scale maps continuous domain to continuous range\nexport function linearScale(domain, range, value) {\n return ((value - domain[0]) / (domain[1] - domain[0])) * (range[1] - range[0]) + range[0];\n}\n// get scale domains\nfunction notNullOrUndefined(d) {\n return d !== undefined && d !== null;\n}\nexport function unique(values) {\n const results = [];\n values.forEach(v => {\n if (!results.includes(v) && notNullOrUndefined(v)) {\n results.push(v);\n }\n });\n return results;\n}\nfunction getTruthyValues(data, valueAccessor) {\n const values = typeof valueAccessor === 'function' ? data.map(valueAccessor) : data;\n return values.filter(notNullOrUndefined);\n}\nexport function getLinearDomain(data, valueAccessor) {\n const sorted = getTruthyValues(data, valueAccessor).sort();\n return sorted.length ? [sorted[0], sorted[sorted.length - 1]] : [0, 0];\n}\nexport function getQuantileDomain(data, valueAccessor) {\n return getTruthyValues(data, valueAccessor);\n}\nexport function getOrdinalDomain(data, valueAccessor) {\n return unique(getTruthyValues(data, valueAccessor));\n}\nexport function getScaleDomain(scaleType, data, valueAccessor) {\n switch (scaleType) {\n case 'quantize':\n case 'linear':\n return getLinearDomain(data, valueAccessor);\n case 'quantile':\n return getQuantileDomain(data, valueAccessor);\n case 'ordinal':\n return getOrdinalDomain(data, valueAccessor);\n default:\n return getLinearDomain(data, valueAccessor);\n }\n}\nexport function clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nexport function getScaleFunctionByScaleType(scaleType) {\n switch (scaleType) {\n case 'quantize':\n return getQuantizeScale;\n case 'linear':\n return getLinearScale;\n case 'quantile':\n return getQuantileScale;\n case 'ordinal':\n return getOrdinalScale;\n default:\n return getQuantizeScale;\n }\n}\n", "// Copyright (c) 2015 - 2017 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// getValue takes an array of points returns a value to sort the bins on.\n// by default it returns the number of points\n// this is where to pass in a function to color the bins by\n// avg/mean/max of specific value of the point\nconst defaultGetValue = points => points.length;\nimport { clamp, getQuantileDomain, getOrdinalDomain } from \"./scale-utils.js\";\nconst MAX_32_BIT_FLOAT = 3.402823466e38;\n// access array of points in each bin\nconst defaultGetPoints = bin => bin.points;\n// access index of each bin\nconst defaultGetIndex = bin => bin.index;\n// d3-scending\nconst ascending = (a, b) => (a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN);\nconst defaultProps = {\n getValue: defaultGetValue,\n getPoints: defaultGetPoints,\n getIndex: defaultGetIndex,\n filterData: null\n};\nexport default class BinSorter {\n constructor(bins = [], props = defaultProps) {\n this.aggregatedBins = this.getAggregatedBins(bins, props);\n this._updateMinMaxValues();\n this.binMap = this.getBinMap();\n }\n /**\n * Get an array of object with aggregated values and index of bins\n * Array object will be sorted by value optionally.\n * @param {Array} bins\n * @param {Function} getValue\n * @return {Array} array of values and index lookup\n */\n getAggregatedBins(bins, props) {\n const { getValue = defaultGetValue, getPoints = defaultGetPoints, getIndex = defaultGetIndex, filterData } = props;\n const hasFilter = typeof filterData === 'function';\n const binCount = bins.length;\n const aggregatedBins = [];\n let index = 0;\n for (let binIndex = 0; binIndex < binCount; binIndex++) {\n const bin = bins[binIndex];\n const points = getPoints(bin);\n const i = getIndex(bin);\n const filteredPoints = hasFilter ? points.filter(filterData) : points;\n bin.filteredPoints = hasFilter ? filteredPoints : null;\n const value = filteredPoints.length ? getValue(filteredPoints) : null;\n if (value !== null && value !== undefined) {\n // filter bins if value is null or undefined\n aggregatedBins[index] = {\n i: Number.isFinite(i) ? i : binIndex,\n value,\n counts: filteredPoints.length\n };\n index++;\n }\n }\n return aggregatedBins;\n }\n _percentileToIndex(percentileRange) {\n const len = this.sortedBins.length;\n if (len < 2) {\n return [0, 0];\n }\n const [lower, upper] = percentileRange.map(n => clamp(n, 0, 100));\n const lowerIdx = Math.ceil((lower / 100) * (len - 1));\n const upperIdx = Math.floor((upper / 100) * (len - 1));\n return [lowerIdx, upperIdx];\n }\n /**\n * Get a mapping from cell/hexagon index to sorted bin\n * This is used to retrieve bin value for color calculation\n * @return {Object} bin index to aggregatedBins\n */\n getBinMap() {\n const binMap = {};\n for (const bin of this.aggregatedBins) {\n binMap[bin.i] = bin;\n }\n return binMap;\n }\n // Private\n /**\n * Get ths max count of all bins\n */\n _updateMinMaxValues() {\n let maxCount = 0;\n let maxValue = 0;\n let minValue = MAX_32_BIT_FLOAT;\n let totalCount = 0;\n for (const x of this.aggregatedBins) {\n maxCount = maxCount > x.counts ? maxCount : x.counts;\n maxValue = maxValue > x.value ? maxValue : x.value;\n minValue = minValue < x.value ? minValue : x.value;\n totalCount += x.counts;\n }\n this.maxCount = maxCount;\n this.maxValue = maxValue;\n this.minValue = minValue;\n this.totalCount = totalCount;\n }\n /**\n * Get range of values of all bins\n * @param {Number[]} range\n * @param {Number} range[0] - lower bound\n * @param {Number} range[1] - upper bound\n * @return {Array} array of new value range\n */\n getValueRange(percentileRange) {\n if (!this.sortedBins) {\n this.sortedBins = this.aggregatedBins.sort((a, b) => ascending(a.value, b.value));\n }\n if (!this.sortedBins.length) {\n // @ts-expect-error\n return [];\n }\n let lowerIdx = 0;\n let upperIdx = this.sortedBins.length - 1;\n if (Array.isArray(percentileRange)) {\n const idxRange = this._percentileToIndex(percentileRange);\n lowerIdx = idxRange[0];\n upperIdx = idxRange[1];\n }\n return [this.sortedBins[lowerIdx].value, this.sortedBins[upperIdx].value];\n }\n getValueDomainByScale(scale, [lower = 0, upper = 100] = []) {\n if (!this.sortedBins) {\n this.sortedBins = this.aggregatedBins.sort((a, b) => ascending(a.value, b.value));\n }\n if (!this.sortedBins.length) {\n return [];\n }\n const indexEdge = this._percentileToIndex([lower, upper]);\n return this._getScaleDomain(scale, indexEdge);\n }\n _getScaleDomain(scaleType, [lowerIdx, upperIdx]) {\n const bins = this.sortedBins;\n switch (scaleType) {\n case 'quantize':\n case 'linear':\n return [bins[lowerIdx].value, bins[upperIdx].value];\n case 'quantile':\n return getQuantileDomain(bins.slice(lowerIdx, upperIdx + 1), d => d.value);\n case 'ordinal':\n return getOrdinalDomain(bins, d => d.value);\n default:\n return [bins[lowerIdx].value, bins[upperIdx].value];\n }\n }\n}\n", "// Copyright (c) 2015 - 2017 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.\nimport { createIterable } from '@deck.gl/core';\nimport { getGridOffset } from \"../utils/grid-aggregation-utils.js\";\n/**\n * Calculate density grid from an array of points\n * @param {Object} props - object containing :\n * @param {Iterable} [props.data] - data objects to be aggregated\n * @param {Integer} [props.cellSize] - size of the grid cell\n *\n * @param {Object} aggregationParams - object containing :\n * @param {Object} gridOffset - {xOffset, yOffset} cell size in meters\n * @param {Integer} width - width of the grid\n * @param {Integer} height - height of the grid\n * @param {Boolean} projectPoints - `true` if doing screen space projection, `false` otherwise\n * @param {Array} attributes - attributes array containing position values\n * @param {Viewport} viewport - viewport to be used for projection\n * @param {Array} posOffset - [xOffset, yOffset] offset to be applied to positions to get cell index\n * @param {Object} boundingBox - {xMin, yMin, xMax, yMax} bounding box of input data\n *\n * @returns {object} - grid data, cell dimension\n */\nexport function pointToDensityGridDataCPU(props, aggregationParams) {\n const hashInfo = pointsToGridHashing(props, aggregationParams);\n const result = getGridLayerDataFromGridHash(hashInfo);\n return {\n gridHash: hashInfo.gridHash,\n gridOffset: hashInfo.gridOffset,\n data: result\n };\n}\n/**\n * Project points into each cell, return a hash table of cells\n * @param {Iterable} points\n * @param {number} cellSize - unit size in meters\n * @param {function} getPosition - position accessor\n * @returns {object} - grid hash and cell dimension\n */\n/* eslint-disable-next-line max-statements, complexity */\nfunction pointsToGridHashing(props, aggregationParams) {\n const { data = [], cellSize } = props;\n const { attributes, viewport, projectPoints, numInstances } = aggregationParams;\n const positions = attributes.positions.value;\n const { size } = attributes.positions.getAccessor();\n const boundingBox = aggregationParams.boundingBox || getPositionBoundingBox(attributes.positions, numInstances);\n const offsets = aggregationParams.posOffset || [180, 90];\n const gridOffset = aggregationParams.gridOffset || getGridOffset(boundingBox, cellSize);\n if (gridOffset.xOffset <= 0 || gridOffset.yOffset <= 0) {\n return { gridHash: {}, gridOffset, offsets: [0, 0] };\n }\n const { width, height } = viewport;\n const numCol = Math.ceil(width / gridOffset.xOffset);\n const numRow = Math.ceil(height / gridOffset.yOffset);\n // calculate count per cell\n const gridHash = {};\n const { iterable, objectInfo } = createIterable(data);\n const position = new Array(3);\n for (const pt of iterable) {\n objectInfo.index++;\n position[0] = positions[objectInfo.index * size];\n position[1] = positions[objectInfo.index * size + 1];\n position[2] = size >= 3 ? positions[objectInfo.index * size + 2] : 0;\n const [x, y] = projectPoints ? viewport.project(position) : position;\n if (Number.isFinite(x) && Number.isFinite(y)) {\n const yIndex = Math.floor((y + offsets[1]) / gridOffset.yOffset);\n const xIndex = Math.floor((x + offsets[0]) / gridOffset.xOffset);\n if (!projectPoints ||\n // when doing screen space agggregation (projectPoints = true), filter points outside of the viewport range.\n (xIndex >= 0 && xIndex < numCol && yIndex >= 0 && yIndex < numRow)) {\n const key = `${yIndex}-${xIndex}`;\n gridHash[key] = gridHash[key] || { count: 0, points: [], lonIdx: xIndex, latIdx: yIndex };\n gridHash[key].count += 1;\n gridHash[key].points.push({\n source: pt,\n index: objectInfo.index\n });\n }\n }\n }\n return { gridHash, gridOffset, offsets: [offsets[0] * -1, offsets[1] * -1] };\n}\n/* eslint-enable max-statements, complexity */\nfunction getGridLayerDataFromGridHash({ gridHash, gridOffset, offsets }) {\n const data = new Array(Object.keys(gridHash).length);\n let i = 0;\n for (const key in gridHash) {\n const idxs = key.split('-');\n const latIdx = parseInt(idxs[0], 10);\n const lonIdx = parseInt(idxs[1], 10);\n const index = i++;\n data[index] = {\n index,\n position: [\n offsets[0] + gridOffset.xOffset * lonIdx,\n offsets[1] + gridOffset.yOffset * latIdx\n ],\n ...gridHash[key]\n };\n }\n return data;\n}\n// Calculate bounding box of position attribute\nfunction getPositionBoundingBox(positionAttribute, numInstance) {\n // TODO - value might not exist (e.g. attribute transition)\n const positions = positionAttribute.value;\n const { size } = positionAttribute.getAccessor();\n let yMin = Infinity;\n let yMax = -Infinity;\n let xMin = Infinity;\n let xMax = -Infinity;\n let y;\n let x;\n for (let i = 0; i < numInstance; i++) {\n x = positions[i * size];\n y = positions[i * size + 1];\n if (Number.isFinite(x) && Number.isFinite(y)) {\n yMin = y < yMin ? y : yMin;\n yMax = y > yMax ? y : yMax;\n xMin = x < xMin ? x : xMin;\n xMax = x > xMax ? x : xMax;\n }\n }\n return { xMin, xMax, yMin, yMax };\n}\n", "import { log, COORDINATE_SYSTEM } from '@deck.gl/core';\nconst R_EARTH = 6378000;\nfunction toFinite(n) {\n return Number.isFinite(n) ? n : 0;\n}\n// Parse input data to build positions, wights and bounding box.\n/* eslint-disable-next-line max-statements */\nexport function getBoundingBox(attributes, vertexCount) {\n // TODO - value might not exist (e.g. attribute transition)\n const positions = attributes.positions.value;\n let yMin = Infinity;\n let yMax = -Infinity;\n let xMin = Infinity;\n let xMax = -Infinity;\n let y;\n let x;\n for (let i = 0; i < vertexCount; i++) {\n x = positions[i * 3];\n y = positions[i * 3 + 1];\n yMin = y < yMin ? y : yMin;\n yMax = y > yMax ? y : yMax;\n xMin = x < xMin ? x : xMin;\n xMax = x > xMax ? x : xMax;\n }\n const boundingBox = {\n xMin: toFinite(xMin),\n xMax: toFinite(xMax),\n yMin: toFinite(yMin),\n yMax: toFinite(yMax)\n };\n return boundingBox;\n}\n/* eslint-enable max-statements */\n// Returns XY translation for positions to peform aggregation in +ve sapce\nfunction getTranslation(boundingBox, gridOffset, coordinateSystem, viewport) {\n const { width, height } = viewport;\n // Origin to define grid\n // DEFAULT coordinate system is treated as LNGLAT\n const worldOrigin = coordinateSystem === COORDINATE_SYSTEM.CARTESIAN ? [-width / 2, -height / 2] : [-180, -90];\n // Other coordinate systems not supported/verified yet\n log.assert(coordinateSystem === COORDINATE_SYSTEM.CARTESIAN ||\n coordinateSystem === COORDINATE_SYSTEM.LNGLAT ||\n coordinateSystem === COORDINATE_SYSTEM.DEFAULT);\n const { xMin, yMin } = boundingBox;\n return [\n // Align origin to match grid cell boundaries in CPU and GPU aggregations\n -1 * (alignToCell(xMin - worldOrigin[0], gridOffset.xOffset) + worldOrigin[0]),\n -1 * (alignToCell(yMin - worldOrigin[1], gridOffset.yOffset) + worldOrigin[1])\n ];\n}\n// Aligns `inValue` to given `cellSize`\nexport function alignToCell(inValue, cellSize) {\n const sign = inValue < 0 ? -1 : 1;\n let value = sign < 0 ? Math.abs(inValue) + cellSize : Math.abs(inValue);\n value = Math.floor(value / cellSize) * cellSize;\n return value * sign;\n}\n/**\n * Based on geometric center of sample points, calculate cellSize in lng/lat (degree) space\n * @param {object} boundingBox - {xMin, yMin, xMax, yMax} contains bounding box of data\n * @param {number} cellSize - grid cell size in meters\n * @param {boolean, optional} converToDegrees - when true offsets are converted from meters to lng/lat (degree) space\n * @returns {xOffset, yOffset} - cellSize size\n */\nexport function getGridOffset(boundingBox, cellSize, convertToMeters = true) {\n if (!convertToMeters) {\n return { xOffset: cellSize, yOffset: cellSize };\n }\n const { yMin, yMax } = boundingBox;\n const centerLat = (yMin + yMax) / 2;\n return calculateGridLatLonOffset(cellSize, centerLat);\n}\nexport function getGridParams(boundingBox, cellSize, viewport, coordinateSystem) {\n const gridOffset = getGridOffset(boundingBox, cellSize, coordinateSystem !== COORDINATE_SYSTEM.CARTESIAN);\n const translation = getTranslation(boundingBox, gridOffset, coordinateSystem, viewport);\n const { xMin, yMin, xMax, yMax } = boundingBox;\n const width = xMax - xMin + gridOffset.xOffset;\n const height = yMax - yMin + gridOffset.yOffset;\n const numCol = Math.ceil(width / gridOffset.xOffset);\n const numRow = Math.ceil(height / gridOffset.yOffset);\n return { gridOffset, translation, width, height, numCol, numRow };\n}\n/**\n * calculate grid layer cell size in lat lon based on world unit size\n * and current latitude\n * @param {number} cellSize\n * @param {number} latitude\n * @returns {object} - lat delta and lon delta\n */\nfunction calculateGridLatLonOffset(cellSize, latitude) {\n const yOffset = calculateLatOffset(cellSize);\n const xOffset = calculateLonOffset(latitude, cellSize);\n return { yOffset, xOffset };\n}\n/**\n * with a given x-km change, calculate the increment of latitude\n * based on stackoverflow http://stackoverflow.com/questions/7477003\n * @param {number} dy - change in km\n * @return {number} - increment in latitude\n */\nfunction calculateLatOffset(dy) {\n return (dy / R_EARTH) * (180 / Math.PI);\n}\n/**\n * with a given x-km change, and current latitude\n * calculate the increment of longitude\n * based on stackoverflow http://stackoverflow.com/questions/7477003\n * @param {number} lat - latitude of current location (based on city)\n * @param {number} dx - change in km\n * @return {number} - increment in longitude\n */\nfunction calculateLonOffset(lat, dx) {\n return ((dx / R_EARTH) * (180 / Math.PI)) / Math.cos((lat * Math.PI) / 180);\n}\n", "// Copyright (c) 2015 - 2017 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.\nimport { GridCellLayer } from '@deck.gl/layers';\nimport { defaultColorRange } from \"../utils/color-utils.js\";\nimport { pointToDensityGridDataCPU } from \"./grid-aggregator.js\";\nimport CPUAggregator from \"../utils/cpu-aggregator.js\";\nimport AggregationLayer from \"../aggregation-layer.js\";\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction nop() { }\nconst defaultProps = {\n // color\n colorDomain: null,\n colorRange: defaultColorRange,\n getColorValue: { type: 'accessor', value: null }, // default value is calculated from `getColorWeight` and `colorAggregation`\n getColorWeight: { type: 'accessor', value: 1 },\n colorAggregation: 'SUM',\n lowerPercentile: { type: 'number', min: 0, max: 100, value: 0 },\n upperPercentile: { type: 'number', min: 0, max: 100, value: 100 },\n colorScaleType: 'quantize',\n onSetColorDomain: nop,\n // elevation\n elevationDomain: null,\n elevationRange: [0, 1000],\n getElevationValue: { type: 'accessor', value: null }, // default value is calculated from `getElevationWeight` and `elevationAggregation`\n getElevationWeight: { type: 'accessor', value: 1 },\n elevationAggregation: 'SUM',\n elevationLowerPercentile: { type: 'number', min: 0, max: 100, value: 0 },\n elevationUpperPercentile: { type: 'number', min: 0, max: 100, value: 100 },\n elevationScale: { type: 'number', min: 0, value: 1 },\n elevationScaleType: 'linear',\n onSetElevationDomain: nop,\n gridAggregator: pointToDensityGridDataCPU,\n // grid\n cellSize: { type: 'number', min: 0, max: 1000, value: 1000 },\n coverage: { type: 'number', min: 0, max: 1, value: 1 },\n getPosition: { type: 'accessor', value: (x) => x.position },\n extruded: false,\n // Optional material for 'lighting' shader module\n material: true,\n // data filter\n _filterData: { type: 'function', value: null, optional: true }\n};\n/** Aggregate data into a grid-based heatmap. Aggregation is performed on CPU. */\nclass CPUGridLayer extends AggregationLayer {\n initializeState() {\n const cpuAggregator = new CPUAggregator({\n getAggregator: props => props.gridAggregator,\n getCellSize: props => props.cellSize\n });\n this.state = {\n cpuAggregator,\n aggregatorState: cpuAggregator.state\n };\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: { size: 3, type: 'float64', accessor: 'getPosition' }\n });\n // color and elevation attributes can't be added as attributes\n // they are calcualted using 'getValue' accessor that takes an array of pints.\n }\n updateState(opts) {\n super.updateState(opts);\n this.setState({\n // make a copy of the internal state of cpuAggregator for testing\n aggregatorState: this.state.cpuAggregator.updateState(opts, {\n viewport: this.context.viewport,\n attributes: this.getAttributes(),\n numInstances: this.getNumInstances()\n })\n });\n }\n getPickingInfo({ info }) {\n return this.state.cpuAggregator.getPickingInfo({ info });\n }\n // create a method for testing\n _onGetSublayerColor(cell) {\n return this.state.cpuAggregator.getAccessor('fillColor')(cell);\n }\n // create a method for testing\n _onGetSublayerElevation(cell) {\n return this.state.cpuAggregator.getAccessor('elevation')(cell);\n }\n _getSublayerUpdateTriggers() {\n return this.state.cpuAggregator.getUpdateTriggers(this.props);\n }\n renderLayers() {\n const { elevationScale, extruded, cellSize, coverage, material, transitions } = this.props;\n const { cpuAggregator } = this.state;\n const SubLayerClass = this.getSubLayerClass('grid-cell', GridCellLayer);\n const updateTriggers = this._getSublayerUpdateTriggers();\n return new SubLayerClass({\n cellSize,\n coverage,\n material,\n elevationScale,\n extruded,\n getFillColor: this._onGetSublayerColor.bind(this),\n getElevation: this._onGetSublayerElevation.bind(this),\n transitions: transitions && {\n getFillColor: transitions.getColorValue || transitions.getColorWeight,\n getElevation: transitions.getElevationValue || transitions.getElevationWeight\n }\n }, this.getSubLayerProps({\n id: 'grid-cell',\n updateTriggers\n }), {\n data: cpuAggregator.state.layerData.data\n });\n }\n}\nCPUGridLayer.layerName = 'CPUGridLayer';\nCPUGridLayer.defaultProps = defaultProps;\nexport default CPUGridLayer;\n", "// Copyright (c) 2015 - 2018 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.\nimport BinSorter from \"./bin-sorter.js\";\nimport { getScaleFunctionByScaleType } from \"./scale-utils.js\";\nimport { getValueFunc, wrapGetValueFunc } from \"./aggregation-operation-utils.js\";\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() { }\nconst dimensionSteps = ['getBins', 'getDomain', 'getScaleFunc'];\nconst defaultDimensions = [\n {\n key: 'fillColor',\n accessor: 'getFillColor',\n pickingInfo: 'colorValue',\n getBins: {\n triggers: {\n value: {\n prop: 'getColorValue',\n updateTrigger: 'getColorValue'\n },\n weight: {\n prop: 'getColorWeight',\n updateTrigger: 'getColorWeight'\n },\n aggregation: {\n prop: 'colorAggregation'\n },\n filterData: {\n prop: '_filterData',\n updateTrigger: '_filterData'\n }\n }\n },\n getDomain: {\n triggers: {\n lowerPercentile: {\n prop: 'lowerPercentile'\n },\n upperPercentile: {\n prop: 'upperPercentile'\n },\n scaleType: {\n prop: 'colorScaleType'\n }\n }\n },\n getScaleFunc: {\n triggers: {\n domain: { prop: 'colorDomain' },\n range: { prop: 'colorRange' }\n },\n onSet: {\n props: 'onSetColorDomain'\n }\n },\n nullValue: [0, 0, 0, 0]\n },\n {\n key: 'elevation',\n accessor: 'getElevation',\n pickingInfo: 'elevationValue',\n getBins: {\n triggers: {\n value: {\n prop: 'getElevationValue',\n updateTrigger: 'getElevationValue'\n },\n weight: {\n prop: 'getElevationWeight',\n updateTrigger: 'getElevationWeight'\n },\n aggregation: {\n prop: 'elevationAggregation'\n },\n filterData: {\n prop: '_filterData',\n updateTrigger: '_filterData'\n }\n }\n },\n getDomain: {\n triggers: {\n lowerPercentile: {\n prop: 'elevationLowerPercentile'\n },\n upperPercentile: {\n prop: 'elevationUpperPercentile'\n },\n scaleType: {\n prop: 'elevationScaleType'\n }\n }\n },\n getScaleFunc: {\n triggers: {\n domain: { prop: 'elevationDomain' },\n range: { prop: 'elevationRange' }\n },\n onSet: {\n props: 'onSetElevationDomain'\n }\n },\n nullValue: -1\n }\n];\nconst defaultGetCellSize = props => props.cellSize;\nexport default class CPUAggregator {\n constructor(opts) {\n this.state = {\n layerData: {\n data: undefined\n },\n dimensions: {\n // color: {\n // getValue: null,\n // domain: null,\n // sortedBins: null,\n // scaleFunc: noop\n // },\n // elevation: {\n // getValue: null,\n // domain: null,\n // sortedBins: null,\n // scaleFunc: noop\n // }\n }\n };\n this.changeFlags = {};\n this.dimensionUpdaters = {};\n this._getCellSize = opts.getCellSize || defaultGetCellSize;\n this._getAggregator = opts.getAggregator;\n this._addDimension(opts.dimensions || defaultDimensions);\n }\n static defaultDimensions() {\n return defaultDimensions;\n }\n updateState(opts, aggregationParams) {\n const { oldProps, props, changeFlags } = opts;\n this.updateGetValueFuncs(oldProps, props, changeFlags);\n const reprojectNeeded = this.needsReProjectPoints(oldProps, props, changeFlags);\n let aggregationDirty = false;\n if (changeFlags.dataChanged || reprojectNeeded) {\n // project data into bin and aggregate wegiths per bin\n this.getAggregatedData(props, aggregationParams);\n aggregationDirty = true;\n }\n else {\n const dimensionChanges = this.getDimensionChanges(oldProps, props, changeFlags) || [];\n // this here is layer\n dimensionChanges.forEach(f => typeof f === 'function' && f());\n aggregationDirty = true;\n }\n this.setState({ aggregationDirty });\n return this.state;\n }\n // Update private state\n setState(updateObject) {\n this.state = { ...this.state, ...updateObject };\n }\n // Update private state.dimensions\n setDimensionState(key, updateObject) {\n this.setState({\n dimensions: {\n ...this.state.dimensions,\n [key]: { ...this.state.dimensions[key], ...updateObject }\n }\n });\n }\n normalizeResult(result = {}) {\n // support previous hexagonAggregator API\n if (result.hexagons) {\n return { data: result.hexagons, ...result };\n }\n else if (result.layerData) {\n return { data: result.layerData, ...result };\n }\n return result;\n }\n getAggregatedData(props, aggregationParams) {\n const aggregator = this._getAggregator(props);\n const result = aggregator(props, aggregationParams);\n this.setState({\n layerData: this.normalizeResult(result)\n });\n this.changeFlags = {\n layerData: true\n };\n this.getSortedBins(props);\n }\n updateGetValueFuncs(oldProps, props, changeFlags) {\n for (const key in this.dimensionUpdaters) {\n const { value, weight, aggregation } = this.dimensionUpdaters[key].getBins.triggers;\n let getValue = props[value.prop];\n const getValueChanged = this.needUpdateDimensionStep(this.dimensionUpdaters[key].getBins, oldProps, props, changeFlags);\n if (getValueChanged) {\n if (getValue) {\n getValue = wrapGetValueFunc(getValue, { data: props.data });\n }\n else {\n // If `getValue` is not provided from props, build it with aggregation and weight.\n getValue = getValueFunc(props[aggregation.prop], props[weight.prop], { data: props.data });\n }\n }\n if (getValue) {\n this.setDimensionState(key, { getValue });\n }\n }\n }\n needsReProjectPoints(oldProps, props, changeFlags) {\n return (this._getCellSize(oldProps) !== this._getCellSize(props) ||\n this._getAggregator(oldProps) !== this._getAggregator(props) ||\n (changeFlags.updateTriggersChanged &&\n (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPosition)));\n }\n // Adds dimensions\n addDimension(dimensions) {\n this._addDimension(dimensions);\n }\n _addDimension(dimensions = []) {\n dimensions.forEach(dimension => {\n const { key } = dimension;\n this.dimensionUpdaters[key] = this.getDimensionUpdaters(dimension);\n this.state.dimensions[key] = {\n getValue: null,\n domain: null,\n sortedBins: null,\n scaleFunc: noop\n };\n });\n }\n getDimensionUpdaters({ key, accessor, pickingInfo, getBins, getDomain, getScaleFunc, nullValue }) {\n return {\n key,\n accessor,\n pickingInfo,\n getBins: { updater: this.getDimensionSortedBins.bind(this), ...getBins },\n getDomain: { updater: this.getDimensionValueDomain.bind(this), ...getDomain },\n getScaleFunc: { updater: this.getDimensionScale.bind(this), ...getScaleFunc },\n attributeAccessor: this.getSubLayerDimensionAttribute(key, nullValue)\n };\n }\n needUpdateDimensionStep(dimensionStep, oldProps, props, changeFlags) {\n // whether need to update current dimension step\n // dimension step is the value, domain, scaleFunction of each dimension\n // each step is an object with properties links to layer prop and whether the prop is\n // controlled by updateTriggers\n // getBins: {\n // value: {\n // prop: 'getElevationValue',\n // updateTrigger: 'getElevationValue'\n // },\n // weight: {\n // prop: 'getElevationWeight',\n // updateTrigger: 'getElevationWeight'\n // },\n // aggregation: {\n // prop: 'elevationAggregation'\n // }\n // }\n return Object.values(dimensionStep.triggers).some((item) => {\n if (item.updateTrigger) {\n // check based on updateTriggers change first\n // if data has changed, always update value\n return (changeFlags.dataChanged ||\n (changeFlags.updateTriggersChanged &&\n (changeFlags.updateTriggersChanged.all ||\n changeFlags.updateTriggersChanged[item.updateTrigger])));\n }\n // fallback to direct comparison\n return oldProps[item.prop] !== props[item.prop];\n });\n }\n getDimensionChanges(oldProps, props, changeFlags) {\n // const {dimensionUpdaters} = this.state;\n const updaters = [];\n // get dimension to be updated\n for (const key in this.dimensionUpdaters) {\n // return the first triggered updater for each dimension\n const needUpdate = dimensionSteps.find(step => this.needUpdateDimensionStep(this.dimensionUpdaters[key][step], oldProps, props, changeFlags));\n if (needUpdate) {\n updaters.push(this.dimensionUpdaters[key][needUpdate].updater.bind(this, props, this.dimensionUpdaters[key]));\n }\n }\n return updaters.length ? updaters : null;\n }\n getUpdateTriggers(props) {\n const _updateTriggers = props.updateTriggers || {};\n const updateTriggers = {};\n for (const key in this.dimensionUpdaters) {\n const { accessor } = this.dimensionUpdaters[key];\n // fold dimension triggers into each accessor\n updateTriggers[accessor] = {};\n dimensionSteps.forEach(step => {\n Object.values(this.dimensionUpdaters[key][step].triggers).forEach(({ prop, updateTrigger }) => {\n if (updateTrigger) {\n // if prop is based on updateTrigger e.g. getColorValue, getColorWeight\n // and updateTriggers is passed in from layer prop\n // fold the updateTriggers into accessor\n const fromProp = _updateTriggers[updateTrigger];\n if (typeof fromProp === 'object' && !Array.isArray(fromProp)) {\n // if updateTrigger is an object spread it\n Object.assign(updateTriggers[accessor], fromProp);\n }\n else if (fromProp !== undefined) {\n updateTriggers[accessor][prop] = fromProp;\n }\n }\n else {\n // if prop is not based on updateTrigger\n updateTriggers[accessor][prop] = props[prop];\n }\n });\n });\n }\n return updateTriggers;\n }\n getSortedBins(props) {\n for (const key in this.dimensionUpdaters) {\n this.getDimensionSortedBins(props, this.dimensionUpdaters[key]);\n }\n }\n getDimensionSortedBins(props, dimensionUpdater) {\n const { key } = dimensionUpdater;\n const { getValue } = this.state.dimensions[key];\n const sortedBins = new BinSorter(this.state.layerData.data || [], {\n getValue,\n filterData: props._filterData\n });\n this.setDimensionState(key, { sortedBins });\n this.getDimensionValueDomain(props, dimensionUpdater);\n }\n getDimensionValueDomain(props, dimensionUpdater) {\n const { getDomain, key } = dimensionUpdater;\n const { triggers: { lowerPercentile, upperPercentile, scaleType } } = getDomain;\n const valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);\n this.setDimensionState(key, { valueDomain });\n this.getDimensionScale(props, dimensionUpdater);\n }\n getDimensionScale(props, dimensionUpdater) {\n const { key, getScaleFunc, getDomain } = dimensionUpdater;\n const { domain, range } = getScaleFunc.triggers;\n const { scaleType } = getDomain.triggers;\n const { onSet } = getScaleFunc;\n const dimensionRange = props[range.prop];\n const dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;\n const getScaleFunction = getScaleFunctionByScaleType(scaleType && props[scaleType.prop]);\n const scaleFunc = getScaleFunction(dimensionDomain, dimensionRange);\n if (typeof onSet === 'object' && typeof props[onSet.props] === 'function') {\n props[onSet.props](scaleFunc.domain());\n }\n this.setDimensionState(key, { scaleFunc });\n }\n getSubLayerDimensionAttribute(key, nullValue) {\n return cell => {\n const { sortedBins, scaleFunc } = this.state.dimensions[key];\n const bin = sortedBins.binMap[cell.index];\n if (bin && bin.counts === 0) {\n // no points left in bin after filtering\n return nullValue;\n }\n const cv = bin && bin.value;\n const domain = scaleFunc.domain();\n const isValueInDomain = cv >= domain[0] && cv <= domain[domain.length - 1];\n // if cell value is outside domain, set alpha to 0\n return isValueInDomain ? scaleFunc(cv) : nullValue;\n };\n }\n getSubLayerAccessors(props) {\n const accessors = {};\n for (const key in this.dimensionUpdaters) {\n const { accessor } = this.dimensionUpdaters[key];\n accessors[accessor] = this.getSubLayerDimensionAttribute(props, key);\n }\n return accessors;\n }\n getPickingInfo({ info }) {\n const isPicked = info.picked && info.index > -1;\n let object = null;\n if (isPicked) {\n // const {sortedColorBins, sortedElevationBins} = this.state;\n // @ts-expect-error\n const cell = this.state.layerData.data[info.index];\n const binInfo = {};\n for (const key in this.dimensionUpdaters) {\n const { pickingInfo } = this.dimensionUpdaters[key];\n const { sortedBins } = this.state.dimensions[key];\n const value = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;\n binInfo[pickingInfo] = value;\n }\n object = Object.assign(binInfo, cell, {\n points: cell.filteredPoints || cell.points\n });\n }\n // override object with picked cell\n info.picked = Boolean(object);\n info.object = object;\n return info;\n }\n getAccessor(dimensionKey) {\n if (!this.dimensionUpdaters.hasOwnProperty(dimensionKey)) {\n return noop;\n }\n return this.dimensionUpdaters[dimensionKey].attributeAccessor;\n }\n}\n", "// Copyright (c) 2015 - 2017 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.\nimport { log } from '@deck.gl/core';\nimport { ColumnLayer } from '@deck.gl/layers';\nimport { defaultColorRange } from \"../utils/color-utils.js\";\nimport { pointToHexbin } from \"./hexagon-aggregator.js\";\nimport CPUAggregator from \"../utils/cpu-aggregator.js\";\nimport AggregationLayer from \"../aggregation-layer.js\";\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction nop() { }\nconst defaultProps = {\n // color\n colorDomain: null,\n colorRange: defaultColorRange,\n getColorValue: { type: 'accessor', value: null }, // default value is calcuated from `getColorWeight` and `colorAggregation`\n getColorWeight: { type: 'accessor', value: 1 },\n colorAggregation: 'SUM',\n lowerPercentile: { type: 'number', value: 0, min: 0, max: 100 },\n upperPercentile: { type: 'number', value: 100, min: 0, max: 100 },\n colorScaleType: 'quantize',\n onSetColorDomain: nop,\n // elevation\n elevationDomain: null,\n elevationRange: [0, 1000],\n getElevationValue: { type: 'accessor', value: null }, // default value is calcuated from `getElevationWeight` and `elevationAggregation`\n getElevationWeight: { type: 'accessor', value: 1 },\n elevationAggregation: 'SUM',\n elevationLowerPercentile: { type: 'number', value: 0, min: 0, max: 100 },\n elevationUpperPercentile: { type: 'number', value: 100, min: 0, max: 100 },\n elevationScale: { type: 'number', min: 0, value: 1 },\n elevationScaleType: 'linear',\n onSetElevationDomain: nop,\n radius: { type: 'number', value: 1000, min: 1 },\n coverage: { type: 'number', min: 0, max: 1, value: 1 },\n extruded: false,\n hexagonAggregator: pointToHexbin,\n getPosition: { type: 'accessor', value: (x) => x.position },\n // Optional material for 'lighting' shader module\n material: true,\n // data filter\n _filterData: { type: 'function', value: null, optional: true }\n};\n/** Aggregates data into a hexagon-based heatmap. The color and height of a hexagon are determined based on the objects it contains. */\nclass HexagonLayer extends AggregationLayer {\n initializeState() {\n const cpuAggregator = new CPUAggregator({\n getAggregator: props => props.hexagonAggregator,\n getCellSize: props => props.radius\n });\n this.state = {\n cpuAggregator,\n aggregatorState: cpuAggregator.state,\n vertices: null\n };\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: { size: 3, type: 'float64', accessor: 'getPosition' }\n });\n // color and elevation attributes can't be added as attributes\n // they are calculated using 'getValue' accessor that takes an array of pints.\n }\n updateState(opts) {\n super.updateState(opts);\n if (opts.changeFlags.propsOrDataChanged) {\n const aggregatorState = this.state.cpuAggregator.updateState(opts, {\n viewport: this.context.viewport,\n attributes: this.getAttributes()\n });\n if (this.state.aggregatorState.layerData !== aggregatorState.layerData) {\n // if user provided custom aggregator and returns hexagonVertices,\n // Need to recalculate radius and angle based on vertices\n // @ts-expect-error\n const { hexagonVertices } = aggregatorState.layerData || {};\n this.setState({\n vertices: hexagonVertices && this.convertLatLngToMeterOffset(hexagonVertices)\n });\n }\n this.setState({\n // make a copy of the internal state of cpuAggregator for testing\n aggregatorState\n });\n }\n }\n convertLatLngToMeterOffset(hexagonVertices) {\n const { viewport } = this.context;\n if (Array.isArray(hexagonVertices) && hexagonVertices.length === 6) {\n // get centroid of hexagons\n const vertex0 = hexagonVertices[0];\n const vertex3 = hexagonVertices[3];\n const centroid = [(vertex0[0] + vertex3[0]) / 2, (vertex0[1] + vertex3[1]) / 2];\n const centroidFlat = viewport.projectFlat(centroid);\n const { metersPerUnit } = viewport.getDistanceScales(centroid);\n // offset all points by centroid to meter offset\n const vertices = hexagonVertices.map(vt => {\n const vtFlat = viewport.projectFlat(vt);\n return [\n (vtFlat[0] - centroidFlat[0]) * metersPerUnit[0],\n (vtFlat[1] - centroidFlat[1]) * metersPerUnit[1]\n ];\n });\n return vertices;\n }\n log.error('HexagonLayer: hexagonVertices needs to be an array of 6 points')();\n return null;\n }\n getPickingInfo({ info }) {\n return this.state.cpuAggregator.getPickingInfo({ info });\n }\n // create a method for testing\n _onGetSublayerColor(cell) {\n return this.state.cpuAggregator.getAccessor('fillColor')(cell);\n }\n // create a method for testing\n _onGetSublayerElevation(cell) {\n return this.state.cpuAggregator.getAccessor('elevation')(cell);\n }\n _getSublayerUpdateTriggers() {\n return this.state.cpuAggregator.getUpdateTriggers(this.props);\n }\n renderLayers() {\n const { elevationScale, extruded, coverage, material, transitions } = this.props;\n const { aggregatorState, vertices } = this.state;\n const SubLayerClass = this.getSubLayerClass('hexagon-cell', ColumnLayer);\n const updateTriggers = this._getSublayerUpdateTriggers();\n const geometry = vertices\n ? { vertices, radius: 1 }\n : {\n // default geometry\n // @ts-expect-error TODO - undefined property?\n radius: aggregatorState.layerData.radiusCommon || 1,\n radiusUnits: 'common',\n angle: 90\n };\n return new SubLayerClass({\n ...geometry,\n diskResolution: 6,\n elevationScale,\n extruded,\n coverage,\n material,\n getFillColor: this._onGetSublayerColor.bind(this),\n getElevation: this._onGetSublayerElevation.bind(this),\n transitions: transitions && {\n getFillColor: transitions.getColorValue || transitions.getColorWeight,\n getElevation: transitions.getElevationValue || transitions.getElevationWeight\n }\n }, this.getSubLayerProps({\n id: 'hexagon-cell',\n updateTriggers\n }), {\n data: aggregatorState.layerData.data\n });\n }\n}\nHexagonLayer.layerName = 'HexagonLayer';\nHexagonLayer.defaultProps = defaultProps;\nexport default HexagonLayer;\n", "// Copyright (c) 2015 - 2017 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.\nimport { hexbin } from 'd3-hexbin';\nimport { createIterable, log } from '@deck.gl/core';\n/**\n * Use d3-hexbin to performs hexagonal binning from geo points to hexagons\n * @param {Iterable} data - array of points\n * @param {Number} radius - hexagon radius in meter\n * @param {function} getPosition - get points lon lat\n * @param {Object} viewport - current viewport object\n\n * @return {Object} - hexagons and countRange\n */\nexport function pointToHexbin(props, aggregationParams) {\n const { data, radius } = props;\n const { viewport, attributes } = aggregationParams;\n // get hexagon radius in mercator world unit\n const centerLngLat = data.length ? getPointsCenter(data, aggregationParams) : null;\n const radiusCommon = getRadiusInCommon(radius, viewport, centerLngLat);\n // add world space coordinates to points\n const screenPoints = [];\n const { iterable, objectInfo } = createIterable(data);\n const positions = attributes.positions.value;\n const { size } = attributes.positions.getAccessor();\n for (const object of iterable) {\n objectInfo.index++;\n const posIndex = objectInfo.index * size;\n const position = [positions[posIndex], positions[posIndex + 1]];\n const arrayIsFinite = Number.isFinite(position[0]) && Number.isFinite(position[1]);\n if (arrayIsFinite) {\n screenPoints.push({\n screenCoord: viewport.projectFlat(position),\n source: object,\n index: objectInfo.index\n });\n }\n else {\n log.warn('HexagonLayer: invalid position')();\n }\n }\n const newHexbin = hexbin()\n .radius(radiusCommon)\n .x(d => d.screenCoord[0])\n .y(d => d.screenCoord[1]);\n const hexagonBins = newHexbin(screenPoints);\n return {\n hexagons: hexagonBins.map((hex, index) => ({\n position: viewport.unprojectFlat([hex.x, hex.y]),\n points: hex,\n index\n })),\n radiusCommon\n };\n}\n/**\n * Get the bounding box of all data points\n */\nexport function getPointsCenter(data, aggregationParams) {\n const { attributes } = aggregationParams;\n const positions = attributes.positions.value;\n const { size } = attributes.positions.getAccessor();\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let i;\n for (i = 0; i < size * data.length; i += size) {\n const x = positions[i];\n const y = positions[i + 1];\n const arrayIsFinite = Number.isFinite(x) && Number.isFinite(y);\n if (arrayIsFinite) {\n minX = Math.min(x, minX);\n maxX = Math.max(x, maxX);\n minY = Math.min(y, minY);\n maxY = Math.max(y, maxY);\n }\n }\n // return center\n return [minX, minY, maxX, maxY].every(Number.isFinite)\n ? [(minX + maxX) / 2, (minY + maxY) / 2]\n : null;\n}\n/**\n * Get radius in mercator world space coordinates from meter\n * @param {Number} radius - in meter\n * @param {Object} viewport - current viewport object\n * @param {Array<Number>} center - data center\n\n * @return {Number} radius in mercator world spcae coordinates\n */\nexport function getRadiusInCommon(radius, viewport, center) {\n const { unitsPerMeter } = viewport.getDistanceScales(center);\n // x, y distance should be the same\n return radius * unitsPerMeter[0];\n}\n", "// Copyright (c) 2015 - 2018 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.\nimport { LineLayer, SolidPolygonLayer } from '@deck.gl/layers';\nimport { generateContours } from \"./contour-utils.js\";\nimport { log } from '@deck.gl/core';\nimport GPUGridAggregator from \"../utils/gpu-grid-aggregation/gpu-grid-aggregator.js\";\nimport { AGGREGATION_OPERATION, getValueFunc } from \"../utils/aggregation-operation-utils.js\";\nimport { getBoundingBox, getGridParams } from \"../utils/grid-aggregation-utils.js\";\nimport GridAggregationLayer from \"../grid-aggregation-layer.js\";\nconst DEFAULT_COLOR = [255, 255, 255, 255];\nconst DEFAULT_STROKE_WIDTH = 1;\nconst DEFAULT_THRESHOLD = 1;\nconst defaultProps = {\n // grid aggregation\n cellSize: { type: 'number', min: 1, max: 1000, value: 1000 },\n getPosition: { type: 'accessor', value: (x) => x.position },\n getWeight: { type: 'accessor', value: 1 },\n gpuAggregation: false, // TODO(v9): Re-enable GPU aggregation.\n aggregation: 'SUM',\n // contour lines\n contours: {\n type: 'object',\n value: [{ threshold: DEFAULT_THRESHOLD }],\n optional: true,\n compare: 3\n },\n zOffset: 0.005\n};\nconst POSITION_ATTRIBUTE_NAME = 'positions';\nconst DIMENSIONS = {\n data: {\n props: ['cellSize']\n },\n weights: {\n props: ['aggregation'],\n accessors: ['getWeight']\n }\n};\n/** Aggregate data into iso-lines or iso-bands for a given threshold and cell size. */\nclass ContourLayer extends GridAggregationLayer {\n initializeState() {\n super.initializeAggregationLayer({\n dimensions: DIMENSIONS\n });\n this.setState({\n contourData: {},\n projectPoints: false,\n weights: {\n count: {\n size: 1,\n operation: AGGREGATION_OPERATION.SUM\n }\n }\n });\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n [POSITION_ATTRIBUTE_NAME]: {\n size: 3,\n accessor: 'getPosition',\n type: 'float64',\n fp64: this.use64bitPositions()\n },\n // this attribute is used in gpu aggregation path only\n count: { size: 3, accessor: 'getWeight' }\n });\n }\n updateState(opts) {\n super.updateState(opts);\n let contoursChanged = false;\n const { oldProps, props } = opts;\n const { aggregationDirty } = this.state;\n if (oldProps.contours !== props.contours || oldProps.zOffset !== props.zOffset) {\n contoursChanged = true;\n this._updateThresholdData(opts.props);\n }\n if (this.getNumInstances() > 0 && (aggregationDirty || contoursChanged)) {\n this._generateContours();\n }\n }\n renderLayers() {\n const { contourSegments, contourPolygons } = this.state.contourData;\n const LinesSubLayerClass = this.getSubLayerClass('lines', LineLayer);\n const BandsSubLayerClass = this.getSubLayerClass('bands', SolidPolygonLayer);\n // Contour lines layer\n const lineLayer = contourSegments &&\n contourSegments.length > 0 &&\n new LinesSubLayerClass(this.getSubLayerProps({\n id: 'lines'\n }), {\n data: this.state.contourData.contourSegments,\n getSourcePosition: d => d.start,\n getTargetPosition: d => d.end,\n getColor: d => d.contour.color || DEFAULT_COLOR,\n getWidth: d => d.contour.strokeWidth || DEFAULT_STROKE_WIDTH\n });\n // Contour bands layer\n const bandsLayer = contourPolygons &&\n contourPolygons.length > 0 &&\n new BandsSubLayerClass(this.getSubLayerProps({\n id: 'bands'\n }), {\n data: this.state.contourData.contourPolygons,\n getPolygon: d => d.vertices,\n getFillColor: d => d.contour.color || DEFAULT_COLOR\n });\n return [lineLayer, bandsLayer];\n }\n // Aggregation Overrides\n /* eslint-disable max-statements, complexity */\n updateAggregationState(opts) {\n const { props, oldProps } = opts;\n const { cellSize, coordinateSystem } = props;\n const { viewport } = this.context;\n const cellSizeChanged = oldProps.cellSize !== cellSize;\n let gpuAggregation = props.gpuAggregation;\n if (this.state.gpuAggregation !== props.gpuAggregation) {\n if (gpuAggregation && !GPUGridAggregator.isSupported(this.context.device)) {\n log.warn('GPU Grid Aggregation not supported, falling back to CPU')();\n gpuAggregation = false;\n }\n }\n const gpuAggregationChanged = gpuAggregation !== this.state.gpuAggregation;\n this.setState({\n gpuAggregation\n });\n const { dimensions } = this.state;\n const positionsChanged = this.isAttributeChanged(POSITION_ATTRIBUTE_NAME);\n const { data, weights } = dimensions;\n let { boundingBox } = this.state;\n if (positionsChanged) {\n boundingBox = getBoundingBox(this.getAttributes(), this.getNumInstances());\n this.setState({ boundingBox });\n }\n if (positionsChanged || cellSizeChanged) {\n const { gridOffset, translation, width, height, numCol, numRow } = getGridParams(boundingBox, cellSize, viewport, coordinateSystem);\n this.allocateResources(numRow, numCol);\n this.setState({\n gridOffset,\n boundingBox,\n translation,\n posOffset: translation.slice(), // Used for CPU aggregation, to offset points\n gridOrigin: [-1 * translation[0], -1 * translation[1]],\n width,\n height,\n numCol,\n numRow\n });\n }\n const aggregationDataDirty = positionsChanged ||\n gpuAggregationChanged ||\n this.isAggregationDirty(opts, {\n dimension: data,\n compareAll: gpuAggregation // check for all (including extentions props) when using gpu aggregation\n });\n const aggregationWeightsDirty = this.isAggregationDirty(opts, {\n dimension: weights\n });\n if (aggregationWeightsDirty) {\n this._updateAccessors(opts);\n }\n if (aggregationDataDirty || aggregationWeightsDirty) {\n this._resetResults();\n }\n this.setState({\n aggregationDataDirty,\n aggregationWeightsDirty\n });\n }\n /* eslint-enable max-statements, complexity */\n // Private (Aggregation)\n _updateAccessors(opts) {\n const { getWeight, aggregation, data } = opts.props;\n const { count } = this.state.weights;\n if (count) {\n count.getWeight = getWeight;\n count.operation = AGGREGATION_OPERATION[aggregation];\n }\n this.setState({ getValue: getValueFunc(aggregation, getWeight, { data }) });\n }\n _resetResults() {\n const { count } = this.state.weights;\n if (count) {\n count.aggregationData = null;\n }\n }\n // Private (Contours)\n _generateContours() {\n const { numCol, numRow, gridOrigin, gridOffset, thresholdData } = this.state;\n const { count } = this.state.weights;\n let { aggregationData } = count;\n if (!aggregationData) {\n // @ts-ignore\n aggregationData = count.aggregationBuffer.readSyncWebGL();\n count.aggregationData = aggregationData;\n }\n const { cellWeights } = GPUGridAggregator.getCellData({ countsData: aggregationData });\n const contourData = generateContours({\n thresholdData,\n cellWeights,\n gridSize: [numCol, numRow],\n gridOrigin,\n cellSize: [gridOffset.xOffset, gridOffset.yOffset]\n });\n // contourData contains both iso-lines and iso-bands if requested.\n this.setState({ contourData });\n }\n _updateThresholdData(props) {\n const { contours, zOffset } = props;\n const count = contours.length;\n const thresholdData = new Array(count);\n for (let i = 0; i < count; i++) {\n const contour = contours[i];\n thresholdData[i] = {\n contour,\n zIndex: contour.zIndex || i,\n zOffset\n };\n }\n this.setState({ thresholdData });\n }\n}\nContourLayer.layerName = 'ContourLayer';\nContourLayer.defaultProps = defaultProps;\nexport default ContourLayer;\n", "// All utility methods needed to implement Marching Squares algorithm\n// Ref: https://en.wikipedia.org/wiki/Marching_squares\nimport { log } from '@deck.gl/core';\nimport { ISOLINES_CODE_OFFSET_MAP, ISOBANDS_CODE_OFFSET_MAP } from \"./marching-squares-codes.js\";\nexport const CONTOUR_TYPE = {\n ISO_LINES: 1,\n ISO_BANDS: 2\n};\nconst DEFAULT_THRESHOLD_DATA = {\n zIndex: 0,\n zOffset: 0.005\n};\n// Utility methods\nfunction getVertexCode(weight, threshold) {\n // threshold must be a single value or a range (array of size 2)\n // Iso-bands\n if (Array.isArray(threshold)) {\n if (weight < threshold[0]) {\n return 0;\n }\n return weight < threshold[1] ? 1 : 2;\n }\n // Iso-lines\n return weight >= threshold ? 1 : 0;\n}\n// Returns marching square code for given cell\n/* eslint-disable complexity, max-statements*/\nexport function getCode(opts) {\n // Assumptions\n // Origin is on bottom-left , and X increase to right, Y to top\n // When processing one cell, we process 4 cells, by extending row to top and on column to right\n // to create a 2X2 cell grid\n const { cellWeights, x, y, width, height } = opts;\n let threshold = opts.threshold;\n if (opts.thresholdValue) {\n log.deprecated('thresholdValue', 'threshold')();\n threshold = opts.thresholdValue;\n }\n const isLeftBoundary = x < 0;\n const isRightBoundary = x >= width - 1;\n const isBottomBoundary = y < 0;\n const isTopBoundary = y >= height - 1;\n const isBoundary = isLeftBoundary || isRightBoundary || isBottomBoundary || isTopBoundary;\n const weights = {};\n const codes = {};\n // TOP\n if (isLeftBoundary || isTopBoundary) {\n codes.top = 0;\n }\n else {\n weights.top = cellWeights[(y + 1) * width + x];\n codes.top = getVertexCode(weights.top, threshold);\n }\n // TOP-RIGHT\n if (isRightBoundary || isTopBoundary) {\n codes.topRight = 0;\n }\n else {\n weights.topRight = cellWeights[(y + 1) * width + x + 1];\n codes.topRight = getVertexCode(weights.topRight, threshold);\n }\n // RIGHT\n if (isRightBoundary || isBottomBoundary) {\n codes.right = 0;\n }\n else {\n weights.right = cellWeights[y * width + x + 1];\n codes.right = getVertexCode(weights.right, threshold);\n }\n // CURRENT\n if (isLeftBoundary || isBottomBoundary) {\n codes.current = 0;\n }\n else {\n weights.current = cellWeights[y * width + x];\n codes.current = getVertexCode(weights.current, threshold);\n }\n const { top, topRight, right, current } = codes;\n let code = -1;\n if (Number.isFinite(threshold)) {\n code = (top << 3) | (topRight << 2) | (right << 1) | current;\n }\n if (Array.isArray(threshold)) {\n code = (top << 6) | (topRight << 4) | (right << 2) | current;\n }\n let meanCode = 0;\n // meanCode is only needed for saddle cases, and they should\n // only occur when we are not processing a cell on boundary\n // because when on a boundary either, bottom-row, top-row, left-column or right-column will have both 0 codes\n if (!isBoundary) {\n meanCode = getVertexCode((weights.top + weights.topRight + weights.right + weights.current) / 4, threshold);\n }\n return { code, meanCode };\n}\n/* eslint-enable complexity, max-statements*/\n// Returns intersection vertices for given cellindex\n// [x, y] refers current marching cell, reference vertex is always top-right corner\nexport function getVertices(opts) {\n const { gridOrigin, cellSize, x, y, code, meanCode, type = CONTOUR_TYPE.ISO_LINES } = opts;\n const thresholdData = { ...DEFAULT_THRESHOLD_DATA, ...opts.thresholdData };\n let offsets = type === CONTOUR_TYPE.ISO_BANDS\n ? ISOBANDS_CODE_OFFSET_MAP[code]\n : ISOLINES_CODE_OFFSET_MAP[code];\n // handle saddle cases\n if (!Array.isArray(offsets)) {\n offsets = offsets[meanCode];\n }\n // Reference vertex is at top-right move to top-right corner\n const vZ = thresholdData.zIndex * thresholdData.zOffset;\n const rX = (x + 1) * cellSize[0];\n const rY = (y + 1) * cellSize[1];\n const refVertexX = gridOrigin[0] + rX;\n const refVertexY = gridOrigin[1] + rY;\n // offsets format\n // ISO_LINES: [[1A, 1B], [2A, 2B]],\n // ISO_BANDS: [[1A, 1B, 1C, ...], [2A, 2B, 2C, ...]],\n // vertices format\n // ISO_LINES: [[x1A, y1A], [x1B, y1B], [x2A, x2B], ...],\n // ISO_BANDS: => confirms to SolidPolygonLayer's simple polygon format\n // [\n // [[x1A, y1A], [x1B, y1B], [x1C, y1C] ... ],\n // ...\n // ]\n if (type === CONTOUR_TYPE.ISO_BANDS) {\n const polygons = [];\n offsets.forEach(polygonOffsets => {\n const polygon = [];\n polygonOffsets.forEach(xyOffset => {\n const vX = refVertexX + xyOffset[0] * cellSize[0];\n const vY = refVertexY + xyOffset[1] * cellSize[1];\n polygon.push([vX, vY, vZ]);\n });\n polygons.push(polygon);\n });\n return polygons;\n }\n // default case is ISO_LINES\n const lines = [];\n offsets.forEach(xyOffsets => {\n xyOffsets.forEach(offset => {\n const vX = refVertexX + offset[0] * cellSize[0];\n const vY = refVertexY + offset[1] * cellSize[1];\n lines.push([vX, vY, vZ]);\n });\n });\n return lines;\n}\n", "// Code to Offsets Map needed to implement Marching Squares algorithm\n// Ref: https://en.wikipedia.org/wiki/Marching_squares\n// Table to map code to the intersection offsets\n// All offsets are relative to the center of marching cell (which is top right corner of grid-cell, and center of marching-square)\nconst HALF = 0.5;\nconst ONE6TH = 1 / 6;\nconst OFFSET = {\n N: [0, HALF], // NORTH\n E: [HALF, 0], // EAST\n S: [0, -HALF], // SOUTH\n W: [-HALF, 0], // WEST\n // CORNERS\n NE: [HALF, HALF],\n NW: [-HALF, HALF],\n SE: [HALF, -HALF],\n SW: [-HALF, -HALF]\n};\n// NOTE: vertices are ordered in CCW direction, starting from NW corner\n// Triangles\nconst SW_TRIANGLE = [OFFSET.W, OFFSET.SW, OFFSET.S];\nconst SE_TRIANGLE = [OFFSET.S, OFFSET.SE, OFFSET.E];\nconst NE_TRIANGLE = [OFFSET.E, OFFSET.NE, OFFSET.N];\nconst NW_TRIANGLE = [OFFSET.NW, OFFSET.W, OFFSET.N];\n// Trapezoids\nconst SW_TRAPEZOID = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF]\n];\nconst SE_TRAPEZOID = [\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n [HALF, -ONE6TH],\n [HALF, ONE6TH]\n];\nconst NE_TRAPEZOID = [\n [HALF, -ONE6TH],\n [HALF, ONE6TH],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\nconst NW_TRAPEZOID = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\n// Rectangles\nconst S_RECTANGLE = [OFFSET.W, OFFSET.SW, OFFSET.SE, OFFSET.E];\nconst E_RECTANGLE = [OFFSET.S, OFFSET.SE, OFFSET.NE, OFFSET.N];\nconst N_RECTANGLE = [OFFSET.NW, OFFSET.W, OFFSET.E, OFFSET.NE];\nconst W_RECTANGLE = [OFFSET.NW, OFFSET.SW, OFFSET.S, OFFSET.N];\nconst EW_RECTANGEL = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [HALF, -ONE6TH],\n [HALF, ONE6TH]\n];\nconst SN_RECTANGEL = [\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\n// Square\nconst SQUARE = [OFFSET.NW, OFFSET.SW, OFFSET.SE, OFFSET.NE];\n// Pentagons\nconst SW_PENTAGON = [OFFSET.NW, OFFSET.SW, OFFSET.SE, OFFSET.E, OFFSET.N];\nconst SE_PENTAGON = [OFFSET.W, OFFSET.SW, OFFSET.SE, OFFSET.NE, OFFSET.N];\nconst NE_PENTAGON = [OFFSET.NW, OFFSET.W, OFFSET.S, OFFSET.SE, OFFSET.NE];\nconst NW_PENTAGON = [OFFSET.NW, OFFSET.SW, OFFSET.S, OFFSET.E, OFFSET.NE];\nconst NW_N_PENTAGON = [OFFSET.NW, OFFSET.W, [HALF, -ONE6TH], [HALF, ONE6TH], OFFSET.N];\nconst NE_E_PENTAGON = [[-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.E, OFFSET.NE, OFFSET.N];\nconst SE_S_PENTAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.S, OFFSET.SE, OFFSET.E];\nconst SW_W_PENTAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, [ONE6TH, HALF], [-ONE6TH, HALF]];\nconst NW_W_PENTAGON = [OFFSET.NW, OFFSET.W, [-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.N];\nconst NE_N_PENTAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.E, OFFSET.NE, OFFSET.N];\nconst SE_E_PENTAGON = [OFFSET.S, OFFSET.SE, OFFSET.E, [ONE6TH, HALF], [-ONE6TH, HALF]];\nconst SW_S_PENTAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, [HALF, -ONE6TH], [HALF, ONE6TH]];\n// Hexagon\nconst S_HEXAGON = [OFFSET.W, OFFSET.SW, OFFSET.SE, OFFSET.E, [ONE6TH, HALF], [-ONE6TH, HALF]];\nconst E_HEXAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.S, OFFSET.SE, OFFSET.NE, OFFSET.N];\nconst N_HEXAGON = [OFFSET.NW, OFFSET.W, [-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.E, OFFSET.NE];\nconst W_HEXAGON = [OFFSET.NW, OFFSET.SW, OFFSET.S, [HALF, -ONE6TH], [HALF, ONE6TH], OFFSET.N];\nconst SW_NE_HEXAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, OFFSET.E, OFFSET.NE, OFFSET.N];\nconst NW_SE_HEXAGON = [OFFSET.NW, OFFSET.W, OFFSET.S, OFFSET.SE, OFFSET.E, OFFSET.N];\n// Heptagon (7-sided)\nconst NE_HEPTAGON = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n OFFSET.E,\n OFFSET.NE,\n OFFSET.N\n];\nconst SW_HEPTAGON = [\n OFFSET.W,\n OFFSET.SW,\n OFFSET.S,\n [HALF, -ONE6TH],\n [HALF, ONE6TH],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\nconst NW_HEPTAGON = [\n OFFSET.NW,\n OFFSET.W,\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n [HALF, -ONE6TH],\n [HALF, ONE6TH],\n OFFSET.N\n];\nconst SE_HEPTAGON = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n OFFSET.S,\n OFFSET.SE,\n OFFSET.E,\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\n// Octagon\nconst OCTAGON = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n [HALF, -ONE6TH],\n [HALF, ONE6TH],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\n// Note: above wiki page invertes white/black dots for generating the code, we don't\nexport const ISOLINES_CODE_OFFSET_MAP = {\n // key is equal to the code of 4 vertices (invert the code specified in wiki)\n // value can be an array or an Object\n // Array : [line] or [line, line], where each line is [start-point, end-point], and each point is [x, y]\n // Object : to handle saddle cases, whos output depends on mean value of all 4 corners\n // key: code of mean value (0 or 1)\n // value: Array , as above defines one or two line segments\n 0: [],\n 1: [[OFFSET.W, OFFSET.S]],\n 2: [[OFFSET.S, OFFSET.E]],\n 3: [[OFFSET.W, OFFSET.E]],\n 4: [[OFFSET.N, OFFSET.E]],\n 5: {\n 0: [\n [OFFSET.W, OFFSET.S],\n [OFFSET.N, OFFSET.E]\n ],\n 1: [\n [OFFSET.W, OFFSET.N],\n [OFFSET.S, OFFSET.E]\n ]\n },\n 6: [[OFFSET.N, OFFSET.S]],\n 7: [[OFFSET.W, OFFSET.N]],\n 8: [[OFFSET.W, OFFSET.N]],\n 9: [[OFFSET.N, OFFSET.S]],\n 10: {\n 0: [\n [OFFSET.W, OFFSET.N],\n [OFFSET.S, OFFSET.E]\n ],\n 1: [\n [OFFSET.W, OFFSET.S],\n [OFFSET.N, OFFSET.E]\n ]\n },\n 11: [[OFFSET.N, OFFSET.E]],\n 12: [[OFFSET.W, OFFSET.E]],\n 13: [[OFFSET.S, OFFSET.E]],\n 14: [[OFFSET.W, OFFSET.S]],\n 15: []\n};\nfunction ternaryToIndex(ternary) {\n return parseInt(ternary, 4);\n}\nexport const ISOBANDS_CODE_OFFSET_MAP = {\n // Below list of cases, follow the same order as in above mentioned wiki page.\n // Each case has its code on first commented line // T,TR,R,C\n // where T: Top, TR: Top-right, R: Right and C: current, each will be either 0, 1 or 2\n // final code is binary representation of above code , where takes 2 digits\n // for example: code 2-2-2-1 => 10-10-10-01 => 10101001 => 169\n // no contours\n [ternaryToIndex('0000')]: [],\n [ternaryToIndex('2222')]: [],\n // single triangle\n [ternaryToIndex('2221')]: [SW_TRIANGLE],\n [ternaryToIndex('2212')]: [SE_TRIANGLE],\n [ternaryToIndex('2122')]: [NE_TRIANGLE],\n [ternaryToIndex('1222')]: [NW_TRIANGLE],\n [ternaryToIndex('0001')]: [SW_TRIANGLE],\n [ternaryToIndex('0010')]: [SE_TRIANGLE],\n [ternaryToIndex('0100')]: [NE_TRIANGLE],\n [ternaryToIndex('1000')]: [NW_TRIANGLE],\n // single trapezoid\n [ternaryToIndex('2220')]: [SW_TRAPEZOID],\n [ternaryToIndex('2202')]: [SE_TRAPEZOID],\n [ternaryToIndex('2022')]: [NE_TRAPEZOID],\n [ternaryToIndex('0222')]: [NW_TRAPEZOID],\n [ternaryToIndex('0002')]: [SW_TRAPEZOID],\n [ternaryToIndex('0020')]: [SE_TRAPEZOID],\n [ternaryToIndex('0200')]: [NE_TRAPEZOID],\n [ternaryToIndex('2000')]: [NW_TRAPEZOID],\n // single rectangle\n [ternaryToIndex('0011')]: [S_RECTANGLE],\n [ternaryToIndex('0110')]: [E_RECTANGLE],\n [ternaryToIndex('1100')]: [N_RECTANGLE],\n [ternaryToIndex('1001')]: [W_RECTANGLE],\n [ternaryToIndex('2211')]: [S_RECTANGLE],\n [ternaryToIndex('2112')]: [E_RECTANGLE],\n [ternaryToIndex('1122')]: [N_RECTANGLE],\n [ternaryToIndex('1221')]: [W_RECTANGLE],\n [ternaryToIndex('2200')]: [EW_RECTANGEL],\n [ternaryToIndex('2002')]: [SN_RECTANGEL],\n [ternaryToIndex('0022')]: [EW_RECTANGEL],\n [ternaryToIndex('0220')]: [SN_RECTANGEL],\n // single square\n // 1111\n [ternaryToIndex('1111')]: [SQUARE],\n // single pentagon\n [ternaryToIndex('1211')]: [SW_PENTAGON],\n [ternaryToIndex('2111')]: [SE_PENTAGON],\n [ternaryToIndex('1112')]: [NE_PENTAGON],\n [ternaryToIndex('1121')]: [NW_PENTAGON],\n [ternaryToIndex('1011')]: [SW_PENTAGON],\n [ternaryToIndex('0111')]: [SE_PENTAGON],\n [ternaryToIndex('1110')]: [NE_PENTAGON],\n [ternaryToIndex('1101')]: [NW_PENTAGON],\n [ternaryToIndex('1200')]: [NW_N_PENTAGON],\n [ternaryToIndex('0120')]: [NE_E_PENTAGON],\n [ternaryToIndex('0012')]: [SE_S_PENTAGON],\n [ternaryToIndex('2001')]: [SW_W_PENTAGON],\n [ternaryToIndex('1022')]: [NW_N_PENTAGON],\n [ternaryToIndex('2102')]: [NE_E_PENTAGON],\n [ternaryToIndex('2210')]: [SE_S_PENTAGON],\n [ternaryToIndex('0221')]: [SW_W_PENTAGON],\n [ternaryToIndex('1002')]: [NW_W_PENTAGON],\n [ternaryToIndex('2100')]: [NE_N_PENTAGON],\n [ternaryToIndex('0210')]: [SE_E_PENTAGON],\n [ternaryToIndex('0021')]: [SW_S_PENTAGON],\n [ternaryToIndex('1220')]: [NW_W_PENTAGON],\n [ternaryToIndex('0122')]: [NE_N_PENTAGON],\n [ternaryToIndex('2012')]: [SE_E_PENTAGON],\n [ternaryToIndex('2201')]: [SW_S_PENTAGON],\n // single hexagon\n [ternaryToIndex('0211')]: [S_HEXAGON],\n [ternaryToIndex('2110')]: [E_HEXAGON],\n [ternaryToIndex('1102')]: [N_HEXAGON],\n [ternaryToIndex('1021')]: [W_HEXAGON],\n [ternaryToIndex('2011')]: [S_HEXAGON],\n [ternaryToIndex('0112')]: [E_HEXAGON],\n [ternaryToIndex('1120')]: [N_HEXAGON],\n [ternaryToIndex('1201')]: [W_HEXAGON],\n [ternaryToIndex('2101')]: [SW_NE_HEXAGON],\n [ternaryToIndex('0121')]: [SW_NE_HEXAGON],\n [ternaryToIndex('1012')]: [NW_SE_HEXAGON],\n [ternaryToIndex('1210')]: [NW_SE_HEXAGON],\n // 6-sided polygons based on mean weight\n // NOTE: merges mean value codes for extreme changes (as per above Wiki doc)\n [ternaryToIndex('0101')]: {\n 0: [SW_TRIANGLE, NE_TRIANGLE],\n 1: [SW_NE_HEXAGON],\n 2: [SW_NE_HEXAGON]\n },\n [ternaryToIndex('1010')]: {\n 0: [NW_TRIANGLE, SE_TRIANGLE],\n 1: [NW_SE_HEXAGON],\n 2: [NW_SE_HEXAGON]\n },\n [ternaryToIndex('2121')]: {\n 0: [SW_NE_HEXAGON],\n 1: [SW_NE_HEXAGON],\n 2: [SW_TRIANGLE, NE_TRIANGLE]\n },\n [ternaryToIndex('1212')]: {\n 0: [NW_SE_HEXAGON],\n 1: [NW_SE_HEXAGON],\n 2: [NW_TRIANGLE, SE_TRIANGLE]\n },\n // 7-sided polygons based on mean weight\n [ternaryToIndex('2120')]: {\n 0: [NE_HEPTAGON],\n 1: [NE_HEPTAGON],\n 2: [SW_TRAPEZOID, NE_TRIANGLE]\n },\n [ternaryToIndex('2021')]: {\n 0: [SW_HEPTAGON],\n 1: [SW_HEPTAGON],\n 2: [SW_TRIANGLE, NE_TRAPEZOID]\n },\n [ternaryToIndex('1202')]: {\n 0: [NW_HEPTAGON],\n 1: [NW_HEPTAGON],\n 2: [NW_TRIANGLE, SE_TRAPEZOID]\n },\n [ternaryToIndex('0212')]: {\n 0: [SE_HEPTAGON],\n 1: [SE_HEPTAGON],\n 2: [SE_TRIANGLE, NW_TRAPEZOID]\n },\n [ternaryToIndex('0102')]: {\n 0: [SW_TRAPEZOID, NE_TRIANGLE],\n 1: [NE_HEPTAGON],\n 2: [NE_HEPTAGON]\n },\n [ternaryToIndex('0201')]: {\n 0: [SW_TRIANGLE, NE_TRAPEZOID],\n 1: [SW_HEPTAGON],\n 2: [SW_HEPTAGON]\n },\n [ternaryToIndex('1020')]: {\n 0: [NW_TRIANGLE, SE_TRAPEZOID],\n 1: [NW_HEPTAGON],\n 2: [NW_HEPTAGON]\n },\n [ternaryToIndex('2010')]: {\n 0: [SE_TRIANGLE, NW_TRAPEZOID],\n 1: [SE_HEPTAGON],\n 2: [SE_HEPTAGON]\n },\n // 8-sided polygons based on mean weight\n [ternaryToIndex('2020')]: {\n 0: [NW_TRAPEZOID, SE_TRAPEZOID],\n 1: [OCTAGON],\n 2: [SW_TRAPEZOID, NE_TRAPEZOID]\n },\n [ternaryToIndex('0202')]: {\n 0: [NE_TRAPEZOID, SW_TRAPEZOID],\n 1: [OCTAGON],\n 2: [NW_TRAPEZOID, SE_TRAPEZOID]\n }\n};\n", "import { getCode, getVertices, CONTOUR_TYPE } from \"./marching-squares.js\";\n// Given all the cell weights, generates contours for each threshold.\n/* eslint-disable max-depth */\nexport function generateContours({ thresholdData, cellWeights, gridSize, gridOrigin, cellSize }) {\n const contourSegments = [];\n const contourPolygons = [];\n const width = gridSize[0];\n const height = gridSize[1];\n let segmentIndex = 0;\n let polygonIndex = 0;\n for (const data of thresholdData) {\n const { contour } = data;\n const { threshold } = contour;\n for (let x = -1; x < width; x++) {\n for (let y = -1; y < height; y++) {\n // Get the MarchingSquares code based on neighbor cell weights.\n const { code, meanCode } = getCode({\n cellWeights,\n threshold,\n x,\n y,\n width,\n height\n });\n const opts = {\n type: CONTOUR_TYPE.ISO_BANDS,\n gridOrigin,\n cellSize,\n x,\n y,\n width,\n height,\n code,\n meanCode,\n thresholdData: data\n };\n if (Array.isArray(threshold)) {\n opts.type = CONTOUR_TYPE.ISO_BANDS;\n const polygons = getVertices(opts);\n for (const polygon of polygons) {\n contourPolygons[polygonIndex++] = {\n vertices: polygon,\n contour\n };\n }\n }\n else {\n // Get the intersection vertices based on MarchingSquares code.\n opts.type = CONTOUR_TYPE.ISO_LINES;\n const vertices = getVertices(opts);\n for (let i = 0; i < vertices.length; i += 2) {\n contourSegments[segmentIndex++] = {\n start: vertices[i],\n end: vertices[i + 1],\n contour\n };\n }\n }\n }\n }\n }\n return { contourSegments, contourPolygons };\n}\n/* eslint-enable max-depth */\n", "import { CompositeLayer } from '@deck.gl/core';\nimport GPUGridAggregator from \"../utils/gpu-grid-aggregation/gpu-grid-aggregator.js\";\nimport GPUGridLayer from \"../gpu-grid-layer/gpu-grid-layer.js\";\nimport CPUGridLayer from \"../cpu-grid-layer/cpu-grid-layer.js\";\nconst defaultProps = {\n ...GPUGridLayer.defaultProps,\n ...CPUGridLayer.defaultProps,\n gpuAggregation: false\n};\n/** Aggregate data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. */\nclass GridLayer extends CompositeLayer {\n initializeState() {\n this.state = {\n useGPUAggregation: false // TODO(v9): Re-enable GPU aggregation.\n };\n }\n updateState({ props }) {\n this.setState({\n // TODO(v9): Re-enable GPU aggregation.\n // useGPUAggregation: this.canUseGPUAggregation(props)\n useGPUAggregation: false\n });\n }\n renderLayers() {\n const { data, updateTriggers } = this.props;\n const id = this.state.useGPUAggregation ? 'GPU' : 'CPU';\n const LayerType = this.state.useGPUAggregation\n ? this.getSubLayerClass('GPU', GPUGridLayer)\n : this.getSubLayerClass('CPU', CPUGridLayer);\n return new LayerType(this.props, this.getSubLayerProps({\n id,\n updateTriggers\n }), {\n data\n });\n }\n // Private methods\n canUseGPUAggregation(props) {\n const { gpuAggregation, lowerPercentile, upperPercentile, getColorValue, getElevationValue, colorScaleType } = props;\n if (!gpuAggregation) {\n // cpu aggregation is requested\n return false;\n }\n if (!GPUGridAggregator.isSupported(this.context.device)) {\n return false;\n }\n if (lowerPercentile !== 0 || upperPercentile !== 100) {\n // percentile calculations requires sorting not supported on GPU\n return false;\n }\n if (getColorValue !== null || getElevationValue !== null) {\n // accessor for custom color or elevation calculation is specified\n return false;\n }\n if (colorScaleType === 'quantile' || colorScaleType === 'ordinal') {\n // quantile and ordinal scales are not supported on GPU\n return false;\n }\n return true;\n }\n}\nGridLayer.layerName = 'GridLayer';\nGridLayer.defaultProps = defaultProps;\nexport default GridLayer;\n", "// Copyright (c) 2015 - 2017 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.\nimport { GL } from '@luma.gl/constants';\nimport { log } from '@deck.gl/core';\nimport GPUGridAggregator from \"../utils/gpu-grid-aggregation/gpu-grid-aggregator.js\";\nimport { AGGREGATION_OPERATION } from \"../utils/aggregation-operation-utils.js\";\nimport { defaultColorRange, colorRangeToFlatArray } from \"../utils/color-utils.js\";\nimport GPUGridCellLayer from \"./gpu-grid-cell-layer.js\";\nimport { pointToDensityGridDataCPU } from \"./../cpu-grid-layer/grid-aggregator.js\";\nimport GridAggregationLayer from \"../grid-aggregation-layer.js\";\nimport { getBoundingBox, getGridParams } from \"../utils/grid-aggregation-utils.js\";\nconst defaultProps = {\n // color\n colorDomain: null,\n colorRange: defaultColorRange,\n getColorWeight: { type: 'accessor', value: 1 },\n colorAggregation: 'SUM',\n // elevation\n elevationDomain: null,\n elevationRange: [0, 1000],\n getElevationWeight: { type: 'accessor', value: 1 },\n elevationAggregation: 'SUM',\n elevationScale: { type: 'number', min: 0, value: 1 },\n // grid\n cellSize: { type: 'number', min: 1, max: 1000, value: 1000 },\n coverage: { type: 'number', min: 0, max: 1, value: 1 },\n getPosition: { type: 'accessor', value: (x) => x.position },\n extruded: false,\n // Optional material for 'lighting' shader module\n material: true\n};\n// This layer only perform GPU aggregation, no need to seperate data and weight props\n// aggregation will be dirty when any of the props are changed.\nconst DIMENSIONS = {\n data: {\n props: ['cellSize', 'colorAggregation', 'elevationAggregation']\n }\n // rest of the changes are detected by `state.attributesChanged`\n};\nconst POSITION_ATTRIBUTE_NAME = 'positions';\n/** Aggregate data into a grid-based heatmap. Aggregation is performed on GPU. */\nclass GPUGridLayer extends GridAggregationLayer {\n initializeState({ device }) {\n const isSupported = GPUGridAggregator.isSupported(device);\n if (!isSupported) {\n log.error('GPUGridLayer is not supported on this browser, use GridLayer instead')();\n }\n super.initializeAggregationLayer({\n dimensions: DIMENSIONS\n });\n this.setState({\n gpuAggregation: false, // TODO(v9): Re-enable GPU aggregation.\n projectPoints: false, // aggregation in world space\n isSupported,\n weights: {\n color: {\n needMin: true,\n needMax: true,\n combineMaxMin: true,\n maxMinBuffer: device.createBuffer({\n byteLength: 4 * 4,\n // @ts-expect-error webgl-legacy\n accessor: { size: 4, type: 5126, divisor: 1 }\n })\n },\n elevation: {\n needMin: true,\n needMax: true,\n combineMaxMin: true,\n maxMinBuffer: device.createBuffer({\n byteLength: 4 * 4,\n // @ts-expect-error\n accessor: { size: 4, type: 5126, divisor: 1 }\n })\n }\n },\n positionAttributeName: 'positions'\n });\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n [POSITION_ATTRIBUTE_NAME]: {\n size: 3,\n accessor: 'getPosition',\n type: 'float64',\n fp64: this.use64bitPositions()\n },\n color: { size: 3, accessor: 'getColorWeight' },\n elevation: { size: 3, accessor: 'getElevationWeight' }\n });\n }\n updateState(opts) {\n if (this.state.isSupported === false) {\n // Skip update, layer not supported\n return;\n }\n super.updateState(opts);\n const { aggregationDirty } = this.state;\n if (aggregationDirty) {\n // reset cached CPU Aggregation results (used for picking)\n this.setState({\n gridHash: null\n });\n }\n }\n getHashKeyForIndex(index) {\n const { numRow, numCol, boundingBox, gridOffset } = this.state;\n const gridSize = [numCol, numRow];\n const gridOrigin = [boundingBox.xMin, boundingBox.yMin];\n const cellSize = [gridOffset.xOffset, gridOffset.yOffset];\n const yIndex = Math.floor(index / gridSize[0]);\n const xIndex = index - yIndex * gridSize[0];\n // This will match the index to the hash-key to access aggregation data from CPU aggregation results.\n const latIdx = Math.floor((yIndex * cellSize[1] + gridOrigin[1] + 90 + cellSize[1] / 2) / cellSize[1]);\n const lonIdx = Math.floor((xIndex * cellSize[0] + gridOrigin[0] + 180 + cellSize[0] / 2) / cellSize[0]);\n return `${latIdx}-${lonIdx}`;\n }\n getPositionForIndex(index) {\n const { numRow, numCol, boundingBox, gridOffset } = this.state;\n const gridSize = [numCol, numRow];\n const gridOrigin = [boundingBox.xMin, boundingBox.yMin];\n const cellSize = [gridOffset.xOffset, gridOffset.yOffset];\n const yIndex = Math.floor(index / gridSize[0]);\n const xIndex = index - yIndex * gridSize[0];\n const yPos = yIndex * cellSize[1] + gridOrigin[1];\n const xPos = xIndex * cellSize[0] + gridOrigin[0];\n return [xPos, yPos];\n }\n getPickingInfo({ info, mode }) {\n const { index } = info;\n let object = null;\n if (index >= 0) {\n const gpuGridAggregator = this.state.gpuGridAggregator;\n const position = this.getPositionForIndex(index);\n const colorInfo = GPUGridAggregator.getAggregationData({\n pixelIndex: index,\n ...gpuGridAggregator.getData('color')\n });\n const elevationInfo = GPUGridAggregator.getAggregationData({\n pixelIndex: index,\n ...gpuGridAggregator.getData('elevation')\n });\n object = {\n colorValue: colorInfo.cellWeight,\n elevationValue: elevationInfo.cellWeight,\n count: colorInfo.cellCount || elevationInfo.cellCount,\n position,\n totalCount: colorInfo.totalCount || elevationInfo.totalCount\n };\n if (mode !== 'hover') {\n // perform CPU aggregation for full list of points for each cell\n const { props } = this;\n let { gridHash } = this.state;\n if (!gridHash) {\n const { gridOffset, translation, boundingBox } = this.state;\n const { viewport } = this.context;\n const attributes = this.getAttributes();\n const cpuAggregation = pointToDensityGridDataCPU(props, {\n gridOffset,\n attributes,\n viewport,\n translation,\n boundingBox\n });\n gridHash = cpuAggregation.gridHash;\n this.setState({ gridHash });\n }\n const key = this.getHashKeyForIndex(index);\n const cpuAggregationData = gridHash[key];\n Object.assign(object, cpuAggregationData);\n }\n }\n // override object with picked cell\n info.picked = Boolean(object);\n info.object = object;\n return info;\n }\n renderLayers() {\n if (!this.state.isSupported) {\n return null;\n }\n const { elevationScale, extruded, cellSize: cellSizeMeters, coverage, material, elevationRange, colorDomain, elevationDomain } = this.props;\n const { weights, numRow, numCol, gridOrigin, gridOffset } = this.state;\n const { color, elevation } = weights;\n const colorRange = colorRangeToFlatArray(this.props.colorRange);\n const SubLayerClass = this.getSubLayerClass('gpu-grid-cell', GPUGridCellLayer);\n return new SubLayerClass({\n gridSize: [numCol, numRow],\n gridOrigin,\n gridOffset: [gridOffset.xOffset, gridOffset.yOffset],\n colorRange,\n elevationRange,\n colorDomain,\n elevationDomain,\n cellSize: cellSizeMeters,\n coverage,\n material,\n elevationScale,\n extruded\n }, this.getSubLayerProps({\n id: 'gpu-grid-cell'\n }), {\n data: {\n attributes: {\n colors: color.aggregationBuffer,\n elevations: elevation.aggregationBuffer\n }\n },\n colorMaxMinBuffer: color.maxMinBuffer,\n elevationMaxMinBuffer: elevation.maxMinBuffer,\n numInstances: numCol * numRow\n });\n }\n finalizeState(context) {\n const { color, elevation } = this.state.weights;\n [color, elevation].forEach(weight => {\n const { aggregationBuffer, maxMinBuffer } = weight;\n maxMinBuffer?.destroy();\n aggregationBuffer?.destroy();\n });\n super.finalizeState(context);\n }\n // Aggregation Overrides\n updateAggregationState(opts) {\n const { props, oldProps } = opts;\n const { cellSize, coordinateSystem } = props;\n const { viewport } = this.context;\n const cellSizeChanged = oldProps.cellSize !== cellSize;\n const { dimensions } = this.state;\n const positionsChanged = this.isAttributeChanged(POSITION_ATTRIBUTE_NAME);\n // any attribute changed\n const attributesChanged = positionsChanged || this.isAttributeChanged();\n let { boundingBox } = this.state;\n if (positionsChanged) {\n boundingBox = getBoundingBox(this.getAttributes(), this.getNumInstances());\n this.setState({ boundingBox });\n }\n if (positionsChanged || cellSizeChanged) {\n const { gridOffset, translation, width, height, numCol, numRow } = getGridParams(boundingBox, cellSize, viewport, coordinateSystem);\n this.allocateResources(numRow, numCol);\n this.setState({\n gridOffset,\n translation,\n gridOrigin: [-1 * translation[0], -1 * translation[1]],\n width,\n height,\n numCol,\n numRow\n });\n }\n const aggregationDataDirty = attributesChanged ||\n this.isAggregationDirty(opts, {\n dimension: dimensions.data,\n compareAll: true\n });\n if (aggregationDataDirty) {\n this._updateAccessors(opts);\n }\n this.setState({\n aggregationDataDirty\n });\n }\n // Private\n _updateAccessors(opts) {\n const { colorAggregation, elevationAggregation } = opts.props;\n const { color, elevation } = this.state.weights;\n color.operation = AGGREGATION_OPERATION[colorAggregation];\n elevation.operation = AGGREGATION_OPERATION[elevationAggregation];\n }\n}\nGPUGridLayer.layerName = 'GPUGridLayer';\nGPUGridLayer.defaultProps = defaultProps;\nexport default GPUGridLayer;\n", "// Copyright (c) 2015 - 2017 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.\nimport { Layer, fp64LowPart, project32, gouraudLighting, picking } from '@deck.gl/core';\nimport { CubeGeometry } from '@luma.gl/engine';\nimport { fp64arithmetic } from '@luma.gl/shadertools';\nimport { Model } from '@luma.gl/engine';\nimport { GL } from '@luma.gl/constants';\nimport { defaultColorRange, colorRangeToFlatArray } from \"../utils/color-utils.js\";\nimport vs from \"./gpu-grid-cell-layer-vertex.glsl.js\";\nimport fs from \"./gpu-grid-cell-layer-fragment.glsl.js\";\nconst COLOR_DATA_UBO_INDEX = 0;\nconst ELEVATION_DATA_UBO_INDEX = 1;\nconst defaultProps = {\n // color\n colorDomain: null,\n colorRange: defaultColorRange,\n // elevation\n elevationDomain: null,\n elevationRange: [0, 1000],\n elevationScale: { type: 'number', min: 0, value: 1 },\n // grid\n gridSize: { type: 'array', value: [1, 1] },\n gridOrigin: { type: 'array', value: [0, 0] },\n gridOffset: { type: 'array', value: [0, 0] },\n cellSize: { type: 'number', min: 0, max: 1000, value: 1000 },\n offset: { type: 'array', value: [1, 1] },\n coverage: { type: 'number', min: 0, max: 1, value: 1 },\n extruded: true,\n material: true // Use lighting module defaults\n};\nclass GPUGridCellLayer extends Layer {\n getShaders() {\n return super.getShaders({\n vs,\n fs,\n modules: [project32, gouraudLighting, picking, fp64arithmetic]\n });\n }\n initializeState() {\n const attributeManager = this.getAttributeManager();\n attributeManager.addInstanced({\n colors: {\n size: 4,\n noAlloc: true\n },\n elevations: {\n size: 4,\n noAlloc: true\n }\n });\n const model = this._getModel();\n this._setupUniformBuffer(model);\n this.setState({ model });\n }\n _getModel() {\n return new Model(this.context.device, {\n ...this.getShaders(),\n id: this.props.id,\n geometry: new CubeGeometry(),\n isInstanced: true\n });\n }\n draw({ uniforms }) {\n const { cellSize, offset, extruded, elevationScale, coverage, gridSize, gridOrigin, gridOffset, elevationRange, colorMaxMinBuffer, elevationMaxMinBuffer } = this.props;\n const model = this.state.model;\n const gridOriginLow = [fp64LowPart(gridOrigin[0]), fp64LowPart(gridOrigin[1])];\n const gridOffsetLow = [fp64LowPart(gridOffset[0]), fp64LowPart(gridOffset[1])];\n const domainUniforms = this.getDomainUniforms();\n const colorRange = colorRangeToFlatArray(this.props.colorRange);\n this.bindUniformBuffers(colorMaxMinBuffer, elevationMaxMinBuffer);\n model.setUniforms(uniforms);\n model.setUniforms(domainUniforms);\n model.setUniforms({\n cellSize,\n offset,\n extruded,\n elevationScale,\n coverage,\n gridSize,\n gridOrigin,\n gridOriginLow,\n gridOffset,\n gridOffsetLow,\n colorRange,\n elevationRange\n });\n model.draw(this.context.renderPass);\n this.unbindUniformBuffers(colorMaxMinBuffer, elevationMaxMinBuffer);\n }\n bindUniformBuffers(colorMaxMinBuffer, elevationMaxMinBuffer) {\n colorMaxMinBuffer.bind({ target: 35345, index: COLOR_DATA_UBO_INDEX });\n elevationMaxMinBuffer.bind({ target: 35345, index: ELEVATION_DATA_UBO_INDEX });\n }\n unbindUniformBuffers(colorMaxMinBuffer, elevationMaxMinBuffer) {\n colorMaxMinBuffer.unbind({ target: 35345, index: COLOR_DATA_UBO_INDEX });\n elevationMaxMinBuffer.unbind({ target: 35345, index: ELEVATION_DATA_UBO_INDEX });\n }\n getDomainUniforms() {\n const { colorDomain, elevationDomain } = this.props;\n const domainUniforms = {};\n if (colorDomain !== null) {\n domainUniforms.colorDomainValid = true;\n domainUniforms.colorDomain = colorDomain;\n }\n else {\n domainUniforms.colorDomainValid = false;\n }\n if (elevationDomain !== null) {\n domainUniforms.elevationDomainValid = true;\n domainUniforms.elevationDomain = elevationDomain;\n }\n else {\n domainUniforms.elevationDomainValid = false;\n }\n return domainUniforms;\n }\n _setupUniformBuffer(model) {\n // @ts-expect-error TODO v9 This code is not portable to WebGPU\n const programHandle = model.pipeline.handle;\n const gl = this.context.gl;\n const colorIndex = gl.getUniformBlockIndex(programHandle, 'ColorData');\n const elevationIndex = gl.getUniformBlockIndex(programHandle, 'ElevationData');\n gl.uniformBlockBinding(programHandle, colorIndex, COLOR_DATA_UBO_INDEX);\n gl.uniformBlockBinding(programHandle, elevationIndex, ELEVATION_DATA_UBO_INDEX);\n }\n}\nGPUGridCellLayer.layerName = 'GPUGridCellLayer';\nGPUGridCellLayer.defaultProps = defaultProps;\nexport default GPUGridCellLayer;\n", "// Copyright (c) 2015 - 2017 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// Inspired by screen-grid-layer vertex shader in deck.gl\nexport default `\\\n#version 300 es\n#define SHADER_NAME gpu-grid-cell-layer-vertex-shader\n#define RANGE_COUNT 6\nin vec3 positions;\nin vec3 normals;\nin vec4 colors;\nin vec4 elevations;\nin vec3 instancePickingColors;\nuniform vec2 offset;\nuniform bool extruded;\nuniform float cellSize;\nuniform float coverage;\nuniform float opacity;\nuniform float elevationScale;\nuniform ivec2 gridSize;\nuniform vec2 gridOrigin;\nuniform vec2 gridOriginLow;\nuniform vec2 gridOffset;\nuniform vec2 gridOffsetLow;\nuniform vec4 colorRange[RANGE_COUNT];\nuniform vec2 elevationRange;\nuniform vec2 colorDomain;\nuniform bool colorDomainValid;\nuniform vec2 elevationDomain;\nuniform bool elevationDomainValid;\nlayout(std140) uniform;\nuniform ColorData\n{\nvec4 maxMinCount;\n} colorData;\nuniform ElevationData\n{\nvec4 maxMinCount;\n} elevationData;\n#define EPSILON 0.00001\nout vec4 vColor;\nvec4 quantizeScale(vec2 domain, vec4 range[RANGE_COUNT], float value) {\nvec4 outColor = vec4(0., 0., 0., 0.);\nif (value >= (domain.x - EPSILON) && value <= (domain.y + EPSILON)) {\nfloat domainRange = domain.y - domain.x;\nif (domainRange <= 0.) {\noutColor = colorRange[0];\n} else {\nfloat rangeCount = float(RANGE_COUNT);\nfloat rangeStep = domainRange / rangeCount;\nfloat idx = floor((value - domain.x) / rangeStep);\nidx = clamp(idx, 0., rangeCount - 1.);\nint intIdx = int(idx);\noutColor = colorRange[intIdx];\n}\n}\nreturn outColor;\n}\nfloat linearScale(vec2 domain, vec2 range, float value) {\nif (value >= (domain.x - EPSILON) && value <= (domain.y + EPSILON)) {\nreturn ((value - domain.x) / (domain.y - domain.x)) * (range.y - range.x) + range.x;\n}\nreturn -1.;\n}\nvoid main(void) {\nvec2 clrDomain = colorDomainValid ? colorDomain : vec2(colorData.maxMinCount.a, colorData.maxMinCount.r);\nvec4 color = quantizeScale(clrDomain, colorRange, colors.r);\nfloat elevation = 0.0;\nif (extruded) {\nvec2 elvDomain = elevationDomainValid ? elevationDomain : vec2(elevationData.maxMinCount.a, elevationData.maxMinCount.r);\nelevation = linearScale(elvDomain, elevationRange, elevations.r);\nelevation = elevation * (positions.z + 1.0) / 2.0 * elevationScale;\n}\nfloat shouldRender = float(color.r > 0.0 && elevations.r >= 0.0);\nfloat dotRadius = cellSize / 2. * coverage * shouldRender;\nint yIndex = (gl_InstanceID / gridSize[0]);\nint xIndex = gl_InstanceID - (yIndex * gridSize[0]);\nvec2 instancePositionXFP64 = mul_fp64(vec2(gridOffset[0], gridOffsetLow[0]), vec2(float(xIndex), 0.));\ninstancePositionXFP64 = sum_fp64(instancePositionXFP64, vec2(gridOrigin[0], gridOriginLow[0]));\nvec2 instancePositionYFP64 = mul_fp64(vec2(gridOffset[1], gridOffsetLow[1]), vec2(float(yIndex), 0.));\ninstancePositionYFP64 = sum_fp64(instancePositionYFP64, vec2(gridOrigin[1], gridOriginLow[1]));\nvec3 centroidPosition = vec3(instancePositionXFP64[0], instancePositionYFP64[0], elevation);\nvec3 centroidPosition64Low = vec3(instancePositionXFP64[1], instancePositionYFP64[1], 0.0);\ngeometry.worldPosition = centroidPosition;\nvec3 pos = vec3(project_size(positions.xy + offset) * dotRadius, 0.);\npicking_setPickingColor(instancePickingColors);\ngl_Position = project_position_to_clipspace(centroidPosition, centroidPosition64Low, pos, geometry.position);\nvec3 normals_commonspace = project_normal(normals);\nif (extruded) {\nvec3 lightColor = lighting_getLightColor(color.rgb, project_uCameraPosition, geometry.position.xyz, normals_commonspace);\nvColor = vec4(lightColor, color.a * opacity) / 255.;\n} else {\nvColor = vec4(color.rgb, color.a * opacity) / 255.;\n}\n}\n`;\n", "// Copyright (c) 2015 - 2017 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.\nexport default `\\\n#version 300 es\n#define SHADER_NAME gpu-grid-cell-layer-fragment-shader\nprecision highp float;\nin vec4 vColor;\nout vec4 fragColor;\nvoid main(void) {\nfragColor = vColor;\nfragColor = picking_filterColor(fragColor);\n}\n`;\n", "export function getBounds(points) {\n // Now build bounding box in world space (aligned to world coordiante system)\n const x = points.map(p => p[0]);\n const y = points.map(p => p[1]);\n const xMin = Math.min.apply(null, x);\n const xMax = Math.max.apply(null, x);\n const yMin = Math.min.apply(null, y);\n const yMax = Math.max.apply(null, y);\n return [xMin, yMin, xMax, yMax];\n}\n// true if currentBounds contains targetBounds, false otherwise\nexport function boundsContain(currentBounds, targetBounds) {\n if (targetBounds[0] >= currentBounds[0] &&\n targetBounds[2] <= currentBounds[2] &&\n targetBounds[1] >= currentBounds[1] &&\n targetBounds[3] <= currentBounds[3]) {\n return true;\n }\n return false;\n}\nconst scratchArray = new Float32Array(12);\n// For given rectangle bounds generates two triangles vertices that coverit completely\nexport function packVertices(points, dimensions = 2) {\n let index = 0;\n for (const point of points) {\n for (let i = 0; i < dimensions; i++) {\n scratchArray[index++] = point[i] || 0;\n }\n }\n return scratchArray;\n}\n// Expands boundingBox:[xMin, yMin, xMax, yMax] to match aspect ratio of given width and height\nexport function scaleToAspectRatio(boundingBox, width, height) {\n const [xMin, yMin, xMax, yMax] = boundingBox;\n const currentWidth = xMax - xMin;\n const currentHeight = yMax - yMin;\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n if (currentWidth / currentHeight < width / height) {\n // expand bounding box width\n newWidth = (width / height) * currentHeight;\n }\n else {\n newHeight = (height / width) * currentWidth;\n }\n if (newWidth < width) {\n newWidth = width;\n newHeight = height;\n }\n const xCenter = (xMax + xMin) / 2;\n const yCenter = (yMax + yMin) / 2;\n return [\n xCenter - newWidth / 2,\n yCenter - newHeight / 2,\n xCenter + newWidth / 2,\n yCenter + newHeight / 2\n ];\n}\n// Get texture coordiante of point inside a bounding box\nexport function getTextureCoordinates(point, bounds) {\n const [xMin, yMin, xMax, yMax] = bounds;\n return [(point[0] - xMin) / (xMax - xMin), (point[1] - yMin) / (yMax - yMin)];\n}\n", "// 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/* global setTimeout clearTimeout */\nimport { getBounds, boundsContain, packVertices, scaleToAspectRatio, getTextureCoordinates } from \"./heatmap-layer-utils.js\";\nimport { TextureTransform } from '@luma.gl/engine';\nimport { AttributeManager, COORDINATE_SYSTEM, log } from '@deck.gl/core';\nimport TriangleLayer from \"./triangle-layer.js\";\nimport AggregationLayer from \"../aggregation-layer.js\";\nimport { defaultColorRange, colorRangeToFlatArray } from \"../utils/color-utils.js\";\nimport weightsVs from \"./weights-vs.glsl.js\";\nimport weightsFs from \"./weights-fs.glsl.js\";\nimport maxVs from \"./max-vs.glsl.js\";\nimport maxFs from \"./max-fs.glsl.js\";\nconst RESOLUTION = 2; // (number of common space pixels) / (number texels)\nconst TEXTURE_PROPS = {\n format: 'rgba8unorm',\n mipmaps: false,\n sampler: {\n minFilter: 'linear',\n magFilter: 'linear',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge'\n }\n};\nconst DEFAULT_COLOR_DOMAIN = [0, 0];\nconst AGGREGATION_MODE = {\n SUM: 0,\n MEAN: 1\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};\nconst FLOAT_TARGET_FEATURES = [\n 'float32-renderable-webgl', // ability to render to float texture\n 'texture-blend-float-webgl' // ability to blend when rendering to float texture\n];\nconst DIMENSIONS = {\n data: {\n props: ['radiusPixels']\n }\n};\n/** Visualizes the spatial distribution of data. */\nclass HeatmapLayer extends AggregationLayer {\n initializeState() {\n super.initializeAggregationLayer(DIMENSIONS);\n this.setState({ colorDomain: DEFAULT_COLOR_DOMAIN });\n this._setupTextureParams();\n this._setupAttributes();\n this._setupResources();\n }\n shouldUpdateState({ changeFlags }) {\n // Need to be updated when viewport changes\n return changeFlags.somethingChanged;\n }\n /* eslint-disable max-statements,complexity */\n updateState(opts) {\n super.updateState(opts);\n this._updateHeatmapState(opts);\n }\n _updateHeatmapState(opts) {\n const { props, oldProps } = opts;\n const changeFlags = this._getChangeFlags(opts);\n if (changeFlags.dataChanged || changeFlags.viewportChanged) {\n // if data is changed, do not debounce and immediately update the weight map\n changeFlags.boundsChanged = this._updateBounds(changeFlags.dataChanged);\n this._updateTextureRenderingBounds();\n }\n if (changeFlags.dataChanged || changeFlags.boundsChanged) {\n // Update weight map immediately\n clearTimeout(this.state.updateTimer);\n this.setState({ isWeightMapDirty: true });\n }\n else if (changeFlags.viewportZoomChanged) {\n // Update weight map when zoom stops\n this._debouncedUpdateWeightmap();\n }\n if (props.colorRange !== oldProps.colorRange) {\n this._updateColorTexture(opts);\n }\n if (this.state.isWeightMapDirty) {\n this._updateWeightmap();\n }\n this.setState({ zoom: opts.context.viewport.zoom });\n }\n renderLayers() {\n const { weightsTexture, triPositionBuffer, triTexCoordBuffer, maxWeightsTexture, colorTexture, colorDomain } = this.state;\n const { updateTriggers, intensity, threshold, aggregation } = this.props;\n const TriangleLayerClass = this.getSubLayerClass('triangle', TriangleLayer);\n return new TriangleLayerClass(this.getSubLayerProps({\n id: 'triangle-layer',\n updateTriggers\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 weightsTexture,\n intensity,\n threshold,\n colorDomain\n });\n }\n finalizeState(context) {\n super.finalizeState(context);\n const { weightsTransform, weightsTexture, maxWeightTransform, maxWeightsTexture, triPositionBuffer, triTexCoordBuffer, colorTexture, updateTimer } = this.state;\n weightsTransform?.destroy();\n weightsTexture?.destroy();\n maxWeightTransform?.destroy();\n maxWeightsTexture?.destroy();\n triPositionBuffer?.destroy();\n triTexCoordBuffer?.destroy();\n colorTexture?.destroy();\n if (updateTimer) {\n clearTimeout(updateTimer);\n }\n }\n // PRIVATE\n // override Composite layer private method to create AttributeManager instance\n _getAttributeManager() {\n return new AttributeManager(this.context.device, {\n id: this.props.id,\n stats: this.context.stats\n });\n }\n _getChangeFlags(opts) {\n const changeFlags = {};\n const { dimensions } = this.state;\n changeFlags.dataChanged =\n (this.isAttributeChanged() && 'attribute changed') || // if any attribute is changed\n (this.isAggregationDirty(opts, {\n compareAll: true,\n dimension: dimensions.data\n }) &&\n 'aggregation is dirty');\n changeFlags.viewportChanged = opts.changeFlags.viewportChanged;\n const { zoom } = this.state;\n if (!opts.context.viewport || opts.context.viewport.zoom !== zoom) {\n changeFlags.viewportZoomChanged = true;\n }\n return changeFlags;\n }\n _createTextures() {\n const { textureSize, format } = this.state;\n this.setState({\n weightsTexture: this.context.device.createTexture({\n ...TEXTURE_PROPS,\n width: textureSize,\n height: textureSize,\n format\n }),\n maxWeightsTexture: this.context.device.createTexture({\n ...TEXTURE_PROPS,\n width: 1,\n height: 1,\n format\n })\n });\n }\n _setupAttributes() {\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: { size: 3, type: 'float64', accessor: 'getPosition' },\n weights: { size: 1, accessor: 'getWeight' }\n });\n this.setState({ positionAttributeName: 'positions' });\n }\n _setupTextureParams() {\n const { device } = this.context;\n const { weightsTextureSize } = this.props;\n const textureSize = Math.min(weightsTextureSize, device.limits.maxTextureDimension2D);\n const floatTargetSupport = FLOAT_TARGET_FEATURES.every(feature => device.features.has(feature));\n const format = floatTargetSupport ? 'rgba32float' : 'rgba8unorm';\n const weightsScale = floatTargetSupport ? 1 : 1 / 255;\n this.setState({ textureSize, format, weightsScale });\n if (!floatTargetSupport) {\n log.warn(`HeatmapLayer: ${this.id} rendering to float texture not supported, falling back to low precision format`)();\n }\n }\n _createWeightsTransform(shaders) {\n let { weightsTransform } = this.state;\n const { weightsTexture } = this.state;\n const attributeManager = this.getAttributeManager();\n weightsTransform?.destroy();\n weightsTransform = new TextureTransform(this.context.device, {\n id: `${this.id}-weights-transform`,\n bufferLayout: attributeManager.getBufferLayouts(),\n vertexCount: 1,\n targetTexture: weightsTexture,\n parameters: {\n depthWriteEnabled: false,\n blendColorOperation: 'add',\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one'\n },\n topology: 'point-list',\n ...shaders\n });\n this.setState({ weightsTransform });\n }\n _setupResources() {\n this._createTextures();\n const { device } = this.context;\n const { textureSize, weightsTexture, maxWeightsTexture } = this.state;\n const weightsTransformShaders = this.getShaders({\n vs: weightsVs,\n fs: weightsFs\n });\n this._createWeightsTransform(weightsTransformShaders);\n const maxWeightsTransformShaders = this.getShaders({ vs: maxVs, fs: maxFs });\n const maxWeightTransform = new TextureTransform(device, {\n id: `${this.id}-max-weights-transform`,\n bindings: { inTexture: weightsTexture },\n uniforms: { textureSize },\n targetTexture: maxWeightsTexture,\n ...maxWeightsTransformShaders,\n vertexCount: textureSize * textureSize,\n topology: 'point-list',\n parameters: {\n depthWriteEnabled: false,\n blendColorOperation: 'max',\n blendAlphaOperation: 'max',\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one'\n }\n });\n this.setState({\n weightsTexture,\n maxWeightsTexture,\n maxWeightTransform,\n zoom: null,\n triPositionBuffer: device.createBuffer({ byteLength: 48 }),\n triTexCoordBuffer: device.createBuffer({ byteLength: 48 })\n });\n }\n // overwrite super class method to update transform model\n updateShaders(shaderOptions) {\n // shader params (modules, injects) changed, update model object\n this._createWeightsTransform({\n vs: weightsVs,\n fs: weightsFs,\n ...shaderOptions\n });\n }\n _updateMaxWeightValue() {\n const { maxWeightTransform } = this.state;\n maxWeightTransform.run({\n parameters: { viewport: [0, 0, 1, 1] },\n clearColor: [0, 0, 0, 0]\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 // 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 // #1: get world bounds for current viewport extends\n const visibleWorldBounds = getBounds(viewportCorners); // TODO: Change to visible bounds\n const newState = { visibleWorldBounds, viewportCorners };\n let boundsChanged = false;\n if (forceUpdate ||\n !this.state.worldBounds ||\n !boundsContain(this.state.worldBounds, visibleWorldBounds)) {\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 // #4 :convert aligned common bounds to world bounds\n const worldBounds = this._commonToWorldBounds(scaledCommonBounds);\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 // #5: now convert world bounds to common using Layer's coordiante system and origin\n const normalizedCommonBounds = this._worldToCommonBounds(worldBounds);\n newState.worldBounds = worldBounds;\n newState.normalizedCommonBounds = normalizedCommonBounds;\n boundsChanged = true;\n }\n this.setState(newState);\n return boundsChanged;\n }\n _updateTextureRenderingBounds() {\n // Just render visible portion of the texture\n const { triPositionBuffer, triTexCoordBuffer, normalizedCommonBounds, viewportCorners } = this.state;\n const { viewport } = this.context;\n triPositionBuffer.write(packVertices(viewportCorners, 3));\n const textureBounds = viewportCorners.map(p => getTextureCoordinates(viewport.projectPosition(p), normalizedCommonBounds));\n triTexCoordBuffer.write(packVertices(textureBounds, 2));\n }\n _updateColorTexture(opts) {\n const { colorRange } = opts.props;\n let { colorTexture } = this.state;\n const colors = colorRangeToFlatArray(colorRange, false, Uint8Array);\n if (colorTexture && colorTexture?.width === colorRange.length) {\n // TODO(v9): Unclear whether `setSubImageData` is a public API, or what to use if not.\n colorTexture.setSubImageData({ data: colors });\n }\n else {\n colorTexture?.destroy();\n colorTexture = this.context.device.createTexture({\n ...TEXTURE_PROPS,\n data: colors,\n width: colorRange.length,\n height: 1\n });\n }\n this.setState({ colorTexture });\n }\n _updateWeightmap() {\n const { radiusPixels, colorDomain, aggregation } = this.props;\n const { worldBounds, textureSize, weightsScale } = this.state;\n const weightsTransform = this.state.weightsTransform;\n this.state.isWeightMapDirty = false;\n // convert world bounds to common using Layer's coordiante system and origin\n const commonBounds = this._worldToCommonBounds(worldBounds, {\n useLayerCoordinateSystem: true\n });\n if (colorDomain && aggregation === 'SUM') {\n // scale color domain to weight per pixel\n const { viewport } = this.context;\n const metersPerPixel = (viewport.distanceScales.metersPerUnit[2] * (commonBounds[2] - commonBounds[0])) /\n textureSize;\n this.state.colorDomain = colorDomain.map(x => x * metersPerPixel * weightsScale);\n }\n else {\n this.state.colorDomain = colorDomain || DEFAULT_COLOR_DOMAIN;\n }\n const attributeManager = this.getAttributeManager();\n const attributes = attributeManager.getAttributes();\n const moduleSettings = this.getModuleSettings();\n const uniforms = { radiusPixels, commonBounds, textureWidth: textureSize, weightsScale };\n this._setModelAttributes(weightsTransform.model, attributes);\n weightsTransform.model.setVertexCount(this.getNumInstances());\n weightsTransform.model.setUniforms(uniforms);\n weightsTransform.model.updateModuleSettings(moduleSettings);\n weightsTransform.run({\n parameters: { viewport: [0, 0, textureSize, textureSize] },\n clearColor: [0, 0, 0, 0]\n });\n this._updateMaxWeightValue();\n }\n _debouncedUpdateWeightmap(fromTimer = false) {\n let { updateTimer } = this.state;\n const { debounceTimeout } = this.props;\n if (fromTimer) {\n updateTimer = null;\n // update\n this._updateBounds(true);\n this._updateTextureRenderingBounds();\n this.setState({ isWeightMapDirty: true });\n }\n else {\n this.setState({ isWeightMapDirty: false });\n clearTimeout(updateTimer);\n updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true), debounceTimeout);\n }\n this.setState({ updateTimer });\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 const offsetMode = 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 let bottomLeftCommon;\n let topRightCommon;\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 }\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 bottomLeftCommon[0] - offsetOriginCommon[0],\n bottomLeftCommon[1] - offsetOriginCommon[1],\n topRightCommon[0] - offsetOriginCommon[0],\n topRightCommon[1] - offsetOriginCommon[1]\n ], size, size);\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 return bottomLeftWorld.slice(0, 2).concat(topRightWorld.slice(0, 2));\n }\n}\nHeatmapLayer.layerName = 'HeatmapLayer';\nHeatmapLayer.defaultProps = defaultProps;\nexport default HeatmapLayer;\n", "// 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.\nimport { Model } from '@luma.gl/engine';\nimport { Layer, project32 } from '@deck.gl/core';\nimport vs from \"./triangle-layer-vertex.glsl.js\";\nimport fs from \"./triangle-layer-fragment.glsl.js\";\nclass TriangleLayer extends Layer {\n getShaders() {\n return { vs, fs, modules: [project32] };\n }\n initializeState({ device }) {\n this.setState({ model: this._getModel(device) });\n }\n _getModel(device) {\n const { vertexCount, data, weightsTexture, maxTexture, colorTexture } = this.props;\n return new Model(device, {\n ...this.getShaders(),\n id: this.props.id,\n bindings: { weightsTexture, maxTexture, colorTexture },\n attributes: data.attributes,\n bufferLayout: [\n { name: 'positions', format: 'float32x3' },\n { name: 'texCoords', format: 'float32x2' }\n ],\n topology: 'triangle-fan-webgl',\n vertexCount\n });\n }\n draw({ uniforms }) {\n const { model } = this.state;\n const { intensity, threshold, aggregationMode, colorDomain } = this.props;\n model.setUniforms({\n ...uniforms,\n intensity,\n threshold,\n aggregationMode,\n colorDomain\n });\n model.draw(this.context.renderPass);\n }\n}\nTriangleLayer.layerName = 'TriangleLayer';\nexport default TriangleLayer;\n", "// Copyright (c) 2015 - 2017 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// Inspired by screen-grid-layer vertex shader in deck.gl\nexport default `\\\n#version 300 es\n#define SHADER_NAME heatp-map-layer-vertex-shader\nuniform sampler2D maxTexture;\nuniform float intensity;\nuniform vec2 colorDomain;\nuniform float threshold;\nuniform float aggregationMode;\nin vec3 positions;\nin vec2 texCoords;\nout vec2 vTexCoords;\nout float vIntensityMin;\nout float vIntensityMax;\nvoid main(void) {\ngl_Position = project_position_to_clipspace(positions, vec3(0.0), vec3(0.0));\nvTexCoords = texCoords;\nvec4 maxTexture = texture(maxTexture, vec2(0.5));\nfloat maxValue = aggregationMode < 0.5 ? maxTexture.r : maxTexture.g;\nfloat minValue = maxValue * threshold;\nif (colorDomain[1] > 0.) {\nmaxValue = colorDomain[1];\nminValue = colorDomain[0];\n}\nvIntensityMax = intensity / maxValue;\nvIntensityMin = intensity / minValue;\n}\n`;\n", "// Copyright (c) 2015 - 2017 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.\nexport default `\\\n#version 300 es\n#define SHADER_NAME triangle-layer-fragment-shader\nprecision highp float;\nuniform float opacity;\nuniform sampler2D weightsTexture;\nuniform sampler2D colorTexture;\nuniform float aggregationMode;\nin vec2 vTexCoords;\nin float vIntensityMin;\nin float vIntensityMax;\nout vec4 fragColor;\nvec4 getLinearColor(float value) {\nfloat factor = clamp(value * vIntensityMax, 0., 1.);\nvec4 color = texture(colorTexture, vec2(factor, 0.5));\ncolor.a *= min(value * vIntensityMin, 1.0);\nreturn color;\n}\nvoid main(void) {\nvec4 weights = texture(weightsTexture, vTexCoords);\nfloat weight = weights.r;\nif (aggregationMode > 0.5) {\nweight /= max(1.0, weights.a);\n}\nif (weight <= 0.) {\ndiscard;\n}\nvec4 linearColor = getLinearColor(weight);\nlinearColor.a *= opacity;\nfragColor = linearColor;\n}\n`;\n", "export default `\\\n#version 300 es\nin vec3 positions;\nin vec3 positions64Low;\nin float weights;\nout vec4 weightsTexture;\nuniform float radiusPixels;\nuniform float textureWidth;\nuniform vec4 commonBounds;\nuniform float weightsScale;\nvoid main()\n{\nweightsTexture = vec4(weights * weightsScale, 0., 0., 1.);\nfloat radiusTexels = project_pixel_size(radiusPixels) * textureWidth / (commonBounds.z - commonBounds.x);\ngl_PointSize = radiusTexels * 2.;\nvec3 commonPosition = project_position(positions, positions64Low);\ngl_Position.xy = (commonPosition.xy - commonBounds.xy) / (commonBounds.zw - commonBounds.xy) ;\ngl_Position.xy = (gl_Position.xy * 2.) - (1.);\ngl_Position.w = 1.0;\n}\n`;\n", "export default `\\\n#version 300 es\nin vec4 weightsTexture;\nout vec4 fragColor;\nfloat gaussianKDE(float u){\nreturn pow(2.71828, -u*u/0.05555)/(1.77245385*0.166666);\n}\nvoid main()\n{\nfloat dist = length(gl_PointCoord - vec2(0.5, 0.5));\nif (dist > 0.5) {\ndiscard;\n}\nfragColor = weightsTexture * gaussianKDE(2. * dist);\nDECKGL_FILTER_COLOR(fragColor, geometry);\n}\n`;\n", "export default `\\\n#version 300 es\nuniform sampler2D inTexture;\nuniform float textureSize;\nout vec4 outTexture;\nvoid main()\n{\nint yIndex = gl_VertexID / int(textureSize);\nint xIndex = gl_VertexID - (yIndex * int(textureSize));\nvec2 uv = (0.5 + vec2(float(xIndex), float(yIndex))) / textureSize;\noutTexture = texture(inTexture, uv);\ngl_Position = vec4(0.0, 0.0, 0.0, 1.0);\ngl_PointSize = 1.0;\n}\n`;\n", "export default `\\\n#version 300 es\nin vec4 outTexture;\nout vec4 fragColor;\nvoid main() {\nfragColor = outTexture;\nfragColor.g = outTexture.r / max(1.0, outTexture.a);\n}\n`;\n"],
5
- "mappings": "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",
6
- "names": ["import_core", "import_constants", "REQUIRED_FEATURES", "mergeShaders", "import_engine", "import_core", "import_constants", "import_core", "import_core", "compareProps", "import_core", "MAX_32_BIT_FLOAT", "ascending", "defaultProps", "import_core", "import_core", "defaultProps", "defaultProps", "import_core", "import_layers", "import_core", "nop", "defaultProps", "import_layers", "import_core", "threshold", "threshold", "import_core", "defaultProps", "POSITION_ATTRIBUTE_NAME", "DIMENSIONS", "import_core", "import_constants", "import_core", "import_core", "import_engine", "import_shadertools", "import_constants", "defaultProps", "defaultProps", "DIMENSIONS", "POSITION_ATTRIBUTE_NAME", "defaultProps", "import_engine", "import_core", "import_engine", "import_core", "threshold", "defaultProps", "DIMENSIONS", "threshold"]
3
+ "sources": ["index.js", "screen-grid-layer/screen-grid-layer.js", "common/aggregator/cpu-aggregator/cpu-aggregator.js", "common/aggregator/cpu-aggregator/sort-bins.js", "common/aggregator/cpu-aggregator/aggregate.js", "common/aggregator/cpu-aggregator/vertex-accessor.js", "common/aggregator/gpu-aggregator/webgl-bin-sorter.js", "common/aggregator/gpu-aggregator/utils.js", "common/aggregator/gpu-aggregator/bin-sorter-uniforms.js", "common/aggregator/gpu-aggregator/webgl-aggregation-transform.js", "common/aggregator/gpu-aggregator/aggregation-transform-uniforms.js", "common/aggregator/gpu-aggregator/webgl-aggregator.js", "common/aggregation-layer.js", "screen-grid-layer/screen-grid-cell-layer.js", "common/utils/color-utils.js", "screen-grid-layer/screen-grid-layer-vertex.glsl.js", "screen-grid-layer/screen-grid-layer-fragment.glsl.js", "screen-grid-layer/screen-grid-layer-uniforms.js", "screen-grid-layer/bin-options-uniforms.js", "hexagon-layer/hexagon-layer.js", "common/utils/scale-utils.js", "common/utils/bounds-utils.js", "hexagon-layer/hexagon-cell-layer.js", "hexagon-layer/hexbin.js", "hexagon-layer/hexagon-cell-layer-vertex.glsl.js", "hexagon-layer/hexagon-layer-uniforms.js", "hexagon-layer/bin-options-uniforms.js", "contour-layer/contour-layer.js", "contour-layer/marching-squares-codes.js", "contour-layer/marching-squares.js", "contour-layer/contour-utils.js", "contour-layer/value-reader.js", "contour-layer/bin-options-uniforms.js", "grid-layer/grid-layer.js", "grid-layer/grid-cell-layer.js", "grid-layer/grid-cell-layer-vertex.glsl.js", "grid-layer/grid-layer-uniforms.js", "grid-layer/bin-options-uniforms.js", "heatmap-layer/heatmap-layer-utils.js", "heatmap-layer/heatmap-layer.js", "heatmap-layer/triangle-layer.js", "heatmap-layer/triangle-layer-vertex.glsl.js", "heatmap-layer/triangle-layer-fragment.glsl.js", "heatmap-layer/triangle-layer-uniforms.js", "heatmap-layer/aggregation-layer.js", "common/utils/prop-utils.js", "heatmap-layer/weights-vs.glsl.js", "heatmap-layer/weights-fs.glsl.js", "heatmap-layer/max-vs.glsl.js", "heatmap-layer/max-fs.glsl.js", "heatmap-layer/heatmap-layer-uniforms.js"],
4
+ "sourcesContent": ["// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport { default as ScreenGridLayer } from \"./screen-grid-layer/screen-grid-layer.js\";\nexport { default as HexagonLayer } from \"./hexagon-layer/hexagon-layer.js\";\nexport { default as ContourLayer } from \"./contour-layer/contour-layer.js\";\nexport { default as GridLayer } from \"./grid-layer/grid-layer.js\";\nexport { default as HeatmapLayer } from \"./heatmap-layer/heatmap-layer.js\";\nexport { default as _AggregationLayer } from \"./common/aggregation-layer.js\";\nexport { WebGLAggregator, CPUAggregator } from \"./common/aggregator/index.js\";\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { project32 } from '@deck.gl/core';\nimport { WebGLAggregator, CPUAggregator } from \"../common/aggregator/index.js\";\nimport AggregationLayer from \"../common/aggregation-layer.js\";\nimport ScreenGridCellLayer from \"./screen-grid-cell-layer.js\";\nimport { binOptionsUniforms } from \"./bin-options-uniforms.js\";\nimport { defaultColorRange } from \"../common/utils/color-utils.js\";\nconst defaultProps = {\n cellSizePixels: { type: 'number', value: 100, min: 1 },\n cellMarginPixels: { type: 'number', value: 2, min: 0 },\n colorRange: defaultColorRange,\n colorScaleType: 'linear',\n getPosition: { type: 'accessor', value: (d) => d.position },\n getWeight: { type: 'accessor', value: 1 },\n gpuAggregation: false,\n aggregation: 'SUM'\n};\n/** Aggregates data into histogram bins and renders them as a grid. */\nclass ScreenGridLayer extends AggregationLayer {\n getAggregatorType() {\n return this.props.gpuAggregation && WebGLAggregator.isSupported(this.context.device)\n ? 'gpu'\n : 'cpu';\n }\n createAggregator(type) {\n if (type === 'cpu' || !WebGLAggregator.isSupported(this.context.device)) {\n return new CPUAggregator({\n dimensions: 2,\n getBin: {\n sources: ['positions'],\n getValue: ({ positions }, index, opts) => {\n const viewport = this.context.viewport;\n const p = viewport.project(positions);\n const cellSizePixels = opts.cellSizePixels;\n if (p[0] < 0 || p[0] >= viewport.width || p[1] < 0 || p[1] >= viewport.height) {\n // Not on screen\n return null;\n }\n return [Math.floor(p[0] / cellSizePixels), Math.floor(p[1] / cellSizePixels)];\n }\n },\n getValue: [{ sources: ['counts'], getValue: ({ counts }) => counts }]\n });\n }\n return new WebGLAggregator(this.context.device, {\n dimensions: 2,\n channelCount: 1,\n bufferLayout: this.getAttributeManager().getBufferLayouts({ isInstanced: false }),\n ...super.getShaders({\n modules: [project32, binOptionsUniforms],\n vs: `\n in vec3 positions;\n in vec3 positions64Low;\n in float counts;\n \n void getBin(out ivec2 binId) {\n vec4 pos = project_position_to_clipspace(positions, positions64Low, vec3(0.0));\n vec2 screenCoords = vec2(pos.x / pos.w + 1.0, 1.0 - pos.y / pos.w) / 2.0 * project.viewportSize / project.devicePixelRatio;\n vec2 gridCoords = floor(screenCoords / binOptions.cellSizePixels);\n binId = ivec2(gridCoords);\n }\n void getValue(out float weight) {\n weight = counts;\n }\n `\n })\n });\n }\n initializeState() {\n super.initializeState();\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: {\n size: 3,\n accessor: 'getPosition',\n type: 'float64',\n fp64: this.use64bitPositions()\n },\n // this attribute is used in gpu aggregation path only\n counts: { size: 1, accessor: 'getWeight' }\n });\n }\n shouldUpdateState({ changeFlags }) {\n return changeFlags.somethingChanged;\n }\n updateState(params) {\n const aggregatorChanged = super.updateState(params);\n const { props, oldProps, changeFlags } = params;\n const { cellSizePixels, aggregation } = props;\n if (aggregatorChanged ||\n changeFlags.dataChanged ||\n changeFlags.updateTriggersChanged ||\n changeFlags.viewportChanged ||\n aggregation !== oldProps.aggregation ||\n cellSizePixels !== oldProps.cellSizePixels) {\n const { width, height } = this.context.viewport;\n const { aggregator } = this.state;\n if (aggregator instanceof WebGLAggregator) {\n aggregator.setProps({\n binIdRange: [\n [0, Math.ceil(width / cellSizePixels)],\n [0, Math.ceil(height / cellSizePixels)]\n ]\n });\n }\n aggregator.setProps({\n pointCount: this.getNumInstances(),\n operations: [aggregation],\n binOptions: {\n cellSizePixels\n }\n });\n }\n if (changeFlags.viewportChanged) {\n // Rerun aggregation on viewport change\n this.state.aggregator.setNeedsUpdate();\n }\n return aggregatorChanged;\n }\n onAttributeChange(id) {\n const { aggregator } = this.state;\n switch (id) {\n case 'positions':\n aggregator.setNeedsUpdate();\n break;\n case 'counts':\n aggregator.setNeedsUpdate(0);\n break;\n default:\n // This should not happen\n }\n }\n renderLayers() {\n const { aggregator } = this.state;\n const CellLayerClass = this.getSubLayerClass('cells', ScreenGridCellLayer);\n const binAttribute = aggregator.getBins();\n const weightAttribute = aggregator.getResult(0);\n return new CellLayerClass(this.props, this.getSubLayerProps({\n id: 'cell-layer'\n }), {\n data: {\n length: aggregator.binCount,\n attributes: {\n getBin: binAttribute,\n getWeight: weightAttribute\n }\n },\n // Data has changed shallowly, but we likely don't need to update the attributes\n dataComparator: (data, oldData) => data.length === oldData.length,\n updateTriggers: {\n getBin: [binAttribute],\n getWeight: [weightAttribute]\n },\n parameters: {\n depthWriteEnabled: false,\n ...this.props.parameters\n },\n // Evaluate domain at draw() time\n colorDomain: () => this.props.colorDomain || aggregator.getResultDomain(0),\n // Extensions are already handled by the GPUAggregator, do not pass it down\n extensions: []\n });\n }\n getPickingInfo(params) {\n const info = params.info;\n const { index } = info;\n if (index >= 0) {\n const bin = this.state.aggregator.getBin(index);\n let object;\n if (bin) {\n object = {\n col: bin.id[0],\n row: bin.id[1],\n value: bin.value[0],\n count: bin.count\n };\n if (bin.pointIndices) {\n object.pointIndices = bin.pointIndices;\n object.points = Array.isArray(this.props.data)\n ? bin.pointIndices.map(i => this.props.data[i])\n : [];\n }\n }\n info.object = object;\n }\n return info;\n }\n}\nScreenGridLayer.layerName = 'ScreenGridLayer';\nScreenGridLayer.defaultProps = defaultProps;\nexport default ScreenGridLayer;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { _deepEqual as deepEqual } from '@deck.gl/core';\nimport { sortBins, packBinIds } from \"./sort-bins.js\";\nimport { aggregate, BUILT_IN_OPERATIONS } from \"./aggregate.js\";\nimport { evaluateVertexAccessor } from \"./vertex-accessor.js\";\n/** An Aggregator implementation that calculates aggregation on the CPU */\nexport class CPUAggregator {\n constructor(props) {\n this.bins = [];\n this.binIds = null;\n this.results = [];\n this.dimensions = props.dimensions;\n this.channelCount = props.getValue.length;\n this.props = {\n ...props,\n binOptions: {},\n pointCount: 0,\n operations: [],\n customOperations: [],\n attributes: {}\n };\n this.needsUpdate = true;\n this.setProps(props);\n }\n destroy() { }\n get binCount() {\n return this.bins.length;\n }\n /** Update aggregation props */\n setProps(props) {\n const oldProps = this.props;\n if (props.binOptions) {\n if (!deepEqual(props.binOptions, oldProps.binOptions, 2)) {\n this.setNeedsUpdate();\n }\n }\n if (props.operations) {\n for (let channel = 0; channel < this.channelCount; channel++) {\n if (props.operations[channel] !== oldProps.operations[channel]) {\n this.setNeedsUpdate(channel);\n }\n }\n }\n if (props.customOperations) {\n for (let channel = 0; channel < this.channelCount; channel++) {\n if (Boolean(props.customOperations[channel]) !== Boolean(oldProps.customOperations[channel])) {\n this.setNeedsUpdate(channel);\n }\n }\n }\n if (props.pointCount !== undefined && props.pointCount !== oldProps.pointCount) {\n this.setNeedsUpdate();\n }\n if (props.attributes) {\n props.attributes = { ...oldProps.attributes, ...props.attributes };\n }\n Object.assign(this.props, props);\n }\n /** Flags a channel to need update\n * This is called internally by setProps() if certain props change\n * Users of this class still need to manually set the dirty flag sometimes, because even if no props changed\n * the underlying buffers could have been updated and require rerunning the aggregation\n * @param {number} channel - mark the given channel as dirty. If not provided, all channels will be updated.\n */\n setNeedsUpdate(channel) {\n if (channel === undefined) {\n this.needsUpdate = true;\n }\n else if (this.needsUpdate !== true) {\n this.needsUpdate = this.needsUpdate || [];\n this.needsUpdate[channel] = true;\n }\n }\n /** Run aggregation */\n update() {\n if (this.needsUpdate === true) {\n this.bins = sortBins({\n pointCount: this.props.pointCount,\n getBinId: evaluateVertexAccessor(this.props.getBin, this.props.attributes, this.props.binOptions)\n });\n const value = packBinIds({\n bins: this.bins,\n dimensions: this.dimensions,\n // Reuse allocated typed array\n target: this.binIds?.value\n });\n this.binIds = { value, type: 'float32', size: this.dimensions };\n }\n for (let channel = 0; channel < this.channelCount; channel++) {\n if (this.needsUpdate === true || this.needsUpdate[channel]) {\n const operation = this.props.customOperations[channel] ||\n BUILT_IN_OPERATIONS[this.props.operations[channel]];\n const { value, domain } = aggregate({\n bins: this.bins,\n getValue: evaluateVertexAccessor(this.props.getValue[channel], this.props.attributes, undefined),\n operation,\n // Reuse allocated typed array\n target: this.results[channel]?.value\n });\n this.results[channel] = { value, domain, type: 'float32', size: 1 };\n this.props.onUpdate?.({ channel });\n }\n }\n this.needsUpdate = false;\n }\n preDraw() { }\n /** Returns an accessor to the bins. */\n getBins() {\n return this.binIds;\n }\n /** Returns an accessor to the output for a given channel. */\n getResult(channel) {\n return this.results[channel];\n }\n /** Returns the [min, max] of aggregated values for a given channel. */\n getResultDomain(channel) {\n return this.results[channel]?.domain ?? [Infinity, -Infinity];\n }\n /** Returns the information for a given bin. */\n getBin(index) {\n const bin = this.bins[index];\n if (!bin) {\n return null;\n }\n const value = new Array(this.channelCount);\n for (let i = 0; i < value.length; i++) {\n const result = this.results[i];\n value[i] = result?.value[index];\n }\n return {\n id: bin.id,\n value,\n count: bin.points.length,\n pointIndices: bin.points\n };\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/** Group data points into bins */\nexport function sortBins({ pointCount, getBinId }) {\n const binsById = new Map();\n for (let i = 0; i < pointCount; i++) {\n const id = getBinId(i);\n if (id === null) {\n continue;\n }\n let bin = binsById.get(String(id));\n if (bin) {\n bin.points.push(i);\n }\n else {\n bin = {\n id,\n index: binsById.size,\n points: [i]\n };\n binsById.set(String(id), bin);\n }\n }\n return Array.from(binsById.values());\n}\n/** Pack bin ids into a typed array */\nexport function packBinIds({ bins, dimensions, target }) {\n const targetLength = bins.length * dimensions;\n if (!target || target.length < targetLength) {\n target = new Float32Array(targetLength);\n }\n for (let i = 0; i < bins.length; i++) {\n const { id } = bins[i];\n if (Array.isArray(id)) {\n target.set(id, i * dimensions);\n }\n else {\n target[i] = id;\n }\n }\n return target;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst count = pointIndices => {\n return pointIndices.length;\n};\nconst sum = (pointIndices, getValue) => {\n let result = 0;\n for (const i of pointIndices) {\n result += getValue(i);\n }\n return result;\n};\nconst mean = (pointIndices, getValue) => {\n if (pointIndices.length === 0) {\n return NaN;\n }\n return sum(pointIndices, getValue) / pointIndices.length;\n};\nconst min = (pointIndices, getValue) => {\n let result = Infinity;\n for (const i of pointIndices) {\n const value = getValue(i);\n if (value < result) {\n result = value;\n }\n }\n return result;\n};\nconst max = (pointIndices, getValue) => {\n let result = -Infinity;\n for (const i of pointIndices) {\n const value = getValue(i);\n if (value > result) {\n result = value;\n }\n }\n return result;\n};\nexport const BUILT_IN_OPERATIONS = {\n COUNT: count,\n SUM: sum,\n MEAN: mean,\n MIN: min,\n MAX: max\n};\n/**\n * Performs the aggregation step. See interface Aggregator comments.\n * @returns Floa32Array of aggregated values, one for each bin, and the [min,max] of the values\n */\nexport function aggregate({ bins, getValue, operation, target }) {\n if (!target || target.length < bins.length) {\n target = new Float32Array(bins.length);\n }\n let min = Infinity;\n let max = -Infinity;\n for (let j = 0; j < bins.length; j++) {\n const { points } = bins[j];\n target[j] = operation(points, getValue);\n if (target[j] < min)\n min = target[j];\n if (target[j] > max)\n max = target[j];\n }\n return { value: target, domain: [min, max] };\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/** Evaluate a VertexAccessor with a set of attributes */\nexport function evaluateVertexAccessor(accessor, attributes, options) {\n const vertexReaders = {};\n for (const id of accessor.sources || []) {\n const attribute = attributes[id];\n if (attribute) {\n vertexReaders[id] = getVertexReader(attribute);\n }\n else {\n throw new Error(`Cannot find attribute ${id}`);\n }\n }\n const data = {};\n return (vertexIndex) => {\n for (const id in vertexReaders) {\n data[id] = vertexReaders[id](vertexIndex);\n }\n return accessor.getValue(data, vertexIndex, options);\n };\n}\n/** Read value out of a deck.gl Attribute by vertex */\nfunction getVertexReader(attribute) {\n const value = attribute.value;\n const { offset = 0, stride, size } = attribute.getAccessor();\n const bytesPerElement = value.BYTES_PER_ELEMENT;\n const elementOffset = offset / bytesPerElement;\n const elementStride = stride ? stride / bytesPerElement : size;\n if (size === 1) {\n // Size 1, returns (i: number) => number\n if (attribute.isConstant) {\n return () => value[0];\n }\n return (vertexIndex) => {\n const i = elementOffset + elementStride * vertexIndex;\n return value[i];\n };\n }\n // Size >1, returns (i: number) => number[]\n let result;\n if (attribute.isConstant) {\n result = Array.from(value);\n return () => result;\n }\n result = new Array(size);\n return (vertexIndex) => {\n const i = elementOffset + elementStride * vertexIndex;\n for (let j = 0; j < size; j++) {\n result[j] = value[i + j];\n }\n return result;\n };\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Model } from '@luma.gl/engine';\nimport { createRenderTarget } from \"./utils.js\";\nimport { binSorterUniforms } from \"./bin-sorter-uniforms.js\";\nconst COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPU color mask RED, GREEN, BLUE, ALPHA\nconst MAX_FLOAT32 = 3e38;\nconst EMPTY_MASKS = { SUM: 0, MEAN: 0, MIN: 0, MAX: 0, COUNT: 0 };\nexport const TEXTURE_WIDTH = 1024;\n/**\n * This class manages the resources for performing the first step of aggregation\n * Sort a list of data points into a number of bins\n */\nexport class WebGLBinSorter {\n constructor(device, props) {\n /**\n * A packed texture in which each pixel represents a bin.\n * The index of the pixel in the memory layout is the bin index.\n * Alpha value is the count of data points that fall into this bin\n * R,G,B values are the aggregated values of each channel:\n * - Sum of all data points if operation is 'SUM', or 'MEAN'\n * - Min of all data points if operation is 'MIN'\n * - Max of all data points if operation is 'MAX'\n */\n this.binsFBO = null;\n this.device = device;\n this.model = createModel(device, props);\n }\n get texture() {\n return this.binsFBO ? this.binsFBO.colorAttachments[0].texture : null;\n }\n destroy() {\n this.model.destroy();\n this.binsFBO?.colorAttachments[0].texture.destroy();\n this.binsFBO?.destroy();\n }\n getBinValues(index) {\n if (!this.binsFBO) {\n return null;\n }\n const x = index % TEXTURE_WIDTH;\n const y = Math.floor(index / TEXTURE_WIDTH);\n const buffer = this.device.readPixelsToArrayWebGL(this.binsFBO, {\n sourceX: x,\n sourceY: y,\n sourceWidth: 1,\n sourceHeight: 1\n }).buffer;\n return new Float32Array(buffer);\n }\n setDimensions(binCount, binIdRange) {\n const width = TEXTURE_WIDTH;\n const height = Math.ceil(binCount / width);\n // Only destroy existing texture if it is not large enough\n if (!this.binsFBO) {\n this.binsFBO = createRenderTarget(this.device, width, height);\n }\n else if (this.binsFBO.height < height) {\n this.binsFBO.resize({ width, height });\n }\n const binSorterProps = {\n binIdRange: [\n binIdRange[0][0],\n binIdRange[0][1],\n binIdRange[1]?.[0] || 0,\n binIdRange[1]?.[1] || 0\n ],\n targetSize: [this.binsFBO.width, this.binsFBO.height]\n };\n this.model.shaderInputs.setProps({ binSorter: binSorterProps });\n }\n setModelProps(props) {\n const model = this.model;\n if (props.attributes) {\n model.setAttributes(props.attributes);\n }\n if (props.constantAttributes) {\n model.setConstantAttributes(props.constantAttributes);\n }\n if (props.vertexCount !== undefined) {\n model.setVertexCount(props.vertexCount);\n }\n if (props.shaderModuleProps) {\n model.shaderInputs.setProps(props.shaderModuleProps);\n }\n }\n /** Update aggregation */\n update(\n /** The aggregation operation for each channel. Use null to skip update. */\n operations) {\n if (!this.binsFBO) {\n return;\n }\n const masks = getMaskByOperation(operations);\n this._updateBins('SUM', masks.SUM + masks.MEAN);\n this._updateBins('MIN', masks.MIN);\n this._updateBins('MAX', masks.MAX);\n }\n /** Recalculate aggregation on the given channels using the given operation */\n _updateBins(operation, \n /** GPU bit mask of one or more channels that should be updated */\n colorMask) {\n if (colorMask === 0) {\n return;\n }\n colorMask |= COLOR_CHANNELS[3]; // Also renders to the alpha channel (point count)\n const model = this.model;\n const target = this.binsFBO;\n const initialValue = operation === 'MAX' ? -MAX_FLOAT32 : operation === 'MIN' ? MAX_FLOAT32 : 0;\n const renderPass = this.device.beginRenderPass({\n id: `gpu-aggregation-${operation}`,\n framebuffer: target,\n parameters: {\n viewport: [0, 0, target.width, target.height],\n colorMask\n },\n clearColor: [initialValue, initialValue, initialValue, 0],\n clearDepth: false,\n clearStencil: false\n });\n model.setParameters({\n blend: true,\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one',\n blendColorOperation: operation === 'MAX' ? 'max' : operation === 'MIN' ? 'min' : 'add',\n blendAlphaOperation: 'add'\n });\n model.draw(renderPass);\n renderPass.end();\n }\n}\n/** Convert a [channel -> operation] map to a [operation -> GPU color mask] map */\nfunction getMaskByOperation(operations) {\n const result = { ...EMPTY_MASKS };\n for (let channel = 0; channel < operations.length; channel++) {\n const op = operations[channel];\n if (op) {\n result[op] += COLOR_CHANNELS[channel];\n }\n }\n return result;\n}\nfunction createModel(device, props) {\n let userVs = props.vs;\n if (props.dimensions === 2) {\n // If user provides 2d bin IDs, convert them to 1d indices for data packing\n userVs += /* glsl */ `\nvoid getBin(out int binId) {\n ivec2 binId2;\n getBin(binId2);\n if (binId2.x < binSorter.binIdRange.x || binId2.x >= binSorter.binIdRange.y) {\n binId = -1;\n } else {\n binId = (binId2.y - binSorter.binIdRange.z) * (binSorter.binIdRange.y - binSorter.binIdRange.x) + binId2.x;\n }\n}\n`;\n }\n const vs = `\\\n#version 300 es\n#define SHADER_NAME gpu-aggregation-sort-bins-vertex\n\n${userVs}\n\nout vec3 v_Value;\n\nvoid main() {\n int binIndex;\n getBin(binIndex);\n binIndex = binIndex - binSorter.binIdRange.x;\n if (binIndex < 0) {\n gl_Position = vec4(0.);\n return;\n }\n int row = binIndex / binSorter.targetSize.x;\n int col = binIndex - row * binSorter.targetSize.x;\n vec2 position = (vec2(col, row) + 0.5) / vec2(binSorter.targetSize) * 2.0 - 1.0;\n gl_Position = vec4(position, 0.0, 1.0);\n gl_PointSize = 1.0;\n\n#if NUM_CHANNELS == 3\n getValue(v_Value);\n#elif NUM_CHANNELS == 2\n getValue(v_Value.xy);\n#else\n getValue(v_Value.x);\n#endif\n}\n`;\n const fs = /* glsl */ `\\\n#version 300 es\n#define SHADER_NAME gpu-aggregation-sort-bins-fragment\n\nprecision highp float;\n\nin vec3 v_Value;\nout vec4 fragColor;\n\nvoid main() {\n fragColor.xyz = v_Value;\n\n #ifdef MODULE_GEOMETRY\n geometry.uv = vec2(0.);\n DECKGL_FILTER_COLOR(fragColor, geometry);\n #endif\n\n fragColor.w = 1.0;\n}\n`;\n const model = new Model(device, {\n bufferLayout: props.bufferLayout,\n modules: [...(props.modules || []), binSorterUniforms],\n defines: { ...props.defines, NON_INSTANCED_MODEL: 1, NUM_CHANNELS: props.channelCount },\n isInstanced: false,\n vs,\n fs,\n topology: 'point-list'\n });\n return model;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/**\n * Create a float texture to store aggregation result\n */\nexport function createRenderTarget(device, width, height) {\n return device.createFramebuffer({\n width,\n height,\n colorAttachments: [\n device.createTexture({\n width,\n height,\n format: 'rgba32float',\n mipmaps: false,\n sampler: {\n minFilter: 'nearest',\n magFilter: 'nearest'\n }\n })\n ]\n });\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = /* glsl */ `\\\nuniform binSorterUniforms {\n ivec4 binIdRange;\n ivec2 targetSize;\n} binSorter;\n`;\nexport const binSorterUniforms = {\n name: 'binSorter',\n vs: uniformBlock,\n uniformTypes: {\n binIdRange: 'vec4<i32>',\n targetSize: 'vec2<i32>'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { BufferTransform } from '@luma.gl/engine';\nimport { createRenderTarget } from \"./utils.js\";\nimport { TEXTURE_WIDTH } from \"./webgl-bin-sorter.js\";\nimport { aggregatorTransformUniforms } from \"./aggregation-transform-uniforms.js\";\nconst MAX_FLOAT32 = 3e38;\nexport class WebGLAggregationTransform {\n constructor(device, props) {\n /** Packed from bin ids */\n this.binBuffer = null;\n /** Packed values from each channel of each bin\n * Stride is number of channels * 4 bytes (float32)\n */\n this.valueBuffer = null;\n /** Aggregated [min, max] for each channel */\n this._domains = null;\n this.device = device;\n this.channelCount = props.channelCount;\n this.transform = createTransform(device, props);\n this.domainFBO = createRenderTarget(device, 2, 1);\n }\n destroy() {\n this.transform.destroy();\n this.binBuffer?.destroy();\n this.valueBuffer?.destroy();\n this.domainFBO.colorAttachments[0].texture.destroy();\n this.domainFBO.destroy();\n }\n get domains() {\n if (!this._domains) {\n // Domain model has run, but result has not been read to CPU\n const buffer = this.device.readPixelsToArrayWebGL(this.domainFBO).buffer;\n const domain = new Float32Array(buffer);\n this._domains = [\n [-domain[4], domain[0]],\n [-domain[5], domain[1]],\n [-domain[6], domain[2]]\n ].slice(0, this.channelCount);\n }\n return this._domains;\n }\n setDimensions(binCount, binIdRange) {\n const { model, transformFeedback } = this.transform;\n model.setVertexCount(binCount);\n const aggregatorTransformProps = {\n binIdRange: [\n binIdRange[0][0],\n binIdRange[0][1],\n binIdRange[1]?.[0] || 0,\n binIdRange[1]?.[1] || 0\n ]\n };\n model.shaderInputs.setProps({ aggregatorTransform: aggregatorTransformProps });\n // Only destroy existing buffer if it is not large enough\n const binBufferByteLength = binCount * binIdRange.length * 4;\n if (!this.binBuffer || this.binBuffer.byteLength < binBufferByteLength) {\n this.binBuffer?.destroy();\n this.binBuffer = this.device.createBuffer({ byteLength: binBufferByteLength });\n transformFeedback.setBuffer('binIds', this.binBuffer);\n }\n const valueBufferByteLength = binCount * this.channelCount * 4;\n if (!this.valueBuffer || this.valueBuffer.byteLength < valueBufferByteLength) {\n this.valueBuffer?.destroy();\n this.valueBuffer = this.device.createBuffer({ byteLength: valueBufferByteLength });\n transformFeedback.setBuffer('values', this.valueBuffer);\n }\n }\n update(bins, operations) {\n if (!bins) {\n return;\n }\n const transform = this.transform;\n const target = this.domainFBO;\n const isCount = [0, 1, 2].map(i => (operations[i] === 'COUNT' ? 1 : 0));\n const isMean = [0, 1, 2].map(i => (operations[i] === 'MEAN' ? 1 : 0));\n const aggregatorTransformProps = {\n isCount: isCount,\n isMean: isMean,\n bins\n };\n transform.model.shaderInputs.setProps({ aggregatorTransform: aggregatorTransformProps });\n transform.run({\n id: 'gpu-aggregation-domain',\n framebuffer: target,\n parameters: {\n viewport: [0, 0, 2, 1]\n },\n clearColor: [-MAX_FLOAT32, -MAX_FLOAT32, -MAX_FLOAT32, 0],\n clearDepth: false,\n clearStencil: false\n });\n // Clear the last read results. This will be lazy-populated if used.\n this._domains = null;\n }\n}\nfunction createTransform(device, props) {\n const vs = /* glsl */ `\\\n#version 300 es\n#define SHADER_NAME gpu-aggregation-domain-vertex\n\nuniform sampler2D bins;\n\n#if NUM_DIMS == 1\nout float binIds;\n#else\nout vec2 binIds;\n#endif\n\n#if NUM_CHANNELS == 1\nflat out float values;\n#elif NUM_CHANNELS == 2\nflat out vec2 values;\n#else\nflat out vec3 values;\n#endif\n\nconst float NAN = intBitsToFloat(-1);\n\nvoid main() {\n int row = gl_VertexID / SAMPLER_WIDTH;\n int col = gl_VertexID - row * SAMPLER_WIDTH;\n vec4 weights = texelFetch(bins, ivec2(col, row), 0);\n vec3 value3 = mix(\n mix(weights.rgb, vec3(weights.a), aggregatorTransform.isCount),\n weights.rgb / max(weights.a, 1.0),\n aggregatorTransform.isMean\n );\n if (weights.a == 0.0) {\n value3 = vec3(NAN);\n }\n\n#if NUM_DIMS == 1\n binIds = float(gl_VertexID + aggregatorTransform.binIdRange.x);\n#else\n int y = gl_VertexID / (aggregatorTransform.binIdRange.y - aggregatorTransform.binIdRange.x);\n int x = gl_VertexID - y * (aggregatorTransform.binIdRange.y - aggregatorTransform.binIdRange.x);\n binIds.y = float(y + aggregatorTransform.binIdRange.z);\n binIds.x = float(x + aggregatorTransform.binIdRange.x);\n#endif\n\n#if NUM_CHANNELS == 3\n values = value3;\n#elif NUM_CHANNELS == 2\n values = value3.xy;\n#else\n values = value3.x;\n#endif\n\n gl_Position = vec4(0., 0., 0., 1.);\n // This model renders into a 2x1 texture to obtain min and max simultaneously.\n // See comments in fragment shader\n gl_PointSize = 2.0;\n}\n`;\n const fs = /* glsl */ `\\\n#version 300 es\n#define SHADER_NAME gpu-aggregation-domain-fragment\n\nprecision highp float;\n\n#if NUM_CHANNELS == 1\nflat in float values;\n#elif NUM_CHANNELS == 2\nflat in vec2 values;\n#else\nflat in vec3 values;\n#endif\n\nout vec4 fragColor;\n\nvoid main() {\n vec3 value3;\n#if NUM_CHANNELS == 3\n value3 = values;\n#elif NUM_CHANNELS == 2\n value3.xy = values;\n#else\n value3.x = values;\n#endif\n if (isnan(value3.x)) discard;\n // This shader renders into a 2x1 texture with blending=max\n // The left pixel yields the max value of each channel\n // The right pixel yields the min value of each channel\n if (gl_FragCoord.x < 1.0) {\n fragColor = vec4(value3, 1.0);\n } else {\n fragColor = vec4(-value3, 1.0);\n }\n}\n`;\n return new BufferTransform(device, {\n vs,\n fs,\n topology: 'point-list',\n modules: [aggregatorTransformUniforms],\n parameters: {\n blend: true,\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one',\n blendColorOperation: 'max',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one',\n blendAlphaOperation: 'max'\n },\n defines: {\n NUM_DIMS: props.dimensions,\n NUM_CHANNELS: props.channelCount,\n SAMPLER_WIDTH: TEXTURE_WIDTH\n },\n varyings: ['binIds', 'values'],\n disableWarnings: true\n });\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = /* glsl */ `\\\nuniform aggregatorTransformUniforms {\n ivec4 binIdRange;\n bvec3 isCount;\n bvec3 isMean;\n float naN;\n} aggregatorTransform;\n`;\nexport const aggregatorTransformUniforms = {\n name: 'aggregatorTransform',\n vs: uniformBlock,\n uniformTypes: {\n binIdRange: 'vec4<i32>',\n isCount: 'vec3<f32>',\n isMean: 'vec3<f32>'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { WebGLBinSorter } from \"./webgl-bin-sorter.js\";\nimport { WebGLAggregationTransform } from \"./webgl-aggregation-transform.js\";\nimport { _deepEqual as deepEqual, log } from '@deck.gl/core';\n/** An Aggregator implementation that calculates aggregation on the GPU */\nexport class WebGLAggregator {\n /** Checks if the current device supports GPU aggregation */\n static isSupported(device) {\n return (device.features.has('float32-renderable-webgl') &&\n device.features.has('texture-blend-float-webgl'));\n }\n constructor(device, props) {\n this.binCount = 0;\n /** Cached outputs */\n this.binIds = null;\n this.results = [];\n this.device = device;\n this.dimensions = props.dimensions;\n this.channelCount = props.channelCount;\n this.props = {\n ...props,\n pointCount: 0,\n binIdRange: [[0, 0]],\n operations: [],\n attributes: {},\n binOptions: {}\n };\n this.needsUpdate = new Array(this.channelCount).fill(true);\n this.binSorter = new WebGLBinSorter(device, props);\n this.aggregationTransform = new WebGLAggregationTransform(device, props);\n this.setProps(props);\n }\n getBins() {\n const buffer = this.aggregationTransform.binBuffer;\n if (!buffer) {\n return null;\n }\n if (this.binIds?.buffer !== buffer) {\n // deck.gl Attribute.setBinaryValue uses shallow comparison to determine if attribute value has changed\n // For performance, only create a new binary attribute descriptor when Buffer changes\n this.binIds = { buffer, type: 'float32', size: this.dimensions };\n }\n return this.binIds;\n }\n /** Returns an accessor to the output for a given channel. */\n getResult(channel) {\n const buffer = this.aggregationTransform.valueBuffer;\n if (!buffer || channel >= this.channelCount) {\n return null;\n }\n if (this.results[channel]?.buffer !== buffer) {\n this.results[channel] = {\n buffer,\n type: 'float32',\n size: 1,\n stride: this.channelCount * 4,\n offset: channel * 4\n };\n }\n return this.results[channel];\n }\n /** Returns the [min, max] of aggregated values for a given channel. */\n getResultDomain(channel) {\n return this.aggregationTransform.domains[channel];\n }\n /** Returns the information for a given bin. */\n getBin(index) {\n if (index < 0 || index >= this.binCount) {\n return null;\n }\n const { binIdRange } = this.props;\n let id;\n if (this.dimensions === 1) {\n id = [index + binIdRange[0][0]];\n }\n else {\n const [[x0, x1], [y0]] = binIdRange;\n const width = x1 - x0;\n id = [(index % width) + x0, Math.floor(index / width) + y0];\n }\n const pixel = this.binSorter.getBinValues(index);\n if (!pixel) {\n return null;\n }\n const count = pixel[3];\n const value = [];\n for (let channel = 0; channel < this.channelCount; channel++) {\n const operation = this.props.operations[channel];\n if (operation === 'COUNT') {\n value[channel] = count;\n }\n else if (count === 0) {\n value[channel] = NaN;\n }\n else {\n value[channel] = operation === 'MEAN' ? pixel[channel] / count : pixel[channel];\n }\n }\n return { id, value, count };\n }\n /** Release GPU resources */\n destroy() {\n this.binSorter.destroy();\n this.aggregationTransform.destroy();\n }\n /** Update aggregation props. Normalize prop values and set change flags. */\n setProps(props) {\n const oldProps = this.props;\n // Update local settings. These will set the flag this._needsUpdate\n if ('binIdRange' in props && !deepEqual(props.binIdRange, oldProps.binIdRange, 2)) {\n const binIdRange = props.binIdRange;\n log.assert(binIdRange.length === this.dimensions);\n if (this.dimensions === 1) {\n const [[x0, x1]] = binIdRange;\n this.binCount = x1 - x0;\n }\n else {\n const [[x0, x1], [y0, y1]] = binIdRange;\n this.binCount = (x1 - x0) * (y1 - y0);\n }\n this.binSorter.setDimensions(this.binCount, binIdRange);\n this.aggregationTransform.setDimensions(this.binCount, binIdRange);\n this.setNeedsUpdate();\n }\n if (props.operations) {\n for (let channel = 0; channel < this.channelCount; channel++) {\n if (props.operations[channel] !== oldProps.operations[channel]) {\n this.setNeedsUpdate(channel);\n }\n }\n }\n if (props.pointCount !== undefined && props.pointCount !== oldProps.pointCount) {\n this.binSorter.setModelProps({ vertexCount: props.pointCount });\n this.setNeedsUpdate();\n }\n if (props.binOptions) {\n if (!deepEqual(props.binOptions, oldProps.binOptions, 2)) {\n this.setNeedsUpdate();\n }\n this.binSorter.model.shaderInputs.setProps({ binOptions: props.binOptions });\n }\n if (props.attributes) {\n const attributeBuffers = {};\n const constantAttributes = {};\n for (const attribute of Object.values(props.attributes)) {\n for (const [attributeName, value] of Object.entries(attribute.getValue())) {\n if (ArrayBuffer.isView(value)) {\n constantAttributes[attributeName] = value;\n }\n else if (value) {\n attributeBuffers[attributeName] = value;\n }\n }\n }\n this.binSorter.setModelProps({ attributes: attributeBuffers, constantAttributes });\n }\n if (props.shaderModuleProps) {\n this.binSorter.setModelProps({ shaderModuleProps: props.shaderModuleProps });\n }\n Object.assign(this.props, props);\n }\n /** Flags a channel to need update.\n * This is called internally by setProps() if certain props change\n * Users of this class still need to manually set the dirty flag sometimes, because even if no props changed\n * the underlying buffers could have been updated and require rerunning the aggregation\n * @param {number} channel - mark the given channel as dirty. If not provided, all channels will be updated.\n */\n setNeedsUpdate(channel) {\n if (channel === undefined) {\n this.needsUpdate.fill(true);\n }\n else {\n this.needsUpdate[channel] = true;\n }\n }\n update() { }\n /** Run aggregation */\n preDraw() {\n if (!this.needsUpdate.some(Boolean)) {\n return;\n }\n const { operations } = this.props;\n const operationsToUpdate = this.needsUpdate.map((needsUpdate, i) => needsUpdate ? operations[i] : null);\n // Render data to bins\n this.binSorter.update(operationsToUpdate);\n // Read to buffer and calculate domain\n this.aggregationTransform.update(this.binSorter.texture, operations);\n for (let i = 0; i < this.channelCount; i++) {\n if (this.needsUpdate[i]) {\n this.needsUpdate[i] = false;\n this.props.onUpdate?.({ channel: i });\n }\n }\n // Uncomment to debug\n // console.log('binsFBO', new Float32Array(this.device.readPixelsToArrayWebGL(this.binSorter.texture!).buffer));\n // console.log('binsBuffer', new Float32Array(this.aggregationTransform.binBuffer?.readSyncWebGL().buffer!));\n // console.log('resultBuffer', new Float32Array(this.aggregationTransform.valueBuffer?.readSyncWebGL().buffer!));\n }\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer, AttributeManager } from '@deck.gl/core';\nclass AggregationLayer extends CompositeLayer {\n /** Allow this layer to participates in the draw cycle */\n get isDrawable() {\n return true;\n }\n initializeState() {\n this.getAttributeManager().remove(['instancePickingColors']);\n }\n // Extend Layer.updateState to update the Aggregator instance\n // returns true if aggregator is changed\n updateState(params) {\n super.updateState(params);\n const aggregatorType = this.getAggregatorType();\n if (params.changeFlags.extensionsChanged || this.state.aggregatorType !== aggregatorType) {\n this.state.aggregator?.destroy();\n const aggregator = this.createAggregator(aggregatorType);\n aggregator.setProps({\n attributes: this.getAttributeManager()?.attributes\n });\n this.setState({ aggregator, aggregatorType });\n return true;\n }\n return false;\n }\n // Override Layer.finalizeState to dispose the Aggregator instance\n finalizeState(context) {\n super.finalizeState(context);\n this.state.aggregator.destroy();\n }\n // Override Layer.updateAttributes to update the aggregator\n updateAttributes(changedAttributes) {\n const { aggregator } = this.state;\n aggregator.setProps({\n attributes: changedAttributes\n });\n for (const id in changedAttributes) {\n this.onAttributeChange(id);\n }\n // In aggregator.update() the aggregator allocates the buffers to store its output\n // These buffers will be exposed by aggregator.getResults() and passed to the sublayers\n // Therefore update() must be called before renderLayers()\n // CPUAggregator's output is populated right here in update()\n // GPUAggregator's output is pre-allocated and populated in preDraw(), see comments below\n aggregator.update();\n }\n draw({ shaderModuleProps }) {\n // GPU aggregation needs `shaderModuleProps` for projection/filter uniforms which are only accessible at draw time\n // GPUAggregator's Buffers are pre-allocated during `update()` and passed down to the sublayer attributes in renderLayers()\n // Although the Buffers have been bound to the sublayer's Model, their content are not populated yet\n // GPUAggregator.preDraw() is called in the draw cycle here right before Buffers are used by sublayer.draw()\n const { aggregator } = this.state;\n // @ts-expect-error only used by GPU aggregators\n aggregator.setProps({ shaderModuleProps });\n aggregator.preDraw();\n }\n // override CompositeLayer._getAttributeManager to create AttributeManager instance\n _getAttributeManager() {\n return new AttributeManager(this.context.device, {\n id: this.props.id,\n stats: this.context.stats\n });\n }\n}\nAggregationLayer.layerName = 'AggregationLayer';\nexport default AggregationLayer;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Model, Geometry } from '@luma.gl/engine';\nimport { Layer, picking } from '@deck.gl/core';\nimport { createColorRangeTexture, updateColorRangeTexture } from \"../common/utils/color-utils.js\";\nimport vs from \"./screen-grid-layer-vertex.glsl.js\";\nimport fs from \"./screen-grid-layer-fragment.glsl.js\";\nimport { screenGridUniforms } from \"./screen-grid-layer-uniforms.js\";\nclass ScreenGridCellLayer extends Layer {\n getShaders() {\n return super.getShaders({ vs, fs, modules: [picking, screenGridUniforms] });\n }\n initializeState() {\n this.getAttributeManager().addInstanced({\n instancePositions: {\n size: 2,\n type: 'float32',\n accessor: 'getBin'\n },\n instanceWeights: {\n size: 1,\n type: 'float32',\n accessor: 'getWeight'\n }\n });\n this.state.model = this._getModel();\n }\n updateState(params) {\n super.updateState(params);\n const { props, oldProps, changeFlags } = params;\n const model = this.state.model;\n if (oldProps.colorRange !== props.colorRange) {\n this.state.colorTexture?.destroy();\n this.state.colorTexture = createColorRangeTexture(this.context.device, props.colorRange, props.colorScaleType);\n const screenGridProps = { colorRange: this.state.colorTexture };\n model.shaderInputs.setProps({ screenGrid: screenGridProps });\n }\n else if (oldProps.colorScaleType !== props.colorScaleType) {\n updateColorRangeTexture(this.state.colorTexture, props.colorScaleType);\n }\n if (oldProps.cellMarginPixels !== props.cellMarginPixels ||\n oldProps.cellSizePixels !== props.cellSizePixels ||\n changeFlags.viewportChanged) {\n const { width, height } = this.context.viewport;\n const { cellSizePixels: gridSize, cellMarginPixels } = this.props;\n const cellSize = Math.max(gridSize - cellMarginPixels, 0);\n const screenGridProps = {\n gridSizeClipspace: [(gridSize / width) * 2, (gridSize / height) * 2],\n cellSizeClipspace: [(cellSize / width) * 2, (cellSize / height) * 2]\n };\n model.shaderInputs.setProps({ screenGrid: screenGridProps });\n }\n }\n finalizeState(context) {\n super.finalizeState(context);\n this.state.colorTexture?.destroy();\n }\n draw({ uniforms }) {\n const colorDomain = this.props.colorDomain();\n const model = this.state.model;\n const screenGridProps = { colorDomain };\n model.shaderInputs.setProps({ screenGrid: screenGridProps });\n model.draw(this.context.renderPass);\n }\n // Private Methods\n _getModel() {\n return new Model(this.context.device, {\n ...this.getShaders(),\n id: this.props.id,\n bufferLayout: this.getAttributeManager().getBufferLayouts(),\n geometry: new Geometry({\n topology: 'triangle-strip',\n attributes: {\n positions: {\n value: new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]),\n size: 2\n }\n }\n }),\n isInstanced: true\n });\n }\n}\nScreenGridCellLayer.layerName = 'ScreenGridCellLayer';\nexport default ScreenGridCellLayer;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport const defaultColorRange = [\n [255, 255, 178],\n [254, 217, 118],\n [254, 178, 76],\n [253, 141, 60],\n [240, 59, 32],\n [189, 0, 38]\n];\n// Converts a colorRange array to a flat array with 4 components per color\nexport function colorRangeToFlatArray(colorRange, normalize = false, ArrayType = Float32Array) {\n let flatArray;\n if (Number.isFinite(colorRange[0])) {\n // its already a flat array.\n flatArray = new ArrayType(colorRange);\n }\n else {\n // flatten it\n flatArray = new ArrayType(colorRange.length * 4);\n let index = 0;\n for (let i = 0; i < colorRange.length; i++) {\n const color = colorRange[i];\n flatArray[index++] = color[0];\n flatArray[index++] = color[1];\n flatArray[index++] = color[2];\n flatArray[index++] = Number.isFinite(color[3]) ? color[3] : 255;\n }\n }\n if (normalize) {\n for (let i = 0; i < flatArray.length; i++) {\n flatArray[i] /= 255;\n }\n }\n return flatArray;\n}\nexport const COLOR_RANGE_FILTER = {\n linear: 'linear',\n quantile: 'nearest',\n quantize: 'nearest',\n ordinal: 'nearest'\n};\nexport function updateColorRangeTexture(texture, type) {\n texture.setSampler({\n minFilter: COLOR_RANGE_FILTER[type],\n magFilter: COLOR_RANGE_FILTER[type]\n });\n}\nexport function createColorRangeTexture(device, colorRange, type = 'linear') {\n const colors = colorRangeToFlatArray(colorRange, false, Uint8Array);\n return device.createTexture({\n format: 'rgba8unorm',\n mipmaps: false,\n sampler: {\n minFilter: COLOR_RANGE_FILTER[type],\n magFilter: COLOR_RANGE_FILTER[type],\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge'\n },\n data: colors,\n width: colors.length / 4,\n height: 1\n });\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport default /* glsl */ `\\\n#version 300 es\n#define SHADER_NAME screen-grid-layer-vertex-shader\n#define RANGE_COUNT 6\nin vec2 positions;\nin vec2 instancePositions;\nin float instanceWeights;\nin vec3 instancePickingColors;\nuniform sampler2D colorRange;\nout vec4 vColor;\nvec4 interp(float value, vec2 domain, sampler2D range) {\nfloat r = (value - domain.x) / (domain.y - domain.x);\nreturn texture(range, vec2(r, 0.5));\n}\nvoid main(void) {\nif (isnan(instanceWeights)) {\ngl_Position = vec4(0.);\nreturn;\n}\nvec2 pos = instancePositions * screenGrid.gridSizeClipspace + positions * screenGrid.cellSizeClipspace;\npos.x = pos.x - 1.0;\npos.y = 1.0 - pos.y;\ngl_Position = vec4(pos, 0., 1.);\nvColor = interp(instanceWeights, screenGrid.colorDomain, colorRange);\nvColor.a *= layer.opacity;\npicking_setPickingColor(instancePickingColors);\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/* fragment shader for the grid-layer */\nexport default /* glsl */ `\\\n#version 300 es\n#define SHADER_NAME screen-grid-layer-fragment-shader\nprecision highp float;\nin vec4 vColor;\nout vec4 fragColor;\nvoid main(void) {\nfragColor = vColor;\nDECKGL_FILTER_COLOR(fragColor, geometry);\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = /* glsl */ `\\\nuniform screenGridUniforms {\n vec2 cellSizeClipspace;\n vec2 gridSizeClipspace;\n vec2 colorDomain;\n} screenGrid;\n`;\nexport const screenGridUniforms = {\n name: 'screenGrid',\n vs: uniformBlock,\n uniformTypes: {\n cellSizeClipspace: 'vec2<f32>',\n gridSizeClipspace: 'vec2<f32>',\n colorDomain: 'vec2<f32>'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = /* glsl */ `\\\nuniform binOptionsUniforms {\n float cellSizePixels;\n} binOptions;\n`;\nexport const binOptionsUniforms = {\n name: 'binOptions',\n vs: uniformBlock,\n uniformTypes: {\n cellSizePixels: 'f32'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log, createIterable, project32, Viewport } from '@deck.gl/core';\nimport { WebGLAggregator, CPUAggregator } from \"../common/aggregator/index.js\";\nimport AggregationLayer from \"../common/aggregation-layer.js\";\nimport { defaultColorRange } from \"../common/utils/color-utils.js\";\nimport { AttributeWithScale } from \"../common/utils/scale-utils.js\";\nimport { getBinIdRange } from \"../common/utils/bounds-utils.js\";\nimport HexagonCellLayer from \"./hexagon-cell-layer.js\";\nimport { pointToHexbin, HexbinVertices, getHexbinCentroid, pointToHexbinGLSL } from \"./hexbin.js\";\nimport { binOptionsUniforms } from \"./bin-options-uniforms.js\";\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() { }\nconst defaultProps = {\n gpuAggregation: false,\n // color\n colorDomain: null,\n colorRange: defaultColorRange,\n getColorValue: { type: 'accessor', value: null }, // default value is calculated from `getColorWeight` and `colorAggregation`\n getColorWeight: { type: 'accessor', value: 1 },\n colorAggregation: 'SUM',\n lowerPercentile: { type: 'number', min: 0, max: 100, value: 0 },\n upperPercentile: { type: 'number', min: 0, max: 100, value: 100 },\n colorScaleType: 'quantize',\n onSetColorDomain: noop,\n // elevation\n elevationDomain: null,\n elevationRange: [0, 1000],\n getElevationValue: { type: 'accessor', value: null }, // default value is calculated from `getElevationWeight` and `elevationAggregation`\n getElevationWeight: { type: 'accessor', value: 1 },\n elevationAggregation: 'SUM',\n elevationScale: { type: 'number', min: 0, value: 1 },\n elevationLowerPercentile: { type: 'number', min: 0, max: 100, value: 0 },\n elevationUpperPercentile: { type: 'number', min: 0, max: 100, value: 100 },\n elevationScaleType: 'linear',\n onSetElevationDomain: noop,\n // hexbin\n radius: { type: 'number', min: 1, value: 1000 },\n coverage: { type: 'number', min: 0, max: 1, value: 1 },\n getPosition: { type: 'accessor', value: (x) => x.position },\n hexagonAggregator: { type: 'function', optional: true, value: null },\n extruded: false,\n // Optional material for 'lighting' shader module\n material: true\n};\n/** Aggregate data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. */\nclass HexagonLayer extends AggregationLayer {\n getAggregatorType() {\n const { gpuAggregation, hexagonAggregator, getColorValue, getElevationValue } = this.props;\n if (gpuAggregation && (hexagonAggregator || getColorValue || getElevationValue)) {\n // If these features are desired by the app, the user should explicitly use CPU aggregation\n log.warn('Features not supported by GPU aggregation, falling back to CPU')();\n return 'cpu';\n }\n if (\n // GPU aggregation is requested\n gpuAggregation &&\n // GPU aggregation is supported by the device\n WebGLAggregator.isSupported(this.context.device)) {\n return 'gpu';\n }\n return 'cpu';\n }\n createAggregator(type) {\n if (type === 'cpu') {\n const { hexagonAggregator, radius } = this.props;\n return new CPUAggregator({\n dimensions: 2,\n getBin: {\n sources: ['positions'],\n getValue: ({ positions }, index, opts) => {\n if (hexagonAggregator) {\n return hexagonAggregator(positions, radius);\n }\n const viewport = this.state.aggregatorViewport;\n // project to common space\n const p = viewport.projectPosition(positions);\n const { radiusCommon, hexOriginCommon } = opts;\n return pointToHexbin([p[0] - hexOriginCommon[0], p[1] - hexOriginCommon[1]], radiusCommon);\n }\n },\n getValue: [\n { sources: ['colorWeights'], getValue: ({ colorWeights }) => colorWeights },\n { sources: ['elevationWeights'], getValue: ({ elevationWeights }) => elevationWeights }\n ]\n });\n }\n return new WebGLAggregator(this.context.device, {\n dimensions: 2,\n channelCount: 2,\n bufferLayout: this.getAttributeManager().getBufferLayouts({ isInstanced: false }),\n ...super.getShaders({\n modules: [project32, binOptionsUniforms],\n vs: /* glsl */ `\n in vec3 positions;\n in vec3 positions64Low;\n in float colorWeights;\n in float elevationWeights;\n \n ${pointToHexbinGLSL}\n\n void getBin(out ivec2 binId) {\n vec3 positionCommon = project_position(positions, positions64Low);\n binId = pointToHexbin(positionCommon.xy, binOptions.radiusCommon);\n }\n void getValue(out vec2 value) {\n value = vec2(colorWeights, elevationWeights);\n }\n `\n })\n });\n }\n initializeState() {\n super.initializeState();\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: {\n size: 3,\n accessor: 'getPosition',\n type: 'float64',\n fp64: this.use64bitPositions()\n },\n colorWeights: { size: 1, accessor: 'getColorWeight' },\n elevationWeights: { size: 1, accessor: 'getElevationWeight' }\n });\n }\n updateState(params) {\n const aggregatorChanged = super.updateState(params);\n const { props, oldProps, changeFlags } = params;\n const { aggregator } = this.state;\n if ((changeFlags.dataChanged || !this.state.dataAsArray) &&\n (props.getColorValue || props.getElevationValue)) {\n // Convert data to array\n this.state.dataAsArray = Array.from(createIterable(props.data).iterable);\n }\n if (aggregatorChanged ||\n changeFlags.dataChanged ||\n props.radius !== oldProps.radius ||\n props.getColorValue !== oldProps.getColorValue ||\n props.getElevationValue !== oldProps.getElevationValue ||\n props.colorAggregation !== oldProps.colorAggregation ||\n props.elevationAggregation !== oldProps.elevationAggregation) {\n this._updateBinOptions();\n const { radiusCommon, hexOriginCommon, binIdRange, dataAsArray } = this.state;\n aggregator.setProps({\n // @ts-expect-error only used by GPUAggregator\n binIdRange,\n pointCount: this.getNumInstances(),\n operations: [props.colorAggregation, props.elevationAggregation],\n binOptions: {\n radiusCommon,\n hexOriginCommon\n },\n onUpdate: this._onAggregationUpdate.bind(this)\n });\n if (dataAsArray) {\n const { getColorValue, getElevationValue } = this.props;\n aggregator.setProps({\n // @ts-expect-error only used by CPUAggregator\n customOperations: [\n getColorValue &&\n ((indices) => getColorValue(indices.map(i => dataAsArray[i]), { indices, data: props.data })),\n getElevationValue &&\n ((indices) => getElevationValue(indices.map(i => dataAsArray[i]), { indices, data: props.data }))\n ]\n });\n }\n }\n if (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getColorValue) {\n aggregator.setNeedsUpdate(0);\n }\n if (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getElevationValue) {\n aggregator.setNeedsUpdate(1);\n }\n return aggregatorChanged;\n }\n _updateBinOptions() {\n const bounds = this.getBounds();\n let radiusCommon = 1;\n let hexOriginCommon = [0, 0];\n let binIdRange = [\n [0, 1],\n [0, 1]\n ];\n let viewport = this.context.viewport;\n if (bounds && Number.isFinite(bounds[0][0])) {\n let centroid = [(bounds[0][0] + bounds[1][0]) / 2, (bounds[0][1] + bounds[1][1]) / 2];\n const { radius } = this.props;\n const { unitsPerMeter } = viewport.getDistanceScales(centroid);\n radiusCommon = unitsPerMeter[0] * radius;\n // Use the centroid of the hex at the center of the data\n // This offsets the common space without changing the bins\n const centerHex = pointToHexbin(viewport.projectFlat(centroid), radiusCommon);\n centroid = viewport.unprojectFlat(getHexbinCentroid(centerHex, radiusCommon));\n const ViewportType = viewport.constructor;\n // We construct a viewport for the GPU aggregator's project module\n // This viewport is determined by data\n // removes arbitrary precision variance that depends on initial view state\n viewport = viewport.isGeospatial\n ? new ViewportType({ longitude: centroid[0], latitude: centroid[1], zoom: 12 })\n : new Viewport({ position: [centroid[0], centroid[1], 0], zoom: 12 });\n hexOriginCommon = [Math.fround(viewport.center[0]), Math.fround(viewport.center[1])];\n binIdRange = getBinIdRange({\n dataBounds: bounds,\n getBinId: (p) => {\n const positionCommon = viewport.projectFlat(p);\n positionCommon[0] -= hexOriginCommon[0];\n positionCommon[1] -= hexOriginCommon[1];\n return pointToHexbin(positionCommon, radiusCommon);\n },\n padding: 1\n });\n }\n this.setState({ radiusCommon, hexOriginCommon, binIdRange, aggregatorViewport: viewport });\n }\n draw(opts) {\n // Replaces render time viewport with our own\n if (opts.shaderModuleProps.project) {\n opts.shaderModuleProps.project.viewport = this.state.aggregatorViewport;\n }\n super.draw(opts);\n }\n _onAggregationUpdate({ channel }) {\n const props = this.getCurrentLayer().props;\n const { aggregator } = this.state;\n if (channel === 0) {\n const result = aggregator.getResult(0);\n this.setState({\n colors: new AttributeWithScale(result, aggregator.binCount)\n });\n props.onSetColorDomain(aggregator.getResultDomain(0));\n }\n else if (channel === 1) {\n const result = aggregator.getResult(1);\n this.setState({\n elevations: new AttributeWithScale(result, aggregator.binCount)\n });\n props.onSetElevationDomain(aggregator.getResultDomain(1));\n }\n }\n onAttributeChange(id) {\n const { aggregator } = this.state;\n switch (id) {\n case 'positions':\n aggregator.setNeedsUpdate();\n this._updateBinOptions();\n const { radiusCommon, hexOriginCommon, binIdRange } = this.state;\n aggregator.setProps({\n // @ts-expect-error only used by GPUAggregator\n binIdRange,\n binOptions: {\n radiusCommon,\n hexOriginCommon\n }\n });\n break;\n case 'colorWeights':\n aggregator.setNeedsUpdate(0);\n break;\n case 'elevationWeights':\n aggregator.setNeedsUpdate(1);\n break;\n default:\n // This should not happen\n }\n }\n renderLayers() {\n const { aggregator, radiusCommon, hexOriginCommon } = this.state;\n const { elevationScale, colorRange, elevationRange, extruded, coverage, material, transitions, colorScaleType, lowerPercentile, upperPercentile, colorDomain, elevationScaleType, elevationLowerPercentile, elevationUpperPercentile, elevationDomain } = this.props;\n const CellLayerClass = this.getSubLayerClass('cells', HexagonCellLayer);\n const binAttribute = aggregator.getBins();\n const colors = this.state.colors?.update({\n scaleType: colorScaleType,\n lowerPercentile,\n upperPercentile\n });\n const elevations = this.state.elevations?.update({\n scaleType: elevationScaleType,\n lowerPercentile: elevationLowerPercentile,\n upperPercentile: elevationUpperPercentile\n });\n if (!colors || !elevations) {\n return null;\n }\n return new CellLayerClass(this.getSubLayerProps({\n id: 'cells'\n }), {\n data: {\n length: aggregator.binCount,\n attributes: {\n getBin: binAttribute,\n getColorValue: colors.attribute,\n getElevationValue: elevations.attribute\n }\n },\n // Data has changed shallowly, but we likely don't need to update the attributes\n dataComparator: (data, oldData) => data.length === oldData.length,\n updateTriggers: {\n getBin: [binAttribute],\n getColorValue: [colors.attribute],\n getElevationValue: [elevations.attribute]\n },\n diskResolution: 6,\n vertices: HexbinVertices,\n radius: radiusCommon,\n hexOriginCommon,\n elevationScale,\n colorRange,\n colorScaleType,\n elevationRange,\n extruded,\n coverage,\n material,\n colorDomain: colors.domain || colorDomain || aggregator.getResultDomain(0),\n elevationDomain: elevations.domain || elevationDomain || aggregator.getResultDomain(1),\n colorCutoff: colors.cutoff,\n elevationCutoff: elevations.cutoff,\n transitions: transitions && {\n getFillColor: transitions.getColorValue || transitions.getColorWeight,\n getElevation: transitions.getElevationValue || transitions.getElevationWeight\n },\n // Extensions are already handled by the GPUAggregator, do not pass it down\n extensions: []\n });\n }\n getPickingInfo(params) {\n const info = params.info;\n const { index } = info;\n if (index >= 0) {\n const bin = this.state.aggregator.getBin(index);\n let object;\n if (bin) {\n const centroidCommon = getHexbinCentroid(bin.id, this.state.radiusCommon);\n const centroid = this.context.viewport.unprojectFlat(centroidCommon);\n object = {\n col: bin.id[0],\n row: bin.id[1],\n position: centroid,\n colorValue: bin.value[0],\n elevationValue: bin.value[1],\n count: bin.count\n };\n if (bin.pointIndices) {\n object.pointIndices = bin.pointIndices;\n object.points = Array.isArray(this.props.data)\n ? bin.pointIndices.map(i => this.props.data[i])\n : [];\n }\n }\n info.object = object;\n }\n return info;\n }\n}\nHexagonLayer.layerName = 'HexagonLayer';\nHexagonLayer.defaultProps = defaultProps;\nexport default HexagonLayer;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/** Applies a scale to BinaryAttribute */\nexport class AttributeWithScale {\n constructor(input, inputLength) {\n this.props = {\n scaleType: 'linear',\n lowerPercentile: 0,\n upperPercentile: 100\n };\n /** [min, max] of attribute values, or null if unknown */\n this.domain = null;\n /** Valid domain if lower/upper percentile are defined */\n this.cutoff = null;\n this.input = input;\n this.inputLength = inputLength;\n // No processing is needed with the default scale\n this.attribute = input;\n }\n getScalePercentile() {\n if (!this._percentile) {\n const value = getAttributeValue(this.input, this.inputLength);\n this._percentile = applyScaleQuantile(value);\n }\n return this._percentile;\n }\n getScaleOrdinal() {\n if (!this._ordinal) {\n const value = getAttributeValue(this.input, this.inputLength);\n this._ordinal = applyScaleOrdinal(value);\n }\n return this._ordinal;\n }\n /** Returns the [lowerCutoff, upperCutoff] of scaled values, or null if not applicable */\n getCutoff({ scaleType, lowerPercentile, upperPercentile }) {\n if (scaleType === 'quantile') {\n return [lowerPercentile, upperPercentile - 1];\n }\n if (lowerPercentile > 0 || upperPercentile < 100) {\n const { domain: thresholds } = this.getScalePercentile();\n let lowValue = thresholds[Math.floor(lowerPercentile) - 1] ?? -Infinity;\n let highValue = thresholds[Math.floor(upperPercentile) - 1] ?? Infinity;\n if (scaleType === 'ordinal') {\n const { domain: sortedUniqueValues } = this.getScaleOrdinal();\n lowValue = sortedUniqueValues.findIndex(x => x >= lowValue);\n highValue = sortedUniqueValues.findIndex(x => x > highValue) - 1;\n if (highValue === -2) {\n highValue = sortedUniqueValues.length - 1;\n }\n }\n return [lowValue, highValue];\n }\n return null;\n }\n update(props) {\n const oldProps = this.props;\n if (props.scaleType !== oldProps.scaleType) {\n switch (props.scaleType) {\n case 'quantile': {\n const { attribute } = this.getScalePercentile();\n this.attribute = attribute;\n this.domain = [0, 99];\n break;\n }\n case 'ordinal': {\n const { attribute, domain } = this.getScaleOrdinal();\n this.attribute = attribute;\n this.domain = [0, domain.length - 1];\n break;\n }\n default:\n this.attribute = this.input;\n this.domain = null;\n }\n }\n if (props.scaleType !== oldProps.scaleType ||\n props.lowerPercentile !== oldProps.lowerPercentile ||\n props.upperPercentile !== oldProps.upperPercentile) {\n this.cutoff = this.getCutoff(props);\n }\n this.props = props;\n return this;\n }\n}\n/**\n * Transform an array of values to ordinal indices\n */\nexport function applyScaleOrdinal(values) {\n const uniqueValues = new Set();\n for (const x of values) {\n if (Number.isFinite(x)) {\n uniqueValues.add(x);\n }\n }\n const sortedUniqueValues = Array.from(uniqueValues).sort();\n const domainMap = new Map();\n for (let i = 0; i < sortedUniqueValues.length; i++) {\n domainMap.set(sortedUniqueValues[i], i);\n }\n return {\n attribute: {\n value: values.map(x => (Number.isFinite(x) ? domainMap.get(x) : NaN)),\n type: 'float32',\n size: 1\n },\n domain: sortedUniqueValues\n };\n}\n/**\n * Transform an array of values to percentiles\n */\nexport function applyScaleQuantile(values, rangeLength = 100) {\n const sortedValues = Array.from(values).filter(Number.isFinite).sort(ascending);\n let i = 0;\n const n = Math.max(1, rangeLength);\n const thresholds = new Array(n - 1);\n while (++i < n) {\n thresholds[i - 1] = threshold(sortedValues, i / n);\n }\n return {\n attribute: {\n value: values.map(x => (Number.isFinite(x) ? bisectRight(thresholds, x) : NaN)),\n type: 'float32',\n size: 1\n },\n domain: thresholds\n };\n}\nfunction getAttributeValue(attribute, length) {\n const elementStride = (attribute.stride ?? 4) / 4;\n const elementOffset = (attribute.offset ?? 0) / 4;\n let value = attribute.value;\n if (!value) {\n const bytes = attribute.buffer?.readSyncWebGL(0, elementStride * 4 * length);\n if (bytes) {\n value = new Float32Array(bytes.buffer);\n attribute.value = value;\n }\n }\n if (elementStride === 1) {\n return value.subarray(0, length);\n }\n const result = new Float32Array(length);\n for (let i = 0; i < length; i++) {\n result[i] = value[i * elementStride + elementOffset];\n }\n return result;\n}\nfunction ascending(a, b) {\n return a - b;\n}\nfunction threshold(domain, fraction) {\n const domainLength = domain.length;\n if (fraction <= 0 || domainLength < 2) {\n return domain[0];\n }\n if (fraction >= 1) {\n return domain[domainLength - 1];\n }\n const domainFraction = (domainLength - 1) * fraction;\n const lowIndex = Math.floor(domainFraction);\n const low = domain[lowIndex];\n const high = domain[lowIndex + 1];\n return low + (high - low) * (domainFraction - lowIndex);\n}\nfunction bisectRight(a, x) {\n let lo = 0;\n let hi = a.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (a[mid] > x) {\n hi = mid;\n }\n else {\n lo = mid + 1;\n }\n }\n return lo;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/** Utility to estimate binIdRange as expected by AggregatorProps */\nexport function getBinIdRange({ dataBounds, getBinId, padding = 0 }) {\n const corners = [\n dataBounds[0],\n dataBounds[1],\n [dataBounds[0][0], dataBounds[1][1]],\n [dataBounds[1][0], dataBounds[0][1]]\n ].map(p => getBinId(p));\n const minX = Math.min(...corners.map(p => p[0])) - padding;\n const minY = Math.min(...corners.map(p => p[1])) - padding;\n const maxX = Math.max(...corners.map(p => p[0])) + padding + 1;\n const maxY = Math.max(...corners.map(p => p[1])) + padding + 1;\n return [\n [minX, maxX],\n [minY, maxY]\n ];\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { ColumnLayer } from '@deck.gl/layers';\nimport { createColorRangeTexture, updateColorRangeTexture } from \"../common/utils/color-utils.js\";\nimport vs from \"./hexagon-cell-layer-vertex.glsl.js\";\nimport { hexagonUniforms } from \"./hexagon-layer-uniforms.js\";\nclass HexagonCellLayer extends ColumnLayer {\n getShaders() {\n const shaders = super.getShaders();\n shaders.modules.push(hexagonUniforms);\n return { ...shaders, vs };\n }\n initializeState() {\n super.initializeState();\n const attributeManager = this.getAttributeManager();\n attributeManager.remove([\n 'instanceElevations',\n 'instanceFillColors',\n 'instanceLineColors',\n 'instanceStrokeWidths'\n ]);\n attributeManager.addInstanced({\n instancePositions: {\n size: 2,\n type: 'float32',\n accessor: 'getBin'\n },\n instanceColorValues: {\n size: 1,\n type: 'float32',\n accessor: 'getColorValue'\n },\n instanceElevationValues: {\n size: 1,\n type: 'float32',\n accessor: 'getElevationValue'\n }\n });\n }\n updateState(params) {\n super.updateState(params);\n const { props, oldProps } = params;\n const model = this.state.fillModel;\n if (oldProps.colorRange !== props.colorRange) {\n this.state.colorTexture?.destroy();\n this.state.colorTexture = createColorRangeTexture(this.context.device, props.colorRange, props.colorScaleType);\n const hexagonProps = { colorRange: this.state.colorTexture };\n model.shaderInputs.setProps({ hexagon: hexagonProps });\n }\n else if (oldProps.colorScaleType !== props.colorScaleType) {\n updateColorRangeTexture(this.state.colorTexture, props.colorScaleType);\n }\n }\n finalizeState(context) {\n super.finalizeState(context);\n this.state.colorTexture?.destroy();\n }\n draw({ uniforms }) {\n const { radius, hexOriginCommon, elevationRange, elevationScale, extruded, coverage, colorDomain, elevationDomain } = this.props;\n const colorCutoff = this.props.colorCutoff || [-Infinity, Infinity];\n const elevationCutoff = this.props.elevationCutoff || [-Infinity, Infinity];\n const fillModel = this.state.fillModel;\n if (fillModel.vertexArray.indexBuffer) {\n // indices are for drawing wireframe, disable them\n // TODO - this should be handled in ColumnLayer?\n fillModel.setIndexBuffer(null);\n }\n fillModel.setVertexCount(this.state.fillVertexCount);\n const hexagonProps = {\n colorDomain: [\n Math.max(colorDomain[0], colorCutoff[0]), // instanceColorValue that maps to colorRange[0]\n Math.min(colorDomain[1], colorCutoff[1]), // instanceColorValue that maps to colorRange[colorRange.length - 1]\n Math.max(colorDomain[0] - 1, colorCutoff[0]), // hide cell if instanceColorValue is less than this\n Math.min(colorDomain[1] + 1, colorCutoff[1]) // hide cell if instanceColorValue is greater than this\n ],\n elevationDomain: [\n Math.max(elevationDomain[0], elevationCutoff[0]), // instanceElevationValue that maps to elevationRange[0]\n Math.min(elevationDomain[1], elevationCutoff[1]), // instanceElevationValue that maps to elevationRange[elevationRange.length - 1]\n Math.max(elevationDomain[0] - 1, elevationCutoff[0]), // hide cell if instanceElevationValue is less than this\n Math.min(elevationDomain[1] + 1, elevationCutoff[1]) // hide cell if instanceElevationValue is greater than this\n ],\n elevationRange: [elevationRange[0] * elevationScale, elevationRange[1] * elevationScale],\n originCommon: hexOriginCommon\n };\n fillModel.shaderInputs.setProps({\n column: { extruded, coverage, radius },\n hexagon: hexagonProps\n });\n fillModel.draw(this.context.renderPass);\n }\n}\nHexagonCellLayer.layerName = 'HexagonCellLayer';\nexport default HexagonCellLayer;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst THIRD_PI = Math.PI / 3;\nconst DIST_X = 2 * Math.sin(THIRD_PI);\nconst DIST_Y = 1.5;\nexport const HexbinVertices = Array.from({ length: 6 }, (_, i) => {\n const angle = i * THIRD_PI;\n return [Math.sin(angle), -Math.cos(angle)];\n});\n/**\n * Adapted from d3-hexbin\n * Copyright Mike Bostock, 2012-2016\n All rights reserved.\n * https://github.com/d3/d3-hexbin/blob/master/src/hexbin.js\n *\n * Returns the hexbin that a point (x,y) falls into\n */\nexport function pointToHexbin([px, py], radius) {\n let pj = Math.round((py = py / radius / DIST_Y));\n let pi = Math.round((px = px / radius / DIST_X - (pj & 1) / 2));\n const py1 = py - pj;\n if (Math.abs(py1) * 3 > 1) {\n const px1 = px - pi;\n const pi2 = pi + (px < pi ? -1 : 1) / 2;\n const pj2 = pj + (py < pj ? -1 : 1);\n const px2 = px - pi2;\n const py2 = py - pj2;\n if (px1 * px1 + py1 * py1 > px2 * px2 + py2 * py2) {\n pi = pi2 + (pj & 1 ? 1 : -1) / 2;\n pj = pj2;\n }\n }\n return [pi, pj];\n}\nexport const pointToHexbinGLSL = /* glsl */ `\nconst vec2 DIST = vec2(${DIST_X}, ${DIST_Y});\n\nivec2 pointToHexbin(vec2 p, float radius) {\n p /= radius * DIST;\n float pj = round(p.y);\n float pjm2 = mod(pj, 2.0);\n p.x -= pjm2 * 0.5;\n float pi = round(p.x);\n vec2 d1 = p - vec2(pi, pj);\n\n if (abs(d1.y) * 3. > 1.) {\n vec2 v2 = step(0.0, d1) - 0.5;\n v2.y *= 2.0;\n vec2 d2 = d1 - v2;\n if (dot(d1, d1) > dot(d2, d2)) {\n pi += v2.x + pjm2 - 0.5;\n pj += v2.y;\n }\n }\n return ivec2(pi, pj);\n}\n`;\nexport function getHexbinCentroid([i, j], radius) {\n return [(i + (j & 1) / 2) * radius * DIST_X, j * radius * DIST_Y];\n}\nexport const getHexbinCentroidGLSL = `\nconst vec2 DIST = vec2(${DIST_X}, ${DIST_Y});\n\nvec2 hexbinCentroid(vec2 binId, float radius) {\n binId.x += fract(binId.y * 0.5);\n return binId * DIST * radius;\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { getHexbinCentroidGLSL } from \"./hexbin.js\";\nexport default /* glsl */ `\\\n#version 300 es\n#define SHADER_NAME hexagon-cell-layer-vertex-shader\nin vec3 positions;\nin vec3 normals;\nin vec2 instancePositions;\nin float instanceElevationValues;\nin float instanceColorValues;\nin vec3 instancePickingColors;\nuniform sampler2D colorRange;\nout vec4 vColor;\n${getHexbinCentroidGLSL}\nfloat interp(float value, vec2 domain, vec2 range) {\nfloat r = min(max((value - domain.x) / (domain.y - domain.x), 0.), 1.);\nreturn mix(range.x, range.y, r);\n}\nvec4 interp(float value, vec2 domain, sampler2D range) {\nfloat r = (value - domain.x) / (domain.y - domain.x);\nreturn texture(range, vec2(r, 0.5));\n}\nvoid main(void) {\ngeometry.pickingColor = instancePickingColors;\nif (isnan(instanceColorValues) ||\ninstanceColorValues < hexagon.colorDomain.z ||\ninstanceColorValues > hexagon.colorDomain.w ||\ninstanceElevationValues < hexagon.elevationDomain.z ||\ninstanceElevationValues > hexagon.elevationDomain.w\n) {\ngl_Position = vec4(0.);\nreturn;\n}\nvec2 commonPosition = hexbinCentroid(instancePositions, column.radius) + (hexagon.originCommon - project.commonOrigin.xy);\ncommonPosition += positions.xy * column.radius * column.coverage;\ngeometry.position = vec4(commonPosition, 0.0, 1.0);\ngeometry.normal = project_normal(normals);\nfloat elevation = 0.0;\nif (column.extruded) {\nelevation = interp(instanceElevationValues, hexagon.elevationDomain.xy, hexagon.elevationRange);\nelevation = project_size(elevation);\ngeometry.position.z = (positions.z + 1.0) / 2.0 * elevation;\n}\ngl_Position = project_common_position_to_clipspace(geometry.position);\nDECKGL_FILTER_GL_POSITION(gl_Position, geometry);\nvColor = interp(instanceColorValues, hexagon.colorDomain.xy, colorRange);\nvColor.a *= layer.opacity;\nif (column.extruded) {\nvColor.rgb = lighting_getLightColor(vColor.rgb, project.cameraPosition, geometry.position.xyz, geometry.normal);\n}\nDECKGL_FILTER_COLOR(vColor, geometry);\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = /* glsl */ `\\\nuniform hexagonUniforms {\n vec4 colorDomain;\n vec4 elevationDomain;\n vec2 elevationRange;\n vec2 originCommon;\n} hexagon;\n`;\nexport const hexagonUniforms = {\n name: 'hexagon',\n vs: uniformBlock,\n uniformTypes: {\n colorDomain: 'vec4<f32>',\n elevationDomain: 'vec4<f32>',\n elevationRange: 'vec2<f32>',\n originCommon: 'vec2<f32>'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = /* glsl */ `\\\nuniform binOptionsUniforms {\n vec2 hexOriginCommon;\n float radiusCommon;\n} binOptions;\n`;\nexport const binOptionsUniforms = {\n name: 'binOptions',\n vs: uniformBlock,\n uniformTypes: {\n hexOriginCommon: 'vec2<f32>',\n radiusCommon: 'f32'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { COORDINATE_SYSTEM, project32, Viewport, _deepEqual } from '@deck.gl/core';\nimport { PathLayer, SolidPolygonLayer } from '@deck.gl/layers';\nimport { WebGLAggregator, CPUAggregator } from \"../common/aggregator/index.js\";\nimport AggregationLayer from \"../common/aggregation-layer.js\";\nimport { generateContours } from \"./contour-utils.js\";\nimport { getAggregatorValueReader } from \"./value-reader.js\";\nimport { getBinIdRange } from \"../common/utils/bounds-utils.js\";\nimport { Matrix4 } from '@math.gl/core';\nimport { binOptionsUniforms } from \"./bin-options-uniforms.js\";\nconst DEFAULT_COLOR = [255, 255, 255, 255];\nconst DEFAULT_STROKE_WIDTH = 1;\nconst defaultProps = {\n // grid aggregation\n cellSize: { type: 'number', min: 1, value: 1000 },\n gridOrigin: { type: 'array', compare: true, value: [0, 0] },\n getPosition: { type: 'accessor', value: (x) => x.position },\n getWeight: { type: 'accessor', value: 1 },\n gpuAggregation: true,\n aggregation: 'SUM',\n // contour lines\n contours: {\n type: 'object',\n value: [{ threshold: 1 }],\n optional: true,\n compare: 3\n },\n zOffset: 0.005\n};\n/** Aggregate data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. */\nclass GridLayer extends AggregationLayer {\n getAggregatorType() {\n return this.props.gpuAggregation && WebGLAggregator.isSupported(this.context.device)\n ? 'gpu'\n : 'cpu';\n }\n createAggregator(type) {\n if (type === 'cpu') {\n return new CPUAggregator({\n dimensions: 2,\n getBin: {\n sources: ['positions'],\n getValue: ({ positions }, index, opts) => {\n const viewport = this.state.aggregatorViewport;\n // project to common space\n const p = viewport.projectPosition(positions);\n const { cellSizeCommon, cellOriginCommon } = opts;\n return [\n Math.floor((p[0] - cellOriginCommon[0]) / cellSizeCommon[0]),\n Math.floor((p[1] - cellOriginCommon[1]) / cellSizeCommon[1])\n ];\n }\n },\n getValue: [{ sources: ['counts'], getValue: ({ counts }) => counts }],\n onUpdate: this._onAggregationUpdate.bind(this)\n });\n }\n return new WebGLAggregator(this.context.device, {\n dimensions: 2,\n channelCount: 1,\n bufferLayout: this.getAttributeManager().getBufferLayouts({ isInstanced: false }),\n ...super.getShaders({\n modules: [project32, binOptionsUniforms],\n vs: /* glsl */ `\n in vec3 positions;\n in vec3 positions64Low;\n in float counts;\n\n void getBin(out ivec2 binId) {\n vec3 positionCommon = project_position(positions, positions64Low);\n vec2 gridCoords = floor(positionCommon.xy / binOptions.cellSizeCommon);\n binId = ivec2(gridCoords);\n }\n void getValue(out float value) {\n value = counts;\n }\n `\n }),\n onUpdate: this._onAggregationUpdate.bind(this)\n });\n }\n initializeState() {\n super.initializeState();\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: {\n size: 3,\n accessor: 'getPosition',\n type: 'float64',\n fp64: this.use64bitPositions()\n },\n counts: { size: 1, accessor: 'getWeight' }\n });\n }\n updateState(params) {\n const aggregatorChanged = super.updateState(params);\n const { props, oldProps, changeFlags } = params;\n const { aggregator } = this.state;\n if (aggregatorChanged ||\n changeFlags.dataChanged ||\n props.cellSize !== oldProps.cellSize ||\n !_deepEqual(props.gridOrigin, oldProps.gridOrigin, 1) ||\n props.aggregation !== oldProps.aggregation) {\n this._updateBinOptions();\n const { cellSizeCommon, cellOriginCommon, binIdRange } = this.state;\n aggregator.setProps({\n // @ts-expect-error only used by GPUAggregator\n binIdRange,\n pointCount: this.getNumInstances(),\n operations: [props.aggregation],\n binOptions: {\n cellSizeCommon,\n cellOriginCommon\n }\n });\n }\n if (!_deepEqual(oldProps.contours, props.contours, 2)) {\n // Recalculate contours\n this.setState({ contourData: null });\n }\n return aggregatorChanged;\n }\n _updateBinOptions() {\n const bounds = this.getBounds();\n const cellSizeCommon = [1, 1];\n let cellOriginCommon = [0, 0];\n let binIdRange = [\n [0, 1],\n [0, 1]\n ];\n let viewport = this.context.viewport;\n if (bounds && Number.isFinite(bounds[0][0])) {\n let centroid = [(bounds[0][0] + bounds[1][0]) / 2, (bounds[0][1] + bounds[1][1]) / 2];\n const { cellSize, gridOrigin } = this.props;\n const { unitsPerMeter } = viewport.getDistanceScales(centroid);\n cellSizeCommon[0] = unitsPerMeter[0] * cellSize;\n cellSizeCommon[1] = unitsPerMeter[1] * cellSize;\n // Offset common space to center at the origin of the grid cell where the data center is in\n // This improves precision without affecting the cell positions\n const centroidCommon = viewport.projectFlat(centroid);\n cellOriginCommon = [\n Math.floor((centroidCommon[0] - gridOrigin[0]) / cellSizeCommon[0]) * cellSizeCommon[0] +\n gridOrigin[0],\n Math.floor((centroidCommon[1] - gridOrigin[1]) / cellSizeCommon[1]) * cellSizeCommon[1] +\n gridOrigin[1]\n ];\n centroid = viewport.unprojectFlat(cellOriginCommon);\n const ViewportType = viewport.constructor;\n // We construct a viewport for the GPU aggregator's project module\n // This viewport is determined by data\n // removes arbitrary precision variance that depends on initial view state\n viewport = viewport.isGeospatial\n ? new ViewportType({ longitude: centroid[0], latitude: centroid[1], zoom: 12 })\n : new Viewport({ position: [centroid[0], centroid[1], 0], zoom: 12 });\n // Round to the nearest 32-bit float to match CPU and GPU results\n cellOriginCommon = [Math.fround(viewport.center[0]), Math.fround(viewport.center[1])];\n binIdRange = getBinIdRange({\n dataBounds: bounds,\n getBinId: (p) => {\n const positionCommon = viewport.projectFlat(p);\n return [\n Math.floor((positionCommon[0] - cellOriginCommon[0]) / cellSizeCommon[0]),\n Math.floor((positionCommon[1] - cellOriginCommon[1]) / cellSizeCommon[1])\n ];\n }\n });\n }\n this.setState({ cellSizeCommon, cellOriginCommon, binIdRange, aggregatorViewport: viewport });\n }\n draw(opts) {\n // Replaces render time viewport with our own\n if (opts.shaderModuleProps.project) {\n opts.shaderModuleProps.project.viewport = this.state.aggregatorViewport;\n }\n super.draw(opts);\n }\n _onAggregationUpdate() {\n const { aggregator, binIdRange } = this.state;\n this.setState({\n aggregatedValueReader: getAggregatorValueReader({ aggregator, binIdRange, channel: 0 }),\n contourData: null\n });\n }\n _getContours() {\n const { aggregatedValueReader } = this.state;\n if (!aggregatedValueReader) {\n return null;\n }\n if (!this.state.contourData) {\n const { binIdRange } = this.state;\n const { contours } = this.props;\n const contourData = generateContours({\n contours,\n getValue: aggregatedValueReader,\n xRange: binIdRange[0],\n yRange: binIdRange[1]\n });\n this.state.contourData = contourData;\n }\n return this.state.contourData;\n }\n onAttributeChange(id) {\n const { aggregator } = this.state;\n switch (id) {\n case 'positions':\n aggregator.setNeedsUpdate();\n this._updateBinOptions();\n const { cellSizeCommon, cellOriginCommon, binIdRange } = this.state;\n aggregator.setProps({\n // @ts-expect-error only used by GPUAggregator\n binIdRange,\n binOptions: {\n cellSizeCommon,\n cellOriginCommon\n }\n });\n break;\n case 'counts':\n aggregator.setNeedsUpdate(0);\n break;\n default:\n // This should not happen\n }\n }\n renderLayers() {\n const contourData = this._getContours();\n if (!contourData) {\n return null;\n }\n const { lines, polygons } = contourData;\n const { zOffset } = this.props;\n const { cellOriginCommon, cellSizeCommon } = this.state;\n const LinesSubLayerClass = this.getSubLayerClass('lines', PathLayer);\n const BandsSubLayerClass = this.getSubLayerClass('bands', SolidPolygonLayer);\n const modelMatrix = new Matrix4()\n .translate([cellOriginCommon[0], cellOriginCommon[1], 0])\n .scale([cellSizeCommon[0], cellSizeCommon[1], zOffset]);\n // Contour lines layer\n const lineLayer = lines &&\n lines.length > 0 &&\n new LinesSubLayerClass(this.getSubLayerProps({\n id: 'lines'\n }), {\n data: lines,\n coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,\n modelMatrix,\n getPath: d => d.vertices,\n getColor: d => d.contour.color ?? DEFAULT_COLOR,\n getWidth: d => d.contour.strokeWidth ?? DEFAULT_STROKE_WIDTH,\n widthUnits: 'pixels'\n });\n // Contour bands layer\n const bandsLayer = polygons &&\n polygons.length > 0 &&\n new BandsSubLayerClass(this.getSubLayerProps({\n id: 'bands'\n }), {\n data: polygons,\n coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,\n modelMatrix,\n getPolygon: d => d.vertices,\n getFillColor: d => d.contour.color ?? DEFAULT_COLOR\n });\n return [lineLayer, bandsLayer];\n }\n getPickingInfo(params) {\n const info = params.info;\n const { object } = info;\n if (object) {\n info.object = {\n contour: object.contour\n };\n }\n return info;\n }\n}\nGridLayer.layerName = 'ContourLayer';\nGridLayer.defaultProps = defaultProps;\nexport default GridLayer;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Code to Offsets Map needed to implement Marching Squares algorithm\n// Ref: https://en.wikipedia.org/wiki/Marching_squares\n// Table to map code to the intersection offsets\n// All offsets are relative to the center of marching cell (which is top right corner of grid-cell, and center of marching-square)\nconst HALF = 0.5;\nconst ONE6TH = 1 / 6;\nconst OFFSET = {\n N: [0, HALF], // NORTH\n E: [HALF, 0], // EAST\n S: [0, -HALF], // SOUTH\n W: [-HALF, 0], // WEST\n // CORNERS\n NE: [HALF, HALF],\n NW: [-HALF, HALF],\n SE: [HALF, -HALF],\n SW: [-HALF, -HALF]\n};\n// NOTE: vertices are ordered in CCW direction, starting from NW corner\n// Triangles\nconst SW_TRIANGLE = [OFFSET.W, OFFSET.SW, OFFSET.S];\nconst SE_TRIANGLE = [OFFSET.S, OFFSET.SE, OFFSET.E];\nconst NE_TRIANGLE = [OFFSET.E, OFFSET.NE, OFFSET.N];\nconst NW_TRIANGLE = [OFFSET.NW, OFFSET.W, OFFSET.N];\n// Trapezoids\nconst SW_TRAPEZOID = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF]\n];\nconst SE_TRAPEZOID = [\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n [HALF, -ONE6TH],\n [HALF, ONE6TH]\n];\nconst NE_TRAPEZOID = [\n [HALF, -ONE6TH],\n [HALF, ONE6TH],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\nconst NW_TRAPEZOID = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\n// Rectangles\nconst S_RECTANGLE = [OFFSET.W, OFFSET.SW, OFFSET.SE, OFFSET.E];\nconst E_RECTANGLE = [OFFSET.S, OFFSET.SE, OFFSET.NE, OFFSET.N];\nconst N_RECTANGLE = [OFFSET.NW, OFFSET.W, OFFSET.E, OFFSET.NE];\nconst W_RECTANGLE = [OFFSET.NW, OFFSET.SW, OFFSET.S, OFFSET.N];\nconst EW_RECTANGEL = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [HALF, -ONE6TH],\n [HALF, ONE6TH]\n];\nconst SN_RECTANGEL = [\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\n// Square\nconst SQUARE = [OFFSET.NW, OFFSET.SW, OFFSET.SE, OFFSET.NE];\n// Pentagons\nconst SW_PENTAGON = [OFFSET.NW, OFFSET.SW, OFFSET.SE, OFFSET.E, OFFSET.N];\nconst SE_PENTAGON = [OFFSET.W, OFFSET.SW, OFFSET.SE, OFFSET.NE, OFFSET.N];\nconst NE_PENTAGON = [OFFSET.NW, OFFSET.W, OFFSET.S, OFFSET.SE, OFFSET.NE];\nconst NW_PENTAGON = [OFFSET.NW, OFFSET.SW, OFFSET.S, OFFSET.E, OFFSET.NE];\nconst NW_N_PENTAGON = [OFFSET.NW, OFFSET.W, [HALF, -ONE6TH], [HALF, ONE6TH], OFFSET.N];\nconst NE_E_PENTAGON = [[-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.E, OFFSET.NE, OFFSET.N];\nconst SE_S_PENTAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.S, OFFSET.SE, OFFSET.E];\nconst SW_W_PENTAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, [ONE6TH, HALF], [-ONE6TH, HALF]];\nconst NW_W_PENTAGON = [OFFSET.NW, OFFSET.W, [-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.N];\nconst NE_N_PENTAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.E, OFFSET.NE, OFFSET.N];\nconst SE_E_PENTAGON = [OFFSET.S, OFFSET.SE, OFFSET.E, [ONE6TH, HALF], [-ONE6TH, HALF]];\nconst SW_S_PENTAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, [HALF, -ONE6TH], [HALF, ONE6TH]];\n// Hexagon\nconst S_HEXAGON = [OFFSET.W, OFFSET.SW, OFFSET.SE, OFFSET.E, [ONE6TH, HALF], [-ONE6TH, HALF]];\nconst E_HEXAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.S, OFFSET.SE, OFFSET.NE, OFFSET.N];\nconst N_HEXAGON = [OFFSET.NW, OFFSET.W, [-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.E, OFFSET.NE];\nconst W_HEXAGON = [OFFSET.NW, OFFSET.SW, OFFSET.S, [HALF, -ONE6TH], [HALF, ONE6TH], OFFSET.N];\nconst SW_NE_HEXAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, OFFSET.E, OFFSET.NE, OFFSET.N];\nconst NW_SE_HEXAGON = [OFFSET.NW, OFFSET.W, OFFSET.S, OFFSET.SE, OFFSET.E, OFFSET.N];\n// Heptagon (7-sided)\nconst NE_HEPTAGON = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n OFFSET.E,\n OFFSET.NE,\n OFFSET.N\n];\nconst SW_HEPTAGON = [\n OFFSET.W,\n OFFSET.SW,\n OFFSET.S,\n [HALF, -ONE6TH],\n [HALF, ONE6TH],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\nconst NW_HEPTAGON = [\n OFFSET.NW,\n OFFSET.W,\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n [HALF, -ONE6TH],\n [HALF, ONE6TH],\n OFFSET.N\n];\nconst SE_HEPTAGON = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n OFFSET.S,\n OFFSET.SE,\n OFFSET.E,\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\n// Octagon\nconst OCTAGON = [\n [-HALF, ONE6TH],\n [-HALF, -ONE6TH],\n [-ONE6TH, -HALF],\n [ONE6TH, -HALF],\n [HALF, -ONE6TH],\n [HALF, ONE6TH],\n [ONE6TH, HALF],\n [-ONE6TH, HALF]\n];\n// Note: above wiki page invertes white/black dots for generating the code, we don't\nexport const ISOLINES_CODE_OFFSET_MAP = {\n // key is equal to the code of 4 vertices (invert the code specified in wiki)\n // value can be an array or an Object\n // Array : [line] or [line, line], where each line is [start-point, end-point], and each point is [x, y]\n // Object : to handle saddle cases, whos output depends on mean value of all 4 corners\n // key: code of mean value (0 or 1)\n // value: Array , as above defines one or two line segments\n 0: [],\n 1: [[OFFSET.W, OFFSET.S]],\n 2: [[OFFSET.S, OFFSET.E]],\n 3: [[OFFSET.W, OFFSET.E]],\n 4: [[OFFSET.N, OFFSET.E]],\n 5: {\n 0: [\n [OFFSET.W, OFFSET.S],\n [OFFSET.N, OFFSET.E]\n ],\n 1: [\n [OFFSET.W, OFFSET.N],\n [OFFSET.S, OFFSET.E]\n ]\n },\n 6: [[OFFSET.N, OFFSET.S]],\n 7: [[OFFSET.W, OFFSET.N]],\n 8: [[OFFSET.W, OFFSET.N]],\n 9: [[OFFSET.N, OFFSET.S]],\n 10: {\n 0: [\n [OFFSET.W, OFFSET.N],\n [OFFSET.S, OFFSET.E]\n ],\n 1: [\n [OFFSET.W, OFFSET.S],\n [OFFSET.N, OFFSET.E]\n ]\n },\n 11: [[OFFSET.N, OFFSET.E]],\n 12: [[OFFSET.W, OFFSET.E]],\n 13: [[OFFSET.S, OFFSET.E]],\n 14: [[OFFSET.W, OFFSET.S]],\n 15: []\n};\nfunction ternaryToIndex(ternary) {\n return parseInt(ternary, 4);\n}\nexport const ISOBANDS_CODE_OFFSET_MAP = {\n // Below list of cases, follow the same order as in above mentioned wiki page.\n // Each case has its code on first commented line // T,TR,R,C\n // where T: Top, TR: Top-right, R: Right and C: current, each will be either 0, 1 or 2\n // final code is binary representation of above code , where takes 2 digits\n // for example: code 2-2-2-1 => 10-10-10-01 => 10101001 => 169\n // no contours\n [ternaryToIndex('0000')]: [],\n [ternaryToIndex('2222')]: [],\n // single triangle\n [ternaryToIndex('2221')]: [SW_TRIANGLE],\n [ternaryToIndex('2212')]: [SE_TRIANGLE],\n [ternaryToIndex('2122')]: [NE_TRIANGLE],\n [ternaryToIndex('1222')]: [NW_TRIANGLE],\n [ternaryToIndex('0001')]: [SW_TRIANGLE],\n [ternaryToIndex('0010')]: [SE_TRIANGLE],\n [ternaryToIndex('0100')]: [NE_TRIANGLE],\n [ternaryToIndex('1000')]: [NW_TRIANGLE],\n // single trapezoid\n [ternaryToIndex('2220')]: [SW_TRAPEZOID],\n [ternaryToIndex('2202')]: [SE_TRAPEZOID],\n [ternaryToIndex('2022')]: [NE_TRAPEZOID],\n [ternaryToIndex('0222')]: [NW_TRAPEZOID],\n [ternaryToIndex('0002')]: [SW_TRAPEZOID],\n [ternaryToIndex('0020')]: [SE_TRAPEZOID],\n [ternaryToIndex('0200')]: [NE_TRAPEZOID],\n [ternaryToIndex('2000')]: [NW_TRAPEZOID],\n // single rectangle\n [ternaryToIndex('0011')]: [S_RECTANGLE],\n [ternaryToIndex('0110')]: [E_RECTANGLE],\n [ternaryToIndex('1100')]: [N_RECTANGLE],\n [ternaryToIndex('1001')]: [W_RECTANGLE],\n [ternaryToIndex('2211')]: [S_RECTANGLE],\n [ternaryToIndex('2112')]: [E_RECTANGLE],\n [ternaryToIndex('1122')]: [N_RECTANGLE],\n [ternaryToIndex('1221')]: [W_RECTANGLE],\n [ternaryToIndex('2200')]: [EW_RECTANGEL],\n [ternaryToIndex('2002')]: [SN_RECTANGEL],\n [ternaryToIndex('0022')]: [EW_RECTANGEL],\n [ternaryToIndex('0220')]: [SN_RECTANGEL],\n // single square\n // 1111\n [ternaryToIndex('1111')]: [SQUARE],\n // single pentagon\n [ternaryToIndex('1211')]: [SW_PENTAGON],\n [ternaryToIndex('2111')]: [SE_PENTAGON],\n [ternaryToIndex('1112')]: [NE_PENTAGON],\n [ternaryToIndex('1121')]: [NW_PENTAGON],\n [ternaryToIndex('1011')]: [SW_PENTAGON],\n [ternaryToIndex('0111')]: [SE_PENTAGON],\n [ternaryToIndex('1110')]: [NE_PENTAGON],\n [ternaryToIndex('1101')]: [NW_PENTAGON],\n [ternaryToIndex('1200')]: [NW_N_PENTAGON],\n [ternaryToIndex('0120')]: [NE_E_PENTAGON],\n [ternaryToIndex('0012')]: [SE_S_PENTAGON],\n [ternaryToIndex('2001')]: [SW_W_PENTAGON],\n [ternaryToIndex('1022')]: [NW_N_PENTAGON],\n [ternaryToIndex('2102')]: [NE_E_PENTAGON],\n [ternaryToIndex('2210')]: [SE_S_PENTAGON],\n [ternaryToIndex('0221')]: [SW_W_PENTAGON],\n [ternaryToIndex('1002')]: [NW_W_PENTAGON],\n [ternaryToIndex('2100')]: [NE_N_PENTAGON],\n [ternaryToIndex('0210')]: [SE_E_PENTAGON],\n [ternaryToIndex('0021')]: [SW_S_PENTAGON],\n [ternaryToIndex('1220')]: [NW_W_PENTAGON],\n [ternaryToIndex('0122')]: [NE_N_PENTAGON],\n [ternaryToIndex('2012')]: [SE_E_PENTAGON],\n [ternaryToIndex('2201')]: [SW_S_PENTAGON],\n // single hexagon\n [ternaryToIndex('0211')]: [S_HEXAGON],\n [ternaryToIndex('2110')]: [E_HEXAGON],\n [ternaryToIndex('1102')]: [N_HEXAGON],\n [ternaryToIndex('1021')]: [W_HEXAGON],\n [ternaryToIndex('2011')]: [S_HEXAGON],\n [ternaryToIndex('0112')]: [E_HEXAGON],\n [ternaryToIndex('1120')]: [N_HEXAGON],\n [ternaryToIndex('1201')]: [W_HEXAGON],\n [ternaryToIndex('2101')]: [SW_NE_HEXAGON],\n [ternaryToIndex('0121')]: [SW_NE_HEXAGON],\n [ternaryToIndex('1012')]: [NW_SE_HEXAGON],\n [ternaryToIndex('1210')]: [NW_SE_HEXAGON],\n // 6-sided polygons based on mean weight\n // NOTE: merges mean value codes for extreme changes (as per above Wiki doc)\n [ternaryToIndex('0101')]: {\n 0: [SW_TRIANGLE, NE_TRIANGLE],\n 1: [SW_NE_HEXAGON],\n 2: [SW_NE_HEXAGON]\n },\n [ternaryToIndex('1010')]: {\n 0: [NW_TRIANGLE, SE_TRIANGLE],\n 1: [NW_SE_HEXAGON],\n 2: [NW_SE_HEXAGON]\n },\n [ternaryToIndex('2121')]: {\n 0: [SW_NE_HEXAGON],\n 1: [SW_NE_HEXAGON],\n 2: [SW_TRIANGLE, NE_TRIANGLE]\n },\n [ternaryToIndex('1212')]: {\n 0: [NW_SE_HEXAGON],\n 1: [NW_SE_HEXAGON],\n 2: [NW_TRIANGLE, SE_TRIANGLE]\n },\n // 7-sided polygons based on mean weight\n [ternaryToIndex('2120')]: {\n 0: [NE_HEPTAGON],\n 1: [NE_HEPTAGON],\n 2: [SW_TRAPEZOID, NE_TRIANGLE]\n },\n [ternaryToIndex('2021')]: {\n 0: [SW_HEPTAGON],\n 1: [SW_HEPTAGON],\n 2: [SW_TRIANGLE, NE_TRAPEZOID]\n },\n [ternaryToIndex('1202')]: {\n 0: [NW_HEPTAGON],\n 1: [NW_HEPTAGON],\n 2: [NW_TRIANGLE, SE_TRAPEZOID]\n },\n [ternaryToIndex('0212')]: {\n 0: [SE_HEPTAGON],\n 1: [SE_HEPTAGON],\n 2: [SE_TRIANGLE, NW_TRAPEZOID]\n },\n [ternaryToIndex('0102')]: {\n 0: [SW_TRAPEZOID, NE_TRIANGLE],\n 1: [NE_HEPTAGON],\n 2: [NE_HEPTAGON]\n },\n [ternaryToIndex('0201')]: {\n 0: [SW_TRIANGLE, NE_TRAPEZOID],\n 1: [SW_HEPTAGON],\n 2: [SW_HEPTAGON]\n },\n [ternaryToIndex('1020')]: {\n 0: [NW_TRIANGLE, SE_TRAPEZOID],\n 1: [NW_HEPTAGON],\n 2: [NW_HEPTAGON]\n },\n [ternaryToIndex('2010')]: {\n 0: [SE_TRIANGLE, NW_TRAPEZOID],\n 1: [SE_HEPTAGON],\n 2: [SE_HEPTAGON]\n },\n // 8-sided polygons based on mean weight\n [ternaryToIndex('2020')]: {\n 0: [NW_TRAPEZOID, SE_TRAPEZOID],\n 1: [OCTAGON],\n 2: [SW_TRAPEZOID, NE_TRAPEZOID]\n },\n [ternaryToIndex('0202')]: {\n 0: [NE_TRAPEZOID, SW_TRAPEZOID],\n 1: [OCTAGON],\n 2: [NW_TRAPEZOID, SE_TRAPEZOID]\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// All utility methods needed to implement Marching Squares algorithm\n// Ref: https://en.wikipedia.org/wiki/Marching_squares\nimport { ISOLINES_CODE_OFFSET_MAP, ISOBANDS_CODE_OFFSET_MAP } from \"./marching-squares-codes.js\";\n// Utility methods\nfunction getVertexCode(weight, threshold) {\n // threshold must be a single value or a range (array of size 2)\n if (Number.isNaN(weight)) {\n return 0;\n }\n // Iso-bands\n if (Array.isArray(threshold)) {\n if (weight < threshold[0]) {\n return 0;\n }\n return weight < threshold[1] ? 1 : 2;\n }\n // Iso-lines\n return weight >= threshold ? 1 : 0;\n}\n// Returns marching square code for given cell\n/* eslint-disable complexity, max-statements*/\nexport function getCode(opts) {\n // Assumptions\n // Origin is on bottom-left , and X increase to right, Y to top\n // When processing one cell, we process 4 cells, by extending row to top and on column to right\n // to create a 2X2 cell grid\n const { x, y, xRange, yRange, getValue, threshold } = opts;\n const isLeftBoundary = x < xRange[0];\n const isRightBoundary = x >= xRange[1] - 1;\n const isBottomBoundary = y < yRange[0];\n const isTopBoundary = y >= yRange[1] - 1;\n const isBoundary = isLeftBoundary || isRightBoundary || isBottomBoundary || isTopBoundary;\n let weights = 0;\n let current;\n let right;\n let top;\n let topRight;\n // TOP\n if (isLeftBoundary || isTopBoundary) {\n top = 0;\n }\n else {\n const w = getValue(x, y + 1);\n top = getVertexCode(w, threshold);\n weights += w;\n }\n // TOP-RIGHT\n if (isRightBoundary || isTopBoundary) {\n topRight = 0;\n }\n else {\n const w = getValue(x + 1, y + 1);\n topRight = getVertexCode(w, threshold);\n weights += w;\n }\n // RIGHT\n if (isRightBoundary || isBottomBoundary) {\n right = 0;\n }\n else {\n const w = getValue(x + 1, y);\n right = getVertexCode(w, threshold);\n weights += w;\n }\n // CURRENT\n if (isLeftBoundary || isBottomBoundary) {\n current = 0;\n }\n else {\n const w = getValue(x, y);\n current = getVertexCode(w, threshold);\n weights += w;\n }\n let code = -1;\n if (Number.isFinite(threshold)) {\n code = (top << 3) | (topRight << 2) | (right << 1) | current;\n }\n if (Array.isArray(threshold)) {\n code = (top << 6) | (topRight << 4) | (right << 2) | current;\n }\n let meanCode = 0;\n // meanCode is only needed for saddle cases, and they should\n // only occur when we are not processing a cell on boundary\n // because when on a boundary either, bottom-row, top-row, left-column or right-column will have both 0 codes\n if (!isBoundary) {\n meanCode = getVertexCode(weights / 4, threshold);\n }\n return { code, meanCode };\n}\n/* eslint-enable complexity, max-statements*/\n// Returns intersection vertices for given cellindex\n// [x, y] refers current marching cell, reference vertex is always top-right corner\nexport function getPolygons(opts) {\n const { x, y, z, code, meanCode } = opts;\n let offsets = ISOBANDS_CODE_OFFSET_MAP[code];\n // handle saddle cases\n if (!Array.isArray(offsets)) {\n offsets = offsets[meanCode];\n }\n // Reference vertex is at top-right move to top-right corner\n const rX = x + 1;\n const rY = y + 1;\n // offsets format\n // [[1A, 1B, 1C, ...], [2A, 2B, 2C, ...]],\n // vertices format\n // [\n // [[x1A, y1A], [x1B, y1B], [x1C, y1C] ... ],\n // ...\n // ]\n const polygons = [];\n offsets.forEach(polygonOffsets => {\n const polygon = [];\n polygonOffsets.forEach(xyOffset => {\n const vX = rX + xyOffset[0];\n const vY = rY + xyOffset[1];\n polygon.push([vX, vY, z]);\n });\n polygons.push(polygon);\n });\n return polygons;\n}\n// Returns intersection vertices for given cellindex\n// [x, y] refers current marching cell, reference vertex is always top-right corner\nexport function getLines(opts) {\n const { x, y, z, code, meanCode } = opts;\n let offsets = ISOLINES_CODE_OFFSET_MAP[code];\n // handle saddle cases\n if (!Array.isArray(offsets)) {\n offsets = offsets[meanCode];\n }\n // Reference vertex is at top-right move to top-right corner\n const rX = x + 1;\n const rY = y + 1;\n // offsets format\n // [[1A, 1B], [2A, 2B]],\n // vertices format\n // [[x1A, y1A], [x1B, y1B], [x2A, x2B], ...],\n const lines = [];\n offsets.forEach(xyOffsets => {\n xyOffsets.forEach(offset => {\n const vX = rX + offset[0];\n const vY = rY + offset[1];\n lines.push([vX, vY, z]);\n });\n });\n return lines;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { getCode, getLines, getPolygons } from \"./marching-squares.js\";\n// Given all the cell weights, generates contours for each threshold.\n/* eslint-disable max-depth */\nexport function generateContours({ contours, getValue, xRange, yRange }) {\n const contourLines = [];\n const contourPolygons = [];\n let segmentIndex = 0;\n let polygonIndex = 0;\n for (let i = 0; i < contours.length; i++) {\n const contour = contours[i];\n const z = contour.zIndex ?? i;\n const { threshold } = contour;\n for (let x = xRange[0] - 1; x < xRange[1]; x++) {\n for (let y = yRange[0] - 1; y < yRange[1]; y++) {\n // Get the MarchingSquares code based on neighbor cell weights.\n const { code, meanCode } = getCode({\n getValue,\n threshold,\n x,\n y,\n xRange,\n yRange\n });\n const opts = {\n x,\n y,\n z,\n code,\n meanCode\n };\n if (Array.isArray(threshold)) {\n // ISO bands\n const polygons = getPolygons(opts);\n for (const polygon of polygons) {\n contourPolygons[polygonIndex++] = {\n vertices: polygon,\n contour\n };\n }\n }\n else {\n // ISO lines\n const path = getLines(opts);\n if (path.length > 0) {\n contourLines[segmentIndex++] = {\n vertices: path,\n contour\n };\n }\n }\n }\n }\n }\n return { lines: contourLines, polygons: contourPolygons };\n}\n/* eslint-enable max-depth */\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CPUAggregator, WebGLAggregator } from \"../common/aggregator/index.js\";\n/** Returns an accessor to the aggregated values from bin id */\nexport function getAggregatorValueReader(opts) {\n const { aggregator, binIdRange, channel } = opts;\n if (aggregator instanceof WebGLAggregator) {\n const buffer = aggregator.getResult(channel)?.buffer;\n if (buffer) {\n const values = new Float32Array(buffer.readSyncWebGL().buffer);\n return getWebGLAggregatorValueReader(values, binIdRange);\n }\n }\n if (aggregator instanceof CPUAggregator) {\n const values = aggregator.getResult(channel)?.value;\n const ids = aggregator.getBins()?.value;\n if (ids && values) {\n return getCPUAggregatorValueReader(values, ids, aggregator.binCount);\n }\n }\n return null;\n}\nfunction getWebGLAggregatorValueReader(values, binIdRange) {\n const [[minX, maxX], [minY, maxY]] = binIdRange;\n const width = maxX - minX;\n const height = maxY - minY;\n return (x, y) => {\n x -= minX;\n y -= minY;\n if (x < 0 || x >= width || y < 0 || y >= height) {\n return NaN;\n }\n return values[y * width + x];\n };\n}\nfunction getCPUAggregatorValueReader(values, ids, count) {\n const idMap = {};\n for (let i = 0; i < count; i++) {\n const x = ids[i * 2];\n const y = ids[i * 2 + 1];\n idMap[x] = idMap[x] || {};\n idMap[x][y] = values[i];\n }\n return (x, y) => idMap[x]?.[y] ?? NaN;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = /* glsl */ `\\\nuniform binOptionsUniforms {\n vec2 cellOriginCommon;\n vec2 cellSizeCommon;\n} binOptions;\n`;\nexport const binOptionsUniforms = {\n name: 'binOptions',\n vs: uniformBlock,\n uniformTypes: {\n cellOriginCommon: 'vec2<f32>',\n cellSizeCommon: 'vec2<f32>'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log, createIterable, project32, Viewport } from '@deck.gl/core';\nimport { WebGLAggregator, CPUAggregator } from \"../common/aggregator/index.js\";\nimport AggregationLayer from \"../common/aggregation-layer.js\";\nimport { defaultColorRange } from \"../common/utils/color-utils.js\";\nimport { AttributeWithScale } from \"../common/utils/scale-utils.js\";\nimport { getBinIdRange } from \"../common/utils/bounds-utils.js\";\nimport { GridCellLayer } from \"./grid-cell-layer.js\";\nimport { binOptionsUniforms } from \"./bin-options-uniforms.js\";\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() { }\nconst defaultProps = {\n gpuAggregation: false,\n // color\n colorDomain: null,\n colorRange: defaultColorRange,\n getColorValue: { type: 'accessor', value: null }, // default value is calculated from `getColorWeight` and `colorAggregation`\n getColorWeight: { type: 'accessor', value: 1 },\n colorAggregation: 'SUM',\n lowerPercentile: { type: 'number', min: 0, max: 100, value: 0 },\n upperPercentile: { type: 'number', min: 0, max: 100, value: 100 },\n colorScaleType: 'quantize',\n onSetColorDomain: noop,\n // elevation\n elevationDomain: null,\n elevationRange: [0, 1000],\n getElevationValue: { type: 'accessor', value: null }, // default value is calculated from `getElevationWeight` and `elevationAggregation`\n getElevationWeight: { type: 'accessor', value: 1 },\n elevationAggregation: 'SUM',\n elevationScale: { type: 'number', min: 0, value: 1 },\n elevationLowerPercentile: { type: 'number', min: 0, max: 100, value: 0 },\n elevationUpperPercentile: { type: 'number', min: 0, max: 100, value: 100 },\n elevationScaleType: 'linear',\n onSetElevationDomain: noop,\n // grid\n cellSize: { type: 'number', min: 0, value: 1000 },\n coverage: { type: 'number', min: 0, max: 1, value: 1 },\n getPosition: { type: 'accessor', value: (x) => x.position },\n gridAggregator: { type: 'function', optional: true, value: null },\n extruded: false,\n // Optional material for 'lighting' shader module\n material: true\n};\n/** Aggregate data into a grid-based heatmap. The color and height of a cell are determined based on the objects it contains. */\nclass GridLayer extends AggregationLayer {\n getAggregatorType() {\n const { gpuAggregation, gridAggregator, getColorValue, getElevationValue } = this.props;\n if (gpuAggregation && (gridAggregator || getColorValue || getElevationValue)) {\n // If these features are desired by the app, the user should explicitly use CPU aggregation\n log.warn('Features not supported by GPU aggregation, falling back to CPU')();\n return 'cpu';\n }\n if (\n // GPU aggregation is requested\n gpuAggregation &&\n // GPU aggregation is supported by the device\n WebGLAggregator.isSupported(this.context.device)) {\n return 'gpu';\n }\n return 'cpu';\n }\n createAggregator(type) {\n if (type === 'cpu') {\n const { gridAggregator, cellSize } = this.props;\n return new CPUAggregator({\n dimensions: 2,\n getBin: {\n sources: ['positions'],\n getValue: ({ positions }, index, opts) => {\n if (gridAggregator) {\n return gridAggregator(positions, cellSize);\n }\n const viewport = this.state.aggregatorViewport;\n // project to common space\n const p = viewport.projectPosition(positions);\n const { cellSizeCommon, cellOriginCommon } = opts;\n return [\n Math.floor((p[0] - cellOriginCommon[0]) / cellSizeCommon[0]),\n Math.floor((p[1] - cellOriginCommon[1]) / cellSizeCommon[1])\n ];\n }\n },\n getValue: [\n { sources: ['colorWeights'], getValue: ({ colorWeights }) => colorWeights },\n { sources: ['elevationWeights'], getValue: ({ elevationWeights }) => elevationWeights }\n ]\n });\n }\n return new WebGLAggregator(this.context.device, {\n dimensions: 2,\n channelCount: 2,\n bufferLayout: this.getAttributeManager().getBufferLayouts({ isInstanced: false }),\n ...super.getShaders({\n modules: [project32, binOptionsUniforms],\n vs: /* glsl */ `\n in vec3 positions;\n in vec3 positions64Low;\n in float colorWeights;\n in float elevationWeights;\n\n void getBin(out ivec2 binId) {\n vec3 positionCommon = project_position(positions, positions64Low);\n vec2 gridCoords = floor(positionCommon.xy / binOptions.cellSizeCommon);\n binId = ivec2(gridCoords);\n }\n void getValue(out vec2 value) {\n value = vec2(colorWeights, elevationWeights);\n }\n `\n })\n });\n }\n initializeState() {\n super.initializeState();\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: {\n size: 3,\n accessor: 'getPosition',\n type: 'float64',\n fp64: this.use64bitPositions()\n },\n colorWeights: { size: 1, accessor: 'getColorWeight' },\n elevationWeights: { size: 1, accessor: 'getElevationWeight' }\n });\n }\n updateState(params) {\n const aggregatorChanged = super.updateState(params);\n const { props, oldProps, changeFlags } = params;\n const { aggregator } = this.state;\n if ((changeFlags.dataChanged || !this.state.dataAsArray) &&\n (props.getColorValue || props.getElevationValue)) {\n // Convert data to array\n this.state.dataAsArray = Array.from(createIterable(props.data).iterable);\n }\n if (aggregatorChanged ||\n changeFlags.dataChanged ||\n props.cellSize !== oldProps.cellSize ||\n props.getColorValue !== oldProps.getColorValue ||\n props.getElevationValue !== oldProps.getElevationValue ||\n props.colorAggregation !== oldProps.colorAggregation ||\n props.elevationAggregation !== oldProps.elevationAggregation) {\n this._updateBinOptions();\n const { cellSizeCommon, cellOriginCommon, binIdRange, dataAsArray } = this.state;\n aggregator.setProps({\n // @ts-expect-error only used by GPUAggregator\n binIdRange,\n pointCount: this.getNumInstances(),\n operations: [props.colorAggregation, props.elevationAggregation],\n binOptions: {\n cellSizeCommon,\n cellOriginCommon\n },\n onUpdate: this._onAggregationUpdate.bind(this)\n });\n if (dataAsArray) {\n const { getColorValue, getElevationValue } = this.props;\n aggregator.setProps({\n // @ts-expect-error only used by CPUAggregator\n customOperations: [\n getColorValue &&\n ((indices) => getColorValue(indices.map(i => dataAsArray[i]), { indices, data: props.data })),\n getElevationValue &&\n ((indices) => getElevationValue(indices.map(i => dataAsArray[i]), { indices, data: props.data }))\n ]\n });\n }\n }\n if (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getColorValue) {\n aggregator.setNeedsUpdate(0);\n }\n if (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getElevationValue) {\n aggregator.setNeedsUpdate(1);\n }\n return aggregatorChanged;\n }\n _updateBinOptions() {\n const bounds = this.getBounds();\n const cellSizeCommon = [1, 1];\n let cellOriginCommon = [0, 0];\n let binIdRange = [\n [0, 1],\n [0, 1]\n ];\n let viewport = this.context.viewport;\n if (bounds && Number.isFinite(bounds[0][0])) {\n let centroid = [(bounds[0][0] + bounds[1][0]) / 2, (bounds[0][1] + bounds[1][1]) / 2];\n const { cellSize } = this.props;\n const { unitsPerMeter } = viewport.getDistanceScales(centroid);\n cellSizeCommon[0] = unitsPerMeter[0] * cellSize;\n cellSizeCommon[1] = unitsPerMeter[1] * cellSize;\n // Offset common space to center at the origin of the grid cell where the data center is in\n // This improves precision without affecting the cell positions\n const centroidCommon = viewport.projectFlat(centroid);\n cellOriginCommon = [\n Math.floor(centroidCommon[0] / cellSizeCommon[0]) * cellSizeCommon[0],\n Math.floor(centroidCommon[1] / cellSizeCommon[1]) * cellSizeCommon[1]\n ];\n centroid = viewport.unprojectFlat(cellOriginCommon);\n const ViewportType = viewport.constructor;\n // We construct a viewport for the GPU aggregator's project module\n // This viewport is determined by data\n // removes arbitrary precision variance that depends on initial view state\n viewport = viewport.isGeospatial\n ? new ViewportType({ longitude: centroid[0], latitude: centroid[1], zoom: 12 })\n : new Viewport({ position: [centroid[0], centroid[1], 0], zoom: 12 });\n // Round to the nearest 32-bit float to match CPU and GPU results\n cellOriginCommon = [Math.fround(viewport.center[0]), Math.fround(viewport.center[1])];\n binIdRange = getBinIdRange({\n dataBounds: bounds,\n getBinId: (p) => {\n const positionCommon = viewport.projectFlat(p);\n return [\n Math.floor((positionCommon[0] - cellOriginCommon[0]) / cellSizeCommon[0]),\n Math.floor((positionCommon[1] - cellOriginCommon[1]) / cellSizeCommon[1])\n ];\n }\n });\n }\n this.setState({ cellSizeCommon, cellOriginCommon, binIdRange, aggregatorViewport: viewport });\n }\n draw(opts) {\n // Replaces render time viewport with our own\n if (opts.shaderModuleProps.project) {\n opts.shaderModuleProps.project.viewport = this.state.aggregatorViewport;\n }\n super.draw(opts);\n }\n _onAggregationUpdate({ channel }) {\n const props = this.getCurrentLayer().props;\n const { aggregator } = this.state;\n if (channel === 0) {\n const result = aggregator.getResult(0);\n this.setState({\n colors: new AttributeWithScale(result, aggregator.binCount)\n });\n props.onSetColorDomain(aggregator.getResultDomain(0));\n }\n else if (channel === 1) {\n const result = aggregator.getResult(1);\n this.setState({\n elevations: new AttributeWithScale(result, aggregator.binCount)\n });\n props.onSetElevationDomain(aggregator.getResultDomain(1));\n }\n }\n onAttributeChange(id) {\n const { aggregator } = this.state;\n switch (id) {\n case 'positions':\n aggregator.setNeedsUpdate();\n this._updateBinOptions();\n const { cellSizeCommon, cellOriginCommon, binIdRange } = this.state;\n aggregator.setProps({\n // @ts-expect-error only used by GPUAggregator\n binIdRange,\n binOptions: {\n cellSizeCommon,\n cellOriginCommon\n }\n });\n break;\n case 'colorWeights':\n aggregator.setNeedsUpdate(0);\n break;\n case 'elevationWeights':\n aggregator.setNeedsUpdate(1);\n break;\n default:\n // This should not happen\n }\n }\n renderLayers() {\n const { aggregator, cellOriginCommon, cellSizeCommon } = this.state;\n const { elevationScale, colorRange, elevationRange, extruded, coverage, material, transitions, colorScaleType, lowerPercentile, upperPercentile, colorDomain, elevationScaleType, elevationLowerPercentile, elevationUpperPercentile, elevationDomain } = this.props;\n const CellLayerClass = this.getSubLayerClass('cells', GridCellLayer);\n const binAttribute = aggregator.getBins();\n const colors = this.state.colors?.update({\n scaleType: colorScaleType,\n lowerPercentile,\n upperPercentile\n });\n const elevations = this.state.elevations?.update({\n scaleType: elevationScaleType,\n lowerPercentile: elevationLowerPercentile,\n upperPercentile: elevationUpperPercentile\n });\n if (!colors || !elevations) {\n return null;\n }\n return new CellLayerClass(this.getSubLayerProps({\n id: 'cells'\n }), {\n data: {\n length: aggregator.binCount,\n attributes: {\n getBin: binAttribute,\n getColorValue: colors.attribute,\n getElevationValue: elevations.attribute\n }\n },\n // Data has changed shallowly, but we likely don't need to update the attributes\n dataComparator: (data, oldData) => data.length === oldData.length,\n updateTriggers: {\n getBin: [binAttribute],\n getColorValue: [colors.attribute],\n getElevationValue: [elevations.attribute]\n },\n cellOriginCommon,\n cellSizeCommon,\n elevationScale,\n colorRange,\n colorScaleType,\n elevationRange,\n extruded,\n coverage,\n material,\n colorDomain: colors.domain || colorDomain || aggregator.getResultDomain(0),\n elevationDomain: elevations.domain || elevationDomain || aggregator.getResultDomain(1),\n colorCutoff: colors.cutoff,\n elevationCutoff: elevations.cutoff,\n transitions: transitions && {\n getFillColor: transitions.getColorValue || transitions.getColorWeight,\n getElevation: transitions.getElevationValue || transitions.getElevationWeight\n },\n // Extensions are already handled by the GPUAggregator, do not pass it down\n extensions: []\n });\n }\n getPickingInfo(params) {\n const info = params.info;\n const { index } = info;\n if (index >= 0) {\n const bin = this.state.aggregator.getBin(index);\n let object;\n if (bin) {\n object = {\n col: bin.id[0],\n row: bin.id[1],\n colorValue: bin.value[0],\n elevationValue: bin.value[1],\n count: bin.count\n };\n if (bin.pointIndices) {\n object.pointIndices = bin.pointIndices;\n object.points = Array.isArray(this.props.data)\n ? bin.pointIndices.map(i => this.props.data[i])\n : [];\n }\n }\n info.object = object;\n }\n return info;\n }\n}\nGridLayer.layerName = 'GridLayer';\nGridLayer.defaultProps = defaultProps;\nexport default GridLayer;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { ColumnLayer } from '@deck.gl/layers';\nimport { CubeGeometry } from '@luma.gl/engine';\nimport { createColorRangeTexture, updateColorRangeTexture } from \"../common/utils/color-utils.js\";\nimport vs from \"./grid-cell-layer-vertex.glsl.js\";\nimport { gridUniforms } from \"./grid-layer-uniforms.js\";\nexport class GridCellLayer extends ColumnLayer {\n getShaders() {\n const shaders = super.getShaders();\n shaders.modules.push(gridUniforms);\n return { ...shaders, vs };\n }\n initializeState() {\n super.initializeState();\n const attributeManager = this.getAttributeManager();\n attributeManager.remove([\n 'instanceElevations',\n 'instanceFillColors',\n 'instanceLineColors',\n 'instanceStrokeWidths'\n ]);\n attributeManager.addInstanced({\n instancePositions: {\n size: 2,\n type: 'float32',\n accessor: 'getBin'\n },\n instanceColorValues: {\n size: 1,\n type: 'float32',\n accessor: 'getColorValue'\n },\n instanceElevationValues: {\n size: 1,\n type: 'float32',\n accessor: 'getElevationValue'\n }\n });\n }\n updateState(params) {\n super.updateState(params);\n const { props, oldProps } = params;\n const model = this.state.fillModel;\n if (oldProps.colorRange !== props.colorRange) {\n this.state.colorTexture?.destroy();\n this.state.colorTexture = createColorRangeTexture(this.context.device, props.colorRange, props.colorScaleType);\n const gridProps = { colorRange: this.state.colorTexture };\n model.shaderInputs.setProps({ grid: gridProps });\n }\n else if (oldProps.colorScaleType !== props.colorScaleType) {\n updateColorRangeTexture(this.state.colorTexture, props.colorScaleType);\n }\n }\n finalizeState(context) {\n super.finalizeState(context);\n this.state.colorTexture?.destroy();\n }\n _updateGeometry() {\n const geometry = new CubeGeometry();\n this.state.fillModel.setGeometry(geometry);\n }\n draw({ uniforms }) {\n const { cellOriginCommon, cellSizeCommon, elevationRange, elevationScale, extruded, coverage, colorDomain, elevationDomain } = this.props;\n const colorCutoff = this.props.colorCutoff || [-Infinity, Infinity];\n const elevationCutoff = this.props.elevationCutoff || [-Infinity, Infinity];\n const fillModel = this.state.fillModel;\n const gridProps = {\n colorDomain: [\n Math.max(colorDomain[0], colorCutoff[0]), // instanceColorValue that maps to colorRange[0]\n Math.min(colorDomain[1], colorCutoff[1]), // instanceColorValue that maps to colorRange[colorRange.length - 1]\n Math.max(colorDomain[0] - 1, colorCutoff[0]), // hide cell if instanceColorValue is less than this\n Math.min(colorDomain[1] + 1, colorCutoff[1]) // hide cell if instanceColorValue is greater than this\n ],\n elevationDomain: [\n Math.max(elevationDomain[0], elevationCutoff[0]), // instanceElevationValue that maps to elevationRange[0]\n Math.min(elevationDomain[1], elevationCutoff[1]), // instanceElevationValue that maps to elevationRange[elevationRange.length - 1]\n Math.max(elevationDomain[0] - 1, elevationCutoff[0]), // hide cell if instanceElevationValue is less than this\n Math.min(elevationDomain[1] + 1, elevationCutoff[1]) // hide cell if instanceElevationValue is greater than this\n ],\n elevationRange: [elevationRange[0] * elevationScale, elevationRange[1] * elevationScale],\n originCommon: cellOriginCommon,\n sizeCommon: cellSizeCommon\n };\n fillModel.shaderInputs.setProps({\n column: { extruded, coverage },\n grid: gridProps\n });\n fillModel.draw(this.context.renderPass);\n }\n}\nGridCellLayer.layerName = 'GridCellLayer';\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport default /* glsl */ `#version 300 es\n#define SHADER_NAME grid-cell-layer-vertex-shader\nin vec3 positions;\nin vec3 normals;\nin vec2 instancePositions;\nin float instanceElevationValues;\nin float instanceColorValues;\nin vec3 instancePickingColors;\nuniform sampler2D colorRange;\nout vec4 vColor;\nfloat interp(float value, vec2 domain, vec2 range) {\nfloat r = min(max((value - domain.x) / (domain.y - domain.x), 0.), 1.);\nreturn mix(range.x, range.y, r);\n}\nvec4 interp(float value, vec2 domain, sampler2D range) {\nfloat r = (value - domain.x) / (domain.y - domain.x);\nreturn texture(range, vec2(r, 0.5));\n}\nvoid main(void) {\ngeometry.pickingColor = instancePickingColors;\nif (isnan(instanceColorValues) ||\ninstanceColorValues < grid.colorDomain.z ||\ninstanceColorValues > grid.colorDomain.w ||\ninstanceElevationValues < grid.elevationDomain.z ||\ninstanceElevationValues > grid.elevationDomain.w\n) {\ngl_Position = vec4(0.);\nreturn;\n}\nvec2 commonPosition = (instancePositions + (positions.xy + 1.0) / 2.0 * column.coverage) * grid.sizeCommon + grid.originCommon - project.commonOrigin.xy;\ngeometry.position = vec4(commonPosition, 0.0, 1.0);\ngeometry.normal = project_normal(normals);\nfloat elevation = 0.0;\nif (column.extruded) {\nelevation = interp(instanceElevationValues, grid.elevationDomain.xy, grid.elevationRange);\nelevation = project_size(elevation);\ngeometry.position.z = (positions.z + 1.0) / 2.0 * elevation;\n}\ngl_Position = project_common_position_to_clipspace(geometry.position);\nDECKGL_FILTER_GL_POSITION(gl_Position, geometry);\nvColor = interp(instanceColorValues, grid.colorDomain.xy, colorRange);\nvColor.a *= layer.opacity;\nif (column.extruded) {\nvColor.rgb = lighting_getLightColor(vColor.rgb, project.cameraPosition, geometry.position.xyz, geometry.normal);\n}\nDECKGL_FILTER_COLOR(vColor, geometry);\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = /* glsl */ `\\\nuniform gridUniforms {\n vec4 colorDomain;\n vec4 elevationDomain;\n vec2 elevationRange;\n vec2 originCommon;\n vec2 sizeCommon;\n} grid;\n`;\nexport const gridUniforms = {\n name: 'grid',\n vs: uniformBlock,\n uniformTypes: {\n colorDomain: 'vec4<f32>',\n elevationDomain: 'vec4<f32>',\n elevationRange: 'vec2<f32>',\n originCommon: 'vec2<f32>',\n sizeCommon: 'vec2<f32>'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = /* glsl */ `\\\nuniform binOptionsUniforms {\n vec2 cellOriginCommon;\n vec2 cellSizeCommon;\n} binOptions;\n`;\nexport const binOptionsUniforms = {\n name: 'binOptions',\n vs: uniformBlock,\n uniformTypes: {\n cellOriginCommon: 'vec2<f32>',\n cellSizeCommon: 'vec2<f32>'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport function getBounds(points) {\n // Now build bounding box in world space (aligned to world coordiante system)\n const x = points.map(p => p[0]);\n const y = points.map(p => p[1]);\n const xMin = Math.min.apply(null, x);\n const xMax = Math.max.apply(null, x);\n const yMin = Math.min.apply(null, y);\n const yMax = Math.max.apply(null, y);\n return [xMin, yMin, xMax, yMax];\n}\n// true if currentBounds contains targetBounds, false otherwise\nexport function boundsContain(currentBounds, targetBounds) {\n if (targetBounds[0] >= currentBounds[0] &&\n targetBounds[2] <= currentBounds[2] &&\n targetBounds[1] >= currentBounds[1] &&\n targetBounds[3] <= currentBounds[3]) {\n return true;\n }\n return false;\n}\nconst scratchArray = new Float32Array(12);\n// For given rectangle bounds generates two triangles vertices that coverit completely\nexport function packVertices(points, dimensions = 2) {\n let index = 0;\n for (const point of points) {\n for (let i = 0; i < dimensions; i++) {\n scratchArray[index++] = point[i] || 0;\n }\n }\n return scratchArray;\n}\n// Expands boundingBox:[xMin, yMin, xMax, yMax] to match aspect ratio of given width and height\nexport function scaleToAspectRatio(boundingBox, width, height) {\n const [xMin, yMin, xMax, yMax] = boundingBox;\n const currentWidth = xMax - xMin;\n const currentHeight = yMax - yMin;\n let newWidth = currentWidth;\n let newHeight = currentHeight;\n if (currentWidth / currentHeight < width / height) {\n // expand bounding box width\n newWidth = (width / height) * currentHeight;\n }\n else {\n newHeight = (height / width) * currentWidth;\n }\n if (newWidth < width) {\n newWidth = width;\n newHeight = height;\n }\n const xCenter = (xMax + xMin) / 2;\n const yCenter = (yMax + yMin) / 2;\n return [\n xCenter - newWidth / 2,\n yCenter - newHeight / 2,\n xCenter + newWidth / 2,\n yCenter + newHeight / 2\n ];\n}\n// Get texture coordiante of point inside a bounding box\nexport function getTextureCoordinates(point, bounds) {\n const [xMin, yMin, xMax, yMax] = bounds;\n return [(point[0] - xMin) / (xMax - xMin), (point[1] - yMin) / (yMax - yMin)];\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n/* global setTimeout clearTimeout */\nimport { getBounds, boundsContain, packVertices, scaleToAspectRatio, getTextureCoordinates } from \"./heatmap-layer-utils.js\";\nimport { TextureTransform } from '@luma.gl/engine';\nimport { AttributeManager, COORDINATE_SYSTEM, log, project32 } from '@deck.gl/core';\nimport TriangleLayer from \"./triangle-layer.js\";\nimport AggregationLayer from \"./aggregation-layer.js\";\nimport { defaultColorRange, colorRangeToFlatArray } from \"../common/utils/color-utils.js\";\nimport weightsVs from \"./weights-vs.glsl.js\";\nimport weightsFs from \"./weights-fs.glsl.js\";\nimport maxVs from \"./max-vs.glsl.js\";\nimport maxFs from \"./max-fs.glsl.js\";\nimport { maxWeightUniforms, weightUniforms } from \"./heatmap-layer-uniforms.js\";\nconst RESOLUTION = 2; // (number of common space pixels) / (number texels)\nconst TEXTURE_PROPS = {\n format: 'rgba8unorm',\n mipmaps: false,\n sampler: {\n minFilter: 'linear',\n magFilter: 'linear',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge'\n }\n};\nconst DEFAULT_COLOR_DOMAIN = [0, 0];\nconst AGGREGATION_MODE = {\n SUM: 0,\n MEAN: 1\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};\nconst FLOAT_TARGET_FEATURES = [\n 'float32-renderable-webgl', // ability to render to float texture\n 'texture-blend-float-webgl' // ability to blend when rendering to float texture\n];\nconst DIMENSIONS = {\n data: {\n props: ['radiusPixels']\n }\n};\n/** Visualizes the spatial distribution of data. */\nclass HeatmapLayer extends AggregationLayer {\n getShaders(shaders) {\n let modules = [project32];\n if (shaders.modules) {\n modules = [...modules, ...shaders.modules];\n }\n return super.getShaders({ ...shaders, modules });\n }\n initializeState() {\n super.initializeAggregationLayer(DIMENSIONS);\n this.setState({ colorDomain: DEFAULT_COLOR_DOMAIN });\n this._setupTextureParams();\n this._setupAttributes();\n this._setupResources();\n }\n shouldUpdateState({ changeFlags }) {\n // Need to be updated when viewport changes\n return changeFlags.somethingChanged;\n }\n /* eslint-disable max-statements,complexity */\n updateState(opts) {\n super.updateState(opts);\n this._updateHeatmapState(opts);\n }\n _updateHeatmapState(opts) {\n const { props, oldProps } = opts;\n const changeFlags = this._getChangeFlags(opts);\n if (changeFlags.dataChanged || changeFlags.viewportChanged) {\n // if data is changed, do not debounce and immediately update the weight map\n changeFlags.boundsChanged = this._updateBounds(changeFlags.dataChanged);\n this._updateTextureRenderingBounds();\n }\n if (changeFlags.dataChanged || changeFlags.boundsChanged) {\n // Update weight map immediately\n clearTimeout(this.state.updateTimer);\n this.setState({ isWeightMapDirty: true });\n }\n else if (changeFlags.viewportZoomChanged) {\n // Update weight map when zoom stops\n this._debouncedUpdateWeightmap();\n }\n if (props.colorRange !== oldProps.colorRange) {\n this._updateColorTexture(opts);\n }\n if (this.state.isWeightMapDirty) {\n this._updateWeightmap();\n }\n this.setState({ zoom: opts.context.viewport.zoom });\n }\n renderLayers() {\n const { weightsTexture, triPositionBuffer, triTexCoordBuffer, maxWeightsTexture, colorTexture, colorDomain } = this.state;\n const { updateTriggers, intensity, threshold, aggregation } = this.props;\n const TriangleLayerClass = this.getSubLayerClass('triangle', TriangleLayer);\n return new TriangleLayerClass(this.getSubLayerProps({\n id: 'triangle-layer',\n updateTriggers\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 weightsTexture,\n intensity,\n threshold,\n colorDomain\n });\n }\n finalizeState(context) {\n super.finalizeState(context);\n const { weightsTransform, weightsTexture, maxWeightTransform, maxWeightsTexture, triPositionBuffer, triTexCoordBuffer, colorTexture, updateTimer } = this.state;\n weightsTransform?.destroy();\n weightsTexture?.destroy();\n maxWeightTransform?.destroy();\n maxWeightsTexture?.destroy();\n triPositionBuffer?.destroy();\n triTexCoordBuffer?.destroy();\n colorTexture?.destroy();\n if (updateTimer) {\n clearTimeout(updateTimer);\n }\n }\n // PRIVATE\n // override Composite layer private method to create AttributeManager instance\n _getAttributeManager() {\n return new AttributeManager(this.context.device, {\n id: this.props.id,\n stats: this.context.stats\n });\n }\n _getChangeFlags(opts) {\n const changeFlags = {};\n const { dimensions } = this.state;\n changeFlags.dataChanged =\n (this.isAttributeChanged() && 'attribute changed') || // if any attribute is changed\n (this.isAggregationDirty(opts, {\n compareAll: true,\n dimension: dimensions.data\n }) &&\n 'aggregation is dirty');\n changeFlags.viewportChanged = opts.changeFlags.viewportChanged;\n const { zoom } = this.state;\n if (!opts.context.viewport || opts.context.viewport.zoom !== zoom) {\n changeFlags.viewportZoomChanged = true;\n }\n return changeFlags;\n }\n _createTextures() {\n const { textureSize, format } = this.state;\n this.setState({\n weightsTexture: this.context.device.createTexture({\n ...TEXTURE_PROPS,\n width: textureSize,\n height: textureSize,\n format\n }),\n maxWeightsTexture: this.context.device.createTexture({\n ...TEXTURE_PROPS,\n width: 1,\n height: 1,\n format\n })\n });\n }\n _setupAttributes() {\n const attributeManager = this.getAttributeManager();\n attributeManager.add({\n positions: { size: 3, type: 'float64', accessor: 'getPosition' },\n weights: { size: 1, accessor: 'getWeight' }\n });\n this.setState({ positionAttributeName: 'positions' });\n }\n _setupTextureParams() {\n const { device } = this.context;\n const { weightsTextureSize } = this.props;\n const textureSize = Math.min(weightsTextureSize, device.limits.maxTextureDimension2D);\n const floatTargetSupport = FLOAT_TARGET_FEATURES.every(feature => device.features.has(feature));\n const format = floatTargetSupport ? 'rgba32float' : 'rgba8unorm';\n const weightsScale = floatTargetSupport ? 1 : 1 / 255;\n this.setState({ textureSize, format, weightsScale });\n if (!floatTargetSupport) {\n log.warn(`HeatmapLayer: ${this.id} rendering to float texture not supported, falling back to low precision format`)();\n }\n }\n _createWeightsTransform(shaders) {\n let { weightsTransform } = this.state;\n const { weightsTexture } = this.state;\n const attributeManager = this.getAttributeManager();\n weightsTransform?.destroy();\n weightsTransform = new TextureTransform(this.context.device, {\n id: `${this.id}-weights-transform`,\n bufferLayout: attributeManager.getBufferLayouts(),\n vertexCount: 1,\n targetTexture: weightsTexture,\n parameters: {\n depthWriteEnabled: false,\n blendColorOperation: 'add',\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one'\n },\n topology: 'point-list',\n ...shaders,\n modules: [...shaders.modules, weightUniforms]\n });\n this.setState({ weightsTransform });\n }\n _setupResources() {\n this._createTextures();\n const { device } = this.context;\n const { textureSize, weightsTexture, maxWeightsTexture } = this.state;\n const weightsTransformShaders = this.getShaders({\n vs: weightsVs,\n fs: weightsFs\n });\n this._createWeightsTransform(weightsTransformShaders);\n const maxWeightsTransformShaders = this.getShaders({\n vs: maxVs,\n fs: maxFs,\n modules: [maxWeightUniforms]\n });\n const maxWeightTransform = new TextureTransform(device, {\n id: `${this.id}-max-weights-transform`,\n targetTexture: maxWeightsTexture,\n ...maxWeightsTransformShaders,\n vertexCount: textureSize * textureSize,\n topology: 'point-list',\n parameters: {\n depthWriteEnabled: false,\n blendColorOperation: 'max',\n blendAlphaOperation: 'max',\n blendColorSrcFactor: 'one',\n blendColorDstFactor: 'one',\n blendAlphaSrcFactor: 'one',\n blendAlphaDstFactor: 'one'\n }\n });\n const maxWeightProps = { inTexture: weightsTexture, textureSize };\n maxWeightTransform.model.shaderInputs.setProps({\n maxWeight: maxWeightProps\n });\n this.setState({\n weightsTexture,\n maxWeightsTexture,\n maxWeightTransform,\n zoom: null,\n triPositionBuffer: device.createBuffer({ byteLength: 48 }),\n triTexCoordBuffer: device.createBuffer({ byteLength: 48 })\n });\n }\n // overwrite super class method to update transform model\n updateShaders(shaderOptions) {\n // shader params (modules, injects) changed, update model object\n this._createWeightsTransform({\n vs: weightsVs,\n fs: weightsFs,\n ...shaderOptions\n });\n }\n _updateMaxWeightValue() {\n const { maxWeightTransform } = this.state;\n maxWeightTransform.run({\n parameters: { viewport: [0, 0, 1, 1] },\n clearColor: [0, 0, 0, 0]\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 // 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([0, viewport.height]),\n viewport.unproject([viewport.width, viewport.height])\n ].map(p => p.map(Math.fround));\n // #1: get world bounds for current viewport extends\n const visibleWorldBounds = getBounds(viewportCorners); // TODO: Change to visible bounds\n const newState = { visibleWorldBounds, viewportCorners };\n let boundsChanged = false;\n if (forceUpdate ||\n !this.state.worldBounds ||\n !boundsContain(this.state.worldBounds, visibleWorldBounds)) {\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 // #4 :convert aligned common bounds to world bounds\n const worldBounds = this._commonToWorldBounds(scaledCommonBounds);\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 // #5: now convert world bounds to common using Layer's coordiante system and origin\n const normalizedCommonBounds = this._worldToCommonBounds(worldBounds);\n newState.worldBounds = worldBounds;\n newState.normalizedCommonBounds = normalizedCommonBounds;\n boundsChanged = true;\n }\n this.setState(newState);\n return boundsChanged;\n }\n _updateTextureRenderingBounds() {\n // Just render visible portion of the texture\n const { triPositionBuffer, triTexCoordBuffer, normalizedCommonBounds, viewportCorners } = this.state;\n const { viewport } = this.context;\n triPositionBuffer.write(packVertices(viewportCorners, 3));\n const textureBounds = viewportCorners.map(p => getTextureCoordinates(viewport.projectPosition(p), normalizedCommonBounds));\n triTexCoordBuffer.write(packVertices(textureBounds, 2));\n }\n _updateColorTexture(opts) {\n const { colorRange } = opts.props;\n let { colorTexture } = this.state;\n const colors = colorRangeToFlatArray(colorRange, false, Uint8Array);\n if (colorTexture && colorTexture?.width === colorRange.length) {\n // TODO(v9): Unclear whether `setSubImageData` is a public API, or what to use if not.\n colorTexture.setTexture2DData({ data: colors });\n }\n else {\n colorTexture?.destroy();\n // @ts-expect-error TODO(ib) - texture API change\n colorTexture = this.context.device.createTexture({\n ...TEXTURE_PROPS,\n data: colors,\n width: colorRange.length,\n height: 1\n });\n }\n this.setState({ colorTexture });\n }\n _updateWeightmap() {\n const { radiusPixels, colorDomain, aggregation } = this.props;\n const { worldBounds, textureSize, weightsScale, weightsTexture } = this.state;\n const weightsTransform = this.state.weightsTransform;\n this.state.isWeightMapDirty = false;\n // convert world bounds to common using Layer's coordiante system and origin\n const commonBounds = this._worldToCommonBounds(worldBounds, {\n useLayerCoordinateSystem: true\n });\n if (colorDomain && aggregation === 'SUM') {\n // scale color domain to weight per pixel\n const { viewport } = this.context;\n const metersPerPixel = (viewport.distanceScales.metersPerUnit[2] * (commonBounds[2] - commonBounds[0])) /\n textureSize;\n this.state.colorDomain = colorDomain.map(x => x * metersPerPixel * weightsScale);\n }\n else {\n this.state.colorDomain = colorDomain || DEFAULT_COLOR_DOMAIN;\n }\n const attributeManager = this.getAttributeManager();\n const attributes = attributeManager.getAttributes();\n const moduleSettings = this.getModuleSettings();\n this._setModelAttributes(weightsTransform.model, attributes);\n weightsTransform.model.setVertexCount(this.getNumInstances());\n const weightProps = {\n radiusPixels,\n commonBounds,\n textureWidth: textureSize,\n weightsScale,\n weightsTexture: weightsTexture\n };\n const { viewport, devicePixelRatio, coordinateSystem, coordinateOrigin } = moduleSettings;\n const { modelMatrix } = this.props;\n weightsTransform.model.shaderInputs.setProps({\n project: { viewport, devicePixelRatio, modelMatrix, coordinateSystem, coordinateOrigin },\n weight: weightProps\n });\n weightsTransform.run({\n parameters: { viewport: [0, 0, textureSize, textureSize] },\n clearColor: [0, 0, 0, 0]\n });\n this._updateMaxWeightValue();\n }\n _debouncedUpdateWeightmap(fromTimer = false) {\n let { updateTimer } = this.state;\n const { debounceTimeout } = this.props;\n if (fromTimer) {\n updateTimer = null;\n // update\n this._updateBounds(true);\n this._updateTextureRenderingBounds();\n this.setState({ isWeightMapDirty: true });\n }\n else {\n this.setState({ isWeightMapDirty: false });\n clearTimeout(updateTimer);\n updateTimer = setTimeout(this._debouncedUpdateWeightmap.bind(this, true), debounceTimeout);\n }\n this.setState({ updateTimer });\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 const offsetMode = 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 let bottomLeftCommon;\n let topRightCommon;\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 }\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 bottomLeftCommon[0] - offsetOriginCommon[0],\n bottomLeftCommon[1] - offsetOriginCommon[1],\n topRightCommon[0] - offsetOriginCommon[0],\n topRightCommon[1] - offsetOriginCommon[1]\n ], size, size);\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 return bottomLeftWorld.slice(0, 2).concat(topRightWorld.slice(0, 2));\n }\n}\nHeatmapLayer.layerName = 'HeatmapLayer';\nHeatmapLayer.defaultProps = defaultProps;\nexport default HeatmapLayer;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Model } from '@luma.gl/engine';\nimport { Layer, project32 } from '@deck.gl/core';\nimport vs from \"./triangle-layer-vertex.glsl.js\";\nimport fs from \"./triangle-layer-fragment.glsl.js\";\nimport { triangleUniforms } from \"./triangle-layer-uniforms.js\";\nclass TriangleLayer extends Layer {\n getShaders() {\n return super.getShaders({ vs, fs, modules: [project32, triangleUniforms] });\n }\n initializeState({ device }) {\n this.setState({ model: this._getModel(device) });\n }\n _getModel(device) {\n const { vertexCount, data } = this.props;\n return new Model(device, {\n ...this.getShaders(),\n id: this.props.id,\n attributes: data.attributes,\n bufferLayout: [\n { name: 'positions', format: 'float32x3' },\n { name: 'texCoords', format: 'float32x2' }\n ],\n topology: 'triangle-strip',\n vertexCount\n });\n }\n draw() {\n const { model } = this.state;\n const { aggregationMode, colorDomain, intensity, threshold, colorTexture, maxTexture, weightsTexture } = this.props;\n const triangleProps = {\n aggregationMode,\n colorDomain,\n intensity,\n threshold,\n colorTexture,\n maxTexture,\n weightsTexture\n };\n model.shaderInputs.setProps({ triangle: triangleProps });\n model.draw(this.context.renderPass);\n }\n}\nTriangleLayer.layerName = 'TriangleLayer';\nexport default TriangleLayer;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Inspired by screen-grid-layer vertex shader in deck.gl\nexport default `\\\n#version 300 es\n#define SHADER_NAME heatp-map-layer-vertex-shader\nuniform sampler2D maxTexture;\nin vec3 positions;\nin vec2 texCoords;\nout vec2 vTexCoords;\nout float vIntensityMin;\nout float vIntensityMax;\nvoid main(void) {\ngl_Position = project_position_to_clipspace(positions, vec3(0.0), vec3(0.0));\nvTexCoords = texCoords;\nvec4 maxTexture = texture(maxTexture, vec2(0.5));\nfloat maxValue = triangle.aggregationMode < 0.5 ? maxTexture.r : maxTexture.g;\nfloat minValue = maxValue * triangle.threshold;\nif (triangle.colorDomain[1] > 0.) {\nmaxValue = triangle.colorDomain[1];\nminValue = triangle.colorDomain[0];\n}\nvIntensityMax = triangle.intensity / maxValue;\nvIntensityMin = triangle.intensity / minValue;\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport default `\\\n#version 300 es\n#define SHADER_NAME triangle-layer-fragment-shader\nprecision highp float;\nuniform sampler2D weightsTexture;\nuniform sampler2D colorTexture;\nin vec2 vTexCoords;\nin float vIntensityMin;\nin float vIntensityMax;\nout vec4 fragColor;\nvec4 getLinearColor(float value) {\nfloat factor = clamp(value * vIntensityMax, 0., 1.);\nvec4 color = texture(colorTexture, vec2(factor, 0.5));\ncolor.a *= min(value * vIntensityMin, 1.0);\nreturn color;\n}\nvoid main(void) {\nvec4 weights = texture(weightsTexture, vTexCoords);\nfloat weight = weights.r;\nif (triangle.aggregationMode > 0.5) {\nweight /= max(1.0, weights.a);\n}\nif (weight <= 0.) {\ndiscard;\n}\nvec4 linearColor = getLinearColor(weight);\nlinearColor.a *= layer.opacity;\nfragColor = linearColor;\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = `\\\nuniform triangleUniforms {\n float aggregationMode;\n vec2 colorDomain;\n float intensity;\n float threshold;\n} triangle;\n`;\nexport const triangleUniforms = {\n name: 'triangle',\n vs: uniformBlock,\n fs: uniformBlock,\n uniformTypes: {\n aggregationMode: 'f32',\n colorDomain: 'vec2<f32>',\n intensity: 'f32',\n threshold: 'f32'\n }\n};\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CompositeLayer, AttributeManager, _compareProps as compareProps } from '@deck.gl/core';\nimport { filterProps } from \"../common/utils/prop-utils.js\";\n/** Legacy AggregationLayer, to be removed in v9.1 */\nclass AggregationLayer extends CompositeLayer {\n initializeAggregationLayer(dimensions) {\n super.initializeState(this.context);\n this.setState({\n // Layer props , when changed doesn't require updating aggregation\n ignoreProps: filterProps(this.constructor._propTypes, dimensions.data.props),\n dimensions\n });\n }\n updateState(opts) {\n super.updateState(opts);\n const { changeFlags } = opts;\n if (changeFlags.extensionsChanged) {\n const shaders = this.getShaders({});\n if (shaders && shaders.defines) {\n shaders.defines.NON_INSTANCED_MODEL = 1;\n }\n this.updateShaders(shaders);\n }\n // Explictly call to update attributes as 'CompositeLayer' doesn't call this\n this._updateAttributes();\n }\n updateAttributes(changedAttributes) {\n // Super classes, can refer to state.changedAttributes to determine what\n // attributes changed\n this.setState({ changedAttributes });\n }\n getAttributes() {\n return this.getAttributeManager().getAttributes();\n }\n getModuleSettings() {\n // For regular layer draw this happens during draw cycle (_drawLayersInViewport) not during update cycle\n // For aggregation layers this is called during updateState to update aggregation data\n // NOTE: it is similar to LayerPass._getShaderModuleProps() but doesn't inlcude `effects` it is not needed for aggregation\n const { viewport, mousePosition, device } = this.context;\n const moduleSettings = Object.assign(Object.create(this.props), {\n viewport,\n mousePosition,\n picking: {\n isActive: 0\n },\n // @ts-expect-error TODO - assuming WebGL context\n devicePixelRatio: device.canvasContext.cssToDeviceRatio()\n });\n return moduleSettings;\n }\n updateShaders(shaders) {\n // Default implemention is empty, subclasses can update their Model objects if needed\n }\n /**\n * Checks if aggregation is dirty\n * @param {Object} updateOpts - object {props, oldProps, changeFlags}\n * @param {Object} params - object {dimension, compareAll}\n * @param {Object} params.dimension - {props, accessors} array of props and/or accessors\n * @param {Boolean} params.compareAll - when `true` it will include non layer props for comparision\n * @returns {Boolean} - returns true if dimensions' prop or accessor is changed\n **/\n isAggregationDirty(updateOpts, params = {}) {\n const { props, oldProps, changeFlags } = updateOpts;\n const { compareAll = false, dimension } = params;\n const { ignoreProps } = this.state;\n const { props: dataProps, accessors = [] } = dimension;\n const { updateTriggersChanged } = changeFlags;\n if (changeFlags.dataChanged) {\n return true;\n }\n if (updateTriggersChanged) {\n if (updateTriggersChanged.all) {\n return true;\n }\n for (const accessor of accessors) {\n if (updateTriggersChanged[accessor]) {\n return true;\n }\n }\n }\n if (compareAll) {\n if (changeFlags.extensionsChanged) {\n return true;\n }\n // Compare non layer props too (like extension props)\n // ignoreprops refers to all Layer props other than aggregation props that need to be comapred\n return compareProps({\n oldProps,\n newProps: props,\n ignoreProps,\n propTypes: this.constructor._propTypes\n });\n }\n // Compare props of the dimension\n for (const name of dataProps) {\n if (props[name] !== oldProps[name]) {\n return true;\n }\n }\n return false;\n }\n /**\n * Checks if an attribute is changed\n * @param {String} name - name of the attribute\n * @returns {Boolean} - `true` if attribute `name` is changed, `false` otherwise,\n * If `name` is not passed or `undefiend`, `true` if any attribute is changed, `false` otherwise\n **/\n isAttributeChanged(name) {\n const { changedAttributes } = this.state;\n if (!name) {\n // if name not specified return true if any attribute is changed\n return !isObjectEmpty(changedAttributes);\n }\n return changedAttributes && changedAttributes[name] !== undefined;\n }\n // Private\n // override Composite layer private method to create AttributeManager instance\n _getAttributeManager() {\n return new AttributeManager(this.context.device, {\n id: this.props.id,\n stats: this.context.stats\n });\n }\n}\nAggregationLayer.layerName = 'AggregationLayer';\nexport default AggregationLayer;\n// Helper methods\n// Returns true if given object is empty, false otherwise.\nfunction isObjectEmpty(obj) {\n let isEmpty = true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const key in obj) {\n isEmpty = false;\n break;\n }\n return isEmpty;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport function filterProps(props, filterKeys) {\n const filteredProps = {};\n for (const key in props) {\n if (!filterKeys.includes(key)) {\n filteredProps[key] = props[key];\n }\n }\n return filteredProps;\n}\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport default `\\\n#version 300 es\nin vec3 positions;\nin vec3 positions64Low;\nin float weights;\nout vec4 weightsTexture;\nvoid main()\n{\nweightsTexture = vec4(weights * weight.weightsScale, 0., 0., 1.);\nfloat radiusTexels = project_pixel_size(weight.radiusPixels) * weight.textureWidth / (weight.commonBounds.z - weight.commonBounds.x);\ngl_PointSize = radiusTexels * 2.;\nvec3 commonPosition = project_position(positions, positions64Low);\ngl_Position.xy = (commonPosition.xy - weight.commonBounds.xy) / (weight.commonBounds.zw - weight.commonBounds.xy) ;\ngl_Position.xy = (gl_Position.xy * 2.) - (1.);\ngl_Position.w = 1.0;\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport default `\\\n#version 300 es\nin vec4 weightsTexture;\nout vec4 fragColor;\nfloat gaussianKDE(float u){\nreturn pow(2.71828, -u*u/0.05555)/(1.77245385*0.166666);\n}\nvoid main()\n{\nfloat dist = length(gl_PointCoord - vec2(0.5, 0.5));\nif (dist > 0.5) {\ndiscard;\n}\nfragColor = weightsTexture * gaussianKDE(2. * dist);\nDECKGL_FILTER_COLOR(fragColor, geometry);\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport default `\\\n#version 300 es\nuniform sampler2D inTexture;\nout vec4 outTexture;\nvoid main()\n{\nint yIndex = gl_VertexID / int(maxWeight.textureSize);\nint xIndex = gl_VertexID - (yIndex * int(maxWeight.textureSize));\nvec2 uv = (0.5 + vec2(float(xIndex), float(yIndex))) / maxWeight.textureSize;\noutTexture = texture(inTexture, uv);\ngl_Position = vec4(0.0, 0.0, 0.0, 1.0);\ngl_PointSize = 1.0;\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nexport default `\\\n#version 300 es\nin vec4 outTexture;\nout vec4 fragColor;\nvoid main() {\nfragColor = outTexture;\nfragColor.g = outTexture.r / max(1.0, outTexture.a);\n}\n`;\n", "// deck.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nconst uniformBlock = `\\\nuniform weightUniforms {\n vec4 commonBounds;\n float radiusPixels;\n float textureWidth;\n float weightsScale;\n} weight;\n`;\nexport const weightUniforms = {\n name: 'weight',\n vs: uniformBlock,\n uniformTypes: {\n commonBounds: 'vec4<f32>',\n radiusPixels: 'f32',\n textureWidth: 'f32',\n weightsScale: 'f32'\n }\n};\nexport const maxWeightUniforms = {\n name: 'maxWeight',\n vs: `\\\nuniform maxWeightUniforms {\n float textureSize;\n} maxWeight;\n`,\n uniformTypes: {\n textureSize: 'f32'\n }\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_core", "min", "max", "deepEqual", "import_engine", "uniformBlock", "MAX_FLOAT32", "import_core", "count", "deepEqual", "import_core", "import_engine", "import_core", "uniformBlock", "uniformBlock", "import_core", "uniformBlock", "uniformBlock", "binOptionsUniforms", "defaultProps", "binOptionsUniforms", "import_core", "import_layers", "threshold", "threshold", "count", "import_core", "uniformBlock", "binOptionsUniforms", "defaultProps", "binOptionsUniforms", "import_core", "import_layers", "import_engine", "uniformBlock", "uniformBlock", "binOptionsUniforms", "noop", "defaultProps", "GridLayer", "binOptionsUniforms", "import_engine", "import_core", "import_engine", "import_core", "uniformBlock", "threshold", "import_core", "AggregationLayer", "compareProps", "aggregation_layer_default", "uniformBlock", "defaultProps", "aggregation_layer_default", "threshold", "viewport"]
7
7
  }