@deck.gl/extensions 9.0.0-beta.2 → 9.0.0-beta.4

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