@kepler.gl/deckgl-layers 3.3.0-alpha.0 → 3.3.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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 +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 +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 +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 +145 -56
- package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +145 -56
- package/dist/index.d.ts +2 -0
- package/dist/layer-utils/aggregation-utils.d.ts +44 -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/layer-utils/shader-utils.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/raster/raster-processing-uniforms.d.ts +38 -0
- package/dist/raster/util.d.ts +15 -0
- package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +4 -1
- package/dist/wms/wms-layer.d.ts +32 -2
- package/package.json +37 -25
- 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 -296
- 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 -69
- package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -87
- package/dist/index.js +0 -140
- 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 -29
- package/dist/line-layer/line-layer.js +0 -95
- package/dist/raster/images.js +0 -259
- package/dist/raster/pipeline-validation-patch.js +0 -60
- package/dist/raster/raster-layer/raster-layer-shaders.js +0 -129
- 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 -256
- 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 -282
- package/dist/raster/types.js +0 -6
- package/dist/raster/util.js +0 -29
- 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 -51
- package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
- package/dist/wms/wms-layer.js +0 -351
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.AtmosphereSkyLayerRealistic = exports.AtmosphereLayerRealistic = exports.AtmosphereHugeHaloLayer = void 0;
|
|
8
|
+
exports.atmosphereZoomFade = atmosphereZoomFade;
|
|
9
|
+
exports.getGlobeHugeHaloLayer = exports.getGlobeAtmosphereSkyLayer = exports.getGlobeAtmosphereLayer = void 0;
|
|
10
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
12
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
13
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
14
|
+
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
15
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
var _core = require("@deck.gl/core");
|
|
18
|
+
var _meshLayers = require("@deck.gl/mesh-layers");
|
|
19
|
+
var _engine = require("@luma.gl/engine");
|
|
20
|
+
var _core2 = require("@math.gl/core");
|
|
21
|
+
var _sun = require("@math.gl/sun");
|
|
22
|
+
var _constants = require("@kepler.gl/constants");
|
|
23
|
+
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; }
|
|
24
|
+
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; }
|
|
25
|
+
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
26
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
27
|
+
function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } // SPDX-License-Identifier: MIT
|
|
28
|
+
// Copyright contributors to the kepler.gl project
|
|
29
|
+
// Shaders ported from iTowns, based on Sean O'Neil's approach in GPU Gems 2
|
|
30
|
+
// SEE: https://github.com/iTowns/itowns/blob/master/src/Core/Prefab/Globe/Atmosphere.js
|
|
31
|
+
// SEE: https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-16-accurate-atmospheric-scattering
|
|
32
|
+
var toRadians = function toRadians(degrees) {
|
|
33
|
+
return degrees * Math.PI / 180;
|
|
34
|
+
};
|
|
35
|
+
var angleToVec = function angleToVec(angle) {
|
|
36
|
+
return [Math.sin(angle), Math.cos(angle), 0];
|
|
37
|
+
};
|
|
38
|
+
var angleToSunPos = function angleToSunPos(angle) {
|
|
39
|
+
return new _core2.Vector3(angleToVec(angle)).normalize();
|
|
40
|
+
};
|
|
41
|
+
var GLOBE_MESH_INNER = new _engine.SphereGeometry({
|
|
42
|
+
radius: 6.4e6,
|
|
43
|
+
nlat: 100,
|
|
44
|
+
nlong: 100
|
|
45
|
+
});
|
|
46
|
+
var GLOBE_MESH_OUTER = new _engine.SphereGeometry({
|
|
47
|
+
radius: 6.7e6,
|
|
48
|
+
nlat: 100,
|
|
49
|
+
nlong: 100
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// ~14% larger than the globe surface mesh — yields a thick soft aura (~0.1–0.15R).
|
|
53
|
+
var GLOBE_MESH_HUGE_HALO = new _engine.SphereGeometry({
|
|
54
|
+
radius: 7.3e6,
|
|
55
|
+
nlat: 100,
|
|
56
|
+
nlong: 100
|
|
57
|
+
});
|
|
58
|
+
var lon = 0,
|
|
59
|
+
lat = 90;
|
|
60
|
+
var sunPosNow = (0, _sun.getSunPosition)(Date.now(), lat, lon);
|
|
61
|
+
var v3SunPosNow = angleToSunPos(sunPosNow.azimuth + Math.PI);
|
|
62
|
+
var NUM_SAMPLE_RAYS = 3;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Zoom range over which the atmosphere effect fades out.
|
|
66
|
+
* Below ATMOSPHERE_FADE_ZOOM_START the effect is fully visible.
|
|
67
|
+
* Above ATMOSPHERE_FADE_ZOOM_END the effect is completely hidden.
|
|
68
|
+
*/
|
|
69
|
+
var ATMOSPHERE_FADE_ZOOM_START = 3.5;
|
|
70
|
+
var ATMOSPHERE_FADE_ZOOM_END = 6;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Convert a mapState zoom level to a [0, 1] atmosphere opacity multiplier.
|
|
74
|
+
* Returns 1 (fully visible) below ATMOSPHERE_FADE_ZOOM_START, smoothly
|
|
75
|
+
* interpolates to 0 between the two thresholds, and returns 0 above
|
|
76
|
+
* ATMOSPHERE_FADE_ZOOM_END.
|
|
77
|
+
*/
|
|
78
|
+
function atmosphereZoomFade(zoom) {
|
|
79
|
+
if (zoom <= ATMOSPHERE_FADE_ZOOM_START) return 1;
|
|
80
|
+
if (zoom >= ATMOSPHERE_FADE_ZOOM_END) return 0;
|
|
81
|
+
var t = (zoom - ATMOSPHERE_FADE_ZOOM_START) / (ATMOSPHERE_FADE_ZOOM_END - ATMOSPHERE_FADE_ZOOM_START);
|
|
82
|
+
// Smooth-step for a perceptually gentle transition.
|
|
83
|
+
return 1 - t * t * (3 - 2 * t);
|
|
84
|
+
}
|
|
85
|
+
var ATMOSPHERE_UNIFORMS = {
|
|
86
|
+
v3SunPos: v3SunPosNow,
|
|
87
|
+
exposure: 2,
|
|
88
|
+
fSamples: 3,
|
|
89
|
+
g: -0.65,
|
|
90
|
+
fKrESun: 0.00025 * 20,
|
|
91
|
+
fKmESun: 0.0001 * 20,
|
|
92
|
+
fKr4PI: 0.00025 * 4 * Math.PI,
|
|
93
|
+
fKm4PI: 0.0001 * 4 * Math.PI,
|
|
94
|
+
fScaleDepth: 0.25,
|
|
95
|
+
fInnerRadius: 258,
|
|
96
|
+
fOuterRadius: 265,
|
|
97
|
+
fTerminatorAttenuateFactor: 0.8,
|
|
98
|
+
fTerminatorOpacityFactor: 1
|
|
99
|
+
};
|
|
100
|
+
var AtmosphereLayerRealistic = exports.AtmosphereLayerRealistic = /*#__PURE__*/function (_SimpleMeshLayer) {
|
|
101
|
+
function AtmosphereLayerRealistic() {
|
|
102
|
+
(0, _classCallCheck2["default"])(this, AtmosphereLayerRealistic);
|
|
103
|
+
return _callSuper(this, AtmosphereLayerRealistic, arguments);
|
|
104
|
+
}
|
|
105
|
+
(0, _inherits2["default"])(AtmosphereLayerRealistic, _SimpleMeshLayer);
|
|
106
|
+
return (0, _createClass2["default"])(AtmosphereLayerRealistic, [{
|
|
107
|
+
key: "draw",
|
|
108
|
+
value: function draw(_ref) {
|
|
109
|
+
var uniforms = _ref.uniforms;
|
|
110
|
+
var _this$props = this.props,
|
|
111
|
+
config = _this$props.config,
|
|
112
|
+
zoomFade = _this$props.zoomFade;
|
|
113
|
+
var model = this.state.model;
|
|
114
|
+
if (model) {
|
|
115
|
+
model.props.uniforms = _objectSpread(_objectSpread(_objectSpread({}, model.props.uniforms), ATMOSPHERE_UNIFORMS), {}, {
|
|
116
|
+
fTerminatorOpacityFactor: config.terminator ? config.terminatorOpacity : 0,
|
|
117
|
+
v3SunPos: config.azimuth ? angleToSunPos(toRadians(config.azimuthAngle)) : v3SunPosNow,
|
|
118
|
+
fAtmosphereZoomFade: zoomFade
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
_superPropGet(AtmosphereLayerRealistic, "draw", this, 3)([{
|
|
122
|
+
uniforms: uniforms
|
|
123
|
+
}]);
|
|
124
|
+
}
|
|
125
|
+
}, {
|
|
126
|
+
key: "getShaders",
|
|
127
|
+
value: function getShaders() {
|
|
128
|
+
return _objectSpread(_objectSpread({}, _superPropGet(AtmosphereLayerRealistic, "getShaders", this, 3)([])), {}, {
|
|
129
|
+
inject: {
|
|
130
|
+
'fs:#decl': "\n uniform vec3 v3SunPos;\n\n uniform float g;\n uniform float exposure;\n\n uniform float fSamples;\n\n uniform float fInnerRadius;\n uniform float fOuterRadius;\n uniform float fKrESun;\n uniform float fKmESun;\n uniform float fKr4PI;\n uniform float fKm4PI;\n uniform float fScaleDepth;\n\n uniform float fTerminatorAttenuateFactor;\n uniform float fTerminatorOpacityFactor;\n uniform float fAtmosphereZoomFade;\n\n const int nSamples = ".concat(NUM_SAMPLE_RAYS, ";\n\n float scale(float fCos) {\n float x = 1.0 - fCos;\n return fScaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.8 + x*5.25))));\n }\n "),
|
|
131
|
+
'fs:#main-end': "\n vec3 v3CameraPos = cameraPosition;\n vec3 v3Pos = position_commonspace.xyz;\n\n float g2 = g * g;\n\n vec3 v3InvWavelength = vec3(1.0 / pow(0.650, 4.0), 1.0 / pow(0.570, 4.0), 1.0 / pow(0.475, 4.0));\n\n float fInnerRadius2 = fInnerRadius * fInnerRadius;\n float fOuterRadius2 = fOuterRadius * fOuterRadius;\n float fScale = 1.0 / (fOuterRadius - fInnerRadius);\n float fScaleOverScaleDepth = 1.0 / (fOuterRadius - fInnerRadius) / fScaleDepth;\n\n float cameraHeight2 = length(v3CameraPos) * length(v3CameraPos);\n\n vec3 v3Ray = v3Pos - v3CameraPos;\n float fFar = length(v3Ray);\n v3Ray /= fFar;\n\n float B = 2.0 * dot(v3CameraPos, v3Ray);\n float C = cameraHeight2 - fOuterRadius2;\n float fDet = max(0.0, B*B - 4.0 * C);\n float fNear = 0.5 * (-B - sqrt(fDet));\n\n vec3 v3Start = v3CameraPos + v3Ray * fNear;\n fFar -= fNear;\n\n float fDepth = exp((fInnerRadius - fOuterRadius) / fScaleDepth);\n float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);\n float fLightAngle = dot(v3SunPos, v3Pos) / length(v3Pos);\n float fCameraScale = scale(fCameraAngle);\n float fLightScale = scale(fLightAngle);\n float fCameraOffset = fDepth*fCameraScale;\n float fTemp = (fLightScale + fCameraScale);\n\n float fSampleLength = fFar / fSamples;\n float fScaledLength = fSampleLength * fScale;\n vec3 v3SampleRay = v3Ray * fSampleLength;\n vec3 v3SamplePoint = v3Start + v3SampleRay * 0.5;\n\n vec3 v3FrontColor = vec3(0.0, 0.0, 0.0);\n vec3 v3Attenuate = vec3(0.0, 0.0, 0.0);\n for(int i=0; i<nSamples; i++)\n {\n float fHeight = length(v3SamplePoint);\n float fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fHeight));\n float fScatter = fDepth*fTemp - fCameraOffset;\n v3Attenuate = exp(-fScatter * (v3InvWavelength * fKr4PI + fKm4PI));\n v3FrontColor += v3Attenuate * (fDepth * fScaledLength);\n v3SamplePoint += v3SampleRay;\n }\n\n vec3 c0 = v3Attenuate;\n vec3 c1 = v3FrontColor * (v3InvWavelength * fKrESun + fKmESun);\n\n fragColor = vec4(c1, 1.0 - c0 * fTerminatorAttenuateFactor);\n fragColor.a *= fTerminatorOpacityFactor;\n\n // Keep the day hemisphere completely unshaded \u2014 the attenuation-based\n // alpha above is non-zero even at noon, which slightly darkens the lit\n // side. Gate it with a day/night mask so darkening only appears across\n // the terminator and onto the night side.\n // fLightAngle = dot(sunDir, surfaceNormal): +1 at the subsolar point\n // (noon), 0 at the terminator, -1 at midnight. smoothstep maps the day\n // side (>= 0.2) to 0 (no darkening), ramps through the terminator, and\n // reaches full darkening on the night side (<= -0.2).\n float fNightMask = smoothstep(0.2, -0.2, fLightAngle);\n fragColor.a *= fNightMask;\n\n // Fade out the entire day/night shading effect as the user zooms in.\n // At zoom levels above ATMOSPHERE_FADE_ZOOM_END the effect is invisible,\n // so it doesn't obscure map detail at street/city scale.\n fragColor.a *= fAtmosphereZoomFade;\n ",
|
|
132
|
+
'fs:DECKGL_FILTER_COLOR': ""
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}]);
|
|
137
|
+
}(_meshLayers.SimpleMeshLayer);
|
|
138
|
+
(0, _defineProperty2["default"])(AtmosphereLayerRealistic, "layerName", 'AtmosphereLayerRealistic');
|
|
139
|
+
var AtmosphereSkyLayerRealistic = exports.AtmosphereSkyLayerRealistic = /*#__PURE__*/function (_SimpleMeshLayer2) {
|
|
140
|
+
function AtmosphereSkyLayerRealistic() {
|
|
141
|
+
(0, _classCallCheck2["default"])(this, AtmosphereSkyLayerRealistic);
|
|
142
|
+
return _callSuper(this, AtmosphereSkyLayerRealistic, arguments);
|
|
143
|
+
}
|
|
144
|
+
(0, _inherits2["default"])(AtmosphereSkyLayerRealistic, _SimpleMeshLayer2);
|
|
145
|
+
return (0, _createClass2["default"])(AtmosphereSkyLayerRealistic, [{
|
|
146
|
+
key: "draw",
|
|
147
|
+
value: function draw(_ref2) {
|
|
148
|
+
var uniforms = _ref2.uniforms;
|
|
149
|
+
var _this$props2 = this.props,
|
|
150
|
+
config = _this$props2.config,
|
|
151
|
+
zoomFade = _this$props2.zoomFade;
|
|
152
|
+
var model = this.state.model;
|
|
153
|
+
if (model) {
|
|
154
|
+
model.props.uniforms = _objectSpread(_objectSpread(_objectSpread({}, model.props.uniforms), ATMOSPHERE_UNIFORMS), {}, {
|
|
155
|
+
v3SunPos: config.azimuth ? angleToSunPos(toRadians(config.azimuthAngle)) : v3SunPosNow,
|
|
156
|
+
fAtmosphereZoomFade: zoomFade
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
_superPropGet(AtmosphereSkyLayerRealistic, "draw", this, 3)([{
|
|
160
|
+
uniforms: uniforms
|
|
161
|
+
}]);
|
|
162
|
+
}
|
|
163
|
+
}, {
|
|
164
|
+
key: "getShaders",
|
|
165
|
+
value: function getShaders() {
|
|
166
|
+
return _objectSpread(_objectSpread({}, _superPropGet(AtmosphereSkyLayerRealistic, "getShaders", this, 3)([])), {}, {
|
|
167
|
+
inject: {
|
|
168
|
+
'fs:#decl': "\n uniform vec3 v3SunPos;\n\n uniform float g;\n uniform float exposure;\n\n uniform float fSamples;\n\n uniform float fInnerRadius;\n uniform float fOuterRadius;\n uniform float fKrESun;\n uniform float fKmESun;\n uniform float fKr4PI;\n uniform float fKm4PI;\n uniform float fScaleDepth;\n uniform float fAtmosphereZoomFade;\n\n const int nSamples = ".concat(NUM_SAMPLE_RAYS, ";\n\n float scale(float fCos) {\n float x = 1.0 - fCos;\n return fScaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.8 + x*5.25))));\n }\n\n float getMiePhase(float fCos, float fCos2, float g, float g2) {\n return 1.5 * ((1.0 - g2) / (2.0 + g2)) * (1.0 + fCos2) / pow(1.0 + g2 - 2.0 * g * fCos, 1.5);\n }\n\n float getRayleighPhase(float fCos2) {\n return 0.75 + 0.75 * fCos2;\n }\n "),
|
|
169
|
+
'fs:#main-end': "\n vec3 v3CameraPos = cameraPosition;\n vec3 v3Pos = position_commonspace.xyz;\n\n float g2 = g * g;\n\n vec3 v3InvWavelength = vec3(1.0 / pow(0.650, 4.0), 1.0 / pow(0.570, 4.0), 1.0 / pow(0.475, 4.0));\n\n float fInnerRadius2 = fInnerRadius * fInnerRadius;\n float fOuterRadius2 = fOuterRadius * fOuterRadius;\n float fScale = 1.0 / (fOuterRadius - fInnerRadius);\n float fScaleOverScaleDepth = 1.0 / (fOuterRadius - fInnerRadius) / fScaleDepth;\n\n float cameraHeight2 = length(v3CameraPos) * length(v3CameraPos);\n\n vec3 v3Ray = v3Pos - v3CameraPos;\n float fFar = length(v3Ray);\n v3Ray /= fFar;\n\n float B = 2.0 * dot(v3CameraPos, v3Ray);\n float C = cameraHeight2 - fOuterRadius2;\n float fDet = max(0.0, B*B - 4.0 * C);\n float fNear = 0.5 * (-B - sqrt(fDet));\n\n vec3 v3Start = v3CameraPos + v3Ray * fNear;\n fFar -= fNear;\n float fStartAngle = dot(v3Ray, v3Start) / fOuterRadius;\n float fStartDepth = exp(-1.0 / fScaleDepth);\n float fStartOffset = fStartDepth * scale(fStartAngle);\n\n float fSampleLength = fFar / fSamples;\n float fScaledLength = fSampleLength * fScale;\n vec3 v3SampleRay = v3Ray * fSampleLength;\n vec3 v3SamplePoint = v3Start + v3SampleRay * 0.5;\n\n vec3 v3FrontColor = vec3(0.0, 0.0, 0.0);\n for(int i=0; i<nSamples; i++)\n {\n float fHeight = length(v3SamplePoint);\n float fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fHeight));\n float fLightAngle = dot(v3SunPos, v3SamplePoint) / fHeight;\n float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;\n float fScatter = (fStartOffset + fDepth * (scale(fLightAngle) - scale(fCameraAngle)));\n vec3 v3Attenuate = exp(-fScatter * (v3InvWavelength * fKr4PI + fKm4PI));\n\n v3FrontColor += v3Attenuate * (fDepth * fScaledLength);\n v3SamplePoint += v3SampleRay;\n }\n\n vec3 c0 = v3FrontColor * (v3InvWavelength * fKrESun);\n vec3 c1 = v3FrontColor * fKmESun;\n\n vec3 v3Direction = v3CameraPos - v3Pos;\n\n float fCos = dot(v3SunPos, v3Direction) / length(v3Direction);\n float fCos2 = fCos * fCos;\n\n vec3 skyColor = getRayleighPhase(fCos2) * c0 + getMiePhase(fCos, fCos2, g, g2) * c1;\n\n fragColor = vec4(skyColor, 1.0);\n fragColor.a = fragColor.b;\n\n // Fade the sky halo out as the user zooms in past continent scale.\n fragColor.a *= fAtmosphereZoomFade;\n ",
|
|
170
|
+
'fs:DECKGL_FILTER_COLOR': ""
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}]);
|
|
175
|
+
}(_meshLayers.SimpleMeshLayer);
|
|
176
|
+
(0, _defineProperty2["default"])(AtmosphereSkyLayerRealistic, "layerName", 'AtmosphereSkyLayerRealistic');
|
|
177
|
+
var ATMOSPHERE_PARAMETERS = {
|
|
178
|
+
depthTest: false,
|
|
179
|
+
blendFunc: [0x0302, 0x0303, 1, 0x0303],
|
|
180
|
+
// SRC_ALPHA, ONE_MINUS_SRC_ALPHA, ONE, ONE_MINUS_SRC_ALPHA
|
|
181
|
+
blendEquation: [0x8006, 0x8006] // FUNC_ADD
|
|
182
|
+
};
|
|
183
|
+
var ATMOSPHERE_SKY_PARAMETERS = {
|
|
184
|
+
cullFace: 0x0404,
|
|
185
|
+
// GL.FRONT
|
|
186
|
+
depthMask: false,
|
|
187
|
+
blendFunc: [0x0302, 0x0303, 1, 0x0303],
|
|
188
|
+
blendEquation: [0x8006, 0x8006]
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Soft, sun-independent glow. Radii are in deck.gl common space
|
|
193
|
+
* (GLOBE_COMMON_RADIUS = 256; atmosphere uses ~258 as a slight fudge).
|
|
194
|
+
* Outer ≈ 14% larger than inner at radius multiplier = 1 (matches the base mesh).
|
|
195
|
+
*/
|
|
196
|
+
var HUGE_HALO_INNER_RADIUS = 258;
|
|
197
|
+
var HUGE_HALO_BASE_OUTER_RADIUS = 294;
|
|
198
|
+
var HUGE_HALO_BASE_SHELL = HUGE_HALO_BASE_OUTER_RADIUS - HUGE_HALO_INNER_RADIUS;
|
|
199
|
+
/** Matches the Halo Radius slider max; higher values can produce a black-disc artifact. */
|
|
200
|
+
var HUGE_HALO_RADIUS_MAX = 3.5;
|
|
201
|
+
var HUGE_HALO_UNIFORMS = {
|
|
202
|
+
fInnerRadius: HUGE_HALO_INNER_RADIUS,
|
|
203
|
+
// Soft cyan matching the reference huge-halo look.
|
|
204
|
+
v3HaloColor: [0.45, 0.72, 1.0],
|
|
205
|
+
fHaloIntensity: 1.0
|
|
206
|
+
};
|
|
207
|
+
var HUGE_HALO_PARAMETERS = {
|
|
208
|
+
cullFace: 0x0404,
|
|
209
|
+
// GL.FRONT
|
|
210
|
+
depthMask: false,
|
|
211
|
+
// Large shells often enclose the camera; disable depth so the ring still draws.
|
|
212
|
+
depthTest: false,
|
|
213
|
+
blendFunc: [0x0302, 0x0303, 1, 0x0303],
|
|
214
|
+
// SRC_ALPHA, ONE_MINUS_SRC_ALPHA
|
|
215
|
+
blendEquation: [0x8006, 0x8006]
|
|
216
|
+
};
|
|
217
|
+
function resolveHugeHaloRadius(config) {
|
|
218
|
+
var multiplier = Number.isFinite(config.hugeHaloRadius) ? config.hugeHaloRadius : _constants.DEFAULT_GLOBE_CONFIG.hugeHaloRadius;
|
|
219
|
+
// Scale shell thickness; keep outer above the planet surface.
|
|
220
|
+
return HUGE_HALO_INNER_RADIUS + HUGE_HALO_BASE_SHELL * Math.max(Math.min(multiplier, HUGE_HALO_RADIUS_MAX), 0.05);
|
|
221
|
+
}
|
|
222
|
+
function resolveHugeHaloOpacity(config) {
|
|
223
|
+
var opacity = Number.isFinite(config.hugeHaloOpacity) ? config.hugeHaloOpacity : _constants.DEFAULT_GLOBE_CONFIG.hugeHaloOpacity;
|
|
224
|
+
return Math.max(0, Math.min(1, opacity));
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* View-independent atmosphere: a large uniform emissive aura around the globe.
|
|
229
|
+
* Unlike AtmosphereSkyLayerRealistic, this ignores sun direction and uses a
|
|
230
|
+
* linear radial falloff through a thick shell (max at the surface → 0 at outer radius).
|
|
231
|
+
*/
|
|
232
|
+
var AtmosphereHugeHaloLayer = exports.AtmosphereHugeHaloLayer = /*#__PURE__*/function (_SimpleMeshLayer3) {
|
|
233
|
+
function AtmosphereHugeHaloLayer() {
|
|
234
|
+
(0, _classCallCheck2["default"])(this, AtmosphereHugeHaloLayer);
|
|
235
|
+
return _callSuper(this, AtmosphereHugeHaloLayer, arguments);
|
|
236
|
+
}
|
|
237
|
+
(0, _inherits2["default"])(AtmosphereHugeHaloLayer, _SimpleMeshLayer3);
|
|
238
|
+
return (0, _createClass2["default"])(AtmosphereHugeHaloLayer, [{
|
|
239
|
+
key: "draw",
|
|
240
|
+
value: function draw(_ref3) {
|
|
241
|
+
var uniforms = _ref3.uniforms;
|
|
242
|
+
var _this$props3 = this.props,
|
|
243
|
+
config = _this$props3.config,
|
|
244
|
+
zoomFade = _this$props3.zoomFade;
|
|
245
|
+
var model = this.state.model;
|
|
246
|
+
if (model) {
|
|
247
|
+
model.props.uniforms = _objectSpread(_objectSpread(_objectSpread({}, model.props.uniforms), HUGE_HALO_UNIFORMS), {}, {
|
|
248
|
+
fHaloOpacity: resolveHugeHaloOpacity(config),
|
|
249
|
+
fAtmosphereZoomFade: zoomFade
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
_superPropGet(AtmosphereHugeHaloLayer, "draw", this, 3)([{
|
|
253
|
+
uniforms: uniforms
|
|
254
|
+
}]);
|
|
255
|
+
}
|
|
256
|
+
}, {
|
|
257
|
+
key: "getShaders",
|
|
258
|
+
value: function getShaders() {
|
|
259
|
+
return _objectSpread(_objectSpread({}, _superPropGet(AtmosphereHugeHaloLayer, "getShaders", this, 3)([])), {}, {
|
|
260
|
+
inject: {
|
|
261
|
+
'fs:#decl': "\n uniform float fInnerRadius;\n uniform vec3 v3HaloColor;\n uniform float fHaloIntensity;\n uniform float fHaloOpacity;\n uniform float fAtmosphereZoomFade;\n ",
|
|
262
|
+
'fs:#main-end': "\n vec3 v3CameraPos = cameraPosition;\n vec3 v3Pos = position_commonspace.xyz;\n // Outer radius from the actual mesh vertex so sizeScale stays in sync.\n float fOuterRadius = length(v3Pos);\n vec3 v3Ray = normalize(v3Pos - v3CameraPos);\n\n // Impact parameter of the view ray (perpendicular distance from globe\n // center to the ray). Stable when the camera is inside the outer shell,\n // unlike near/far sphere-intersection math which breaks in that case\n // and produced a black disc at high radius multipliers.\n float fDMin = length(cross(v3CameraPos, v3Ray));\n\n // Linear falloff in the annulus only: max at the surface, zero at outer.\n float fShell = max(fOuterRadius - fInnerRadius, 0.0001);\n float fGlow = 0.0;\n if (fDMin >= fInnerRadius && fDMin < fOuterRadius) {\n float t = (fDMin - fInnerRadius) / fShell;\n fGlow = 1.0 - t;\n }\n\n fGlow *= fHaloIntensity;\n\n // Straight alpha (not premultiplied) for SRC_ALPHA blending.\n fragColor = vec4(v3HaloColor, fGlow * fHaloOpacity);\n fragColor.a *= fAtmosphereZoomFade;\n ",
|
|
263
|
+
'fs:DECKGL_FILTER_COLOR': ""
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
}]);
|
|
268
|
+
}(_meshLayers.SimpleMeshLayer);
|
|
269
|
+
(0, _defineProperty2["default"])(AtmosphereHugeHaloLayer, "layerName", 'AtmosphereHugeHaloLayer');
|
|
270
|
+
var getGlobeAtmosphereLayer = exports.getGlobeAtmosphereLayer = function getGlobeAtmosphereLayer(_ref4) {
|
|
271
|
+
var config = _ref4.config,
|
|
272
|
+
zoom = _ref4.zoom;
|
|
273
|
+
var zoomFade = atmosphereZoomFade(zoom !== null && zoom !== void 0 ? zoom : 0);
|
|
274
|
+
return new AtmosphereLayerRealistic({
|
|
275
|
+
id: 'atmosphere',
|
|
276
|
+
data: [[0, 0, 0]],
|
|
277
|
+
config: config,
|
|
278
|
+
zoomFade: zoomFade,
|
|
279
|
+
coordinateOrigin: [0, 0, 0],
|
|
280
|
+
coordinateSystem: _core.COORDINATE_SYSTEM.CARTESIAN,
|
|
281
|
+
getPosition: function getPosition(d) {
|
|
282
|
+
return d;
|
|
283
|
+
},
|
|
284
|
+
getColor: [0, 0, 0],
|
|
285
|
+
mesh: GLOBE_MESH_INNER,
|
|
286
|
+
parameters: ATMOSPHERE_PARAMETERS
|
|
287
|
+
});
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
/** Realistic sun-lit scattering sky halo (thin limb glow). */
|
|
291
|
+
var getGlobeAtmosphereSkyLayer = exports.getGlobeAtmosphereSkyLayer = function getGlobeAtmosphereSkyLayer(_ref5) {
|
|
292
|
+
var config = _ref5.config,
|
|
293
|
+
zoom = _ref5.zoom;
|
|
294
|
+
var zoomFade = atmosphereZoomFade(zoom !== null && zoom !== void 0 ? zoom : 0);
|
|
295
|
+
return new AtmosphereSkyLayerRealistic({
|
|
296
|
+
id: 'atmosphere-sky',
|
|
297
|
+
data: [[0, 0, 0]],
|
|
298
|
+
config: config,
|
|
299
|
+
zoomFade: zoomFade,
|
|
300
|
+
coordinateOrigin: [0, 0, 0],
|
|
301
|
+
coordinateSystem: _core.COORDINATE_SYSTEM.CARTESIAN,
|
|
302
|
+
getPosition: function getPosition(d) {
|
|
303
|
+
return d;
|
|
304
|
+
},
|
|
305
|
+
getColor: [0, 0, 0],
|
|
306
|
+
mesh: GLOBE_MESH_OUTER,
|
|
307
|
+
parameters: ATMOSPHERE_SKY_PARAMETERS
|
|
308
|
+
});
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Large uniform glow drawn in addition to the realistic sky halo when
|
|
313
|
+
* `config.hugeHalo` is enabled. Returns null when disabled.
|
|
314
|
+
*/
|
|
315
|
+
var getGlobeHugeHaloLayer = exports.getGlobeHugeHaloLayer = function getGlobeHugeHaloLayer(_ref6) {
|
|
316
|
+
var config = _ref6.config,
|
|
317
|
+
zoom = _ref6.zoom;
|
|
318
|
+
if (!config.hugeHalo) {
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
var zoomFade = atmosphereZoomFade(zoom !== null && zoom !== void 0 ? zoom : 0);
|
|
322
|
+
var outerRadius = resolveHugeHaloRadius(config);
|
|
323
|
+
// Keep mesh extent in sync with the desired outer radius (base mesh = default outer).
|
|
324
|
+
var sizeScale = outerRadius / HUGE_HALO_BASE_OUTER_RADIUS;
|
|
325
|
+
return new AtmosphereHugeHaloLayer({
|
|
326
|
+
id: 'atmosphere-huge-halo',
|
|
327
|
+
data: [[0, 0, 0]],
|
|
328
|
+
config: config,
|
|
329
|
+
zoomFade: zoomFade,
|
|
330
|
+
coordinateOrigin: [0, 0, 0],
|
|
331
|
+
coordinateSystem: _core.COORDINATE_SYSTEM.CARTESIAN,
|
|
332
|
+
getPosition: function getPosition(d) {
|
|
333
|
+
return d;
|
|
334
|
+
},
|
|
335
|
+
getColor: [0, 0, 0],
|
|
336
|
+
mesh: GLOBE_MESH_HUGE_HALO,
|
|
337
|
+
sizeScale: sizeScale,
|
|
338
|
+
parameters: HUGE_HALO_PARAMETERS
|
|
339
|
+
});
|
|
340
|
+
};
|
|
341
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbWVzaExheWVycyIsIl9lbmdpbmUiLCJfY29yZTIiLCJfc3VuIiwiX2NvbnN0YW50cyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsInRvUmFkaWFucyIsImRlZ3JlZXMiLCJNYXRoIiwiUEkiLCJhbmdsZVRvVmVjIiwiYW5nbGUiLCJzaW4iLCJjb3MiLCJhbmdsZVRvU3VuUG9zIiwiVmVjdG9yMyIsIm5vcm1hbGl6ZSIsIkdMT0JFX01FU0hfSU5ORVIiLCJTcGhlcmVHZW9tZXRyeSIsInJhZGl1cyIsIm5sYXQiLCJubG9uZyIsIkdMT0JFX01FU0hfT1VURVIiLCJHTE9CRV9NRVNIX0hVR0VfSEFMTyIsImxvbiIsImxhdCIsInN1blBvc05vdyIsImdldFN1blBvc2l0aW9uIiwiRGF0ZSIsIm5vdyIsInYzU3VuUG9zTm93IiwiYXppbXV0aCIsIk5VTV9TQU1QTEVfUkFZUyIsIkFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUIiwiQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EIiwiYXRtb3NwaGVyZVpvb21GYWRlIiwiem9vbSIsIkFUTU9TUEhFUkVfVU5JRk9STVMiLCJ2M1N1blBvcyIsImV4cG9zdXJlIiwiZlNhbXBsZXMiLCJnIiwiZktyRVN1biIsImZLbUVTdW4iLCJmS3I0UEkiLCJmS200UEkiLCJmU2NhbGVEZXB0aCIsImZJbm5lclJhZGl1cyIsImZPdXRlclJhZGl1cyIsImZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yIiwiZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yIiwiQXRtb3NwaGVyZUxheWVyUmVhbGlzdGljIiwiZXhwb3J0cyIsIl9TaW1wbGVNZXNoTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImRyYXciLCJfcmVmIiwidW5pZm9ybXMiLCJfdGhpcyRwcm9wcyIsInByb3BzIiwiY29uZmlnIiwiem9vbUZhZGUiLCJtb2RlbCIsInN0YXRlIiwidGVybWluYXRvciIsInRlcm1pbmF0b3JPcGFjaXR5IiwiYXppbXV0aEFuZ2xlIiwiZkF0bW9zcGhlcmVab29tRmFkZSIsImdldFNoYWRlcnMiLCJpbmplY3QiLCJjb25jYXQiLCJTaW1wbGVNZXNoTGF5ZXIiLCJBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMiLCJfU2ltcGxlTWVzaExheWVyMiIsIl9yZWYyIiwiX3RoaXMkcHJvcHMyIiwiQVRNT1NQSEVSRV9QQVJBTUVURVJTIiwiZGVwdGhUZXN0IiwiYmxlbmRGdW5jIiwiYmxlbmRFcXVhdGlvbiIsIkFUTU9TUEhFUkVfU0tZX1BBUkFNRVRFUlMiLCJjdWxsRmFjZSIsImRlcHRoTWFzayIsIkhVR0VfSEFMT19JTk5FUl9SQURJVVMiLCJIVUdFX0hBTE9fQkFTRV9PVVRFUl9SQURJVVMiLCJIVUdFX0hBTE9fQkFTRV9TSEVMTCIsIkhVR0VfSEFMT19SQURJVVNfTUFYIiwiSFVHRV9IQUxPX1VOSUZPUk1TIiwidjNIYWxvQ29sb3IiLCJmSGFsb0ludGVuc2l0eSIsIkhVR0VfSEFMT19QQVJBTUVURVJTIiwicmVzb2x2ZUh1Z2VIYWxvUmFkaXVzIiwibXVsdGlwbGllciIsIk51bWJlciIsImlzRmluaXRlIiwiaHVnZUhhbG9SYWRpdXMiLCJERUZBVUxUX0dMT0JFX0NPTkZJRyIsIm1heCIsIm1pbiIsInJlc29sdmVIdWdlSGFsb09wYWNpdHkiLCJvcGFjaXR5IiwiaHVnZUhhbG9PcGFjaXR5IiwiQXRtb3NwaGVyZUh1Z2VIYWxvTGF5ZXIiLCJfU2ltcGxlTWVzaExheWVyMyIsIl9yZWYzIiwiX3RoaXMkcHJvcHMzIiwiZkhhbG9PcGFjaXR5IiwiZ2V0R2xvYmVBdG1vc3BoZXJlTGF5ZXIiLCJfcmVmNCIsImlkIiwiZGF0YSIsImNvb3JkaW5hdGVPcmlnaW4iLCJjb29yZGluYXRlU3lzdGVtIiwiQ09PUkRJTkFURV9TWVNURU0iLCJDQVJURVNJQU4iLCJnZXRQb3NpdGlvbiIsImQiLCJnZXRDb2xvciIsIm1lc2giLCJwYXJhbWV0ZXJzIiwiZ2V0R2xvYmVBdG1vc3BoZXJlU2t5TGF5ZXIiLCJfcmVmNSIsImdldEdsb2JlSHVnZUhhbG9MYXllciIsIl9yZWY2IiwiaHVnZUhhbG8iLCJvdXRlclJhZGl1cyIsInNpemVTY2FsZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nbG9iZS9hdG1vc3BoZXJlLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIFNoYWRlcnMgcG9ydGVkIGZyb20gaVRvd25zLCBiYXNlZCBvbiBTZWFuIE8nTmVpbCdzIGFwcHJvYWNoIGluIEdQVSBHZW1zIDJcbi8vIFNFRTogaHR0cHM6Ly9naXRodWIuY29tL2lUb3ducy9pdG93bnMvYmxvYi9tYXN0ZXIvc3JjL0NvcmUvUHJlZmFiL0dsb2JlL0F0bW9zcGhlcmUuanNcbi8vIFNFRTogaHR0cHM6Ly9kZXZlbG9wZXIubnZpZGlhLmNvbS9ncHVnZW1zL2dwdWdlbXMyL3BhcnQtaWktc2hhZGluZy1saWdodGluZy1hbmQtc2hhZG93cy9jaGFwdGVyLTE2LWFjY3VyYXRlLWF0bW9zcGhlcmljLXNjYXR0ZXJpbmdcblxuaW1wb3J0IHtDT09SRElOQVRFX1NZU1RFTX0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1NpbXBsZU1lc2hMYXllcn0gZnJvbSAnQGRlY2suZ2wvbWVzaC1sYXllcnMnO1xuaW1wb3J0IHtTcGhlcmVHZW9tZXRyeX0gZnJvbSAnQGx1bWEuZ2wvZW5naW5lJztcbmltcG9ydCB7VmVjdG9yM30gZnJvbSAnQG1hdGguZ2wvY29yZSc7XG5pbXBvcnQge2dldFN1blBvc2l0aW9ufSBmcm9tICdAbWF0aC5nbC9zdW4nO1xuXG5pbXBvcnQge0RFRkFVTFRfR0xPQkVfQ09ORklHLCB0eXBlIEdsb2JlQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5cbmNvbnN0IHRvUmFkaWFucyA9IChkZWdyZWVzOiBudW1iZXIpOiBudW1iZXIgPT4gKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MDtcblxuY29uc3QgYW5nbGVUb1ZlYyA9IChhbmdsZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgcmV0dXJuIFtNYXRoLnNpbihhbmdsZSksIE1hdGguY29zKGFuZ2xlKSwgMF07XG59O1xuXG5jb25zdCBhbmdsZVRvU3VuUG9zID0gKGFuZ2xlOiBudW1iZXIpOiBudW1iZXJbXSA9PiB7XG4gIHJldHVybiBuZXcgVmVjdG9yMyhhbmdsZVRvVmVjKGFuZ2xlKSkubm9ybWFsaXplKCkgYXMgdW5rbm93biBhcyBudW1iZXJbXTtcbn07XG5cbmNvbnN0IEdMT0JFX01FU0hfSU5ORVIgPSBuZXcgU3BoZXJlR2VvbWV0cnkoe1xuICByYWRpdXM6IDYuNGU2LFxuICBubGF0OiAxMDAsXG4gIG5sb25nOiAxMDBcbn0pO1xuXG5jb25zdCBHTE9CRV9NRVNIX09VVEVSID0gbmV3IFNwaGVyZUdlb21ldHJ5KHtcbiAgcmFkaXVzOiA2LjdlNixcbiAgbmxhdDogMTAwLFxuICBubG9uZzogMTAwXG59KTtcblxuLy8gfjE0JSBsYXJnZXIgdGhhbiB0aGUgZ2xvYmUgc3VyZmFjZSBtZXNoIOKAlCB5aWVsZHMgYSB0aGljayBzb2Z0IGF1cmEgKH4wLjHigJMwLjE1UikuXG5jb25zdCBHTE9CRV9NRVNIX0hVR0VfSEFMTyA9IG5ldyBTcGhlcmVHZW9tZXRyeSh7XG4gIHJhZGl1czogNy4zZTYsXG4gIG5sYXQ6IDEwMCxcbiAgbmxvbmc6IDEwMFxufSk7XG5cbmNvbnN0IFtsb24sIGxhdF0gPSBbMCwgOTBdO1xuY29uc3Qgc3VuUG9zTm93ID0gZ2V0U3VuUG9zaXRpb24oRGF0ZS5ub3coKSwgbGF0LCBsb24pO1xuY29uc3QgdjNTdW5Qb3NOb3cgPSBhbmdsZVRvU3VuUG9zKHN1blBvc05vdy5hemltdXRoICsgTWF0aC5QSSk7XG5cbmNvbnN0IE5VTV9TQU1QTEVfUkFZUyA9IDM7XG5cbi8qKlxuICogWm9vbSByYW5nZSBvdmVyIHdoaWNoIHRoZSBhdG1vc3BoZXJlIGVmZmVjdCBmYWRlcyBvdXQuXG4gKiBCZWxvdyBBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCB0aGUgZWZmZWN0IGlzIGZ1bGx5IHZpc2libGUuXG4gKiBBYm92ZSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQgdGhlIGVmZmVjdCBpcyBjb21wbGV0ZWx5IGhpZGRlbi5cbiAqL1xuY29uc3QgQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQgPSAzLjU7XG5jb25zdCBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQgPSA2O1xuXG4vKipcbiAqIENvbnZlcnQgYSBtYXBTdGF0ZSB6b29tIGxldmVsIHRvIGEgWzAsIDFdIGF0bW9zcGhlcmUgb3BhY2l0eSBtdWx0aXBsaWVyLlxuICogUmV0dXJucyAxIChmdWxseSB2aXNpYmxlKSBiZWxvdyBBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCwgc21vb3RobHlcbiAqIGludGVycG9sYXRlcyB0byAwIGJldHdlZW4gdGhlIHR3byB0aHJlc2hvbGRzLCBhbmQgcmV0dXJucyAwIGFib3ZlXG4gKiBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdG1vc3BoZXJlWm9vbUZhZGUoem9vbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHpvb20gPD0gQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQpIHJldHVybiAxO1xuICBpZiAoem9vbSA+PSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQpIHJldHVybiAwO1xuICBjb25zdCB0ID0gKHpvb20gLSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCkgLyAoQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EIC0gQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQpO1xuICAvLyBTbW9vdGgtc3RlcCBmb3IgYSBwZXJjZXB0dWFsbHkgZ2VudGxlIHRyYW5zaXRpb24uXG4gIHJldHVybiAxIC0gdCAqIHQgKiAoMyAtIDIgKiB0KTtcbn1cblxuY29uc3QgQVRNT1NQSEVSRV9VTklGT1JNUyA9IHtcbiAgdjNTdW5Qb3M6IHYzU3VuUG9zTm93LFxuICBleHBvc3VyZTogMixcbiAgZlNhbXBsZXM6IDMsXG4gIGc6IC0wLjY1LFxuICBmS3JFU3VuOiAwLjAwMDI1ICogMjAsXG4gIGZLbUVTdW46IDAuMDAwMSAqIDIwLFxuICBmS3I0UEk6IDAuMDAwMjUgKiA0ICogTWF0aC5QSSxcbiAgZkttNFBJOiAwLjAwMDEgKiA0ICogTWF0aC5QSSxcbiAgZlNjYWxlRGVwdGg6IDAuMjUsXG4gIGZJbm5lclJhZGl1czogMjU4LFxuICBmT3V0ZXJSYWRpdXM6IDI2NSxcbiAgZlRlcm1pbmF0b3JBdHRlbnVhdGVGYWN0b3I6IDAuOCxcbiAgZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yOiAxXG59O1xuXG50eXBlIEF0bW9zcGhlcmVMYXllclByb3BzID0ge1xuICBjb25maWc6IEdsb2JlQ29uZmlnO1xuICAvKiogUHJlLWNvbXB1dGVkIFswLCAxXSB6b29tLWZhZGUgbXVsdGlwbGllcjsgMSA9IGZ1bGx5IHZpc2libGUsIDAgPSBoaWRkZW4uICovXG4gIHpvb21GYWRlOiBudW1iZXI7XG59O1xuXG5leHBvcnQgY2xhc3MgQXRtb3NwaGVyZUxheWVyUmVhbGlzdGljIGV4dGVuZHMgU2ltcGxlTWVzaExheWVyPGFueSwgQXRtb3NwaGVyZUxheWVyUHJvcHM+IHtcbiAgc3RhdGljIGxheWVyTmFtZSA9ICdBdG1vc3BoZXJlTGF5ZXJSZWFsaXN0aWMnO1xuXG4gIGRyYXcoe3VuaWZvcm1zfToge3VuaWZvcm1zOiBvYmplY3R9KTogdm9pZCB7XG4gICAgY29uc3Qge2NvbmZpZywgem9vbUZhZGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3RhdGUubW9kZWw7XG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAobW9kZWwgYXMgYW55KS5wcm9wcy51bmlmb3JtcyA9IHtcbiAgICAgICAgLi4uKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMsXG4gICAgICAgIC4uLkFUTU9TUEhFUkVfVU5JRk9STVMsXG4gICAgICAgIGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjogY29uZmlnLnRlcm1pbmF0b3IgPyBjb25maWcudGVybWluYXRvck9wYWNpdHkgOiAwLFxuICAgICAgICB2M1N1blBvczogY29uZmlnLmF6aW11dGggPyBhbmdsZVRvU3VuUG9zKHRvUmFkaWFucyhjb25maWcuYXppbXV0aEFuZ2xlKSkgOiB2M1N1blBvc05vdyxcbiAgICAgICAgZkF0bW9zcGhlcmVab29tRmFkZTogem9vbUZhZGVcbiAgICAgIH07XG4gICAgfVxuICAgIHN1cGVyLmRyYXcoe3VuaWZvcm1zfSk7XG4gIH1cblxuICBnZXRTaGFkZXJzKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmdldFNoYWRlcnMoKSxcbiAgICAgIGluamVjdDoge1xuICAgICAgICAnZnM6I2RlY2wnOiBgXG4gICAgICAgICAgdW5pZm9ybSB2ZWMzIHYzU3VuUG9zO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBnO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZXhwb3N1cmU7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTYW1wbGVzO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmT3V0ZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3JFU3VuO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkttRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLcjRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbTRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTY2FsZURlcHRoO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmVGVybWluYXRvckF0dGVudWF0ZUZhY3RvcjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG5cbiAgICAgICAgICBjb25zdCBpbnQgblNhbXBsZXMgPSAke05VTV9TQU1QTEVfUkFZU307XG5cbiAgICAgICAgICBmbG9hdCBzY2FsZShmbG9hdCBmQ29zKSB7XG4gICAgICAgICAgICBmbG9hdCB4ID0gMS4wIC0gZkNvcztcbiAgICAgICAgICAgIHJldHVybiBmU2NhbGVEZXB0aCAqIGV4cCgtMC4wMDI4NyArIHgqKDAuNDU5ICsgeCooMy44MyArIHgqKC02LjggKyB4KjUuMjUpKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICAgICAgJ2ZzOiNtYWluLWVuZCc6IGBcbiAgICAgICAgICB2ZWMzIHYzQ2FtZXJhUG9zID0gY2FtZXJhUG9zaXRpb247XG4gICAgICAgICAgdmVjMyB2M1BvcyA9IHBvc2l0aW9uX2NvbW1vbnNwYWNlLnh5ejtcblxuICAgICAgICAgIGZsb2F0IGcyID0gZyAqIGc7XG5cbiAgICAgICAgICB2ZWMzIHYzSW52V2F2ZWxlbmd0aCA9IHZlYzMoMS4wIC8gcG93KDAuNjUwLCA0LjApLCAxLjAgLyBwb3coMC41NzAsIDQuMCksIDEuMCAvIHBvdygwLjQ3NSwgNC4wKSk7XG5cbiAgICAgICAgICBmbG9hdCBmSW5uZXJSYWRpdXMyID0gZklubmVyUmFkaXVzICogZklubmVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZPdXRlclJhZGl1czIgPSBmT3V0ZXJSYWRpdXMgKiBmT3V0ZXJSYWRpdXM7XG4gICAgICAgICAgZmxvYXQgZlNjYWxlID0gMS4wIC8gKGZPdXRlclJhZGl1cyAtIGZJbm5lclJhZGl1cyk7XG4gICAgICAgICAgZmxvYXQgZlNjYWxlT3ZlclNjYWxlRGVwdGggPSAxLjAgLyAoZk91dGVyUmFkaXVzIC0gZklubmVyUmFkaXVzKSAvIGZTY2FsZURlcHRoO1xuXG4gICAgICAgICAgZmxvYXQgY2FtZXJhSGVpZ2h0MiA9IGxlbmd0aCh2M0NhbWVyYVBvcykgKiBsZW5ndGgodjNDYW1lcmFQb3MpO1xuXG4gICAgICAgICAgdmVjMyB2M1JheSA9IHYzUG9zIC0gdjNDYW1lcmFQb3M7XG4gICAgICAgICAgZmxvYXQgZkZhciA9IGxlbmd0aCh2M1JheSk7XG4gICAgICAgICAgdjNSYXkgLz0gZkZhcjtcblxuICAgICAgICAgIGZsb2F0IEIgPSAyLjAgKiBkb3QodjNDYW1lcmFQb3MsIHYzUmF5KTtcbiAgICAgICAgICBmbG9hdCBDID0gY2FtZXJhSGVpZ2h0MiAtIGZPdXRlclJhZGl1czI7XG4gICAgICAgICAgZmxvYXQgZkRldCA9IG1heCgwLjAsIEIqQiAtIDQuMCAqIEMpO1xuICAgICAgICAgIGZsb2F0IGZOZWFyID0gMC41ICogKC1CIC0gc3FydChmRGV0KSk7XG5cbiAgICAgICAgICB2ZWMzIHYzU3RhcnQgPSB2M0NhbWVyYVBvcyArIHYzUmF5ICogZk5lYXI7XG4gICAgICAgICAgZkZhciAtPSBmTmVhcjtcblxuICAgICAgICAgIGZsb2F0IGZEZXB0aCA9IGV4cCgoZklubmVyUmFkaXVzIC0gZk91dGVyUmFkaXVzKSAvIGZTY2FsZURlcHRoKTtcbiAgICAgICAgICBmbG9hdCBmQ2FtZXJhQW5nbGUgPSBkb3QoLXYzUmF5LCB2M1BvcykgLyBsZW5ndGgodjNQb3MpO1xuICAgICAgICAgIGZsb2F0IGZMaWdodEFuZ2xlID0gZG90KHYzU3VuUG9zLCB2M1BvcykgLyBsZW5ndGgodjNQb3MpO1xuICAgICAgICAgIGZsb2F0IGZDYW1lcmFTY2FsZSA9IHNjYWxlKGZDYW1lcmFBbmdsZSk7XG4gICAgICAgICAgZmxvYXQgZkxpZ2h0U2NhbGUgPSBzY2FsZShmTGlnaHRBbmdsZSk7XG4gICAgICAgICAgZmxvYXQgZkNhbWVyYU9mZnNldCA9IGZEZXB0aCpmQ2FtZXJhU2NhbGU7XG4gICAgICAgICAgZmxvYXQgZlRlbXAgPSAoZkxpZ2h0U2NhbGUgKyBmQ2FtZXJhU2NhbGUpO1xuXG4gICAgICAgICAgZmxvYXQgZlNhbXBsZUxlbmd0aCA9IGZGYXIgLyBmU2FtcGxlcztcbiAgICAgICAgICBmbG9hdCBmU2NhbGVkTGVuZ3RoID0gZlNhbXBsZUxlbmd0aCAqIGZTY2FsZTtcbiAgICAgICAgICB2ZWMzIHYzU2FtcGxlUmF5ID0gdjNSYXkgKiBmU2FtcGxlTGVuZ3RoO1xuICAgICAgICAgIHZlYzMgdjNTYW1wbGVQb2ludCA9IHYzU3RhcnQgKyB2M1NhbXBsZVJheSAqIDAuNTtcblxuICAgICAgICAgIHZlYzMgdjNGcm9udENvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgICB2ZWMzIHYzQXR0ZW51YXRlID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgICBmb3IoaW50IGk9MDsgaTxuU2FtcGxlczsgaSsrKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmxvYXQgZkhlaWdodCA9IGxlbmd0aCh2M1NhbXBsZVBvaW50KTtcbiAgICAgICAgICAgICAgZmxvYXQgZkRlcHRoID0gZXhwKGZTY2FsZU92ZXJTY2FsZURlcHRoICogKGZJbm5lclJhZGl1cyAtIGZIZWlnaHQpKTtcbiAgICAgICAgICAgICAgZmxvYXQgZlNjYXR0ZXIgPSBmRGVwdGgqZlRlbXAgLSBmQ2FtZXJhT2Zmc2V0O1xuICAgICAgICAgICAgICB2M0F0dGVudWF0ZSA9IGV4cCgtZlNjYXR0ZXIgKiAodjNJbnZXYXZlbGVuZ3RoICogZktyNFBJICsgZkttNFBJKSk7XG4gICAgICAgICAgICAgIHYzRnJvbnRDb2xvciArPSB2M0F0dGVudWF0ZSAqIChmRGVwdGggKiBmU2NhbGVkTGVuZ3RoKTtcbiAgICAgICAgICAgICAgdjNTYW1wbGVQb2ludCArPSB2M1NhbXBsZVJheTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2ZWMzIGMwID0gdjNBdHRlbnVhdGU7XG4gICAgICAgICAgdmVjMyBjMSA9IHYzRnJvbnRDb2xvciAqICh2M0ludldhdmVsZW5ndGggKiBmS3JFU3VuICsgZkttRVN1bik7XG5cbiAgICAgICAgICBmcmFnQ29sb3IgPSB2ZWM0KGMxLCAxLjAgLSBjMCAqIGZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yKTtcbiAgICAgICAgICBmcmFnQ29sb3IuYSAqPSBmVGVybWluYXRvck9wYWNpdHlGYWN0b3I7XG5cbiAgICAgICAgICAvLyBLZWVwIHRoZSBkYXkgaGVtaXNwaGVyZSBjb21wbGV0ZWx5IHVuc2hhZGVkIOKAlCB0aGUgYXR0ZW51YXRpb24tYmFzZWRcbiAgICAgICAgICAvLyBhbHBoYSBhYm92ZSBpcyBub24temVybyBldmVuIGF0IG5vb24sIHdoaWNoIHNsaWdodGx5IGRhcmtlbnMgdGhlIGxpdFxuICAgICAgICAgIC8vIHNpZGUuIEdhdGUgaXQgd2l0aCBhIGRheS9uaWdodCBtYXNrIHNvIGRhcmtlbmluZyBvbmx5IGFwcGVhcnMgYWNyb3NzXG4gICAgICAgICAgLy8gdGhlIHRlcm1pbmF0b3IgYW5kIG9udG8gdGhlIG5pZ2h0IHNpZGUuXG4gICAgICAgICAgLy8gZkxpZ2h0QW5nbGUgPSBkb3Qoc3VuRGlyLCBzdXJmYWNlTm9ybWFsKTogKzEgYXQgdGhlIHN1YnNvbGFyIHBvaW50XG4gICAgICAgICAgLy8gKG5vb24pLCAwIGF0IHRoZSB0ZXJtaW5hdG9yLCAtMSBhdCBtaWRuaWdodC4gc21vb3Roc3RlcCBtYXBzIHRoZSBkYXlcbiAgICAgICAgICAvLyBzaWRlICg+PSAwLjIpIHRvIDAgKG5vIGRhcmtlbmluZyksIHJhbXBzIHRocm91Z2ggdGhlIHRlcm1pbmF0b3IsIGFuZFxuICAgICAgICAgIC8vIHJlYWNoZXMgZnVsbCBkYXJrZW5pbmcgb24gdGhlIG5pZ2h0IHNpZGUgKDw9IC0wLjIpLlxuICAgICAgICAgIGZsb2F0IGZOaWdodE1hc2sgPSBzbW9vdGhzdGVwKDAuMiwgLTAuMiwgZkxpZ2h0QW5nbGUpO1xuICAgICAgICAgIGZyYWdDb2xvci5hICo9IGZOaWdodE1hc2s7XG5cbiAgICAgICAgICAvLyBGYWRlIG91dCB0aGUgZW50aXJlIGRheS9uaWdodCBzaGFkaW5nIGVmZmVjdCBhcyB0aGUgdXNlciB6b29tcyBpbi5cbiAgICAgICAgICAvLyBBdCB6b29tIGxldmVscyBhYm92ZSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQgdGhlIGVmZmVjdCBpcyBpbnZpc2libGUsXG4gICAgICAgICAgLy8gc28gaXQgZG9lc24ndCBvYnNjdXJlIG1hcCBkZXRhaWwgYXQgc3RyZWV0L2NpdHkgc2NhbGUuXG4gICAgICAgICAgZnJhZ0NvbG9yLmEgKj0gZkF0bW9zcGhlcmVab29tRmFkZTtcbiAgICAgICAgYCxcbiAgICAgICAgJ2ZzOkRFQ0tHTF9GSUxURVJfQ09MT1InOiBgYFxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyBleHRlbmRzIFNpbXBsZU1lc2hMYXllcjxhbnksIEF0bW9zcGhlcmVMYXllclByb3BzPiB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnQXRtb3NwaGVyZVNreUxheWVyUmVhbGlzdGljJztcblxuICBkcmF3KHt1bmlmb3Jtc306IHt1bmlmb3Jtczogb2JqZWN0fSk6IHZvaWQge1xuICAgIGNvbnN0IHtjb25maWcsIHpvb21GYWRlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnN0YXRlLm1vZGVsO1xuICAgIGlmIChtb2RlbCkge1xuICAgICAgKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMgPSB7XG4gICAgICAgIC4uLihtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zLFxuICAgICAgICAuLi5BVE1PU1BIRVJFX1VOSUZPUk1TLFxuICAgICAgICB2M1N1blBvczogY29uZmlnLmF6aW11dGggPyBhbmdsZVRvU3VuUG9zKHRvUmFkaWFucyhjb25maWcuYXppbXV0aEFuZ2xlKSkgOiB2M1N1blBvc05vdyxcbiAgICAgICAgZkF0bW9zcGhlcmVab29tRmFkZTogem9vbUZhZGVcbiAgICAgIH07XG4gICAgfVxuICAgIHN1cGVyLmRyYXcoe3VuaWZvcm1zfSk7XG4gIH1cblxuICBnZXRTaGFkZXJzKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmdldFNoYWRlcnMoKSxcbiAgICAgIGluamVjdDoge1xuICAgICAgICAnZnM6I2RlY2wnOiBgXG4gICAgICAgICAgdW5pZm9ybSB2ZWMzIHYzU3VuUG9zO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBnO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZXhwb3N1cmU7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTYW1wbGVzO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmT3V0ZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3JFU3VuO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkttRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLcjRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbTRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTY2FsZURlcHRoO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkF0bW9zcGhlcmVab29tRmFkZTtcblxuICAgICAgICAgIGNvbnN0IGludCBuU2FtcGxlcyA9ICR7TlVNX1NBTVBMRV9SQVlTfTtcblxuICAgICAgICAgIGZsb2F0IHNjYWxlKGZsb2F0IGZDb3MpIHtcbiAgICAgICAgICAgIGZsb2F0IHggPSAxLjAgLSBmQ29zO1xuICAgICAgICAgICAgcmV0dXJuIGZTY2FsZURlcHRoICogZXhwKC0wLjAwMjg3ICsgeCooMC40NTkgKyB4KigzLjgzICsgeCooLTYuOCArIHgqNS4yNSkpKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxvYXQgZ2V0TWllUGhhc2UoZmxvYXQgZkNvcywgZmxvYXQgZkNvczIsIGZsb2F0IGcsIGZsb2F0IGcyKSB7XG4gICAgICAgICAgICByZXR1cm4gMS41ICogKCgxLjAgLSBnMikgLyAoMi4wICsgZzIpKSAqICgxLjAgKyBmQ29zMikgLyBwb3coMS4wICsgZzIgLSAyLjAgKiBnICogZkNvcywgMS41KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmbG9hdCBnZXRSYXlsZWlnaFBoYXNlKGZsb2F0IGZDb3MyKSB7XG4gICAgICAgICAgICByZXR1cm4gMC43NSArIDAuNzUgKiBmQ29zMjtcbiAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgICAgICdmczojbWFpbi1lbmQnOiBgXG4gICAgICAgICAgdmVjMyB2M0NhbWVyYVBvcyA9IGNhbWVyYVBvc2l0aW9uO1xuICAgICAgICAgIHZlYzMgdjNQb3MgPSBwb3NpdGlvbl9jb21tb25zcGFjZS54eXo7XG5cbiAgICAgICAgICBmbG9hdCBnMiA9IGcgKiBnO1xuXG4gICAgICAgICAgdmVjMyB2M0ludldhdmVsZW5ndGggPSB2ZWMzKDEuMCAvIHBvdygwLjY1MCwgNC4wKSwgMS4wIC8gcG93KDAuNTcwLCA0LjApLCAxLjAgLyBwb3coMC40NzUsIDQuMCkpO1xuXG4gICAgICAgICAgZmxvYXQgZklubmVyUmFkaXVzMiA9IGZJbm5lclJhZGl1cyAqIGZJbm5lclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmT3V0ZXJSYWRpdXMyID0gZk91dGVyUmFkaXVzICogZk91dGVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZSA9IDEuMCAvIChmT3V0ZXJSYWRpdXMgLSBmSW5uZXJSYWRpdXMpO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZU92ZXJTY2FsZURlcHRoID0gMS4wIC8gKGZPdXRlclJhZGl1cyAtIGZJbm5lclJhZGl1cykgLyBmU2NhbGVEZXB0aDtcblxuICAgICAgICAgIGZsb2F0IGNhbWVyYUhlaWdodDIgPSBsZW5ndGgodjNDYW1lcmFQb3MpICogbGVuZ3RoKHYzQ2FtZXJhUG9zKTtcblxuICAgICAgICAgIHZlYzMgdjNSYXkgPSB2M1BvcyAtIHYzQ2FtZXJhUG9zO1xuICAgICAgICAgIGZsb2F0IGZGYXIgPSBsZW5ndGgodjNSYXkpO1xuICAgICAgICAgIHYzUmF5IC89IGZGYXI7XG5cbiAgICAgICAgICBmbG9hdCBCID0gMi4wICogZG90KHYzQ2FtZXJhUG9zLCB2M1JheSk7XG4gICAgICAgICAgZmxvYXQgQyA9IGNhbWVyYUhlaWdodDIgLSBmT3V0ZXJSYWRpdXMyO1xuICAgICAgICAgIGZsb2F0IGZEZXQgPSBtYXgoMC4wLCBCKkIgLSA0LjAgKiBDKTtcbiAgICAgICAgICBmbG9hdCBmTmVhciA9IDAuNSAqICgtQiAtIHNxcnQoZkRldCkpO1xuXG4gICAgICAgICAgdmVjMyB2M1N0YXJ0ID0gdjNDYW1lcmFQb3MgKyB2M1JheSAqIGZOZWFyO1xuICAgICAgICAgIGZGYXIgLT0gZk5lYXI7XG4gICAgICAgICAgZmxvYXQgZlN0YXJ0QW5nbGUgPSBkb3QodjNSYXksIHYzU3RhcnQpIC8gZk91dGVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZTdGFydERlcHRoID0gZXhwKC0xLjAgLyBmU2NhbGVEZXB0aCk7XG4gICAgICAgICAgZmxvYXQgZlN0YXJ0T2Zmc2V0ID0gZlN0YXJ0RGVwdGggKiBzY2FsZShmU3RhcnRBbmdsZSk7XG5cbiAgICAgICAgICBmbG9hdCBmU2FtcGxlTGVuZ3RoID0gZkZhciAvIGZTYW1wbGVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZWRMZW5ndGggPSBmU2FtcGxlTGVuZ3RoICogZlNjYWxlO1xuICAgICAgICAgIHZlYzMgdjNTYW1wbGVSYXkgPSB2M1JheSAqIGZTYW1wbGVMZW5ndGg7XG4gICAgICAgICAgdmVjMyB2M1NhbXBsZVBvaW50ID0gdjNTdGFydCArIHYzU2FtcGxlUmF5ICogMC41O1xuXG4gICAgICAgICAgdmVjMyB2M0Zyb250Q29sb3IgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xuICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG5TYW1wbGVzOyBpKyspXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmxvYXQgZkhlaWdodCA9IGxlbmd0aCh2M1NhbXBsZVBvaW50KTtcbiAgICAgICAgICAgIGZsb2F0IGZEZXB0aCA9IGV4cChmU2NhbGVPdmVyU2NhbGVEZXB0aCAqIChmSW5uZXJSYWRpdXMgLSBmSGVpZ2h0KSk7XG4gICAgICAgICAgICBmbG9hdCBmTGlnaHRBbmdsZSA9IGRvdCh2M1N1blBvcywgdjNTYW1wbGVQb2ludCkgLyBmSGVpZ2h0O1xuICAgICAgICAgICAgZmxvYXQgZkNhbWVyYUFuZ2xlID0gZG90KHYzUmF5LCB2M1NhbXBsZVBvaW50KSAvIGZIZWlnaHQ7XG4gICAgICAgICAgICBmbG9hdCBmU2NhdHRlciA9IChmU3RhcnRPZmZzZXQgKyBmRGVwdGggKiAoc2NhbGUoZkxpZ2h0QW5nbGUpIC0gc2NhbGUoZkNhbWVyYUFuZ2xlKSkpO1xuICAgICAgICAgICAgdmVjMyB2M0F0dGVudWF0ZSA9IGV4cCgtZlNjYXR0ZXIgKiAodjNJbnZXYXZlbGVuZ3RoICogZktyNFBJICsgZkttNFBJKSk7XG5cbiAgICAgICAgICAgIHYzRnJvbnRDb2xvciArPSB2M0F0dGVudWF0ZSAqIChmRGVwdGggKiBmU2NhbGVkTGVuZ3RoKTtcbiAgICAgICAgICAgIHYzU2FtcGxlUG9pbnQgKz0gdjNTYW1wbGVSYXk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmVjMyBjMCA9IHYzRnJvbnRDb2xvciAqICh2M0ludldhdmVsZW5ndGggKiBmS3JFU3VuKTtcbiAgICAgICAgICB2ZWMzIGMxID0gdjNGcm9udENvbG9yICogZkttRVN1bjtcblxuICAgICAgICAgIHZlYzMgdjNEaXJlY3Rpb24gPSB2M0NhbWVyYVBvcyAtIHYzUG9zO1xuXG4gICAgICAgICAgZmxvYXQgZkNvcyA9IGRvdCh2M1N1blBvcywgdjNEaXJlY3Rpb24pIC8gbGVuZ3RoKHYzRGlyZWN0aW9uKTtcbiAgICAgICAgICBmbG9hdCBmQ29zMiA9IGZDb3MgKiBmQ29zO1xuXG4gICAgICAgICAgdmVjMyBza3lDb2xvciA9IGdldFJheWxlaWdoUGhhc2UoZkNvczIpICogYzAgKyBnZXRNaWVQaGFzZShmQ29zLCBmQ29zMiwgZywgZzIpICogYzE7XG5cbiAgICAgICAgICBmcmFnQ29sb3IgPSB2ZWM0KHNreUNvbG9yLCAxLjApO1xuICAgICAgICAgIGZyYWdDb2xvci5hID0gZnJhZ0NvbG9yLmI7XG5cbiAgICAgICAgICAvLyBGYWRlIHRoZSBza3kgaGFsbyBvdXQgYXMgdGhlIHVzZXIgem9vbXMgaW4gcGFzdCBjb250aW5lbnQgc2NhbGUuXG4gICAgICAgICAgZnJhZ0NvbG9yLmEgKj0gZkF0bW9zcGhlcmVab29tRmFkZTtcbiAgICAgICAgYCxcbiAgICAgICAgJ2ZzOkRFQ0tHTF9GSUxURVJfQ09MT1InOiBgYFxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuY29uc3QgQVRNT1NQSEVSRV9QQVJBTUVURVJTID0ge1xuICBkZXB0aFRlc3Q6IGZhbHNlLFxuICBibGVuZEZ1bmM6IFsweDAzMDIsIDB4MDMwMywgMSwgMHgwMzAzXSwgLy8gU1JDX0FMUEhBLCBPTkVfTUlOVVNfU1JDX0FMUEhBLCBPTkUsIE9ORV9NSU5VU19TUkNfQUxQSEFcbiAgYmxlbmRFcXVhdGlvbjogWzB4ODAwNiwgMHg4MDA2XSAvLyBGVU5DX0FERFxufTtcblxuY29uc3QgQVRNT1NQSEVSRV9TS1lfUEFSQU1FVEVSUyA9IHtcbiAgY3VsbEZhY2U6IDB4MDQwNCwgLy8gR0wuRlJPTlRcbiAgZGVwdGhNYXNrOiBmYWxzZSxcbiAgYmxlbmRGdW5jOiBbMHgwMzAyLCAweDAzMDMsIDEsIDB4MDMwM10sXG4gIGJsZW5kRXF1YXRpb246IFsweDgwMDYsIDB4ODAwNl1cbn07XG5cbi8qKlxuICogU29mdCwgc3VuLWluZGVwZW5kZW50IGdsb3cuIFJhZGlpIGFyZSBpbiBkZWNrLmdsIGNvbW1vbiBzcGFjZVxuICogKEdMT0JFX0NPTU1PTl9SQURJVVMgPSAyNTY7IGF0bW9zcGhlcmUgdXNlcyB+MjU4IGFzIGEgc2xpZ2h0IGZ1ZGdlKS5cbiAqIE91dGVyIOKJiCAxNCUgbGFyZ2VyIHRoYW4gaW5uZXIgYXQgcmFkaXVzIG11bHRpcGxpZXIgPSAxIChtYXRjaGVzIHRoZSBiYXNlIG1lc2gpLlxuICovXG5jb25zdCBIVUdFX0hBTE9fSU5ORVJfUkFESVVTID0gMjU4O1xuY29uc3QgSFVHRV9IQUxPX0JBU0VfT1VURVJfUkFESVVTID0gMjk0O1xuY29uc3QgSFVHRV9IQUxPX0JBU0VfU0hFTEwgPSBIVUdFX0hBTE9fQkFTRV9PVVRFUl9SQURJVVMgLSBIVUdFX0hBTE9fSU5ORVJfUkFESVVTO1xuLyoqIE1hdGNoZXMgdGhlIEhhbG8gUmFkaXVzIHNsaWRlciBtYXg7IGhpZ2hlciB2YWx1ZXMgY2FuIHByb2R1Y2UgYSBibGFjay1kaXNjIGFydGlmYWN0LiAqL1xuY29uc3QgSFVHRV9IQUxPX1JBRElVU19NQVggPSAzLjU7XG5cbmNvbnN0IEhVR0VfSEFMT19VTklGT1JNUyA9IHtcbiAgZklubmVyUmFkaXVzOiBIVUdFX0hBTE9fSU5ORVJfUkFESVVTLFxuICAvLyBTb2Z0IGN5YW4gbWF0Y2hpbmcgdGhlIHJlZmVyZW5jZSBodWdlLWhhbG8gbG9vay5cbiAgdjNIYWxvQ29sb3I6IFswLjQ1LCAwLjcyLCAxLjBdLFxuICBmSGFsb0ludGVuc2l0eTogMS4wXG59O1xuXG5jb25zdCBIVUdFX0hBTE9fUEFSQU1FVEVSUyA9IHtcbiAgY3VsbEZhY2U6IDB4MDQwNCwgLy8gR0wuRlJPTlRcbiAgZGVwdGhNYXNrOiBmYWxzZSxcbiAgLy8gTGFyZ2Ugc2hlbGxzIG9mdGVuIGVuY2xvc2UgdGhlIGNhbWVyYTsgZGlzYWJsZSBkZXB0aCBzbyB0aGUgcmluZyBzdGlsbCBkcmF3cy5cbiAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgYmxlbmRGdW5jOiBbMHgwMzAyLCAweDAzMDMsIDEsIDB4MDMwM10sIC8vIFNSQ19BTFBIQSwgT05FX01JTlVTX1NSQ19BTFBIQVxuICBibGVuZEVxdWF0aW9uOiBbMHg4MDA2LCAweDgwMDZdXG59O1xuXG5mdW5jdGlvbiByZXNvbHZlSHVnZUhhbG9SYWRpdXMoY29uZmlnOiBHbG9iZUNvbmZpZyk6IG51bWJlciB7XG4gIGNvbnN0IG11bHRpcGxpZXIgPSBOdW1iZXIuaXNGaW5pdGUoY29uZmlnLmh1Z2VIYWxvUmFkaXVzKVxuICAgID8gKGNvbmZpZy5odWdlSGFsb1JhZGl1cyBhcyBudW1iZXIpXG4gICAgOiBERUZBVUxUX0dMT0JFX0NPTkZJRy5odWdlSGFsb1JhZGl1cztcbiAgLy8gU2NhbGUgc2hlbGwgdGhpY2tuZXNzOyBrZWVwIG91dGVyIGFib3ZlIHRoZSBwbGFuZXQgc3VyZmFjZS5cbiAgcmV0dXJuIChcbiAgICBIVUdFX0hBTE9fSU5ORVJfUkFESVVTICtcbiAgICBIVUdFX0hBTE9fQkFTRV9TSEVMTCAqIE1hdGgubWF4KE1hdGgubWluKG11bHRpcGxpZXIsIEhVR0VfSEFMT19SQURJVVNfTUFYKSwgMC4wNSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUh1Z2VIYWxvT3BhY2l0eShjb25maWc6IEdsb2JlQ29uZmlnKTogbnVtYmVyIHtcbiAgY29uc3Qgb3BhY2l0eSA9IE51bWJlci5pc0Zpbml0ZShjb25maWcuaHVnZUhhbG9PcGFjaXR5KVxuICAgID8gKGNvbmZpZy5odWdlSGFsb09wYWNpdHkgYXMgbnVtYmVyKVxuICAgIDogREVGQVVMVF9HTE9CRV9DT05GSUcuaHVnZUhhbG9PcGFjaXR5O1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgb3BhY2l0eSkpO1xufVxuXG4vKipcbiAqIFZpZXctaW5kZXBlbmRlbnQgYXRtb3NwaGVyZTogYSBsYXJnZSB1bmlmb3JtIGVtaXNzaXZlIGF1cmEgYXJvdW5kIHRoZSBnbG9iZS5cbiAqIFVubGlrZSBBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMsIHRoaXMgaWdub3JlcyBzdW4gZGlyZWN0aW9uIGFuZCB1c2VzIGFcbiAqIGxpbmVhciByYWRpYWwgZmFsbG9mZiB0aHJvdWdoIGEgdGhpY2sgc2hlbGwgKG1heCBhdCB0aGUgc3VyZmFjZSDihpIgMCBhdCBvdXRlciByYWRpdXMpLlxuICovXG5leHBvcnQgY2xhc3MgQXRtb3NwaGVyZUh1Z2VIYWxvTGF5ZXIgZXh0ZW5kcyBTaW1wbGVNZXNoTGF5ZXI8YW55LCBBdG1vc3BoZXJlTGF5ZXJQcm9wcz4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0F0bW9zcGhlcmVIdWdlSGFsb0xheWVyJztcblxuICBkcmF3KHt1bmlmb3Jtc306IHt1bmlmb3Jtczogb2JqZWN0fSk6IHZvaWQge1xuICAgIGNvbnN0IHtjb25maWcsIHpvb21GYWRlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnN0YXRlLm1vZGVsO1xuICAgIGlmIChtb2RlbCkge1xuICAgICAgKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMgPSB7XG4gICAgICAgIC4uLihtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zLFxuICAgICAgICAuLi5IVUdFX0hBTE9fVU5JRk9STVMsXG4gICAgICAgIGZIYWxvT3BhY2l0eTogcmVzb2x2ZUh1Z2VIYWxvT3BhY2l0eShjb25maWcpLFxuICAgICAgICBmQXRtb3NwaGVyZVpvb21GYWRlOiB6b29tRmFkZVxuICAgICAgfTtcbiAgICB9XG4gICAgc3VwZXIuZHJhdyh7dW5pZm9ybXN9KTtcbiAgfVxuXG4gIGdldFNoYWRlcnMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0U2hhZGVycygpLFxuICAgICAgaW5qZWN0OiB7XG4gICAgICAgICdmczojZGVjbCc6IGBcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZJbm5lclJhZGl1cztcbiAgICAgICAgICB1bmlmb3JtIHZlYzMgdjNIYWxvQ29sb3I7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmSGFsb0ludGVuc2l0eTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZIYWxvT3BhY2l0eTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG4gICAgICAgIGAsXG4gICAgICAgICdmczojbWFpbi1lbmQnOiBgXG4gICAgICAgICAgdmVjMyB2M0NhbWVyYVBvcyA9IGNhbWVyYVBvc2l0aW9uO1xuICAgICAgICAgIHZlYzMgdjNQb3MgPSBwb3NpdGlvbl9jb21tb25zcGFjZS54eXo7XG4gICAgICAgICAgLy8gT3V0ZXIgcmFkaXVzIGZyb20gdGhlIGFjdHVhbCBtZXNoIHZlcnRleCBzbyBzaXplU2NhbGUgc3RheXMgaW4gc3luYy5cbiAgICAgICAgICBmbG9hdCBmT3V0ZXJSYWRpdXMgPSBsZW5ndGgodjNQb3MpO1xuICAgICAgICAgIHZlYzMgdjNSYXkgPSBub3JtYWxpemUodjNQb3MgLSB2M0NhbWVyYVBvcyk7XG5cbiAgICAgICAgICAvLyBJbXBhY3QgcGFyYW1ldGVyIG9mIHRoZSB2aWV3IHJheSAocGVycGVuZGljdWxhciBkaXN0YW5jZSBmcm9tIGdsb2JlXG4gICAgICAgICAgLy8gY2VudGVyIHRvIHRoZSByYXkpLiBTdGFibGUgd2hlbiB0aGUgY2FtZXJhIGlzIGluc2lkZSB0aGUgb3V0ZXIgc2hlbGwsXG4gICAgICAgICAgLy8gdW5saWtlIG5lYXIvZmFyIHNwaGVyZS1pbnRlcnNlY3Rpb24gbWF0aCB3aGljaCBicmVha3MgaW4gdGhhdCBjYXNlXG4gICAgICAgICAgLy8gYW5kIHByb2R1Y2VkIGEgYmxhY2sgZGlzYyBhdCBoaWdoIHJhZGl1cyBtdWx0aXBsaWVycy5cbiAgICAgICAgICBmbG9hdCBmRE1pbiA9IGxlbmd0aChjcm9zcyh2M0NhbWVyYVBvcywgdjNSYXkpKTtcblxuICAgICAgICAgIC8vIExpbmVhciBmYWxsb2ZmIGluIHRoZSBhbm51bHVzIG9ubHk6IG1heCBhdCB0aGUgc3VyZmFjZSwgemVybyBhdCBvdXRlci5cbiAgICAgICAgICBmbG9hdCBmU2hlbGwgPSBtYXgoZk91dGVyUmFkaXVzIC0gZklubmVyUmFkaXVzLCAwLjAwMDEpO1xuICAgICAgICAgIGZsb2F0IGZHbG93ID0gMC4wO1xuICAgICAgICAgIGlmIChmRE1pbiA+PSBmSW5uZXJSYWRpdXMgJiYgZkRNaW4gPCBmT3V0ZXJSYWRpdXMpIHtcbiAgICAgICAgICAgIGZsb2F0IHQgPSAoZkRNaW4gLSBmSW5uZXJSYWRpdXMpIC8gZlNoZWxsO1xuICAgICAgICAgICAgZkdsb3cgPSAxLjAgLSB0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZHbG93ICo9IGZIYWxvSW50ZW5zaXR5O1xuXG4gICAgICAgICAgLy8gU3RyYWlnaHQgYWxwaGEgKG5vdCBwcmVtdWx0aXBsaWVkKSBmb3IgU1JDX0FMUEhBIGJsZW5kaW5nLlxuICAgICAgICAgIGZyYWdDb2xvciA9IHZlYzQodjNIYWxvQ29sb3IsIGZHbG93ICogZkhhbG9PcGFjaXR5KTtcbiAgICAgICAgICBmcmFnQ29sb3IuYSAqPSBmQXRtb3NwaGVyZVpvb21GYWRlO1xuICAgICAgICBgLFxuICAgICAgICAnZnM6REVDS0dMX0ZJTFRFUl9DT0xPUic6IGBgXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVBdG1vc3BoZXJlTGF5ZXIgPSAoe2NvbmZpZywgem9vbX06IHtjb25maWc6IEdsb2JlQ29uZmlnOyB6b29tPzogbnVtYmVyfSkgPT4ge1xuICBjb25zdCB6b29tRmFkZSA9IGF0bW9zcGhlcmVab29tRmFkZSh6b29tID8/IDApO1xuICByZXR1cm4gbmV3IEF0bW9zcGhlcmVMYXllclJlYWxpc3RpYyh7XG4gICAgaWQ6ICdhdG1vc3BoZXJlJyxcbiAgICBkYXRhOiBbWzAsIDAsIDBdXSxcbiAgICBjb25maWcsXG4gICAgem9vbUZhZGUsXG4gICAgY29vcmRpbmF0ZU9yaWdpbjogWzAsIDAsIDBdLFxuICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkNBUlRFU0lBTixcbiAgICBnZXRQb3NpdGlvbjogKChkOiBudW1iZXJbXSkgPT4gZCkgYXMgYW55LFxuICAgIGdldENvbG9yOiBbMCwgMCwgMF0sXG4gICAgbWVzaDogR0xPQkVfTUVTSF9JTk5FUixcbiAgICBwYXJhbWV0ZXJzOiBBVE1PU1BIRVJFX1BBUkFNRVRFUlNcbiAgfSk7XG59O1xuXG4vKiogUmVhbGlzdGljIHN1bi1saXQgc2NhdHRlcmluZyBza3kgaGFsbyAodGhpbiBsaW1iIGdsb3cpLiAqL1xuZXhwb3J0IGNvbnN0IGdldEdsb2JlQXRtb3NwaGVyZVNreUxheWVyID0gKHtjb25maWcsIHpvb219OiB7Y29uZmlnOiBHbG9iZUNvbmZpZzsgem9vbT86IG51bWJlcn0pID0+IHtcbiAgY29uc3Qgem9vbUZhZGUgPSBhdG1vc3BoZXJlWm9vbUZhZGUoem9vbSA/PyAwKTtcbiAgcmV0dXJuIG5ldyBBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMoe1xuICAgIGlkOiAnYXRtb3NwaGVyZS1za3knLFxuICAgIGRhdGE6IFtbMCwgMCwgMF1dLFxuICAgIGNvbmZpZyxcbiAgICB6b29tRmFkZSxcbiAgICBjb29yZGluYXRlT3JpZ2luOiBbMCwgMCwgMF0sXG4gICAgY29vcmRpbmF0ZVN5c3RlbTogQ09PUkRJTkFURV9TWVNURU0uQ0FSVEVTSUFOLFxuICAgIGdldFBvc2l0aW9uOiAoKGQ6IG51bWJlcltdKSA9PiBkKSBhcyBhbnksXG4gICAgZ2V0Q29sb3I6IFswLCAwLCAwXSxcbiAgICBtZXNoOiBHTE9CRV9NRVNIX09VVEVSLFxuICAgIHBhcmFtZXRlcnM6IEFUTU9TUEhFUkVfU0tZX1BBUkFNRVRFUlNcbiAgfSk7XG59O1xuXG4vKipcbiAqIExhcmdlIHVuaWZvcm0gZ2xvdyBkcmF3biBpbiBhZGRpdGlvbiB0byB0aGUgcmVhbGlzdGljIHNreSBoYWxvIHdoZW5cbiAqIGBjb25maWcuaHVnZUhhbG9gIGlzIGVuYWJsZWQuIFJldHVybnMgbnVsbCB3aGVuIGRpc2FibGVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVIdWdlSGFsb0xheWVyID0gKHtjb25maWcsIHpvb219OiB7Y29uZmlnOiBHbG9iZUNvbmZpZzsgem9vbT86IG51bWJlcn0pID0+IHtcbiAgaWYgKCFjb25maWcuaHVnZUhhbG8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB6b29tRmFkZSA9IGF0bW9zcGhlcmVab29tRmFkZSh6b29tID8/IDApO1xuICBjb25zdCBvdXRlclJhZGl1cyA9IHJlc29sdmVIdWdlSGFsb1JhZGl1cyhjb25maWcpO1xuICAvLyBLZWVwIG1lc2ggZXh0ZW50IGluIHN5bmMgd2l0aCB0aGUgZGVzaXJlZCBvdXRlciByYWRpdXMgKGJhc2UgbWVzaCA9IGRlZmF1bHQgb3V0ZXIpLlxuICBjb25zdCBzaXplU2NhbGUgPSBvdXRlclJhZGl1cyAvIEhVR0VfSEFMT19CQVNFX09VVEVSX1JBRElVUztcbiAgcmV0dXJuIG5ldyBBdG1vc3BoZXJlSHVnZUhhbG9MYXllcih7XG4gICAgaWQ6ICdhdG1vc3BoZXJlLWh1Z2UtaGFsbycsXG4gICAgZGF0YTogW1swLCAwLCAwXV0sXG4gICAgY29uZmlnLFxuICAgIHpvb21GYWRlLFxuICAgIGNvb3JkaW5hdGVPcmlnaW46IFswLCAwLCAwXSxcbiAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5DQVJURVNJQU4sXG4gICAgZ2V0UG9zaXRpb246ICgoZDogbnVtYmVyW10pID0+IGQpIGFzIGFueSxcbiAgICBnZXRDb2xvcjogWzAsIDAsIDBdLFxuICAgIG1lc2g6IEdMT0JFX01FU0hfSFVHRV9IQUxPLFxuICAgIHNpemVTY2FsZSxcbiAgICBwYXJhbWV0ZXJzOiBIVUdFX0hBTE9fUEFSQU1FVEVSU1xuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQSxJQUFBQSxLQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxJQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxVQUFBLEdBQUFMLE9BQUE7QUFBNEUsU0FBQU0sUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxC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
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
11
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
12
|
+
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
13
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
14
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
+
var _layers = require("@deck.gl/layers");
|
|
16
|
+
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; }
|
|
17
|
+
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; }
|
|
18
|
+
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
19
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
20
|
+
function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } // SPDX-License-Identifier: MIT
|
|
21
|
+
// Copyright contributors to the kepler.gl project
|
|
22
|
+
// @ts-ignore _MultiIconLayer is an experimental, underscore-prefixed deck.gl export whose named type binding isn't reliably resolvable through the package barrel under this project's module resolution. Access it off the namespace with a loose type.
|
|
23
|
+
// Back-face culling for globe-mode text labels.
|
|
24
|
+
//
|
|
25
|
+
// deck.gl's TextLayer uses a MultiIconLayer to render glyphs; on a globe, labels
|
|
26
|
+
// anchored on the far hemisphere would otherwise be drawn "through" the planet.
|
|
27
|
+
// This subclass injects a small GLSL
|
|
28
|
+
// snippet into the icon vertex shader that degenerates (collapses) glyph vertices
|
|
29
|
+
// whose anchor is facing away from the camera, so back-side labels disappear.
|
|
30
|
+
//
|
|
31
|
+
// The test uses the true sphere-horizon condition rather than a fixed dot-product
|
|
32
|
+
// cutoff. In deck.gl common space the globe is a sphere centered at the origin, so:
|
|
33
|
+
// - the label anchor position doubles as its outward surface normal, and
|
|
34
|
+
// - a surface point is visible from the camera exactly when the angle between its
|
|
35
|
+
// normal and the camera direction is within the horizon half-angle, i.e.
|
|
36
|
+
// dot(normalize(anchor), normalize(cameraPos)) > R / d
|
|
37
|
+
// where R is the sphere radius (= |anchor|) and d = |cameraPos| is the camera
|
|
38
|
+
// distance from the globe center.
|
|
39
|
+
// This is zoom-independent: the visible cap automatically shrinks as you zoom in and
|
|
40
|
+
// grows as you pull back, so labels don't pop in/out at the limb while zooming.
|
|
41
|
+
var BACKFACE_CULL_INJECT = /* glsl */"\n // Only cull on the globe; leave web-mercator / flat views untouched.\n if (project.projectionMode == PROJECTION_MODE_GLOBE) {\n vec3 anchorCommon = geometry.position.xyz;\n float radius = length(anchorCommon);\n float camDist = length(project.cameraPosition);\n // Guard against degenerate anchors / camera at the center.\n if (radius > 0.0 && camDist > radius) {\n float cosSurface = dot(anchorCommon / radius, project.cameraPosition / camDist);\n // Cosine of the horizon half-angle. Add a tiny margin so labels are hidden just\n // before they wrap exactly onto the limb (avoids glyphs smeared along the edge).\n float cosHorizon = radius / camDist + 0.02;\n if (cosSurface < cosHorizon) {\n // Push the vertex outside clip space so this glyph is discarded. The hook\n // exposes the clip-space position as `position`, not `gl_Position`.\n position = vec4(0.0, 0.0, 2.0, 1.0);\n }\n }\n }\n";
|
|
42
|
+
var EnhancedMultiIconLayer = exports["default"] = /*#__PURE__*/function (_ref) {
|
|
43
|
+
function EnhancedMultiIconLayer() {
|
|
44
|
+
(0, _classCallCheck2["default"])(this, EnhancedMultiIconLayer);
|
|
45
|
+
return _callSuper(this, EnhancedMultiIconLayer, arguments);
|
|
46
|
+
}
|
|
47
|
+
(0, _inherits2["default"])(EnhancedMultiIconLayer, _ref);
|
|
48
|
+
return (0, _createClass2["default"])(EnhancedMultiIconLayer, [{
|
|
49
|
+
key: "getShaders",
|
|
50
|
+
value: function getShaders() {
|
|
51
|
+
var _shaders$inject;
|
|
52
|
+
var shaders = _superPropGet(EnhancedMultiIconLayer, "getShaders", this, 3)([]);
|
|
53
|
+
var existing = ((_shaders$inject = shaders.inject) === null || _shaders$inject === void 0 ? void 0 : _shaders$inject['vs:DECKGL_FILTER_GL_POSITION']) || '';
|
|
54
|
+
return _objectSpread(_objectSpread({}, shaders), {}, {
|
|
55
|
+
inject: _objectSpread(_objectSpread({}, shaders.inject || {}), {}, {
|
|
56
|
+
'vs:DECKGL_FILTER_GL_POSITION': "".concat(existing, "\n").concat(BACKFACE_CULL_INJECT)
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}]);
|
|
61
|
+
}(_layers._MultiIconLayer);
|
|
62
|
+
(0, _defineProperty2["default"])(EnhancedMultiIconLayer, "layerName", 'EnhancedMultiIconLayer');
|
|
63
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF5ZXJzIiwicmVxdWlyZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsIkJBQ0tGQUNFX0NVTExfSU5KRUNUIiwiRW5oYW5jZWRNdWx0aUljb25MYXllciIsImV4cG9ydHMiLCJfcmVmIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJnZXRTaGFkZXJzIiwiX3NoYWRlcnMkaW5qZWN0Iiwic2hhZGVycyIsImV4aXN0aW5nIiwiaW5qZWN0IiwiY29uY2F0IiwiTXVsdGlJY29uTGF5ZXIiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2xvYmUvZW5oYW5jZWQtbXVsdGktaWNvbi1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBAdHMtaWdub3JlIF9NdWx0aUljb25MYXllciBpcyBhbiBleHBlcmltZW50YWwsIHVuZGVyc2NvcmUtcHJlZml4ZWQgZGVjay5nbCBleHBvcnQgd2hvc2UgbmFtZWQgdHlwZSBiaW5kaW5nIGlzbid0IHJlbGlhYmx5IHJlc29sdmFibGUgdGhyb3VnaCB0aGUgcGFja2FnZSBiYXJyZWwgdW5kZXIgdGhpcyBwcm9qZWN0J3MgbW9kdWxlIHJlc29sdXRpb24uIEFjY2VzcyBpdCBvZmYgdGhlIG5hbWVzcGFjZSB3aXRoIGEgbG9vc2UgdHlwZS5cbmltcG9ydCB7X011bHRpSWNvbkxheWVyIGFzIE11bHRpSWNvbkxheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG4vLyBCYWNrLWZhY2UgY3VsbGluZyBmb3IgZ2xvYmUtbW9kZSB0ZXh0IGxhYmVscy5cbi8vXG4vLyBkZWNrLmdsJ3MgVGV4dExheWVyIHVzZXMgYSBNdWx0aUljb25MYXllciB0byByZW5kZXIgZ2x5cGhzOyBvbiBhIGdsb2JlLCBsYWJlbHNcbi8vIGFuY2hvcmVkIG9uIHRoZSBmYXIgaGVtaXNwaGVyZSB3b3VsZCBvdGhlcndpc2UgYmUgZHJhd24gXCJ0aHJvdWdoXCIgdGhlIHBsYW5ldC5cbi8vIFRoaXMgc3ViY2xhc3MgaW5qZWN0cyBhIHNtYWxsIEdMU0xcbi8vIHNuaXBwZXQgaW50byB0aGUgaWNvbiB2ZXJ0ZXggc2hhZGVyIHRoYXQgZGVnZW5lcmF0ZXMgKGNvbGxhcHNlcykgZ2x5cGggdmVydGljZXNcbi8vIHdob3NlIGFuY2hvciBpcyBmYWNpbmcgYXdheSBmcm9tIHRoZSBjYW1lcmEsIHNvIGJhY2stc2lkZSBsYWJlbHMgZGlzYXBwZWFyLlxuLy9cbi8vIFRoZSB0ZXN0IHVzZXMgdGhlIHRydWUgc3BoZXJlLWhvcml6b24gY29uZGl0aW9uIHJhdGhlciB0aGFuIGEgZml4ZWQgZG90LXByb2R1Y3Rcbi8vIGN1dG9mZi4gSW4gZGVjay5nbCBjb21tb24gc3BhY2UgdGhlIGdsb2JlIGlzIGEgc3BoZXJlIGNlbnRlcmVkIGF0IHRoZSBvcmlnaW4sIHNvOlxuLy8gICAtIHRoZSBsYWJlbCBhbmNob3IgcG9zaXRpb24gZG91YmxlcyBhcyBpdHMgb3V0d2FyZCBzdXJmYWNlIG5vcm1hbCwgYW5kXG4vLyAgIC0gYSBzdXJmYWNlIHBvaW50IGlzIHZpc2libGUgZnJvbSB0aGUgY2FtZXJhIGV4YWN0bHkgd2hlbiB0aGUgYW5nbGUgYmV0d2VlbiBpdHNcbi8vICAgICBub3JtYWwgYW5kIHRoZSBjYW1lcmEgZGlyZWN0aW9uIGlzIHdpdGhpbiB0aGUgaG9yaXpvbiBoYWxmLWFuZ2xlLCBpLmUuXG4vLyAgICAgICAgIGRvdChub3JtYWxpemUoYW5jaG9yKSwgbm9ybWFsaXplKGNhbWVyYVBvcykpID4gUiAvIGRcbi8vICAgICB3aGVyZSBSIGlzIHRoZSBzcGhlcmUgcmFkaXVzICg9IHxhbmNob3J8KSBhbmQgZCA9IHxjYW1lcmFQb3N8IGlzIHRoZSBjYW1lcmFcbi8vICAgICBkaXN0YW5jZSBmcm9tIHRoZSBnbG9iZSBjZW50ZXIuXG4vLyBUaGlzIGlzIHpvb20taW5kZXBlbmRlbnQ6IHRoZSB2aXNpYmxlIGNhcCBhdXRvbWF0aWNhbGx5IHNocmlua3MgYXMgeW91IHpvb20gaW4gYW5kXG4vLyBncm93cyBhcyB5b3UgcHVsbCBiYWNrLCBzbyBsYWJlbHMgZG9uJ3QgcG9wIGluL291dCBhdCB0aGUgbGltYiB3aGlsZSB6b29taW5nLlxuY29uc3QgQkFDS0ZBQ0VfQ1VMTF9JTkpFQ1QgPSAvKiBnbHNsICovIGBcbiAgLy8gT25seSBjdWxsIG9uIHRoZSBnbG9iZTsgbGVhdmUgd2ViLW1lcmNhdG9yIC8gZmxhdCB2aWV3cyB1bnRvdWNoZWQuXG4gIGlmIChwcm9qZWN0LnByb2plY3Rpb25Nb2RlID09IFBST0pFQ1RJT05fTU9ERV9HTE9CRSkge1xuICAgIHZlYzMgYW5jaG9yQ29tbW9uID0gZ2VvbWV0cnkucG9zaXRpb24ueHl6O1xuICAgIGZsb2F0IHJhZGl1cyA9IGxlbmd0aChhbmNob3JDb21tb24pO1xuICAgIGZsb2F0IGNhbURpc3QgPSBsZW5ndGgocHJvamVjdC5jYW1lcmFQb3NpdGlvbik7XG4gICAgLy8gR3VhcmQgYWdhaW5zdCBkZWdlbmVyYXRlIGFuY2hvcnMgLyBjYW1lcmEgYXQgdGhlIGNlbnRlci5cbiAgICBpZiAocmFkaXVzID4gMC4wICYmIGNhbURpc3QgPiByYWRpdXMpIHtcbiAgICAgIGZsb2F0IGNvc1N1cmZhY2UgPSBkb3QoYW5jaG9yQ29tbW9uIC8gcmFkaXVzLCBwcm9qZWN0LmNhbWVyYVBvc2l0aW9uIC8gY2FtRGlzdCk7XG4gICAgICAvLyBDb3NpbmUgb2YgdGhlIGhvcml6b24gaGFsZi1hbmdsZS4gQWRkIGEgdGlueSBtYXJnaW4gc28gbGFiZWxzIGFyZSBoaWRkZW4ganVzdFxuICAgICAgLy8gYmVmb3JlIHRoZXkgd3JhcCBleGFjdGx5IG9udG8gdGhlIGxpbWIgKGF2b2lkcyBnbHlwaHMgc21lYXJlZCBhbG9uZyB0aGUgZWRnZSkuXG4gICAgICBmbG9hdCBjb3NIb3Jpem9uID0gcmFkaXVzIC8gY2FtRGlzdCArIDAuMDI7XG4gICAgICBpZiAoY29zU3VyZmFjZSA8IGNvc0hvcml6b24pIHtcbiAgICAgICAgLy8gUHVzaCB0aGUgdmVydGV4IG91dHNpZGUgY2xpcCBzcGFjZSBzbyB0aGlzIGdseXBoIGlzIGRpc2NhcmRlZC4gVGhlIGhvb2tcbiAgICAgICAgLy8gZXhwb3NlcyB0aGUgY2xpcC1zcGFjZSBwb3NpdGlvbiBhcyBcXGBwb3NpdGlvblxcYCwgbm90IFxcYGdsX1Bvc2l0aW9uXFxgLlxuICAgICAgICBwb3NpdGlvbiA9IHZlYzQoMC4wLCAwLjAsIDIuMCwgMS4wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVuaGFuY2VkTXVsdGlJY29uTGF5ZXIgZXh0ZW5kcyAoTXVsdGlJY29uTGF5ZXIgYXMgYW55KSB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnRW5oYW5jZWRNdWx0aUljb25MYXllcic7XG5cbiAgZ2V0U2hhZGVycygpIHtcbiAgICBjb25zdCBzaGFkZXJzID0gc3VwZXIuZ2V0U2hhZGVycygpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2hhZGVycy5pbmplY3Q/LlsndnM6REVDS0dMX0ZJTFRFUl9HTF9QT1NJVElPTiddIHx8ICcnO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGFkZXJzLFxuICAgICAgaW5qZWN0OiB7XG4gICAgICAgIC4uLihzaGFkZXJzLmluamVjdCB8fCB7fSksXG4gICAgICAgICd2czpERUNLR0xfRklMVEVSX0dMX1BPU0lUSU9OJzogYCR7ZXhpc3Rpbmd9XFxuJHtCQUNLRkFDRV9DVUxMX0lOSkVDVH1gXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUlBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUFrRSxTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FB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
|