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

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 (184) 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 +220 -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 +569 -0
  12. package/dist/cjs/globe/globe-stars-layer.js +69 -0
  13. package/dist/cjs/globe/globe-view.js +407 -0
  14. package/dist/{globe → cjs/globe}/index.js +1 -1
  15. package/dist/cjs/globe/mvt-label-layer.js +190 -0
  16. package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
  17. package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
  18. package/dist/{index.js → cjs/index.js} +1 -1
  19. package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
  20. package/dist/cjs/layer-utils/cluster-utils.js +93 -0
  21. package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
  22. package/dist/cjs/layer-utils/globe-cell-utils.js +173 -0
  23. package/dist/cjs/layer-utils/shader-utils.js +38 -0
  24. package/dist/cjs/line-layer/line-layer.js +95 -0
  25. package/dist/cjs/raster/images.js +271 -0
  26. package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
  27. package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
  28. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
  29. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
  30. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
  31. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
  32. package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
  33. package/dist/cjs/raster/raster-mesh-layer/matrix.js +18 -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 +214 -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 +561 -0
  74. package/dist/esm/globe/globe-stars-layer.js +63 -0
  75. package/dist/esm/globe/globe-view.js +401 -0
  76. package/dist/esm/globe/index.js +26 -0
  77. package/dist/esm/globe/mvt-label-layer.js +187 -0
  78. package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
  79. package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
  80. package/dist/esm/index.js +22 -0
  81. package/dist/esm/layer-utils/aggregation-utils.js +172 -0
  82. package/dist/esm/layer-utils/cluster-utils.js +86 -0
  83. package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
  84. package/dist/esm/layer-utils/globe-cell-utils.js +167 -0
  85. package/dist/esm/layer-utils/shader-utils.js +32 -0
  86. package/dist/esm/line-layer/line-layer.js +91 -0
  87. package/dist/esm/raster/images.js +267 -0
  88. package/dist/esm/raster/pipeline-validation-patch.js +94 -0
  89. package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
  90. package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
  91. package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
  92. package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
  93. package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
  94. package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
  95. package/dist/esm/raster/raster-mesh-layer/matrix.js +12 -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/wms/wms-layer.d.ts +8 -0
  126. package/package.json +17 -8
  127. package/dist/3d-building-layer/3d-building-layer.js +0 -66
  128. package/dist/3d-building-layer/3d-building-utils.js +0 -166
  129. package/dist/3d-building-layer/types.js +0 -6
  130. package/dist/cluster-layer/cluster-layer.js +0 -292
  131. package/dist/column-layer/enhanced-column-layer.js +0 -160
  132. package/dist/deckgl-extensions/filter-shader-module.js +0 -26
  133. package/dist/globe/atmosphere-layer.js +0 -220
  134. package/dist/globe/enhanced-multi-icon-layer.js +0 -63
  135. package/dist/globe/globe-depth-disk-layer.js +0 -145
  136. package/dist/globe/globe-layers.js +0 -569
  137. package/dist/globe/globe-stars-layer.js +0 -69
  138. package/dist/globe/globe-view.js +0 -404
  139. package/dist/globe/mvt-label-layer.js +0 -190
  140. package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -116
  141. package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -134
  142. package/dist/layer-utils/aggregation-utils.js +0 -181
  143. package/dist/layer-utils/cluster-utils.js +0 -93
  144. package/dist/layer-utils/cpu-aggregator.js +0 -798
  145. package/dist/layer-utils/globe-cell-utils.js +0 -173
  146. package/dist/layer-utils/shader-utils.js +0 -38
  147. package/dist/line-layer/line-layer.js +0 -95
  148. package/dist/raster/images.js +0 -271
  149. package/dist/raster/pipeline-validation-patch.js +0 -101
  150. package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
  151. package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
  152. package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
  153. package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
  154. package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
  155. package/dist/raster/raster-layer/raster-layer.js +0 -287
  156. package/dist/raster/raster-mesh-layer/matrix.js +0 -18
  157. package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
  158. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
  159. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
  160. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
  161. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
  162. package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -321
  163. package/dist/raster/raster-processing-uniforms.js +0 -124
  164. package/dist/raster/types.js +0 -6
  165. package/dist/raster/util.js +0 -139
  166. package/dist/raster/webgl/color/colormap.js +0 -45
  167. package/dist/raster/webgl/color/filter.js +0 -58
  168. package/dist/raster/webgl/color/gamma-contrast.js +0 -68
  169. package/dist/raster/webgl/color/linear-rescale.js +0 -35
  170. package/dist/raster/webgl/color/saturation.js +0 -42
  171. package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
  172. package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
  173. package/dist/raster/webgl/spectral-indices/evi.js +0 -26
  174. package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
  175. package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
  176. package/dist/raster/webgl/spectral-indices/savi.js +0 -21
  177. package/dist/raster/webgl/texture/combine-bands.js +0 -65
  178. package/dist/raster/webgl/texture/mask.js +0 -50
  179. package/dist/raster/webgl/texture/reorder-bands.js +0 -72
  180. package/dist/raster/webgl/texture/rgba-image.js +0 -34
  181. package/dist/raster/webgl/types.js +0 -6
  182. package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -88
  183. package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
  184. package/dist/wms/wms-layer.js +0 -594
