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