@kepler.gl/deckgl-layers 3.3.0-alpha.5 → 3.3.0-alpha.7

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 (189) hide show
  1. package/dist/cjs/3d-building-layer/3d-building-layer.js +66 -0
  2. package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
  3. package/dist/cjs/3d-building-layer/types.js +6 -0
  4. package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
  5. package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
  6. package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
  7. package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
  8. package/dist/cjs/globe/atmosphere-layer.js +341 -0
  9. package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
  10. package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
  11. package/dist/cjs/globe/globe-layers.js +574 -0
  12. package/dist/cjs/globe/globe-stars-layer.js +99 -0
  13. package/dist/cjs/globe/globe-stars-layer.spec.js +42 -0
  14. package/dist/cjs/globe/globe-view.js +404 -0
  15. package/dist/{globe → cjs/globe}/index.js +19 -1
  16. package/dist/cjs/globe/mvt-label-layer.js +190 -0
  17. package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
  18. package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
  19. package/dist/{index.js → cjs/index.js} +1 -1
  20. package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
  21. package/dist/cjs/layer-utils/cluster-utils.js +93 -0
  22. package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
  23. package/dist/cjs/layer-utils/globe-cell-utils.js +173 -0
  24. package/dist/cjs/layer-utils/shader-utils.js +38 -0
  25. package/dist/cjs/line-layer/line-layer.js +95 -0
  26. package/dist/cjs/raster/images.js +271 -0
  27. package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
  28. package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
  29. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
  30. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
  31. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
  32. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
  33. package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
  34. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
  35. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
  36. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
  37. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
  38. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
  39. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
  40. package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
  41. package/dist/cjs/raster/types.js +6 -0
  42. package/dist/cjs/raster/util.js +139 -0
  43. package/dist/cjs/raster/webgl/color/colormap.js +45 -0
  44. package/dist/cjs/raster/webgl/color/filter.js +58 -0
  45. package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
  46. package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
  47. package/dist/cjs/raster/webgl/color/saturation.js +42 -0
  48. package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
  49. package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
  50. package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
  51. package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
  52. package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
  53. package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
  54. package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
  55. package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
  56. package/dist/cjs/raster/webgl/texture/mask.js +50 -0
  57. package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
  58. package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
  59. package/dist/cjs/raster/webgl/types.js +6 -0
  60. package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
  61. package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
  62. package/dist/cjs/wms/wms-layer.js +624 -0
  63. package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
  64. package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
  65. package/dist/esm/3d-building-layer/types.js +3 -0
  66. package/dist/esm/cluster-layer/cluster-layer.js +286 -0
  67. package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
  68. package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
  69. package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
  70. package/dist/esm/globe/atmosphere-layer.js +335 -0
  71. package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
  72. package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
  73. package/dist/esm/globe/globe-layers.js +566 -0
  74. package/dist/esm/globe/globe-stars-layer.js +92 -0
  75. package/dist/esm/globe/globe-stars-layer.spec.js +40 -0
  76. package/dist/esm/globe/globe-view.js +398 -0
  77. package/dist/esm/globe/index.js +26 -0
  78. package/dist/esm/globe/mvt-label-layer.js +187 -0
  79. package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
  80. package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
  81. package/dist/esm/index.js +22 -0
  82. package/dist/esm/layer-utils/aggregation-utils.js +172 -0
  83. package/dist/esm/layer-utils/cluster-utils.js +86 -0
  84. package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
  85. package/dist/esm/layer-utils/globe-cell-utils.js +167 -0
  86. package/dist/esm/layer-utils/shader-utils.js +32 -0
  87. package/dist/esm/line-layer/line-layer.js +91 -0
  88. package/dist/esm/raster/images.js +267 -0
  89. package/dist/esm/raster/pipeline-validation-patch.js +94 -0
  90. package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
  91. package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
  92. package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
  93. package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
  94. package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
  95. package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
  96. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
  97. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
  98. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
  99. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
  100. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
  101. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
  102. package/dist/esm/raster/raster-processing-uniforms.js +118 -0
  103. package/dist/esm/raster/types.js +3 -0
  104. package/dist/esm/raster/util.js +134 -0
  105. package/dist/esm/raster/webgl/color/colormap.js +39 -0
  106. package/dist/esm/raster/webgl/color/filter.js +52 -0
  107. package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
  108. package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
  109. package/dist/esm/raster/webgl/color/saturation.js +36 -0
  110. package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
  111. package/dist/esm/raster/webgl/index.js +26 -0
  112. package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
  113. package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
  114. package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
  115. package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
  116. package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
  117. package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
  118. package/dist/esm/raster/webgl/texture/mask.js +44 -0
  119. package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
  120. package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
  121. package/dist/esm/raster/webgl/types.js +3 -0
  122. package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
  123. package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
  124. package/dist/esm/wms/wms-layer.js +619 -0
  125. package/dist/globe/atmosphere-layer.d.ts +22 -1
  126. package/dist/globe/globe-stars-layer.d.ts +5 -0
  127. package/dist/globe/globe-stars-layer.spec.d.ts +1 -0
  128. package/dist/globe/index.d.ts +2 -2
  129. package/dist/wms/wms-layer.d.ts +8 -0
  130. package/package.json +19 -10
  131. package/dist/3d-building-layer/3d-building-layer.js +0 -66
  132. package/dist/3d-building-layer/3d-building-utils.js +0 -166
  133. package/dist/3d-building-layer/types.js +0 -6
  134. package/dist/cluster-layer/cluster-layer.js +0 -292
  135. package/dist/column-layer/enhanced-column-layer.js +0 -160
  136. package/dist/deckgl-extensions/filter-shader-module.js +0 -26
  137. package/dist/globe/atmosphere-layer.js +0 -220
  138. package/dist/globe/enhanced-multi-icon-layer.js +0 -63
  139. package/dist/globe/globe-depth-disk-layer.js +0 -145
  140. package/dist/globe/globe-layers.js +0 -569
  141. package/dist/globe/globe-stars-layer.js +0 -69
  142. package/dist/globe/globe-view.js +0 -404
  143. package/dist/globe/mvt-label-layer.js +0 -190
  144. package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -116
  145. package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -134
  146. package/dist/layer-utils/aggregation-utils.js +0 -181
  147. package/dist/layer-utils/cluster-utils.js +0 -93
  148. package/dist/layer-utils/cpu-aggregator.js +0 -798
  149. package/dist/layer-utils/globe-cell-utils.js +0 -173
  150. package/dist/layer-utils/shader-utils.js +0 -38
  151. package/dist/line-layer/line-layer.js +0 -95
  152. package/dist/raster/images.js +0 -271
  153. package/dist/raster/pipeline-validation-patch.js +0 -101
  154. package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
  155. package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
  156. package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
  157. package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
  158. package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
  159. package/dist/raster/raster-layer/raster-layer.js +0 -287
  160. package/dist/raster/raster-mesh-layer/matrix.d.ts +0 -4
  161. package/dist/raster/raster-mesh-layer/matrix.js +0 -18
  162. package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
  163. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
  164. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
  165. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
  166. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
  167. package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -321
  168. package/dist/raster/raster-processing-uniforms.js +0 -124
  169. package/dist/raster/types.js +0 -6
  170. package/dist/raster/util.js +0 -139
  171. package/dist/raster/webgl/color/colormap.js +0 -45
  172. package/dist/raster/webgl/color/filter.js +0 -58
  173. package/dist/raster/webgl/color/gamma-contrast.js +0 -68
  174. package/dist/raster/webgl/color/linear-rescale.js +0 -35
  175. package/dist/raster/webgl/color/saturation.js +0 -42
  176. package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
  177. package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
  178. package/dist/raster/webgl/spectral-indices/evi.js +0 -26
  179. package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
  180. package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
  181. package/dist/raster/webgl/spectral-indices/savi.js +0 -21
  182. package/dist/raster/webgl/texture/combine-bands.js +0 -65
  183. package/dist/raster/webgl/texture/mask.js +0 -50
  184. package/dist/raster/webgl/texture/reorder-bands.js +0 -72
  185. package/dist/raster/webgl/texture/rgba-image.js +0 -34
  186. package/dist/raster/webgl/types.js +0 -6
  187. package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -88
  188. package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
  189. package/dist/wms/wms-layer.js +0 -594
