@kepler.gl/deckgl-layers 3.3.0-alpha.2 → 3.3.0-alpha.4
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/cluster-layer/cluster-layer.js +2 -3
- package/dist/column-layer/enhanced-column-layer.js +30 -5
- package/dist/globe/atmosphere-layer.d.ts +26 -0
- package/dist/globe/atmosphere-layer.js +184 -0
- package/dist/globe/enhanced-multi-icon-layer.d.ts +6 -0
- package/dist/globe/enhanced-multi-icon-layer.js +63 -0
- package/dist/globe/globe-depth-disk-layer.d.ts +18 -0
- package/dist/globe/globe-depth-disk-layer.js +145 -0
- package/dist/globe/globe-layers.d.ts +102 -0
- package/dist/globe/globe-layers.js +565 -0
- package/dist/globe/globe-stars-layer.d.ts +5 -0
- package/dist/globe/globe-stars-layer.js +69 -0
- package/dist/globe/globe-view.d.ts +23 -0
- package/dist/globe/globe-view.js +316 -0
- package/dist/globe/index.d.ts +8 -0
- package/dist/globe/index.js +122 -0
- package/dist/globe/mvt-label-layer.d.ts +7928 -0
- package/dist/globe/mvt-label-layer.js +190 -0
- package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +53 -49
- package/dist/grid-layer/enhanced-cpu-grid-layer.js +28 -2
- package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +53 -49
- package/dist/hexagon-layer/enhanced-hexagon-layer.js +28 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +14 -3
- package/dist/layer-utils/globe-cell-utils.d.ts +30 -0
- package/dist/layer-utils/globe-cell-utils.js +173 -0
- package/dist/line-layer/line-layer.js +2 -2
- package/dist/raster/raster-layer/raster-layer.js +2 -2
- package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +2 -2
- package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +4 -1
- package/dist/svg-icon-layer/scatterplot-icon-layer.js +52 -15
- package/dist/wms/wms-layer.d.ts +19 -0
- package/dist/wms/wms-layer.js +193 -23
- package/package.json +8 -5
|
@@ -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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF5ZXJzIiwicmVxdWlyZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsIkJBQ0tGQUNFX0NVTExfSU5KRUNUIiwiRW5oYW5jZWRNdWx0aUljb25MYXllciIsImV4cG9ydHMiLCJfcmVmIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJnZXRTaGFkZXJzIiwiX3NoYWRlcnMkaW5qZWN0Iiwic2hhZGVycyIsImV4aXN0aW5nIiwiaW5qZWN0IiwiY29uY2F0IiwiTXVsdGlJY29uTGF5ZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2xvYmUvZW5oYW5jZWQtbXVsdGktaWNvbi1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBAdHMtaWdub3JlIF9NdWx0aUljb25MYXllciBpcyBhbiBleHBlcmltZW50YWwsIHVuZGVyc2NvcmUtcHJlZml4ZWQgZGVjay5nbCBleHBvcnQgd2hvc2UgbmFtZWQgdHlwZSBiaW5kaW5nIGlzbid0IHJlbGlhYmx5IHJlc29sdmFibGUgdGhyb3VnaCB0aGUgcGFja2FnZSBiYXJyZWwgdW5kZXIgdGhpcyBwcm9qZWN0J3MgbW9kdWxlIHJlc29sdXRpb24uIEFjY2VzcyBpdCBvZmYgdGhlIG5hbWVzcGFjZSB3aXRoIGEgbG9vc2UgdHlwZS5cbmltcG9ydCB7X011bHRpSWNvbkxheWVyIGFzIE11bHRpSWNvbkxheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG4vLyBCYWNrLWZhY2UgY3VsbGluZyBmb3IgZ2xvYmUtbW9kZSB0ZXh0IGxhYmVscy5cbi8vXG4vLyBkZWNrLmdsJ3MgVGV4dExheWVyIHVzZXMgYSBNdWx0aUljb25MYXllciB0byByZW5kZXIgZ2x5cGhzOyBvbiBhIGdsb2JlLCBsYWJlbHNcbi8vIGFuY2hvcmVkIG9uIHRoZSBmYXIgaGVtaXNwaGVyZSB3b3VsZCBvdGhlcndpc2UgYmUgZHJhd24gXCJ0aHJvdWdoXCIgdGhlIHBsYW5ldC5cbi8vIFRoaXMgc3ViY2xhc3MgaW5qZWN0cyBhIHNtYWxsIEdMU0xcbi8vIHNuaXBwZXQgaW50byB0aGUgaWNvbiB2ZXJ0ZXggc2hhZGVyIHRoYXQgZGVnZW5lcmF0ZXMgKGNvbGxhcHNlcykgZ2x5cGggdmVydGljZXNcbi8vIHdob3NlIGFuY2hvciBpcyBmYWNpbmcgYXdheSBmcm9tIHRoZSBjYW1lcmEsIHNvIGJhY2stc2lkZSBsYWJlbHMgZGlzYXBwZWFyLlxuLy9cbi8vIFRoZSB0ZXN0IHVzZXMgdGhlIHRydWUgc3BoZXJlLWhvcml6b24gY29uZGl0aW9uIHJhdGhlciB0aGFuIGEgZml4ZWQgZG90LXByb2R1Y3Rcbi8vIGN1dG9mZi4gSW4gZGVjay5nbCBjb21tb24gc3BhY2UgdGhlIGdsb2JlIGlzIGEgc3BoZXJlIGNlbnRlcmVkIGF0IHRoZSBvcmlnaW4sIHNvOlxuLy8gICAtIHRoZSBsYWJlbCBhbmNob3IgcG9zaXRpb24gZG91YmxlcyBhcyBpdHMgb3V0d2FyZCBzdXJmYWNlIG5vcm1hbCwgYW5kXG4vLyAgIC0gYSBzdXJmYWNlIHBvaW50IGlzIHZpc2libGUgZnJvbSB0aGUgY2FtZXJhIGV4YWN0bHkgd2hlbiB0aGUgYW5nbGUgYmV0d2VlbiBpdHNcbi8vICAgICBub3JtYWwgYW5kIHRoZSBjYW1lcmEgZGlyZWN0aW9uIGlzIHdpdGhpbiB0aGUgaG9yaXpvbiBoYWxmLWFuZ2xlLCBpLmUuXG4vLyAgICAgICAgIGRvdChub3JtYWxpemUoYW5jaG9yKSwgbm9ybWFsaXplKGNhbWVyYVBvcykpID4gUiAvIGRcbi8vICAgICB3aGVyZSBSIGlzIHRoZSBzcGhlcmUgcmFkaXVzICg9IHxhbmNob3J8KSBhbmQgZCA9IHxjYW1lcmFQb3N8IGlzIHRoZSBjYW1lcmFcbi8vICAgICBkaXN0YW5jZSBmcm9tIHRoZSBnbG9iZSBjZW50ZXIuXG4vLyBUaGlzIGlzIHpvb20taW5kZXBlbmRlbnQ6IHRoZSB2aXNpYmxlIGNhcCBhdXRvbWF0aWNhbGx5IHNocmlua3MgYXMgeW91IHpvb20gaW4gYW5kXG4vLyBncm93cyBhcyB5b3UgcHVsbCBiYWNrLCBzbyBsYWJlbHMgZG9uJ3QgcG9wIGluL291dCBhdCB0aGUgbGltYiB3aGlsZSB6b29taW5nLlxuY29uc3QgQkFDS0ZBQ0VfQ1VMTF9JTkpFQ1QgPSAvKiBnbHNsICovIGBcbiAgLy8gT25seSBjdWxsIG9uIHRoZSBnbG9iZTsgbGVhdmUgd2ViLW1lcmNhdG9yIC8gZmxhdCB2aWV3cyB1bnRvdWNoZWQuXG4gIGlmIChwcm9qZWN0LnByb2plY3Rpb25Nb2RlID09IFBST0pFQ1RJT05fTU9ERV9HTE9CRSkge1xuICAgIHZlYzMgYW5jaG9yQ29tbW9uID0gZ2VvbWV0cnkucG9zaXRpb24ueHl6O1xuICAgIGZsb2F0IHJhZGl1cyA9IGxlbmd0aChhbmNob3JDb21tb24pO1xuICAgIGZsb2F0IGNhbURpc3QgPSBsZW5ndGgocHJvamVjdC5jYW1lcmFQb3NpdGlvbik7XG4gICAgLy8gR3VhcmQgYWdhaW5zdCBkZWdlbmVyYXRlIGFuY2hvcnMgLyBjYW1lcmEgYXQgdGhlIGNlbnRlci5cbiAgICBpZiAocmFkaXVzID4gMC4wICYmIGNhbURpc3QgPiByYWRpdXMpIHtcbiAgICAgIGZsb2F0IGNvc1N1cmZhY2UgPSBkb3QoYW5jaG9yQ29tbW9uIC8gcmFkaXVzLCBwcm9qZWN0LmNhbWVyYVBvc2l0aW9uIC8gY2FtRGlzdCk7XG4gICAgICAvLyBDb3NpbmUgb2YgdGhlIGhvcml6b24gaGFsZi1hbmdsZS4gQWRkIGEgdGlueSBtYXJnaW4gc28gbGFiZWxzIGFyZSBoaWRkZW4ganVzdFxuICAgICAgLy8gYmVmb3JlIHRoZXkgd3JhcCBleGFjdGx5IG9udG8gdGhlIGxpbWIgKGF2b2lkcyBnbHlwaHMgc21lYXJlZCBhbG9uZyB0aGUgZWRnZSkuXG4gICAgICBmbG9hdCBjb3NIb3Jpem9uID0gcmFkaXVzIC8gY2FtRGlzdCArIDAuMDI7XG4gICAgICBpZiAoY29zU3VyZmFjZSA8IGNvc0hvcml6b24pIHtcbiAgICAgICAgLy8gUHVzaCB0aGUgdmVydGV4IG91dHNpZGUgY2xpcCBzcGFjZSBzbyB0aGlzIGdseXBoIGlzIGRpc2NhcmRlZC4gVGhlIGhvb2tcbiAgICAgICAgLy8gZXhwb3NlcyB0aGUgY2xpcC1zcGFjZSBwb3NpdGlvbiBhcyBcXGBwb3NpdGlvblxcYCwgbm90IFxcYGdsX1Bvc2l0aW9uXFxgLlxuICAgICAgICBwb3NpdGlvbiA9IHZlYzQoMC4wLCAwLjAsIDIuMCwgMS4wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVuaGFuY2VkTXVsdGlJY29uTGF5ZXIgZXh0ZW5kcyAoTXVsdGlJY29uTGF5ZXIgYXMgYW55KSB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnRW5oYW5jZWRNdWx0aUljb25MYXllcic7XG5cbiAgZ2V0U2hhZGVycygpIHtcbiAgICBjb25zdCBzaGFkZXJzID0gc3VwZXIuZ2V0U2hhZGVycygpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2hhZGVycy5pbmplY3Q/LlsndnM6REVDS0dMX0ZJTFRFUl9HTF9QT1NJVElPTiddIHx8ICcnO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGFkZXJzLFxuICAgICAgaW5qZWN0OiB7XG4gICAgICAgIC4uLihzaGFkZXJzLmluamVjdCB8fCB7fSksXG4gICAgICAgICd2czpERUNLR0xfRklMVEVSX0dMX1BPU0lUSU9OJzogYCR7ZXhpc3Rpbmd9XFxuJHtCQUNLRkFDRV9DVUxMX0lOSkVDVH1gXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUlBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUFrRSxTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxD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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SimpleMeshLayer } from '@deck.gl/mesh-layers';
|
|
2
|
+
import type { RGBColor } from '@kepler.gl/types';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a view-oriented disk positioned along the direction from the globe's center to the camera.
|
|
5
|
+
* The disk is a cross-section of the globe between the front (visible) and back side, and it fills
|
|
6
|
+
* the depth buffer so anything on the far side of the globe (e.g. arcs/lines) is depth-culled and
|
|
7
|
+
* hidden behind the planet.
|
|
8
|
+
*/
|
|
9
|
+
export declare class GlobeDepthDiskLayer extends SimpleMeshLayer<any> {
|
|
10
|
+
static layerName: string;
|
|
11
|
+
getShaders(): any;
|
|
12
|
+
draw({ uniforms }: {
|
|
13
|
+
uniforms: object;
|
|
14
|
+
}): void;
|
|
15
|
+
}
|
|
16
|
+
export declare const getGlobeDepthDiskLayer: ({ fillColor }: {
|
|
17
|
+
fillColor?: RGBColor;
|
|
18
|
+
}) => GlobeDepthDiskLayer;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getGlobeDepthDiskLayer = exports.GlobeDepthDiskLayer = 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 _core = require("@deck.gl/core");
|
|
16
|
+
var _meshLayers = require("@deck.gl/mesh-layers");
|
|
17
|
+
var _engine = require("@luma.gl/engine");
|
|
18
|
+
var _core2 = require("@math.gl/core");
|
|
19
|
+
var _shaderUtils = require("../layer-utils/shader-utils");
|
|
20
|
+
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; }
|
|
21
|
+
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; }
|
|
22
|
+
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)); }
|
|
23
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
24
|
+
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
|
|
25
|
+
// Copyright contributors to the kepler.gl project
|
|
26
|
+
// luma.gl 9's PlaneGeometry ignores `radius`; pass explicit type/xlen/ylen so we
|
|
27
|
+
// get a [-1, 1] quad (a `radius: 1` plane would only span [-0.5, 0.5]).
|
|
28
|
+
var PLANE_GEOMETRY = new _engine.PlaneGeometry({
|
|
29
|
+
type: 'x,y',
|
|
30
|
+
xlen: 2,
|
|
31
|
+
ylen: 2
|
|
32
|
+
});
|
|
33
|
+
var DEPTH_DISK_PARAMETERS = {
|
|
34
|
+
// Depth writes only happen with depthTest enabled. The disk is opaque-black-ish
|
|
35
|
+
// and used purely to fill the depth buffer so far-side geometry (arcs/lines) is
|
|
36
|
+
// occluded by the planet.
|
|
37
|
+
depthTest: true,
|
|
38
|
+
cull: false
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// Earth radius in meters. The disk geometry is a [-1, 1] plane; we scale it into
|
|
42
|
+
// METERS in the vertex shader (like the atmosphere SphereGeometry, whose radius is
|
|
43
|
+
// ~6.4e6 m) and let SimpleMeshLayer's stock projection map it onto the globe —
|
|
44
|
+
// exactly the working path the atmosphere mesh layers use.
|
|
45
|
+
var DEPTH_DISK_FULL_RADIUS = 6.371e6;
|
|
46
|
+
|
|
47
|
+
// Globe common space uses GLOBE_RADIUS = 256 units (see deck.gl's project_globe_).
|
|
48
|
+
// The disk orientation math is done in that 256-unit common space (matching
|
|
49
|
+
// viewport.cameraPosition), then the resulting radius/shift ratios are converted to
|
|
50
|
+
// meters for the shader, since the disk geometry is expressed in meters.
|
|
51
|
+
var GLOBE_COMMON_RADIUS = 256;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Creates a view-oriented disk positioned along the direction from the globe's center to the camera.
|
|
55
|
+
* The disk is a cross-section of the globe between the front (visible) and back side, and it fills
|
|
56
|
+
* the depth buffer so anything on the far side of the globe (e.g. arcs/lines) is depth-culled and
|
|
57
|
+
* hidden behind the planet.
|
|
58
|
+
*/
|
|
59
|
+
var GlobeDepthDiskLayer = exports.GlobeDepthDiskLayer = /*#__PURE__*/function (_SimpleMeshLayer) {
|
|
60
|
+
function GlobeDepthDiskLayer() {
|
|
61
|
+
(0, _classCallCheck2["default"])(this, GlobeDepthDiskLayer);
|
|
62
|
+
return _callSuper(this, GlobeDepthDiskLayer, arguments);
|
|
63
|
+
}
|
|
64
|
+
(0, _inherits2["default"])(GlobeDepthDiskLayer, _SimpleMeshLayer);
|
|
65
|
+
return (0, _createClass2["default"])(GlobeDepthDiskLayer, [{
|
|
66
|
+
key: "getShaders",
|
|
67
|
+
value: function getShaders() {
|
|
68
|
+
var shaders = _superPropGet(GlobeDepthDiskLayer, "getShaders", this, 3)([]);
|
|
69
|
+
|
|
70
|
+
// Override the local `pos` computation: reorient the flat [-1,1] plane to face
|
|
71
|
+
// the camera, scale it to meters, and shift it toward the camera along the view
|
|
72
|
+
// axis so it sits at the globe's silhouette cross-section. The stock
|
|
73
|
+
// project_position_to_clipspace call is left untouched so the disk projects onto
|
|
74
|
+
// the globe through the exact same (working) path the atmosphere mesh layers use.
|
|
75
|
+
var vs = (0, _shaderUtils.editShader)(shaders.vs, 'globe depth disk vs', 'vec3 pos = (instanceModelMatrix * positions) * simpleMesh.sizeScale + instanceTranslation;', "mat3 u_matDepthDiskOrientation = mat3(\n u_depthDiskOrientCol0,\n u_depthDiskOrientCol1,\n u_depthDiskOrientCol2\n );\n vec3 pos = (u_matDepthDiskOrientation * positions) * u_depthDiskRadius;\n vDepthDiskPos = pos;\n pos = pos + u_directionToCamera * u_depthDiskShift;\n ");
|
|
76
|
+
var inject = {
|
|
77
|
+
'vs:#decl': "\n uniform vec3 u_depthDiskOrientCol0;\n uniform vec3 u_depthDiskOrientCol1;\n uniform vec3 u_depthDiskOrientCol2;\n uniform vec3 u_directionToCamera;\n uniform float u_depthDiskShift;\n uniform float u_depthDiskRadius;\n out vec3 vDepthDiskPos;\n ",
|
|
78
|
+
'fs:#decl': "\n uniform float u_depthDiskRadius;\n in vec3 vDepthDiskPos;\n ",
|
|
79
|
+
'fs:#main-start': "\n if (length(vDepthDiskPos) > u_depthDiskRadius) {\n discard;\n }\n "
|
|
80
|
+
};
|
|
81
|
+
return _objectSpread(_objectSpread({}, shaders), {}, {
|
|
82
|
+
vs: vs,
|
|
83
|
+
inject: inject
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}, {
|
|
87
|
+
key: "draw",
|
|
88
|
+
value: function draw(_ref) {
|
|
89
|
+
var uniforms = _ref.uniforms;
|
|
90
|
+
var normalizedRadius = GLOBE_COMMON_RADIUS;
|
|
91
|
+
var camPos = new _core2.Vector3(this.context.viewport.cameraPosition);
|
|
92
|
+
var camDir = camPos.clone().normalize();
|
|
93
|
+
var topDir = new _core2.Vector3(0, 0, 1);
|
|
94
|
+
var sideDir = camDir.clone().cross(topDir);
|
|
95
|
+
var sidePoint = sideDir.clone().scale(normalizedRadius);
|
|
96
|
+
var camToSide = sidePoint.clone().subtract(camPos).normalize();
|
|
97
|
+
var adjustedSidePoint = camToSide.cross(topDir).scale(-normalizedRadius);
|
|
98
|
+
var shiftToCamera = camDir.dot(adjustedSidePoint);
|
|
99
|
+
var adjustedDiskRadius = Math.sqrt(normalizedRadius * normalizedRadius - shiftToCamera * shiftToCamera);
|
|
100
|
+
|
|
101
|
+
// Camera-facing orientation: the plane's local X/Y axes map to world `right`/`up`
|
|
102
|
+
// (both perpendicular to the camera direction), and local Z maps to `forward`.
|
|
103
|
+
// Columns are handed to the shader as vec3s to avoid Matrix3 row/column ambiguity.
|
|
104
|
+
var forward = camDir.clone();
|
|
105
|
+
var right = topDir.clone().cross(forward).normalize();
|
|
106
|
+
var up = forward.clone().cross(right).normalize();
|
|
107
|
+
var model = this.state.model;
|
|
108
|
+
if (model) {
|
|
109
|
+
// Use the same uniform-delivery mechanism as the (working) atmosphere layers:
|
|
110
|
+
// raw `uniform` declarations + assignment to model.props.uniforms.
|
|
111
|
+
model.props.uniforms = _objectSpread(_objectSpread({}, model.props.uniforms), {}, {
|
|
112
|
+
// mat3(col0, col1, col2) in GLSL is column-major; mat3 * (x, y, 0) = x*right + y*up.
|
|
113
|
+
u_depthDiskOrientCol0: [right[0], right[1], right[2]],
|
|
114
|
+
u_depthDiskOrientCol1: [up[0], up[1], up[2]],
|
|
115
|
+
u_depthDiskOrientCol2: [forward[0], forward[1], forward[2]],
|
|
116
|
+
u_directionToCamera: [camDir[0], camDir[1], camDir[2]],
|
|
117
|
+
// Convert the common-space (256-unit) radius/shift to meters, since the disk
|
|
118
|
+
// geometry (and therefore `pos`) is expressed in meters.
|
|
119
|
+
u_depthDiskShift: shiftToCamera / normalizedRadius * DEPTH_DISK_FULL_RADIUS,
|
|
120
|
+
u_depthDiskRadius: adjustedDiskRadius / normalizedRadius * DEPTH_DISK_FULL_RADIUS
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
_superPropGet(GlobeDepthDiskLayer, "draw", this, 3)([{
|
|
124
|
+
uniforms: uniforms
|
|
125
|
+
}]);
|
|
126
|
+
}
|
|
127
|
+
}]);
|
|
128
|
+
}(_meshLayers.SimpleMeshLayer);
|
|
129
|
+
(0, _defineProperty2["default"])(GlobeDepthDiskLayer, "layerName", 'GlobeDepthDiskLayer');
|
|
130
|
+
var getGlobeDepthDiskLayer = exports.getGlobeDepthDiskLayer = function getGlobeDepthDiskLayer(_ref2) {
|
|
131
|
+
var fillColor = _ref2.fillColor;
|
|
132
|
+
return new GlobeDepthDiskLayer({
|
|
133
|
+
id: 'globe-depth-disk-layer',
|
|
134
|
+
data: [[0, 0, 0]],
|
|
135
|
+
coordinateOrigin: [0, 0, 0],
|
|
136
|
+
coordinateSystem: _core.COORDINATE_SYSTEM.CARTESIAN,
|
|
137
|
+
getPosition: function getPosition(d) {
|
|
138
|
+
return d;
|
|
139
|
+
},
|
|
140
|
+
getColor: fillColor !== null && fillColor !== void 0 ? fillColor : [0, 0, 0],
|
|
141
|
+
mesh: PLANE_GEOMETRY,
|
|
142
|
+
parameters: DEPTH_DISK_PARAMETERS
|
|
143
|
+
});
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbWVzaExheWVycyIsIl9lbmdpbmUiLCJfY29yZTIiLCJfc2hhZGVyVXRpbHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsIl9zdXBlclByb3BHZXQiLCJwIiwiX2dldDIiLCJQTEFORV9HRU9NRVRSWSIsIlBsYW5lR2VvbWV0cnkiLCJ0eXBlIiwieGxlbiIsInlsZW4iLCJERVBUSF9ESVNLX1BBUkFNRVRFUlMiLCJkZXB0aFRlc3QiLCJjdWxsIiwiREVQVEhfRElTS19GVUxMX1JBRElVUyIsIkdMT0JFX0NPTU1PTl9SQURJVVMiLCJHbG9iZURlcHRoRGlza0xheWVyIiwiZXhwb3J0cyIsIl9TaW1wbGVNZXNoTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImdldFNoYWRlcnMiLCJzaGFkZXJzIiwidnMiLCJlZGl0U2hhZGVyIiwiaW5qZWN0IiwiZHJhdyIsIl9yZWYiLCJ1bmlmb3JtcyIsIm5vcm1hbGl6ZWRSYWRpdXMiLCJjYW1Qb3MiLCJWZWN0b3IzIiwiY29udGV4dCIsInZpZXdwb3J0IiwiY2FtZXJhUG9zaXRpb24iLCJjYW1EaXIiLCJjbG9uZSIsIm5vcm1hbGl6ZSIsInRvcERpciIsInNpZGVEaXIiLCJjcm9zcyIsInNpZGVQb2ludCIsInNjYWxlIiwiY2FtVG9TaWRlIiwic3VidHJhY3QiLCJhZGp1c3RlZFNpZGVQb2ludCIsInNoaWZ0VG9DYW1lcmEiLCJkb3QiLCJhZGp1c3RlZERpc2tSYWRpdXMiLCJNYXRoIiwic3FydCIsImZvcndhcmQiLCJyaWdodCIsInVwIiwibW9kZWwiLCJzdGF0ZSIsInByb3BzIiwidV9kZXB0aERpc2tPcmllbnRDb2wwIiwidV9kZXB0aERpc2tPcmllbnRDb2wxIiwidV9kZXB0aERpc2tPcmllbnRDb2wyIiwidV9kaXJlY3Rpb25Ub0NhbWVyYSIsInVfZGVwdGhEaXNrU2hpZnQiLCJ1X2RlcHRoRGlza1JhZGl1cyIsIlNpbXBsZU1lc2hMYXllciIsImdldEdsb2JlRGVwdGhEaXNrTGF5ZXIiLCJfcmVmMiIsImZpbGxDb2xvciIsImlkIiwiZGF0YSIsImNvb3JkaW5hdGVPcmlnaW4iLCJjb29yZGluYXRlU3lzdGVtIiwiQ09PUkRJTkFURV9TWVNURU0iLCJDQVJURVNJQU4iLCJnZXRQb3NpdGlvbiIsImQiLCJnZXRDb2xvciIsIm1lc2giLCJwYXJhbWV0ZXJzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dsb2JlL2dsb2JlLWRlcHRoLWRpc2stbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtDT09SRElOQVRFX1NZU1RFTX0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1NpbXBsZU1lc2hMYXllcn0gZnJvbSAnQGRlY2suZ2wvbWVzaC1sYXllcnMnO1xuaW1wb3J0IHtQbGFuZUdlb21ldHJ5fSBmcm9tICdAbHVtYS5nbC9lbmdpbmUnO1xuaW1wb3J0IHtWZWN0b3IzfSBmcm9tICdAbWF0aC5nbC9jb3JlJztcblxuaW1wb3J0IHtlZGl0U2hhZGVyfSBmcm9tICcuLi9sYXllci11dGlscy9zaGFkZXItdXRpbHMnO1xuaW1wb3J0IHR5cGUge1JHQkNvbG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuLy8gbHVtYS5nbCA5J3MgUGxhbmVHZW9tZXRyeSBpZ25vcmVzIGByYWRpdXNgOyBwYXNzIGV4cGxpY2l0IHR5cGUveGxlbi95bGVuIHNvIHdlXG4vLyBnZXQgYSBbLTEsIDFdIHF1YWQgKGEgYHJhZGl1czogMWAgcGxhbmUgd291bGQgb25seSBzcGFuIFstMC41LCAwLjVdKS5cbmNvbnN0IFBMQU5FX0dFT01FVFJZID0gbmV3IFBsYW5lR2VvbWV0cnkoe1xuICB0eXBlOiAneCx5JyxcbiAgeGxlbjogMixcbiAgeWxlbjogMlxufSBhcyBhbnkpO1xuXG5jb25zdCBERVBUSF9ESVNLX1BBUkFNRVRFUlMgPSB7XG4gIC8vIERlcHRoIHdyaXRlcyBvbmx5IGhhcHBlbiB3aXRoIGRlcHRoVGVzdCBlbmFibGVkLiBUaGUgZGlzayBpcyBvcGFxdWUtYmxhY2staXNoXG4gIC8vIGFuZCB1c2VkIHB1cmVseSB0byBmaWxsIHRoZSBkZXB0aCBidWZmZXIgc28gZmFyLXNpZGUgZ2VvbWV0cnkgKGFyY3MvbGluZXMpIGlzXG4gIC8vIG9jY2x1ZGVkIGJ5IHRoZSBwbGFuZXQuXG4gIGRlcHRoVGVzdDogdHJ1ZSxcbiAgY3VsbDogZmFsc2Vcbn07XG5cbi8vIEVhcnRoIHJhZGl1cyBpbiBtZXRlcnMuIFRoZSBkaXNrIGdlb21ldHJ5IGlzIGEgWy0xLCAxXSBwbGFuZTsgd2Ugc2NhbGUgaXQgaW50b1xuLy8gTUVURVJTIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIChsaWtlIHRoZSBhdG1vc3BoZXJlIFNwaGVyZUdlb21ldHJ5LCB3aG9zZSByYWRpdXMgaXNcbi8vIH42LjRlNiBtKSBhbmQgbGV0IFNpbXBsZU1lc2hMYXllcidzIHN0b2NrIHByb2plY3Rpb24gbWFwIGl0IG9udG8gdGhlIGdsb2JlIOKAlFxuLy8gZXhhY3RseSB0aGUgd29ya2luZyBwYXRoIHRoZSBhdG1vc3BoZXJlIG1lc2ggbGF5ZXJzIHVzZS5cbmNvbnN0IERFUFRIX0RJU0tfRlVMTF9SQURJVVMgPSA2LjM3MWU2O1xuXG4vLyBHbG9iZSBjb21tb24gc3BhY2UgdXNlcyBHTE9CRV9SQURJVVMgPSAyNTYgdW5pdHMgKHNlZSBkZWNrLmdsJ3MgcHJvamVjdF9nbG9iZV8pLlxuLy8gVGhlIGRpc2sgb3JpZW50YXRpb24gbWF0aCBpcyBkb25lIGluIHRoYXQgMjU2LXVuaXQgY29tbW9uIHNwYWNlIChtYXRjaGluZ1xuLy8gdmlld3BvcnQuY2FtZXJhUG9zaXRpb24pLCB0aGVuIHRoZSByZXN1bHRpbmcgcmFkaXVzL3NoaWZ0IHJhdGlvcyBhcmUgY29udmVydGVkIHRvXG4vLyBtZXRlcnMgZm9yIHRoZSBzaGFkZXIsIHNpbmNlIHRoZSBkaXNrIGdlb21ldHJ5IGlzIGV4cHJlc3NlZCBpbiBtZXRlcnMuXG5jb25zdCBHTE9CRV9DT01NT05fUkFESVVTID0gMjU2O1xuXG4vKipcbiAqIENyZWF0ZXMgYSB2aWV3LW9yaWVudGVkIGRpc2sgcG9zaXRpb25lZCBhbG9uZyB0aGUgZGlyZWN0aW9uIGZyb20gdGhlIGdsb2JlJ3MgY2VudGVyIHRvIHRoZSBjYW1lcmEuXG4gKiBUaGUgZGlzayBpcyBhIGNyb3NzLXNlY3Rpb24gb2YgdGhlIGdsb2JlIGJldHdlZW4gdGhlIGZyb250ICh2aXNpYmxlKSBhbmQgYmFjayBzaWRlLCBhbmQgaXQgZmlsbHNcbiAqIHRoZSBkZXB0aCBidWZmZXIgc28gYW55dGhpbmcgb24gdGhlIGZhciBzaWRlIG9mIHRoZSBnbG9iZSAoZS5nLiBhcmNzL2xpbmVzKSBpcyBkZXB0aC1jdWxsZWQgYW5kXG4gKiBoaWRkZW4gYmVoaW5kIHRoZSBwbGFuZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBHbG9iZURlcHRoRGlza0xheWVyIGV4dGVuZHMgU2ltcGxlTWVzaExheWVyPGFueT4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0dsb2JlRGVwdGhEaXNrTGF5ZXInO1xuXG4gIGdldFNoYWRlcnMoKTogYW55IHtcbiAgICBjb25zdCBzaGFkZXJzID0gc3VwZXIuZ2V0U2hhZGVycygpO1xuXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGxvY2FsIGBwb3NgIGNvbXB1dGF0aW9uOiByZW9yaWVudCB0aGUgZmxhdCBbLTEsMV0gcGxhbmUgdG8gZmFjZVxuICAgIC8vIHRoZSBjYW1lcmEsIHNjYWxlIGl0IHRvIG1ldGVycywgYW5kIHNoaWZ0IGl0IHRvd2FyZCB0aGUgY2FtZXJhIGFsb25nIHRoZSB2aWV3XG4gICAgLy8gYXhpcyBzbyBpdCBzaXRzIGF0IHRoZSBnbG9iZSdzIHNpbGhvdWV0dGUgY3Jvc3Mtc2VjdGlvbi4gVGhlIHN0b2NrXG4gICAgLy8gcHJvamVjdF9wb3NpdGlvbl90b19jbGlwc3BhY2UgY2FsbCBpcyBsZWZ0IHVudG91Y2hlZCBzbyB0aGUgZGlzayBwcm9qZWN0cyBvbnRvXG4gICAgLy8gdGhlIGdsb2JlIHRocm91Z2ggdGhlIGV4YWN0IHNhbWUgKHdvcmtpbmcpIHBhdGggdGhlIGF0bW9zcGhlcmUgbWVzaCBsYXllcnMgdXNlLlxuICAgIGNvbnN0IHZzID0gZWRpdFNoYWRlcihcbiAgICAgIHNoYWRlcnMudnMsXG4gICAgICAnZ2xvYmUgZGVwdGggZGlzayB2cycsXG4gICAgICAndmVjMyBwb3MgPSAoaW5zdGFuY2VNb2RlbE1hdHJpeCAqIHBvc2l0aW9ucykgKiBzaW1wbGVNZXNoLnNpemVTY2FsZSArIGluc3RhbmNlVHJhbnNsYXRpb247JyxcbiAgICAgIGBtYXQzIHVfbWF0RGVwdGhEaXNrT3JpZW50YXRpb24gPSBtYXQzKFxuICAgICAgICAgdV9kZXB0aERpc2tPcmllbnRDb2wwLFxuICAgICAgICAgdV9kZXB0aERpc2tPcmllbnRDb2wxLFxuICAgICAgICAgdV9kZXB0aERpc2tPcmllbnRDb2wyXG4gICAgICAgKTtcbiAgICAgICB2ZWMzIHBvcyA9ICh1X21hdERlcHRoRGlza09yaWVudGF0aW9uICogcG9zaXRpb25zKSAqIHVfZGVwdGhEaXNrUmFkaXVzO1xuICAgICAgIHZEZXB0aERpc2tQb3MgPSBwb3M7XG4gICAgICAgcG9zID0gcG9zICsgdV9kaXJlY3Rpb25Ub0NhbWVyYSAqIHVfZGVwdGhEaXNrU2hpZnQ7XG4gICAgICBgXG4gICAgKTtcblxuICAgIGNvbnN0IGluamVjdCA9IHtcbiAgICAgICd2czojZGVjbCc6IGBcbiAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZGVwdGhEaXNrT3JpZW50Q29sMDtcbiAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZGVwdGhEaXNrT3JpZW50Q29sMTtcbiAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZGVwdGhEaXNrT3JpZW50Q29sMjtcbiAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZGlyZWN0aW9uVG9DYW1lcmE7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgdV9kZXB0aERpc2tTaGlmdDtcbiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X2RlcHRoRGlza1JhZGl1cztcbiAgICAgICAgb3V0IHZlYzMgdkRlcHRoRGlza1BvcztcbiAgICAgIGAsXG4gICAgICAnZnM6I2RlY2wnOiBgXG4gICAgICAgIHVuaWZvcm0gZmxvYXQgdV9kZXB0aERpc2tSYWRpdXM7XG4gICAgICAgIGluIHZlYzMgdkRlcHRoRGlza1BvcztcbiAgICAgIGAsXG4gICAgICAnZnM6I21haW4tc3RhcnQnOiBgXG4gICAgICAgIGlmIChsZW5ndGgodkRlcHRoRGlza1BvcykgPiB1X2RlcHRoRGlza1JhZGl1cykge1xuICAgICAgICAgIGRpc2NhcmQ7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYWRlcnMsXG4gICAgICB2cyxcbiAgICAgIGluamVjdFxuICAgIH07XG4gIH1cblxuICBkcmF3KHt1bmlmb3Jtc306IHt1bmlmb3Jtczogb2JqZWN0fSk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSYWRpdXMgPSBHTE9CRV9DT01NT05fUkFESVVTO1xuXG4gICAgY29uc3QgY2FtUG9zID0gbmV3IFZlY3RvcjMoKHRoaXMuY29udGV4dC52aWV3cG9ydCBhcyBhbnkpLmNhbWVyYVBvc2l0aW9uKTtcbiAgICBjb25zdCBjYW1EaXIgPSBjYW1Qb3MuY2xvbmUoKS5ub3JtYWxpemUoKTtcbiAgICBjb25zdCB0b3BEaXIgPSBuZXcgVmVjdG9yMygwLCAwLCAxKTtcbiAgICBjb25zdCBzaWRlRGlyID0gY2FtRGlyLmNsb25lKCkuY3Jvc3ModG9wRGlyKTtcbiAgICBjb25zdCBzaWRlUG9pbnQgPSBzaWRlRGlyLmNsb25lKCkuc2NhbGUobm9ybWFsaXplZFJhZGl1cyk7XG5cbiAgICBjb25zdCBjYW1Ub1NpZGUgPSBzaWRlUG9pbnQuY2xvbmUoKS5zdWJ0cmFjdChjYW1Qb3MpLm5vcm1hbGl6ZSgpO1xuICAgIGNvbnN0IGFkanVzdGVkU2lkZVBvaW50ID0gY2FtVG9TaWRlLmNyb3NzKHRvcERpcikuc2NhbGUoLW5vcm1hbGl6ZWRSYWRpdXMpO1xuXG4gICAgY29uc3Qgc2hpZnRUb0NhbWVyYSA9IGNhbURpci5kb3QoYWRqdXN0ZWRTaWRlUG9pbnQpO1xuICAgIGNvbnN0IGFkanVzdGVkRGlza1JhZGl1cyA9IE1hdGguc3FydChcbiAgICAgIG5vcm1hbGl6ZWRSYWRpdXMgKiBub3JtYWxpemVkUmFkaXVzIC0gc2hpZnRUb0NhbWVyYSAqIHNoaWZ0VG9DYW1lcmFcbiAgICApO1xuXG4gICAgLy8gQ2FtZXJhLWZhY2luZyBvcmllbnRhdGlvbjogdGhlIHBsYW5lJ3MgbG9jYWwgWC9ZIGF4ZXMgbWFwIHRvIHdvcmxkIGByaWdodGAvYHVwYFxuICAgIC8vIChib3RoIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGNhbWVyYSBkaXJlY3Rpb24pLCBhbmQgbG9jYWwgWiBtYXBzIHRvIGBmb3J3YXJkYC5cbiAgICAvLyBDb2x1bW5zIGFyZSBoYW5kZWQgdG8gdGhlIHNoYWRlciBhcyB2ZWMzcyB0byBhdm9pZCBNYXRyaXgzIHJvdy9jb2x1bW4gYW1iaWd1aXR5LlxuICAgIGNvbnN0IGZvcndhcmQgPSBjYW1EaXIuY2xvbmUoKTtcbiAgICBjb25zdCByaWdodCA9IHRvcERpci5jbG9uZSgpLmNyb3NzKGZvcndhcmQpLm5vcm1hbGl6ZSgpO1xuICAgIGNvbnN0IHVwID0gZm9yd2FyZC5jbG9uZSgpLmNyb3NzKHJpZ2h0KS5ub3JtYWxpemUoKTtcblxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zdGF0ZS5tb2RlbDtcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIC8vIFVzZSB0aGUgc2FtZSB1bmlmb3JtLWRlbGl2ZXJ5IG1lY2hhbmlzbSBhcyB0aGUgKHdvcmtpbmcpIGF0bW9zcGhlcmUgbGF5ZXJzOlxuICAgICAgLy8gcmF3IGB1bmlmb3JtYCBkZWNsYXJhdGlvbnMgKyBhc3NpZ25tZW50IHRvIG1vZGVsLnByb3BzLnVuaWZvcm1zLlxuICAgICAgKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMgPSB7XG4gICAgICAgIC4uLihtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zLFxuICAgICAgICAvLyBtYXQzKGNvbDAsIGNvbDEsIGNvbDIpIGluIEdMU0wgaXMgY29sdW1uLW1ham9yOyBtYXQzICogKHgsIHksIDApID0geCpyaWdodCArIHkqdXAuXG4gICAgICAgIHVfZGVwdGhEaXNrT3JpZW50Q29sMDogW3JpZ2h0WzBdLCByaWdodFsxXSwgcmlnaHRbMl1dLFxuICAgICAgICB1X2RlcHRoRGlza09yaWVudENvbDE6IFt1cFswXSwgdXBbMV0sIHVwWzJdXSxcbiAgICAgICAgdV9kZXB0aERpc2tPcmllbnRDb2wyOiBbZm9yd2FyZFswXSwgZm9yd2FyZFsxXSwgZm9yd2FyZFsyXV0sXG4gICAgICAgIHVfZGlyZWN0aW9uVG9DYW1lcmE6IFtjYW1EaXJbMF0sIGNhbURpclsxXSwgY2FtRGlyWzJdXSxcbiAgICAgICAgLy8gQ29udmVydCB0aGUgY29tbW9uLXNwYWNlICgyNTYtdW5pdCkgcmFkaXVzL3NoaWZ0IHRvIG1ldGVycywgc2luY2UgdGhlIGRpc2tcbiAgICAgICAgLy8gZ2VvbWV0cnkgKGFuZCB0aGVyZWZvcmUgYHBvc2ApIGlzIGV4cHJlc3NlZCBpbiBtZXRlcnMuXG4gICAgICAgIHVfZGVwdGhEaXNrU2hpZnQ6IChzaGlmdFRvQ2FtZXJhIC8gbm9ybWFsaXplZFJhZGl1cykgKiBERVBUSF9ESVNLX0ZVTExfUkFESVVTLFxuICAgICAgICB1X2RlcHRoRGlza1JhZGl1czogKGFkanVzdGVkRGlza1JhZGl1cyAvIG5vcm1hbGl6ZWRSYWRpdXMpICogREVQVEhfRElTS19GVUxMX1JBRElVU1xuICAgICAgfTtcbiAgICB9XG4gICAgc3VwZXIuZHJhdyh7dW5pZm9ybXN9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVEZXB0aERpc2tMYXllciA9ICh7ZmlsbENvbG9yfToge2ZpbGxDb2xvcj86IFJHQkNvbG9yfSkgPT4ge1xuICByZXR1cm4gbmV3IEdsb2JlRGVwdGhEaXNrTGF5ZXIoe1xuICAgIGlkOiAnZ2xvYmUtZGVwdGgtZGlzay1sYXllcicsXG4gICAgZGF0YTogW1swLCAwLCAwXV0sXG4gICAgY29vcmRpbmF0ZU9yaWdpbjogWzAsIDAsIDBdLFxuICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkNBUlRFU0lBTixcbiAgICBnZXRQb3NpdGlvbjogKGQ6IG51bWJlcltdKSA9PiBkLFxuICAgIGdldENvbG9yOiAoZmlsbENvbG9yID8/IFswLCAwLCAwXSkgYXMgYW55LFxuICAgIG1lc2g6IFBMQU5FX0dFT01FVFJZLFxuICAgIHBhcmFtZXRlcnM6IERFUFRIX0RJU0tfUEFSQU1FVEVSU1xuICB9IGFzIGFueSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLEtBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJ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
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Layer } from '@deck.gl/core';
|
|
2
|
+
import type { Globe } from '@kepler.gl/constants';
|
|
3
|
+
import type { RGBColor } from '@kepler.gl/types';
|
|
4
|
+
type LayerGroup = {
|
|
5
|
+
slug: string;
|
|
6
|
+
filter: (layer: any) => boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const DEFAULT_BASEMAP_COLOR: {
|
|
9
|
+
backgroundFillColor: RGBColor;
|
|
10
|
+
basemapDefaultFillColor: RGBColor;
|
|
11
|
+
basemapWaterFillColor: RGBColor;
|
|
12
|
+
basemapDefaultLineColor: RGBColor;
|
|
13
|
+
basemapAdminLineColor: RGBColor;
|
|
14
|
+
basemapLabelColor: RGBColor;
|
|
15
|
+
};
|
|
16
|
+
export declare const getBasemapColors: (mapStyle: Partial<{
|
|
17
|
+
style: any;
|
|
18
|
+
layerGroups: LayerGroup[];
|
|
19
|
+
}>) => {
|
|
20
|
+
backgroundFillColor: RGBColor;
|
|
21
|
+
basemapWaterFillColor: RGBColor;
|
|
22
|
+
basemapAdminLineColor: RGBColor;
|
|
23
|
+
basemapLabelColor: RGBColor;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Get basemap colors either from the style JSON or from known style presets.
|
|
27
|
+
* Falls back to default dark colors if style is unknown and no JSON is available.
|
|
28
|
+
*/
|
|
29
|
+
export declare const getBasemapColorsForStyle: (styleType: string, mapStyle?: Partial<{
|
|
30
|
+
style: any;
|
|
31
|
+
layerGroups: LayerGroup[];
|
|
32
|
+
}>) => {
|
|
33
|
+
backgroundFillColor: RGBColor;
|
|
34
|
+
basemapWaterFillColor: RGBColor;
|
|
35
|
+
basemapAdminLineColor: RGBColor;
|
|
36
|
+
basemapLabelColor: RGBColor;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Clear color (background around the globe) for globe mode, in RGBA 0-255 as
|
|
40
|
+
* expected by deck.gl's View `clearColor` prop (deck.gl >= 9 no longer supports
|
|
41
|
+
* the global `parameters.clearColor`; it must be set per-view with `clear: true`).
|
|
42
|
+
*/
|
|
43
|
+
export declare function getGlobeClearColor(backgroundColor?: [number, number, number] | number[]): [number, number, number, number];
|
|
44
|
+
/**
|
|
45
|
+
* Globe basemap tile provider.
|
|
46
|
+
*
|
|
47
|
+
* - `mapbox` uses Mapbox vector/raster tiles and requires an access token.
|
|
48
|
+
* - `carto` uses CARTO's free OpenMapTiles vector tiles + Esri World Imagery
|
|
49
|
+
* raster, and needs no token. Used as an automatic fallback when no Mapbox
|
|
50
|
+
* token is available (e.g. MapLibre / CARTO basemap setups), so the globe
|
|
51
|
+
* basemap still renders instead of showing a solid-color sphere.
|
|
52
|
+
*/
|
|
53
|
+
export type GlobeBasemapProvider = 'mapbox' | 'carto';
|
|
54
|
+
/**
|
|
55
|
+
* Resolve which globe basemap tile provider to use.
|
|
56
|
+
*
|
|
57
|
+
* The globe should follow the *selected basemap style's* rendering library so
|
|
58
|
+
* it stays consistent with the flat 2D map: a MapLibre/CARTO style uses the
|
|
59
|
+
* free CARTO tiles (even when a Mapbox token is available), and a Mapbox style
|
|
60
|
+
* uses Mapbox tiles. A Mapbox style with no token falls back to CARTO so the
|
|
61
|
+
* globe still renders instead of showing a bare colored sphere.
|
|
62
|
+
*
|
|
63
|
+
* @param baseMapLibrary the selected style's library ('mapbox' | 'maplibre'),
|
|
64
|
+
* e.g. from `getBaseMapLibrary(currentStyle)`.
|
|
65
|
+
*/
|
|
66
|
+
export declare const resolveGlobeBasemapProvider: (baseMapLibrary: "mapbox" | "maplibre" | undefined, mapboxApiAccessToken?: string) => GlobeBasemapProvider;
|
|
67
|
+
export type GlobeAttribution = {
|
|
68
|
+
label: string;
|
|
69
|
+
href: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Resolve the tile-source attribution entries for the globe basemap. deck.gl
|
|
73
|
+
* renders the globe basemap tiles itself (not the base Maplibre/Mapbox map), so
|
|
74
|
+
* the base map's attribution machinery never sees them. This lets the UI credit
|
|
75
|
+
* the actual tile provider(s) in globe mode.
|
|
76
|
+
*/
|
|
77
|
+
export declare const getGlobeBasemapAttributions: ({ globe, mapboxApiAccessToken, mapStyleType, basemapProvider }: {
|
|
78
|
+
globe?: Globe;
|
|
79
|
+
mapboxApiAccessToken?: string;
|
|
80
|
+
mapStyleType?: string;
|
|
81
|
+
basemapProvider?: GlobeBasemapProvider;
|
|
82
|
+
}) => GlobeAttribution[];
|
|
83
|
+
export declare const getGlobeBaseLayers: ({ mapboxApiAccessToken, globe, mapStyleType, basemapProvider, latitude }: {
|
|
84
|
+
mapboxApiAccessToken: string;
|
|
85
|
+
globe: Globe;
|
|
86
|
+
mapStyleType?: string;
|
|
87
|
+
/**
|
|
88
|
+
* Which tile provider to use for the globe basemap. Defaults to `mapbox` when
|
|
89
|
+
* a token is present, otherwise falls back to the token-free `carto` tiles.
|
|
90
|
+
*/
|
|
91
|
+
basemapProvider?: GlobeBasemapProvider;
|
|
92
|
+
/**
|
|
93
|
+
* Current camera center latitude. Used to keep tile LOD constant while rotating
|
|
94
|
+
* toward the poles (deck.gl 9 lowers the effective zoom near the poles). When
|
|
95
|
+
* omitted, no latitude compensation is applied (equator behavior).
|
|
96
|
+
*/
|
|
97
|
+
latitude?: number;
|
|
98
|
+
}) => Layer[];
|
|
99
|
+
export declare const getGlobeTopLayers: ({ globe }: {
|
|
100
|
+
globe: Globe;
|
|
101
|
+
}) => Layer[];
|
|
102
|
+
export {};
|