@kepler.gl/deckgl-layers 3.3.0-alpha.5 → 3.3.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/3d-building-layer/3d-building-layer.js +66 -0
- package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
- package/dist/cjs/3d-building-layer/types.js +6 -0
- package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
- package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
- package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
- package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
- package/dist/cjs/globe/atmosphere-layer.js +341 -0
- package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
- package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
- package/dist/cjs/globe/globe-layers.js +574 -0
- package/dist/cjs/globe/globe-stars-layer.js +99 -0
- package/dist/cjs/globe/globe-stars-layer.spec.js +42 -0
- package/dist/cjs/globe/globe-view.js +404 -0
- package/dist/{globe → cjs/globe}/index.js +19 -1
- package/dist/cjs/globe/mvt-label-layer.js +190 -0
- package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
- package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
- package/dist/cjs/layer-utils/cluster-utils.js +93 -0
- package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
- package/dist/cjs/layer-utils/globe-cell-utils.js +173 -0
- package/dist/cjs/layer-utils/shader-utils.js +38 -0
- package/dist/cjs/line-layer/line-layer.js +95 -0
- package/dist/cjs/raster/images.js +271 -0
- package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
- package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
- package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
- package/dist/cjs/raster/types.js +6 -0
- package/dist/cjs/raster/util.js +139 -0
- package/dist/cjs/raster/webgl/color/colormap.js +45 -0
- package/dist/cjs/raster/webgl/color/filter.js +58 -0
- package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
- package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
- package/dist/cjs/raster/webgl/color/saturation.js +42 -0
- package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
- package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
- package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
- package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
- package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
- package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
- package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
- package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
- package/dist/cjs/raster/webgl/texture/mask.js +50 -0
- package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
- package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
- package/dist/cjs/raster/webgl/types.js +6 -0
- package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
- package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
- package/dist/cjs/wms/wms-layer.js +624 -0
- package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
- package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
- package/dist/esm/3d-building-layer/types.js +3 -0
- package/dist/esm/cluster-layer/cluster-layer.js +286 -0
- package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
- package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
- package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
- package/dist/esm/globe/atmosphere-layer.js +335 -0
- package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
- package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
- package/dist/esm/globe/globe-layers.js +566 -0
- package/dist/esm/globe/globe-stars-layer.js +92 -0
- package/dist/esm/globe/globe-stars-layer.spec.js +40 -0
- package/dist/esm/globe/globe-view.js +398 -0
- package/dist/esm/globe/index.js +26 -0
- package/dist/esm/globe/mvt-label-layer.js +187 -0
- package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
- package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/layer-utils/aggregation-utils.js +172 -0
- package/dist/esm/layer-utils/cluster-utils.js +86 -0
- package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
- package/dist/esm/layer-utils/globe-cell-utils.js +167 -0
- package/dist/esm/layer-utils/shader-utils.js +32 -0
- package/dist/esm/line-layer/line-layer.js +91 -0
- package/dist/esm/raster/images.js +267 -0
- package/dist/esm/raster/pipeline-validation-patch.js +94 -0
- package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
- package/dist/esm/raster/raster-processing-uniforms.js +118 -0
- package/dist/esm/raster/types.js +3 -0
- package/dist/esm/raster/util.js +134 -0
- package/dist/esm/raster/webgl/color/colormap.js +39 -0
- package/dist/esm/raster/webgl/color/filter.js +52 -0
- package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
- package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
- package/dist/esm/raster/webgl/color/saturation.js +36 -0
- package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
- package/dist/esm/raster/webgl/index.js +26 -0
- package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
- package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
- package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
- package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
- package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
- package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
- package/dist/esm/raster/webgl/texture/mask.js +44 -0
- package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
- package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
- package/dist/esm/raster/webgl/types.js +3 -0
- package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
- package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
- package/dist/esm/wms/wms-layer.js +619 -0
- package/dist/globe/atmosphere-layer.d.ts +22 -1
- package/dist/globe/globe-stars-layer.d.ts +5 -0
- package/dist/globe/globe-stars-layer.spec.d.ts +1 -0
- package/dist/globe/index.d.ts +2 -2
- package/dist/wms/wms-layer.d.ts +8 -0
- package/package.json +19 -10
- package/dist/3d-building-layer/3d-building-layer.js +0 -66
- package/dist/3d-building-layer/3d-building-utils.js +0 -166
- package/dist/3d-building-layer/types.js +0 -6
- package/dist/cluster-layer/cluster-layer.js +0 -292
- package/dist/column-layer/enhanced-column-layer.js +0 -160
- package/dist/deckgl-extensions/filter-shader-module.js +0 -26
- package/dist/globe/atmosphere-layer.js +0 -220
- package/dist/globe/enhanced-multi-icon-layer.js +0 -63
- package/dist/globe/globe-depth-disk-layer.js +0 -145
- package/dist/globe/globe-layers.js +0 -569
- package/dist/globe/globe-stars-layer.js +0 -69
- package/dist/globe/globe-view.js +0 -404
- package/dist/globe/mvt-label-layer.js +0 -190
- package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -116
- package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -134
- package/dist/layer-utils/aggregation-utils.js +0 -181
- package/dist/layer-utils/cluster-utils.js +0 -93
- package/dist/layer-utils/cpu-aggregator.js +0 -798
- package/dist/layer-utils/globe-cell-utils.js +0 -173
- package/dist/layer-utils/shader-utils.js +0 -38
- package/dist/line-layer/line-layer.js +0 -95
- package/dist/raster/images.js +0 -271
- package/dist/raster/pipeline-validation-patch.js +0 -101
- package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
- package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer.js +0 -287
- package/dist/raster/raster-mesh-layer/matrix.d.ts +0 -4
- package/dist/raster/raster-mesh-layer/matrix.js +0 -18
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -321
- package/dist/raster/raster-processing-uniforms.js +0 -124
- package/dist/raster/types.js +0 -6
- package/dist/raster/util.js +0 -139
- package/dist/raster/webgl/color/colormap.js +0 -45
- package/dist/raster/webgl/color/filter.js +0 -58
- package/dist/raster/webgl/color/gamma-contrast.js +0 -68
- package/dist/raster/webgl/color/linear-rescale.js +0 -35
- package/dist/raster/webgl/color/saturation.js +0 -42
- package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
- package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
- package/dist/raster/webgl/spectral-indices/evi.js +0 -26
- package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
- package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
- package/dist/raster/webgl/spectral-indices/savi.js +0 -21
- package/dist/raster/webgl/texture/combine-bands.js +0 -65
- package/dist/raster/webgl/texture/mask.js +0 -50
- package/dist/raster/webgl/texture/reorder-bands.js +0 -72
- package/dist/raster/webgl/texture/rgba-image.js +0 -34
- package/dist/raster/webgl/types.js +0 -6
- package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -88
- package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
- package/dist/wms/wms-layer.js +0 -594
|
@@ -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("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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9pc0VxdWFsIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb25zdGFudHMyIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiREVGQVVMVF9TQU1QTEVSX1BBUkFNRVRFUlMiLCJtaW5GaWx0ZXIiLCJGSUxURVJfTU9ERSIsIk5FQVJFU1QiLCJtYWdGaWx0ZXIiLCJhZGRyZXNzTW9kZVUiLCJBRERSRVNTX01PREUiLCJDTEFNUF9UT19FREdFIiwiYWRkcmVzc01vZGVWIiwibG9hZEltYWdlSXRlbSIsImdsIiwiZGV2aWNlIiwiaW1hZ2VJdGVtIiwicmVzdWx0IiwiZGlydHlSZXN1bHQiLCJtYXAiLCJ4IiwibG9hZFRleHR1cmUiLCJfaXRlcmF0b3IiLCJfc3RlcCIsInRleHR1cmUiLCJlcnIiLCJsb2FkSW1hZ2VzIiwiX3JlZiIsImltYWdlcyIsImltYWdlc0RhdGEiLCJvbGRJbWFnZXNEYXRhIiwiaW1hZ2VzRGlydHkiLCJoYXNQZW5kaW5nVXBsb2FkcyIsImtleSIsImNoYW5nZWRLZXlzIiwiaXNFcXVhbCIsIl9pIiwiX2NoYW5nZWRLZXlzIiwiaW1hZ2VEYXRhIiwibG9hZGVkSXRlbSIsIm1hcFNhbXBsZXJQYXJhbWV0ZXJzIiwib2xkUGFyYW1zIiwibWFnRmlsdGVyTWFwIiwiR0wiLCJMSU5FQVIiLCJtaW5GaWx0ZXJNYXAiLCJORUFSRVNUX01JUE1BUF9ORUFSRVNUIiwibWlwbWFwRmlsdGVyIiwiTkVBUkVTVF9NSVBNQVBfTElORUFSIiwiTElORUFSX01JUE1BUF9ORUFSRVNUIiwiTElORUFSX01JUE1BUF9MSU5FQVIiLCJ3cmFwTWFwIiwiUkVQRUFUIiwiTUlSUk9SRURfUkVQRUFUIiwiTUlSUk9SX1JFUEVBVCIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsInVuZGVmaW5lZCIsIm1hcHBlZCIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsIlRFWFRVUkVfV1JBUF9TIiwiVEVYVFVSRV9XUkFQX1QiLCJtYXBUZXh0dXJlRm9ybWF0IiwiZ2xGb3JtYXQiLCJfZ2xUeXBlIiwiUjhVSSIsIlRFWFRVUkVfRk9STUFUIiwiUjhfVUlOVCIsIlIxNlVJIiwiUjE2X1VJTlQiLCJSMzJVSSIsIlIzMl9VSU5UIiwiUjhJIiwiUjhfU0lOVCIsIlIxNkkiLCJSMTZfU0lOVCIsIlIzMkkiLCJSMzJfU0lOVCIsIlIzMkYiLCJSMzJfRkxPQVQiLCJSR0JBIiwiUkdCQThfVU5PUk0iLCJSR0IiLCJleHBhbmRSR0J0b1JHQkEiLCJkYXRhIiwid2lkdGgiLCJoZWlnaHQiLCJwaXhlbENvdW50IiwicmdiYSIsIlVpbnQ4QXJyYXkiLCJpIiwiX3Jhc3RlclRleHR1cmVEYXRhJGlkIiwiX3Jhc3RlclRleHR1cmVEYXRhJGlkMiIsIl9nbCRsdW1hIiwicmFzdGVyVGV4dHVyZURhdGEiLCJoYW5kbGUiLCJpZCIsInN0YXJ0c1dpdGgiLCJyYXdEYXRhIiwibHVtYURldmljZSIsImx1bWEiLCJfX2x1bWFfZGV2aWNlIiwiY3JlYXRlVGV4dHVyZSIsImNvbnNvbGUiLCJ3YXJuIiwiX3Jhd0RhdGEkZGF0YSIsIl9yYXdEYXRhJGRhdGEyIiwic2FtcGxlclBhcmFtcyIsInBhcmFtZXRlcnMiLCJ0ZXh0dXJlRm9ybWF0IiwiZm9ybWF0IiwidHlwZSIsInRleHR1cmVQcm9wcyIsInNhbXBsZXIiLCJtaXBtYXBzIiwiSFRNTEltYWdlRWxlbWVudCIsIkhUTUxDYW52YXNFbGVtZW50IiwiSW1hZ2VCaXRtYXAiLCJJbWFnZURhdGEiLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsIlVpbnQ4Q2xhbXBlZEFycmF5Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Jhc3Rlci9pbWFnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLy8gQHRzLWlnbm9yZSBHTCByZXNvbHV0aW9uIGRlcGVuZHMgb24gbW9kdWxlUmVzb2x1dGlvbiBzZXR0aW5nXG5pbXBvcnQge0dMfSBmcm9tICdAbHVtYS5nbC9jb25zdGFudHMnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuXG5pbXBvcnQge0ZJTFRFUl9NT0RFLCBBRERSRVNTX01PREUsIFRFWFRVUkVfRk9STUFUfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7VGV4dHVyZX0gZnJvbSAnQGx1bWEuZ2wvY29yZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VJbnB1dCwgSW1hZ2VTdGF0ZX0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogTGVnYWN5IHRleHR1cmUgY3JlYXRpb24gZGVzY3JpcHRvciB1c2VkIGJ5IHJhc3RlciBzaGFkZXIgbW9kdWxlcy5cbiAqIENvbnRhaW5zIENQVS1zaWRlIGRhdGEgKyBvbGQgR0wtZW51bS1iYXNlZCBwYXJhbWV0ZXJzIHRoYXQgZ2V0XG4gKiB0cmFuc2xhdGVkIHRvIGx1bWEuZ2wgOSdzIGRldmljZS5jcmVhdGVUZXh0dXJlKCkgcHJvcHMuXG4gKi9cbnR5cGUgVGV4dHVyZURhdGFTb3VyY2UgPVxuICB8IEhUTUxJbWFnZUVsZW1lbnRcbiAgfCBIVE1MQ2FudmFzRWxlbWVudFxuICB8IEltYWdlQml0bWFwXG4gIHwgSW1hZ2VEYXRhXG4gIHwgQXJyYXlCdWZmZXJWaWV3O1xuXG50eXBlIFJhc3RlclRleHR1cmVEYXRhID0ge1xuICBoYW5kbGU/OiB1bmtub3duO1xuICBpZD86IHN0cmluZztcbiAgZGV2aWNlPzogdW5rbm93bjtcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgZm9ybWF0PzogbnVtYmVyO1xuICB0eXBlPzogbnVtYmVyO1xuICBwYXJhbWV0ZXJzPzogUmVjb3JkPG51bWJlciwgbnVtYmVyPjtcbiAgbWlwbWFwcz86IGJvb2xlYW47XG4gIGRhdGE/OiBUZXh0dXJlRGF0YVNvdXJjZSAmIHt3aWR0aD86IG51bWJlcjsgaGVpZ2h0PzogbnVtYmVyfTtcbn07XG5cbi8qKlxuICogVGV4dHVyZSBzYW1wbGVyIHBhcmFtZXRlcnMgZm9yIGx1bWEuZ2wgOSB0ZXh0dXJlc1xuICovXG5jb25zdCBERUZBVUxUX1NBTVBMRVJfUEFSQU1FVEVSUyA9IHtcbiAgbWluRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNULFxuICBtYWdGaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1QsXG4gIGFkZHJlc3NNb2RlVTogQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0UsXG4gIGFkZHJlc3NNb2RlVjogQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0Vcbn07XG5cbi8qKiBsdW1hLmdsIGRldmljZSBpbnRlcmZhY2UgZm9yIHRleHR1cmUgY3JlYXRpb24gKi9cbmludGVyZmFjZSBMdW1hRGV2aWNlIHtcbiAgY3JlYXRlVGV4dHVyZShwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBUZXh0dXJlO1xuICBnbD86IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG59XG5cbnR5cGUgTG9hZEltYWdlc09wdGlvbnMgPSB7XG4gIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICBkZXZpY2U/OiBMdW1hRGV2aWNlO1xuICBpbWFnZXM6IEltYWdlU3RhdGU7XG4gIGltYWdlc0RhdGE6IEltYWdlSW5wdXQ7XG4gIG9sZEltYWdlc0RhdGE6IEltYWdlSW5wdXQ7XG59O1xuXG4vKipcbiAqIExvYWQgaW1hZ2UgaXRlbXMgdG8gd2ViZ2wgY29udGV4dFxuICovXG5mdW5jdGlvbiBsb2FkSW1hZ2VJdGVtKFxuICBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCxcbiAgZGV2aWNlOiBMdW1hRGV2aWNlIHwgdW5kZWZpbmVkLFxuICBpbWFnZUl0ZW06IFJhc3RlclRleHR1cmVEYXRhIHwgVGV4dHVyZSB8IChSYXN0ZXJUZXh0dXJlRGF0YSB8IFRleHR1cmUpW11cbik6IG51bGwgfCBUZXh0dXJlIHwgVGV4dHVyZVtdIHtcbiAgbGV0IHJlc3VsdDogbnVsbCB8IFRleHR1cmUgfCBUZXh0dXJlW107XG4gIGlmIChBcnJheS5pc0FycmF5KGltYWdlSXRlbSkpIHtcbiAgICBjb25zdCBkaXJ0eVJlc3VsdCA9IGltYWdlSXRlbS5tYXAoeCA9PiBsb2FkVGV4dHVyZShnbCwgZGV2aWNlLCB4KSk7XG4gICAgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCB0ZXh0dXJlIG9mIGRpcnR5UmVzdWx0KSB7XG4gICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICByZXN1bHQucHVzaCh0ZXh0dXJlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyZXN1bHQubGVuZ3RoKSB7XG4gICAgICByZXN1bHQgPSBudWxsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBsb2FkVGV4dHVyZShnbCwgZGV2aWNlLCBpbWFnZUl0ZW0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTG9hZCBpbWFnZSBpdGVtcyB0byB3ZWJnbCBjb250ZXh0XG4gKi9cbnR5cGUgTG9hZEltYWdlc1Jlc3VsdCA9IHtcbiAgLyoqIFVwZGF0ZWQgaW1hZ2VzIHN0YXRlLCBvciBudWxsIGlmIG5vdGhpbmcgY2hhbmdlZCAqL1xuICBpbWFnZXM6IEltYWdlU3RhdGUgfCBudWxsO1xuICAvKiogVHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSB0ZXh0dXJlIHVwbG9hZCBmYWlsZWQgYW5kIHNob3VsZCBiZSByZXRyaWVkICovXG4gIGhhc1BlbmRpbmdVcGxvYWRzOiBib29sZWFuO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBsb2FkSW1hZ2VzKHtcbiAgZ2wsXG4gIGRldmljZSxcbiAgaW1hZ2VzLFxuICBpbWFnZXNEYXRhLFxuICBvbGRJbWFnZXNEYXRhXG59OiBMb2FkSW1hZ2VzT3B0aW9ucyk6IExvYWRJbWFnZXNSZXN1bHQge1xuICBsZXQgaW1hZ2VzRGlydHkgPSBmYWxzZTtcbiAgbGV0IGhhc1BlbmRpbmdVcGxvYWRzID0gZmFsc2U7XG5cbiAgaWYgKG9sZEltYWdlc0RhdGEpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRJbWFnZXNEYXRhKSB7XG4gICAgICBpZiAoaW1hZ2VzRGF0YSAmJiAhKGtleSBpbiBpbWFnZXNEYXRhKSAmJiBrZXkgaW4gaW1hZ2VzKSB7XG4gICAgICAgIGRlbGV0ZSBpbWFnZXNba2V5XTtcbiAgICAgICAgaW1hZ2VzRGlydHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNoYW5nZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbWFnZXNEYXRhKSB7XG4gICAgaWYgKCFvbGRJbWFnZXNEYXRhIHx8IChvbGRJbWFnZXNEYXRhICYmICEoa2V5IGluIG9sZEltYWdlc0RhdGEpKSkge1xuICAgICAgY2hhbmdlZEtleXMucHVzaChrZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0VxdWFsKGltYWdlc0RhdGFba2V5XSwgb2xkSW1hZ2VzRGF0YVtrZXldKSkge1xuICAgICAgY2hhbmdlZEtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIGNoYW5nZWRLZXlzKSB7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2VzRGF0YVtrZXldO1xuICAgIGlmICghaW1hZ2VEYXRhKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZWRJdGVtID0gbG9hZEltYWdlSXRlbShnbCwgZGV2aWNlLCBpbWFnZURhdGEpO1xuICAgIGlmIChsb2FkZWRJdGVtKSB7XG4gICAgICBpbWFnZXNba2V5XSA9IGxvYWRlZEl0ZW07XG4gICAgICAvLyBPbmx5IG1hcmsgZGlydHkgd2hlbiB0aGUgdGV4dHVyZSB3YXMgYWN0dWFsbHkgdXBsb2FkZWQuXG4gICAgICBpbWFnZXNEaXJ0eSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwbG9hZCBmYWlsZWQgKGRldmljZSBub3QgcmVhZHkgb3IgY3JlYXRlVGV4dHVyZSB0aHJldykuIFNpZ25hbCB0aGF0XG4gICAgICAvLyB0aGUgY2FsbGVyIHNob3VsZCByZXRyeSBuZXh0IGZyYW1lIOKAlCBkbyBOT1Qgc2V0IGltYWdlc0RpcnR5IHNvIHdlXG4gICAgICAvLyBkb24ndCBwcm9wYWdhdGUgYW4gaW1hZ2VzIG9iamVjdCB3aXRoIGEgbWlzc2luZyBrZXkgdGhhdCBjYXVzZXNcbiAgICAgIC8vIGRyYXcoKSB0byBiYWlsIHBlcm1hbmVudGx5LlxuICAgICAgaGFzUGVuZGluZ1VwbG9hZHMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7aW1hZ2VzOiBpbWFnZXNEaXJ0eSA/IGltYWdlcyA6IG51bGwsIGhhc1BlbmRpbmdVcGxvYWRzfTtcbn1cblxuLyoqXG4gKiBNYXAgb2xkIEdMIHRleHR1cmUgcGFyYW1ldGVyIGNvbnN0YW50cyB0byBsdW1hLmdsIDkgc2FtcGxlciBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIG1hcFNhbXBsZXJQYXJhbWV0ZXJzKG9sZFBhcmFtczogUmVjb3JkPG51bWJlciwgbnVtYmVyPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7Li4uREVGQVVMVF9TQU1QTEVSX1BBUkFNRVRFUlN9O1xuXG4gIGNvbnN0IG1hZ0ZpbHRlck1hcCA9IHtcbiAgICBbR0wuTkVBUkVTVF06IEZJTFRFUl9NT0RFLk5FQVJFU1QsXG4gICAgW0dMLkxJTkVBUl06IEZJTFRFUl9NT0RFLkxJTkVBUlxuICB9O1xuXG4gIGNvbnN0IG1pbkZpbHRlck1hcDogUmVjb3JkPG51bWJlciwge21pbkZpbHRlcjogc3RyaW5nOyBtaXBtYXBGaWx0ZXI/OiBzdHJpbmd9PiA9IHtcbiAgICBbR0wuTkVBUkVTVF06IHttaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1R9LFxuICAgIFtHTC5MSU5FQVJdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5MSU5FQVJ9LFxuICAgIFtHTC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUXToge1xuICAgICAgbWluRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNULFxuICAgICAgbWlwbWFwRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNUXG4gICAgfSxcbiAgICBbR0wuTkVBUkVTVF9NSVBNQVBfTElORUFSXToge21pbkZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVCwgbWlwbWFwRmlsdGVyOiBGSUxURVJfTU9ERS5MSU5FQVJ9LFxuICAgIFtHTC5MSU5FQVJfTUlQTUFQX05FQVJFU1RdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5MSU5FQVIsIG1pcG1hcEZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVH0sXG4gICAgW0dMLkxJTkVBUl9NSVBNQVBfTElORUFSXToge21pbkZpbHRlcjogRklMVEVSX01PREUuTElORUFSLCBtaXBtYXBGaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUn1cbiAgfTtcblxuICBjb25zdCB3cmFwTWFwID0ge1xuICAgIFtHTC5DTEFNUF9UT19FREdFXTogQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0UsXG4gICAgW0dMLlJFUEVBVF06IEFERFJFU1NfTU9ERS5SRVBFQVQsXG4gICAgW0dMLk1JUlJPUkVEX1JFUEVBVF06IEFERFJFU1NfTU9ERS5NSVJST1JfUkVQRUFUXG4gIH07XG5cbiAgaWYgKG9sZFBhcmFtcykge1xuICAgIGlmIChvbGRQYXJhbXNbR0wuVEVYVFVSRV9NSU5fRklMVEVSXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBtYXBwZWQgPSBtaW5GaWx0ZXJNYXBbb2xkUGFyYW1zW0dMLlRFWFRVUkVfTUlOX0ZJTFRFUl1dO1xuICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICByZXN1bHQubWluRmlsdGVyID0gbWFwcGVkLm1pbkZpbHRlcjtcbiAgICAgICAgaWYgKG1hcHBlZC5taXBtYXBGaWx0ZXIpIHtcbiAgICAgICAgICByZXN1bHQubWlwbWFwRmlsdGVyID0gbWFwcGVkLm1pcG1hcEZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2xkUGFyYW1zW0dMLlRFWFRVUkVfTUFHX0ZJTFRFUl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0Lm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlck1hcFtvbGRQYXJhbXNbR0wuVEVYVFVSRV9NQUdfRklMVEVSXV0gfHwgRklMVEVSX01PREUuTkVBUkVTVDtcbiAgICB9XG4gICAgaWYgKG9sZFBhcmFtc1tHTC5URVhUVVJFX1dSQVBfU10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmFkZHJlc3NNb2RlVSA9IHdyYXBNYXBbb2xkUGFyYW1zW0dMLlRFWFRVUkVfV1JBUF9TXV0gfHwgQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0U7XG4gICAgfVxuICAgIGlmIChvbGRQYXJhbXNbR0wuVEVYVFVSRV9XUkFQX1RdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdC5hZGRyZXNzTW9kZVYgPSB3cmFwTWFwW29sZFBhcmFtc1tHTC5URVhUVVJFX1dSQVBfVF1dIHx8IEFERFJFU1NfTU9ERS5DTEFNUF9UT19FREdFO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogTWFwIG9sZCBHTCBmb3JtYXQvdHlwZSB0byBsdW1hLmdsIDkgdGV4dHVyZSBmb3JtYXQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIG1hcFRleHR1cmVGb3JtYXQoZ2xGb3JtYXQ6IG51bWJlciwgX2dsVHlwZT86IG51bWJlcik6IHN0cmluZyB7XG4gIHN3aXRjaCAoZ2xGb3JtYXQpIHtcbiAgICBjYXNlIEdMLlI4VUk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjhfVUlOVDtcbiAgICBjYXNlIEdMLlIxNlVJOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlIxNl9VSU5UO1xuICAgIGNhc2UgR0wuUjMyVUk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjMyX1VJTlQ7XG4gICAgY2FzZSBHTC5SOEk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjhfU0lOVDtcbiAgICBjYXNlIEdMLlIxNkk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjE2X1NJTlQ7XG4gICAgY2FzZSBHTC5SMzJJOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlIzMl9TSU5UO1xuICAgIGNhc2UgR0wuUjMyRjpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SMzJfRkxPQVQ7XG4gICAgY2FzZSBHTC5SR0JBOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlJHQkE4X1VOT1JNO1xuICAgIGNhc2UgR0wuUkdCOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlJHQkE4X1VOT1JNO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBhbmQgMy1ieXRlLXBlci1waXhlbCBSR0IgZGF0YSB0byA0LWJ5dGUtcGVyLXBpeGVsIFJHQkEuXG4gKiBOZWVkZWQgYmVjYXVzZSBXZWJHUFUvbHVtYS5nbCA5IGhhcyBubyAzLWNoYW5uZWwgdGV4dHVyZSBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIGV4cGFuZFJHQnRvUkdCQShcbiAgZGF0YTogVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlclxuKTogVWludDhBcnJheSB7XG4gIGNvbnN0IHBpeGVsQ291bnQgPSB3aWR0aCAqIGhlaWdodDtcbiAgY29uc3QgcmdiYSA9IG5ldyBVaW50OEFycmF5KHBpeGVsQ291bnQgKiA0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwaXhlbENvdW50OyBpKyspIHtcbiAgICByZ2JhW2kgKiA0XSA9IGRhdGFbaSAqIDNdO1xuICAgIHJnYmFbaSAqIDQgKyAxXSA9IGRhdGFbaSAqIDMgKyAxXTtcbiAgICByZ2JhW2kgKiA0ICsgMl0gPSBkYXRhW2kgKiAzICsgMl07XG4gICAgcmdiYVtpICogNCArIDNdID0gMjU1O1xuICB9XG4gIHJldHVybiByZ2JhO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0ZXh0dXJlIG9iamVjdCBmcm9tIGltYWdlIGRhdGEgdXNpbmcgbHVtYS5nbCA5IGRldmljZSBBUEkuXG4gKiBSZXR1cm5zIGEgcHJvcGVyIGx1bWEuZ2wgVGV4dHVyZSBvYmplY3QgdGhhdCB3b3JrcyB3aXRoIHRoZSBiaW5kaW5nIHN5c3RlbS5cbiAqL1xuZnVuY3Rpb24gbG9hZFRleHR1cmUoXG4gIGdsOiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LFxuICBkZXZpY2U6IEx1bWFEZXZpY2UgfCB1bmRlZmluZWQsXG4gIGltYWdlRGF0YTogVGV4dHVyZSB8IFJhc3RlclRleHR1cmVEYXRhXG4pOiBUZXh0dXJlIHwgbnVsbCB7XG4gIGlmICghaW1hZ2VEYXRhKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBJZiBhbHJlYWR5IGEgbHVtYS5nbCBUZXh0dXJlIGluc3RhbmNlLCByZXR1cm4gYXMtaXNcbiAgY29uc3QgcmFzdGVyVGV4dHVyZURhdGEgPSBpbWFnZURhdGEgYXMgUmFzdGVyVGV4dHVyZURhdGE7XG4gIGlmIChcbiAgICByYXN0ZXJUZXh0dXJlRGF0YS5oYW5kbGUgfHxcbiAgICByYXN0ZXJUZXh0dXJlRGF0YS5pZD8uc3RhcnRzV2l0aD8uKCdsdW1hJykgfHxcbiAgICByYXN0ZXJUZXh0dXJlRGF0YS5kZXZpY2VcbiAgKSB7XG4gICAgcmV0dXJuIGltYWdlRGF0YSBhcyBUZXh0dXJlO1xuICB9XG5cbiAgY29uc3QgcmF3RGF0YSA9IGltYWdlRGF0YSBhcyBSYXN0ZXJUZXh0dXJlRGF0YTtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIGx1bWEgaW50ZXJuYWwgcHJvcGVydGllcyBub3QgaW4gV2ViR0wyUmVuZGVyaW5nQ29udGV4dCB0eXBlXG4gIGNvbnN0IGx1bWFEZXZpY2UgPSBkZXZpY2UgfHwgZ2wubHVtYT8uZGV2aWNlIHx8IGdsLl9fbHVtYV9kZXZpY2U7XG5cbiAgaWYgKCFsdW1hRGV2aWNlPy5jcmVhdGVUZXh0dXJlKSB7XG4gICAgY29uc29sZS53YXJuKCdSYXN0ZXJMYXllcjogTm8gbHVtYS5nbCBkZXZpY2UgYXZhaWxhYmxlIGZvciB0ZXh0dXJlIGNyZWF0aW9uJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHNhbXBsZXJQYXJhbXMgPSBtYXBTYW1wbGVyUGFyYW1ldGVycyhyYXdEYXRhLnBhcmFtZXRlcnMgfHwge30pO1xuICAgIGNvbnN0IHRleHR1cmVGb3JtYXQgPSByYXdEYXRhLmZvcm1hdFxuICAgICAgPyBtYXBUZXh0dXJlRm9ybWF0KHJhd0RhdGEuZm9ybWF0LCByYXdEYXRhLnR5cGUpXG4gICAgICA6IFRFWFRVUkVfRk9STUFULlJHQkE4X1VOT1JNO1xuXG4gICAgY29uc3Qgd2lkdGggPSByYXdEYXRhLndpZHRoIHx8IHJhd0RhdGEuZGF0YT8ud2lkdGggfHwgMTtcbiAgICBjb25zdCBoZWlnaHQgPSByYXdEYXRhLmhlaWdodCB8fCByYXdEYXRhLmRhdGE/LmhlaWdodCB8fCAxO1xuXG4gICAgY29uc3QgdGV4dHVyZVByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZm9ybWF0OiB0ZXh0dXJlRm9ybWF0LFxuICAgICAgc2FtcGxlcjogc2FtcGxlclBhcmFtcyxcbiAgICAgIC4uLihyYXdEYXRhLm1pcG1hcHMgPT09IGZhbHNlID8ge21pcG1hcHM6IGZhbHNlfSA6IHt9KVxuICAgIH07XG5cbiAgICBpZiAocmF3RGF0YS5kYXRhKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJhd0RhdGEuZGF0YSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHxcbiAgICAgICAgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHxcbiAgICAgICAgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgfHxcbiAgICAgICAgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgSW1hZ2VEYXRhXG4gICAgICApIHtcbiAgICAgICAgdGV4dHVyZVByb3BzLmRhdGEgPSByYXdEYXRhLmRhdGE7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhyYXdEYXRhLmRhdGEpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByYXdEYXRhLmZvcm1hdCA9PT0gR0wuUkdCICYmXG4gICAgICAgICAgKHJhd0RhdGEuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpXG4gICAgICAgICkge1xuICAgICAgICAgIHRleHR1cmVQcm9wcy5kYXRhID0gZXhwYW5kUkdCdG9SR0JBKHJhd0RhdGEuZGF0YSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dHVyZVByb3BzLmRhdGEgPSByYXdEYXRhLmRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbHVtYURldmljZS5jcmVhdGVUZXh0dXJlKHRleHR1cmVQcm9wcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1Jhc3RlckxheWVyOiBGYWlsZWQgdG8gY3JlYXRlIHRleHR1cmUgdmlhIGRldmljZS5jcmVhdGVUZXh0dXJlOicsIGUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBSUEsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUcsV0FBQSxHQUFBSCxPQUFBO0FBQStFLFNBQUFJLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FB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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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
|