@deck.gl/extensions 9.0.0-beta.1 → 9.0.0-beta.11

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 (273) hide show
  1. package/dist/brushing/brushing-extension.js +80 -0
  2. package/{typed → dist}/brushing/shader-module.d.ts +1 -1
  3. package/{typed → dist}/brushing/shader-module.d.ts.map +1 -1
  4. package/dist/brushing/shader-module.js +92 -0
  5. package/{typed → dist}/clip/clip-extension.d.ts.map +1 -1
  6. package/dist/clip/clip-extension.js +117 -0
  7. package/{typed → dist}/collision-filter/collision-filter-effect.d.ts +4 -2
  8. package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -0
  9. package/dist/collision-filter/collision-filter-effect.js +194 -0
  10. package/dist/collision-filter/collision-filter-extension.js +49 -0
  11. package/{typed → dist}/collision-filter/collision-filter-pass.d.ts +3 -2
  12. package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -0
  13. package/dist/collision-filter/collision-filter-pass.js +23 -0
  14. package/{typed → dist}/collision-filter/shader-module.d.ts.map +1 -1
  15. package/dist/collision-filter/shader-module.js +87 -0
  16. package/dist/data-filter/aggregator.d.ts.map +1 -0
  17. package/dist/{esm/data-filter → data-filter}/aggregator.js +40 -41
  18. package/{typed → dist}/data-filter/data-filter-extension.d.ts +39 -7
  19. package/dist/data-filter/data-filter-extension.d.ts.map +1 -0
  20. package/dist/data-filter/data-filter-extension.js +256 -0
  21. package/dist/data-filter/shader-module.d.ts +39 -0
  22. package/dist/data-filter/shader-module.d.ts.map +1 -0
  23. package/dist/data-filter/shader-module.js +199 -0
  24. package/dist/dist.dev.js +2667 -11058
  25. package/{typed → dist}/fill-style/fill-style-extension.d.ts +2 -30
  26. package/dist/fill-style/fill-style-extension.d.ts.map +1 -0
  27. package/dist/fill-style/fill-style-extension.js +116 -0
  28. package/{typed/fill-style/shaders.glsl.d.ts → dist/fill-style/shader-module.d.ts} +1 -1
  29. package/dist/fill-style/shader-module.d.ts.map +1 -0
  30. package/dist/fill-style/shader-module.js +96 -0
  31. package/dist/fp64/fp64-extension.js +35 -0
  32. package/dist/fp64/project64.glsl.js +81 -0
  33. package/dist/fp64/project64.js +50 -0
  34. package/dist/index.cjs +2795 -0
  35. package/dist/index.cjs.map +7 -0
  36. package/dist/index.d.ts +19 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +11 -0
  39. package/{typed → dist}/mask/mask-effect.d.ts +6 -5
  40. package/dist/mask/mask-effect.d.ts.map +1 -0
  41. package/dist/mask/mask-effect.js +192 -0
  42. package/dist/mask/mask-extension.js +57 -0
  43. package/dist/mask/mask-pass.d.ts +61 -0
  44. package/dist/mask/mask-pass.d.ts.map +1 -0
  45. package/dist/mask/mask-pass.js +52 -0
  46. package/{typed → dist}/mask/shader-module.d.ts.map +1 -1
  47. package/dist/mask/shader-module.js +77 -0
  48. package/{typed → dist}/path-style/path-style-extension.d.ts.map +1 -1
  49. package/dist/path-style/path-style-extension.js +112 -0
  50. package/dist/path-style/shaders.glsl.js +86 -0
  51. package/{typed → dist}/terrain/height-map-builder.d.ts +1 -1
  52. package/dist/terrain/height-map-builder.d.ts.map +1 -0
  53. package/dist/terrain/height-map-builder.js +104 -0
  54. package/{typed → dist}/terrain/shader-module.d.ts +2 -2
  55. package/dist/terrain/shader-module.d.ts.map +1 -0
  56. package/dist/terrain/shader-module.js +137 -0
  57. package/{typed → dist}/terrain/terrain-cover.d.ts +1 -1
  58. package/dist/terrain/terrain-cover.d.ts.map +1 -0
  59. package/dist/terrain/terrain-cover.js +188 -0
  60. package/{typed → dist}/terrain/terrain-effect.d.ts +6 -7
  61. package/dist/terrain/terrain-effect.d.ts.map +1 -0
  62. package/dist/terrain/terrain-effect.js +174 -0
  63. package/dist/terrain/terrain-extension.js +44 -0
  64. package/dist/terrain/terrain-pass.d.ts +53 -0
  65. package/dist/terrain/terrain-pass.d.ts.map +1 -0
  66. package/dist/terrain/terrain-pass.js +69 -0
  67. package/{typed → dist}/terrain/terrain-picking-pass.d.ts +1 -1
  68. package/dist/terrain/terrain-picking-pass.d.ts.map +1 -0
  69. package/dist/terrain/terrain-picking-pass.js +67 -0
  70. package/{typed → dist}/terrain/utils.d.ts +1 -0
  71. package/{typed → dist}/terrain/utils.d.ts.map +1 -1
  72. package/dist/terrain/utils.js +25 -0
  73. package/{typed → dist}/utils/debug.d.ts.map +1 -1
  74. package/dist/utils/debug.js +50 -0
  75. package/dist/utils/projection-utils.js +153 -0
  76. package/dist/utils/syntax-tags.d.ts +6 -0
  77. package/dist/utils/syntax-tags.d.ts.map +1 -0
  78. package/dist/utils/syntax-tags.js +5 -0
  79. package/dist.min.js +918 -1254
  80. package/package.json +19 -16
  81. package/src/brushing/shader-module.ts +4 -3
  82. package/src/clip/clip-extension.ts +10 -9
  83. package/src/collision-filter/collision-filter-effect.ts +35 -31
  84. package/src/collision-filter/collision-filter-pass.ts +7 -13
  85. package/src/collision-filter/shader-module.ts +6 -4
  86. package/src/data-filter/aggregator.ts +8 -13
  87. package/src/data-filter/data-filter-extension.ts +181 -56
  88. package/src/data-filter/shader-module.ts +132 -37
  89. package/src/fill-style/fill-style-extension.ts +4 -5
  90. package/src/fill-style/{shaders.glsl.ts → shader-module.ts} +6 -5
  91. package/src/mask/mask-effect.ts +30 -20
  92. package/src/mask/mask-pass.ts +22 -18
  93. package/src/mask/shader-module.ts +7 -6
  94. package/src/path-style/path-style-extension.ts +1 -0
  95. package/src/terrain/shader-module.ts +14 -13
  96. package/src/terrain/terrain-cover.ts +2 -1
  97. package/src/terrain/terrain-effect.ts +19 -23
  98. package/src/terrain/terrain-pass.ts +37 -37
  99. package/src/terrain/terrain-picking-pass.ts +19 -25
  100. package/src/terrain/utils.ts +13 -7
  101. package/src/utils/debug.ts +1 -2
  102. package/src/utils/syntax-tags.ts +5 -0
  103. package/dist/es5/brushing/brushing-extension.js +0 -108
  104. package/dist/es5/brushing/brushing-extension.js.map +0 -1
  105. package/dist/es5/brushing/shader-module.js +0 -50
  106. package/dist/es5/brushing/shader-module.js.map +0 -1
  107. package/dist/es5/clip/clip-extension.js +0 -98
  108. package/dist/es5/clip/clip-extension.js.map +0 -1
  109. package/dist/es5/collision-filter/collision-filter-effect.js +0 -294
  110. package/dist/es5/collision-filter/collision-filter-effect.js.map +0 -1
  111. package/dist/es5/collision-filter/collision-filter-extension.js +0 -109
  112. package/dist/es5/collision-filter/collision-filter-extension.js.map +0 -1
  113. package/dist/es5/collision-filter/collision-filter-pass.js +0 -79
  114. package/dist/es5/collision-filter/collision-filter-pass.js.map +0 -1
  115. package/dist/es5/collision-filter/shader-module.js +0 -39
  116. package/dist/es5/collision-filter/shader-module.js.map +0 -1
  117. package/dist/es5/data-filter/aggregator.js +0 -79
  118. package/dist/es5/data-filter/aggregator.js.map +0 -1
  119. package/dist/es5/data-filter/data-filter-extension.js +0 -236
  120. package/dist/es5/data-filter/data-filter-extension.js.map +0 -1
  121. package/dist/es5/data-filter/shader-module.js +0 -122
  122. package/dist/es5/data-filter/shader-module.js.map +0 -1
  123. package/dist/es5/fill-style/fill-style-extension.js +0 -190
  124. package/dist/es5/fill-style/fill-style-extension.js.map +0 -1
  125. package/dist/es5/fill-style/shaders.glsl.js +0 -59
  126. package/dist/es5/fill-style/shaders.glsl.js.map +0 -1
  127. package/dist/es5/fp64/fp64-extension.js +0 -55
  128. package/dist/es5/fp64/fp64-extension.js.map +0 -1
  129. package/dist/es5/fp64/project64.glsl.js +0 -9
  130. package/dist/es5/fp64/project64.glsl.js.map +0 -1
  131. package/dist/es5/fp64/project64.js +0 -52
  132. package/dist/es5/fp64/project64.js.map +0 -1
  133. package/dist/es5/index.js +0 -88
  134. package/dist/es5/index.js.map +0 -1
  135. package/dist/es5/mask/mask-effect.js +0 -279
  136. package/dist/es5/mask/mask-effect.js.map +0 -1
  137. package/dist/es5/mask/mask-extension.js +0 -113
  138. package/dist/es5/mask/mask-extension.js.map +0 -1
  139. package/dist/es5/mask/mask-pass.js +0 -106
  140. package/dist/es5/mask/mask-pass.js.map +0 -1
  141. package/dist/es5/mask/shader-module.js +0 -38
  142. package/dist/es5/mask/shader-module.js.map +0 -1
  143. package/dist/es5/path-style/path-style-extension.js +0 -169
  144. package/dist/es5/path-style/path-style-extension.js.map +0 -1
  145. package/dist/es5/path-style/shaders.glsl.js +0 -25
  146. package/dist/es5/path-style/shaders.glsl.js.map +0 -1
  147. package/dist/es5/terrain/height-map-builder.js +0 -111
  148. package/dist/es5/terrain/height-map-builder.js.map +0 -1
  149. package/dist/es5/terrain/shader-module.js +0 -86
  150. package/dist/es5/terrain/shader-module.js.map +0 -1
  151. package/dist/es5/terrain/terrain-cover.js +0 -256
  152. package/dist/es5/terrain/terrain-cover.js.map +0 -1
  153. package/dist/es5/terrain/terrain-effect.js +0 -326
  154. package/dist/es5/terrain/terrain-effect.js.map +0 -1
  155. package/dist/es5/terrain/terrain-extension.js +0 -94
  156. package/dist/es5/terrain/terrain-extension.js.map +0 -1
  157. package/dist/es5/terrain/terrain-pass.js +0 -121
  158. package/dist/es5/terrain/terrain-pass.js.map +0 -1
  159. package/dist/es5/terrain/terrain-picking-pass.js +0 -124
  160. package/dist/es5/terrain/terrain-picking-pass.js.map +0 -1
  161. package/dist/es5/terrain/utils.js +0 -35
  162. package/dist/es5/terrain/utils.js.map +0 -1
  163. package/dist/es5/utils/debug.js +0 -71
  164. package/dist/es5/utils/debug.js.map +0 -1
  165. package/dist/es5/utils/projection-utils.js +0 -168
  166. package/dist/es5/utils/projection-utils.js.map +0 -1
  167. package/dist/esm/brushing/brushing-extension.js +0 -68
  168. package/dist/esm/brushing/brushing-extension.js.map +0 -1
  169. package/dist/esm/brushing/shader-module.js +0 -103
  170. package/dist/esm/brushing/shader-module.js.map +0 -1
  171. package/dist/esm/clip/clip-extension.js +0 -86
  172. package/dist/esm/clip/clip-extension.js.map +0 -1
  173. package/dist/esm/collision-filter/collision-filter-effect.js +0 -246
  174. package/dist/esm/collision-filter/collision-filter-effect.js.map +0 -1
  175. package/dist/esm/collision-filter/collision-filter-extension.js +0 -75
  176. package/dist/esm/collision-filter/collision-filter-extension.js.map +0 -1
  177. package/dist/esm/collision-filter/collision-filter-pass.js +0 -32
  178. package/dist/esm/collision-filter/collision-filter-pass.js.map +0 -1
  179. package/dist/esm/collision-filter/shader-module.js +0 -104
  180. package/dist/esm/collision-filter/shader-module.js.map +0 -1
  181. package/dist/esm/data-filter/aggregator.js.map +0 -1
  182. package/dist/esm/data-filter/data-filter-extension.js +0 -189
  183. package/dist/esm/data-filter/data-filter-extension.js.map +0 -1
  184. package/dist/esm/data-filter/shader-module.js +0 -164
  185. package/dist/esm/data-filter/shader-module.js.map +0 -1
  186. package/dist/esm/fill-style/fill-style-extension.js +0 -156
  187. package/dist/esm/fill-style/fill-style-extension.js.map +0 -1
  188. package/dist/esm/fill-style/shaders.glsl.js +0 -108
  189. package/dist/esm/fill-style/shaders.glsl.js.map +0 -1
  190. package/dist/esm/fp64/fp64-extension.js +0 -20
  191. package/dist/esm/fp64/fp64-extension.js.map +0 -1
  192. package/dist/esm/fp64/project64.glsl.js +0 -82
  193. package/dist/esm/fp64/project64.glsl.js.map +0 -1
  194. package/dist/esm/fp64/project64.js +0 -43
  195. package/dist/esm/fp64/project64.js.map +0 -1
  196. package/dist/esm/index.js +0 -11
  197. package/dist/esm/index.js.map +0 -1
  198. package/dist/esm/mask/mask-effect.js +0 -228
  199. package/dist/esm/mask/mask-effect.js.map +0 -1
  200. package/dist/esm/mask/mask-extension.js +0 -83
  201. package/dist/esm/mask/mask-extension.js.map +0 -1
  202. package/dist/esm/mask/mask-pass.js +0 -58
  203. package/dist/esm/mask/mask-pass.js.map +0 -1
  204. package/dist/esm/mask/shader-module.js +0 -84
  205. package/dist/esm/mask/shader-module.js.map +0 -1
  206. package/dist/esm/path-style/path-style-extension.js +0 -130
  207. package/dist/esm/path-style/path-style-extension.js.map +0 -1
  208. package/dist/esm/path-style/shaders.glsl.js +0 -84
  209. package/dist/esm/path-style/shaders.glsl.js.map +0 -1
  210. package/dist/esm/terrain/height-map-builder.js +0 -86
  211. package/dist/esm/terrain/height-map-builder.js.map +0 -1
  212. package/dist/esm/terrain/shader-module.js +0 -127
  213. package/dist/esm/terrain/shader-module.js.map +0 -1
  214. package/dist/esm/terrain/terrain-cover.js +0 -212
  215. package/dist/esm/terrain/terrain-cover.js.map +0 -1
  216. package/dist/esm/terrain/terrain-effect.js +0 -219
  217. package/dist/esm/terrain/terrain-effect.js.map +0 -1
  218. package/dist/esm/terrain/terrain-extension.js +0 -59
  219. package/dist/esm/terrain/terrain-extension.js.map +0 -1
  220. package/dist/esm/terrain/terrain-pass.js +0 -71
  221. package/dist/esm/terrain/terrain-pass.js.map +0 -1
  222. package/dist/esm/terrain/terrain-picking-pass.js +0 -73
  223. package/dist/esm/terrain/terrain-picking-pass.js.map +0 -1
  224. package/dist/esm/terrain/utils.js +0 -19
  225. package/dist/esm/terrain/utils.js.map +0 -1
  226. package/dist/esm/utils/debug.js +0 -61
  227. package/dist/esm/utils/debug.js.map +0 -1
  228. package/dist/esm/utils/projection-utils.js +0 -134
  229. package/dist/esm/utils/projection-utils.js.map +0 -1
  230. package/typed/collision-filter/collision-filter-effect.d.ts.map +0 -1
  231. package/typed/collision-filter/collision-filter-pass.d.ts.map +0 -1
  232. package/typed/data-filter/aggregator.d.ts.map +0 -1
  233. package/typed/data-filter/data-filter-extension.d.ts.map +0 -1
  234. package/typed/data-filter/shader-module.d.ts +0 -9
  235. package/typed/data-filter/shader-module.d.ts.map +0 -1
  236. package/typed/fill-style/fill-style-extension.d.ts.map +0 -1
  237. package/typed/fill-style/shaders.glsl.d.ts.map +0 -1
  238. package/typed/index.d.ts +0 -19
  239. package/typed/index.d.ts.map +0 -1
  240. package/typed/mask/mask-effect.d.ts.map +0 -1
  241. package/typed/mask/mask-pass.d.ts +0 -19
  242. package/typed/mask/mask-pass.d.ts.map +0 -1
  243. package/typed/terrain/height-map-builder.d.ts.map +0 -1
  244. package/typed/terrain/shader-module.d.ts.map +0 -1
  245. package/typed/terrain/terrain-cover.d.ts.map +0 -1
  246. package/typed/terrain/terrain-effect.d.ts.map +0 -1
  247. package/typed/terrain/terrain-pass.d.ts +0 -11
  248. package/typed/terrain/terrain-pass.d.ts.map +0 -1
  249. package/typed/terrain/terrain-picking-pass.d.ts.map +0 -1
  250. /package/{typed → dist}/brushing/brushing-extension.d.ts +0 -0
  251. /package/{typed → dist}/brushing/brushing-extension.d.ts.map +0 -0
  252. /package/{typed → dist}/clip/clip-extension.d.ts +0 -0
  253. /package/{typed → dist}/collision-filter/collision-filter-extension.d.ts +0 -0
  254. /package/{typed → dist}/collision-filter/collision-filter-extension.d.ts.map +0 -0
  255. /package/{typed → dist}/collision-filter/shader-module.d.ts +0 -0
  256. /package/{typed → dist}/data-filter/aggregator.d.ts +0 -0
  257. /package/{typed → dist}/fp64/fp64-extension.d.ts +0 -0
  258. /package/{typed → dist}/fp64/fp64-extension.d.ts.map +0 -0
  259. /package/{typed → dist}/fp64/project64.d.ts +0 -0
  260. /package/{typed → dist}/fp64/project64.d.ts.map +0 -0
  261. /package/{typed → dist}/fp64/project64.glsl.d.ts +0 -0
  262. /package/{typed → dist}/fp64/project64.glsl.d.ts.map +0 -0
  263. /package/{typed → dist}/mask/mask-extension.d.ts +0 -0
  264. /package/{typed → dist}/mask/mask-extension.d.ts.map +0 -0
  265. /package/{typed → dist}/mask/shader-module.d.ts +0 -0
  266. /package/{typed → dist}/path-style/path-style-extension.d.ts +0 -0
  267. /package/{typed → dist}/path-style/shaders.glsl.d.ts +0 -0
  268. /package/{typed → dist}/path-style/shaders.glsl.d.ts.map +0 -0
  269. /package/{typed → dist}/terrain/terrain-extension.d.ts +0 -0
  270. /package/{typed → dist}/terrain/terrain-extension.d.ts.map +0 -0
  271. /package/{typed → dist}/utils/debug.d.ts +0 -0
  272. /package/{typed → dist}/utils/projection-utils.d.ts +0 -0
  273. /package/{typed → dist}/utils/projection-utils.d.ts.map +0 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,2795 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // dist/index.js
