@kepler.gl/deckgl-layers 3.3.0-alpha.1 → 3.3.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) 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/cjs/globe/index.js +140 -0
  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/cjs/index.js +163 -0
  20. package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
  21. package/dist/cjs/layer-utils/cluster-utils.js +95 -0
  22. package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
  23. package/dist/cjs/layer-utils/globe-cell-utils.js +203 -0
  24. package/dist/cjs/layer-utils/globe-cell-utils.spec.js +118 -0
  25. package/dist/cjs/layer-utils/shader-utils.js +38 -0
  26. package/dist/cjs/line-layer/line-layer.js +95 -0
  27. package/dist/cjs/raster/images.js +271 -0
  28. package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
  29. package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
  30. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
  31. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
  32. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
  33. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
  34. package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
  35. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
  36. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
  37. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
  38. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
  39. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
  40. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
  41. package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
  42. package/dist/cjs/raster/types.js +6 -0
  43. package/dist/cjs/raster/util.js +139 -0
  44. package/dist/cjs/raster/webgl/color/colormap.js +45 -0
  45. package/dist/cjs/raster/webgl/color/filter.js +58 -0
  46. package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
  47. package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
  48. package/dist/cjs/raster/webgl/color/saturation.js +42 -0
  49. package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
  50. package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
  51. package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
  52. package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
  53. package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
  54. package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
  55. package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
  56. package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
  57. package/dist/cjs/raster/webgl/texture/mask.js +50 -0
  58. package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
  59. package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
  60. package/dist/cjs/raster/webgl/types.js +6 -0
  61. package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
  62. package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
  63. package/dist/cjs/wms/wms-layer.js +624 -0
  64. package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
  65. package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
  66. package/dist/esm/3d-building-layer/types.js +3 -0
  67. package/dist/esm/cluster-layer/cluster-layer.js +286 -0
  68. package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
  69. package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
  70. package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
  71. package/dist/esm/globe/atmosphere-layer.js +335 -0
  72. package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
  73. package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
  74. package/dist/esm/globe/globe-layers.js +566 -0
  75. package/dist/esm/globe/globe-stars-layer.js +92 -0
  76. package/dist/esm/globe/globe-stars-layer.spec.js +40 -0
  77. package/dist/esm/globe/globe-view.js +398 -0
  78. package/dist/esm/globe/index.js +26 -0
  79. package/dist/esm/globe/mvt-label-layer.js +187 -0
  80. package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
  81. package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
  82. package/dist/esm/index.js +22 -0
  83. package/dist/esm/layer-utils/aggregation-utils.js +172 -0
  84. package/dist/esm/layer-utils/cluster-utils.js +89 -0
  85. package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
  86. package/dist/esm/layer-utils/globe-cell-utils.js +197 -0
  87. package/dist/esm/layer-utils/globe-cell-utils.spec.js +115 -0
  88. package/dist/esm/layer-utils/shader-utils.js +32 -0
  89. package/dist/esm/line-layer/line-layer.js +91 -0
  90. package/dist/esm/raster/images.js +267 -0
  91. package/dist/esm/raster/pipeline-validation-patch.js +94 -0
  92. package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
  93. package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
  94. package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
  95. package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
  96. package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
  97. package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
  98. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
  99. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
  100. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
  101. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
  102. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
  103. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
  104. package/dist/esm/raster/raster-processing-uniforms.js +118 -0
  105. package/dist/esm/raster/types.js +3 -0
  106. package/dist/esm/raster/util.js +134 -0
  107. package/dist/esm/raster/webgl/color/colormap.js +39 -0
  108. package/dist/esm/raster/webgl/color/filter.js +52 -0
  109. package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
  110. package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
  111. package/dist/esm/raster/webgl/color/saturation.js +36 -0
  112. package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
  113. package/dist/esm/raster/webgl/index.js +26 -0
  114. package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
  115. package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
  116. package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
  117. package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
  118. package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
  119. package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
  120. package/dist/esm/raster/webgl/texture/mask.js +44 -0
  121. package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
  122. package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
  123. package/dist/esm/raster/webgl/types.js +3 -0
  124. package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
  125. package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
  126. package/dist/esm/wms/wms-layer.js +619 -0
  127. package/dist/globe/atmosphere-layer.d.ts +58 -0
  128. package/dist/globe/enhanced-multi-icon-layer.d.ts +6 -0
  129. package/dist/globe/globe-depth-disk-layer.d.ts +19 -0
  130. package/dist/globe/globe-layers.d.ts +108 -0
  131. package/dist/globe/globe-stars-layer.d.ts +10 -0
  132. package/dist/globe/globe-stars-layer.spec.d.ts +1 -0
  133. package/dist/globe/globe-view.d.ts +23 -0
  134. package/dist/globe/index.d.ts +8 -0
  135. package/dist/globe/mvt-label-layer.d.ts +7928 -0
  136. package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +138 -56
  137. package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +138 -56
  138. package/dist/index.d.ts +1 -0
  139. package/dist/layer-utils/cluster-utils.d.ts +6 -1
  140. package/dist/layer-utils/globe-cell-utils.d.ts +30 -0
  141. package/dist/layer-utils/globe-cell-utils.spec.d.ts +1 -0
  142. package/dist/raster/images.d.ts +10 -1
  143. package/dist/raster/raster-layer/raster-layer.d.ts +4 -0
  144. package/dist/raster/raster-mesh-layer/raster-mesh-layer.d.ts +4 -0
  145. package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +4 -1
  146. package/dist/wms/wms-layer.d.ts +27 -0
  147. package/package.json +22 -13
  148. package/dist/3d-building-layer/3d-building-layer.js +0 -66
  149. package/dist/3d-building-layer/3d-building-utils.js +0 -166
  150. package/dist/3d-building-layer/types.js +0 -6
  151. package/dist/cluster-layer/cluster-layer.js +0 -293
  152. package/dist/column-layer/enhanced-column-layer.js +0 -135
  153. package/dist/deckgl-extensions/filter-shader-module.js +0 -26
  154. package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -90
  155. package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -108
  156. package/dist/index.js +0 -152
  157. package/dist/layer-utils/aggregation-utils.js +0 -181
  158. package/dist/layer-utils/cluster-utils.js +0 -93
  159. package/dist/layer-utils/cpu-aggregator.js +0 -798
  160. package/dist/layer-utils/shader-utils.js +0 -38
  161. package/dist/line-layer/line-layer.js +0 -95
  162. package/dist/raster/images.js +0 -259
  163. package/dist/raster/pipeline-validation-patch.js +0 -101
  164. package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
  165. package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
  166. package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
  167. package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
  168. package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
  169. package/dist/raster/raster-layer/raster-layer.js +0 -237
  170. package/dist/raster/raster-mesh-layer/matrix.d.ts +0 -4
  171. package/dist/raster/raster-mesh-layer/matrix.js +0 -18
  172. package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
  173. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
  174. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
  175. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
  176. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
  177. package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -271
  178. package/dist/raster/raster-processing-uniforms.js +0 -124
  179. package/dist/raster/types.js +0 -6
  180. package/dist/raster/util.js +0 -139
  181. package/dist/raster/webgl/color/colormap.js +0 -45
  182. package/dist/raster/webgl/color/filter.js +0 -58
  183. package/dist/raster/webgl/color/gamma-contrast.js +0 -68
  184. package/dist/raster/webgl/color/linear-rescale.js +0 -35
  185. package/dist/raster/webgl/color/saturation.js +0 -42
  186. package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
  187. package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
  188. package/dist/raster/webgl/spectral-indices/evi.js +0 -26
  189. package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
  190. package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
  191. package/dist/raster/webgl/spectral-indices/savi.js +0 -21
  192. package/dist/raster/webgl/texture/combine-bands.js +0 -65
  193. package/dist/raster/webgl/texture/mask.js +0 -50
  194. package/dist/raster/webgl/texture/reorder-bands.js +0 -72
  195. package/dist/raster/webgl/texture/rgba-image.js +0 -34
  196. package/dist/raster/webgl/types.js +0 -6
  197. package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -51
  198. package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
  199. package/dist/wms/wms-layer.js +0 -424
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.loadImages = loadImages;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _constants = require("@luma.gl/constants");
10
+ var _isEqual = _interopRequireDefault(require("es-toolkit/compat/isEqual"));
11
+ var _constants2 = require("@kepler.gl/constants");
12
+ 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; }
13
+ 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) { (0, _defineProperty2["default"])(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; }
14
+ 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; } } }; }
15
+ 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; } }
16
+ 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; } // SPDX-License-Identifier: MIT
17
+ // Copyright contributors to the kepler.gl project
18
+ // @ts-ignore GL resolution depends on moduleResolution setting
19
+ /**
20
+ * Legacy texture creation descriptor used by raster shader modules.
21
+ * Contains CPU-side data + old GL-enum-based parameters that get
22
+ * translated to luma.gl 9's device.createTexture() props.
23
+ */
24
+
25
+ /**
26
+ * Texture sampler parameters for luma.gl 9 textures
27
+ */
28
+ var DEFAULT_SAMPLER_PARAMETERS = {
29
+ minFilter: _constants2.FILTER_MODE.NEAREST,
30
+ magFilter: _constants2.FILTER_MODE.NEAREST,
31
+ addressModeU: _constants2.ADDRESS_MODE.CLAMP_TO_EDGE,
32
+ addressModeV: _constants2.ADDRESS_MODE.CLAMP_TO_EDGE
33
+ };
34
+
35
+ /** luma.gl device interface for texture creation */
36
+
37
+ /**
38
+ * Load image items to webgl context
39
+ */
40
+ function loadImageItem(gl, device, imageItem) {
41
+ var result;
42
+ if (Array.isArray(imageItem)) {
43
+ var dirtyResult = imageItem.map(function (x) {
44
+ return loadTexture(gl, device, x);
45
+ });
46
+ result = [];
47
+ var _iterator = _createForOfIteratorHelper(dirtyResult),
48
+ _step;
49
+ try {
50
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
51
+ var texture = _step.value;
52
+ if (texture) {
53
+ result.push(texture);
54
+ }
55
+ }
56
+ } catch (err) {
57
+ _iterator.e(err);
58
+ } finally {
59
+ _iterator.f();
60
+ }
61
+ if (!result.length) {
62
+ result = null;
63
+ }
64
+ } else {
65
+ result = loadTexture(gl, device, imageItem);
66
+ }
67
+ return result;
68
+ }
69
+
70
+ /**
71
+ * Load image items to webgl context
72
+ */
73
+
74
+ // eslint-disable-next-line complexity
75
+ function loadImages(_ref) {
76
+ var gl = _ref.gl,
77
+ device = _ref.device,
78
+ images = _ref.images,
79
+ imagesData = _ref.imagesData,
80
+ oldImagesData = _ref.oldImagesData;
81
+ var imagesDirty = false;
82
+ var hasPendingUploads = false;
83
+ if (oldImagesData) {
84
+ for (var key in oldImagesData) {
85
+ if (imagesData && !(key in imagesData) && key in images) {
86
+ delete images[key];
87
+ imagesDirty = true;
88
+ }
89
+ }
90
+ }
91
+ var changedKeys = [];
92
+ for (var _key in imagesData) {
93
+ if (!oldImagesData || oldImagesData && !(_key in oldImagesData)) {
94
+ changedKeys.push(_key);
95
+ continue;
96
+ }
97
+ if (!(0, _isEqual["default"])(imagesData[_key], oldImagesData[_key])) {
98
+ changedKeys.push(_key);
99
+ }
100
+ }
101
+ for (var _i = 0, _changedKeys = changedKeys; _i < _changedKeys.length; _i++) {
102
+ var _key2 = _changedKeys[_i];
103
+ var imageData = imagesData[_key2];
104
+ if (!imageData) {
105
+ continue;
106
+ }
107
+ var loadedItem = loadImageItem(gl, device, imageData);
108
+ if (loadedItem) {
109
+ images[_key2] = loadedItem;
110
+ // Only mark dirty when the texture was actually uploaded.
111
+ imagesDirty = true;
112
+ } else {
113
+ // Upload failed (device not ready or createTexture threw). Signal that
114
+ // the caller should retry next frame — do NOT set imagesDirty so we
115
+ // don't propagate an images object with a missing key that causes
116
+ // draw() to bail permanently.
117
+ hasPendingUploads = true;
118
+ }
119
+ }
120
+ return {
121
+ images: imagesDirty ? images : null,
122
+ hasPendingUploads: hasPendingUploads
123
+ };
124
+ }
125
+
126
+ /**
127
+ * Map old GL texture parameter constants to luma.gl 9 sampler parameters
128
+ */
129
+ function mapSamplerParameters(oldParams) {
130
+ var result = _objectSpread({}, DEFAULT_SAMPLER_PARAMETERS);
131
+ var magFilterMap = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.GL.NEAREST, _constants2.FILTER_MODE.NEAREST), _constants.GL.LINEAR, _constants2.FILTER_MODE.LINEAR);
132
+ var minFilterMap = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.GL.NEAREST, {
133
+ minFilter: _constants2.FILTER_MODE.NEAREST
134
+ }), _constants.GL.LINEAR, {
135
+ minFilter: _constants2.FILTER_MODE.LINEAR
136
+ }), _constants.GL.NEAREST_MIPMAP_NEAREST, {
137
+ minFilter: _constants2.FILTER_MODE.NEAREST,
138
+ mipmapFilter: _constants2.FILTER_MODE.NEAREST
139
+ }), _constants.GL.NEAREST_MIPMAP_LINEAR, {
140
+ minFilter: _constants2.FILTER_MODE.NEAREST,
141
+ mipmapFilter: _constants2.FILTER_MODE.LINEAR
142
+ }), _constants.GL.LINEAR_MIPMAP_NEAREST, {
143
+ minFilter: _constants2.FILTER_MODE.LINEAR,
144
+ mipmapFilter: _constants2.FILTER_MODE.NEAREST
145
+ }), _constants.GL.LINEAR_MIPMAP_LINEAR, {
146
+ minFilter: _constants2.FILTER_MODE.LINEAR,
147
+ mipmapFilter: _constants2.FILTER_MODE.LINEAR
148
+ });
149
+ var wrapMap = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.GL.CLAMP_TO_EDGE, _constants2.ADDRESS_MODE.CLAMP_TO_EDGE), _constants.GL.REPEAT, _constants2.ADDRESS_MODE.REPEAT), _constants.GL.MIRRORED_REPEAT, _constants2.ADDRESS_MODE.MIRROR_REPEAT);
150
+ if (oldParams) {
151
+ if (oldParams[_constants.GL.TEXTURE_MIN_FILTER] !== undefined) {
152
+ var mapped = minFilterMap[oldParams[_constants.GL.TEXTURE_MIN_FILTER]];
153
+ if (mapped) {
154
+ result.minFilter = mapped.minFilter;
155
+ if (mapped.mipmapFilter) {
156
+ result.mipmapFilter = mapped.mipmapFilter;
157
+ }
158
+ }
159
+ }
160
+ if (oldParams[_constants.GL.TEXTURE_MAG_FILTER] !== undefined) {
161
+ result.magFilter = magFilterMap[oldParams[_constants.GL.TEXTURE_MAG_FILTER]] || _constants2.FILTER_MODE.NEAREST;
162
+ }
163
+ if (oldParams[_constants.GL.TEXTURE_WRAP_S] !== undefined) {
164
+ result.addressModeU = wrapMap[oldParams[_constants.GL.TEXTURE_WRAP_S]] || _constants2.ADDRESS_MODE.CLAMP_TO_EDGE;
165
+ }
166
+ if (oldParams[_constants.GL.TEXTURE_WRAP_T] !== undefined) {
167
+ result.addressModeV = wrapMap[oldParams[_constants.GL.TEXTURE_WRAP_T]] || _constants2.ADDRESS_MODE.CLAMP_TO_EDGE;
168
+ }
169
+ }
170
+ return result;
171
+ }
172
+
173
+ /**
174
+ * Map old GL format/type to luma.gl 9 texture format string
175
+ */
176
+ function mapTextureFormat(glFormat, _glType) {
177
+ switch (glFormat) {
178
+ case _constants.GL.R8UI:
179
+ return _constants2.TEXTURE_FORMAT.R8_UINT;
180
+ case _constants.GL.R16UI:
181
+ return _constants2.TEXTURE_FORMAT.R16_UINT;
182
+ case _constants.GL.R32UI:
183
+ return _constants2.TEXTURE_FORMAT.R32_UINT;
184
+ case _constants.GL.R8I:
185
+ return _constants2.TEXTURE_FORMAT.R8_SINT;
186
+ case _constants.GL.R16I:
187
+ return _constants2.TEXTURE_FORMAT.R16_SINT;
188
+ case _constants.GL.R32I:
189
+ return _constants2.TEXTURE_FORMAT.R32_SINT;
190
+ case _constants.GL.R32F:
191
+ return _constants2.TEXTURE_FORMAT.R32_FLOAT;
192
+ case _constants.GL.RGBA:
193
+ return _constants2.TEXTURE_FORMAT.RGBA8_UNORM;
194
+ case _constants.GL.RGB:
195
+ return _constants2.TEXTURE_FORMAT.RGBA8_UNORM;
196
+ default:
197
+ return _constants2.TEXTURE_FORMAT.RGBA8_UNORM;
198
+ }
199
+ }
200
+
201
+ /**
202
+ * Expand 3-byte-per-pixel RGB data to 4-byte-per-pixel RGBA.
203
+ * Needed because WebGPU/luma.gl 9 has no 3-channel texture format.
204
+ */
205
+ function expandRGBtoRGBA(data, width, height) {
206
+ var pixelCount = width * height;
207
+ var rgba = new Uint8Array(pixelCount * 4);
208
+ for (var i = 0; i < pixelCount; i++) {
209
+ rgba[i * 4] = data[i * 3];
210
+ rgba[i * 4 + 1] = data[i * 3 + 1];
211
+ rgba[i * 4 + 2] = data[i * 3 + 2];
212
+ rgba[i * 4 + 3] = 255;
213
+ }
214
+ return rgba;
215
+ }
216
+
217
+ /**
218
+ * Create texture object from image data using luma.gl 9 device API.
219
+ * Returns a proper luma.gl Texture object that works with the binding system.
220
+ */
221
+ function loadTexture(gl, device, imageData) {
222
+ var _rasterTextureData$id, _rasterTextureData$id2, _gl$luma;
223
+ if (!imageData) {
224
+ return null;
225
+ }
226
+
227
+ // If already a luma.gl Texture instance, return as-is
228
+ var rasterTextureData = imageData;
229
+ 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) {
230
+ return imageData;
231
+ }
232
+ var rawData = imageData;
233
+
234
+ // @ts-expect-error luma internal properties not in WebGL2RenderingContext type
235
+ var lumaDevice = device || ((_gl$luma = gl.luma) === null || _gl$luma === void 0 ? void 0 : _gl$luma.device) || gl.__luma_device;
236
+ if (!(lumaDevice !== null && lumaDevice !== void 0 && lumaDevice.createTexture)) {
237
+ console.warn('RasterLayer: No luma.gl device available for texture creation');
238
+ return null;
239
+ }
240
+ try {
241
+ var _rawData$data, _rawData$data2;
242
+ var samplerParams = mapSamplerParameters(rawData.parameters || {});
243
+ var textureFormat = rawData.format ? mapTextureFormat(rawData.format, rawData.type) : _constants2.TEXTURE_FORMAT.RGBA8_UNORM;
244
+ var width = rawData.width || ((_rawData$data = rawData.data) === null || _rawData$data === void 0 ? void 0 : _rawData$data.width) || 1;
245
+ var height = rawData.height || ((_rawData$data2 = rawData.data) === null || _rawData$data2 === void 0 ? void 0 : _rawData$data2.height) || 1;
246
+ var textureProps = _objectSpread({
247
+ width: width,
248
+ height: height,
249
+ format: textureFormat,
250
+ sampler: samplerParams
251
+ }, rawData.mipmaps === false ? {
252
+ mipmaps: false
253
+ } : {});
254
+ if (rawData.data) {
255
+ if (rawData.data instanceof HTMLImageElement || rawData.data instanceof HTMLCanvasElement || rawData.data instanceof ImageBitmap || rawData.data instanceof ImageData) {
256
+ textureProps.data = rawData.data;
257
+ } else if (ArrayBuffer.isView(rawData.data)) {
258
+ if (rawData.format === _constants.GL.RGB && (rawData.data instanceof Uint8Array || rawData.data instanceof Uint8ClampedArray)) {
259
+ textureProps.data = expandRGBtoRGBA(rawData.data, width, height);
260
+ } else {
261
+ textureProps.data = rawData.data;
262
+ }
263
+ }
264
+ }
265
+ return lumaDevice.createTexture(textureProps);
266
+ } catch (e) {
267
+ console.warn('RasterLayer: Failed to create texture via device.createTexture:', e);
268
+ return null;
269
+ }
270
+ }
271
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9pc0VxdWFsIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb25zdGFudHMyIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiREVGQVVMVF9TQU1QTEVSX1BBUkFNRVRFUlMiLCJtaW5GaWx0ZXIiLCJGSUxURVJfTU9ERSIsIk5FQVJFU1QiLCJtYWdGaWx0ZXIiLCJhZGRyZXNzTW9kZVUiLCJBRERSRVNTX01PREUiLCJDTEFNUF9UT19FREdFIiwiYWRkcmVzc01vZGVWIiwibG9hZEltYWdlSXRlbSIsImdsIiwiZGV2aWNlIiwiaW1hZ2VJdGVtIiwicmVzdWx0IiwiZGlydHlSZXN1bHQiLCJtYXAiLCJ4IiwibG9hZFRleHR1cmUiLCJfaXRlcmF0b3IiLCJfc3RlcCIsInRleHR1cmUiLCJlcnIiLCJsb2FkSW1hZ2VzIiwiX3JlZiIsImltYWdlcyIsImltYWdlc0RhdGEiLCJvbGRJbWFnZXNEYXRhIiwiaW1hZ2VzRGlydHkiLCJoYXNQZW5kaW5nVXBsb2FkcyIsImtleSIsImNoYW5nZWRLZXlzIiwiaXNFcXVhbCIsIl9pIiwiX2NoYW5nZWRLZXlzIiwiaW1hZ2VEYXRhIiwibG9hZGVkSXRlbSIsIm1hcFNhbXBsZXJQYXJhbWV0ZXJzIiwib2xkUGFyYW1zIiwibWFnRmlsdGVyTWFwIiwiR0wiLCJMSU5FQVIiLCJtaW5GaWx0ZXJNYXAiLCJORUFSRVNUX01JUE1BUF9ORUFSRVNUIiwibWlwbWFwRmlsdGVyIiwiTkVBUkVTVF9NSVBNQVBfTElORUFSIiwiTElORUFSX01JUE1BUF9ORUFSRVNUIiwiTElORUFSX01JUE1BUF9MSU5FQVIiLCJ3cmFwTWFwIiwiUkVQRUFUIiwiTUlSUk9SRURfUkVQRUFUIiwiTUlSUk9SX1JFUEVBVCIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsInVuZGVmaW5lZCIsIm1hcHBlZCIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsIlRFWFRVUkVfV1JBUF9TIiwiVEVYVFVSRV9XUkFQX1QiLCJtYXBUZXh0dXJlRm9ybWF0IiwiZ2xGb3JtYXQiLCJfZ2xUeXBlIiwiUjhVSSIsIlRFWFRVUkVfRk9STUFUIiwiUjhfVUlOVCIsIlIxNlVJIiwiUjE2X1VJTlQiLCJSMzJVSSIsIlIzMl9VSU5UIiwiUjhJIiwiUjhfU0lOVCIsIlIxNkkiLCJSMTZfU0lOVCIsIlIzMkkiLCJSMzJfU0lOVCIsIlIzMkYiLCJSMzJfRkxPQVQiLCJSR0JBIiwiUkdCQThfVU5PUk0iLCJSR0IiLCJleHBhbmRSR0J0b1JHQkEiLCJkYXRhIiwid2lkdGgiLCJoZWlnaHQiLCJwaXhlbENvdW50IiwicmdiYSIsIlVpbnQ4QXJyYXkiLCJpIiwiX3Jhc3RlclRleHR1cmVEYXRhJGlkIiwiX3Jhc3RlclRleHR1cmVEYXRhJGlkMiIsIl9nbCRsdW1hIiwicmFzdGVyVGV4dHVyZURhdGEiLCJoYW5kbGUiLCJpZCIsInN0YXJ0c1dpdGgiLCJyYXdEYXRhIiwibHVtYURldmljZSIsImx1bWEiLCJfX2x1bWFfZGV2aWNlIiwiY3JlYXRlVGV4dHVyZSIsImNvbnNvbGUiLCJ3YXJuIiwiX3Jhd0RhdGEkZGF0YSIsIl9yYXdEYXRhJGRhdGEyIiwic2FtcGxlclBhcmFtcyIsInBhcmFtZXRlcnMiLCJ0ZXh0dXJlRm9ybWF0IiwiZm9ybWF0IiwidHlwZSIsInRleHR1cmVQcm9wcyIsInNhbXBsZXIiLCJtaXBtYXBzIiwiSFRNTEltYWdlRWxlbWVudCIsIkhUTUxDYW52YXNFbGVtZW50IiwiSW1hZ2VCaXRtYXAiLCJJbWFnZURhdGEiLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsIlVpbnQ4Q2xhbXBlZEFycmF5Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Jhc3Rlci9pbWFnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLy8gQHRzLWlnbm9yZSBHTCByZXNvbHV0aW9uIGRlcGVuZHMgb24gbW9kdWxlUmVzb2x1dGlvbiBzZXR0aW5nXG5pbXBvcnQge0dMfSBmcm9tICdAbHVtYS5nbC9jb25zdGFudHMnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnZXMtdG9vbGtpdC9jb21wYXQvaXNFcXVhbCc7XG5cbmltcG9ydCB7RklMVEVSX01PREUsIEFERFJFU1NfTU9ERSwgVEVYVFVSRV9GT1JNQVR9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB0eXBlIHtUZXh0dXJlfSBmcm9tICdAbHVtYS5nbC9jb3JlJztcbmltcG9ydCB0eXBlIHtJbWFnZUlucHV0LCBJbWFnZVN0YXRlfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBMZWdhY3kgdGV4dHVyZSBjcmVhdGlvbiBkZXNjcmlwdG9yIHVzZWQgYnkgcmFzdGVyIHNoYWRlciBtb2R1bGVzLlxuICogQ29udGFpbnMgQ1BVLXNpZGUgZGF0YSArIG9sZCBHTC1lbnVtLWJhc2VkIHBhcmFtZXRlcnMgdGhhdCBnZXRcbiAqIHRyYW5zbGF0ZWQgdG8gbHVtYS5nbCA5J3MgZGV2aWNlLmNyZWF0ZVRleHR1cmUoKSBwcm9wcy5cbiAqL1xudHlwZSBUZXh0dXJlRGF0YVNvdXJjZSA9XG4gIHwgSFRNTEltYWdlRWxlbWVudFxuICB8IEhUTUxDYW52YXNFbGVtZW50XG4gIHwgSW1hZ2VCaXRtYXBcbiAgfCBJbWFnZURhdGFcbiAgfCBBcnJheUJ1ZmZlclZpZXc7XG5cbnR5cGUgUmFzdGVyVGV4dHVyZURhdGEgPSB7XG4gIGhhbmRsZT86IHVua25vd247XG4gIGlkPzogc3RyaW5nO1xuICBkZXZpY2U/OiB1bmtub3duO1xuICB3aWR0aD86IG51bWJlcjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xuICBmb3JtYXQ/OiBudW1iZXI7XG4gIHR5cGU/OiBudW1iZXI7XG4gIHBhcmFtZXRlcnM/OiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+O1xuICBtaXBtYXBzPzogYm9vbGVhbjtcbiAgZGF0YT86IFRleHR1cmVEYXRhU291cmNlICYge3dpZHRoPzogbnVtYmVyOyBoZWlnaHQ/OiBudW1iZXJ9O1xufTtcblxuLyoqXG4gKiBUZXh0dXJlIHNhbXBsZXIgcGFyYW1ldGVycyBmb3IgbHVtYS5nbCA5IHRleHR1cmVzXG4gKi9cbmNvbnN0IERFRkFVTFRfU0FNUExFUl9QQVJBTUVURVJTID0ge1xuICBtaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1QsXG4gIG1hZ0ZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVCxcbiAgYWRkcmVzc01vZGVVOiBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRSxcbiAgYWRkcmVzc01vZGVWOiBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRVxufTtcblxuLyoqIGx1bWEuZ2wgZGV2aWNlIGludGVyZmFjZSBmb3IgdGV4dHVyZSBjcmVhdGlvbiAqL1xuaW50ZXJmYWNlIEx1bWFEZXZpY2Uge1xuICBjcmVhdGVUZXh0dXJlKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFRleHR1cmU7XG4gIGdsPzogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbn1cblxudHlwZSBMb2FkSW1hZ2VzT3B0aW9ucyA9IHtcbiAgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gIGRldmljZT86IEx1bWFEZXZpY2U7XG4gIGltYWdlczogSW1hZ2VTdGF0ZTtcbiAgaW1hZ2VzRGF0YTogSW1hZ2VJbnB1dDtcbiAgb2xkSW1hZ2VzRGF0YTogSW1hZ2VJbnB1dDtcbn07XG5cbi8qKlxuICogTG9hZCBpbWFnZSBpdGVtcyB0byB3ZWJnbCBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGxvYWRJbWFnZUl0ZW0oXG4gIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LFxuICBkZXZpY2U6IEx1bWFEZXZpY2UgfCB1bmRlZmluZWQsXG4gIGltYWdlSXRlbTogUmFzdGVyVGV4dHVyZURhdGEgfCBUZXh0dXJlIHwgKFJhc3RlclRleHR1cmVEYXRhIHwgVGV4dHVyZSlbXVxuKTogbnVsbCB8IFRleHR1cmUgfCBUZXh0dXJlW10ge1xuICBsZXQgcmVzdWx0OiBudWxsIHwgVGV4dHVyZSB8IFRleHR1cmVbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW1hZ2VJdGVtKSkge1xuICAgIGNvbnN0IGRpcnR5UmVzdWx0ID0gaW1hZ2VJdGVtLm1hcCh4ID0+IGxvYWRUZXh0dXJlKGdsLCBkZXZpY2UsIHgpKTtcbiAgICByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRleHR1cmUgb2YgZGlydHlSZXN1bHQpIHtcbiAgICAgIGlmICh0ZXh0dXJlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRleHR1cmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IGxvYWRUZXh0dXJlKGdsLCBkZXZpY2UsIGltYWdlSXRlbSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBMb2FkIGltYWdlIGl0ZW1zIHRvIHdlYmdsIGNvbnRleHRcbiAqL1xudHlwZSBMb2FkSW1hZ2VzUmVzdWx0ID0ge1xuICAvKiogVXBkYXRlZCBpbWFnZXMgc3RhdGUsIG9yIG51bGwgaWYgbm90aGluZyBjaGFuZ2VkICovXG4gIGltYWdlczogSW1hZ2VTdGF0ZSB8IG51bGw7XG4gIC8qKiBUcnVlIHdoZW4gYXQgbGVhc3Qgb25lIHRleHR1cmUgdXBsb2FkIGZhaWxlZCBhbmQgc2hvdWxkIGJlIHJldHJpZWQgKi9cbiAgaGFzUGVuZGluZ1VwbG9hZHM6IGJvb2xlYW47XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRJbWFnZXMoe1xuICBnbCxcbiAgZGV2aWNlLFxuICBpbWFnZXMsXG4gIGltYWdlc0RhdGEsXG4gIG9sZEltYWdlc0RhdGFcbn06IExvYWRJbWFnZXNPcHRpb25zKTogTG9hZEltYWdlc1Jlc3VsdCB7XG4gIGxldCBpbWFnZXNEaXJ0eSA9IGZhbHNlO1xuICBsZXQgaGFzUGVuZGluZ1VwbG9hZHMgPSBmYWxzZTtcblxuICBpZiAob2xkSW1hZ2VzRGF0YSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9sZEltYWdlc0RhdGEpIHtcbiAgICAgIGlmIChpbWFnZXNEYXRhICYmICEoa2V5IGluIGltYWdlc0RhdGEpICYmIGtleSBpbiBpbWFnZXMpIHtcbiAgICAgICAgZGVsZXRlIGltYWdlc1trZXldO1xuICAgICAgICBpbWFnZXNEaXJ0eSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2hhbmdlZEtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IGluIGltYWdlc0RhdGEpIHtcbiAgICBpZiAoIW9sZEltYWdlc0RhdGEgfHwgKG9sZEltYWdlc0RhdGEgJiYgIShrZXkgaW4gb2xkSW1hZ2VzRGF0YSkpKSB7XG4gICAgICBjaGFuZ2VkS2V5cy5wdXNoKGtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRXF1YWwoaW1hZ2VzRGF0YVtrZXldLCBvbGRJbWFnZXNEYXRhW2tleV0pKSB7XG4gICAgICBjaGFuZ2VkS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgY2hhbmdlZEtleXMpIHtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZXNEYXRhW2tleV07XG4gICAgaWYgKCFpbWFnZURhdGEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZEl0ZW0gPSBsb2FkSW1hZ2VJdGVtKGdsLCBkZXZpY2UsIGltYWdlRGF0YSk7XG4gICAgaWYgKGxvYWRlZEl0ZW0pIHtcbiAgICAgIGltYWdlc1trZXldID0gbG9hZGVkSXRlbTtcbiAgICAgIC8vIE9ubHkgbWFyayBkaXJ0eSB3aGVuIHRoZSB0ZXh0dXJlIHdhcyBhY3R1YWxseSB1cGxvYWRlZC5cbiAgICAgIGltYWdlc0RpcnR5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBsb2FkIGZhaWxlZCAoZGV2aWNlIG5vdCByZWFkeSBvciBjcmVhdGVUZXh0dXJlIHRocmV3KS4gU2lnbmFsIHRoYXRcbiAgICAgIC8vIHRoZSBjYWxsZXIgc2hvdWxkIHJldHJ5IG5leHQgZnJhbWUg4oCUIGRvIE5PVCBzZXQgaW1hZ2VzRGlydHkgc28gd2VcbiAgICAgIC8vIGRvbid0IHByb3BhZ2F0ZSBhbiBpbWFnZXMgb2JqZWN0IHdpdGggYSBtaXNzaW5nIGtleSB0aGF0IGNhdXNlc1xuICAgICAgLy8gZHJhdygpIHRvIGJhaWwgcGVybWFuZW50bHkuXG4gICAgICBoYXNQZW5kaW5nVXBsb2FkcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtpbWFnZXM6IGltYWdlc0RpcnR5ID8gaW1hZ2VzIDogbnVsbCwgaGFzUGVuZGluZ1VwbG9hZHN9O1xufVxuXG4vKipcbiAqIE1hcCBvbGQgR0wgdGV4dHVyZSBwYXJhbWV0ZXIgY29uc3RhbnRzIHRvIGx1bWEuZ2wgOSBzYW1wbGVyIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gbWFwU2FtcGxlclBhcmFtZXRlcnMob2xkUGFyYW1zOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsuLi5ERUZBVUxUX1NBTVBMRVJfUEFSQU1FVEVSU307XG5cbiAgY29uc3QgbWFnRmlsdGVyTWFwID0ge1xuICAgIFtHTC5ORUFSRVNUXTogRklMVEVSX01PREUuTkVBUkVTVCxcbiAgICBbR0wuTElORUFSXTogRklMVEVSX01PREUuTElORUFSXG4gIH07XG5cbiAgY29uc3QgbWluRmlsdGVyTWFwOiBSZWNvcmQ8bnVtYmVyLCB7bWluRmlsdGVyOiBzdHJpbmc7IG1pcG1hcEZpbHRlcj86IHN0cmluZ30+ID0ge1xuICAgIFtHTC5ORUFSRVNUXToge21pbkZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVH0sXG4gICAgW0dMLkxJTkVBUl06IHttaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUn0sXG4gICAgW0dMLk5FQVJFU1RfTUlQTUFQX05FQVJFU1RdOiB7XG4gICAgICBtaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1QsXG4gICAgICBtaXBtYXBGaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1RcbiAgICB9LFxuICAgIFtHTC5ORUFSRVNUX01JUE1BUF9MSU5FQVJdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNULCBtaXBtYXBGaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUn0sXG4gICAgW0dMLkxJTkVBUl9NSVBNQVBfTkVBUkVTVF06IHttaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUiwgbWlwbWFwRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNUfSxcbiAgICBbR0wuTElORUFSX01JUE1BUF9MSU5FQVJdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5MSU5FQVIsIG1pcG1hcEZpbHRlcjogRklMVEVSX01PREUuTElORUFSfVxuICB9O1xuXG4gIGNvbnN0IHdyYXBNYXAgPSB7XG4gICAgW0dMLkNMQU1QX1RPX0VER0VdOiBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRSxcbiAgICBbR0wuUkVQRUFUXTogQUREUkVTU19NT0RFLlJFUEVBVCxcbiAgICBbR0wuTUlSUk9SRURfUkVQRUFUXTogQUREUkVTU19NT0RFLk1JUlJPUl9SRVBFQVRcbiAgfTtcblxuICBpZiAob2xkUGFyYW1zKSB7XG4gICAgaWYgKG9sZFBhcmFtc1tHTC5URVhUVVJFX01JTl9GSUxURVJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG1hcHBlZCA9IG1pbkZpbHRlck1hcFtvbGRQYXJhbXNbR0wuVEVYVFVSRV9NSU5fRklMVEVSXV07XG4gICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgIHJlc3VsdC5taW5GaWx0ZXIgPSBtYXBwZWQubWluRmlsdGVyO1xuICAgICAgICBpZiAobWFwcGVkLm1pcG1hcEZpbHRlcikge1xuICAgICAgICAgIHJlc3VsdC5taXBtYXBGaWx0ZXIgPSBtYXBwZWQubWlwbWFwRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbGRQYXJhbXNbR0wuVEVYVFVSRV9NQUdfRklMVEVSXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQubWFnRmlsdGVyID0gbWFnRmlsdGVyTWFwW29sZFBhcmFtc1tHTC5URVhUVVJFX01BR19GSUxURVJdXSB8fCBGSUxURVJfTU9ERS5ORUFSRVNUO1xuICAgIH1cbiAgICBpZiAob2xkUGFyYW1zW0dMLlRFWFRVUkVfV1JBUF9TXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQuYWRkcmVzc01vZGVVID0gd3JhcE1hcFtvbGRQYXJhbXNbR0wuVEVYVFVSRV9XUkFQX1NdXSB8fCBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRTtcbiAgICB9XG4gICAgaWYgKG9sZFBhcmFtc1tHTC5URVhUVVJFX1dSQVBfVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmFkZHJlc3NNb2RlViA9IHdyYXBNYXBbb2xkUGFyYW1zW0dMLlRFWFRVUkVfV1JBUF9UXV0gfHwgQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBNYXAgb2xkIEdMIGZvcm1hdC90eXBlIHRvIGx1bWEuZ2wgOSB0ZXh0dXJlIGZvcm1hdCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gbWFwVGV4dHVyZUZvcm1hdChnbEZvcm1hdDogbnVtYmVyLCBfZ2xUeXBlPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgc3dpdGNoIChnbEZvcm1hdCkge1xuICAgIGNhc2UgR0wuUjhVSTpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SOF9VSU5UO1xuICAgIGNhc2UgR0wuUjE2VUk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjE2X1VJTlQ7XG4gICAgY2FzZSBHTC5SMzJVSTpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SMzJfVUlOVDtcbiAgICBjYXNlIEdMLlI4STpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SOF9TSU5UO1xuICAgIGNhc2UgR0wuUjE2STpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SMTZfU0lOVDtcbiAgICBjYXNlIEdMLlIzMkk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjMyX1NJTlQ7XG4gICAgY2FzZSBHTC5SMzJGOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlIzMl9GTE9BVDtcbiAgICBjYXNlIEdMLlJHQkE6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG4gICAgY2FzZSBHTC5SR0I6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SR0JBOF9VTk9STTtcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZCAzLWJ5dGUtcGVyLXBpeGVsIFJHQiBkYXRhIHRvIDQtYnl0ZS1wZXItcGl4ZWwgUkdCQS5cbiAqIE5lZWRlZCBiZWNhdXNlIFdlYkdQVS9sdW1hLmdsIDkgaGFzIG5vIDMtY2hhbm5lbCB0ZXh0dXJlIGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gZXhwYW5kUkdCdG9SR0JBKFxuICBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXksXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyXG4pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgcGl4ZWxDb3VudCA9IHdpZHRoICogaGVpZ2h0O1xuICBjb25zdCByZ2JhID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxDb3VudCAqIDQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBpeGVsQ291bnQ7IGkrKykge1xuICAgIHJnYmFbaSAqIDRdID0gZGF0YVtpICogM107XG4gICAgcmdiYVtpICogNCArIDFdID0gZGF0YVtpICogMyArIDFdO1xuICAgIHJnYmFbaSAqIDQgKyAyXSA9IGRhdGFbaSAqIDMgKyAyXTtcbiAgICByZ2JhW2kgKiA0ICsgM10gPSAyNTU7XG4gIH1cbiAgcmV0dXJuIHJnYmE7XG59XG5cbi8qKlxuICogQ3JlYXRlIHRleHR1cmUgb2JqZWN0IGZyb20gaW1hZ2UgZGF0YSB1c2luZyBsdW1hLmdsIDkgZGV2aWNlIEFQSS5cbiAqIFJldHVybnMgYSBwcm9wZXIgbHVtYS5nbCBUZXh0dXJlIG9iamVjdCB0aGF0IHdvcmtzIHdpdGggdGhlIGJpbmRpbmcgc3lzdGVtLlxuICovXG5mdW5jdGlvbiBsb2FkVGV4dHVyZShcbiAgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsXG4gIGRldmljZTogTHVtYURldmljZSB8IHVuZGVmaW5lZCxcbiAgaW1hZ2VEYXRhOiBUZXh0dXJlIHwgUmFzdGVyVGV4dHVyZURhdGFcbik6IFRleHR1cmUgfCBudWxsIHtcbiAgaWYgKCFpbWFnZURhdGEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIElmIGFscmVhZHkgYSBsdW1hLmdsIFRleHR1cmUgaW5zdGFuY2UsIHJldHVybiBhcy1pc1xuICBjb25zdCByYXN0ZXJUZXh0dXJlRGF0YSA9IGltYWdlRGF0YSBhcyBSYXN0ZXJUZXh0dXJlRGF0YTtcbiAgaWYgKFxuICAgIHJhc3RlclRleHR1cmVEYXRhLmhhbmRsZSB8fFxuICAgIHJhc3RlclRleHR1cmVEYXRhLmlkPy5zdGFydHNXaXRoPy4oJ2x1bWEnKSB8fFxuICAgIHJhc3RlclRleHR1cmVEYXRhLmRldmljZVxuICApIHtcbiAgICByZXR1cm4gaW1hZ2VEYXRhIGFzIFRleHR1cmU7XG4gIH1cblxuICBjb25zdCByYXdEYXRhID0gaW1hZ2VEYXRhIGFzIFJhc3RlclRleHR1cmVEYXRhO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbHVtYSBpbnRlcm5hbCBwcm9wZXJ0aWVzIG5vdCBpbiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0IHR5cGVcbiAgY29uc3QgbHVtYURldmljZSA9IGRldmljZSB8fCBnbC5sdW1hPy5kZXZpY2UgfHwgZ2wuX19sdW1hX2RldmljZTtcblxuICBpZiAoIWx1bWFEZXZpY2U/LmNyZWF0ZVRleHR1cmUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1Jhc3RlckxheWVyOiBObyBsdW1hLmdsIGRldmljZSBhdmFpbGFibGUgZm9yIHRleHR1cmUgY3JlYXRpb24nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2FtcGxlclBhcmFtcyA9IG1hcFNhbXBsZXJQYXJhbWV0ZXJzKHJhd0RhdGEucGFyYW1ldGVycyB8fCB7fSk7XG4gICAgY29uc3QgdGV4dHVyZUZvcm1hdCA9IHJhd0RhdGEuZm9ybWF0XG4gICAgICA/IG1hcFRleHR1cmVGb3JtYXQocmF3RGF0YS5mb3JtYXQsIHJhd0RhdGEudHlwZSlcbiAgICAgIDogVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG5cbiAgICBjb25zdCB3aWR0aCA9IHJhd0RhdGEud2lkdGggfHwgcmF3RGF0YS5kYXRhPy53aWR0aCB8fCAxO1xuICAgIGNvbnN0IGhlaWdodCA9IHJhd0RhdGEuaGVpZ2h0IHx8IHJhd0RhdGEuZGF0YT8uaGVpZ2h0IHx8IDE7XG5cbiAgICBjb25zdCB0ZXh0dXJlUHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBmb3JtYXQ6IHRleHR1cmVGb3JtYXQsXG4gICAgICBzYW1wbGVyOiBzYW1wbGVyUGFyYW1zLFxuICAgICAgLi4uKHJhd0RhdGEubWlwbWFwcyA9PT0gZmFsc2UgPyB7bWlwbWFwczogZmFsc2V9IDoge30pXG4gICAgfTtcblxuICAgIGlmIChyYXdEYXRhLmRhdGEpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fFxuICAgICAgICByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fFxuICAgICAgICByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCB8fFxuICAgICAgICByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBJbWFnZURhdGFcbiAgICAgICkge1xuICAgICAgICB0ZXh0dXJlUHJvcHMuZGF0YSA9IHJhd0RhdGEuZGF0YTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHJhd0RhdGEuZGF0YSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJhd0RhdGEuZm9ybWF0ID09PSBHTC5SR0IgJiZcbiAgICAgICAgICAocmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGV4dHVyZVByb3BzLmRhdGEgPSBleHBhbmRSR0J0b1JHQkEocmF3RGF0YS5kYXRhLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0dXJlUHJvcHMuZGF0YSA9IHJhd0RhdGEuZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsdW1hRGV2aWNlLmNyZWF0ZVRleHR1cmUodGV4dHVyZVByb3BzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybignUmFzdGVyTGF5ZXI6IEZhaWxlZCB0byBjcmVhdGUgdGV4dHVyZSB2aWEgZGV2aWNlLmNyZWF0ZVRleHR1cmU6JywgZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFJQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxXQUFBLEdBQUFILE9BQUE7QUFBK0UsU0FBQUksUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFB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
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.patchPipelineValidation = patchPipelineValidation;
7
+ var _webgl = require("@luma.gl/webgl");
8
+ // SPDX-License-Identifier: MIT
9
+ // Copyright contributors to the kepler.gl project
10
+
11
+ /**
12
+ * Patch luma.gl 9's pipeline validation to tolerate mixed-sampler-type
13
+ * validation errors in _getLinkStatus().
14
+ *
15
+ * WebGL2's validateProgram checks that sampler uniforms of different types
16
+ * (sampler2D, usampler2D, isampler2D) are not assigned to the same texture
17
+ * unit. Programs that mix sampler types (e.g. raster band data as usampler2D +
18
+ * shadow maps as sampler2D) may fail validation even though they linked
19
+ * successfully and work correctly once texture units are assigned at draw time.
20
+ *
21
+ * In luma.gl ≥9.3 the _getLinkStatus method moved from WEBGLRenderPipeline to
22
+ * WEBGLSharedRenderPipeline and now calls _initializeSamplerUniforms() before
23
+ * validateProgram, which fixes most false positives. However, some WebGL
24
+ * drivers still report errors even with unique units, so we keep suppressing
25
+ * the known false-positive about mixed sampler types. We patch _getLinkStatus
26
+ * on whichever pipeline class owns it.
27
+ */
28
+
29
+ // @ts-ignore resolution depends on moduleResolution setting
30
+
31
+ var MIXED_SAMPLER_RE = /different type[s]? use the same sampler location/i;
32
+ var _patched = false;
33
+ function createPatchedLinkStatus(_original) {
34
+ return function _patchedGetLinkStatus() {
35
+ var gl = this.device.gl;
36
+ var linked = gl.getProgramParameter(this.handle, 0x8b82 /* LINK_STATUS */);
37
+ if (!linked) {
38
+ this.linkStatus = 'error';
39
+ return 'link-error';
40
+ }
41
+
42
+ // luma.gl ≥9.3 assigns unique texture units to samplers before
43
+ // validation via _initializeSamplerUniforms. Call it here so that
44
+ // the sampler-to-unit mapping is populated through our patched path.
45
+ if (typeof this._initializeSamplerUniforms === 'function') {
46
+ this._initializeSamplerUniforms();
47
+ }
48
+ gl.validateProgram(this.handle);
49
+ var validated = gl.getProgramParameter(this.handle, 0x8b83 /* VALIDATE_STATUS */);
50
+ if (!validated) {
51
+ var infoLog = gl.getProgramInfoLog(this.handle) || '';
52
+ if (!MIXED_SAMPLER_RE.test(infoLog)) {
53
+ this.linkStatus = 'error';
54
+ return 'validation-error';
55
+ }
56
+ }
57
+ this.linkStatus = 'success';
58
+ return 'success';
59
+ };
60
+ }
61
+ function patchPipelineValidation() {
62
+ if (_patched) return;
63
+ _patched = true;
64
+
65
+ // Strategy 1: luma.gl <9.3 — _getLinkStatus on WEBGLRenderPipeline
66
+ if (_webgl.WEBGLRenderPipeline !== null && _webgl.WEBGLRenderPipeline !== void 0 && _webgl.WEBGLRenderPipeline.prototype && typeof _webgl.WEBGLRenderPipeline.prototype._getLinkStatus === 'function') {
67
+ var original = _webgl.WEBGLRenderPipeline.prototype._getLinkStatus;
68
+ _webgl.WEBGLRenderPipeline.prototype._getLinkStatus = createPatchedLinkStatus(original);
69
+ return;
70
+ }
71
+
72
+ // Strategy 2: luma.gl ≥9.3 — _getLinkStatus moved to WEBGLSharedRenderPipeline.
73
+ // That class is not publicly exported, so we hook the factory on WebGLDevice
74
+ // that creates shared pipelines. The first invocation discovers the class,
75
+ // patches its prototype, then re-validates the instance.
76
+ var deviceProto = _webgl.WebGLDevice === null || _webgl.WebGLDevice === void 0 ? void 0 : _webgl.WebGLDevice.prototype;
77
+ var origFactory = deviceProto === null || deviceProto === void 0 ? void 0 : deviceProto._createSharedRenderPipelineWebGL;
78
+ if (typeof origFactory !== 'function') return;
79
+ deviceProto._createSharedRenderPipelineWebGL = function () {
80
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
81
+ args[_key] = arguments[_key];
82
+ }
83
+ var instance = origFactory.apply(this, args);
84
+ var SharedCtor = Object.getPrototypeOf(instance).constructor;
85
+ if (SharedCtor && SharedCtor !== _webgl.WEBGLRenderPipeline && typeof SharedCtor.prototype._getLinkStatus === 'function') {
86
+ var _original2 = SharedCtor.prototype._getLinkStatus;
87
+ SharedCtor.prototype._getLinkStatus = createPatchedLinkStatus(_original2);
88
+
89
+ // Re-validate this first instance since its _getLinkStatus already ran
90
+ // with the unpatched version during construction.
91
+ if (instance.linkStatus !== 'success') {
92
+ instance._getLinkStatus();
93
+ }
94
+ }
95
+
96
+ // Restore original factory — future instances will use the patched prototype
97
+ deviceProto._createSharedRenderPipelineWebGL = origFactory;
98
+ return instance;
99
+ };
100
+ }
101
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2ViZ2wiLCJyZXF1aXJlIiwiTUlYRURfU0FNUExFUl9SRSIsIl9wYXRjaGVkIiwiY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMiLCJfb3JpZ2luYWwiLCJfcGF0Y2hlZEdldExpbmtTdGF0dXMiLCJnbCIsImRldmljZSIsImxpbmtlZCIsImdldFByb2dyYW1QYXJhbWV0ZXIiLCJoYW5kbGUiLCJsaW5rU3RhdHVzIiwiX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMiLCJ2YWxpZGF0ZVByb2dyYW0iLCJ2YWxpZGF0ZWQiLCJpbmZvTG9nIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ0ZXN0IiwicGF0Y2hQaXBlbGluZVZhbGlkYXRpb24iLCJXRUJHTFJlbmRlclBpcGVsaW5lIiwicHJvdG90eXBlIiwiX2dldExpbmtTdGF0dXMiLCJvcmlnaW5hbCIsImRldmljZVByb3RvIiwiV2ViR0xEZXZpY2UiLCJvcmlnRmFjdG9yeSIsIl9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJpbnN0YW5jZSIsImFwcGx5IiwiU2hhcmVkQ3RvciIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiY29uc3RydWN0b3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmFzdGVyL3BpcGVsaW5lLXZhbGlkYXRpb24tcGF0Y2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLyoqXG4gKiBQYXRjaCBsdW1hLmdsIDkncyBwaXBlbGluZSB2YWxpZGF0aW9uIHRvIHRvbGVyYXRlIG1peGVkLXNhbXBsZXItdHlwZVxuICogdmFsaWRhdGlvbiBlcnJvcnMgaW4gX2dldExpbmtTdGF0dXMoKS5cbiAqXG4gKiBXZWJHTDIncyB2YWxpZGF0ZVByb2dyYW0gY2hlY2tzIHRoYXQgc2FtcGxlciB1bmlmb3JtcyBvZiBkaWZmZXJlbnQgdHlwZXNcbiAqIChzYW1wbGVyMkQsIHVzYW1wbGVyMkQsIGlzYW1wbGVyMkQpIGFyZSBub3QgYXNzaWduZWQgdG8gdGhlIHNhbWUgdGV4dHVyZVxuICogdW5pdC4gUHJvZ3JhbXMgdGhhdCBtaXggc2FtcGxlciB0eXBlcyAoZS5nLiByYXN0ZXIgYmFuZCBkYXRhIGFzIHVzYW1wbGVyMkQgK1xuICogc2hhZG93IG1hcHMgYXMgc2FtcGxlcjJEKSBtYXkgZmFpbCB2YWxpZGF0aW9uIGV2ZW4gdGhvdWdoIHRoZXkgbGlua2VkXG4gKiBzdWNjZXNzZnVsbHkgYW5kIHdvcmsgY29ycmVjdGx5IG9uY2UgdGV4dHVyZSB1bml0cyBhcmUgYXNzaWduZWQgYXQgZHJhdyB0aW1lLlxuICpcbiAqIEluIGx1bWEuZ2wg4omlOS4zIHRoZSBfZ2V0TGlua1N0YXR1cyBtZXRob2QgbW92ZWQgZnJvbSBXRUJHTFJlbmRlclBpcGVsaW5lIHRvXG4gKiBXRUJHTFNoYXJlZFJlbmRlclBpcGVsaW5lIGFuZCBub3cgY2FsbHMgX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMoKSBiZWZvcmVcbiAqIHZhbGlkYXRlUHJvZ3JhbSwgd2hpY2ggZml4ZXMgbW9zdCBmYWxzZSBwb3NpdGl2ZXMuIEhvd2V2ZXIsIHNvbWUgV2ViR0xcbiAqIGRyaXZlcnMgc3RpbGwgcmVwb3J0IGVycm9ycyBldmVuIHdpdGggdW5pcXVlIHVuaXRzLCBzbyB3ZSBrZWVwIHN1cHByZXNzaW5nXG4gKiB0aGUga25vd24gZmFsc2UtcG9zaXRpdmUgYWJvdXQgbWl4ZWQgc2FtcGxlciB0eXBlcy4gV2UgcGF0Y2ggX2dldExpbmtTdGF0dXNcbiAqIG9uIHdoaWNoZXZlciBwaXBlbGluZSBjbGFzcyBvd25zIGl0LlxuICovXG5cbi8vIEB0cy1pZ25vcmUgcmVzb2x1dGlvbiBkZXBlbmRzIG9uIG1vZHVsZVJlc29sdXRpb24gc2V0dGluZ1xuaW1wb3J0IHtXRUJHTFJlbmRlclBpcGVsaW5lLCBXZWJHTERldmljZX0gZnJvbSAnQGx1bWEuZ2wvd2ViZ2wnO1xuXG5jb25zdCBNSVhFRF9TQU1QTEVSX1JFID0gL2RpZmZlcmVudCB0eXBlW3NdPyB1c2UgdGhlIHNhbWUgc2FtcGxlciBsb2NhdGlvbi9pO1xuXG5sZXQgX3BhdGNoZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMoX29yaWdpbmFsOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSB7XG4gIHJldHVybiBmdW5jdGlvbiBfcGF0Y2hlZEdldExpbmtTdGF0dXModGhpczogYW55KSB7XG4gICAgY29uc3Qge2dsfSA9IHRoaXMuZGV2aWNlO1xuICAgIGNvbnN0IGxpbmtlZCA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5oYW5kbGUsIDB4OGI4MiAvKiBMSU5LX1NUQVRVUyAqLyk7XG4gICAgaWYgKCFsaW5rZWQpIHtcbiAgICAgIHRoaXMubGlua1N0YXR1cyA9ICdlcnJvcic7XG4gICAgICByZXR1cm4gJ2xpbmstZXJyb3InO1xuICAgIH1cblxuICAgIC8vIGx1bWEuZ2wg4omlOS4zIGFzc2lnbnMgdW5pcXVlIHRleHR1cmUgdW5pdHMgdG8gc2FtcGxlcnMgYmVmb3JlXG4gICAgLy8gdmFsaWRhdGlvbiB2aWEgX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMuIENhbGwgaXQgaGVyZSBzbyB0aGF0XG4gICAgLy8gdGhlIHNhbXBsZXItdG8tdW5pdCBtYXBwaW5nIGlzIHBvcHVsYXRlZCB0aHJvdWdoIG91ciBwYXRjaGVkIHBhdGguXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9pbml0aWFsaXplU2FtcGxlclVuaWZvcm1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplU2FtcGxlclVuaWZvcm1zKCk7XG4gICAgfVxuXG4gICAgZ2wudmFsaWRhdGVQcm9ncmFtKHRoaXMuaGFuZGxlKTtcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMuaGFuZGxlLCAweDhiODMgLyogVkFMSURBVEVfU1RBVFVTICovKTtcbiAgICBpZiAoIXZhbGlkYXRlZCkge1xuICAgICAgY29uc3QgaW5mb0xvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMuaGFuZGxlKSB8fCAnJztcbiAgICAgIGlmICghTUlYRURfU0FNUExFUl9SRS50ZXN0KGluZm9Mb2cpKSB7XG4gICAgICAgIHRoaXMubGlua1N0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgIHJldHVybiAndmFsaWRhdGlvbi1lcnJvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5saW5rU3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFBpcGVsaW5lVmFsaWRhdGlvbigpOiB2b2lkIHtcbiAgaWYgKF9wYXRjaGVkKSByZXR1cm47XG4gIF9wYXRjaGVkID0gdHJ1ZTtcblxuICAvLyBTdHJhdGVneSAxOiBsdW1hLmdsIDw5LjMg4oCUIF9nZXRMaW5rU3RhdHVzIG9uIFdFQkdMUmVuZGVyUGlwZWxpbmVcbiAgaWYgKFxuICAgIFdFQkdMUmVuZGVyUGlwZWxpbmU/LnByb3RvdHlwZSAmJlxuICAgIHR5cGVvZiAoV0VCR0xSZW5kZXJQaXBlbGluZS5wcm90b3R5cGUgYXMgYW55KS5fZ2V0TGlua1N0YXR1cyA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChXRUJHTFJlbmRlclBpcGVsaW5lLnByb3RvdHlwZSBhcyBhbnkpLl9nZXRMaW5rU3RhdHVzO1xuICAgIChXRUJHTFJlbmRlclBpcGVsaW5lLnByb3RvdHlwZSBhcyBhbnkpLl9nZXRMaW5rU3RhdHVzID0gY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMob3JpZ2luYWwpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFN0cmF0ZWd5IDI6IGx1bWEuZ2wg4omlOS4zIOKAlCBfZ2V0TGlua1N0YXR1cyBtb3ZlZCB0byBXRUJHTFNoYXJlZFJlbmRlclBpcGVsaW5lLlxuICAvLyBUaGF0IGNsYXNzIGlzIG5vdCBwdWJsaWNseSBleHBvcnRlZCwgc28gd2UgaG9vayB0aGUgZmFjdG9yeSBvbiBXZWJHTERldmljZVxuICAvLyB0aGF0IGNyZWF0ZXMgc2hhcmVkIHBpcGVsaW5lcy4gVGhlIGZpcnN0IGludm9jYXRpb24gZGlzY292ZXJzIHRoZSBjbGFzcyxcbiAgLy8gcGF0Y2hlcyBpdHMgcHJvdG90eXBlLCB0aGVuIHJlLXZhbGlkYXRlcyB0aGUgaW5zdGFuY2UuXG4gIGNvbnN0IGRldmljZVByb3RvID0gV2ViR0xEZXZpY2U/LnByb3RvdHlwZSBhcyBhbnk7XG4gIGNvbnN0IG9yaWdGYWN0b3J5ID0gZGV2aWNlUHJvdG8/Ll9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMO1xuICBpZiAodHlwZW9mIG9yaWdGYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG5cbiAgZGV2aWNlUHJvdG8uX2NyZWF0ZVNoYXJlZFJlbmRlclBpcGVsaW5lV2ViR0wgPSBmdW5jdGlvbiAodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gb3JpZ0ZhY3RvcnkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgU2hhcmVkQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0YW5jZSkuY29uc3RydWN0b3I7XG5cbiAgICBpZiAoXG4gICAgICBTaGFyZWRDdG9yICYmXG4gICAgICBTaGFyZWRDdG9yICE9PSBXRUJHTFJlbmRlclBpcGVsaW5lICYmXG4gICAgICB0eXBlb2YgU2hhcmVkQ3Rvci5wcm90b3R5cGUuX2dldExpbmtTdGF0dXMgPT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gU2hhcmVkQ3Rvci5wcm90b3R5cGUuX2dldExpbmtTdGF0dXM7XG4gICAgICBTaGFyZWRDdG9yLnByb3RvdHlwZS5fZ2V0TGlua1N0YXR1cyA9IGNyZWF0ZVBhdGNoZWRMaW5rU3RhdHVzKG9yaWdpbmFsKTtcblxuICAgICAgLy8gUmUtdmFsaWRhdGUgdGhpcyBmaXJzdCBpbnN0YW5jZSBzaW5jZSBpdHMgX2dldExpbmtTdGF0dXMgYWxyZWFkeSByYW5cbiAgICAgIC8vIHdpdGggdGhlIHVucGF0Y2hlZCB2ZXJzaW9uIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAgICBpZiAoaW5zdGFuY2UubGlua1N0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgIGluc3RhbmNlLl9nZXRMaW5rU3RhdHVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBmYWN0b3J5IOKAlCBmdXR1cmUgaW5zdGFuY2VzIHdpbGwgdXNlIHRoZSBwYXRjaGVkIHByb3RvdHlwZVxuICAgIGRldmljZVByb3RvLl9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMID0gb3JpZ0ZhY3Rvcnk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFzQkEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBdEJBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFHQSxJQUFNQyxnQkFBZ0IsR0FBRyxtREFBbUQ7QUFFNUUsSUFBSUMsUUFBUSxHQUFHLEtBQUs7QUFFcEIsU0FBU0MsdUJBQXVCQSxDQUFDQyxTQUEwQyxFQUFFO0VBQzNFLE9BQU8sU0FBU0MscUJBQXFCQSxDQUFBLEVBQVk7SUFDL0MsSUFBT0MsRUFBRSxHQUFJLElBQUksQ0FBQ0MsTUFBTSxDQUFqQkQsRUFBRTtJQUNULElBQU1FLE1BQU0sR0FBR0YsRUFBRSxDQUFDRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUNDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDNUUsSUFBSSxDQUFDRixNQUFNLEVB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