@@ -0,0 +1,267 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
5
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
6
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
7
+ // SPDX-License-Identifier: MIT
8
+ // Copyright contributors to the kepler.gl project
9
+
10
+ // @ts-ignore GL resolution depends on moduleResolution setting
11
+ import { GL } from '@luma.gl/constants';
12
+ import isEqual from 'lodash/isEqual';
13
+ import { FILTER_MODE, ADDRESS_MODE, TEXTURE_FORMAT } from '@kepler.gl/constants';
14
+
15
+ /**
16
+ * Legacy texture creation descriptor used by raster shader modules.
17
+ * Contains CPU-side data + old GL-enum-based parameters that get
18
+ * translated to luma.gl 9's device.createTexture() props.
19
+ */
20
+
21
+ /**
22
+ * Texture sampler parameters for luma.gl 9 textures
23
+ */
24
+ var DEFAULT_SAMPLER_PARAMETERS = {
25
+ minFilter: FILTER_MODE.NEAREST,
26
+ magFilter: FILTER_MODE.NEAREST,
27
+ addressModeU: ADDRESS_MODE.CLAMP_TO_EDGE,
28
+ addressModeV: ADDRESS_MODE.CLAMP_TO_EDGE
29
+ };
30
+
31
+ /** luma.gl device interface for texture creation */
32
+
33
+ /**
34
+ * Load image items to webgl context
35
+ */
36
+ function loadImageItem(gl, device, imageItem) {
37
+ var result;
38
+ if (Array.isArray(imageItem)) {
39
+ var dirtyResult = imageItem.map(function (x) {
40
+ return loadTexture(gl, device, x);
41
+ });
42
+ result = [];
43
+ var _iterator = _createForOfIteratorHelper(dirtyResult),
44
+ _step;
45
+ try {
46
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
47
+ var texture = _step.value;
48
+ if (texture) {
49
+ result.push(texture);
50
+ }
51
+ }
52
+ } catch (err) {
53
+ _iterator.e(err);
54
+ } finally {
55
+ _iterator.f();
56
+ }
57
+ if (!result.length) {
58
+ result = null;
59
+ }
60
+ } else {
61
+ result = loadTexture(gl, device, imageItem);
62
+ }
63
+ return result;
64
+ }
65
+
66
+ /**
67
+ * Load image items to webgl context
68
+ */
69
+
70
+ // eslint-disable-next-line complexity
71
+ export function loadImages(_ref) {
72
+ var gl = _ref.gl,
73
+ device = _ref.device,
74
+ images = _ref.images,
75
+ imagesData = _ref.imagesData,
76
+ oldImagesData = _ref.oldImagesData;
77
+ var imagesDirty = false;
78
+ var hasPendingUploads = false;
79
+ if (oldImagesData) {
80
+ for (var key in oldImagesData) {
81
+ if (imagesData && !(key in imagesData) && key in images) {
82
+ delete images[key];
83
+ imagesDirty = true;
84
+ }
85
+ }
86
+ }
87
+ var changedKeys = [];
88
+ for (var _key in imagesData) {
89
+ if (!oldImagesData || oldImagesData && !(_key in oldImagesData)) {
90
+ changedKeys.push(_key);
91
+ continue;
92
+ }
93
+ if (!isEqual(imagesData[_key], oldImagesData[_key])) {
94
+ changedKeys.push(_key);
95
+ }
96
+ }
97
+ for (var _i = 0, _changedKeys = changedKeys; _i < _changedKeys.length; _i++) {
98
+ var _key2 = _changedKeys[_i];
99
+ var imageData = imagesData[_key2];
100
+ if (!imageData) {
101
+ continue;
102
+ }
103
+ var loadedItem = loadImageItem(gl, device, imageData);
104
+ if (loadedItem) {
105
+ images[_key2] = loadedItem;
106
+ // Only mark dirty when the texture was actually uploaded.
107
+ imagesDirty = true;
108
+ } else {
109
+ // Upload failed (device not ready or createTexture threw). Signal that
110
+ // the caller should retry next frame — do NOT set imagesDirty so we
111
+ // don't propagate an images object with a missing key that causes
112
+ // draw() to bail permanently.
113
+ hasPendingUploads = true;
114
+ }
115
+ }
116
+ return {
117
+ images: imagesDirty ? images : null,
118
+ hasPendingUploads: hasPendingUploads
119
+ };
120
+ }
121
+
122
+ /**
123
+ * Map old GL texture parameter constants to luma.gl 9 sampler parameters
124
+ */
125
+ function mapSamplerParameters(oldParams) {
126
+ var result = _objectSpread({}, DEFAULT_SAMPLER_PARAMETERS);
127
+ var magFilterMap = _defineProperty(_defineProperty({}, GL.NEAREST, FILTER_MODE.NEAREST), GL.LINEAR, FILTER_MODE.LINEAR);
128
+ var minFilterMap = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, GL.NEAREST, {
129
+ minFilter: FILTER_MODE.NEAREST
130
+ }), GL.LINEAR, {
131
+ minFilter: FILTER_MODE.LINEAR
132
+ }), GL.NEAREST_MIPMAP_NEAREST, {
133
+ minFilter: FILTER_MODE.NEAREST,
134
+ mipmapFilter: FILTER_MODE.NEAREST
135
+ }), GL.NEAREST_MIPMAP_LINEAR, {
136
+ minFilter: FILTER_MODE.NEAREST,
137
+ mipmapFilter: FILTER_MODE.LINEAR
138
+ }), GL.LINEAR_MIPMAP_NEAREST, {
139
+ minFilter: FILTER_MODE.LINEAR,
140
+ mipmapFilter: FILTER_MODE.NEAREST
141
+ }), GL.LINEAR_MIPMAP_LINEAR, {
142
+ minFilter: FILTER_MODE.LINEAR,
143
+ mipmapFilter: FILTER_MODE.LINEAR
144
+ });
145
+ var wrapMap = _defineProperty(_defineProperty(_defineProperty({}, GL.CLAMP_TO_EDGE, ADDRESS_MODE.CLAMP_TO_EDGE), GL.REPEAT, ADDRESS_MODE.REPEAT), GL.MIRRORED_REPEAT, ADDRESS_MODE.MIRROR_REPEAT);
146
+ if (oldParams) {
147
+ if (oldParams[GL.TEXTURE_MIN_FILTER] !== undefined) {
148
+ var mapped = minFilterMap[oldParams[GL.TEXTURE_MIN_FILTER]];
149
+ if (mapped) {
150
+ result.minFilter = mapped.minFilter;
151
+ if (mapped.mipmapFilter) {
152
+ result.mipmapFilter = mapped.mipmapFilter;
153
+ }
154
+ }
155
+ }
156
+ if (oldParams[GL.TEXTURE_MAG_FILTER] !== undefined) {
157
+ result.magFilter = magFilterMap[oldParams[GL.TEXTURE_MAG_FILTER]] || FILTER_MODE.NEAREST;
158
+ }
159
+ if (oldParams[GL.TEXTURE_WRAP_S] !== undefined) {
160
+ result.addressModeU = wrapMap[oldParams[GL.TEXTURE_WRAP_S]] || ADDRESS_MODE.CLAMP_TO_EDGE;
161
+ }
162
+ if (oldParams[GL.TEXTURE_WRAP_T] !== undefined) {
163
+ result.addressModeV = wrapMap[oldParams[GL.TEXTURE_WRAP_T]] || ADDRESS_MODE.CLAMP_TO_EDGE;
164
+ }
165
+ }
166
+ return result;
167
+ }
168
+
169
+ /**
170
+ * Map old GL format/type to luma.gl 9 texture format string
171
+ */
172
+ function mapTextureFormat(glFormat, _glType) {
173
+ switch (glFormat) {
174
+ case GL.R8UI:
175
+ return TEXTURE_FORMAT.R8_UINT;
176
+ case GL.R16UI:
177
+ return TEXTURE_FORMAT.R16_UINT;
178
+ case GL.R32UI:
179
+ return TEXTURE_FORMAT.R32_UINT;
180
+ case GL.R8I:
181
+ return TEXTURE_FORMAT.R8_SINT;
182
+ case GL.R16I:
183
+ return TEXTURE_FORMAT.R16_SINT;
184
+ case GL.R32I:
185
+ return TEXTURE_FORMAT.R32_SINT;
186
+ case GL.R32F:
187
+ return TEXTURE_FORMAT.R32_FLOAT;
188
+ case GL.RGBA:
189
+ return TEXTURE_FORMAT.RGBA8_UNORM;
190
+ case GL.RGB:
191
+ return TEXTURE_FORMAT.RGBA8_UNORM;
192
+ default:
193
+ return TEXTURE_FORMAT.RGBA8_UNORM;
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Expand 3-byte-per-pixel RGB data to 4-byte-per-pixel RGBA.
199
+ * Needed because WebGPU/luma.gl 9 has no 3-channel texture format.
200
+ */
201
+ function expandRGBtoRGBA(data, width, height) {
202
+ var pixelCount = width * height;
203
+ var rgba = new Uint8Array(pixelCount * 4);
204
+ for (var i = 0; i < pixelCount; i++) {
205
+ rgba[i * 4] = data[i * 3];
206
+ rgba[i * 4 + 1] = data[i * 3 + 1];
207
+ rgba[i * 4 + 2] = data[i * 3 + 2];
208
+ rgba[i * 4 + 3] = 255;
209
+ }
210
+ return rgba;
211
+ }
212
+
213
+ /**
214
+ * Create texture object from image data using luma.gl 9 device API.
215
+ * Returns a proper luma.gl Texture object that works with the binding system.
216
+ */
217
+ function loadTexture(gl, device, imageData) {
218
+ var _rasterTextureData$id, _rasterTextureData$id2, _gl$luma;
219
+ if (!imageData) {
220
+ return null;
221
+ }
222
+
223
+ // If already a luma.gl Texture instance, return as-is
224
+ var rasterTextureData = imageData;
225
+ if (rasterTextureData.handle || (_rasterTextureData$id = rasterTextureData.id) !== null && _rasterTextureData$id !== void 0 && (_rasterTextureData$id2 = _rasterTextureData$id.startsWith) !== null && _rasterTextureData$id2 !== void 0 && _rasterTextureData$id2.call(_rasterTextureData$id, 'luma') || rasterTextureData.device) {
226
+ return imageData;
227
+ }
228
+ var rawData = imageData;
229
+
230
+ // @ts-expect-error luma internal properties not in WebGL2RenderingContext type
231
+ var lumaDevice = device || ((_gl$luma = gl.luma) === null || _gl$luma === void 0 ? void 0 : _gl$luma.device) || gl.__luma_device;
232
+ if (!(lumaDevice !== null && lumaDevice !== void 0 && lumaDevice.createTexture)) {
233
+ console.warn('RasterLayer: No luma.gl device available for texture creation');
234
+ return null;
235
+ }
236
+ try {
237
+ var _rawData$data, _rawData$data2;
238
+ var samplerParams = mapSamplerParameters(rawData.parameters || {});
239
+ var textureFormat = rawData.format ? mapTextureFormat(rawData.format, rawData.type) : TEXTURE_FORMAT.RGBA8_UNORM;
240
+ var width = rawData.width || ((_rawData$data = rawData.data) === null || _rawData$data === void 0 ? void 0 : _rawData$data.width) || 1;
241
+ var height = rawData.height || ((_rawData$data2 = rawData.data) === null || _rawData$data2 === void 0 ? void 0 : _rawData$data2.height) || 1;
242
+ var textureProps = _objectSpread({
243
+ width: width,
244
+ height: height,
245
+ format: textureFormat,
246
+ sampler: samplerParams
247
+ }, rawData.mipmaps === false ? {
248
+ mipmaps: false
249
+ } : {});
250
+ if (rawData.data) {
251
+ if (rawData.data instanceof HTMLImageElement || rawData.data instanceof HTMLCanvasElement || rawData.data instanceof ImageBitmap || rawData.data instanceof ImageData) {
252
+ textureProps.data = rawData.data;
253
+ } else if (ArrayBuffer.isView(rawData.data)) {
254
+ if (rawData.format === GL.RGB && (rawData.data instanceof Uint8Array || rawData.data instanceof Uint8ClampedArray)) {
255
+ textureProps.data = expandRGBtoRGBA(rawData.data, width, height);
256
+ } else {
257
+ textureProps.data = rawData.data;
258
+ }
259
+ }
260
+ }
261
+ return lumaDevice.createTexture(textureProps);
262
+ } catch (e) {
263
+ console.warn('RasterLayer: Failed to create texture via device.createTexture:', e);
264
+ return null;
265
+ }
266
+ }
267
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJHTCIsImlzRXF1YWwiLCJGSUxURVJfTU9ERSIsIkFERFJFU1NfTU9ERSIsIlRFWFRVUkVfRk9STUFUIiwiREVGQVVMVF9TQU1QTEVSX1BBUkFNRVRFUlMiLCJtaW5GaWx0ZXIiLCJORUFSRVNUIiwibWFnRmlsdGVyIiwiYWRkcmVzc01vZGVVIiwiQ0xBTVBfVE9fRURHRSIsImFkZHJlc3NNb2RlViIsImxvYWRJbWFnZUl0ZW0iLCJnbCIsImRldmljZSIsImltYWdlSXRlbSIsInJlc3VsdCIsIkFycmF5IiwiaXNBcnJheSIsImRpcnR5UmVzdWx0IiwibWFwIiwieCIsImxvYWRUZXh0dXJlIiwiX2l0ZXJhdG9yIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJfc3RlcCIsInMiLCJuIiwiZG9uZSIsInRleHR1cmUiLCJ2YWx1ZSIsInB1c2giLCJlcnIiLCJlIiwiZiIsImxlbmd0aCIsImxvYWRJbWFnZXMiLCJfcmVmIiwiaW1hZ2VzIiwiaW1hZ2VzRGF0YSIsIm9sZEltYWdlc0RhdGEiLCJpbWFnZXNEaXJ0eSIsImhhc1BlbmRpbmdVcGxvYWRzIiwia2V5IiwiY2hhbmdlZEtleXMiLCJfaSIsIl9jaGFuZ2VkS2V5cyIsImltYWdlRGF0YSIsImxvYWRlZEl0ZW0iLCJtYXBTYW1wbGVyUGFyYW1ldGVycyIsIm9sZFBhcmFtcyIsIl9vYmplY3RTcHJlYWQiLCJtYWdGaWx0ZXJNYXAiLCJfZGVmaW5lUHJvcGVydHkiLCJMSU5FQVIiLCJtaW5GaWx0ZXJNYXAiLCJORUFSRVNUX01JUE1BUF9ORUFSRVNUIiwibWlwbWFwRmlsdGVyIiwiTkVBUkVTVF9NSVBNQVBfTElORUFSIiwiTElORUFSX01JUE1BUF9ORUFSRVNUIiwiTElORUFSX01JUE1BUF9MSU5FQVIiLCJ3cmFwTWFwIiwiUkVQRUFUIiwiTUlSUk9SRURfUkVQRUFUIiwiTUlSUk9SX1JFUEVBVCIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsInVuZGVmaW5lZCIsIm1hcHBlZCIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsIlRFWFRVUkVfV1JBUF9TIiwiVEVYVFVSRV9XUkFQX1QiLCJtYXBUZXh0dXJlRm9ybWF0IiwiZ2xGb3JtYXQiLCJfZ2xUeXBlIiwiUjhVSSIsIlI4X1VJTlQiLCJSMTZVSSIsIlIxNl9VSU5UIiwiUjMyVUkiLCJSMzJfVUlOVCIsIlI4SSIsIlI4X1NJTlQiLCJSMTZJIiwiUjE2X1NJTlQiLCJSMzJJIiwiUjMyX1NJTlQiLCJSMzJGIiwiUjMyX0ZMT0FUIiwiUkdCQSIsIlJHQkE4X1VOT1JNIiwiUkdCIiwiZXhwYW5kUkdCdG9SR0JBIiwiZGF0YSIsIndpZHRoIiwiaGVpZ2h0IiwicGl4ZWxDb3VudCIsInJnYmEiLCJVaW50OEFycmF5IiwiaSIsIl9yYXN0ZXJUZXh0dXJlRGF0YSRpZCIsIl9yYXN0ZXJUZXh0dXJlRGF0YSRpZDIiLCJfZ2wkbHVtYSIsInJhc3RlclRleHR1cmVEYXRhIiwiaGFuZGxlIiwiaWQiLCJzdGFydHNXaXRoIiwiY2FsbCIsInJhd0RhdGEiLCJsdW1hRGV2aWNlIiwibHVtYSIsIl9fbHVtYV9kZXZpY2UiLCJjcmVhdGVUZXh0dXJlIiwiY29uc29sZSIsIndhcm4iLCJfcmF3RGF0YSRkYXRhIiwiX3Jhd0RhdGEkZGF0YTIiLCJzYW1wbGVyUGFyYW1zIiwicGFyYW1ldGVycyIsInRleHR1cmVGb3JtYXQiLCJmb3JtYXQiLCJ0eXBlIiwidGV4dHVyZVByb3BzIiwic2FtcGxlciIsIm1pcG1hcHMiLCJIVE1MSW1hZ2VFbGVtZW50IiwiSFRNTENhbnZhc0VsZW1lbnQiLCJJbWFnZUJpdG1hcCIsIkltYWdlRGF0YSIsIkFycmF5QnVmZmVyIiwiaXNWaWV3IiwiVWludDhDbGFtcGVkQXJyYXkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmFzdGVyL2ltYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBAdHMtaWdub3JlIEdMIHJlc29sdXRpb24gZGVwZW5kcyBvbiBtb2R1bGVSZXNvbHV0aW9uIHNldHRpbmdcbmltcG9ydCB7R0x9IGZyb20gJ0BsdW1hLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gvaXNFcXVhbCc7XG5cbmltcG9ydCB7RklMVEVSX01PREUsIEFERFJFU1NfTU9ERSwgVEVYVFVSRV9GT1JNQVR9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHtUZXh0dXJlfSBmcm9tICdAbHVtYS5nbC9jb3JlJztcbmltcG9ydCB0eXBlIHtJbWFnZUlucHV0LCBJbWFnZVN0YXRlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBMZWdhY3kgdGV4dHVyZSBjcmVhdGlvbiBkZXNjcmlwdG9yIHVzZWQgYnkgcmFzdGVyIHNoYWRlciBtb2R1bGVzLlxuICogQ29udGFpbnMgQ1BVLXNpZGUgZGF0YSArIG9sZCBHTC1lbnVtLWJhc2VkIHBhcmFtZXRlcnMgdGhhdCBnZXRcbiAqIHRyYW5zbGF0ZWQgdG8gbHVtYS5nbCA5J3MgZGV2aWNlLmNyZWF0ZVRleHR1cmUoKSBwcm9wcy5cbiAqL1xudHlwZSBUZXh0dXJlRGF0YVNvdXJjZSA9XG4gIHwgSFRNTEltYWdlRWxlbWVudFxuICB8IEhUTUxDYW52YXNFbGVtZW50XG4gIHwgSW1hZ2VCaXRtYXBcbiAgfCBJbWFnZURhdGFcbiAgfCBBcnJheUJ1ZmZlclZpZXc7XG5cbnR5cGUgUmFzdGVyVGV4dHVyZURhdGEgPSB7XG4gIGhhbmRsZT86IHVua25vd247XG4gIGlkPzogc3RyaW5nO1xuICBkZXZpY2U/OiB1bmtub3duO1xuICB3aWR0aD86IG51bWJlcjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xuICBmb3JtYXQ/OiBudW1iZXI7XG4gIHR5cGU/OiBudW1iZXI7XG4gIHBhcmFtZXRlcnM/OiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+O1xuICBtaXBtYXBzPzogYm9vbGVhbjtcbiAgZGF0YT86IFRleHR1cmVEYXRhU291cmNlICYge3dpZHRoPzogbnVtYmVyOyBoZWlnaHQ/OiBudW1iZXJ9O1xufTtcblxuLyoqXG4gKiBUZXh0dXJlIHNhbXBsZXIgcGFyYW1ldGVycyBmb3IgbHVtYS5nbCA5IHRleHR1cmVzXG4gKi9cbmNvbnN0IERFRkFVTFRfU0FNUExFUl9QQVJBTUVURVJTID0ge1xuICBtaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1QsXG4gIG1hZ0ZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVCxcbiAgYWRkcmVzc01vZGVVOiBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRSxcbiAgYWRkcmVzc01vZGVWOiBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRVxufTtcblxuLyoqIGx1bWEuZ2wgZGV2aWNlIGludGVyZmFjZSBmb3IgdGV4dHVyZSBjcmVhdGlvbiAqL1xuaW50ZXJmYWNlIEx1bWFEZXZpY2Uge1xuICBjcmVhdGVUZXh0dXJlKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFRleHR1cmU7XG4gIGdsPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbn1cblxudHlwZSBMb2FkSW1hZ2VzT3B0aW9ucyA9IHtcbiAgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gIGRldmljZT86IEx1bWFEZXZpY2U7XG4gIGltYWdlczogSW1hZ2VTdGF0ZTtcbiAgaW1hZ2VzRGF0YTogSW1hZ2VJbnB1dDtcbiAgb2xkSW1hZ2VzRGF0YTogSW1hZ2VJbnB1dDtcbn07XG5cbi8qKlxuICogTG9hZCBpbWFnZSBpdGVtcyB0byB3ZWJnbCBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGxvYWRJbWFnZUl0ZW0oXG4gIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LFxuICBkZXZpY2U6IEx1bWFEZXZpY2UgfCB1bmRlZmluZWQsXG4gIGltYWdlSXRlbTogUmFzdGVyVGV4dHVyZURhdGEgfCBUZXh0dXJlIHwgKFJhc3RlclRleHR1cmVEYXRhIHwgVGV4dHVyZSlbXVxuKTogbnVsbCB8IFRleHR1cmUgfCBUZXh0dXJlW10ge1xuICBsZXQgcmVzdWx0OiBudWxsIHwgVGV4dHVyZSB8IFRleHR1cmVbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW1hZ2VJdGVtKSkge1xuICAgIGNvbnN0IGRpcnR5UmVzdWx0ID0gaW1hZ2VJdGVtLm1hcCh4ID0+IGxvYWRUZXh0dXJlKGdsLCBkZXZpY2UsIHgpKTtcbiAgICByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRleHR1cmUgb2YgZGlydHlSZXN1bHQpIHtcbiAgICAgIGlmICh0ZXh0dXJlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRleHR1cmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGxvYWRUZXh0dXJlKGdsLCBkZXZpY2UsIGltYWdlSXRlbSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBMb2FkIGltYWdlIGl0ZW1zIHRvIHdlYmdsIGNvbnRleHRcbiAqL1xudHlwZSBMb2FkSW1hZ2VzUmVzdWx0ID0ge1xuICAvKiogVXBkYXRlZCBpbWFnZXMgc3RhdGUsIG9yIG51bGwgaWYgbm90aGluZyBjaGFuZ2VkICovXG4gIGltYWdlczogSW1hZ2VTdGF0ZSB8IG51bGw7XG4gIC8qKiBUcnVlIHdoZW4gYXQgbGVhc3Qgb25lIHRleHR1cmUgdXBsb2FkIGZhaWxlZCBhbmQgc2hvdWxkIGJlIHJldHJpZWQgKi9cbiAgaGFzUGVuZGluZ1VwbG9hZHM6IGJvb2xlYW47XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRJbWFnZXMoe1xuICBnbCxcbiAgZGV2aWNlLFxuICBpbWFnZXMsXG4gIGltYWdlc0RhdGEsXG4gIG9sZEltYWdlc0RhdGFcbn06IExvYWRJbWFnZXNPcHRpb25zKTogTG9hZEltYWdlc1Jlc3VsdCB7XG4gIGxldCBpbWFnZXNEaXJ0eSA9IGZhbHNlO1xuICBsZXQgaGFzUGVuZGluZ1VwbG9hZHMgPSBmYWxzZTtcblxuICBpZiAob2xkSW1hZ2VzRGF0YSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9sZEltYWdlc0RhdGEpIHtcbiAgICAgIGlmIChpbWFnZXNEYXRhICYmICEoa2V5IGluIGltYWdlc0RhdGEpICYmIGtleSBpbiBpbWFnZXMpIHtcbiAgICAgICAgZGVsZXRlIGltYWdlc1trZXldO1xuICAgICAgICBpbWFnZXNEaXJ0eSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2hhbmdlZEtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IGluIGltYWdlc0RhdGEpIHtcbiAgICBpZiAoIW9sZEltYWdlc0RhdGEgfHwgKG9sZEltYWdlc0RhdGEgJiYgIShrZXkgaW4gb2xkSW1hZ2VzRGF0YSkpKSB7XG4gICAgICBjaGFuZ2VkS2V5cy5wdXNoKGtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRXF1YWwoaW1hZ2VzRGF0YVtrZXldLCBvbGRJbWFnZXNEYXRhW2tleV0pKSB7XG4gICAgICBjaGFuZ2VkS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgY2hhbmdlZEtleXMpIHtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZXNEYXRhW2tleV07XG4gICAgaWYgKCFpbWFnZURhdGEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZEl0ZW0gPSBsb2FkSW1hZ2VJdGVtKGdsLCBkZXZpY2UsIGltYWdlRGF0YSk7XG4gICAgaWYgKGxvYWRlZEl0ZW0pIHtcbiAgICAgIGltYWdlc1trZXldID0gbG9hZGVkSXRlbTtcbiAgICAgIC8vIE9ubHkgbWFyayBkaXJ0eSB3aGVuIHRoZSB0ZXh0dXJlIHdhcyBhY3R1YWxseSB1cGxvYWRlZC5cbiAgICAgIGltYWdlc0RpcnR5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBsb2FkIGZhaWxlZCAoZGV2aWNlIG5vdCByZWFkeSBvciBjcmVhdGVUZXh0dXJlIHRocmV3KS4gU2lnbmFsIHRoYXRcbiAgICAgIC8vIHRoZSBjYWxsZXIgc2hvdWxkIHJldHJ5IG5leHQgZnJhbWUg4oCUIGRvIE5PVCBzZXQgaW1hZ2VzRGlydHkgc28gd2VcbiAgICAgIC8vIGRvbid0IHByb3BhZ2F0ZSBhbiBpbWFnZXMgb2JqZWN0IHdpdGggYSBtaXNzaW5nIGtleSB0aGF0IGNhdXNlc1xuICAgICAgLy8gZHJhdygpIHRvIGJhaWwgcGVybWFuZW50bHkuXG4gICAgICBoYXNQZW5kaW5nVXBsb2FkcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtpbWFnZXM6IGltYWdlc0RpcnR5ID8gaW1hZ2VzIDogbnVsbCwgaGFzUGVuZGluZ1VwbG9hZHN9O1xufVxuXG4vKipcbiAqIE1hcCBvbGQgR0wgdGV4dHVyZSBwYXJhbWV0ZXIgY29uc3RhbnRzIHRvIGx1bWEuZ2wgOSBzYW1wbGVyIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gbWFwU2FtcGxlclBhcmFtZXRlcnMob2xkUGFyYW1zOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsuLi5ERUZBVUxUX1NBTVBMRVJfUEFSQU1FVEVSU307XG5cbiAgY29uc3QgbWFnRmlsdGVyTWFwID0ge1xuICAgIFtHTC5ORUFSRVNUXTogRklMVEVSX01PREUuTkVBUkVTVCxcbiAgICBbR0wuTElORUFSXTogRklMVEVSX01PREUuTElORUFSXG4gIH07XG5cbiAgY29uc3QgbWluRmlsdGVyTWFwOiBSZWNvcmQ8bnVtYmVyLCB7bWluRmlsdGVyOiBzdHJpbmc7IG1pcG1hcEZpbHRlcj86IHN0cmluZ30+ID0ge1xuICAgIFtHTC5ORUFSRVNUXToge21pbkZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVH0sXG4gICAgW0dMLkxJTkVBUl06IHttaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUn0sXG4gICAgW0dMLk5FQVJFU1RfTUlQTUFQX05FQVJFU1RdOiB7XG4gICAgICBtaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1QsXG4gICAgICBtaXBtYXBGaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1RcbiAgICB9LFxuICAgIFtHTC5ORUFSRVNUX01JUE1BUF9MSU5FQVJdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNULCBtaXBtYXBGaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUn0sXG4gICAgW0dMLkxJTkVBUl9NSVBNQVBfTkVBUkVTVF06IHttaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUiwgbWlwbWFwRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNUfSxcbiAgICBbR0wuTElORUFSX01JUE1BUF9MSU5FQVJdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5MSU5FQVIsIG1pcG1hcEZpbHRlcjogRklMVEVSX01PREUuTElORUFSfVxuICB9O1xuXG4gIGNvbnN0IHdyYXBNYXAgPSB7XG4gICAgW0dMLkNMQU1QX1RPX0VER0VdOiBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRSxcbiAgICBbR0wuUkVQRUFUXTogQUREUkVTU19NT0RFLlJFUEVBVCxcbiAgICBbR0wuTUlSUk9SRURfUkVQRUFUXTogQUREUkVTU19NT0RFLk1JUlJPUl9SRVBFQVRcbiAgfTtcblxuICBpZiAob2xkUGFyYW1zKSB7XG4gICAgaWYgKG9sZFBhcmFtc1tHTC5URVhUVVJFX01JTl9GSUxURVJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG1hcHBlZCA9IG1pbkZpbHRlck1hcFtvbGRQYXJhbXNbR0wuVEVYVFVSRV9NSU5fRklMVEVSXV07XG4gICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgIHJlc3VsdC5taW5GaWx0ZXIgPSBtYXBwZWQubWluRmlsdGVyO1xuICAgICAgICBpZiAobWFwcGVkLm1pcG1hcEZpbHRlcikge1xuICAgICAgICAgIHJlc3VsdC5taXBtYXBGaWx0ZXIgPSBtYXBwZWQubWlwbWFwRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbGRQYXJhbXNbR0wuVEVYVFVSRV9NQUdfRklMVEVSXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQubWFnRmlsdGVyID0gbWFnRmlsdGVyTWFwW29sZFBhcmFtc1tHTC5URVhUVVJFX01BR19GSUxURVJdXSB8fCBGSUxURVJfTU9ERS5ORUFSRVNUO1xuICAgIH1cbiAgICBpZiAob2xkUGFyYW1zW0dMLlRFWFRVUkVfV1JBUF9TXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQuYWRkcmVzc01vZGVVID0gd3JhcE1hcFtvbGRQYXJhbXNbR0wuVEVYVFVSRV9XUkFQX1NdXSB8fCBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRTtcbiAgICB9XG4gICAgaWYgKG9sZFBhcmFtc1tHTC5URVhUVVJFX1dSQVBfVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmFkZHJlc3NNb2RlViA9IHdyYXBNYXBbb2xkUGFyYW1zW0dMLlRFWFRVUkVfV1JBUF9UXV0gfHwgQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBNYXAgb2xkIEdMIGZvcm1hdC90eXBlIHRvIGx1bWEuZ2wgOSB0ZXh0dXJlIGZvcm1hdCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gbWFwVGV4dHVyZUZvcm1hdChnbEZvcm1hdDogbnVtYmVyLCBfZ2xUeXBlPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgc3dpdGNoIChnbEZvcm1hdCkge1xuICAgIGNhc2UgR0wuUjhVSTpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SOF9VSU5UO1xuICAgIGNhc2UgR0wuUjE2VUk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjE2X1VJTlQ7XG4gICAgY2FzZSBHTC5SMzJVSTpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SMzJfVUlOVDtcbiAgICBjYXNlIEdMLlI4STpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SOF9TSU5UO1xuICAgIGNhc2UgR0wuUjE2STpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SMTZfU0lOVDtcbiAgICBjYXNlIEdMLlIzMkk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjMyX1NJTlQ7XG4gICAgY2FzZSBHTC5SMzJGOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlIzMl9GTE9BVDtcbiAgICBjYXNlIEdMLlJHQkE6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG4gICAgY2FzZSBHTC5SR0I6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SR0JBOF9VTk9STTtcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZCAzLWJ5dGUtcGVyLXBpeGVsIFJHQiBkYXRhIHRvIDQtYnl0ZS1wZXItcGl4ZWwgUkdCQS5cbiAqIE5lZWRlZCBiZWNhdXNlIFdlYkdQVS9sdW1hLmdsIDkgaGFzIG5vIDMtY2hhbm5lbCB0ZXh0dXJlIGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gZXhwYW5kUkdCdG9SR0JBKFxuICBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXksXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyXG4pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgcGl4ZWxDb3VudCA9IHdpZHRoICogaGVpZ2h0O1xuICBjb25zdCByZ2JhID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxDb3VudCAqIDQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBpeGVsQ291bnQ7IGkrKykge1xuICAgIHJnYmFbaSAqIDRdID0gZGF0YVtpICogM107XG4gICAgcmdiYVtpICogNCArIDFdID0gZGF0YVtpICogMyArIDFdO1xuICAgIHJnYmFbaSAqIDQgKyAyXSA9IGRhdGFbaSAqIDMgKyAyXTtcbiAgICByZ2JhW2kgKiA0ICsgM10gPSAyNTU7XG4gIH1cbiAgcmV0dXJuIHJnYmE7XG59XG5cbi8qKlxuICogQ3JlYXRlIHRleHR1cmUgb2JqZWN0IGZyb20gaW1hZ2UgZGF0YSB1c2luZyBsdW1hLmdsIDkgZGV2aWNlIEFQSS5cbiAqIFJldHVybnMgYSBwcm9wZXIgbHVtYS5nbCBUZXh0dXJlIG9iamVjdCB0aGF0IHdvcmtzIHdpdGggdGhlIGJpbmRpbmcgc3lzdGVtLlxuICovXG5mdW5jdGlvbiBsb2FkVGV4dHVyZShcbiAgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsXG4gIGRldmljZTogTHVtYURldmljZSB8IHVuZGVmaW5lZCxcbiAgaW1hZ2VEYXRhOiBUZXh0dXJlIHwgUmFzdGVyVGV4dHVyZURhdGFcbik6IFRleHR1cmUgfCBudWxsIHtcbiAgaWYgKCFpbWFnZURhdGEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIElmIGFscmVhZHkgYSBsdW1hLmdsIFRleHR1cmUgaW5zdGFuY2UsIHJldHVybiBhcy1pc1xuICBjb25zdCByYXN0ZXJUZXh0dXJlRGF0YSA9IGltYWdlRGF0YSBhcyBSYXN0ZXJUZXh0dXJlRGF0YTtcbiAgaWYgKFxuICAgIHJhc3RlclRleHR1cmVEYXRhLmhhbmRsZSB8fFxuICAgIHJhc3RlclRleHR1cmVEYXRhLmlkPy5zdGFydHNXaXRoPy4oJ2x1bWEnKSB8fFxuICAgIHJhc3RlclRleHR1cmVEYXRhLmRldmljZVxuICApIHtcbiAgICByZXR1cm4gaW1hZ2VEYXRhIGFzIFRleHR1cmU7XG4gIH1cblxuICBjb25zdCByYXdEYXRhID0gaW1hZ2VEYXRhIGFzIFJhc3RlclRleHR1cmVEYXRhO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbHVtYSBpbnRlcm5hbCBwcm9wZXJ0aWVzIG5vdCBpbiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0IHR5cGVcbiAgY29uc3QgbHVtYURldmljZSA9IGRldmljZSB8fCBnbC5sdW1hPy5kZXZpY2UgfHwgZ2wuX19sdW1hX2RldmljZTtcblxuICBpZiAoIWx1bWFEZXZpY2U/LmNyZWF0ZVRleHR1cmUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1Jhc3RlckxheWVyOiBObyBsdW1hLmdsIGRldmljZSBhdmFpbGFibGUgZm9yIHRleHR1cmUgY3JlYXRpb24nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2FtcGxlclBhcmFtcyA9IG1hcFNhbXBsZXJQYXJhbWV0ZXJzKHJhd0RhdGEucGFyYW1ldGVycyB8fCB7fSk7XG4gICAgY29uc3QgdGV4dHVyZUZvcm1hdCA9IHJhd0RhdGEuZm9ybWF0XG4gICAgICA/IG1hcFRleHR1cmVGb3JtYXQocmF3RGF0YS5mb3JtYXQsIHJhd0RhdGEudHlwZSlcbiAgICAgIDogVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG5cbiAgICBjb25zdCB3aWR0aCA9IHJhd0RhdGEud2lkdGggfHwgcmF3RGF0YS5kYXRhPy53aWR0aCB8fCAxO1xuICAgIGNvbnN0IGhlaWdodCA9IHJhd0RhdGEuaGVpZ2h0IHx8IHJhd0RhdGEuZGF0YT8uaGVpZ2h0IHx8IDE7XG5cbiAgICBjb25zdCB0ZXh0dXJlUHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBmb3JtYXQ6IHRleHR1cmVGb3JtYXQsXG4gICAgICBzYW1wbGVyOiBzYW1wbGVyUGFyYW1zLFxuICAgICAgLi4uKHJhd0RhdGEubWlwbWFwcyA9PT0gZmFsc2UgPyB7bWlwbWFwczogZmFsc2V9IDoge30pXG4gICAgfTtcblxuICAgIGlmIChyYXdEYXRhLmRhdGEpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fFxuICAgICAgICByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fFxuICAgICAgICByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCB8fFxuICAgICAgICByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBJbWFnZURhdGFcbiAgICAgICkge1xuICAgICAgICB0ZXh0dXJlUHJvcHMuZGF0YSA9IHJhd0RhdGEuZGF0YTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHJhd0RhdGEuZGF0YSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJhd0RhdGEuZm9ybWF0ID09PSBHTC5SR0IgJiZcbiAgICAgICAgICAocmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGV4dHVyZVByb3BzLmRhdGEgPSBleHBhbmRSR0J0b1JHQkEocmF3RGF0YS5kYXRhLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0dXJlUHJvcHMuZGF0YSA9IHJhd0RhdGEuZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsdW1hRGV2aWNlLmNyZWF0ZVRleHR1cmUodGV4dHVyZVByb3BzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybignUmFzdGVyTGF5ZXI6IEZhaWxlZCB0byBjcmVhdGUgdGV4dHVyZSB2aWEgZGV2aWNlLmNyZWF0ZVRleHR1cmU6JywgZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7QUFFQTtBQUNBLFNBQVFBLEVBQUUsUUFBTyxvQkFBb0I7QUFDckMsT0FBT0MsT0FBTyxNQUFNLGdCQUFnQjtBQUVwQyxTQUFRQyxXQUFXLEVBQUVDLFlBQVksRUFBRUMsY0FBYyxRQUFPLHNCQUFzQjs7QUFJOUU7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
@@ -0,0 +1,94 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Copyright contributors to the kepler.gl project
3
+
4
+ /**
5
+ * Patch luma.gl 9's pipeline validation to tolerate mixed-sampler-type
6
+ * validation errors in _getLinkStatus().
7
+ *
8
+ * WebGL2's validateProgram checks that sampler uniforms of different types
9
+ * (sampler2D, usampler2D, isampler2D) are not assigned to the same texture
10
+ * unit. Programs that mix sampler types (e.g. raster band data as usampler2D +
11
+ * shadow maps as sampler2D) may fail validation even though they linked
12
+ * successfully and work correctly once texture units are assigned at draw time.
13
+ *
14
+ * In luma.gl ≥9.3 the _getLinkStatus method moved from WEBGLRenderPipeline to
15
+ * WEBGLSharedRenderPipeline and now calls _initializeSamplerUniforms() before
16
+ * validateProgram, which fixes most false positives. However, some WebGL
17
+ * drivers still report errors even with unique units, so we keep suppressing
18
+ * the known false-positive about mixed sampler types. We patch _getLinkStatus
19
+ * on whichever pipeline class owns it.
20
+ */
21
+
22
+ // @ts-ignore resolution depends on moduleResolution setting
23
+ import { WEBGLRenderPipeline, WebGLDevice } from '@luma.gl/webgl';
24
+ var MIXED_SAMPLER_RE = /different type[s]? use the same sampler location/i;
25
+ var _patched = false;
26
+ function createPatchedLinkStatus(_original) {
27
+ return function _patchedGetLinkStatus() {
28
+ var gl = this.device.gl;
29
+ var linked = gl.getProgramParameter(this.handle, 0x8b82 /* LINK_STATUS */);
30
+ if (!linked) {
31
+ this.linkStatus = 'error';
32
+ return 'link-error';
33
+ }
34
+
35
+ // luma.gl ≥9.3 assigns unique texture units to samplers before
36
+ // validation via _initializeSamplerUniforms. Call it here so that
37
+ // the sampler-to-unit mapping is populated through our patched path.
38
+ if (typeof this._initializeSamplerUniforms === 'function') {
39
+ this._initializeSamplerUniforms();
40
+ }
41
+ gl.validateProgram(this.handle);
42
+ var validated = gl.getProgramParameter(this.handle, 0x8b83 /* VALIDATE_STATUS */);
43
+ if (!validated) {
44
+ var infoLog = gl.getProgramInfoLog(this.handle) || '';
45
+ if (!MIXED_SAMPLER_RE.test(infoLog)) {
46
+ this.linkStatus = 'error';
47
+ return 'validation-error';
48
+ }
49
+ }
50
+ this.linkStatus = 'success';
51
+ return 'success';
52
+ };
53
+ }
54
+ export function patchPipelineValidation() {
55
+ if (_patched) return;
56
+ _patched = true;
57
+
58
+ // Strategy 1: luma.gl <9.3 — _getLinkStatus on WEBGLRenderPipeline
59
+ if (WEBGLRenderPipeline !== null && WEBGLRenderPipeline !== void 0 && WEBGLRenderPipeline.prototype && typeof WEBGLRenderPipeline.prototype._getLinkStatus === 'function') {
60
+ var original = WEBGLRenderPipeline.prototype._getLinkStatus;
61
+ WEBGLRenderPipeline.prototype._getLinkStatus = createPatchedLinkStatus(original);
62
+ return;
63
+ }
64
+
65
+ // Strategy 2: luma.gl ≥9.3 — _getLinkStatus moved to WEBGLSharedRenderPipeline.
66
+ // That class is not publicly exported, so we hook the factory on WebGLDevice
67
+ // that creates shared pipelines. The first invocation discovers the class,
68
+ // patches its prototype, then re-validates the instance.
69
+ var deviceProto = WebGLDevice === null || WebGLDevice === void 0 ? void 0 : WebGLDevice.prototype;
70
+ var origFactory = deviceProto === null || deviceProto === void 0 ? void 0 : deviceProto._createSharedRenderPipelineWebGL;
71
+ if (typeof origFactory !== 'function') return;
72
+ deviceProto._createSharedRenderPipelineWebGL = function () {
73
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
74
+ args[_key] = arguments[_key];
75
+ }
76
+ var instance = origFactory.apply(this, args);
77
+ var SharedCtor = Object.getPrototypeOf(instance).constructor;
78
+ if (SharedCtor && SharedCtor !== WEBGLRenderPipeline && typeof SharedCtor.prototype._getLinkStatus === 'function') {
79
+ var _original2 = SharedCtor.prototype._getLinkStatus;
80
+ SharedCtor.prototype._getLinkStatus = createPatchedLinkStatus(_original2);
81
+
82
+ // Re-validate this first instance since its _getLinkStatus already ran
83
+ // with the unpatched version during construction.
84
+ if (instance.linkStatus !== 'success') {
85
+ instance._getLinkStatus();
86
+ }
87
+ }
88
+
89
+ // Restore original factory — future instances will use the patched prototype
90
+ deviceProto._createSharedRenderPipelineWebGL = origFactory;
91
+ return instance;
92
+ };
93
+ }
94
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXRUJHTFJlbmRlclBpcGVsaW5lIiwiV2ViR0xEZXZpY2UiLCJNSVhFRF9TQU1QTEVSX1JFIiwiX3BhdGNoZWQiLCJjcmVhdGVQYXRjaGVkTGlua1N0YXR1cyIsIl9vcmlnaW5hbCIsIl9wYXRjaGVkR2V0TGlua1N0YXR1cyIsImdsIiwiZGV2aWNlIiwibGlua2VkIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsImhhbmRsZSIsImxpbmtTdGF0dXMiLCJfaW5pdGlhbGl6ZVNhbXBsZXJVbmlmb3JtcyIsInZhbGlkYXRlUHJvZ3JhbSIsInZhbGlkYXRlZCIsImluZm9Mb2ciLCJnZXRQcm9ncmFtSW5mb0xvZyIsInRlc3QiLCJwYXRjaFBpcGVsaW5lVmFsaWRhdGlvbiIsInByb3RvdHlwZSIsIl9nZXRMaW5rU3RhdHVzIiwib3JpZ2luYWwiLCJkZXZpY2VQcm90byIsIm9yaWdGYWN0b3J5IiwiX2NyZWF0ZVNoYXJlZFJlbmRlclBpcGVsaW5lV2ViR0wiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImluc3RhbmNlIiwiYXBwbHkiLCJTaGFyZWRDdG9yIiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJjb25zdHJ1Y3RvciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYXN0ZXIvcGlwZWxpbmUtdmFsaWRhdGlvbi1wYXRjaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vKipcbiAqIFBhdGNoIGx1bWEuZ2wgOSdzIHBpcGVsaW5lIHZhbGlkYXRpb24gdG8gdG9sZXJhdGUgbWl4ZWQtc2FtcGxlci10eXBlXG4gKiB2YWxpZGF0aW9uIGVycm9ycyBpbiBfZ2V0TGlua1N0YXR1cygpLlxuICpcbiAqIFdlYkdMMidzIHZhbGlkYXRlUHJvZ3JhbSBjaGVja3MgdGhhdCBzYW1wbGVyIHVuaWZvcm1zIG9mIGRpZmZlcmVudCB0eXBlc1xuICogKHNhbXBsZXIyRCwgdXNhbXBsZXIyRCwgaXNhbXBsZXIyRCkgYXJlIG5vdCBhc3NpZ25lZCB0byB0aGUgc2FtZSB0ZXh0dXJlXG4gKiB1bml0LiBQcm9ncmFtcyB0aGF0IG1peCBzYW1wbGVyIHR5cGVzIChlLmcuIHJhc3RlciBiYW5kIGRhdGEgYXMgdXNhbXBsZXIyRCArXG4gKiBzaGFkb3cgbWFwcyBhcyBzYW1wbGVyMkQpIG1heSBmYWlsIHZhbGlkYXRpb24gZXZlbiB0aG91Z2ggdGhleSBsaW5rZWRcbiAqIHN1Y2Nlc3NmdWxseSBhbmQgd29yayBjb3JyZWN0bHkgb25jZSB0ZXh0dXJlIHVuaXRzIGFyZSBhc3NpZ25lZCBhdCBkcmF3IHRpbWUuXG4gKlxuICogSW4gbHVtYS5nbCDiiaU5LjMgdGhlIF9nZXRMaW5rU3RhdHVzIG1ldGhvZCBtb3ZlZCBmcm9tIFdFQkdMUmVuZGVyUGlwZWxpbmUgdG9cbiAqIFdFQkdMU2hhcmVkUmVuZGVyUGlwZWxpbmUgYW5kIG5vdyBjYWxscyBfaW5pdGlhbGl6ZVNhbXBsZXJVbmlmb3JtcygpIGJlZm9yZVxuICogdmFsaWRhdGVQcm9ncmFtLCB3aGljaCBmaXhlcyBtb3N0IGZhbHNlIHBvc2l0aXZlcy4gSG93ZXZlciwgc29tZSBXZWJHTFxuICogZHJpdmVycyBzdGlsbCByZXBvcnQgZXJyb3JzIGV2ZW4gd2l0aCB1bmlxdWUgdW5pdHMsIHNvIHdlIGtlZXAgc3VwcHJlc3NpbmdcbiAqIHRoZSBrbm93biBmYWxzZS1wb3NpdGl2ZSBhYm91dCBtaXhlZCBzYW1wbGVyIHR5cGVzLiBXZSBwYXRjaCBfZ2V0TGlua1N0YXR1c1xuICogb24gd2hpY2hldmVyIHBpcGVsaW5lIGNsYXNzIG93bnMgaXQuXG4gKi9cblxuLy8gQHRzLWlnbm9yZSByZXNvbHV0aW9uIGRlcGVuZHMgb24gbW9kdWxlUmVzb2x1dGlvbiBzZXR0aW5nXG5pbXBvcnQge1dFQkdMUmVuZGVyUGlwZWxpbmUsIFdlYkdMRGV2aWNlfSBmcm9tICdAbHVtYS5nbC93ZWJnbCc7XG5cbmNvbnN0IE1JWEVEX1NBTVBMRVJfUkUgPSAvZGlmZmVyZW50IHR5cGVbc10/IHVzZSB0aGUgc2FtZSBzYW1wbGVyIGxvY2F0aW9uL2k7XG5cbmxldCBfcGF0Y2hlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjcmVhdGVQYXRjaGVkTGlua1N0YXR1cyhfb3JpZ2luYWw6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIF9wYXRjaGVkR2V0TGlua1N0YXR1cyh0aGlzOiBhbnkpIHtcbiAgICBjb25zdCB7Z2x9ID0gdGhpcy5kZXZpY2U7XG4gICAgY29uc3QgbGlua2VkID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLmhhbmRsZSwgMHg4YjgyIC8qIExJTktfU1RBVFVTICovKTtcbiAgICBpZiAoIWxpbmtlZCkge1xuICAgICAgdGhpcy5saW5rU3RhdHVzID0gJ2Vycm9yJztcbiAgICAgIHJldHVybiAnbGluay1lcnJvcic7XG4gICAgfVxuXG4gICAgLy8gbHVtYS5nbCDiiaU5LjMgYXNzaWducyB1bmlxdWUgdGV4dHVyZSB1bml0cyB0byBzYW1wbGVycyBiZWZvcmVcbiAgICAvLyB2YWxpZGF0aW9uIHZpYSBfaW5pdGlhbGl6ZVNhbXBsZXJVbmlmb3Jtcy4gQ2FsbCBpdCBoZXJlIHNvIHRoYXRcbiAgICAvLyB0aGUgc2FtcGxlci10by11bml0IG1hcHBpbmcgaXMgcG9wdWxhdGVkIHRocm91Z2ggb3VyIHBhdGNoZWQgcGF0aC5cbiAgICBpZiAodHlwZW9mIHRoaXMuX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMoKTtcbiAgICB9XG5cbiAgICBnbC52YWxpZGF0ZVByb2dyYW0odGhpcy5oYW5kbGUpO1xuICAgIGNvbnN0IHZhbGlkYXRlZCA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5oYW5kbGUsIDB4OGI4MyAvKiBWQUxJREFURV9TVEFUVVMgKi8pO1xuICAgIGlmICghdmFsaWRhdGVkKSB7XG4gICAgICBjb25zdCBpbmZvTG9nID0gZ2wuZ2V0UHJvZ3JhbUluZm9Mb2codGhpcy5oYW5kbGUpIHx8ICcnO1xuICAgICAgaWYgKCFNSVhFRF9TQU1QTEVSX1JFLnRlc3QoaW5mb0xvZykpIHtcbiAgICAgICAgdGhpcy5saW5rU3RhdHVzID0gJ2Vycm9yJztcbiAgICAgICAgcmV0dXJuICd2YWxpZGF0aW9uLWVycm9yJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpbmtTdGF0dXMgPSAnc3VjY2Vzcyc7XG4gICAgcmV0dXJuICdzdWNjZXNzJztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoUGlwZWxpbmVWYWxpZGF0aW9uKCk6IHZvaWQge1xuICBpZiAoX3BhdGNoZWQpIHJldHVybjtcbiAgX3BhdGNoZWQgPSB0cnVlO1xuXG4gIC8vIFN0cmF0ZWd5IDE6IGx1bWEuZ2wgPDkuMyDigJQgX2dldExpbmtTdGF0dXMgb24gV0VCR0xSZW5kZXJQaXBlbGluZVxuICBpZiAoXG4gICAgV0VCR0xSZW5kZXJQaXBlbGluZT8ucHJvdG90eXBlICYmXG4gICAgdHlwZW9mIChXRUJHTFJlbmRlclBpcGVsaW5lLnByb3RvdHlwZSBhcyBhbnkpLl9nZXRMaW5rU3RhdHVzID09PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKFdFQkdMUmVuZGVyUGlwZWxpbmUucHJvdG90eXBlIGFzIGFueSkuX2dldExpbmtTdGF0dXM7XG4gICAgKFdFQkdMUmVuZGVyUGlwZWxpbmUucHJvdG90eXBlIGFzIGFueSkuX2dldExpbmtTdGF0dXMgPSBjcmVhdGVQYXRjaGVkTGlua1N0YXR1cyhvcmlnaW5hbCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU3RyYXRlZ3kgMjogbHVtYS5nbCDiiaU5LjMg4oCUIF9nZXRMaW5rU3RhdHVzIG1vdmVkIHRvIFdFQkdMU2hhcmVkUmVuZGVyUGlwZWxpbmUuXG4gIC8vIFRoYXQgY2xhc3MgaXMgbm90IHB1YmxpY2x5IGV4cG9ydGVkLCBzbyB3ZSBob29rIHRoZSBmYWN0b3J5IG9uIFdlYkdMRGV2aWNlXG4gIC8vIHRoYXQgY3JlYXRlcyBzaGFyZWQgcGlwZWxpbmVzLiBUaGUgZmlyc3QgaW52b2NhdGlvbiBkaXNjb3ZlcnMgdGhlIGNsYXNzLFxuICAvLyBwYXRjaGVzIGl0cyBwcm90b3R5cGUsIHRoZW4gcmUtdmFsaWRhdGVzIHRoZSBpbnN0YW5jZS5cbiAgY29uc3QgZGV2aWNlUHJvdG8gPSBXZWJHTERldmljZT8ucHJvdG90eXBlIGFzIGFueTtcbiAgY29uc3Qgb3JpZ0ZhY3RvcnkgPSBkZXZpY2VQcm90bz8uX2NyZWF0ZVNoYXJlZFJlbmRlclBpcGVsaW5lV2ViR0w7XG4gIGlmICh0eXBlb2Ygb3JpZ0ZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHJldHVybjtcblxuICBkZXZpY2VQcm90by5fY3JlYXRlU2hhcmVkUmVuZGVyUGlwZWxpbmVXZWJHTCA9IGZ1bmN0aW9uICh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBvcmlnRmFjdG9yeS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBjb25zdCBTaGFyZWRDdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGluc3RhbmNlKS5jb25zdHJ1Y3RvcjtcblxuICAgIGlmIChcbiAgICAgIFNoYXJlZEN0b3IgJiZcbiAgICAgIFNoYXJlZEN0b3IgIT09IFdFQkdMUmVuZGVyUGlwZWxpbmUgJiZcbiAgICAgIHR5cGVvZiBTaGFyZWRDdG9yLnByb3RvdHlwZS5fZ2V0TGlua1N0YXR1cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgY29uc3Qgb3JpZ2luYWwgPSBTaGFyZWRDdG9yLnByb3RvdHlwZS5fZ2V0TGlua1N0YXR1cztcbiAgICAgIFNoYXJlZEN0b3IucHJvdG90eXBlLl9nZXRMaW5rU3RhdHVzID0gY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMob3JpZ2luYWwpO1xuXG4gICAgICAvLyBSZS12YWxpZGF0ZSB0aGlzIGZpcnN0IGluc3RhbmNlIHNpbmNlIGl0cyBfZ2V0TGlua1N0YXR1cyBhbHJlYWR5IHJhblxuICAgICAgLy8gd2l0aCB0aGUgdW5wYXRjaGVkIHZlcnNpb24gZHVyaW5nIGNvbnN0cnVjdGlvbi5cbiAgICAgIGlmIChpbnN0YW5jZS5saW5rU3RhdHVzICE9PSAnc3VjY2VzcycpIHtcbiAgICAgICAgaW5zdGFuY2UuX2dldExpbmtTdGF0dXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGZhY3Rvcnkg4oCUIGZ1dHVyZSBpbnN0YW5jZXMgd2lsbCB1c2UgdGhlIHBhdGNoZWQgcHJvdG90eXBlXG4gICAgZGV2aWNlUHJvdG8uX2NyZWF0ZVNoYXJlZFJlbmRlclBpcGVsaW5lV2ViR0wgPSBvcmlnRmFjdG9yeTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVFBLG1CQUFtQixFQUFFQyxXQUFXLFFBQU8sZ0JBQWdCO0FBRS9ELElBQU1DLGdCQUFnQixHQUFHLG1EQUFtRDtBQUU1RSxJQUFJQyxRQUFRLEdBQUcsS0FBSztBQUVwQixTQUFTQyx1QkFBdUJBLENBQUNDLFNBQTBDLEVBQUU7RUFDM0UsT0FBTyxTQUFTQyxxQkFBcUJBLENBQUEsRUFBWTtJQUMvQyxJQUFPQyxFQUFFLEdBQUksSUFBSSxDQUFDQyxNQUFNLENBQWpCRCxFQUFFO0lBQ1QsSUFBTUUsTUFBTSxHQUFHRixFQUFFLENBQUNHLG1CQUFtQixDQUFDLElBQUksQ0FBQ0MsTUFBTSxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUM1RSxJQUFJLENBQUNGLE1BQU0sRUFBRTtNQUNYLElBQUks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
@@ -0,0 +1,153 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright contributors to the kepler.gl project
4
+
5
+ import { ShaderAssembler } from '@luma.gl/shadertools';
6
+ import { UNIFORM_NAME_MAP } from '../raster-processing-uniforms';
7
+
8
+ /**
9
+ * UBO-based shader module for raster layer uniforms.
10
+ * Replaces the old standalone `uniform float desaturate` etc.
11
+ */
12
+ var rasterUniformBlock = "uniform rasterUniforms {\n vec4 bounds;\n float coordinateConversion;\n float desaturate;\n float opacity;\n vec3 tintColor;\n vec4 transparentColor;\n} raster;\n";
13
+ export var rasterUniforms = {
14
+ name: 'raster',
15
+ vs: rasterUniformBlock,
16
+ fs: rasterUniformBlock,
17
+ uniformTypes: {
18
+ bounds: 'vec4<f32>',
19
+ coordinateConversion: 'f32',
20
+ desaturate: 'f32',
21
+ opacity: 'f32',
22
+ tintColor: 'vec3<f32>',
23
+ transparentColor: 'vec4<f32>'
24
+ }
25
+ };
26
+
27
+ /**
28
+ * Register custom DECKGL_CREATE_COLOR and DECKGL_MUTATE_COLOR shader hooks
29
+ * with the default ShaderAssembler. These hooks are used by the raster layer's
30
+ * custom shader modules (rgbaImage, combineBands, colormap, etc.).
31
+ *
32
+ * In luma.gl 8.x these were registered via ProgramManager; in luma.gl 9.x
33
+ * we register them with the ShaderAssembler singleton.
34
+ *
35
+ * NOTE: We must check the assembler's hook list every time rather than using
36
+ * a module-level boolean guard, because deck.gl's getShaderAssembler() clears
37
+ * _hookFunctions when a new Deck instance is created (e.g. during image export).
38
+ */
39
+ export function ensureRasterHooksRegistered() {
40
+ var assembler = ShaderAssembler.getDefaultShaderAssembler();
41
+ // @ts-expect-error _hookFunctions is private in ShaderAssembler
42
+ var existingHooks = assembler._hookFunctions || [];
43
+ var hookNames = existingHooks.map(function (h) {
44
+ return typeof h === 'string' ? h : h.hook;
45
+ });
46
+ if (!hookNames.some(function (h) {
47
+ return h === null || h === void 0 ? void 0 : h.includes('DECKGL_CREATE_COLOR');
48
+ })) {
49
+ assembler.addShaderHook('fs:DECKGL_CREATE_COLOR(inout vec4 image, vec2 coord)');
50
+ }
51
+ if (!hookNames.some(function (h) {
52
+ return h === null || h === void 0 ? void 0 : h.includes('DECKGL_MUTATE_COLOR');
53
+ })) {
54
+ assembler.addShaderHook('fs:DECKGL_MUTATE_COLOR(inout vec4 image, vec2 coord)');
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Convert kepler.gl's custom raster shader modules into luma.gl 9 compatible
60
+ * format. Ensures fs2 (WebGL2) shaders are used and texture2D -> texture.
61
+ */
62
+
63
+ export function prepareLumaModules(modules) {
64
+ return modules.map(function (mod) {
65
+ var fs = mod.fs2 || mod.fs || '';
66
+ // Replace texture2D with texture for GLSL 300 es
67
+ fs = fs.replace(/texture2D\(/g, 'texture(');
68
+ var nameMap = UNIFORM_NAME_MAP[mod.name];
69
+ var consolidate = Boolean(nameMap && mod.uniformTypes);
70
+ if (mod.uniformTypes && !nameMap) {
71
+ console.warn("[raster] Module \"".concat(mod.name, "\" has uniformTypes but no UNIFORM_NAME_MAP entry. ") + 'Its UBO will not be consolidated and may push the fragment uniform block count over the WebGL2 limit.');
72
+ }
73
+ if (consolidate) {
74
+ // Strip only this module's uniform block declaration so it doesn't
75
+ // create its own UBO.
76
+ var blockPattern = new RegExp("uniform\\s+".concat(mod.name, "Uniforms\\s*\\{[^}]*\\}\\s*").concat(mod.name, "\\s*;"), 'gs');
77
+ fs = fs.replace(blockPattern, '');
78
+
79
+ // Rewrite moduleName.fieldName references to the shared UBO aliases
80
+ for (var _i = 0, _Object$entries = Object.entries(nameMap); _i < _Object$entries.length; _i++) {
81
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
82
+ origField = _Object$entries$_i[0],
83
+ prefixedField = _Object$entries$_i[1];
84
+ var pattern = new RegExp("\\b".concat(mod.name, "\\.").concat(origField, "\\b"), 'g');
85
+ fs = fs.replace(pattern, "".concat(prefixedField, "_ALIAS"));
86
+ }
87
+ }
88
+ var result = {
89
+ name: mod.name,
90
+ fs: fs,
91
+ dependencies: mod.dependencies,
92
+ deprecations: mod.deprecations
93
+ };
94
+ if (mod.vs) {
95
+ result.vs = mod.vs.replace(/texture2D\(/g, 'texture(');
96
+ }
97
+ if (mod.defines) {
98
+ result.defines = mod.defines;
99
+ }
100
+ if (mod.getUniforms) {
101
+ result.getUniforms = mod.getUniforms;
102
+ }
103
+ if (mod.uniforms) {
104
+ result.uniforms = mod.uniforms;
105
+ }
106
+
107
+ // Only keep uniformTypes for modules NOT consolidated into the shared UBO
108
+ if (mod.uniformTypes && !consolidate) {
109
+ result.uniformTypes = mod.uniformTypes;
110
+ }
111
+
112
+ // Convert inject code, replacing texture2D -> texture and UBO references
113
+ if (mod.inject) {
114
+ result.inject = {};
115
+ for (var _i2 = 0, _Object$entries2 = Object.entries(mod.inject); _i2 < _Object$entries2.length; _i2++) {
116
+ var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2),
117
+ hook = _Object$entries2$_i[0],
118
+ code = _Object$entries2$_i[1];
119
+ var codeStr = typeof code === 'string' ? code : code.injection || '';
120
+ codeStr = codeStr.replace(/texture2D\(/g, 'texture(');
121
+ if (consolidate && nameMap) {
122
+ for (var _i3 = 0, _Object$entries3 = Object.entries(nameMap); _i3 < _Object$entries3.length; _i3++) {
123
+ var _Object$entries3$_i = _slicedToArray(_Object$entries3[_i3], 2),
124
+ _origField = _Object$entries3$_i[0],
125
+ _prefixedField = _Object$entries3$_i[1];
126
+ var _pattern = new RegExp("\\b".concat(mod.name, "\\.").concat(_origField, "\\b"), 'g');
127
+ codeStr = codeStr.replace(_pattern, "".concat(_prefixedField, "_ALIAS"));
128
+ }
129
+ }
130
+ result.inject[hook] = codeStr;
131
+ }
132
+ }
133
+ return result;
134
+ });
135
+ }
136
+
137
+ /**
138
+ * Build the vertex shader for the raster layer.
139
+ * References raster.coordinateConversion from the UBO.
140
+ */
141
+ export function buildRasterVertexShader() {
142
+ return "#version 300 es\n#define SHADER_NAME raster-layer-vertex-shader\n\nprecision mediump float;\n\nin vec2 texCoords;\nin vec3 positions;\nin vec3 positions64Low;\n\nout vec2 vTexCoord;\nout vec2 vTexPos;\n\nconst vec3 pickingColor = vec3(1.0, 0.0, 0.0);\n\nvoid main(void) {\n geometry.worldPosition = positions;\n geometry.uv = texCoords;\n geometry.pickingColor = pickingColor;\n\n gl_Position = project_position_to_clipspace(positions, positions64Low, vec3(0.0), geometry.position);\n DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\n\n vTexCoord = texCoords;\n\n if (raster.coordinateConversion < -0.5) {\n vTexPos = geometry.position.xy + project.commonOrigin.xy;\n } else if (raster.coordinateConversion > 0.5) {\n vTexPos = geometry.worldPosition.xy;\n }\n\n vec4 color = vec4(0.0);\n DECKGL_FILTER_COLOR(color, geometry);\n}\n";
143
+ }
144
+
145
+ /**
146
+ * Build the fragment shader for the raster layer.
147
+ * Uses DECKGL_CREATE_COLOR and DECKGL_MUTATE_COLOR hooks which are now
148
+ * registered with the ShaderAssembler and populated by module injections.
149
+ */
150
+ export function buildRasterFragmentShader() {
151
+ return "#version 300 es\n#define SHADER_NAME raster-layer-fragment-shader\n\nprecision mediump float;\nprecision mediump int;\nprecision mediump usampler2D;\n\nin vec2 vTexCoord;\nin vec2 vTexPos;\n\nout vec4 fragColor;\n\n/* projection utils */\nconst float TILE_SIZE = 512.0;\nconst float PI = 3.1415926536;\nconst float WORLD_SCALE = TILE_SIZE / PI / 2.0;\n\nvec2 lnglat_to_mercator(vec2 lnglat) {\n float x = lnglat.x;\n float y = clamp(lnglat.y, -89.9, 89.9);\n return vec2(\n radians(x) + PI,\n PI + log(tan(PI * 0.25 + radians(y) * 0.5))\n ) * WORLD_SCALE;\n}\n\nvec2 mercator_to_lnglat(vec2 xy) {\n xy /= WORLD_SCALE;\n return degrees(vec2(\n xy.x - PI,\n atan(exp(xy.y - PI)) * 2.0 - PI * 0.5\n ));\n}\n\nvec3 color_desaturate(vec3 color) {\n float luminance = (color.r + color.g + color.b) * 0.333333333;\n return mix(color, vec3(luminance), raster.desaturate);\n}\n\nvec3 color_tint(vec3 color) {\n return color * raster.tintColor;\n}\n\nvec4 apply_opacity(vec3 color, float alpha) {\n if (raster.transparentColor.a == 0.0) {\n return vec4(color, alpha);\n }\n float blendedAlpha = alpha + raster.transparentColor.a * (1.0 - alpha);\n float highLightRatio = alpha / blendedAlpha;\n vec3 blendedRGB = mix(raster.transparentColor.rgb, color, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n}\n\nvec2 getUV(vec2 pos) {\n return vec2(\n (pos.x - raster.bounds[0]) / (raster.bounds[2] - raster.bounds[0]),\n (pos.y - raster.bounds[3]) / (raster.bounds[1] - raster.bounds[3])\n );\n}\n\nvoid main(void) {\n vec2 uv = vTexCoord;\n if (raster.coordinateConversion < -0.5) {\n vec2 lnglat = mercator_to_lnglat(vTexPos);\n uv = getUV(lnglat);\n } else if (raster.coordinateConversion > 0.5) {\n vec2 commonPos = lnglat_to_mercator(vTexPos);\n uv = getUV(commonPos);\n }\n\n vec4 image = vec4(0.0);\n DECKGL_CREATE_COLOR(image, uv);\n\n DECKGL_MUTATE_COLOR(image, uv);\n\n fragColor = apply_opacity(color_tint(color_desaturate(image.rgb)), raster.opacity);\n\n geometry.uv = uv;\n DECKGL_FILTER_COLOR(fragColor, geometry);\n}\n";
152
+ }
153
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaGFkZXJBc3NlbWJsZXIiLCJVTklGT1JNX05BTUVfTUFQIiwicmFzdGVyVW5pZm9ybUJsb2NrIiwicmFzdGVyVW5pZm9ybXMiLCJuYW1lIiwidnMiLCJmcyIsInVuaWZvcm1UeXBlcyIsImJvdW5kcyIsImNvb3JkaW5hdGVDb252ZXJzaW9uIiwiZGVzYXR1cmF0ZSIsIm9wYWNpdHkiLCJ0aW50Q29sb3IiLCJ0cmFuc3BhcmVudENvbG9yIiwiZW5zdXJlUmFzdGVySG9va3NSZWdpc3RlcmVkIiwiYXNzZW1ibGVyIiwiZ2V0RGVmYXVsdFNoYWRlckFzc2VtYmxlciIsImV4aXN0aW5nSG9va3MiLCJfaG9va0Z1bmN0aW9ucyIsImhvb2tOYW1lcyIsIm1hcCIsImgiLCJob29rIiwic29tZSIsImluY2x1ZGVzIiwiYWRkU2hhZGVySG9vayIsInByZXBhcmVMdW1hTW9kdWxlcyIsIm1vZHVsZXMiLCJtb2QiLCJmczIiLCJyZXBsYWNlIiwibmFtZU1hcCIsImNvbnNvbGlkYXRlIiwiQm9vbGVhbiIsImNvbnNvbGUiLCJ3YXJuIiwiY29uY2F0IiwiYmxvY2tQYXR0ZXJuIiwiUmVnRXhwIiwiX2kiLCJfT2JqZWN0JGVudHJpZXMiLCJPYmplY3QiLCJlbnRyaWVzIiwibGVuZ3RoIiwiX09iamVjdCRlbnRyaWVzJF9pIiwiX3NsaWNlZFRvQXJyYXkiLCJvcmlnRmllbGQiLCJwcmVmaXhlZEZpZWxkIiwicGF0dGVybiIsInJlc3VsdCIsImRlcGVuZGVuY2llcyIsImRlcHJlY2F0aW9ucyIsImRlZmluZXMiLCJnZXRVbmlmb3JtcyIsInVuaWZvcm1zIiwiaW5qZWN0IiwiX2kyIiwiX09iamVjdCRlbnRyaWVzMiIsIl9PYmplY3QkZW50cmllczIkX2kiLCJjb2RlIiwiY29kZVN0ciIsImluamVjdGlvbiIsIl9pMyIsIl9PYmplY3QkZW50cmllczMiLCJfT2JqZWN0JGVudHJpZXMzJF9pIiwiYnVpbGRSYXN0ZXJWZXJ0ZXhTaGFkZXIiLCJidWlsZFJhc3RlckZyYWdtZW50U2hhZGVyIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Jhc3Rlci9yYXN0ZXItbGF5ZXIvcmFzdGVyLWxheWVyLXNoYWRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtTaGFkZXJBc3NlbWJsZXJ9IGZyb20gJ0BsdW1hLmdsL3NoYWRlcnRvb2xzJztcbmltcG9ydCB0eXBlIHtTaGFkZXJNb2R1bGUgYXMgTHVtYVNoYWRlck1vZHVsZX0gZnJvbSAnLi4vd2ViZ2wvdHlwZXMnO1xuaW1wb3J0IHtVTklGT1JNX05BTUVfTUFQfSBmcm9tICcuLi9yYXN0ZXItcHJvY2Vzc2luZy11bmlmb3Jtcyc7XG5cbi8qKlxuICogVUJPLWJhc2VkIHNoYWRlciBtb2R1bGUgZm9yIHJhc3RlciBsYXllciB1bmlmb3Jtcy5cbiAqIFJlcGxhY2VzIHRoZSBvbGQgc3RhbmRhbG9uZSBgdW5pZm9ybSBmbG9hdCBkZXNhdHVyYXRlYCBldGMuXG4gKi9cbmNvbnN0IHJhc3RlclVuaWZvcm1CbG9jayA9IGBcXFxudW5pZm9ybSByYXN0ZXJVbmlmb3JtcyB7XG4gIHZlYzQgYm91bmRzO1xuICBmbG9hdCBjb29yZGluYXRlQ29udmVyc2lvbjtcbiAgZmxvYXQgZGVzYXR1cmF0ZTtcbiAgZmxvYXQgb3BhY2l0eTtcbiAgdmVjMyB0aW50Q29sb3I7XG4gIHZlYzQgdHJhbnNwYXJlbnRDb2xvcjtcbn0gcmFzdGVyO1xuYDtcblxuZXhwb3J0IGNvbnN0IHJhc3RlclVuaWZvcm1zID0ge1xuICBuYW1lOiAncmFzdGVyJyxcbiAgdnM6IHJhc3RlclVuaWZvcm1CbG9jayxcbiAgZnM6IHJhc3RlclVuaWZvcm1CbG9jayxcbiAgdW5pZm9ybVR5cGVzOiB7XG4gICAgYm91bmRzOiAndmVjNDxmMzI+JyxcbiAgICBjb29yZGluYXRlQ29udmVyc2lvbjogJ2YzMicsXG4gICAgZGVzYXR1cmF0ZTogJ2YzMicsXG4gICAgb3BhY2l0eTogJ2YzMicsXG4gICAgdGludENvbG9yOiAndmVjMzxmMzI+JyxcbiAgICB0cmFuc3BhcmVudENvbG9yOiAndmVjNDxmMzI+J1xuICB9XG59O1xuXG4vKipcbiAqIFJlZ2lzdGVyIGN1c3RvbSBERUNLR0xfQ1JFQVRFX0NPTE9SIGFuZCBERUNLR0xfTVVUQVRFX0NPTE9SIHNoYWRlciBob29rc1xuICogd2l0aCB0aGUgZGVmYXVsdCBTaGFkZXJBc3NlbWJsZXIuIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IHRoZSByYXN0ZXIgbGF5ZXInc1xuICogY3VzdG9tIHNoYWRlciBtb2R1bGVzIChyZ2JhSW1hZ2UsIGNvbWJpbmVCYW5kcywgY29sb3JtYXAsIGV0Yy4pLlxuICpcbiAqIEluIGx1bWEuZ2wgOC54IHRoZXNlIHdlcmUgcmVnaXN0ZXJlZCB2aWEgUHJvZ3JhbU1hbmFnZXI7IGluIGx1bWEuZ2wgOS54XG4gKiB3ZSByZWdpc3RlciB0aGVtIHdpdGggdGhlIFNoYWRlckFzc2VtYmxlciBzaW5nbGV0b24uXG4gKlxuICogTk9URTogV2UgbXVzdCBjaGVjayB0aGUgYXNzZW1ibGVyJ3MgaG9vayBsaXN0IGV2ZXJ5IHRpbWUgcmF0aGVyIHRoYW4gdXNpbmdcbiAqIGEgbW9kdWxlLWxldmVsIGJvb2xlYW4gZ3VhcmQsIGJlY2F1c2UgZGVjay5nbCdzIGdldFNoYWRlckFzc2VtYmxlcigpIGNsZWFyc1xuICogX2hvb2tGdW5jdGlvbnMgd2hlbiBhIG5ldyBEZWNrIGluc3RhbmNlIGlzIGNyZWF0ZWQgKGUuZy4gZHVyaW5nIGltYWdlIGV4cG9ydCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVSYXN0ZXJIb29rc1JlZ2lzdGVyZWQoKTogdm9pZCB7XG4gIGNvbnN0IGFzc2VtYmxlciA9IFNoYWRlckFzc2VtYmxlci5nZXREZWZhdWx0U2hhZGVyQXNzZW1ibGVyKCk7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgX2hvb2tGdW5jdGlvbnMgaXMgcHJpdmF0ZSBpbiBTaGFkZXJBc3NlbWJsZXJcbiAgY29uc3QgZXhpc3RpbmdIb29rcyA9IGFzc2VtYmxlci5faG9va0Z1bmN0aW9ucyB8fCBbXTtcbiAgY29uc3QgaG9va05hbWVzID0gZXhpc3RpbmdIb29rcy5tYXAoaCA9PiAodHlwZW9mIGggPT09ICdzdHJpbmcnID8gaCA6IGguaG9vaykpO1xuXG4gIGlmICghaG9va05hbWVzLnNvbWUoaCA9PiBoPy5pbmNsdWRlcygnREVDS0dMX0NSRUFURV9DT0xPUicpKSkge1xuICAgIGFzc2VtYmxlci5hZGRTaGFkZXJIb29rKCdmczpERUNLR0xfQ1JFQVRFX0NPTE9SKGlub3V0IHZlYzQgaW1hZ2UsIHZlYzIgY29vcmQpJyk7XG4gIH1cbiAgaWYgKCFob29rTmFtZXMuc29tZShoID0+IGg/LmluY2x1ZGVzKCdERUNLR0xfTVVUQVRFX0NPTE9SJykpKSB7XG4gICAgYXNzZW1ibGVyLmFkZFNoYWRlckhvb2soJ2ZzOkRFQ0tHTF9NVVRBVEVfQ09MT1IoaW5vdXQgdmVjNCBpbWFnZSwgdmVjMiBjb29yZCknKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQga2VwbGVyLmdsJ3MgY3VzdG9tIHJhc3RlciBzaGFkZXIgbW9kdWxlcyBpbnRvIGx1bWEuZ2wgOSBjb21wYXRpYmxlXG4gKiBmb3JtYXQuIEVuc3VyZXMgZnMyIChXZWJHTDIpIHNoYWRlcnMgYXJlIHVzZWQgYW5kIHRleHR1cmUyRCAtPiB0ZXh0dXJlLlxuICovXG5pbnRlcmZhY2UgTHVtYU1vZHVsZU91dHB1dCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZnM6IHN0cmluZztcbiAgdnM/OiBzdHJpbmc7XG4gIGRlZmluZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBnZXRVbmlmb3Jtcz86IChvcHRzOiBvYmplY3QpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgdW5pZm9ybXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdW5pZm9ybVR5cGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgaW5qZWN0PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZGVwZW5kZW5jaWVzPzogdW5rbm93bltdO1xuICBkZXByZWNhdGlvbnM/OiB1bmtub3duW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTHVtYU1vZHVsZXMobW9kdWxlczogTHVtYVNoYWRlck1vZHVsZVtdKTogTHVtYU1vZHVsZU91dHB1dFtdIHtcbiAgcmV0dXJuIG1vZHVsZXMubWFwKG1vZCA9PiB7XG4gICAgbGV0IGZzID0gbW9kLmZzMiB8fCBtb2QuZnMgfHwgJyc7XG4gICAgLy8gUmVwbGFjZSB0ZXh0dXJlMkQgd2l0aCB0ZXh0dXJlIGZvciBHTFNMIDMwMCBlc1xuICAgIGZzID0gZnMucmVwbGFjZSgvdGV4dHVyZTJEXFwoL2csICd0ZXh0dXJlKCcpO1xuXG4gICAgY29uc3QgbmFtZU1hcCA9IFVOSUZPUk1fTkFNRV9NQVBbbW9kLm5hbWVdO1xuICAgIGNvbnN0IGNvbnNvbGlkYXRlID0gQm9vbGVhbihuYW1lTWFwICYmIG1vZC51bmlmb3JtVHlwZXMpO1xuXG4gICAgaWYgKG1vZC51bmlmb3JtVHlwZXMgJiYgIW5hbWVNYXApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtyYXN0ZXJdIE1vZHVsZSBcIiR7bW9kLm5hbWV9XCIgaGFzIHVuaWZvcm1UeXBlcyBidXQgbm8gVU5JRk9STV9OQU1FX01BUCBlbnRyeS4gYCArXG4gICAgICAgICAgJ0l0cyBVQk8gd2lsbCBub3QgYmUgY29uc29saWRhdGVkIGFuZCBtYXkgcHVzaCB0aGUgZnJhZ21lbnQgdW5pZm9ybSBibG9jayBjb3VudCBvdmVyIHRoZSBXZWJHTDIgbGltaXQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY29uc29saWRhdGUpIHtcbiAgICAgIC8vIFN0cmlwIG9ubHkgdGhpcyBtb2R1bGUncyB1bmlmb3JtIGJsb2NrIGRlY2xhcmF0aW9uIHNvIGl0IGRvZXNuJ3RcbiAgICAgIC8vIGNyZWF0ZSBpdHMgb3duIFVCTy5cbiAgICAgIGNvbnN0IGJsb2NrUGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGB1bmlmb3JtXFxcXHMrJHttb2QubmFtZX1Vbmlmb3Jtc1xcXFxzKlxcXFx7W159XSpcXFxcfVxcXFxzKiR7bW9kLm5hbWV9XFxcXHMqO2AsXG4gICAgICAgICdncydcbiAgICAgICk7XG4gICAgICBmcyA9IGZzLnJlcGxhY2UoYmxvY2tQYXR0ZXJuLCAnJyk7XG5cbiAgICAgIC8vIFJld3JpdGUgbW9kdWxlTmFtZS5maWVsZE5hbWUgcmVmZXJlbmNlcyB0byB0aGUgc2hhcmVkIFVCTyBhbGlhc2VzXG4gICAgICBmb3IgKGNvbnN0IFtvcmlnRmllbGQsIHByZWZpeGVkRmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVNYXApKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGBcXFxcYiR7bW9kLm5hbWV9XFxcXC4ke29yaWdGaWVsZH1cXFxcYmAsICdnJyk7XG4gICAgICAgIGZzID0gZnMucmVwbGFjZShwYXR0ZXJuLCBgJHtwcmVmaXhlZEZpZWxkfV9BTElBU2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogTHVtYU1vZHVsZU91dHB1dCA9IHtcbiAgICAgIG5hbWU6IG1vZC5uYW1lLFxuICAgICAgZnMsXG4gICAgICBkZXBlbmRlbmNpZXM6IG1vZC5kZXBlbmRlbmNpZXMsXG4gICAgICBkZXByZWNhdGlvbnM6IG1vZC5kZXByZWNhdGlvbnNcbiAgICB9O1xuXG4gICAgaWYgKG1vZC52cykge1xuICAgICAgcmVzdWx0LnZzID0gbW9kLnZzLnJlcGxhY2UoL3RleHR1cmUyRFxcKC9nLCAndGV4dHVyZSgnKTtcbiAgICB9XG5cbiAgICBpZiAobW9kLmRlZmluZXMpIHtcbiAgICAgIHJlc3VsdC5kZWZpbmVzID0gbW9kLmRlZmluZXM7XG4gICAgfVxuXG4gICAgaWYgKG1vZC5nZXRVbmlmb3Jtcykge1xuICAgICAgcmVzdWx0LmdldFVuaWZvcm1zID0gbW9kLmdldFVuaWZvcm1zO1xuICAgIH1cblxuICAgIGlmIChtb2QudW5pZm9ybXMpIHtcbiAgICAgIHJlc3VsdC51bmlmb3JtcyA9IG1vZC51bmlmb3JtcztcbiAgICB9XG5cbiAgICAvLyBPbmx5IGtlZXAgdW5pZm9ybVR5cGVzIGZvciBtb2R1bGVzIE5PVCBjb25zb2xpZGF0ZWQgaW50byB0aGUgc2hhcmVkIFVCT1xuICAgIGlmIChtb2QudW5pZm9ybVR5cGVzICYmICFjb25zb2xpZGF0ZSkge1xuICAgICAgcmVzdWx0LnVuaWZvcm1UeXBlcyA9IG1vZC51bmlmb3JtVHlwZXM7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBpbmplY3QgY29kZSwgcmVwbGFjaW5nIHRleHR1cmUyRCAtPiB0ZXh0dXJlIGFuZCBVQk8gcmVmZXJlbmNlc1xuICAgIGlmIChtb2QuaW5qZWN0KSB7XG4gICAgICByZXN1bHQuaW5qZWN0ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtob29rLCBjb2RlXSBvZiBPYmplY3QuZW50cmllcyhtb2QuaW5qZWN0KSkge1xuICAgICAgICBsZXQgY29kZVN0ciA9XG4gICAgICAgICAgdHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnID8gY29kZSA6IChjb2RlIGFzIHtpbmplY3Rpb24/OiBzdHJpbmd9KS5pbmplY3Rpb24gfHwgJyc7XG4gICAgICAgIGNvZGVTdHIgPSBjb2RlU3RyLnJlcGxhY2UoL3RleHR1cmUyRFxcKC9nLCAndGV4dHVyZSgnKTtcblxuICAgICAgICBpZiAoY29uc29saWRhdGUgJiYgbmFtZU1hcCkge1xuICAgICAgICAgIGZvciAoY29uc3QgW29yaWdGaWVsZCwgcHJlZml4ZWRGaWVsZF0gb2YgT2JqZWN0LmVudHJpZXMobmFtZU1hcCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKGBcXFxcYiR7bW9kLm5hbWV9XFxcXC4ke29yaWdGaWVsZH1cXFxcYmAsICdnJyk7XG4gICAgICAgICAgICBjb2RlU3RyID0gY29kZVN0ci5yZXBsYWNlKHBhdHRlcm4sIGAke3ByZWZpeGVkRmllbGR9X0FMSUFTYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LmluamVjdFtob29rXSA9IGNvZGVTdHI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHZlcnRleCBzaGFkZXIgZm9yIHRoZSByYXN0ZXIgbGF5ZXIuXG4gKiBSZWZlcmVuY2VzIHJhc3Rlci5jb29yZGluYXRlQ29udmVyc2lvbiBmcm9tIHRoZSBVQk8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJhc3RlclZlcnRleFNoYWRlcigpOiBzdHJpbmcge1xuICByZXR1cm4gYFxcXG4jdmVyc2lvbiAzMDAgZXNcbiNkZWZpbmUgU0hBREVSX05BTUUgcmFzdGVyLWxheWVyLXZlcnRleC1zaGFkZXJcblxucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzIgdGV4Q29vcmRzO1xuaW4gdmVjMyBwb3NpdGlvbnM7XG5pbiB2ZWMzIHBvc2l0aW9uczY0TG93O1xuXG5vdXQgdmVjMiB2VGV4Q29vcmQ7XG5vdXQgdmVjMiB2VGV4UG9zO1xuXG5jb25zdCB2ZWMzIHBpY2tpbmdDb2xvciA9IHZlYzMoMS4wLCAwLjAsIDAuMCk7XG5cbnZvaWQgbWFpbih2b2lkKSB7XG4gIGdlb21ldHJ5LndvcmxkUG9zaXRpb24gPSBwb3NpdGlvbnM7XG4gIGdlb21ldHJ5LnV2ID0gdGV4Q29vcmRzO1xuICBnZW9tZXRyeS5waWNraW5nQ29sb3IgPSBwaWNraW5nQ29sb3I7XG5cbiAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0X3Bvc2l0aW9uX3RvX2NsaXBzcGFjZShwb3NpdGlvbnMsIHBvc2l0aW9uczY0TG93LCB2ZWMzKDAuMCksIGdlb21ldHJ5LnBvc2l0aW9uKTtcbiAgREVDS0dMX0ZJTFRFUl9HTF9QT1NJVElPTihnbF9Qb3NpdGlvbiwgZ2VvbWV0cnkpO1xuXG4gIHZUZXhDb29yZCA9IHRleENvb3JkcztcblxuICBpZiAocmFzdGVyLmNvb3JkaW5hdGVDb252ZXJzaW9uIDwgLTAuNSkge1xuICAgIHZUZXhQb3MgPSBnZW9tZXRyeS5wb3NpdGlvbi54eSArIHByb2plY3QuY29tbW9uT3JpZ2luLnh5O1xuICB9IGVsc2UgaWYgKHJhc3Rlci5jb29yZGluYXRlQ29udmVyc2lvbiA+IDAuNSkge1xuICAgIHZUZXhQb3MgPSBnZW9tZXRyeS53b3JsZFBvc2l0aW9uLnh5O1xuICB9XG5cbiAgdmVjNCBjb2xvciA9IHZlYzQoMC4wKTtcbiAgREVDS0dMX0ZJTFRFUl9DT0xPUihjb2xvciwgZ2VvbWV0cnkpO1xufVxuYDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgZnJhZ21lbnQgc2hhZGVyIGZvciB0aGUgcmFzdGVyIGxheWVyLlxuICogVXNlcyBERUNLR0xfQ1JFQVRFX0NPTE9SIGFuZCBERUNLR0xfTVVUQVRFX0NPTE9SIGhvb2tzIHdoaWNoIGFyZSBub3dcbiAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUgU2hhZGVyQXNzZW1ibGVyIGFuZCBwb3B1bGF0ZWQgYnkgbW9kdWxlIGluamVjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJhc3RlckZyYWdtZW50U2hhZGVyKCk6IHN0cmluZyB7XG4gIHJldHVybiBgXFxcbiN2ZXJzaW9uIDMwMCBlc1xuI2RlZmluZSBTSEFERVJfTkFNRSByYXN0ZXItbGF5ZXItZnJhZ21lbnQtc2hhZGVyXG5cbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xucHJlY2lzaW9uIG1lZGl1bXAgaW50O1xucHJlY2lzaW9uIG1lZGl1bXAgdXNhbXBsZXIyRDtcblxuaW4gdmVjMiB2VGV4Q29vcmQ7XG5pbiB2ZWMyIHZUZXhQb3M7XG5cbm91dCB2ZWM0IGZyYWdDb2xvcjtcblxuLyogcHJvamVjdGlvbiB1dGlscyAqL1xuY29uc3QgZmxvYXQgVElMRV9TSVpFID0gNTEyLjA7XG5jb25zdCBmbG9hdCBQSSA9IDMuMTQxNTkyNjUzNjtcbmNvbnN0IGZsb2F0IFdPUkxEX1NDQUxFID0gVElMRV9TSVpFIC8gUEkgLyAyLjA7XG5cbnZlYzIgbG5nbGF0X3RvX21lcmNhdG9yKHZlYzIgbG5nbGF0KSB7XG4gIGZsb2F0IHggPSBsbmdsYXQueDtcbiAgZmxvYXQgeSA9IGNsYW1wKGxuZ2xhdC55LCAtODkuOSwgODkuOSk7XG4gIHJldHVybiB2ZWMyKFxuICAgIHJhZGlhbnMoeCkgKyBQSSxcbiAgICBQSSArIGxvZyh0YW4oUEkgKiAwLjI1ICsgcmFkaWFucyh5KSAqIDAuNSkpXG4gICkgKiBXT1JMRF9TQ0FMRTtcbn1cblxudmVjMiBtZXJjYXRvcl90b19sbmdsYXQodmVjMiB4eSkge1xuICB4eSAvPSBXT1JMRF9TQ0FMRTtcbiAgcmV0dXJuIGRlZ3JlZXModmVjMihcbiAgICB4eS54IC0gUEksXG4gICAgYXRhbihleHAoeHkueSAtIFBJKSkgKiAyLjAgLSBQSSAqIDAuNVxuICApKTtcbn1cblxudmVjMyBjb2xvcl9kZXNhdHVyYXRlKHZlYzMgY29sb3IpIHtcbiAgZmxvYXQgbHVtaW5hbmNlID0gKGNvbG9yLnIgKyBjb2xvci5nICsgY29sb3IuYikgKiAwLjMzMzMzMzMzMztcbiAgcmV0dXJuIG1peChjb2xvciwgdmVjMyhsdW1pbmFuY2UpLCByYXN0ZXIuZGVzYXR1cmF0ZSk7XG59XG5cbnZlYzMgY29sb3JfdGludCh2ZWMzIGNvbG9yKSB7XG4gIHJldHVybiBjb2xvciAqIHJhc3Rlci50aW50Q29sb3I7XG59XG5cbnZlYzQgYXBwbHlfb3BhY2l0eSh2ZWMzIGNvbG9yLCBmbG9hdCBhbHBoYSkge1xuICBpZiAocmFzdGVyLnRyYW5zcGFyZW50Q29sb3IuYSA9PSAwLjApIHtcbiAgICByZXR1cm4gdmVjNChjb2xvciwgYWxwaGEpO1xuICB9XG4gIGZsb2F0IGJsZW5kZWRBbHBoYSA9IGFscGhhICsgcmFzdGVyLnRyYW5zcGFyZW50Q29sb3IuYSAqICgxLjAgLSBhbHBoYSk7XG4gIGZsb2F0IGhpZ2hMaWdodFJhdGlvID0gYWxwaGEgLyBibGVuZGVkQWxwaGE7XG4gIHZlYzMgYmxlbmRlZFJHQiA9IG1peChyYXN0ZXIudHJhbnNwYXJlbnRDb2xvci5yZ2IsIGNvbG9yLCBoaWdoTGlnaHRSYXRpbyk7XG4gIHJldHVybiB2ZWM0KGJsZW5kZWRSR0IsIGJsZW5kZWRBbHBoYSk7XG59XG5cbnZlYzIgZ2V0VVYodmVjMiBwb3MpIHtcbiAgcmV0dXJuIHZlYzIoXG4gICAgKHBvcy54IC0gcmFzdGVyLmJvdW5kc1swXSkgLyAocmFzdGVyLmJvdW5kc1syXSAtIHJhc3Rlci5ib3VuZHNbMF0pLFxuICAgIChwb3MueSAtIHJhc3Rlci5ib3VuZHNbM10pIC8gKHJhc3Rlci5ib3VuZHNbMV0gLSByYXN0ZXIuYm91bmRzWzNdKVxuICApO1xufVxuXG52b2lkIG1haW4odm9pZCkge1xuICB2ZWMyIHV2ID0gdlRleENvb3JkO1xuICBpZiAocmFzdGVyLmNvb3JkaW5hdGVDb252ZXJzaW9uIDwgLTAuNSkge1xuICAgIHZlYzIgbG5nbGF0ID0gbWVyY2F0b3JfdG9fbG5nbGF0KHZUZXhQb3MpO1xuICAgIHV2ID0gZ2V0VVYobG5nbGF0KTtcbiAgfSBlbHNlIGlmIChyYXN0ZXIuY29vcmRpbmF0ZUNvbnZlcnNpb24gPiAwLjUpIHtcbiAgICB2ZWMyIGNvbW1vblBvcyA9IGxuZ2xhdF90b19tZXJjYXRvcih2VGV4UG9zKTtcbiAgICB1diA9IGdldFVWKGNvbW1vblBvcyk7XG4gIH1cblxuICB2ZWM0IGltYWdlID0gdmVjNCgwLjApO1xuICBERUNLR0xfQ1JFQVRFX0NPTE9SKGltYWdlLCB1dik7XG5cbiAgREVDS0dMX01VVEFURV9DT0xPUihpbWFnZSwgdXYpO1xuXG4gIGZyYWdDb2xvciA9IGFwcGx5X29wYWNpdHkoY29sb3JfdGludChjb2xvcl9kZXNhdHVyYXRlKGltYWdlLnJnYikpLCByYXN0ZXIub3BhY2l0eSk7XG5cbiAgZ2VvbWV0cnkudXYgPSB1djtcbiAgREVDS0dMX0ZJTFRFUl9DT0xPUihmcmFnQ29sb3IsIGdlb21ldHJ5KTtcbn1cbmA7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFB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
@@ -0,0 +1,5 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Copyright contributors to the kepler.gl project
3
+
4
+ export default "#define SHADER_NAME raster-layer-fragment-shader\n\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nvarying vec2 vTexCoord;\nvarying vec2 vTexPos;\n\nuniform float desaturate;\nuniform vec4 transparentColor;\nuniform vec3 tintColor;\nuniform float opacity;\n\nuniform float coordinateConversion;\nuniform vec4 bounds;\n\n/* projection utils */\nconst float TILE_SIZE = 512.0;\nconst float PI = 3.1415926536;\nconst float WORLD_SCALE = TILE_SIZE / PI / 2.0;\n\n// from degrees to Web Mercator\nvec2 lnglat_to_mercator(vec2 lnglat) {\n float x = lnglat.x;\n float y = clamp(lnglat.y, -89.9, 89.9);\n return vec2(\n radians(x) + PI,\n PI + log(tan(PI * 0.25 + radians(y) * 0.5))\n ) * WORLD_SCALE;\n}\n\n// from Web Mercator to degrees\nvec2 mercator_to_lnglat(vec2 xy) {\n xy /= WORLD_SCALE;\n return degrees(vec2(\n xy.x - PI,\n atan(exp(xy.y - PI)) * 2.0 - PI * 0.5\n ));\n}\n/* End projection utils */\n\n// apply desaturation\nvec3 color_desaturate(vec3 color) {\n float luminance = (color.r + color.g + color.b) * 0.333333333;\n return mix(color, vec3(luminance), desaturate);\n}\n\n// apply tint\nvec3 color_tint(vec3 color) {\n return color * tintColor;\n}\n\n// blend with background color\nvec4 apply_opacity(vec3 color, float alpha) {\n if (transparentColor.a == 0.0) {\n return vec4(color, alpha);\n }\n float blendedAlpha = alpha + transparentColor.a * (1.0 - alpha);\n float highLightRatio = alpha / blendedAlpha;\n vec3 blendedRGB = mix(transparentColor.rgb, color, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n}\n\nvec2 getUV(vec2 pos) {\n return vec2(\n (pos.x - bounds[0]) / (bounds[2] - bounds[0]),\n (pos.y - bounds[3]) / (bounds[1] - bounds[3])\n );\n}\n\nvoid main(void) {\n vec2 uv = vTexCoord;\n if (coordinateConversion < -0.5) {\n vec2 lnglat = mercator_to_lnglat(vTexPos);\n uv = getUV(lnglat);\n } else if (coordinateConversion > 0.5) {\n vec2 commonPos = lnglat_to_mercator(vTexPos);\n uv = getUV(commonPos);\n }\n\n vec4 image;\n DECKGL_CREATE_COLOR(image, vTexCoord);\n\n DECKGL_MUTATE_COLOR(image, vTexCoord);\n\n gl_FragColor = apply_opacity(color_tint(color_desaturate(image.rgb)), opacity);\n\n geometry.uv = uv;\n DECKGL_FILTER_COLOR(gl_FragColor, geometry);\n}\n";
5
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Jhc3Rlci9yYXN0ZXItbGF5ZXIvcmFzdGVyLWxheWVyLXdlYmdsMS5mcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5leHBvcnQgZGVmYXVsdCBgXFxcbiNkZWZpbmUgU0hBREVSX05BTUUgcmFzdGVyLWxheWVyLWZyYWdtZW50LXNoYWRlclxuXG4jaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNlbmRpZlxuXG52YXJ5aW5nIHZlYzIgdlRleENvb3JkO1xudmFyeWluZyB2ZWMyIHZUZXhQb3M7XG5cbnVuaWZvcm0gZmxvYXQgZGVzYXR1cmF0ZTtcbnVuaWZvcm0gdmVjNCB0cmFuc3BhcmVudENvbG9yO1xudW5pZm9ybSB2ZWMzIHRpbnRDb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcblxudW5pZm9ybSBmbG9hdCBjb29yZGluYXRlQ29udmVyc2lvbjtcbnVuaWZvcm0gdmVjNCBib3VuZHM7XG5cbi8qIHByb2plY3Rpb24gdXRpbHMgKi9cbmNvbnN0IGZsb2F0IFRJTEVfU0laRSA9IDUxMi4wO1xuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzY7XG5jb25zdCBmbG9hdCBXT1JMRF9TQ0FMRSA9IFRJTEVfU0laRSAvIFBJIC8gMi4wO1xuXG4vLyBmcm9tIGRlZ3JlZXMgdG8gV2ViIE1lcmNhdG9yXG52ZWMyIGxuZ2xhdF90b19tZXJjYXRvcih2ZWMyIGxuZ2xhdCkge1xuICBmbG9hdCB4ID0gbG5nbGF0Lng7XG4gIGZsb2F0IHkgPSBjbGFtcChsbmdsYXQueSwgLTg5LjksIDg5LjkpO1xuICByZXR1cm4gdmVjMihcbiAgICByYWRpYW5zKHgpICsgUEksXG4gICAgUEkgKyBsb2codGFuKFBJICogMC4yNSArIHJhZGlhbnMoeSkgKiAwLjUpKVxuICApICogV09STERfU0NBTEU7XG59XG5cbi8vIGZyb20gV2ViIE1lcmNhdG9yIHRvIGRlZ3JlZXNcbnZlYzIgbWVyY2F0b3JfdG9fbG5nbGF0KHZlYzIgeHkpIHtcbiAgeHkgLz0gV09STERfU0NBTEU7XG4gIHJldHVybiBkZWdyZWVzKHZlYzIoXG4gICAgeHkueCAtIFBJLFxuICAgIGF0YW4oZXhwKHh5LnkgLSBQSSkpICogMi4wIC0gUEkgKiAwLjVcbiAgKSk7XG59XG4vKiBFbmQgcHJvamVjdGlvbiB1dGlscyAqL1xuXG4vLyBhcHBseSBkZXNhdHVyYXRpb25cbnZlYzMgY29sb3JfZGVzYXR1cmF0ZSh2ZWMzIGNvbG9yKSB7XG4gIGZsb2F0IGx1bWluYW5jZSA9IChjb2xvci5yICsgY29sb3IuZyArIGNvbG9yLmIpICogMC4zMzMzMzMzMzM7XG4gIHJldHVybiBtaXgoY29sb3IsIHZlYzMobHVtaW5hbmNlKSwgZGVzYXR1cmF0ZSk7XG59XG5cbi8vIGFwcGx5IHRpbnRcbnZlYzMgY29sb3JfdGludCh2ZWMzIGNvbG9yKSB7XG4gIHJldHVybiBjb2xvciAqIHRpbnRDb2xvcjtcbn1cblxuLy8gYmxlbmQgd2l0aCBiYWNrZ3JvdW5kIGNvbG9yXG52ZWM0IGFwcGx5X29wYWNpdHkodmVjMyBjb2xvciwgZmxvYXQgYWxwaGEpIHtcbiAgaWYgKHRyYW5zcGFyZW50Q29sb3IuYSA9PSAwLjApIHtcbiAgICByZXR1cm4gdmVjNChjb2xvciwgYWxwaGEpO1xuICB9XG4gIGZsb2F0IGJsZW5kZWRBbHBoYSA9IGFscGhhICsgdHJhbnNwYXJlbnRDb2xvci5hICogKDEuMCAtIGFscGhhKTtcbiAgZmxvYXQgaGlnaExpZ2h0UmF0aW8gPSBhbHBoYSAvIGJsZW5kZWRBbHBoYTtcbiAgdmVjMyBibGVuZGVkUkdCID0gbWl4KHRyYW5zcGFyZW50Q29sb3IucmdiLCBjb2xvciwgaGlnaExpZ2h0UmF0aW8pO1xuICByZXR1cm4gdmVjNChibGVuZGVkUkdCLCBibGVuZGVkQWxwaGEpO1xufVxuXG52ZWMyIGdldFVWKHZlYzIgcG9zKSB7XG4gIHJldHVybiB2ZWMyKFxuICAgIChwb3MueCAtIGJvdW5kc1swXSkgLyAoYm91bmRzWzJdIC0gYm91bmRzWzBdKSxcbiAgICAocG9zLnkgLSBib3VuZHNbM10pIC8gKGJvdW5kc1sxXSAtIGJvdW5kc1szXSlcbiAgKTtcbn1cblxudm9pZCBtYWluKHZvaWQpIHtcbiAgdmVjMiB1diA9IHZUZXhDb29yZDtcbiAgaWYgKGNvb3JkaW5hdGVDb252ZXJzaW9uIDwgLTAuNSkge1xuICAgIHZlYzIgbG5nbGF0ID0gbWVyY2F0b3JfdG9fbG5nbGF0KHZUZXhQb3MpO1xuICAgIHV2ID0gZ2V0VVYobG5nbGF0KTtcbiAgfSBlbHNlIGlmIChjb29yZGluYXRlQ29udmVyc2lvbiA+IDAuNSkge1xuICAgIHZlYzIgY29tbW9uUG9zID0gbG5nbGF0X3RvX21lcmNhdG9yKHZUZXhQb3MpO1xuICAgIHV2ID0gZ2V0VVYoY29tbW9uUG9zKTtcbiAgfVxuXG4gIHZlYzQgaW1hZ2U7XG4gIERFQ0tHTF9DUkVBVEVfQ09MT1IoaW1hZ2UsIHZUZXhDb29yZCk7XG5cbiAgREVDS0dMX01VVEFURV9DT0xPUihpbWFnZSwgdlRleENvb3JkKTtcblxuICBnbF9GcmFnQ29sb3IgPSBhcHBseV9vcGFjaXR5KGNvbG9yX3RpbnQoY29sb3JfZGVzYXR1cmF0ZShpbWFnZS5yZ2IpKSwgb3BhY2l0eSk7XG5cbiAgZ2VvbWV0cnkudXYgPSB1djtcbiAgREVDS0dMX0ZJTFRFUl9DT0xPUihnbF9GcmFnQ29sb3IsIGdlb21ldHJ5KTtcbn1cbmA7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUEiLCJpZ25vcmVMaXN0IjpbXX0=