21
+ var dist_exports = {};
22
+ __export(dist_exports, {
23
+ BrushingExtension: () => BrushingExtension,
24
+ ClipExtension: () => ClipExtension,
25
+ CollisionFilterExtension: () => CollisionFilterExtension,
26
+ DataFilterExtension: () => DataFilterExtension,
27
+ FillStyleExtension: () => FillStyleExtension,
28
+ Fp64Extension: () => Fp64Extension,
29
+ MaskExtension: () => MaskExtension,
30
+ PathStyleExtension: () => PathStyleExtension,
31
+ _TerrainExtension: () => TerrainExtension,
32
+ project64: () => project64_default
33
+ });
34
+ module.exports = __toCommonJS(dist_exports);
35
+
36
+ // dist/brushing/brushing-extension.js
37
+ var import_core2 = require("@deck.gl/core");
38
+
39
+ // dist/brushing/shader-module.js
40
+ var import_core = require("@deck.gl/core");
41
+ var vs = `
42
+ uniform bool brushing_enabled;
43
+ uniform int brushing_target;
44
+ uniform vec2 brushing_mousePos;
45
+ uniform float brushing_radius;
46
+ #ifdef NON_INSTANCED_MODEL
47
+ in vec2 brushingTargets;
48
+ #else
49
+ in vec2 instanceBrushingTargets;
50
+ #endif
51
+ out float brushing_isVisible;
52
+ bool brushing_isPointInRange(vec2 position) {
53
+ if (!brushing_enabled) {
54
+ return true;
55
+ }
56
+ vec2 source_commonspace = project_position(position);
57
+ vec2 target_commonspace = project_position(brushing_mousePos);
58
+ float distance = length((target_commonspace - source_commonspace) / project_uCommonUnitsPerMeter.xy);
59
+ return distance <= brushing_radius;
60
+ }
61
+ bool brushing_arePointsInRange(vec2 sourcePos, vec2 targetPos) {
62
+ return brushing_isPointInRange(sourcePos) || brushing_isPointInRange(targetPos);
63
+ }
64
+ void brushing_setVisible(bool visible) {
65
+ brushing_isVisible = float(visible);
66
+ }
67
+ `;
68
+ var fs = `
69
+ uniform bool brushing_enabled;
70
+ in float brushing_isVisible;
71
+ `;
72
+ var TARGET = {
73
+ source: 0,
74
+ target: 1,
75
+ custom: 2,
76
+ source_target: 3
77
+ };
78
+ var inject = {
79
+ "vs:DECKGL_FILTER_GL_POSITION": `
80
+ vec2 brushingTarget;
81
+ vec2 brushingSource;
82
+ if (brushing_target == 3) {
83
+ brushingTarget = geometry.worldPositionAlt.xy;
84
+ brushingSource = geometry.worldPosition.xy;
85
+ } else if (brushing_target == 0) {
86
+ brushingTarget = geometry.worldPosition.xy;
87
+ } else if (brushing_target == 1) {
88
+ brushingTarget = geometry.worldPositionAlt.xy;
89
+ } else {
90
+ #ifdef NON_INSTANCED_MODEL
91
+ brushingTarget = brushingTargets;
92
+ #else
93
+ brushingTarget = instanceBrushingTargets;
94
+ #endif
95
+ }
96
+ bool visible;
97
+ if (brushing_target == 3) {
98
+ visible = brushing_arePointsInRange(brushingSource, brushingTarget);
99
+ } else {
100
+ visible = brushing_isPointInRange(brushingTarget);
101
+ }
102
+ brushing_setVisible(visible);
103
+ `,
104
+ "fs:DECKGL_FILTER_COLOR": `
105
+ if (brushing_enabled && brushing_isVisible < 0.5) {
106
+ discard;
107
+ }
108
+ `
109
+ };
110
+ var shader_module_default = {
111
+ name: "brushing",
112
+ dependencies: [import_core.project],
113
+ vs,
114
+ fs,
115
+ inject,
116
+ getUniforms: (opts) => {
117
+ if (!opts || !("viewport" in opts)) {
118
+ return {};
119
+ }
120
+ const { brushingEnabled = true, brushingRadius = 1e4, brushingTarget = "source", mousePosition, viewport } = opts;
121
+ return {
122
+ brushing_enabled: Boolean(brushingEnabled && mousePosition && viewport.containsPixel(mousePosition)),
123
+ brushing_radius: brushingRadius,
124
+ brushing_target: TARGET[brushingTarget] || 0,
125
+ brushing_mousePos: mousePosition ? viewport.unproject([mousePosition.x - viewport.x, mousePosition.y - viewport.y]) : [0, 0]
126
+ };
127
+ }
128
+ };
129
+
130
+ // dist/brushing/brushing-extension.js
131
+ var defaultProps = {
132
+ getBrushingTarget: { type: "accessor", value: [0, 0] },
133
+ brushingTarget: "source",
134
+ brushingEnabled: true,
135
+ brushingRadius: 1e4
136
+ };
137
+ var _BrushingExtension = class extends import_core2.LayerExtension {
138
+ getShaders() {
139
+ return {
140
+ modules: [shader_module_default]
141
+ };
142
+ }
143
+ initializeState(context, extension) {
144
+ const attributeManager = this.getAttributeManager();
145
+ if (attributeManager) {
146
+ attributeManager.add({
147
+ brushingTargets: {
148
+ size: 2,
149
+ accessor: "getBrushingTarget",
150
+ shaderAttributes: {
151
+ brushingTargets: {
152
+ divisor: 0
153
+ },
154
+ instanceBrushingTargets: {
155
+ divisor: 1
156
+ }
157
+ }
158
+ }
159
+ });
160
+ }
161
+ const onMouseMove = () => {
162
+ var _a;
163
+ (_a = this.getCurrentLayer()) == null ? void 0 : _a.setNeedsRedraw();
164
+ };
165
+ this.state.onMouseMove = onMouseMove;
166
+ if (context.deck) {
167
+ context.deck.eventManager.on({
168
+ pointermove: onMouseMove,
169
+ pointerleave: onMouseMove
170
+ });
171
+ }
172
+ }
173
+ finalizeState(context, extension) {
174
+ if (context.deck) {
175
+ const onMouseMove = this.state.onMouseMove;
176
+ context.deck.eventManager.off({
177
+ pointermove: onMouseMove,
178
+ pointerleave: onMouseMove
179
+ });
180
+ }
181
+ }
182
+ };
183
+ var BrushingExtension = _BrushingExtension;
184
+ (() => {
185
+ _BrushingExtension.defaultProps = defaultProps;
186
+ })();
187
+ (() => {
188
+ _BrushingExtension.extensionName = "BrushingExtension";
189
+ })();
190
+
191
+ // dist/data-filter/data-filter-extension.js
192
+ var import_core3 = require("@deck.gl/core");
193
+
194
+ // dist/data-filter/shader-module.js
195
+ var vs2 = `
196
+ uniform bool filter_useSoftMargin;
197
+ uniform bool filter_enabled;
198
+ uniform bool filter_transformSize;
199
+ uniform ivec4 filter_categoryBitMask;
200
+ #ifdef DATAFILTER_TYPE
201
+ uniform DATAFILTER_TYPE filter_min;
202
+ uniform DATAFILTER_TYPE filter_softMin;
203
+ uniform DATAFILTER_TYPE filter_softMax;
204
+ uniform DATAFILTER_TYPE filter_max;
205
+ #ifdef NON_INSTANCED_MODEL
206
+ #define DATAFILTER_ATTRIB filterValues
207
+ #define DATAFILTER_ATTRIB_64LOW filterValues64Low
208
+ #else
209
+ #define DATAFILTER_ATTRIB instanceFilterValues
210
+ #define DATAFILTER_ATTRIB_64LOW instanceFilterValues64Low
211
+ #endif
212
+ in DATAFILTER_TYPE DATAFILTER_ATTRIB;
213
+ #ifdef DATAFILTER_DOUBLE
214
+ in DATAFILTER_TYPE DATAFILTER_ATTRIB_64LOW;
215
+ uniform DATAFILTER_TYPE filter_min64High;
216
+ uniform DATAFILTER_TYPE filter_max64High;
217
+ #endif
218
+ #endif
219
+ #ifdef DATACATEGORY_TYPE
220
+ #ifdef NON_INSTANCED_MODEL
221
+ #define DATACATEGORY_ATTRIB filterCategoryValues
222
+ #else
223
+ #define DATACATEGORY_ATTRIB instanceFilterCategoryValues
224
+ #endif
225
+ in DATACATEGORY_TYPE DATACATEGORY_ATTRIB;
226
+ #endif
227
+ out float dataFilter_value;
228
+ float dataFilter_reduceValue(float value) {
229
+ return value;
230
+ }
231
+ float dataFilter_reduceValue(vec2 value) {
232
+ return min(value.x, value.y);
233
+ }
234
+ float dataFilter_reduceValue(vec3 value) {
235
+ return min(min(value.x, value.y), value.z);
236
+ }
237
+ float dataFilter_reduceValue(vec4 value) {
238
+ return min(min(value.x, value.y), min(value.z, value.w));
239
+ }
240
+ #ifdef DATAFILTER_TYPE
241
+ void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {
242
+ if (filter_useSoftMargin) {
243
+ DATAFILTER_TYPE leftInRange = mix(
244
+ smoothstep(filter_min, filter_softMin, valueFromMin),
245
+ step(filter_min, valueFromMin),
246
+ step(filter_softMin, filter_min)
247
+ );
248
+ DATAFILTER_TYPE rightInRange = mix(
249
+ 1.0 - smoothstep(filter_softMax, filter_max, valueFromMax),
250
+ step(valueFromMax, filter_max),
251
+ step(filter_max, filter_softMax)
252
+ );
253
+ dataFilter_value = dataFilter_reduceValue(leftInRange * rightInRange);
254
+ } else {
255
+ dataFilter_value = dataFilter_reduceValue(
256
+ step(filter_min, valueFromMin) * step(valueFromMax, filter_max)
257
+ );
258
+ }
259
+ }
260
+ #endif
261
+ #ifdef DATACATEGORY_ATTRIB
262
+ void dataFilter_setCategoryValue(DATACATEGORY_TYPE category) {
263
+ #if DATACATEGORY_CHANNELS == 1
264
+ int dataFilter_masks = filter_categoryBitMask[int(category / 32.0)];
265
+ #elif DATACATEGORY_CHANNELS == 2
266
+ ivec2 dataFilter_masks = ivec2(
267
+ filter_categoryBitMask[int(category.x / 32.0)],
268
+ filter_categoryBitMask[int(category.y / 32.0) + 2]
269
+ );
270
+ #elif DATACATEGORY_CHANNELS == 3
271
+ ivec3 dataFilter_masks = filter_categoryBitMask.xyz;
272
+ #else
273
+ ivec4 dataFilter_masks = filter_categoryBitMask;
274
+ #endif
275
+ DATACATEGORY_TYPE dataFilter_bits = DATACATEGORY_TYPE(dataFilter_masks) / pow(DATACATEGORY_TYPE(2.0), mod(category, 32.0));
276
+ dataFilter_bits = mod(floor(dataFilter_bits), 2.0);
277
+ #if DATACATEGORY_CHANNELS == 1
278
+ if(dataFilter_bits == 0.0) dataFilter_value = 0.0;
279
+ #else
280
+ if(any(equal(dataFilter_bits, DATACATEGORY_TYPE(0.0)))) dataFilter_value = 0.0;
281
+ #endif
282
+ }
283
+ #endif
284
+ `;
285
+ var fs2 = `
286
+ uniform bool filter_transformColor;
287
+ in float dataFilter_value;
288
+ `;
289
+ function getUniforms(opts) {
290
+ if (!opts || !("extensions" in opts)) {
291
+ return {};
292
+ }
293
+ const { filterRange = [-1, 1], filterEnabled = true, filterTransformSize = true, filterTransformColor = true } = opts;
294
+ const filterSoftRange = opts.filterSoftRange || filterRange;
295
+ return {
296
+ ...Number.isFinite(filterRange[0]) ? {
297
+ filter_min: filterRange[0],
298
+ filter_softMin: filterSoftRange[0],
299
+ filter_softMax: filterSoftRange[1],
300
+ filter_max: filterRange[1]
301
+ } : {
302
+ filter_min: filterRange.map((r) => r[0]),
303
+ filter_softMin: filterSoftRange.map((r) => r[0]),
304
+ filter_softMax: filterSoftRange.map((r) => r[1]),
305
+ filter_max: filterRange.map((r) => r[1])
306
+ },
307
+ filter_enabled: filterEnabled,
308
+ filter_useSoftMargin: Boolean(opts.filterSoftRange),
309
+ filter_transformSize: filterEnabled && filterTransformSize,
310
+ filter_transformColor: filterEnabled && filterTransformColor
311
+ };
312
+ }
313
+ function getUniforms64(opts) {
314
+ if (!opts || !("extensions" in opts)) {
315
+ return {};
316
+ }
317
+ const uniforms = getUniforms(opts);
318
+ if (Number.isFinite(uniforms.filter_min)) {
319
+ const min64High = Math.fround(uniforms.filter_min);
320
+ uniforms.filter_min -= min64High;
321
+ uniforms.filter_softMin -= min64High;
322
+ uniforms.filter_min64High = min64High;
323
+ const max64High = Math.fround(uniforms.filter_max);
324
+ uniforms.filter_max -= max64High;
325
+ uniforms.filter_softMax -= max64High;
326
+ uniforms.filter_max64High = max64High;
327
+ } else {
328
+ const min64High = uniforms.filter_min.map(Math.fround);
329
+ uniforms.filter_min = uniforms.filter_min.map((x, i) => x - min64High[i]);
330
+ uniforms.filter_softMin = uniforms.filter_softMin.map((x, i) => x - min64High[i]);
331
+ uniforms.filter_min64High = min64High;
332
+ const max64High = uniforms.filter_max.map(Math.fround);
333
+ uniforms.filter_max = uniforms.filter_max.map((x, i) => x - max64High[i]);
334
+ uniforms.filter_softMax = uniforms.filter_softMax.map((x, i) => x - max64High[i]);
335
+ uniforms.filter_max64High = max64High;
336
+ }
337
+ return uniforms;
338
+ }
339
+ var inject2 = {
340
+ "vs:#main-start": `
341
+ dataFilter_value = 1.0;
342
+ if (filter_enabled) {
343
+ #ifdef DATAFILTER_ATTRIB
344
+ #ifdef DATAFILTER_DOUBLE
345
+ dataFilter_setValue(
346
+ DATAFILTER_ATTRIB - filter_min64High + DATAFILTER_ATTRIB_64LOW,
347
+ DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW
348
+ );
349
+ #else
350
+ dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB);
351
+ #endif
352
+ #endif
353
+ #ifdef DATACATEGORY_ATTRIB
354
+ dataFilter_setCategoryValue(DATACATEGORY_ATTRIB);
355
+ #endif
356
+ }
357
+ `,
358
+ "vs:#main-end": `
359
+ if (dataFilter_value == 0.0) {
360
+ gl_Position = vec4(0.);
361
+ }
362
+ `,
363
+ "vs:DECKGL_FILTER_SIZE": `
364
+ if (filter_transformSize) {
365
+ size = size * dataFilter_value;
366
+ }
367
+ `,
368
+ "fs:DECKGL_FILTER_COLOR": `
369
+ if (dataFilter_value == 0.0) discard;
370
+ if (filter_transformColor) {
371
+ color.a *= dataFilter_value;
372
+ }
373
+ `
374
+ };
375
+ var shaderModule = {
376
+ name: "data-filter",
377
+ vs: vs2,
378
+ fs: fs2,
379
+ inject: inject2,
380
+ getUniforms
381
+ };
382
+ var shaderModule64 = {
383
+ name: "data-filter-fp64",
384
+ vs: vs2,
385
+ fs: fs2,
386
+ inject: inject2,
387
+ getUniforms: getUniforms64
388
+ };
389
+
390
+ // dist/data-filter/aggregator.js
391
+ var import_engine = require("@luma.gl/engine");
392
+ var import_constants = require("@luma.gl/constants");
393
+ var AGGREGATE_VS = `#version 300 es
394
+ #define SHADER_NAME data-filter-vertex-shader
395
+
396
+ #ifdef FLOAT_TARGET
397
+ in float filterIndices;
398
+ in float filterPrevIndices;
399
+ #else
400
+ in vec2 filterIndices;
401
+ in vec2 filterPrevIndices;
402
+ #endif
403
+
404
+ out vec4 vColor;
405
+ const float component = 1.0 / 255.0;
406
+
407
+ void main() {
408
+ #ifdef FLOAT_TARGET
409
+ dataFilter_value *= float(filterIndices != filterPrevIndices);
410
+ gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
411
+ vColor = vec4(0.0, 0.0, 0.0, 1.0);
412
+ #else
413
+ // Float texture is not supported: pack result into 4 channels x 256 px x 64px
414
+ dataFilter_value *= float(filterIndices.x != filterPrevIndices.x);
415
+ float col = filterIndices.x;
416
+ float row = filterIndices.y * 4.0;
417
+ float channel = floor(row);
418
+ row = fract(row);
419
+ vColor = component * vec4(bvec4(channel == 0.0, channel == 1.0, channel == 2.0, channel == 3.0));
420
+ gl_Position = vec4(col * 2.0 - 1.0, row * 2.0 - 1.0, 0.0, 1.0);
421
+ #endif
422
+ gl_PointSize = 1.0;
423
+ }
424
+ `;
425
+ var AGGREGATE_FS = `#version 300 es
426
+ #define SHADER_NAME data-filter-fragment-shader
427
+ precision highp float;
428
+
429
+ in vec4 vColor;
430
+
431
+ out vec4 fragColor;
432
+
433
+ void main() {
434
+ if (dataFilter_value < 0.5) {
435
+ discard;
436
+ }
437
+ fragColor = vColor;
438
+ }
439
+ `;
440
+ var FLOAT_TARGET_FEATURES = [
441
+ "float32-renderable-webgl",
442
+ "texture-blend-float-webgl"
443
+ ];
444
+ function supportsFloatTarget(device) {
445
+ return FLOAT_TARGET_FEATURES.every((feature) => device.features.has(feature));
446
+ }
447
+ function getFramebuffer(device, useFloatTarget) {
448
+ if (useFloatTarget) {
449
+ return device.createFramebuffer({
450
+ width: 1,
451
+ height: 1,
452
+ colorAttachments: [
453
+ device.createTexture({
454
+ format: "rgba32float",
455
+ type: 5126,
456
+ mipmaps: false
457
+ })
458
+ ]
459
+ });
460
+ }
461
+ return device.createFramebuffer({
462
+ width: 256,
463
+ height: 64,
464
+ colorAttachments: [device.createTexture({ format: "rgba8unorm", type: 5126, mipmaps: false })]
465
+ });
466
+ }
467
+ function getModel(device, shaderOptions, useFloatTarget) {
468
+ shaderOptions.defines.NON_INSTANCED_MODEL = 1;
469
+ if (useFloatTarget) {
470
+ shaderOptions.defines.FLOAT_TARGET = 1;
471
+ }
472
+ return new import_engine.Model(device, {
473
+ id: "data-filter-aggregation-model",
474
+ vertexCount: 1,
475
+ isInstanced: false,
476
+ drawMode: 0,
477
+ vs: AGGREGATE_VS,
478
+ fs: AGGREGATE_FS,
479
+ ...shaderOptions
480
+ });
481
+ }
482
+ var parameters = {
483
+ blend: true,
484
+ blendFunc: [1, 1, 1, 1],
485
+ blendEquation: [32774, 32774],
486
+ depthTest: false
487
+ };
488
+
489
+ // dist/data-filter/data-filter-extension.js
490
+ var defaultProps2 = {
491
+ getFilterValue: { type: "accessor", value: 0 },
492
+ getFilterCategory: { type: "accessor", value: 0 },
493
+ onFilteredItemsChange: { type: "function", value: null, optional: true },
494
+ filterEnabled: true,
495
+ filterRange: [-1, 1],
496
+ filterSoftRange: null,
497
+ filterCategories: [0],
498
+ filterTransformSize: true,
499
+ filterTransformColor: true
500
+ };
501
+ var defaultOptions = {
502
+ categorySize: 0,
503
+ filterSize: 1,
504
+ fp64: false,
505
+ countItems: false
506
+ };
507
+ var DATA_TYPE_FROM_SIZE = {
508
+ 1: "float",
509
+ 2: "vec2",
510
+ 3: "vec3",
511
+ 4: "vec4"
512
+ };
513
+ var _DataFilterExtension = class extends import_core3.LayerExtension {
514
+ constructor(opts = {}) {
515
+ super({ ...defaultOptions, ...opts });
516
+ }
517
+ getShaders(extension) {
518
+ const { categorySize, filterSize, fp64: fp642 } = extension.opts;
519
+ const defines = {};
520
+ if (categorySize) {
521
+ defines.DATACATEGORY_TYPE = DATA_TYPE_FROM_SIZE[categorySize];
522
+ defines.DATACATEGORY_CHANNELS = categorySize;
523
+ }
524
+ if (filterSize) {
525
+ defines.DATAFILTER_TYPE = DATA_TYPE_FROM_SIZE[filterSize];
526
+ defines.DATAFILTER_DOUBLE = Boolean(fp642);
527
+ }
528
+ return { modules: [fp642 ? shaderModule64 : shaderModule], defines };
529
+ }
530
+ initializeState(context, extension) {
531
+ const attributeManager = this.getAttributeManager();
532
+ const { categorySize, filterSize, fp64: fp642 } = extension.opts;
533
+ if (attributeManager) {
534
+ if (filterSize) {
535
+ attributeManager.add({
536
+ filterValues: {
537
+ size: filterSize,
538
+ type: fp642 ? "float64" : "float32",
539
+ accessor: "getFilterValue",
540
+ shaderAttributes: {
541
+ filterValues: {
542
+ divisor: 0
543
+ },
544
+ instanceFilterValues: {
545
+ divisor: 1
546
+ }
547
+ }
548
+ }
549
+ });
550
+ }
551
+ if (categorySize) {
552
+ attributeManager.add({
553
+ filterCategoryValues: {
554
+ size: categorySize,
555
+ accessor: "getFilterCategory",
556
+ transform: categorySize === 1 ? (d) => extension._getCategoryKey.call(this, d, 0) : (d) => d.map((x, i) => extension._getCategoryKey.call(this, x, i)),
557
+ shaderAttributes: {
558
+ filterCategoryValues: {
559
+ divisor: 0
560
+ },
561
+ instanceFilterCategoryValues: {
562
+ divisor: 1
563
+ }
564
+ }
565
+ }
566
+ });
567
+ }
568
+ }
569
+ const { device } = this.context;
570
+ if (attributeManager && extension.opts.countItems) {
571
+ const useFloatTarget = supportsFloatTarget(device);
572
+ attributeManager.add({
573
+ filterIndices: {
574
+ size: useFloatTarget ? 1 : 2,
575
+ vertexOffset: 1,
576
+ type: "unorm8",
577
+ accessor: (object, { index }) => {
578
+ const i = object && object.__source ? object.__source.index : index;
579
+ return useFloatTarget ? (i + 1) % 255 : [(i + 1) % 255, Math.floor(i / 255) % 255];
580
+ },
581
+ shaderAttributes: {
582
+ filterPrevIndices: {
583
+ vertexOffset: 0
584
+ },
585
+ filterIndices: {
586
+ vertexOffset: 1
587
+ }
588
+ }
589
+ }
590
+ });
591
+ const filterFBO = getFramebuffer(device, useFloatTarget);
592
+ const filterModel = getModel(device, extension.getShaders.call(this, extension), useFloatTarget);
593
+ this.setState({ filterFBO, filterModel });
594
+ }
595
+ }
596
+ updateState({ props, oldProps, changeFlags }, extension) {
597
+ var _a, _b;
598
+ const attributeManager = this.getAttributeManager();
599
+ const { categorySize } = extension.opts;
600
+ if (this.state.filterModel) {
601
+ const filterNeedsUpdate = ((_a = attributeManager.attributes.filterValues) == null ? void 0 : _a.needsUpdate()) || ((_b = attributeManager.attributes.filterCategoryValues) == null ? void 0 : _b.needsUpdate()) || props.filterEnabled !== oldProps.filterEnabled || props.filterRange !== oldProps.filterRange || props.filterSoftRange !== oldProps.filterSoftRange || props.filterCategories !== oldProps.filterCategories;
602
+ if (filterNeedsUpdate) {
603
+ this.setState({ filterNeedsUpdate });
604
+ }
605
+ }
606
+ if (attributeManager == null ? void 0 : attributeManager.attributes.filterCategoryValues) {
607
+ const categoryBitMaskNeedsUpdate = attributeManager.attributes.filterCategoryValues.needsUpdate() || !(0, import_core3._deepEqual)(props.filterCategories, oldProps.filterCategories, 2);
608
+ if (categoryBitMaskNeedsUpdate) {
609
+ this.setState({ categoryBitMaskNeedsUpdate });
610
+ }
611
+ const resetCategories = changeFlags.dataChanged;
612
+ if (resetCategories) {
613
+ this.setState({
614
+ categoryMap: Array(categorySize).fill(0).map(() => ({}))
615
+ });
616
+ attributeManager.attributes.filterCategoryValues.setNeedsUpdate("categoryMap");
617
+ }
618
+ }
619
+ }
620
+ draw(params, extension) {
621
+ const filterFBO = this.state.filterFBO;
622
+ const filterModel = this.state.filterModel;
623
+ const filterNeedsUpdate = this.state.filterNeedsUpdate;
624
+ const categoryBitMaskNeedsUpdate = this.state.categoryBitMaskNeedsUpdate;
625
+ const { onFilteredItemsChange } = this.props;
626
+ if (categoryBitMaskNeedsUpdate) {
627
+ extension._updateCategoryBitMask.call(this, params, extension);
628
+ }
629
+ if (filterNeedsUpdate && onFilteredItemsChange && filterModel) {
630
+ const { attributes: { filterValues, filterCategoryValues, filterIndices } } = this.getAttributeManager();
631
+ filterModel.setVertexCount(this.getNumInstances());
632
+ this.context.device.clearWebGL({ framebuffer: filterFBO, color: [0, 0, 0, 0] });
633
+ filterModel.updateModuleSettings(params.moduleParameters);
634
+ filterModel.setAttributes({
635
+ ...filterValues == null ? void 0 : filterValues.getValue(),
636
+ ...filterCategoryValues == null ? void 0 : filterCategoryValues.getValue(),
637
+ ...filterIndices == null ? void 0 : filterIndices.getValue()
638
+ });
639
+ filterModel.setUniforms(params.uniforms);
640
+ filterModel.device.withParametersWebGL({
641
+ framebuffer: filterFBO,
642
+ ...parameters,
643
+ viewport: [0, 0, filterFBO.width, filterFBO.height]
644
+ }, () => {
645
+ filterModel.draw(this.context.renderPass);
646
+ });
647
+ const color = filterModel.device.readPixelsToArrayWebGL(filterFBO);
648
+ let count = 0;
649
+ for (let i = 0; i < color.length; i++) {
650
+ count += color[i];
651
+ }
652
+ onFilteredItemsChange({ id: this.id, count });
653
+ this.state.filterNeedsUpdate = false;
654
+ }
655
+ }
656
+ finalizeState() {
657
+ const filterFBO = this.state.filterFBO;
658
+ const filterModel = this.state.filterModel;
659
+ filterFBO == null ? void 0 : filterFBO.destroy();
660
+ filterModel == null ? void 0 : filterModel.destroy();
661
+ }
662
+ _updateCategoryBitMask(params, extension) {
663
+ const { categorySize } = extension.opts;
664
+ const { filterCategories } = this.props;
665
+ const categoryBitMask = new Uint32Array([0, 0, 0, 0]);
666
+ const categoryFilters = categorySize === 1 ? [filterCategories] : filterCategories;
667
+ const maxCategories = categorySize === 1 ? 128 : categorySize === 2 ? 64 : 32;
668
+ for (let c = 0; c < categoryFilters.length; c++) {
669
+ const categoryFilter = categoryFilters[c];
670
+ for (const category of categoryFilter) {
671
+ const key = extension._getCategoryKey.call(this, category, c);
672
+ if (key < maxCategories) {
673
+ const channel = c * (maxCategories / 32) + Math.floor(key / 32);
674
+ categoryBitMask[channel] += Math.pow(2, key % 32);
675
+ } else {
676
+ import_core3.log.warn(`Exceeded maximum number of categories (${maxCategories})`)();
677
+ }
678
+ }
679
+ }
680
+ params.uniforms.filter_categoryBitMask = categoryBitMask;
681
+ this.state.categoryBitMaskNeedsUpdate = false;
682
+ }
683
+ _getCategoryKey(category, channel) {
684
+ const categoryMap = this.state.categoryMap[channel];
685
+ if (!(category in categoryMap)) {
686
+ categoryMap[category] = Object.keys(categoryMap).length;
687
+ }
688
+ return categoryMap[category];
689
+ }
690
+ };
691
+ var DataFilterExtension = _DataFilterExtension;
692
+ (() => {
693
+ _DataFilterExtension.defaultProps = defaultProps2;
694
+ })();
695
+ (() => {
696
+ _DataFilterExtension.extensionName = "DataFilterExtension";
697
+ })();
698
+
699
+ // dist/fp64/fp64-extension.js
700
+ var import_core5 = require("@deck.gl/core");
701
+
702
+ // dist/fp64/project64.js
703
+ var import_shadertools = require("@luma.gl/shadertools");
704
+ var import_core4 = require("@deck.gl/core");
705
+
706
+ // dist/fp64/project64.glsl.js
707
+ var project64_glsl_default = `const vec2 WORLD_SCALE_FP64 = vec2(81.4873275756836, 0.0000032873668232014097);
708
+ uniform vec2 project_uViewProjectionMatrixFP64[16];
709
+ void mercatorProject_fp64(vec4 lnglat_fp64, out vec2 out_val[2]) {
710
+ #if defined(NVIDIA_FP64_WORKAROUND)
711
+ out_val[0] = sum_fp64(radians_fp64(lnglat_fp64.xy), PI_FP64 * ONE);
712
+ #else
713
+ out_val[0] = sum_fp64(radians_fp64(lnglat_fp64.xy), PI_FP64);
714
+ #endif
715
+ out_val[1] = sum_fp64(PI_FP64,
716
+ log_fp64(tan_fp64(sum_fp64(PI_4_FP64, radians_fp64(lnglat_fp64.zw) / 2.0))));
717
+ return;
718
+ }
719
+ void project_position_fp64(vec4 position_fp64, out vec2 out_val[2]) {
720
+ vec2 pos_fp64[2];
721
+ mercatorProject_fp64(position_fp64, pos_fp64);
722
+ out_val[0] = mul_fp64(pos_fp64[0], WORLD_SCALE_FP64);
723
+ out_val[1] = mul_fp64(pos_fp64[1], WORLD_SCALE_FP64);
724
+ return;
725
+ }
726
+ void project_position_fp64(vec2 position, vec2 position64xyLow, out vec2 out_val[2]) {
727
+ vec4 position64xy = vec4(
728
+ position.x, position64xyLow.x,
729
+ position.y, position64xyLow.y);
730
+ project_position_fp64(position64xy, out_val);
731
+ }
732
+ vec4 project_common_position_to_clipspace_fp64(vec2 vertex_pos_modelspace[4]) {
733
+ vec2 vertex_pos_clipspace[4];
734
+ mat4_vec4_mul_fp64(project_uViewProjectionMatrixFP64, vertex_pos_modelspace,
735
+ vertex_pos_clipspace);
736
+ return vec4(
737
+ vertex_pos_clipspace[0].x,
738
+ vertex_pos_clipspace[1].x,
739
+ vertex_pos_clipspace[2].x,
740
+ vertex_pos_clipspace[3].x
741
+ );
742
+ }
743
+ vec4 project_position_to_clipspace(
744
+ vec3 position, vec3 position64xyLow, vec3 offset, out vec4 commonPosition
745
+ ) {
746
+ vec2 offset64[4];
747
+ vec4_fp64(vec4(offset, 0.0), offset64);
748
+ float z = project_size(position.z);
749
+ vec2 projectedPosition64xy[2];
750
+ project_position_fp64(position.xy, position64xyLow.xy, projectedPosition64xy);
751
+ vec2 commonPosition64[4];
752
+ commonPosition64[0] = sum_fp64(offset64[0], projectedPosition64xy[0]);
753
+ commonPosition64[1] = sum_fp64(offset64[1], projectedPosition64xy[1]);
754
+ commonPosition64[2] = sum_fp64(offset64[2], vec2(z, 0.0));
755
+ commonPosition64[3] = vec2(1.0, 0.0);
756
+ commonPosition = vec4(projectedPosition64xy[0].x, projectedPosition64xy[1].x, z, 1.0);
757
+ return project_common_position_to_clipspace_fp64(commonPosition64);
758
+ }
759
+ vec4 project_position_to_clipspace(
760
+ vec3 position, vec3 position64xyLow, vec3 offset
761
+ ) {
762
+ vec4 commonPosition;
763
+ return project_position_to_clipspace(
764
+ position, position64xyLow, offset, commonPosition
765
+ );
766
+ }
767
+ `;
768
+
769
+ // dist/fp64/project64.js
770
+ var { fp64ify, fp64ifyMatrix4 } = import_shadertools.fp64;
771
+ var project64_default = {
772
+ name: "project64",
773
+ dependencies: [import_core4.project, import_shadertools.fp64],
774
+ vs: project64_glsl_default,
775
+ getUniforms: getUniforms2
776
+ };
777
+ var getMemoizedUniforms = (0, import_core4._memoize)(calculateUniforms);
778
+ function getUniforms2(opts) {
779
+ if (opts && "viewport" in opts) {
780
+ const { viewProjectionMatrix, scale } = opts.viewport;
781
+ return getMemoizedUniforms({ viewProjectionMatrix, scale });
782
+ }
783
+ return {};
784
+ }
785
+ function calculateUniforms({ viewProjectionMatrix, scale }) {
786
+ const glViewProjectionMatrixFP64 = fp64ifyMatrix4(viewProjectionMatrix);
787
+ const scaleFP64 = fp64ify(scale);
788
+ return {
789
+ project_uViewProjectionMatrixFP64: glViewProjectionMatrixFP64,
790
+ project64_uViewProjectionMatrix: glViewProjectionMatrixFP64,
791
+ project64_uScale: scaleFP64
792
+ };
793
+ }
794
+
795
+ // dist/fp64/fp64-extension.js
796
+ var _Fp64Extension = class extends import_core5.LayerExtension {
797
+ getShaders() {
798
+ const { coordinateSystem } = this.props;
799
+ if (coordinateSystem !== import_core5.COORDINATE_SYSTEM.LNGLAT && coordinateSystem !== import_core5.COORDINATE_SYSTEM.DEFAULT) {
800
+ throw new Error("fp64: coordinateSystem must be LNGLAT");
801
+ }
802
+ return {
803
+ modules: [project64_default]
804
+ };
805
+ }
806
+ };
807
+ var Fp64Extension = _Fp64Extension;
808
+ (() => {
809
+ _Fp64Extension.extensionName = "Fp64Extension";
810
+ })();
811
+
812
+ // dist/path-style/path-style-extension.js
813
+ var import_core6 = require("@deck.gl/core");
814
+ var import_core7 = require("@math.gl/core");
815
+
816
+ // dist/path-style/shaders.glsl.js
817
+ var dashShaders = {
818
+ inject: {
819
+ "vs:#decl": `
820
+ in vec2 instanceDashArrays;
821
+ in float instanceDashOffsets;
822
+ out vec2 vDashArray;
823
+ out float vDashOffset;
824
+ `,
825
+ "vs:#main-end": `
826
+ vDashArray = instanceDashArrays;
827
+ vDashOffset = instanceDashOffsets / width.x;
828
+ `,
829
+ "fs:#decl": `
830
+ uniform float dashAlignMode;
831
+ uniform float capType;
832
+ uniform bool dashGapPickable;
833
+ in vec2 vDashArray;
834
+ in float vDashOffset;
835
+ `,
836
+ "fs:#main-start": `
837
+ float solidLength = vDashArray.x;
838
+ float gapLength = vDashArray.y;
839
+ float unitLength = solidLength + gapLength;
840
+ float offset;
841
+ if (unitLength > 0.0) {
842
+ if (dashAlignMode == 0.0) {
843
+ offset = vDashOffset;
844
+ } else {
845
+ unitLength = vPathLength / round(vPathLength / unitLength);
846
+ offset = solidLength / 2.0;
847
+ }
848
+ float unitOffset = mod(vPathPosition.y + offset, unitLength);
849
+ if (gapLength > 0.0 && unitOffset > solidLength) {
850
+ if (capType <= 0.5) {
851
+ if (!(dashGapPickable && bool(picking.isActive))) {
852
+ discard;
853
+ }
854
+ } else {
855
+ float distToEnd = length(vec2(
856
+ min(unitOffset - solidLength, unitLength - unitOffset),
857
+ vPathPosition.x
858
+ ));
859
+ if (distToEnd > 1.0) {
860
+ if (!(dashGapPickable && bool(picking.isActive))) {
861
+ discard;
862
+ }
863
+ }
864
+ }
865
+ }
866
+ }
867
+ `
868
+ }
869
+ };
870
+ var offsetShaders = {
871
+ inject: {
872
+ "vs:#decl": `
873
+ in float instanceOffsets;
874
+ `,
875
+ "vs:DECKGL_FILTER_SIZE": `
876
+ float offsetWidth = abs(instanceOffsets * 2.0) + 1.0;
877
+ size *= offsetWidth;
878
+ `,
879
+ "vs:#main-end": `
880
+ float offsetWidth = abs(instanceOffsets * 2.0) + 1.0;
881
+ float offsetDir = sign(instanceOffsets);
882
+ vPathPosition.x = (vPathPosition.x + offsetDir) * offsetWidth - offsetDir;
883
+ vPathPosition.y *= offsetWidth;
884
+ vPathLength *= offsetWidth;
885
+ `,
886
+ "fs:#main-start": `
887
+ float isInside;
888
+ isInside = step(-1.0, vPathPosition.x) * step(vPathPosition.x, 1.0);
889
+ if (isInside == 0.0) {
890
+ discard;
891
+ }
892
+ `
893
+ }
894
+ };
895
+
896
+ // dist/path-style/path-style-extension.js
897
+ var defaultProps3 = {
898
+ getDashArray: { type: "accessor", value: [0, 0] },
899
+ getOffset: { type: "accessor", value: 0 },
900
+ dashJustified: false,
901
+ dashGapPickable: false
902
+ };
903
+ var _PathStyleExtension = class extends import_core6.LayerExtension {
904
+ constructor({ dash = false, offset = false, highPrecisionDash = false } = {}) {
905
+ super({ dash: dash || highPrecisionDash, offset, highPrecisionDash });
906
+ }
907
+ isEnabled(layer) {
908
+ return "pathTesselator" in layer.state;
909
+ }
910
+ getShaders(extension) {
911
+ if (!extension.isEnabled(this)) {
912
+ return null;
913
+ }
914
+ let result = {};
915
+ if (extension.opts.dash) {
916
+ result = (0, import_core6._mergeShaders)(result, dashShaders);
917
+ }
918
+ if (extension.opts.offset) {
919
+ result = (0, import_core6._mergeShaders)(result, offsetShaders);
920
+ }
921
+ return result;
922
+ }
923
+ initializeState(context, extension) {
924
+ const attributeManager = this.getAttributeManager();
925
+ if (!attributeManager || !extension.isEnabled(this)) {
926
+ return;
927
+ }
928
+ if (extension.opts.dash) {
929
+ attributeManager.addInstanced({
930
+ instanceDashArrays: { size: 2, accessor: "getDashArray" },
931
+ instanceDashOffsets: extension.opts.highPrecisionDash ? {
932
+ size: 1,
933
+ accessor: "getPath",
934
+ transform: extension.getDashOffsets.bind(this)
935
+ } : {
936
+ size: 1,
937
+ update: (attribute) => {
938
+ attribute.constant = true;
939
+ attribute.value = [0];
940
+ }
941
+ }
942
+ });
943
+ }
944
+ if (extension.opts.offset) {
945
+ attributeManager.addInstanced({
946
+ instanceOffsets: { size: 1, accessor: "getOffset" }
947
+ });
948
+ }
949
+ }
950
+ updateState(params, extension) {
951
+ var _a;
952
+ if (!extension.isEnabled(this)) {
953
+ return;
954
+ }
955
+ const uniforms = {};
956
+ if (extension.opts.dash) {
957
+ uniforms.dashAlignMode = this.props.dashJustified ? 1 : 0;
958
+ uniforms.dashGapPickable = Boolean(this.props.dashGapPickable);
959
+ }
960
+ (_a = this.state.model) == null ? void 0 : _a.setUniforms(uniforms);
961
+ }
962
+ getDashOffsets(path) {
963
+ const result = [0];
964
+ const positionSize = this.props.positionFormat === "XY" ? 2 : 3;
965
+ const isNested = Array.isArray(path[0]);
966
+ const geometrySize = isNested ? path.length : path.length / positionSize;
967
+ let p;
968
+ let prevP;
969
+ for (let i = 0; i < geometrySize - 1; i++) {
970
+ p = isNested ? path[i] : path.slice(i * positionSize, i * positionSize + positionSize);
971
+ p = this.projectPosition(p);
972
+ if (i > 0) {
973
+ result[i] = result[i - 1] + import_core7.vec3.dist(prevP, p);
974
+ }
975
+ prevP = p;
976
+ }
977
+ result[geometrySize - 1] = 0;
978
+ return result;
979
+ }
980
+ };
981
+ var PathStyleExtension = _PathStyleExtension;
982
+ (() => {
983
+ _PathStyleExtension.defaultProps = defaultProps3;
984
+ })();
985
+ (() => {
986
+ _PathStyleExtension.extensionName = "PathStyleExtension";
987
+ })();
988
+
989
+ // dist/fill-style/fill-style-extension.js
990
+ var import_core9 = require("@deck.gl/core");
991
+
992
+ // dist/fill-style/shader-module.js
993
+ var import_core8 = require("@deck.gl/core");
994
+ var patternVs = `
995
+ #ifdef NON_INSTANCED_MODEL
996
+ #define FILL_PATTERN_FRAME_ATTRIB fillPatternFrames
997
+ #define FILL_PATTERN_SCALE_ATTRIB fillPatternScales
998
+ #define FILL_PATTERN_OFFSET_ATTRIB fillPatternOffsets
999
+ #else
1000
+ #define FILL_PATTERN_FRAME_ATTRIB instanceFillPatternFrames
1001
+ #define FILL_PATTERN_SCALE_ATTRIB instanceFillPatternScales
1002
+ #define FILL_PATTERN_OFFSET_ATTRIB instanceFillPatternOffsets
1003
+ #endif
1004
+ in vec4 FILL_PATTERN_FRAME_ATTRIB;
1005
+ in float FILL_PATTERN_SCALE_ATTRIB;
1006
+ in vec2 FILL_PATTERN_OFFSET_ATTRIB;
1007
+ uniform bool fill_patternEnabled;
1008
+ uniform vec2 fill_patternTextureSize;
1009
+ out vec2 fill_uv;
1010
+ out vec4 fill_patternBounds;
1011
+ out vec4 fill_patternPlacement;
1012
+ `;
1013
+ var patternFs = `
1014
+ uniform bool fill_patternEnabled;
1015
+ uniform bool fill_patternMask;
1016
+ uniform sampler2D fill_patternTexture;
1017
+ uniform vec2 fill_uvCoordinateOrigin;
1018
+ uniform vec2 fill_uvCoordinateOrigin64Low;
1019
+ in vec4 fill_patternBounds;
1020
+ in vec4 fill_patternPlacement;
1021
+ in vec2 fill_uv;
1022
+ const float FILL_UV_SCALE = 512.0 / 40000000.0;
1023
+ `;
1024
+ var inject3 = {
1025
+ "vs:DECKGL_FILTER_GL_POSITION": `
1026
+ fill_uv = geometry.position.xy;
1027
+ `,
1028
+ "vs:DECKGL_FILTER_COLOR": `
1029
+ if (fill_patternEnabled) {
1030
+ fill_patternBounds = FILL_PATTERN_FRAME_ATTRIB / vec4(fill_patternTextureSize, fill_patternTextureSize);
1031
+ fill_patternPlacement.xy = FILL_PATTERN_OFFSET_ATTRIB;
1032
+ fill_patternPlacement.zw = FILL_PATTERN_SCALE_ATTRIB * FILL_PATTERN_FRAME_ATTRIB.zw;
1033
+ }
1034
+ `,
1035
+ "fs:DECKGL_FILTER_COLOR": `
1036
+ if (fill_patternEnabled) {
1037
+ vec2 scale = FILL_UV_SCALE * fill_patternPlacement.zw;
1038
+ vec2 patternUV = mod(mod(fill_uvCoordinateOrigin, scale) + fill_uvCoordinateOrigin64Low + fill_uv, scale) / scale;
1039
+ patternUV = mod(fill_patternPlacement.xy + patternUV, 1.0);
1040
+ vec2 texCoords = fill_patternBounds.xy + fill_patternBounds.zw * patternUV;
1041
+ vec4 patternColor = texture(fill_patternTexture, texCoords);
1042
+ color.a *= patternColor.a;
1043
+ if (!fill_patternMask) {
1044
+ color.rgb = patternColor.rgb;
1045
+ }
1046
+ }
1047
+ `
1048
+ };
1049
+ function getPatternUniforms(opts, uniforms) {
1050
+ if (!opts) {
1051
+ return {};
1052
+ }
1053
+ if ("fillPatternTexture" in opts) {
1054
+ const { fillPatternTexture } = opts;
1055
+ return {
1056
+ fill_patternTexture: fillPatternTexture,
1057
+ fill_patternTextureSize: [fillPatternTexture.width, fillPatternTexture.height]
1058
+ };
1059
+ }
1060
+ if ("viewport" in opts) {
1061
+ const { fillPatternMask = true, fillPatternEnabled = true } = opts;
1062
+ const { project_uCommonOrigin: coordinateOriginCommon } = uniforms;
1063
+ const coordinateOriginCommon64Low = [
1064
+ (0, import_core8.fp64LowPart)(coordinateOriginCommon[0]),
1065
+ (0, import_core8.fp64LowPart)(coordinateOriginCommon[1])
1066
+ ];
1067
+ return {
1068
+ fill_uvCoordinateOrigin: coordinateOriginCommon.slice(0, 2),
1069
+ fill_uvCoordinateOrigin64Low: coordinateOriginCommon64Low,
1070
+ fill_patternMask: fillPatternMask,
1071
+ fill_patternEnabled: fillPatternEnabled
1072
+ };
1073
+ }
1074
+ return {};
1075
+ }
1076
+ var patternShaders = {
1077
+ name: "fill-pattern",
1078
+ vs: patternVs,
1079
+ fs: patternFs,
1080
+ inject: inject3,
1081
+ dependencies: [import_core8.project],
1082
+ getUniforms: getPatternUniforms
1083
+ };
1084
+
1085
+ // dist/fill-style/fill-style-extension.js
1086
+ var defaultProps4 = {
1087
+ fillPatternEnabled: true,
1088
+ fillPatternAtlas: {
1089
+ type: "image",
1090
+ value: null,
1091
+ async: true,
1092
+ parameters: { lodMaxClamp: 0 }
1093
+ },
1094
+ fillPatternMapping: { type: "object", value: {}, async: true },
1095
+ fillPatternMask: true,
1096
+ getFillPattern: { type: "accessor", value: (d) => d.pattern },
1097
+ getFillPatternScale: { type: "accessor", value: 1 },
1098
+ getFillPatternOffset: { type: "accessor", value: [0, 0] }
1099
+ };
1100
+ var _FillStyleExtension = class extends import_core9.LayerExtension {
1101
+ constructor({ pattern = false } = {}) {
1102
+ super({ pattern });
1103
+ }
1104
+ isEnabled(layer) {
1105
+ return layer.getAttributeManager() !== null && !("pathTesselator" in layer.state);
1106
+ }
1107
+ getShaders(extension) {
1108
+ if (!extension.isEnabled(this)) {
1109
+ return null;
1110
+ }
1111
+ return {
1112
+ modules: [extension.opts.pattern && patternShaders].filter(Boolean)
1113
+ };
1114
+ }
1115
+ initializeState(context, extension) {
1116
+ if (!extension.isEnabled(this)) {
1117
+ return;
1118
+ }
1119
+ const attributeManager = this.getAttributeManager();
1120
+ if (extension.opts.pattern) {
1121
+ attributeManager.add({
1122
+ fillPatternFrames: {
1123
+ size: 4,
1124
+ accessor: "getFillPattern",
1125
+ transform: extension.getPatternFrame.bind(this),
1126
+ shaderAttributes: {
1127
+ fillPatternFrames: {
1128
+ divisor: 0
1129
+ },
1130
+ instanceFillPatternFrames: {
1131
+ divisor: 1
1132
+ }
1133
+ }
1134
+ },
1135
+ fillPatternScales: {
1136
+ size: 1,
1137
+ accessor: "getFillPatternScale",
1138
+ defaultValue: 1,
1139
+ shaderAttributes: {
1140
+ fillPatternScales: {
1141
+ divisor: 0
1142
+ },
1143
+ instanceFillPatternScales: {
1144
+ divisor: 1
1145
+ }
1146
+ }
1147
+ },
1148
+ fillPatternOffsets: {
1149
+ size: 2,
1150
+ accessor: "getFillPatternOffset",
1151
+ shaderAttributes: {
1152
+ fillPatternOffsets: {
1153
+ divisor: 0
1154
+ },
1155
+ instanceFillPatternOffsets: {
1156
+ divisor: 1
1157
+ }
1158
+ }
1159
+ }
1160
+ });
1161
+ }
1162
+ this.setState({
1163
+ emptyTexture: this.context.device.createTexture({
1164
+ data: new Uint8Array(4),
1165
+ width: 1,
1166
+ height: 1
1167
+ })
1168
+ });
1169
+ }
1170
+ updateState({ props, oldProps }, extension) {
1171
+ if (!extension.isEnabled(this)) {
1172
+ return;
1173
+ }
1174
+ if (props.fillPatternMapping && props.fillPatternMapping !== oldProps.fillPatternMapping) {
1175
+ this.getAttributeManager().invalidate("getFillPattern");
1176
+ }
1177
+ }
1178
+ draw(params, extension) {
1179
+ if (!extension.isEnabled(this)) {
1180
+ return;
1181
+ }
1182
+ const { fillPatternAtlas } = this.props;
1183
+ this.setModuleParameters({
1184
+ fillPatternTexture: fillPatternAtlas || this.state.emptyTexture
1185
+ });
1186
+ }
1187
+ finalizeState() {
1188
+ const emptyTexture = this.state.emptyTexture;
1189
+ emptyTexture == null ? void 0 : emptyTexture.delete();
1190
+ }
1191
+ getPatternFrame(name) {
1192
+ const { fillPatternMapping } = this.getCurrentLayer().props;
1193
+ const def = fillPatternMapping && fillPatternMapping[name];
1194
+ return def ? [def.x, def.y, def.width, def.height] : [0, 0, 0, 0];
1195
+ }
1196
+ };
1197
+ var FillStyleExtension = _FillStyleExtension;
1198
+ (() => {
1199
+ _FillStyleExtension.defaultProps = defaultProps4;
1200
+ })();
1201
+ (() => {
1202
+ _FillStyleExtension.extensionName = "FillStyleExtension";
1203
+ })();
1204
+
1205
+ // dist/clip/clip-extension.js
1206
+ var import_core10 = require("@deck.gl/core");
1207
+ var defaultProps5 = {
1208
+ clipBounds: [0, 0, 1, 1],
1209
+ clipByInstance: void 0
1210
+ };
1211
+ var shaderFunction = `
1212
+ uniform vec4 clip_bounds;
1213
+ bool clip_isInBounds(vec2 position) {
1214
+ return position.x >= clip_bounds[0] && position.y >= clip_bounds[1] && position.x < clip_bounds[2] && position.y < clip_bounds[3];
1215
+ }
1216
+ `;
1217
+ var shaderModuleVs = {
1218
+ name: "clip-vs",
1219
+ vs: shaderFunction
1220
+ };
1221
+ var injectionVs = {
1222
+ "vs:#decl": `
1223
+ out float clip_isVisible;
1224
+ `,
1225
+ "vs:DECKGL_FILTER_GL_POSITION": `
1226
+ clip_isVisible = float(clip_isInBounds(geometry.worldPosition.xy));
1227
+ `,
1228
+ "fs:#decl": `
1229
+ in float clip_isVisible;
1230
+ `,
1231
+ "fs:DECKGL_FILTER_COLOR": `
1232
+ if (clip_isVisible < 0.5) discard;
1233
+ `
1234
+ };
1235
+ var shaderModuleFs = {
1236
+ name: "clip-fs",
1237
+ fs: shaderFunction
1238
+ };
1239
+ var injectionFs = {
1240
+ "vs:#decl": `
1241
+ out vec2 clip_commonPosition;
1242
+ `,
1243
+ "vs:DECKGL_FILTER_GL_POSITION": `
1244
+ clip_commonPosition = geometry.position.xy;
1245
+ `,
1246
+ "fs:#decl": `
1247
+ in vec2 clip_commonPosition;
1248
+ `,
1249
+ "fs:DECKGL_FILTER_COLOR": `
1250
+ if (!clip_isInBounds(clip_commonPosition)) discard;
1251
+ `
1252
+ };
1253
+ var _ClipExtension = class extends import_core10.LayerExtension {
1254
+ getShaders() {
1255
+ let clipByInstance = "instancePositions" in this.getAttributeManager().attributes;
1256
+ if (this.props.clipByInstance !== void 0) {
1257
+ clipByInstance = Boolean(this.props.clipByInstance);
1258
+ }
1259
+ this.state.clipByInstance = clipByInstance;
1260
+ return clipByInstance ? {
1261
+ modules: [shaderModuleVs],
1262
+ inject: injectionVs
1263
+ } : {
1264
+ modules: [shaderModuleFs],
1265
+ inject: injectionFs
1266
+ };
1267
+ }
1268
+ draw({ uniforms }) {
1269
+ const { clipBounds } = this.props;
1270
+ if (this.state.clipByInstance) {
1271
+ uniforms.clip_bounds = clipBounds;
1272
+ } else {
1273
+ const corner0 = this.projectPosition([clipBounds[0], clipBounds[1], 0]);
1274
+ const corner1 = this.projectPosition([clipBounds[2], clipBounds[3], 0]);
1275
+ uniforms.clip_bounds = [
1276
+ Math.min(corner0[0], corner1[0]),
1277
+ Math.min(corner0[1], corner1[1]),
1278
+ Math.max(corner0[0], corner1[0]),
1279
+ Math.max(corner0[1], corner1[1])
1280
+ ];
1281
+ }
1282
+ }
1283
+ };
1284
+ var ClipExtension = _ClipExtension;
1285
+ (() => {
1286
+ _ClipExtension.defaultProps = defaultProps5;
1287
+ })();
1288
+ (() => {
1289
+ _ClipExtension.extensionName = "ClipExtension";
1290
+ })();
1291
+
1292
+ // dist/collision-filter/collision-filter-extension.js
1293
+ var import_core15 = require("@deck.gl/core");
1294
+
1295
+ // dist/collision-filter/shader-module.js
1296
+ var import_core11 = require("@deck.gl/core");
1297
+ var vs3 = `
1298
+ #ifdef NON_INSTANCED_MODEL
1299
+ in float collisionPriorities;
1300
+ #else
1301
+ in float instanceCollisionPriorities;
1302
+ #endif
1303
+ uniform sampler2D collision_texture;
1304
+ uniform bool collision_sort;
1305
+ uniform bool collision_enabled;
1306
+ vec2 collision_getCoords(vec4 position) {
1307
+ vec4 collision_clipspace = project_common_position_to_clipspace(position);
1308
+ return (1.0 + collision_clipspace.xy / collision_clipspace.w) / 2.0;
1309
+ }
1310
+ float collision_match(vec2 tex, vec3 pickingColor) {
1311
+ vec4 collision_pickingColor = texture(collision_texture, tex);
1312
+ float delta = dot(abs(collision_pickingColor.rgb - pickingColor), vec3(1.0));
1313
+ float e = 0.001;
1314
+ return step(delta, e);
1315
+ }
1316
+ float collision_isVisible(vec2 texCoords, vec3 pickingColor) {
1317
+ if (!collision_enabled) {
1318
+ return 1.0;
1319
+ }
1320
+ const int N = 2;
1321
+ float accumulator = 0.0;
1322
+ vec2 step = vec2(1.0 / project_uViewportSize);
1323
+ const float floatN = float(N);
1324
+ vec2 delta = -floatN * step;
1325
+ for(int i = -N; i <= N; i++) {
1326
+ delta.x = -step.x * floatN;
1327
+ for(int j = -N; j <= N; j++) {
1328
+ accumulator += collision_match(texCoords + delta, pickingColor);
1329
+ delta.x += step.x;
1330
+ }
1331
+ delta.y += step.y;
1332
+ }
1333
+ float W = 2.0 * floatN + 1.0;
1334
+ return pow(accumulator / (W * W), 2.2);
1335
+ }
1336
+ `;
1337
+ var inject4 = {
1338
+ "vs:#decl": `
1339
+ float collision_fade = 1.0;
1340
+ `,
1341
+ "vs:DECKGL_FILTER_GL_POSITION": `
1342
+ if (collision_sort) {
1343
+ #ifdef NON_INSTANCED_MODEL
1344
+ float collisionPriority = collisionPriorities;
1345
+ #else
1346
+ float collisionPriority = instanceCollisionPriorities;
1347
+ #endif
1348
+ position.z = -0.001 * collisionPriority * position.w;
1349
+ }
1350
+ if (collision_enabled) {
1351
+ vec4 collision_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1352
+ vec2 collision_texCoords = collision_getCoords(collision_common_position);
1353
+ collision_fade = collision_isVisible(collision_texCoords, geometry.pickingColor / 255.0);
1354
+ if (collision_fade < 0.0001) {
1355
+ position = vec4(0.0, 0.0, 2.0, 1.0);
1356
+ }
1357
+ }
1358
+ `,
1359
+ "vs:DECKGL_FILTER_COLOR": `
1360
+ color.a *= collision_fade;
1361
+ `
1362
+ };
1363
+ var getCollisionUniforms = (opts, uniforms) => {
1364
+ if (!opts || !("dummyCollisionMap" in opts)) {
1365
+ return {};
1366
+ }
1367
+ const { collisionFBO, drawToCollisionMap, dummyCollisionMap } = opts;
1368
+ return {
1369
+ collision_sort: Boolean(drawToCollisionMap),
1370
+ collision_texture: !drawToCollisionMap && collisionFBO ? collisionFBO.colorAttachments[0] : dummyCollisionMap
1371
+ };
1372
+ };
1373
+ var shader_module_default2 = {
1374
+ name: "collision",
1375
+ dependencies: [import_core11.project],
1376
+ vs: vs3,
1377
+ inject: inject4,
1378
+ getUniforms: getCollisionUniforms
1379
+ };
1380
+
1381
+ // dist/collision-filter/collision-filter-effect.js
1382
+ var import_core13 = require("@math.gl/core");
1383
+ var import_core14 = require("@deck.gl/core");
1384
+
1385
+ // dist/collision-filter/collision-filter-pass.js
1386
+ var import_core12 = require("@deck.gl/core");
1387
+ var CollisionFilterPass = class extends import_core12._LayersPass {
1388
+ renderCollisionMap(target, options) {
1389
+ const padding = 1;
1390
+ const clearColor = [0, 0, 0, 0];
1391
+ const scissorRect = [padding, padding, target.width - 2 * padding, target.height - 2 * padding];
1392
+ this.render({ ...options, clearColor, scissorRect, target, pass: "collision" });
1393
+ }
1394
+ getLayerParameters(layer, layerIndex, viewport) {
1395
+ return { ...layer.props.parameters, blend: false, depthRange: [0, 1], depthTest: true };
1396
+ }
1397
+ getModuleParameters() {
1398
+ return {
1399
+ drawToCollisionMap: true,
1400
+ picking: {
1401
+ isActive: 1,
1402
+ isAttribute: false
1403
+ },
1404
+ lightSources: {}
1405
+ };
1406
+ }
1407
+ };
1408
+
1409
+ // dist/collision-filter/collision-filter-effect.js
1410
+ var DOWNSCALE = 2;
1411
+ var CollisionFilterEffect = class {
1412
+ constructor() {
1413
+ this.id = "collision-filter-effect";
1414
+ this.props = null;
1415
+ this.useInPicking = true;
1416
+ this.order = 1;
1417
+ this.channels = {};
1418
+ this.collisionFBOs = {};
1419
+ }
1420
+ setup(context) {
1421
+ this.context = context;
1422
+ const { device } = context;
1423
+ this.dummyCollisionMap = device.createTexture({ width: 1, height: 1 });
1424
+ this.collisionFilterPass = new CollisionFilterPass(device, { id: "default-collision-filter" });
1425
+ }
1426
+ preRender({ effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats = {} }) {
1427
+ var _a;
1428
+ const { device } = this.context;
1429
+ if (isPicking) {
1430
+ return;
1431
+ }
1432
+ const collisionLayers = layers.filter(
1433
+ ({ props: { visible, collisionEnabled } }) => visible && collisionEnabled
1434
+ );
1435
+ if (collisionLayers.length === 0) {
1436
+ this.channels = {};
1437
+ return;
1438
+ }
1439
+ const effects = allEffects == null ? void 0 : allEffects.filter((e) => e.useInPicking && preRenderStats[e.id]);
1440
+ const maskEffectRendered = (_a = preRenderStats["mask-effect"]) == null ? void 0 : _a.didRender;
1441
+ const channels = this._groupByCollisionGroup(device, collisionLayers);
1442
+ const viewport = viewports[0];
1443
+ const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;
1444
+ for (const collisionGroup in channels) {
1445
+ const collisionFBO = this.collisionFBOs[collisionGroup];
1446
+ const renderInfo = channels[collisionGroup];
1447
+ const [width, height] = device.canvasContext.getPixelSize();
1448
+ collisionFBO.resize({
1449
+ width: width / DOWNSCALE,
1450
+ height: height / DOWNSCALE
1451
+ });
1452
+ this._render(renderInfo, {
1453
+ effects,
1454
+ layerFilter,
1455
+ onViewportActive,
1456
+ views,
1457
+ viewport,
1458
+ viewportChanged
1459
+ });
1460
+ }
1461
+ }
1462
+ _render(renderInfo, { effects, layerFilter, onViewportActive, views, viewport, viewportChanged }) {
1463
+ const { collisionGroup } = renderInfo;
1464
+ const oldRenderInfo = this.channels[collisionGroup];
1465
+ if (!oldRenderInfo) {
1466
+ return;
1467
+ }
1468
+ const needsRender = viewportChanged || renderInfo === oldRenderInfo || !(0, import_core14._deepEqual)(oldRenderInfo.layers, renderInfo.layers, 1) || renderInfo.layerBounds.some((b, i) => !(0, import_core13.equals)(b, oldRenderInfo.layerBounds[i])) || renderInfo.allLayersLoaded !== oldRenderInfo.allLayersLoaded || renderInfo.layers.some((layer) => layer.props.transitions);
1469
+ this.channels[collisionGroup] = renderInfo;
1470
+ if (needsRender) {
1471
+ this.lastViewport = viewport;
1472
+ const collisionFBO = this.collisionFBOs[collisionGroup];
1473
+ this.collisionFilterPass.renderCollisionMap(collisionFBO, {
1474
+ pass: "collision-filter",
1475
+ isPicking: true,
1476
+ layers: renderInfo.layers,
1477
+ effects,
1478
+ layerFilter,
1479
+ viewports: viewport ? [viewport] : [],
1480
+ onViewportActive,
1481
+ views,
1482
+ moduleParameters: {
1483
+ dummyCollisionMap: this.dummyCollisionMap,
1484
+ devicePixelRatio: collisionFBO.device.canvasContext.getDevicePixelRatio() / DOWNSCALE
1485
+ }
1486
+ });
1487
+ }
1488
+ }
1489
+ _groupByCollisionGroup(device, collisionLayers) {
1490
+ const channelMap = {};
1491
+ for (const layer of collisionLayers) {
1492
+ const { collisionGroup } = layer.props;
1493
+ let channelInfo = channelMap[collisionGroup];
1494
+ if (!channelInfo) {
1495
+ channelInfo = { collisionGroup, layers: [], layerBounds: [], allLayersLoaded: true };
1496
+ channelMap[collisionGroup] = channelInfo;
1497
+ }
1498
+ channelInfo.layers.push(layer);
1499
+ channelInfo.layerBounds.push(layer.getBounds());
1500
+ if (!layer.isLoaded) {
1501
+ channelInfo.allLayersLoaded = false;
1502
+ }
1503
+ }
1504
+ for (const collisionGroup of Object.keys(channelMap)) {
1505
+ if (!this.collisionFBOs[collisionGroup]) {
1506
+ this.createFBO(device, collisionGroup);
1507
+ }
1508
+ if (!this.channels[collisionGroup]) {
1509
+ this.channels[collisionGroup] = channelMap[collisionGroup];
1510
+ }
1511
+ }
1512
+ for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1513
+ if (!channelMap[collisionGroup]) {
1514
+ this.destroyFBO(collisionGroup);
1515
+ }
1516
+ }
1517
+ return channelMap;
1518
+ }
1519
+ getModuleParameters(layer) {
1520
+ const { collisionGroup } = layer.props;
1521
+ const { collisionFBOs, dummyCollisionMap } = this;
1522
+ return { collisionFBO: collisionFBOs[collisionGroup], dummyCollisionMap };
1523
+ }
1524
+ cleanup() {
1525
+ if (this.dummyCollisionMap) {
1526
+ this.dummyCollisionMap.delete();
1527
+ this.dummyCollisionMap = void 0;
1528
+ }
1529
+ this.channels = {};
1530
+ for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1531
+ this.destroyFBO(collisionGroup);
1532
+ }
1533
+ this.collisionFBOs = {};
1534
+ this.lastViewport = void 0;
1535
+ }
1536
+ createFBO(device, collisionGroup) {
1537
+ const { width, height } = device.gl.canvas;
1538
+ const collisionMap = device.createTexture({
1539
+ format: "rgba8unorm",
1540
+ width,
1541
+ height,
1542
+ sampler: {
1543
+ minFilter: "nearest",
1544
+ magFilter: "nearest",
1545
+ addressModeU: "clamp-to-edge",
1546
+ addressModeV: "clamp-to-edge"
1547
+ }
1548
+ });
1549
+ const depthStencilAttachment = device.createTexture({
1550
+ format: "depth16unorm",
1551
+ width,
1552
+ height,
1553
+ mipmaps: false,
1554
+ dataFormat: 6402,
1555
+ type: 5125
1556
+ });
1557
+ this.collisionFBOs[collisionGroup] = device.createFramebuffer({
1558
+ id: `collision-${collisionGroup}`,
1559
+ width,
1560
+ height,
1561
+ colorAttachments: [collisionMap],
1562
+ depthStencilAttachment
1563
+ });
1564
+ }
1565
+ destroyFBO(collisionGroup) {
1566
+ var _a, _b;
1567
+ const fbo = this.collisionFBOs[collisionGroup];
1568
+ (_a = fbo.colorAttachments[0]) == null ? void 0 : _a.destroy();
1569
+ (_b = fbo.depthStencilAttachment) == null ? void 0 : _b.destroy();
1570
+ fbo.destroy();
1571
+ delete this.collisionFBOs[collisionGroup];
1572
+ }
1573
+ };
1574
+
1575
+ // dist/collision-filter/collision-filter-extension.js
1576
+ var defaultProps6 = {
1577
+ getCollisionPriority: { type: "accessor", value: 0 },
1578
+ collisionEnabled: true,
1579
+ collisionGroup: { type: "string", value: "default" },
1580
+ collisionTestProps: {}
1581
+ };
1582
+ var _CollisionFilterExtension = class extends import_core15.LayerExtension {
1583
+ getShaders() {
1584
+ return { modules: [shader_module_default2] };
1585
+ }
1586
+ draw({ uniforms, context, moduleParameters }) {
1587
+ const { collisionEnabled } = this.props;
1588
+ const { collisionFBO, drawToCollisionMap } = moduleParameters;
1589
+ const enabled = collisionEnabled && Boolean(collisionFBO);
1590
+ uniforms.collision_enabled = enabled;
1591
+ if (drawToCollisionMap) {
1592
+ this.props = this.clone(this.props.collisionTestProps).props;
1593
+ }
1594
+ }
1595
+ initializeState(context, extension) {
1596
+ var _a;
1597
+ if (this.getAttributeManager() === null) {
1598
+ return;
1599
+ }
1600
+ (_a = this.context.deck) == null ? void 0 : _a._addDefaultEffect(new CollisionFilterEffect());
1601
+ const attributeManager = this.getAttributeManager();
1602
+ attributeManager.add({
1603
+ collisionPriorities: {
1604
+ size: 1,
1605
+ accessor: "getCollisionPriority",
1606
+ shaderAttributes: {
1607
+ collisionPriorities: { divisor: 0 },
1608
+ instanceCollisionPriorities: { divisor: 1 }
1609
+ }
1610
+ }
1611
+ });
1612
+ }
1613
+ getNeedsPickingBuffer() {
1614
+ return this.props.collisionEnabled;
1615
+ }
1616
+ };
1617
+ var CollisionFilterExtension = _CollisionFilterExtension;
1618
+ (() => {
1619
+ _CollisionFilterExtension.defaultProps = defaultProps6;
1620
+ })();
1621
+ (() => {
1622
+ _CollisionFilterExtension.extensionName = "CollisionFilterExtension";
1623
+ })();
1624
+
1625
+ // dist/mask/mask-extension.js
1626
+ var import_core21 = require("@deck.gl/core");
1627
+
1628
+ // dist/mask/shader-module.js
1629
+ var import_core16 = require("@deck.gl/core");
1630
+ var vs4 = `
1631
+ uniform vec4 mask_bounds;
1632
+ uniform bool mask_maskByInstance;
1633
+ vec2 mask_getCoords(vec4 position) {
1634
+ return (position.xy - mask_bounds.xy) / (mask_bounds.zw - mask_bounds.xy);
1635
+ }
1636
+ `;
1637
+ var fs3 = `
1638
+ uniform sampler2D mask_texture;
1639
+ uniform int mask_channel;
1640
+ uniform bool mask_enabled;
1641
+ uniform bool mask_inverted;
1642
+ bool mask_isInBounds(vec2 texCoords) {
1643
+ if (!mask_enabled) {
1644
+ return true;
1645
+ }
1646
+ vec4 maskColor = texture(mask_texture, texCoords);
1647
+ float maskValue = 1.0;
1648
+ if (mask_channel == 0) {
1649
+ maskValue = maskColor.r;
1650
+ } else if (mask_channel == 1) {
1651
+ maskValue = maskColor.g;
1652
+ } else if (mask_channel == 2) {
1653
+ maskValue = maskColor.b;
1654
+ } else if (mask_channel == 3) {
1655
+ maskValue = maskColor.a;
1656
+ }
1657
+ if (mask_inverted) {
1658
+ return maskValue >= 0.5;
1659
+ } else {
1660
+ return maskValue < 0.5;
1661
+ }
1662
+ }
1663
+ `;
1664
+ var inject5 = {
1665
+ "vs:#decl": `
1666
+ out vec2 mask_texCoords;
1667
+ `,
1668
+ "vs:#main-end": `
1669
+ vec4 mask_common_position;
1670
+ if (mask_maskByInstance) {
1671
+ mask_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1672
+ } else {
1673
+ mask_common_position = geometry.position;
1674
+ }
1675
+ mask_texCoords = mask_getCoords(mask_common_position);
1676
+ `,
1677
+ "fs:#decl": `
1678
+ in vec2 mask_texCoords;
1679
+ `,
1680
+ "fs:#main-start": `
1681
+ if (mask_enabled) {
1682
+ bool mask = mask_isInBounds(mask_texCoords);
1683
+ fragColor = texture(mask_texture, mask_texCoords);
1684
+ if (!mask) discard;
1685
+ }
1686
+ `
1687
+ };
1688
+ var getMaskUniforms = (opts) => {
1689
+ if (opts && "maskMap" in opts) {
1690
+ return {
1691
+ mask_texture: opts.maskMap
1692
+ };
1693
+ }
1694
+ return {};
1695
+ };
1696
+ var shader_module_default3 = {
1697
+ name: "mask",
1698
+ dependencies: [import_core16.project],
1699
+ vs: vs4,
1700
+ fs: fs3,
1701
+ inject: inject5,
1702
+ getUniforms: getMaskUniforms
1703
+ };
1704
+
1705
+ // dist/mask/mask-effect.js
1706
+ var import_core19 = require("@deck.gl/core");
1707
+ var import_core20 = require("@math.gl/core");
1708
+
1709
+ // dist/mask/mask-pass.js
1710
+ var import_core17 = require("@deck.gl/core");
1711
+ var MASK_BLENDING = {
1712
+ blendColorOperation: "subtract",
1713
+ blendColorSrcFactor: "zero",
1714
+ blendColorDstFactor: "one",
1715
+ blendAlphaOperation: "subtract",
1716
+ blendAlphaSrcFactor: "zero",
1717
+ blendAlphaDstFactor: "one"
1718
+ };
1719
+ var MaskPass = class extends import_core17._LayersPass {
1720
+ constructor(device, props) {
1721
+ super(device, props);
1722
+ const { mapSize = 2048 } = props;
1723
+ this.maskMap = device.createTexture({
1724
+ format: "rgba8unorm",
1725
+ width: mapSize,
1726
+ height: mapSize,
1727
+ sampler: {
1728
+ minFilter: "linear",
1729
+ magFilter: "linear",
1730
+ addressModeU: "clamp-to-edge",
1731
+ addressModeV: "clamp-to-edge"
1732
+ }
1733
+ });
1734
+ this.fbo = device.createFramebuffer({
1735
+ id: "maskmap",
1736
+ width: mapSize,
1737
+ height: mapSize,
1738
+ colorAttachments: [this.maskMap]
1739
+ });
1740
+ }
1741
+ render(options) {
1742
+ const colorMask = 2 ** options.channel;
1743
+ const clearColor = [255, 255, 255, 255];
1744
+ super.render({ ...options, clearColor, colorMask, target: this.fbo, pass: "mask" });
1745
+ }
1746
+ getLayerParameters(layer, layerIndex, viewport) {
1747
+ return {
1748
+ ...layer.props.parameters,
1749
+ blend: true,
1750
+ depthTest: false,
1751
+ ...MASK_BLENDING
1752
+ };
1753
+ }
1754
+ shouldDrawLayer(layer) {
1755
+ return layer.props.operation.includes("mask");
1756
+ }
1757
+ delete() {
1758
+ this.fbo.delete();
1759
+ this.maskMap.delete();
1760
+ }
1761
+ };
1762
+
1763
+ // dist/utils/projection-utils.js
1764
+ var import_core18 = require("@deck.gl/core");
1765
+ function joinLayerBounds(layers, viewport) {
1766
+ const bounds = [Infinity, Infinity, -Infinity, -Infinity];
1767
+ for (const layer of layers) {
1768
+ const layerBounds = layer.getBounds();
1769
+ if (layerBounds) {
1770
+ const bottomLeftCommon = layer.projectPosition(layerBounds[0], { viewport, autoOffset: false });
1771
+ const topRightCommon = layer.projectPosition(layerBounds[1], { viewport, autoOffset: false });
1772
+ bounds[0] = Math.min(bounds[0], bottomLeftCommon[0]);
1773
+ bounds[1] = Math.min(bounds[1], bottomLeftCommon[1]);
1774
+ bounds[2] = Math.max(bounds[2], topRightCommon[0]);
1775
+ bounds[3] = Math.max(bounds[3], topRightCommon[1]);
1776
+ }
1777
+ }
1778
+ if (Number.isFinite(bounds[0])) {
1779
+ return bounds;
1780
+ }
1781
+ return null;
1782
+ }
1783
+ var MAX_VIEWPORT_SIZE = 2048;
1784
+ function makeViewport(opts) {
1785
+ const { bounds, viewport, border = 0 } = opts;
1786
+ const { isGeospatial } = viewport;
1787
+ if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {
1788
+ return null;
1789
+ }
1790
+ const centerWorld = viewport.unprojectPosition([
1791
+ (bounds[0] + bounds[2]) / 2,
1792
+ (bounds[1] + bounds[3]) / 2,
1793
+ 0
1794
+ ]);
1795
+ let { width, height, zoom } = opts;
1796
+ if (zoom === void 0) {
1797
+ width = width - border * 2;
1798
+ height = height - border * 2;
1799
+ const scale = Math.min(width / (bounds[2] - bounds[0]), height / (bounds[3] - bounds[1]));
1800
+ zoom = Math.min(Math.log2(scale), 20);
1801
+ } else if (!width || !height) {
1802
+ const scale = 2 ** zoom;
1803
+ width = Math.round(Math.abs(bounds[2] - bounds[0]) * scale);
1804
+ height = Math.round(Math.abs(bounds[3] - bounds[1]) * scale);
1805
+ const maxSize = MAX_VIEWPORT_SIZE - border * 2;
1806
+ if (width > maxSize || height > maxSize) {
1807
+ const r = maxSize / Math.max(width, height);
1808
+ width = Math.round(width * r);
1809
+ height = Math.round(height * r);
1810
+ zoom += Math.log2(r);
1811
+ }
1812
+ }
1813
+ return isGeospatial ? new import_core18.WebMercatorViewport({
1814
+ id: viewport.id,
1815
+ x: border,
1816
+ y: border,
1817
+ width,
1818
+ height,
1819
+ longitude: centerWorld[0],
1820
+ latitude: centerWorld[1],
1821
+ zoom,
1822
+ orthographic: true
1823
+ }) : new import_core18.OrthographicViewport({
1824
+ id: viewport.id,
1825
+ x: border,
1826
+ y: border,
1827
+ width,
1828
+ height,
1829
+ target: centerWorld,
1830
+ zoom,
1831
+ flipY: false
1832
+ });
1833
+ }
1834
+ function getViewportBounds(viewport, zRange) {
1835
+ let viewportBoundsWorld;
1836
+ if (zRange && zRange.length === 2) {
1837
+ const [minZ, maxZ] = zRange;
1838
+ const bounds0 = viewport.getBounds({ z: minZ });
1839
+ const bounds1 = viewport.getBounds({ z: maxZ });
1840
+ viewportBoundsWorld = [
1841
+ Math.min(bounds0[0], bounds1[0]),
1842
+ Math.min(bounds0[1], bounds1[1]),
1843
+ Math.max(bounds0[2], bounds1[2]),
1844
+ Math.max(bounds0[3], bounds1[3])
1845
+ ];
1846
+ } else {
1847
+ viewportBoundsWorld = viewport.getBounds();
1848
+ }
1849
+ const viewportBottomLeftCommon = viewport.projectPosition(viewportBoundsWorld.slice(0, 2));
1850
+ const viewportTopRightCommon = viewport.projectPosition(viewportBoundsWorld.slice(2, 4));
1851
+ return [
1852
+ viewportBottomLeftCommon[0],
1853
+ viewportBottomLeftCommon[1],
1854
+ viewportTopRightCommon[0],
1855
+ viewportTopRightCommon[1]
1856
+ ];
1857
+ }
1858
+ function getRenderBounds(layerBounds, viewport, zRange) {
1859
+ if (!layerBounds) {
1860
+ return [0, 0, 1, 1];
1861
+ }
1862
+ const viewportBounds = getViewportBounds(viewport, zRange);
1863
+ const paddedBounds = doubleBounds(viewportBounds);
1864
+ if (layerBounds[2] - layerBounds[0] <= paddedBounds[2] - paddedBounds[0] && layerBounds[3] - layerBounds[1] <= paddedBounds[3] - paddedBounds[1]) {
1865
+ return layerBounds;
1866
+ }
1867
+ return [
1868
+ Math.max(layerBounds[0], paddedBounds[0]),
1869
+ Math.max(layerBounds[1], paddedBounds[1]),
1870
+ Math.min(layerBounds[2], paddedBounds[2]),
1871
+ Math.min(layerBounds[3], paddedBounds[3])
1872
+ ];
1873
+ }
1874
+ function doubleBounds(bounds) {
1875
+ const dx = bounds[2] - bounds[0];
1876
+ const dy = bounds[3] - bounds[1];
1877
+ const centerX = (bounds[0] + bounds[2]) / 2;
1878
+ const centerY = (bounds[1] + bounds[3]) / 2;
1879
+ return [centerX - dx, centerY - dy, centerX + dx, centerY + dy];
1880
+ }
1881
+
1882
+ // dist/mask/mask-effect.js
1883
+ var MaskEffect = class {
1884
+ constructor() {
1885
+ this.id = "mask-effect";
1886
+ this.props = null;
1887
+ this.useInPicking = true;
1888
+ this.order = 0;
1889
+ this.channels = [];
1890
+ this.masks = null;
1891
+ }
1892
+ setup({ device }) {
1893
+ this.dummyMaskMap = device.createTexture({
1894
+ width: 1,
1895
+ height: 1
1896
+ });
1897
+ this.maskPass = new MaskPass(device, { id: "default-mask" });
1898
+ this.maskMap = this.maskPass.maskMap;
1899
+ }
1900
+ preRender({ layers, layerFilter, viewports, onViewportActive, views, isPicking }) {
1901
+ let didRender = false;
1902
+ if (isPicking) {
1903
+ return { didRender };
1904
+ }
1905
+ const maskLayers = layers.filter((l) => l.props.visible && l.props.operation.includes("mask"));
1906
+ if (maskLayers.length === 0) {
1907
+ this.masks = null;
1908
+ this.channels.length = 0;
1909
+ return { didRender };
1910
+ }
1911
+ this.masks = {};
1912
+ const channelMap = this._sortMaskChannels(maskLayers);
1913
+ const viewport = viewports[0];
1914
+ const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);
1915
+ if (viewport.resolution !== void 0) {
1916
+ import_core19.log.warn("MaskExtension is not supported in GlobeView")();
1917
+ return { didRender };
1918
+ }
1919
+ for (const maskId in channelMap) {
1920
+ const result = this._renderChannel(channelMap[maskId], {
1921
+ layerFilter,
1922
+ onViewportActive,
1923
+ views,
1924
+ viewport,
1925
+ viewportChanged
1926
+ });
1927
+ didRender ||= result;
1928
+ }
1929
+ return { didRender };
1930
+ }
1931
+ _renderChannel(channelInfo, { layerFilter, onViewportActive, views, viewport, viewportChanged }) {
1932
+ let didRender = false;
1933
+ const oldChannelInfo = this.channels[channelInfo.index];
1934
+ if (!oldChannelInfo) {
1935
+ return didRender;
1936
+ }
1937
+ const maskChanged = channelInfo === oldChannelInfo || channelInfo.layers.length !== oldChannelInfo.layers.length || channelInfo.layers.some((layer, i) => layer !== oldChannelInfo.layers[i] || layer.props.transitions) || channelInfo.layerBounds.some((b, i) => b !== oldChannelInfo.layerBounds[i]);
1938
+ channelInfo.bounds = oldChannelInfo.bounds;
1939
+ channelInfo.maskBounds = oldChannelInfo.maskBounds;
1940
+ this.channels[channelInfo.index] = channelInfo;
1941
+ if (maskChanged || viewportChanged) {
1942
+ this.lastViewport = viewport;
1943
+ const layerBounds = joinLayerBounds(channelInfo.layers, viewport);
1944
+ channelInfo.bounds = layerBounds && getRenderBounds(layerBounds, viewport);
1945
+ if (maskChanged || !(0, import_core20.equals)(channelInfo.bounds, oldChannelInfo.bounds)) {
1946
+ const { maskPass, maskMap } = this;
1947
+ const maskViewport = layerBounds && makeViewport({
1948
+ bounds: channelInfo.bounds,
1949
+ viewport,
1950
+ width: maskMap.width,
1951
+ height: maskMap.height,
1952
+ border: 1
1953
+ });
1954
+ channelInfo.maskBounds = maskViewport ? maskViewport.getBounds() : [0, 0, 1, 1];
1955
+ maskPass.render({
1956
+ pass: "mask",
1957
+ channel: channelInfo.index,
1958
+ layers: channelInfo.layers,
1959
+ layerFilter,
1960
+ viewports: maskViewport ? [maskViewport] : [],
1961
+ onViewportActive,
1962
+ views,
1963
+ moduleParameters: {
1964
+ devicePixelRatio: 1
1965
+ }
1966
+ });
1967
+ didRender = true;
1968
+ }
1969
+ }
1970
+ this.masks[channelInfo.id] = {
1971
+ index: channelInfo.index,
1972
+ bounds: channelInfo.maskBounds,
1973
+ coordinateOrigin: channelInfo.coordinateOrigin,
1974
+ coordinateSystem: channelInfo.coordinateSystem
1975
+ };
1976
+ return didRender;
1977
+ }
1978
+ _sortMaskChannels(maskLayers) {
1979
+ const channelMap = {};
1980
+ let channelCount = 0;
1981
+ for (const layer of maskLayers) {
1982
+ const { id } = layer.root;
1983
+ let channelInfo = channelMap[id];
1984
+ if (!channelInfo) {
1985
+ if (++channelCount > 4) {
1986
+ import_core19.log.warn("Too many mask layers. The max supported is 4")();
1987
+ continue;
1988
+ }
1989
+ channelInfo = {
1990
+ id,
1991
+ index: this.channels.findIndex((c) => (c == null ? void 0 : c.id) === id),
1992
+ layers: [],
1993
+ layerBounds: [],
1994
+ coordinateOrigin: layer.root.props.coordinateOrigin,
1995
+ coordinateSystem: layer.root.props.coordinateSystem
1996
+ };
1997
+ channelMap[id] = channelInfo;
1998
+ }
1999
+ channelInfo.layers.push(layer);
2000
+ channelInfo.layerBounds.push(layer.getBounds());
2001
+ }
2002
+ for (let i = 0; i < 4; i++) {
2003
+ const channelInfo = this.channels[i];
2004
+ if (!channelInfo || !(channelInfo.id in channelMap)) {
2005
+ this.channels[i] = null;
2006
+ }
2007
+ }
2008
+ for (const maskId in channelMap) {
2009
+ const channelInfo = channelMap[maskId];
2010
+ if (channelInfo.index < 0) {
2011
+ channelInfo.index = this.channels.findIndex((c) => !c);
2012
+ this.channels[channelInfo.index] = channelInfo;
2013
+ }
2014
+ }
2015
+ return channelMap;
2016
+ }
2017
+ getModuleParameters() {
2018
+ return {
2019
+ maskMap: this.masks ? this.maskMap : this.dummyMaskMap,
2020
+ maskChannels: this.masks
2021
+ };
2022
+ }
2023
+ cleanup() {
2024
+ if (this.dummyMaskMap) {
2025
+ this.dummyMaskMap.delete();
2026
+ this.dummyMaskMap = void 0;
2027
+ }
2028
+ if (this.maskPass) {
2029
+ this.maskPass.delete();
2030
+ this.maskPass = void 0;
2031
+ this.maskMap = void 0;
2032
+ }
2033
+ this.lastViewport = void 0;
2034
+ this.masks = null;
2035
+ this.channels.length = 0;
2036
+ }
2037
+ };
2038
+
2039
+ // dist/mask/mask-extension.js
2040
+ var defaultProps7 = {
2041
+ maskId: "",
2042
+ maskByInstance: void 0,
2043
+ maskInverted: false
2044
+ };
2045
+ var _MaskExtension = class extends import_core21.LayerExtension {
2046
+ initializeState() {
2047
+ var _a;
2048
+ (_a = this.context.deck) == null ? void 0 : _a._addDefaultEffect(new MaskEffect());
2049
+ }
2050
+ getShaders() {
2051
+ let maskByInstance = "instancePositions" in this.getAttributeManager().attributes;
2052
+ if (this.props.maskByInstance !== void 0) {
2053
+ maskByInstance = Boolean(this.props.maskByInstance);
2054
+ }
2055
+ this.state.maskByInstance = maskByInstance;
2056
+ return {
2057
+ modules: [shader_module_default3]
2058
+ };
2059
+ }
2060
+ draw({ uniforms, context, moduleParameters }) {
2061
+ uniforms.mask_maskByInstance = this.state.maskByInstance;
2062
+ const { maskId, maskInverted } = this.props;
2063
+ const { maskChannels } = moduleParameters;
2064
+ const { viewport } = context;
2065
+ if (maskChannels && maskChannels[maskId]) {
2066
+ const { index, bounds, coordinateOrigin: fromCoordinateOrigin } = maskChannels[maskId];
2067
+ let { coordinateSystem: fromCoordinateSystem } = maskChannels[maskId];
2068
+ uniforms.mask_enabled = true;
2069
+ uniforms.mask_channel = index;
2070
+ uniforms.mask_inverted = maskInverted;
2071
+ if (fromCoordinateSystem === import_core21.COORDINATE_SYSTEM.DEFAULT) {
2072
+ fromCoordinateSystem = viewport.isGeospatial ? import_core21.COORDINATE_SYSTEM.LNGLAT : import_core21.COORDINATE_SYSTEM.CARTESIAN;
2073
+ }
2074
+ const opts = { modelMatrix: null, fromCoordinateOrigin, fromCoordinateSystem };
2075
+ const bl = this.projectPosition([bounds[0], bounds[1], 0], opts);
2076
+ const tr = this.projectPosition([bounds[2], bounds[3], 0], opts);
2077
+ uniforms.mask_bounds = [bl[0], bl[1], tr[0], tr[1]];
2078
+ } else {
2079
+ if (maskId) {
2080
+ import_core21.log.warn(`Could not find a mask layer with id: ${maskId}`)();
2081
+ }
2082
+ uniforms.mask_enabled = false;
2083
+ }
2084
+ }
2085
+ };
2086
+ var MaskExtension = _MaskExtension;
2087
+ (() => {
2088
+ _MaskExtension.defaultProps = defaultProps7;
2089
+ })();
2090
+ (() => {
2091
+ _MaskExtension.extensionName = "MaskExtension";
2092
+ })();
2093
+
2094
+ // dist/terrain/terrain-extension.js
2095
+ var import_core26 = require("@deck.gl/core");
2096
+
2097
+ // dist/terrain/terrain-effect.js
2098
+ var import_core25 = require("@deck.gl/core");
2099
+
2100
+ // dist/terrain/shader-module.js
2101
+ var import_core22 = require("@deck.gl/core");
2102
+ var TERRAIN_MODE = {
2103
+ NONE: 0,
2104
+ WRITE_HEIGHT_MAP: 1,
2105
+ USE_HEIGHT_MAP: 2,
2106
+ USE_COVER: 3,
2107
+ USE_COVER_ONLY: 4,
2108
+ SKIP: 5
2109
+ };
2110
+ var TERRAIN_MODE_CONSTANTS = Object.keys(TERRAIN_MODE).map((key) => `const float TERRAIN_MODE_${key} = ${TERRAIN_MODE[key]}.0;`).join("\n");
2111
+ var terrainModule = {
2112
+ name: "terrain",
2113
+ dependencies: [import_core22.project],
2114
+ inject: {
2115
+ "vs:#decl": `
2116
+ uniform float terrain_mode;
2117
+ uniform sampler2D terrain_map;
2118
+ uniform vec4 terrain_bounds;
2119
+ out vec3 commonPos;
2120
+ ` + TERRAIN_MODE_CONSTANTS,
2121
+ "vs:#main-start": `
2122
+ if (terrain_mode == TERRAIN_MODE_SKIP) {
2123
+ gl_Position = vec4(0.0);
2124
+ return;
2125
+ }
2126
+ `,
2127
+ "vs:DECKGL_FILTER_GL_POSITION": `
2128
+ commonPos = geometry.position.xyz;
2129
+ if (terrain_mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {
2130
+ vec2 texCoords = (commonPos.xy - terrain_bounds.xy) / terrain_bounds.zw;
2131
+ position = vec4(texCoords * 2.0 - 1.0, 0.0, 1.0);
2132
+ commonPos.z += project_uCommonOrigin.z;
2133
+ }
2134
+ if (terrain_mode == TERRAIN_MODE_USE_HEIGHT_MAP) {
2135
+ vec3 anchor = geometry.worldPosition;
2136
+ anchor.z = 0.0;
2137
+ vec3 anchorCommon = project_position(anchor);
2138
+ vec2 texCoords = (anchorCommon.xy - terrain_bounds.xy) / terrain_bounds.zw;
2139
+ if (texCoords.x >= 0.0 && texCoords.y >= 0.0 && texCoords.x <= 1.0 && texCoords.y <= 1.0) {
2140
+ float terrainZ = texture(terrain_map, texCoords).r;
2141
+ geometry.position.z += terrainZ;
2142
+ position = project_common_position_to_clipspace(geometry.position);
2143
+ }
2144
+ }
2145
+ `,
2146
+ "fs:#decl": `
2147
+ uniform float terrain_mode;
2148
+ uniform sampler2D terrain_map;
2149
+ uniform vec4 terrain_bounds;
2150
+ in vec3 commonPos;
2151
+ ` + TERRAIN_MODE_CONSTANTS,
2152
+ "fs:#main-start": `
2153
+ if (terrain_mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {
2154
+ fragColor = vec4(commonPos.z, 0.0, 0.0, 1.0);
2155
+ return;
2156
+ }
2157
+ `,
2158
+ "fs:DECKGL_FILTER_COLOR": `
2159
+ if ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_USE_COVER_ONLY)) {
2160
+ vec2 texCoords = (commonPos.xy - terrain_bounds.xy) / terrain_bounds.zw;
2161
+ vec4 pixel = texture(terrain_map, texCoords);
2162
+ if (terrain_mode == TERRAIN_MODE_USE_COVER_ONLY) {
2163
+ color = pixel;
2164
+ } else {
2165
+ color = pixel + color * (1.0 - pixel.a);
2166
+ }
2167
+ return;
2168
+ }
2169
+ `
2170
+ },
2171
+ getUniforms: (opts = {}, uniforms) => {
2172
+ var _a;
2173
+ if ("dummyHeightMap" in opts) {
2174
+ const { drawToTerrainHeightMap, heightMap, heightMapBounds, dummyHeightMap, terrainCover, useTerrainHeightMap, terrainSkipRender } = opts;
2175
+ const { project_uCommonOrigin } = uniforms;
2176
+ let mode = terrainSkipRender ? TERRAIN_MODE.SKIP : TERRAIN_MODE.NONE;
2177
+ let sampler = dummyHeightMap;
2178
+ let bounds = null;
2179
+ if (drawToTerrainHeightMap) {
2180
+ mode = TERRAIN_MODE.WRITE_HEIGHT_MAP;
2181
+ bounds = heightMapBounds;
2182
+ } else if (useTerrainHeightMap && heightMap) {
2183
+ mode = TERRAIN_MODE.USE_HEIGHT_MAP;
2184
+ sampler = heightMap;
2185
+ bounds = heightMapBounds;
2186
+ } else if (terrainCover) {
2187
+ const isPicking = (_a = opts.picking) == null ? void 0 : _a.isActive;
2188
+ const fbo = isPicking ? terrainCover.getPickingFramebuffer() : terrainCover.getRenderFramebuffer();
2189
+ sampler = fbo == null ? void 0 : fbo.colorAttachments[0].texture;
2190
+ if (isPicking) {
2191
+ mode = TERRAIN_MODE.SKIP;
2192
+ }
2193
+ if (sampler) {
2194
+ mode = mode === TERRAIN_MODE.SKIP ? TERRAIN_MODE.USE_COVER_ONLY : TERRAIN_MODE.USE_COVER;
2195
+ bounds = terrainCover.bounds;
2196
+ } else {
2197
+ sampler = dummyHeightMap;
2198
+ }
2199
+ }
2200
+ return {
2201
+ terrain_mode: mode,
2202
+ terrain_map: sampler,
2203
+ terrain_bounds: bounds ? [
2204
+ bounds[0] - project_uCommonOrigin[0],
2205
+ bounds[1] - project_uCommonOrigin[1],
2206
+ bounds[2] - bounds[0],
2207
+ bounds[3] - bounds[1]
2208
+ ] : [0, 0, 0, 0]
2209
+ };
2210
+ }
2211
+ return null;
2212
+ }
2213
+ };
2214
+
2215
+ // dist/terrain/utils.js
2216
+ var import_constants2 = require("@luma.gl/constants");
2217
+ function createRenderTarget(device, opts) {
2218
+ return device.createFramebuffer({
2219
+ id: opts.id,
2220
+ colorAttachments: [
2221
+ device.createTexture({
2222
+ id: opts.id,
2223
+ ...opts.float && {
2224
+ format: "rgba32float",
2225
+ type: 5126
2226
+ },
2227
+ mipmaps: false,
2228
+ sampler: opts.interpolate === false ? {
2229
+ minFilter: "nearest",
2230
+ magFilter: "nearest"
2231
+ } : {
2232
+ minFilter: "linear",
2233
+ magFilter: "linear"
2234
+ }
2235
+ })
2236
+ ]
2237
+ });
2238
+ }
2239
+
2240
+ // dist/terrain/terrain-cover.js
2241
+ var TerrainCover = class {
2242
+ constructor(targetLayer) {
2243
+ this.isDirty = true;
2244
+ this.renderViewport = null;
2245
+ this.bounds = null;
2246
+ this.layers = [];
2247
+ this.targetBounds = null;
2248
+ this.targetBoundsCommon = null;
2249
+ this.targetLayer = targetLayer;
2250
+ this.tile = getTile(targetLayer);
2251
+ }
2252
+ get id() {
2253
+ return this.targetLayer.id;
2254
+ }
2255
+ get isActive() {
2256
+ return Boolean(this.targetLayer.getCurrentLayer());
2257
+ }
2258
+ shouldUpdate({ targetLayer, viewport, layers, layerNeedsRedraw }) {
2259
+ if (targetLayer) {
2260
+ this.targetLayer = targetLayer;
2261
+ }
2262
+ const sizeChanged = viewport ? this._updateViewport(viewport) : false;
2263
+ let layersChanged = layers ? this._updateLayers(layers) : false;
2264
+ if (layerNeedsRedraw) {
2265
+ for (const id of this.layers) {
2266
+ if (layerNeedsRedraw[id]) {
2267
+ layersChanged = true;
2268
+ break;
2269
+ }
2270
+ }
2271
+ }
2272
+ return layersChanged || sizeChanged;
2273
+ }
2274
+ _updateLayers(layers) {
2275
+ let needsRedraw = false;
2276
+ layers = this.tile ? getIntersectingLayers(this.tile, layers) : layers;
2277
+ if (layers.length !== this.layers.length) {
2278
+ needsRedraw = true;
2279
+ } else {
2280
+ for (let i = 0; i < layers.length; i++) {
2281
+ const id = layers[i].id;
2282
+ if (id !== this.layers[i]) {
2283
+ needsRedraw = true;
2284
+ break;
2285
+ }
2286
+ }
2287
+ }
2288
+ if (needsRedraw) {
2289
+ this.layers = layers.map((layer) => layer.id);
2290
+ }
2291
+ return needsRedraw;
2292
+ }
2293
+ _updateViewport(viewport) {
2294
+ var _a;
2295
+ const targetLayer = this.targetLayer;
2296
+ let shouldRedraw = false;
2297
+ if (this.tile && "boundingBox" in this.tile) {
2298
+ if (!this.targetBounds) {
2299
+ shouldRedraw = true;
2300
+ this.targetBounds = this.tile.boundingBox;
2301
+ const bottomLeftCommon = viewport.projectPosition(this.targetBounds[0]);
2302
+ const topRightCommon = viewport.projectPosition(this.targetBounds[1]);
2303
+ this.targetBoundsCommon = [
2304
+ bottomLeftCommon[0],
2305
+ bottomLeftCommon[1],
2306
+ topRightCommon[0],
2307
+ topRightCommon[1]
2308
+ ];
2309
+ }
2310
+ } else if (this.targetBounds !== targetLayer.getBounds()) {
2311
+ shouldRedraw = true;
2312
+ this.targetBounds = targetLayer.getBounds();
2313
+ this.targetBoundsCommon = joinLayerBounds([targetLayer], viewport);
2314
+ }
2315
+ if (!this.targetBoundsCommon) {
2316
+ return false;
2317
+ }
2318
+ const newZoom = Math.ceil(viewport.zoom + 0.5);
2319
+ if (this.tile) {
2320
+ this.bounds = this.targetBoundsCommon;
2321
+ } else {
2322
+ const oldZoom = (_a = this.renderViewport) == null ? void 0 : _a.zoom;
2323
+ shouldRedraw = shouldRedraw || newZoom !== oldZoom;
2324
+ const newBounds = getRenderBounds(this.targetBoundsCommon, viewport);
2325
+ const oldBounds = this.bounds;
2326
+ shouldRedraw = shouldRedraw || !oldBounds || newBounds.some((x, i) => x !== oldBounds[i]);
2327
+ this.bounds = newBounds;
2328
+ }
2329
+ if (shouldRedraw) {
2330
+ this.renderViewport = makeViewport({
2331
+ bounds: this.bounds,
2332
+ zoom: newZoom,
2333
+ viewport
2334
+ });
2335
+ }
2336
+ return shouldRedraw;
2337
+ }
2338
+ getRenderFramebuffer() {
2339
+ if (!this.renderViewport || this.layers.length === 0) {
2340
+ return null;
2341
+ }
2342
+ if (!this.fbo) {
2343
+ this.fbo = createRenderTarget(this.targetLayer.context.device, { id: this.id });
2344
+ }
2345
+ return this.fbo;
2346
+ }
2347
+ getPickingFramebuffer() {
2348
+ if (!this.renderViewport || this.layers.length === 0 && !this.targetLayer.props.pickable) {
2349
+ return null;
2350
+ }
2351
+ if (!this.pickingFbo) {
2352
+ this.pickingFbo = createRenderTarget(this.targetLayer.context.device, {
2353
+ id: `${this.id}-picking`,
2354
+ interpolate: false
2355
+ });
2356
+ }
2357
+ return this.pickingFbo;
2358
+ }
2359
+ filterLayers(layers) {
2360
+ return layers.filter(({ id }) => this.layers.includes(id));
2361
+ }
2362
+ delete() {
2363
+ const { fbo, pickingFbo } = this;
2364
+ if (fbo) {
2365
+ fbo.colorAttachments[0].destroy();
2366
+ fbo.destroy();
2367
+ }
2368
+ if (pickingFbo) {
2369
+ pickingFbo.colorAttachments[0].destroy();
2370
+ pickingFbo.destroy();
2371
+ }
2372
+ }
2373
+ };
2374
+ function getIntersectingLayers(sourceTile, layers) {
2375
+ return layers.filter((layer) => {
2376
+ const tile = getTile(layer);
2377
+ if (tile) {
2378
+ return intersect(sourceTile.boundingBox, tile.boundingBox);
2379
+ }
2380
+ return true;
2381
+ });
2382
+ }
2383
+ function getTile(layer) {
2384
+ while (layer) {
2385
+ const { tile } = layer.props;
2386
+ if (tile) {
2387
+ return tile;
2388
+ }
2389
+ layer = layer.parent;
2390
+ }
2391
+ return null;
2392
+ }
2393
+ function intersect(b1, b2) {
2394
+ if (b1 && b2) {
2395
+ return b1[0][0] < b2[1][0] && b2[0][0] < b1[1][0] && b1[0][1] < b2[1][1] && b2[0][1] < b1[1][1];
2396
+ }
2397
+ return false;
2398
+ }
2399
+
2400
+ // dist/terrain/terrain-pass.js
2401
+ var import_core23 = require("@deck.gl/core");
2402
+ var TERRAIN_BLENDING = {
2403
+ blendColorOperation: "max",
2404
+ blendColorSrcFactor: "one",
2405
+ blendColorDstFactor: "one",
2406
+ blendAlphaOperation: "max",
2407
+ blendAlphaSrcFactor: "one",
2408
+ blendAlphaDstFactor: "one"
2409
+ };
2410
+ var TerrainPass = class extends import_core23._LayersPass {
2411
+ getRenderableLayers(viewport, opts) {
2412
+ const { layers } = opts;
2413
+ const result = [];
2414
+ const drawParamsByIndex = this._getDrawLayerParams(viewport, opts, true);
2415
+ for (let i = 0; i < layers.length; i++) {
2416
+ const layer = layers[i];
2417
+ if (!layer.isComposite && drawParamsByIndex[i].shouldDrawLayer) {
2418
+ result.push(layer);
2419
+ }
2420
+ }
2421
+ return result;
2422
+ }
2423
+ renderHeightMap(heightMap, opts) {
2424
+ const target = heightMap.getRenderFramebuffer();
2425
+ const viewport = heightMap.renderViewport;
2426
+ if (!target || !viewport) {
2427
+ return;
2428
+ }
2429
+ target.resize(viewport);
2430
+ this.render({
2431
+ ...opts,
2432
+ target,
2433
+ pass: "terrain-height-map",
2434
+ layers: opts.layers,
2435
+ viewports: [viewport],
2436
+ effects: [],
2437
+ clearColor: [0, 0, 0, 0]
2438
+ });
2439
+ }
2440
+ renderTerrainCover(terrainCover, opts) {
2441
+ const target = terrainCover.getRenderFramebuffer();
2442
+ const viewport = terrainCover.renderViewport;
2443
+ if (!target || !viewport) {
2444
+ return;
2445
+ }
2446
+ const layers = terrainCover.filterLayers(opts.layers);
2447
+ target.resize(viewport);
2448
+ this.render({
2449
+ ...opts,
2450
+ target,
2451
+ pass: `terrain-cover-${terrainCover.id}`,
2452
+ layers,
2453
+ effects: [],
2454
+ viewports: [viewport],
2455
+ clearColor: [0, 0, 0, 0]
2456
+ });
2457
+ }
2458
+ getLayerParameters(layer, layerIndex, viewport) {
2459
+ return {
2460
+ ...layer.props.parameters,
2461
+ blend: true,
2462
+ depthTest: false,
2463
+ ...layer.props.operation.includes("terrain") && TERRAIN_BLENDING
2464
+ };
2465
+ }
2466
+ };
2467
+
2468
+ // dist/terrain/terrain-picking-pass.js
2469
+ var import_core24 = require("@deck.gl/core");
2470
+ var TerrainPickingPass = class extends import_core24._PickLayersPass {
2471
+ constructor() {
2472
+ super(...arguments);
2473
+ this.drawParameters = {};
2474
+ }
2475
+ getRenderableLayers(viewport, opts) {
2476
+ const { layers } = opts;
2477
+ const result = [];
2478
+ this.drawParameters = {};
2479
+ this._resetColorEncoder(opts.pickZ);
2480
+ const drawParamsByIndex = this._getDrawLayerParams(viewport, opts);
2481
+ for (let i = 0; i < layers.length; i++) {
2482
+ const layer = layers[i];
2483
+ if (!layer.isComposite && drawParamsByIndex[i].shouldDrawLayer) {
2484
+ result.push(layer);
2485
+ this.drawParameters[layer.id] = drawParamsByIndex[i].layerParameters;
2486
+ }
2487
+ }
2488
+ return result;
2489
+ }
2490
+ renderTerrainCover(terrainCover, opts) {
2491
+ const target = terrainCover.getPickingFramebuffer();
2492
+ const viewport = terrainCover.renderViewport;
2493
+ if (!target || !viewport) {
2494
+ return;
2495
+ }
2496
+ const layers = terrainCover.filterLayers(opts.layers);
2497
+ const terrainLayer = terrainCover.targetLayer;
2498
+ if (terrainLayer.props.pickable) {
2499
+ layers.unshift(terrainLayer);
2500
+ }
2501
+ target.resize(viewport);
2502
+ this.render({
2503
+ ...opts,
2504
+ pickingFBO: target,
2505
+ pass: `terrain-cover-picking-${terrainCover.id}`,
2506
+ layers,
2507
+ effects: [],
2508
+ viewports: [viewport],
2509
+ cullRect: void 0,
2510
+ deviceRect: viewport,
2511
+ pickZ: false
2512
+ });
2513
+ }
2514
+ getLayerParameters(layer, layerIndex, viewport) {
2515
+ let parameters2;
2516
+ if (this.drawParameters[layer.id]) {
2517
+ parameters2 = this.drawParameters[layer.id];
2518
+ } else {
2519
+ parameters2 = super.getLayerParameters(layer, layerIndex, viewport);
2520
+ parameters2.blend = true;
2521
+ }
2522
+ return { ...parameters2, depthTest: false };
2523
+ }
2524
+ };
2525
+
2526
+ // dist/terrain/height-map-builder.js
2527
+ var MAP_MAX_SIZE = 2048;
2528
+ var HeightMapBuilder = class {
2529
+ static isSupported(device) {
2530
+ return device.isTextureFormatRenderable("rgba32float");
2531
+ }
2532
+ constructor(device) {
2533
+ this.renderViewport = null;
2534
+ this.bounds = null;
2535
+ this.layers = [];
2536
+ this.layersBounds = [];
2537
+ this.layersBoundsCommon = null;
2538
+ this.lastViewport = null;
2539
+ this.device = device;
2540
+ }
2541
+ getRenderFramebuffer() {
2542
+ if (!this.renderViewport) {
2543
+ return null;
2544
+ }
2545
+ if (!this.fbo) {
2546
+ this.fbo = createRenderTarget(this.device, { id: "height-map", float: true });
2547
+ }
2548
+ return this.fbo;
2549
+ }
2550
+ shouldUpdate({ layers, viewport }) {
2551
+ const layersChanged = layers.length !== this.layers.length || layers.some((layer, i) => layer !== this.layers[i] || layer.props.transitions || layer.getBounds() !== this.layersBounds[i]);
2552
+ if (layersChanged) {
2553
+ this.layers = layers;
2554
+ this.layersBounds = layers.map((layer) => layer.getBounds());
2555
+ this.layersBoundsCommon = joinLayerBounds(layers, viewport);
2556
+ }
2557
+ const viewportChanged = !this.lastViewport || !viewport.equals(this.lastViewport);
2558
+ if (!this.layersBoundsCommon) {
2559
+ this.renderViewport = null;
2560
+ } else if (layersChanged || viewportChanged) {
2561
+ const bounds = getRenderBounds(this.layersBoundsCommon, viewport);
2562
+ if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {
2563
+ this.renderViewport = null;
2564
+ return false;
2565
+ }
2566
+ this.bounds = bounds;
2567
+ this.lastViewport = viewport;
2568
+ const scale = viewport.scale;
2569
+ const pixelWidth = (bounds[2] - bounds[0]) * scale;
2570
+ const pixelHeight = (bounds[3] - bounds[1]) * scale;
2571
+ this.renderViewport = pixelWidth > 0 || pixelHeight > 0 ? makeViewport({
2572
+ bounds: [
2573
+ viewport.center[0] - 1,
2574
+ viewport.center[1] - 1,
2575
+ viewport.center[0] + 1,
2576
+ viewport.center[1] + 1
2577
+ ],
2578
+ zoom: viewport.zoom,
2579
+ width: Math.min(pixelWidth, MAP_MAX_SIZE),
2580
+ height: Math.min(pixelHeight, MAP_MAX_SIZE),
2581
+ viewport
2582
+ }) : null;
2583
+ return true;
2584
+ }
2585
+ return false;
2586
+ }
2587
+ delete() {
2588
+ if (this.fbo) {
2589
+ this.fbo.colorAttachments[0].delete();
2590
+ this.fbo.delete();
2591
+ }
2592
+ }
2593
+ };
2594
+
2595
+ // dist/terrain/terrain-effect.js
2596
+ var TerrainEffect = class {
2597
+ constructor() {
2598
+ this.id = "terrain-effect";
2599
+ this.props = null;
2600
+ this.useInPicking = true;
2601
+ this.isPicking = false;
2602
+ this.isDrapingEnabled = false;
2603
+ this.terrainCovers = /* @__PURE__ */ new Map();
2604
+ }
2605
+ setup({ device, deck }) {
2606
+ this.dummyHeightMap = device.createTexture({
2607
+ width: 1,
2608
+ height: 1,
2609
+ data: new Uint8Array([0, 0, 0, 0])
2610
+ });
2611
+ this.terrainPass = new TerrainPass(device, { id: "terrain" });
2612
+ this.terrainPickingPass = new TerrainPickingPass(device, { id: "terrain-picking" });
2613
+ if (HeightMapBuilder.isSupported(device)) {
2614
+ this.heightMap = new HeightMapBuilder(device);
2615
+ } else {
2616
+ import_core25.log.warn("Terrain offset mode is not supported by this browser")();
2617
+ }
2618
+ deck._addDefaultShaderModule(terrainModule);
2619
+ }
2620
+ preRender(opts) {
2621
+ if (opts.pickZ) {
2622
+ this.isDrapingEnabled = false;
2623
+ return;
2624
+ }
2625
+ const { viewports } = opts;
2626
+ const isPicking = opts.pass.startsWith("picking");
2627
+ this.isPicking = isPicking;
2628
+ this.isDrapingEnabled = true;
2629
+ const viewport = viewports[0];
2630
+ const layers = (isPicking ? this.terrainPickingPass : this.terrainPass).getRenderableLayers(viewport, opts);
2631
+ const terrainLayers = layers.filter((l) => l.props.operation.includes("terrain"));
2632
+ if (terrainLayers.length === 0) {
2633
+ return;
2634
+ }
2635
+ if (!isPicking) {
2636
+ const offsetLayers = layers.filter((l) => l.state.terrainDrawMode === "offset");
2637
+ if (offsetLayers.length > 0) {
2638
+ this._updateHeightMap(terrainLayers, viewport, opts);
2639
+ }
2640
+ }
2641
+ const drapeLayers = layers.filter((l) => l.state.terrainDrawMode === "drape");
2642
+ this._updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts);
2643
+ }
2644
+ getModuleParameters(layer) {
2645
+ var _a, _b, _c;
2646
+ const { terrainDrawMode } = layer.state;
2647
+ return {
2648
+ heightMap: ((_b = (_a = this.heightMap) == null ? void 0 : _a.getRenderFramebuffer()) == null ? void 0 : _b.colorAttachments[0].texture) || null,
2649
+ heightMapBounds: (_c = this.heightMap) == null ? void 0 : _c.bounds,
2650
+ dummyHeightMap: this.dummyHeightMap,
2651
+ terrainCover: this.isDrapingEnabled ? this.terrainCovers.get(layer.id) : null,
2652
+ useTerrainHeightMap: terrainDrawMode === "offset",
2653
+ terrainSkipRender: terrainDrawMode === "drape" || !layer.props.operation.includes("draw")
2654
+ };
2655
+ }
2656
+ cleanup({ deck }) {
2657
+ if (this.dummyHeightMap) {
2658
+ this.dummyHeightMap.delete();
2659
+ this.dummyHeightMap = void 0;
2660
+ }
2661
+ if (this.heightMap) {
2662
+ this.heightMap.delete();
2663
+ this.heightMap = void 0;
2664
+ }
2665
+ for (const terrainCover of this.terrainCovers.values()) {
2666
+ terrainCover.delete();
2667
+ }
2668
+ this.terrainCovers.clear();
2669
+ deck._removeDefaultShaderModule(terrainModule);
2670
+ }
2671
+ _updateHeightMap(terrainLayers, viewport, opts) {
2672
+ if (!this.heightMap) {
2673
+ return;
2674
+ }
2675
+ const shouldUpdate = this.heightMap.shouldUpdate({ layers: terrainLayers, viewport });
2676
+ if (!shouldUpdate) {
2677
+ return;
2678
+ }
2679
+ this.terrainPass.renderHeightMap(this.heightMap, {
2680
+ ...opts,
2681
+ layers: terrainLayers,
2682
+ moduleParameters: {
2683
+ heightMapBounds: this.heightMap.bounds,
2684
+ dummyHeightMap: this.dummyHeightMap,
2685
+ devicePixelRatio: 1,
2686
+ drawToTerrainHeightMap: true
2687
+ }
2688
+ });
2689
+ }
2690
+ _updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts) {
2691
+ const layerNeedsRedraw = {};
2692
+ for (const layer of drapeLayers) {
2693
+ if (layer.state.terrainCoverNeedsRedraw) {
2694
+ layerNeedsRedraw[layer.id] = true;
2695
+ layer.state.terrainCoverNeedsRedraw = false;
2696
+ }
2697
+ }
2698
+ for (const terrainCover of this.terrainCovers.values()) {
2699
+ terrainCover.isDirty = terrainCover.isDirty || terrainCover.shouldUpdate({ layerNeedsRedraw });
2700
+ }
2701
+ for (const layer of terrainLayers) {
2702
+ this._updateTerrainCover(layer, drapeLayers, viewport, opts);
2703
+ }
2704
+ if (!this.isPicking) {
2705
+ this._pruneTerrainCovers();
2706
+ }
2707
+ }
2708
+ _updateTerrainCover(terrainLayer, drapeLayers, viewport, opts) {
2709
+ const renderPass = this.isPicking ? this.terrainPickingPass : this.terrainPass;
2710
+ let terrainCover = this.terrainCovers.get(terrainLayer.id);
2711
+ if (!terrainCover) {
2712
+ terrainCover = new TerrainCover(terrainLayer);
2713
+ this.terrainCovers.set(terrainLayer.id, terrainCover);
2714
+ }
2715
+ try {
2716
+ const isDirty = terrainCover.shouldUpdate({
2717
+ targetLayer: terrainLayer,
2718
+ viewport,
2719
+ layers: drapeLayers
2720
+ });
2721
+ if (this.isPicking || terrainCover.isDirty || isDirty) {
2722
+ renderPass.renderTerrainCover(terrainCover, {
2723
+ ...opts,
2724
+ layers: drapeLayers,
2725
+ moduleParameters: {
2726
+ dummyHeightMap: this.dummyHeightMap,
2727
+ terrainSkipRender: false,
2728
+ devicePixelRatio: 1
2729
+ }
2730
+ });
2731
+ if (!this.isPicking) {
2732
+ terrainCover.isDirty = false;
2733
+ }
2734
+ }
2735
+ } catch (err) {
2736
+ terrainLayer.raiseError(err, `Error rendering terrain cover ${terrainCover.id}`);
2737
+ }
2738
+ }
2739
+ _pruneTerrainCovers() {
2740
+ const idsToRemove = [];
2741
+ for (const [id, terrainCover] of this.terrainCovers) {
2742
+ if (!terrainCover.isActive) {
2743
+ idsToRemove.push(id);
2744
+ }
2745
+ }
2746
+ for (const id of idsToRemove) {
2747
+ this.terrainCovers.delete(id);
2748
+ }
2749
+ }
2750
+ };
2751
+
2752
+ // dist/terrain/terrain-extension.js
2753
+ var defaultProps8 = {
2754
+ terrainDrawMode: void 0
2755
+ };
2756
+ var _TerrainExtension = class extends import_core26.LayerExtension {
2757
+ getShaders() {
2758
+ return {
2759
+ modules: [terrainModule]
2760
+ };
2761
+ }
2762
+ initializeState() {
2763
+ var _a;
2764
+ (_a = this.context.deck) == null ? void 0 : _a._addDefaultEffect(new TerrainEffect());
2765
+ }
2766
+ updateState(params) {
2767
+ var _a;
2768
+ const { props, oldProps } = params;
2769
+ if (this.state.terrainDrawMode && props.terrainDrawMode === oldProps.terrainDrawMode && props.extruded === oldProps.extruded) {
2770
+ return;
2771
+ }
2772
+ let { terrainDrawMode } = props;
2773
+ if (!terrainDrawMode) {
2774
+ const is3d = this.props.extruded;
2775
+ const attributes = (_a = this.getAttributeManager()) == null ? void 0 : _a.attributes;
2776
+ const hasAnchor = attributes && "instancePositions" in attributes;
2777
+ terrainDrawMode = is3d || hasAnchor ? "offset" : "drape";
2778
+ }
2779
+ this.setState({ terrainDrawMode });
2780
+ }
2781
+ onNeedsRedraw() {
2782
+ const state = this.state;
2783
+ if (state.terrainDrawMode === "drape") {
2784
+ state.terrainCoverNeedsRedraw = true;
2785
+ }
2786
+ }
2787
+ };
2788
+ var TerrainExtension = _TerrainExtension;
2789
+ (() => {
2790
+ _TerrainExtension.defaultProps = defaultProps8;
2791
+ })();
2792
+ (() => {
2793
+ _TerrainExtension.extensionName = "TerrainExtension";
2794
+ })();
2795
+ //# sourceMappingURL=index.cjs.map