@@ -1,271 +0,0 @@
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("lodash/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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9pc0VxdWFsIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb25zdGFudHMyIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiREVGQVVMVF9TQU1QTEVSX1BBUkFNRVRFUlMiLCJtaW5GaWx0ZXIiLCJGSUxURVJfTU9ERSIsIk5FQVJFU1QiLCJtYWdGaWx0ZXIiLCJhZGRyZXNzTW9kZVUiLCJBRERSRVNTX01PREUiLCJDTEFNUF9UT19FREdFIiwiYWRkcmVzc01vZGVWIiwibG9hZEltYWdlSXRlbSIsImdsIiwiZGV2aWNlIiwiaW1hZ2VJdGVtIiwicmVzdWx0IiwiZGlydHlSZXN1bHQiLCJtYXAiLCJ4IiwibG9hZFRleHR1cmUiLCJfaXRlcmF0b3IiLCJfc3RlcCIsInRleHR1cmUiLCJlcnIiLCJsb2FkSW1hZ2VzIiwiX3JlZiIsImltYWdlcyIsImltYWdlc0RhdGEiLCJvbGRJbWFnZXNEYXRhIiwiaW1hZ2VzRGlydHkiLCJoYXNQZW5kaW5nVXBsb2FkcyIsImtleSIsImNoYW5nZWRLZXlzIiwiaXNFcXVhbCIsIl9pIiwiX2NoYW5nZWRLZXlzIiwiaW1hZ2VEYXRhIiwibG9hZGVkSXRlbSIsIm1hcFNhbXBsZXJQYXJhbWV0ZXJzIiwib2xkUGFyYW1zIiwibWFnRmlsdGVyTWFwIiwiR0wiLCJMSU5FQVIiLCJtaW5GaWx0ZXJNYXAiLCJORUFSRVNUX01JUE1BUF9ORUFSRVNUIiwibWlwbWFwRmlsdGVyIiwiTkVBUkVTVF9NSVBNQVBfTElORUFSIiwiTElORUFSX01JUE1BUF9ORUFSRVNUIiwiTElORUFSX01JUE1BUF9MSU5FQVIiLCJ3cmFwTWFwIiwiUkVQRUFUIiwiTUlSUk9SRURfUkVQRUFUIiwiTUlSUk9SX1JFUEVBVCIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsInVuZGVmaW5lZCIsIm1hcHBlZCIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsIlRFWFRVUkVfV1JBUF9TIiwiVEVYVFVSRV9XUkFQX1QiLCJtYXBUZXh0dXJlRm9ybWF0IiwiZ2xGb3JtYXQiLCJfZ2xUeXBlIiwiUjhVSSIsIlRFWFRVUkVfRk9STUFUIiwiUjhfVUlOVCIsIlIxNlVJIiwiUjE2X1VJTlQiLCJSMzJVSSIsIlIzMl9VSU5UIiwiUjhJIiwiUjhfU0lOVCIsIlIxNkkiLCJSMTZfU0lOVCIsIlIzMkkiLCJSMzJfU0lOVCIsIlIzMkYiLCJSMzJfRkxPQVQiLCJSR0JBIiwiUkdCQThfVU5PUk0iLCJSR0IiLCJleHBhbmRSR0J0b1JHQkEiLCJkYXRhIiwid2lkdGgiLCJoZWlnaHQiLCJwaXhlbENvdW50IiwicmdiYSIsIlVpbnQ4QXJyYXkiLCJpIiwiX3Jhc3RlclRleHR1cmVEYXRhJGlkIiwiX3Jhc3RlclRleHR1cmVEYXRhJGlkMiIsIl9nbCRsdW1hIiwicmFzdGVyVGV4dHVyZURhdGEiLCJoYW5kbGUiLCJpZCIsInN0YXJ0c1dpdGgiLCJyYXdEYXRhIiwibHVtYURldmljZSIsImx1bWEiLCJfX2x1bWFfZGV2aWNlIiwiY3JlYXRlVGV4dHVyZSIsImNvbnNvbGUiLCJ3YXJuIiwiX3Jhd0RhdGEkZGF0YSIsIl9yYXdEYXRhJGRhdGEyIiwic2FtcGxlclBhcmFtcyIsInBhcmFtZXRlcnMiLCJ0ZXh0dXJlRm9ybWF0IiwiZm9ybWF0IiwidHlwZSIsInRleHR1cmVQcm9wcyIsInNhbXBsZXIiLCJtaXBtYXBzIiwiSFRNTEltYWdlRWxlbWVudCIsIkhUTUxDYW52YXNFbGVtZW50IiwiSW1hZ2VCaXRtYXAiLCJJbWFnZURhdGEiLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsIlVpbnQ4Q2xhbXBlZEFycmF5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jhc3Rlci9pbWFnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLy8gQHRzLWlnbm9yZSBHTCByZXNvbHV0aW9uIGRlcGVuZHMgb24gbW9kdWxlUmVzb2x1dGlvbiBzZXR0aW5nXG5pbXBvcnQge0dMfSBmcm9tICdAbHVtYS5nbC9jb25zdGFudHMnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuXG5pbXBvcnQge0ZJTFRFUl9NT0RFLCBBRERSRVNTX01PREUsIFRFWFRVUkVfRk9STUFUfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7VGV4dHVyZX0gZnJvbSAnQGx1bWEuZ2wvY29yZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VJbnB1dCwgSW1hZ2VTdGF0ZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogTGVnYWN5IHRleHR1cmUgY3JlYXRpb24gZGVzY3JpcHRvciB1c2VkIGJ5IHJhc3RlciBzaGFkZXIgbW9kdWxlcy5cbiAqIENvbnRhaW5zIENQVS1zaWRlIGRhdGEgKyBvbGQgR0wtZW51bS1iYXNlZCBwYXJhbWV0ZXJzIHRoYXQgZ2V0XG4gKiB0cmFuc2xhdGVkIHRvIGx1bWEuZ2wgOSdzIGRldmljZS5jcmVhdGVUZXh0dXJlKCkgcHJvcHMuXG4gKi9cbnR5cGUgVGV4dHVyZURhdGFTb3VyY2UgPVxuICB8IEhUTUxJbWFnZUVsZW1lbnRcbiAgfCBIVE1MQ2FudmFzRWxlbWVudFxuICB8IEltYWdlQml0bWFwXG4gIHwgSW1hZ2VEYXRhXG4gIHwgQXJyYXlCdWZmZXJWaWV3O1xuXG50eXBlIFJhc3RlclRleHR1cmVEYXRhID0ge1xuICBoYW5kbGU/OiB1bmtub3duO1xuICBpZD86IHN0cmluZztcbiAgZGV2aWNlPzogdW5rbm93bjtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgZm9ybWF0PzogbnVtYmVyO1xuICB0eXBlPzogbnVtYmVyO1xuICBwYXJhbWV0ZXJzPzogUmVjb3JkPG51bWJlciwgbnVtYmVyPjtcbiAgbWlwbWFwcz86IGJvb2xlYW47XG4gIGRhdGE/OiBUZXh0dXJlRGF0YVNvdXJjZSAmIHt3aWR0aD86IG51bWJlcjsgaGVpZ2h0PzogbnVtYmVyfTtcbn07XG5cbi8qKlxuICogVGV4dHVyZSBzYW1wbGVyIHBhcmFtZXRlcnMgZm9yIGx1bWEuZ2wgOSB0ZXh0dXJlc1xuICovXG5jb25zdCBERUZBVUxUX1NBTVBMRVJfUEFSQU1FVEVSUyA9IHtcbiAgbWluRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNULFxuICBtYWdGaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1QsXG4gIGFkZHJlc3NNb2RlVTogQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0UsXG4gIGFkZHJlc3NNb2RlVjogQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0Vcbn07XG5cbi8qKiBsdW1hLmdsIGRldmljZSBpbnRlcmZhY2UgZm9yIHRleHR1cmUgY3JlYXRpb24gKi9cbmludGVyZmFjZSBMdW1hRGV2aWNlIHtcbiAgY3JlYXRlVGV4dHVyZShwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBUZXh0dXJlO1xuICBnbD86IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG59XG5cbnR5cGUgTG9hZEltYWdlc09wdGlvbnMgPSB7XG4gIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICBkZXZpY2U/OiBMdW1hRGV2aWNlO1xuICBpbWFnZXM6IEltYWdlU3RhdGU7XG4gIGltYWdlc0RhdGE6IEltYWdlSW5wdXQ7XG4gIG9sZEltYWdlc0RhdGE6IEltYWdlSW5wdXQ7XG59O1xuXG4vKipcbiAqIExvYWQgaW1hZ2UgaXRlbXMgdG8gd2ViZ2wgY29udGV4dFxuICovXG5mdW5jdGlvbiBsb2FkSW1hZ2VJdGVtKFxuICBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCxcbiAgZGV2aWNlOiBMdW1hRGV2aWNlIHwgdW5kZWZpbmVkLFxuICBpbWFnZUl0ZW06IFJhc3RlclRleHR1cmVEYXRhIHwgVGV4dHVyZSB8IChSYXN0ZXJUZXh0dXJlRGF0YSB8IFRleHR1cmUpW11cbik6IG51bGwgfCBUZXh0dXJlIHwgVGV4dHVyZVtdIHtcbiAgbGV0IHJlc3VsdDogbnVsbCB8IFRleHR1cmUgfCBUZXh0dXJlW107XG4gIGlmIChBcnJheS5pc0FycmF5KGltYWdlSXRlbSkpIHtcbiAgICBjb25zdCBkaXJ0eVJlc3VsdCA9IGltYWdlSXRlbS5tYXAoeCA9PiBsb2FkVGV4dHVyZShnbCwgZGV2aWNlLCB4KSk7XG4gICAgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCB0ZXh0dXJlIG9mIGRpcnR5UmVzdWx0KSB7XG4gICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICByZXN1bHQucHVzaCh0ZXh0dXJlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICByZXN1bHQgPSBudWxsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBsb2FkVGV4dHVyZShnbCwgZGV2aWNlLCBpbWFnZUl0ZW0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTG9hZCBpbWFnZSBpdGVtcyB0byB3ZWJnbCBjb250ZXh0XG4gKi9cbnR5cGUgTG9hZEltYWdlc1Jlc3VsdCA9IHtcbiAgLyoqIFVwZGF0ZWQgaW1hZ2VzIHN0YXRlLCBvciBudWxsIGlmIG5vdGhpbmcgY2hhbmdlZCAqL1xuICBpbWFnZXM6IEltYWdlU3RhdGUgfCBudWxsO1xuICAvKiogVHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSB0ZXh0dXJlIHVwbG9hZCBmYWlsZWQgYW5kIHNob3VsZCBiZSByZXRyaWVkICovXG4gIGhhc1BlbmRpbmdVcGxvYWRzOiBib29sZWFuO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBsb2FkSW1hZ2VzKHtcbiAgZ2wsXG4gIGRldmljZSxcbiAgaW1hZ2VzLFxuICBpbWFnZXNEYXRhLFxuICBvbGRJbWFnZXNEYXRhXG59OiBMb2FkSW1hZ2VzT3B0aW9ucyk6IExvYWRJbWFnZXNSZXN1bHQge1xuICBsZXQgaW1hZ2VzRGlydHkgPSBmYWxzZTtcbiAgbGV0IGhhc1BlbmRpbmdVcGxvYWRzID0gZmFsc2U7XG5cbiAgaWYgKG9sZEltYWdlc0RhdGEpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRJbWFnZXNEYXRhKSB7XG4gICAgICBpZiAoaW1hZ2VzRGF0YSAmJiAhKGtleSBpbiBpbWFnZXNEYXRhKSAmJiBrZXkgaW4gaW1hZ2VzKSB7XG4gICAgICAgIGRlbGV0ZSBpbWFnZXNba2V5XTtcbiAgICAgICAgaW1hZ2VzRGlydHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNoYW5nZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbWFnZXNEYXRhKSB7XG4gICAgaWYgKCFvbGRJbWFnZXNEYXRhIHx8IChvbGRJbWFnZXNEYXRhICYmICEoa2V5IGluIG9sZEltYWdlc0RhdGEpKSkge1xuICAgICAgY2hhbmdlZEtleXMucHVzaChrZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0VxdWFsKGltYWdlc0RhdGFba2V5XSwgb2xkSW1hZ2VzRGF0YVtrZXldKSkge1xuICAgICAgY2hhbmdlZEtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIGNoYW5nZWRLZXlzKSB7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2VzRGF0YVtrZXldO1xuICAgIGlmICghaW1hZ2VEYXRhKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZWRJdGVtID0gbG9hZEltYWdlSXRlbShnbCwgZGV2aWNlLCBpbWFnZURhdGEpO1xuICAgIGlmIChsb2FkZWRJdGVtKSB7XG4gICAgICBpbWFnZXNba2V5XSA9IGxvYWRlZEl0ZW07XG4gICAgICAvLyBPbmx5IG1hcmsgZGlydHkgd2hlbiB0aGUgdGV4dHVyZSB3YXMgYWN0dWFsbHkgdXBsb2FkZWQuXG4gICAgICBpbWFnZXNEaXJ0eSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwbG9hZCBmYWlsZWQgKGRldmljZSBub3QgcmVhZHkgb3IgY3JlYXRlVGV4dHVyZSB0aHJldykuIFNpZ25hbCB0aGF0XG4gICAgICAvLyB0aGUgY2FsbGVyIHNob3VsZCByZXRyeSBuZXh0IGZyYW1lIOKAlCBkbyBOT1Qgc2V0IGltYWdlc0RpcnR5IHNvIHdlXG4gICAgICAvLyBkb24ndCBwcm9wYWdhdGUgYW4gaW1hZ2VzIG9iamVjdCB3aXRoIGEgbWlzc2luZyBrZXkgdGhhdCBjYXVzZXNcbiAgICAgIC8vIGRyYXcoKSB0byBiYWlsIHBlcm1hbmVudGx5LlxuICAgICAgaGFzUGVuZGluZ1VwbG9hZHMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7aW1hZ2VzOiBpbWFnZXNEaXJ0eSA/IGltYWdlcyA6IG51bGwsIGhhc1BlbmRpbmdVcGxvYWRzfTtcbn1cblxuLyoqXG4gKiBNYXAgb2xkIEdMIHRleHR1cmUgcGFyYW1ldGVyIGNvbnN0YW50cyB0byBsdW1hLmdsIDkgc2FtcGxlciBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIG1hcFNhbXBsZXJQYXJhbWV0ZXJzKG9sZFBhcmFtczogUmVjb3JkPG51bWJlciwgbnVtYmVyPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7Li4uREVGQVVMVF9TQU1QTEVSX1BBUkFNRVRFUlN9O1xuXG4gIGNvbnN0IG1hZ0ZpbHRlck1hcCA9IHtcbiAgICBbR0wuTkVBUkVTVF06IEZJTFRFUl9NT0RFLk5FQVJFU1QsXG4gICAgW0dMLkxJTkVBUl06IEZJTFRFUl9NT0RFLkxJTkVBUlxuICB9O1xuXG4gIGNvbnN0IG1pbkZpbHRlck1hcDogUmVjb3JkPG51bWJlciwge21pbkZpbHRlcjogc3RyaW5nOyBtaXBtYXBGaWx0ZXI/OiBzdHJpbmd9PiA9IHtcbiAgICBbR0wuTkVBUkVTVF06IHttaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1R9LFxuICAgIFtHTC5MSU5FQVJdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5MSU5FQVJ9LFxuICAgIFtHTC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUXToge1xuICAgICAgbWluRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNULFxuICAgICAgbWlwbWFwRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNUXG4gICAgfSxcbiAgICBbR0wuTkVBUkVTVF9NSVBNQVBfTElORUFSXToge21pbkZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVCwgbWlwbWFwRmlsdGVyOiBGSUxURVJfTU9ERS5MSU5FQVJ9LFxuICAgIFtHTC5MSU5FQVJfTUlQTUFQX05FQVJFU1RdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5MSU5FQVIsIG1pcG1hcEZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVH0sXG4gICAgW0dMLkxJTkVBUl9NSVBNQVBfTElORUFSXToge21pbkZpbHRlcjogRklMVEVSX01PREUuTElORUFSLCBtaXBtYXBGaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUn1cbiAgfTtcblxuICBjb25zdCB3cmFwTWFwID0ge1xuICAgIFtHTC5DTEFNUF9UT19FREdFXTogQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0UsXG4gICAgW0dMLlJFUEVBVF06IEFERFJFU1NfTU9ERS5SRVBFQVQsXG4gICAgW0dMLk1JUlJPUkVEX1JFUEVBVF06IEFERFJFU1NfTU9ERS5NSVJST1JfUkVQRUFUXG4gIH07XG5cbiAgaWYgKG9sZFBhcmFtcykge1xuICAgIGlmIChvbGRQYXJhbXNbR0wuVEVYVFVSRV9NSU5fRklMVEVSXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBtYXBwZWQgPSBtaW5GaWx0ZXJNYXBbb2xkUGFyYW1zW0dMLlRFWFRVUkVfTUlOX0ZJTFRFUl1dO1xuICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICByZXN1bHQubWluRmlsdGVyID0gbWFwcGVkLm1pbkZpbHRlcjtcbiAgICAgICAgaWYgKG1hcHBlZC5taXBtYXBGaWx0ZXIpIHtcbiAgICAgICAgICByZXN1bHQubWlwbWFwRmlsdGVyID0gbWFwcGVkLm1pcG1hcEZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2xkUGFyYW1zW0dMLlRFWFRVUkVfTUFHX0ZJTFRFUl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0Lm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlck1hcFtvbGRQYXJhbXNbR0wuVEVYVFVSRV9NQUdfRklMVEVSXV0gfHwgRklMVEVSX01PREUuTkVBUkVTVDtcbiAgICB9XG4gICAgaWYgKG9sZFBhcmFtc1tHTC5URVhUVVJFX1dSQVBfU10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmFkZHJlc3NNb2RlVSA9IHdyYXBNYXBbb2xkUGFyYW1zW0dMLlRFWFRVUkVfV1JBUF9TXV0gfHwgQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0U7XG4gICAgfVxuICAgIGlmIChvbGRQYXJhbXNbR0wuVEVYVFVSRV9XUkFQX1RdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdC5hZGRyZXNzTW9kZVYgPSB3cmFwTWFwW29sZFBhcmFtc1tHTC5URVhUVVJFX1dSQVBfVF1dIHx8IEFERFJFU1NfTU9ERS5DTEFNUF9UT19FREdFO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTWFwIG9sZCBHTCBmb3JtYXQvdHlwZSB0byBsdW1hLmdsIDkgdGV4dHVyZSBmb3JtYXQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIG1hcFRleHR1cmVGb3JtYXQoZ2xGb3JtYXQ6IG51bWJlciwgX2dsVHlwZT86IG51bWJlcik6IHN0cmluZyB7XG4gIHN3aXRjaCAoZ2xGb3JtYXQpIHtcbiAgICBjYXNlIEdMLlI4VUk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjhfVUlOVDtcbiAgICBjYXNlIEdMLlIxNlVJOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlIxNl9VSU5UO1xuICAgIGNhc2UgR0wuUjMyVUk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjMyX1VJTlQ7XG4gICAgY2FzZSBHTC5SOEk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjhfU0lOVDtcbiAgICBjYXNlIEdMLlIxNkk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjE2X1NJTlQ7XG4gICAgY2FzZSBHTC5SMzJJOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlIzMl9TSU5UO1xuICAgIGNhc2UgR0wuUjMyRjpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SMzJfRkxPQVQ7XG4gICAgY2FzZSBHTC5SR0JBOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlJHQkE4X1VOT1JNO1xuICAgIGNhc2UgR0wuUkdCOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlJHQkE4X1VOT1JNO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBhbmQgMy1ieXRlLXBlci1waXhlbCBSR0IgZGF0YSB0byA0LWJ5dGUtcGVyLXBpeGVsIFJHQkEuXG4gKiBOZWVkZWQgYmVjYXVzZSBXZWJHUFUvbHVtYS5nbCA5IGhhcyBubyAzLWNoYW5uZWwgdGV4dHVyZSBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIGV4cGFuZFJHQnRvUkdCQShcbiAgZGF0YTogVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlclxuKTogVWludDhBcnJheSB7XG4gIGNvbnN0IHBpeGVsQ291bnQgPSB3aWR0aCAqIGhlaWdodDtcbiAgY29uc3QgcmdiYSA9IG5ldyBVaW50OEFycmF5KHBpeGVsQ291bnQgKiA0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwaXhlbENvdW50OyBpKyspIHtcbiAgICByZ2JhW2kgKiA0XSA9IGRhdGFbaSAqIDNdO1xuICAgIHJnYmFbaSAqIDQgKyAxXSA9IGRhdGFbaSAqIDMgKyAxXTtcbiAgICByZ2JhW2kgKiA0ICsgMl0gPSBkYXRhW2kgKiAzICsgMl07XG4gICAgcmdiYVtpICogNCArIDNdID0gMjU1O1xuICB9XG4gIHJldHVybiByZ2JhO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0ZXh0dXJlIG9iamVjdCBmcm9tIGltYWdlIGRhdGEgdXNpbmcgbHVtYS5nbCA5IGRldmljZSBBUEkuXG4gKiBSZXR1cm5zIGEgcHJvcGVyIGx1bWEuZ2wgVGV4dHVyZSBvYmplY3QgdGhhdCB3b3JrcyB3aXRoIHRoZSBiaW5kaW5nIHN5c3RlbS5cbiAqL1xuZnVuY3Rpb24gbG9hZFRleHR1cmUoXG4gIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LFxuICBkZXZpY2U6IEx1bWFEZXZpY2UgfCB1bmRlZmluZWQsXG4gIGltYWdlRGF0YTogVGV4dHVyZSB8IFJhc3RlclRleHR1cmVEYXRhXG4pOiBUZXh0dXJlIHwgbnVsbCB7XG4gIGlmICghaW1hZ2VEYXRhKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBJZiBhbHJlYWR5IGEgbHVtYS5nbCBUZXh0dXJlIGluc3RhbmNlLCByZXR1cm4gYXMtaXNcbiAgY29uc3QgcmFzdGVyVGV4dHVyZURhdGEgPSBpbWFnZURhdGEgYXMgUmFzdGVyVGV4dHVyZURhdGE7XG4gIGlmIChcbiAgICByYXN0ZXJUZXh0dXJlRGF0YS5oYW5kbGUgfHxcbiAgICByYXN0ZXJUZXh0dXJlRGF0YS5pZD8uc3RhcnRzV2l0aD8uKCdsdW1hJykgfHxcbiAgICByYXN0ZXJUZXh0dXJlRGF0YS5kZXZpY2VcbiAgKSB7XG4gICAgcmV0dXJuIGltYWdlRGF0YSBhcyBUZXh0dXJlO1xuICB9XG5cbiAgY29uc3QgcmF3RGF0YSA9IGltYWdlRGF0YSBhcyBSYXN0ZXJUZXh0dXJlRGF0YTtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIGx1bWEgaW50ZXJuYWwgcHJvcGVydGllcyBub3QgaW4gV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB0eXBlXG4gIGNvbnN0IGx1bWFEZXZpY2UgPSBkZXZpY2UgfHwgZ2wubHVtYT8uZGV2aWNlIHx8IGdsLl9fbHVtYV9kZXZpY2U7XG5cbiAgaWYgKCFsdW1hRGV2aWNlPy5jcmVhdGVUZXh0dXJlKSB7XG4gICAgY29uc29sZS53YXJuKCdSYXN0ZXJMYXllcjogTm8gbHVtYS5nbCBkZXZpY2UgYXZhaWxhYmxlIGZvciB0ZXh0dXJlIGNyZWF0aW9uJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHNhbXBsZXJQYXJhbXMgPSBtYXBTYW1wbGVyUGFyYW1ldGVycyhyYXdEYXRhLnBhcmFtZXRlcnMgfHwge30pO1xuICAgIGNvbnN0IHRleHR1cmVGb3JtYXQgPSByYXdEYXRhLmZvcm1hdFxuICAgICAgPyBtYXBUZXh0dXJlRm9ybWF0KHJhd0RhdGEuZm9ybWF0LCByYXdEYXRhLnR5cGUpXG4gICAgICA6IFRFWFRVUkVfRk9STUFULlJHQkE4X1VOT1JNO1xuXG4gICAgY29uc3Qgd2lkdGggPSByYXdEYXRhLndpZHRoIHx8IHJhd0RhdGEuZGF0YT8ud2lkdGggfHwgMTtcbiAgICBjb25zdCBoZWlnaHQgPSByYXdEYXRhLmhlaWdodCB8fCByYXdEYXRhLmRhdGE/LmhlaWdodCB8fCAxO1xuXG4gICAgY29uc3QgdGV4dHVyZVByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZm9ybWF0OiB0ZXh0dXJlRm9ybWF0LFxuICAgICAgc2FtcGxlcjogc2FtcGxlclBhcmFtcyxcbiAgICAgIC4uLihyYXdEYXRhLm1pcG1hcHMgPT09IGZhbHNlID8ge21pcG1hcHM6IGZhbHNlfSA6IHt9KVxuICAgIH07XG5cbiAgICBpZiAocmF3RGF0YS5kYXRhKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJhd0RhdGEuZGF0YSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHxcbiAgICAgICAgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHxcbiAgICAgICAgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgfHxcbiAgICAgICAgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgSW1hZ2VEYXRhXG4gICAgICApIHtcbiAgICAgICAgdGV4dHVyZVByb3BzLmRhdGEgPSByYXdEYXRhLmRhdGE7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhyYXdEYXRhLmRhdGEpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByYXdEYXRhLmZvcm1hdCA9PT0gR0wuUkdCICYmXG4gICAgICAgICAgKHJhd0RhdGEuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpXG4gICAgICAgICkge1xuICAgICAgICAgIHRleHR1cmVQcm9wcy5kYXRhID0gZXhwYW5kUkdCdG9SR0JBKHJhd0RhdGEuZGF0YSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dHVyZVByb3BzLmRhdGEgPSByYXdEYXRhLmRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbHVtYURldmljZS5jcmVhdGVUZXh0dXJlKHRleHR1cmVQcm9wcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1Jhc3RlckxheWVyOiBGYWlsZWQgdG8gY3JlYXRlIHRleHR1cmUgdmlhIGRldmljZS5jcmVhdGVUZXh0dXJlOicsIGUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBSUEsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUcsV0FBQSxHQUFBSCxPQUFBO0FBQStFLFNBQUFJLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxP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
@@ -1,101 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2ViZ2wiLCJyZXF1aXJlIiwiTUlYRURfU0FNUExFUl9SRSIsIl9wYXRjaGVkIiwiY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMiLCJfb3JpZ2luYWwiLCJfcGF0Y2hlZEdldExpbmtTdGF0dXMiLCJnbCIsImRldmljZSIsImxpbmtlZCIsImdldFByb2dyYW1QYXJhbWV0ZXIiLCJoYW5kbGUiLCJsaW5rU3RhdHVzIiwiX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMiLCJ2YWxpZGF0ZVByb2dyYW0iLCJ2YWxpZGF0ZWQiLCJpbmZvTG9nIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ0ZXN0IiwicGF0Y2hQaXBlbGluZVZhbGlkYXRpb24iLCJXRUJHTFJlbmRlclBpcGVsaW5lIiwicHJvdG90eXBlIiwiX2dldExpbmtTdGF0dXMiLCJvcmlnaW5hbCIsImRldmljZVByb3RvIiwiV2ViR0xEZXZpY2UiLCJvcmlnRmFjdG9yeSIsIl9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJpbnN0YW5jZSIsImFwcGx5IiwiU2hhcmVkQ3RvciIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiY29uc3RydWN0b3IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcmFzdGVyL3BpcGVsaW5lLXZhbGlkYXRpb24tcGF0Y2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLyoqXG4gKiBQYXRjaCBsdW1hLmdsIDkncyBwaXBlbGluZSB2YWxpZGF0aW9uIHRvIHRvbGVyYXRlIG1peGVkLXNhbXBsZXItdHlwZVxuICogdmFsaWRhdGlvbiBlcnJvcnMgaW4gX2dldExpbmtTdGF0dXMoKS5cbiAqXG4gKiBXZWJHTDIncyB2YWxpZGF0ZVByb2dyYW0gY2hlY2tzIHRoYXQgc2FtcGxlciB1bmlmb3JtcyBvZiBkaWZmZXJlbnQgdHlwZXNcbiAqIChzYW1wbGVyMkQsIHVzYW1wbGVyMkQsIGlzYW1wbGVyMkQpIGFyZSBub3QgYXNzaWduZWQgdG8gdGhlIHNhbWUgdGV4dHVyZVxuICogdW5pdC4gUHJvZ3JhbXMgdGhhdCBtaXggc2FtcGxlciB0eXBlcyAoZS5nLiByYXN0ZXIgYmFuZCBkYXRhIGFzIHVzYW1wbGVyMkQgK1xuICogc2hhZG93IG1hcHMgYXMgc2FtcGxlcjJEKSBtYXkgZmFpbCB2YWxpZGF0aW9uIGV2ZW4gdGhvdWdoIHRoZXkgbGlua2VkXG4gKiBzdWNjZXNzZnVsbHkgYW5kIHdvcmsgY29ycmVjdGx5IG9uY2UgdGV4dHVyZSB1bml0cyBhcmUgYXNzaWduZWQgYXQgZHJhdyB0aW1lLlxuICpcbiAqIEluIGx1bWEuZ2wg4omlOS4zIHRoZSBfZ2V0TGlua1N0YXR1cyBtZXRob2QgbW92ZWQgZnJvbSBXRUJHTFJlbmRlclBpcGVsaW5lIHRvXG4gKiBXRUJHTFNoYXJlZFJlbmRlclBpcGVsaW5lIGFuZCBub3cgY2FsbHMgX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMoKSBiZWZvcmVcbiAqIHZhbGlkYXRlUHJvZ3JhbSwgd2hpY2ggZml4ZXMgbW9zdCBmYWxzZSBwb3NpdGl2ZXMuIEhvd2V2ZXIsIHNvbWUgV2ViR0xcbiAqIGRyaXZlcnMgc3RpbGwgcmVwb3J0IGVycm9ycyBldmVuIHdpdGggdW5pcXVlIHVuaXRzLCBzbyB3ZSBrZWVwIHN1cHByZXNzaW5nXG4gKiB0aGUga25vd24gZmFsc2UtcG9zaXRpdmUgYWJvdXQgbWl4ZWQgc2FtcGxlciB0eXBlcy4gV2UgcGF0Y2ggX2dldExpbmtTdGF0dXNcbiAqIG9uIHdoaWNoZXZlciBwaXBlbGluZSBjbGFzcyBvd25zIGl0LlxuICovXG5cbi8vIEB0cy1pZ25vcmUgcmVzb2x1dGlvbiBkZXBlbmRzIG9uIG1vZHVsZVJlc29sdXRpb24gc2V0dGluZ1xuaW1wb3J0IHtXRUJHTFJlbmRlclBpcGVsaW5lLCBXZWJHTERldmljZX0gZnJvbSAnQGx1bWEuZ2wvd2ViZ2wnO1xuXG5jb25zdCBNSVhFRF9TQU1QTEVSX1JFID0gL2RpZmZlcmVudCB0eXBlW3NdPyB1c2UgdGhlIHNhbWUgc2FtcGxlciBsb2NhdGlvbi9pO1xuXG5sZXQgX3BhdGNoZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMoX29yaWdpbmFsOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSB7XG4gIHJldHVybiBmdW5jdGlvbiBfcGF0Y2hlZEdldExpbmtTdGF0dXModGhpczogYW55KSB7XG4gICAgY29uc3Qge2dsfSA9IHRoaXMuZGV2aWNlO1xuICAgIGNvbnN0IGxpbmtlZCA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5oYW5kbGUsIDB4OGI4MiAvKiBMSU5LX1NUQVRVUyAqLyk7XG4gICAgaWYgKCFsaW5rZWQpIHtcbiAgICAgIHRoaXMubGlua1N0YXR1cyA9ICdlcnJvcic7XG4gICAgICByZXR1cm4gJ2xpbmstZXJyb3InO1xuICAgIH1cblxuICAgIC8vIGx1bWEuZ2wg4omlOS4zIGFzc2lnbnMgdW5pcXVlIHRleHR1cmUgdW5pdHMgdG8gc2FtcGxlcnMgYmVmb3JlXG4gICAgLy8gdmFsaWRhdGlvbiB2aWEgX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMuIENhbGwgaXQgaGVyZSBzbyB0aGF0XG4gICAgLy8gdGhlIHNhbXBsZXItdG8tdW5pdCBtYXBwaW5nIGlzIHBvcHVsYXRlZCB0aHJvdWdoIG91ciBwYXRjaGVkIHBhdGguXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9pbml0aWFsaXplU2FtcGxlclVuaWZvcm1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplU2FtcGxlclVuaWZvcm1zKCk7XG4gICAgfVxuXG4gICAgZ2wudmFsaWRhdGVQcm9ncmFtKHRoaXMuaGFuZGxlKTtcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMuaGFuZGxlLCAweDhiODMgLyogVkFMSURBVEVfU1RBVFVTICovKTtcbiAgICBpZiAoIXZhbGlkYXRlZCkge1xuICAgICAgY29uc3QgaW5mb0xvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMuaGFuZGxlKSB8fCAnJztcbiAgICAgIGlmICghTUlYRURfU0FNUExFUl9SRS50ZXN0KGluZm9Mb2cpKSB7XG4gICAgICAgIHRoaXMubGlua1N0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgIHJldHVybiAndmFsaWRhdGlvbi1lcnJvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5saW5rU3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFBpcGVsaW5lVmFsaWRhdGlvbigpOiB2b2lkIHtcbiAgaWYgKF9wYXRjaGVkKSByZXR1cm47XG4gIF9wYXRjaGVkID0gdHJ1ZTtcblxuICAvLyBTdHJhdGVneSAxOiBsdW1hLmdsIDw5LjMg4oCUIF9nZXRMaW5rU3RhdHVzIG9uIFdFQkdMUmVuZGVyUGlwZWxpbmVcbiAgaWYgKFxuICAgIFdFQkdMUmVuZGVyUGlwZWxpbmU/LnByb3RvdHlwZSAmJlxuICAgIHR5cGVvZiAoV0VCR0xSZW5kZXJQaXBlbGluZS5wcm90b3R5cGUgYXMgYW55KS5fZ2V0TGlua1N0YXR1cyA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChXRUJHTFJlbmRlclBpcGVsaW5lLnByb3RvdHlwZSBhcyBhbnkpLl9nZXRMaW5rU3RhdHVzO1xuICAgIChXRUJHTFJlbmRlclBpcGVsaW5lLnByb3RvdHlwZSBhcyBhbnkpLl9nZXRMaW5rU3RhdHVzID0gY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMob3JpZ2luYWwpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFN0cmF0ZWd5IDI6IGx1bWEuZ2wg4omlOS4zIOKAlCBfZ2V0TGlua1N0YXR1cyBtb3ZlZCB0byBXRUJHTFNoYXJlZFJlbmRlclBpcGVsaW5lLlxuICAvLyBUaGF0IGNsYXNzIGlzIG5vdCBwdWJsaWNseSBleHBvcnRlZCwgc28gd2UgaG9vayB0aGUgZmFjdG9yeSBvbiBXZWJHTERldmljZVxuICAvLyB0aGF0IGNyZWF0ZXMgc2hhcmVkIHBpcGVsaW5lcy4gVGhlIGZpcnN0IGludm9jYXRpb24gZGlzY292ZXJzIHRoZSBjbGFzcyxcbiAgLy8gcGF0Y2hlcyBpdHMgcHJvdG90eXBlLCB0aGVuIHJlLXZhbGlkYXRlcyB0aGUgaW5zdGFuY2UuXG4gIGNvbnN0IGRldmljZVByb3RvID0gV2ViR0xEZXZpY2U/LnByb3RvdHlwZSBhcyBhbnk7XG4gIGNvbnN0IG9yaWdGYWN0b3J5ID0gZGV2aWNlUHJvdG8/Ll9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMO1xuICBpZiAodHlwZW9mIG9yaWdGYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG5cbiAgZGV2aWNlUHJvdG8uX2NyZWF0ZVNoYXJlZFJlbmRlclBpcGVsaW5lV2ViR0wgPSBmdW5jdGlvbiAodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gb3JpZ0ZhY3RvcnkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgU2hhcmVkQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0YW5jZSkuY29uc3RydWN0b3I7XG5cbiAgICBpZiAoXG4gICAgICBTaGFyZWRDdG9yICYmXG4gICAgICBTaGFyZWRDdG9yICE9PSBXRUJHTFJlbmRlclBpcGVsaW5lICYmXG4gICAgICB0eXBlb2YgU2hhcmVkQ3Rvci5wcm90b3R5cGUuX2dldExpbmtTdGF0dXMgPT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gU2hhcmVkQ3Rvci5wcm90b3R5cGUuX2dldExpbmtTdGF0dXM7XG4gICAgICBTaGFyZWRDdG9yLnByb3RvdHlwZS5fZ2V0TGlua1N0YXR1cyA9IGNyZWF0ZVBhdGNoZWRMaW5rU3RhdHVzKG9yaWdpbmFsKTtcblxuICAgICAgLy8gUmUtdmFsaWRhdGUgdGhpcyBmaXJzdCBpbnN0YW5jZSBzaW5jZSBpdHMgX2dldExpbmtTdGF0dXMgYWxyZWFkeSByYW5cbiAgICAgIC8vIHdpdGggdGhlIHVucGF0Y2hlZCB2ZXJzaW9uIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAgICBpZiAoaW5zdGFuY2UubGlua1N0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgIGluc3RhbmNlLl9nZXRMaW5rU3RhdHVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBmYWN0b3J5IOKAlCBmdXR1cmUgaW5zdGFuY2VzIHdpbGwgdXNlIHRoZSBwYXRjaGVkIHByb3RvdHlwZVxuICAgIGRldmljZVByb3RvLl9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMID0gb3JpZ0ZhY3Rvcnk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFzQkEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBdEJBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFHQSxJQUFNQyxnQkFBZ0IsR0FBRyxtREFBbUQ7QUFFNUUsSUFBSUMsUUFBUSxHQUFHLEtBQUs7QUFFcEIsU0FBU0MsdUJBQXVCQSxDQUFDQyxTQUEwQyxFQUFFO0VBQzNFLE9BQU8sU0FBU0MscUJBQXFCQSxDQUFBLEVBQVk7SUFDL0MsSUFBT0MsRUFBRSxHQUFJLElBQUksQ0FBQ0MsTUFBTSxDQUFqQkQsRUFBRTtJQUNULElBQU1FLE1BQU0sR0FBR0YsRUFBRSxDQUFDRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUNDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDNUUsSUFBSSxDQUFDRixNQUFNLEVBQUU7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