@deck.gl/extensions 9.0.0-alpha.7 → 9.0.0-beta.10

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