@deck.gl/extensions 8.9.0-beta.2 → 8.9.0-beta.3
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/dist.dev.js +279 -458
- package/dist/es5/{collide/collide-effect.js → collision-filter/collision-filter-effect.js} +78 -71
- package/dist/es5/collision-filter/collision-filter-effect.js.map +1 -0
- package/dist/es5/{collide/collide-pass.js → collision-filter/collision-filter-pass.js} +13 -13
- package/dist/es5/collision-filter/collision-filter-pass.js.map +1 -0
- package/dist/es5/{collide/collide.js → collision-filter/collision-filter.js} +30 -30
- package/dist/es5/collision-filter/collision-filter.js.map +1 -0
- package/dist/es5/collision-filter/shader-module.js +39 -0
- package/dist/es5/collision-filter/shader-module.js.map +1 -0
- package/dist/es5/index.js +4 -4
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mask/mask-effect.js +14 -7
- package/dist/es5/mask/mask-effect.js.map +1 -1
- package/dist/es5/terrain/height-map-builder.js +1 -1
- package/dist/es5/terrain/height-map-builder.js.map +1 -1
- package/dist/es5/terrain/shader-module.js.map +1 -1
- package/dist/es5/terrain/terrain-cover.js +1 -1
- package/dist/es5/terrain/terrain-cover.js.map +1 -1
- package/dist/es5/terrain/terrain-effect.js +5 -5
- package/dist/es5/terrain/terrain-effect.js.map +1 -1
- package/dist/es5/terrain/terrain.js +7 -7
- package/dist/es5/terrain/terrain.js.map +1 -1
- package/dist/es5/{common → utils}/projection-utils.js +3 -1
- package/dist/es5/utils/projection-utils.js.map +1 -0
- package/dist/esm/{collide/collide-effect.js → collision-filter/collision-filter-effect.js} +69 -64
- package/dist/esm/collision-filter/collision-filter-effect.js.map +1 -0
- package/dist/esm/{collide/collide-pass.js → collision-filter/collision-filter-pass.js} +5 -5
- package/dist/esm/collision-filter/collision-filter-pass.js.map +1 -0
- package/dist/esm/collision-filter/collision-filter.js +78 -0
- package/dist/esm/collision-filter/collision-filter.js.map +1 -0
- package/dist/esm/collision-filter/shader-module.js +32 -0
- package/dist/esm/collision-filter/shader-module.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mask/mask-effect.js +13 -7
- package/dist/esm/mask/mask-effect.js.map +1 -1
- package/dist/esm/terrain/height-map-builder.js +1 -1
- package/dist/esm/terrain/height-map-builder.js.map +1 -1
- package/dist/esm/terrain/shader-module.js.map +1 -1
- package/dist/esm/terrain/terrain-cover.js +1 -1
- package/dist/esm/terrain/terrain-cover.js.map +1 -1
- package/dist/esm/terrain/terrain-effect.js +5 -5
- package/dist/esm/terrain/terrain-effect.js.map +1 -1
- package/dist/esm/terrain/terrain.js +7 -7
- package/dist/esm/terrain/terrain.js.map +1 -1
- package/dist/esm/{common → utils}/projection-utils.js +3 -1
- package/dist/esm/utils/projection-utils.js.map +1 -0
- package/dist.min.js +59 -62
- package/package.json +2 -2
- package/src/{collide/collide-effect.ts → collision-filter/collision-filter-effect.ts} +80 -77
- package/src/{collide/collide-pass.ts → collision-filter/collision-filter-pass.ts} +6 -6
- package/src/collision-filter/collision-filter.ts +83 -0
- package/src/collision-filter/shader-module.ts +113 -0
- package/src/index.ts +3 -3
- package/src/mask/mask-effect.ts +21 -12
- package/src/terrain/height-map-builder.ts +2 -2
- package/src/terrain/shader-module.ts +4 -1
- package/src/terrain/terrain-cover.ts +2 -2
- package/src/terrain/terrain-effect.ts +5 -5
- package/src/terrain/terrain.ts +10 -10
- package/src/{common → utils}/projection-utils.ts +4 -2
- package/typed/collision-filter/collision-filter-effect.d.ts +28 -0
- package/typed/collision-filter/collision-filter-effect.d.ts.map +1 -0
- package/typed/collision-filter/collision-filter-pass.d.ts +14 -0
- package/typed/collision-filter/collision-filter-pass.d.ts.map +1 -0
- package/typed/collision-filter/collision-filter.d.ts +41 -0
- package/typed/collision-filter/collision-filter.d.ts.map +1 -0
- package/typed/collision-filter/shader-module.d.ts +4 -0
- package/typed/collision-filter/shader-module.d.ts.map +1 -0
- package/typed/index.d.ts +3 -3
- package/typed/index.d.ts.map +1 -1
- package/typed/mask/mask-effect.d.ts +2 -2
- package/typed/mask/mask-effect.d.ts.map +1 -1
- package/typed/terrain/height-map-builder.d.ts +2 -2
- package/typed/terrain/height-map-builder.d.ts.map +1 -1
- package/typed/terrain/shader-module.d.ts +1 -1
- package/typed/terrain/shader-module.d.ts.map +1 -1
- package/typed/terrain/terrain-cover.d.ts +2 -2
- package/typed/terrain/terrain-cover.d.ts.map +1 -1
- package/typed/terrain/terrain.d.ts +2 -2
- package/typed/terrain/terrain.d.ts.map +1 -1
- package/typed/utils/projection-utils.d.ts +27 -0
- package/typed/utils/projection-utils.d.ts.map +1 -0
- package/dist/es5/collide/collide-effect.js.map +0 -1
- package/dist/es5/collide/collide-pass.js.map +0 -1
- package/dist/es5/collide/collide.js.map +0 -1
- package/dist/es5/collide/shader-module.js +0 -39
- package/dist/es5/collide/shader-module.js.map +0 -1
- package/dist/es5/common/projection-utils.js.map +0 -1
- package/dist/es5/mask/utils.js +0 -136
- package/dist/es5/mask/utils.js.map +0 -1
- package/dist/esm/collide/collide-effect.js.map +0 -1
- package/dist/esm/collide/collide-pass.js.map +0 -1
- package/dist/esm/collide/collide.js +0 -78
- package/dist/esm/collide/collide.js.map +0 -1
- package/dist/esm/collide/shader-module.js +0 -32
- package/dist/esm/collide/shader-module.js.map +0 -1
- package/dist/esm/common/projection-utils.js.map +0 -1
- package/dist/esm/mask/utils.js +0 -109
- package/dist/esm/mask/utils.js.map +0 -1
- package/src/collide/collide.ts +0 -79
- package/src/collide/shader-module.ts +0 -113
- package/src/mask/utils.ts +0 -148
package/dist/es5/mask/utils.js
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.getMaskBounds = getMaskBounds;
|
|
7
|
-
exports.getMaskViewport = getMaskViewport;
|
|
8
|
-
|
|
9
|
-
var _core = require("@deck.gl/core");
|
|
10
|
-
|
|
11
|
-
var _webMercator = require("@math.gl/web-mercator");
|
|
12
|
-
|
|
13
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
14
|
-
|
|
15
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
16
|
-
|
|
17
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
18
|
-
|
|
19
|
-
function getMaskBounds(_ref) {
|
|
20
|
-
var layers = _ref.layers,
|
|
21
|
-
viewport = _ref.viewport;
|
|
22
|
-
var bounds = null;
|
|
23
|
-
|
|
24
|
-
var _iterator = _createForOfIteratorHelper(layers),
|
|
25
|
-
_step;
|
|
26
|
-
|
|
27
|
-
try {
|
|
28
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
29
|
-
var layer = _step.value;
|
|
30
|
-
var subLayerBounds = layer.getBounds();
|
|
31
|
-
|
|
32
|
-
if (subLayerBounds) {
|
|
33
|
-
if (bounds) {
|
|
34
|
-
bounds[0] = Math.min(bounds[0], subLayerBounds[0][0]);
|
|
35
|
-
bounds[1] = Math.min(bounds[1], subLayerBounds[0][1]);
|
|
36
|
-
bounds[2] = Math.max(bounds[2], subLayerBounds[1][0]);
|
|
37
|
-
bounds[3] = Math.max(bounds[3], subLayerBounds[1][1]);
|
|
38
|
-
} else {
|
|
39
|
-
bounds = [subLayerBounds[0][0], subLayerBounds[0][1], subLayerBounds[1][0], subLayerBounds[1][1]];
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
} catch (err) {
|
|
44
|
-
_iterator.e(err);
|
|
45
|
-
} finally {
|
|
46
|
-
_iterator.f();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
var viewportBounds = viewport.getBounds();
|
|
50
|
-
|
|
51
|
-
if (!bounds) {
|
|
52
|
-
return viewportBounds;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
var paddedBounds = _doubleBounds(viewportBounds);
|
|
56
|
-
|
|
57
|
-
if (bounds[2] - bounds[0] < paddedBounds[2] - paddedBounds[0] || bounds[3] - bounds[1] < paddedBounds[3] - paddedBounds[1]) {
|
|
58
|
-
return bounds;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
bounds[0] = Math.max(bounds[0], paddedBounds[0]);
|
|
62
|
-
bounds[1] = Math.max(bounds[1], paddedBounds[1]);
|
|
63
|
-
bounds[2] = Math.min(bounds[2], paddedBounds[2]);
|
|
64
|
-
bounds[3] = Math.min(bounds[3], paddedBounds[3]);
|
|
65
|
-
return bounds;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function getMaskViewport(_ref2) {
|
|
69
|
-
var bounds = _ref2.bounds,
|
|
70
|
-
viewport = _ref2.viewport,
|
|
71
|
-
width = _ref2.width,
|
|
72
|
-
height = _ref2.height;
|
|
73
|
-
|
|
74
|
-
if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (viewport.resolution !== undefined) {
|
|
79
|
-
_core.log.warn('MaskExtension is not supported in GlobeView')();
|
|
80
|
-
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
var padding = 1;
|
|
85
|
-
width -= padding * 2;
|
|
86
|
-
height -= padding * 2;
|
|
87
|
-
|
|
88
|
-
if (viewport.isGeospatial) {
|
|
89
|
-
var _fitBounds = (0, _webMercator.fitBounds)({
|
|
90
|
-
width: width,
|
|
91
|
-
height: height,
|
|
92
|
-
bounds: [[bounds[0], bounds[1]], [bounds[2], bounds[3]]],
|
|
93
|
-
maxZoom: 20
|
|
94
|
-
}),
|
|
95
|
-
longitude = _fitBounds.longitude,
|
|
96
|
-
latitude = _fitBounds.latitude,
|
|
97
|
-
zoom = _fitBounds.zoom;
|
|
98
|
-
|
|
99
|
-
return new _core.WebMercatorViewport({
|
|
100
|
-
longitude: longitude,
|
|
101
|
-
latitude: latitude,
|
|
102
|
-
zoom: zoom,
|
|
103
|
-
x: padding,
|
|
104
|
-
y: padding,
|
|
105
|
-
width: width,
|
|
106
|
-
height: height
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
var center = [(bounds[0] + bounds[2]) / 2, (bounds[1] + bounds[3]) / 2, 0];
|
|
111
|
-
var scale = Math.min(1048576, width / (bounds[2] - bounds[0]), height / (bounds[3] - bounds[1]));
|
|
112
|
-
return new _core.OrthographicView({
|
|
113
|
-
x: padding,
|
|
114
|
-
y: padding
|
|
115
|
-
}).makeViewport({
|
|
116
|
-
width: width,
|
|
117
|
-
height: height,
|
|
118
|
-
viewState: {
|
|
119
|
-
target: center,
|
|
120
|
-
zoom: Math.log2(scale)
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function _doubleBounds(bounds) {
|
|
126
|
-
var size = {
|
|
127
|
-
x: bounds[2] - bounds[0],
|
|
128
|
-
y: bounds[3] - bounds[1]
|
|
129
|
-
};
|
|
130
|
-
var center = {
|
|
131
|
-
x: bounds[0] + 0.5 * size.x,
|
|
132
|
-
y: bounds[1] + 0.5 * size.y
|
|
133
|
-
};
|
|
134
|
-
return [center.x - size.x, center.y - size.y, center.x + size.x, center.y + size.y];
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mask/utils.ts"],"names":["getMaskBounds","layers","viewport","bounds","layer","subLayerBounds","getBounds","Math","min","max","viewportBounds","paddedBounds","_doubleBounds","getMaskViewport","width","height","resolution","undefined","log","warn","padding","isGeospatial","maxZoom","longitude","latitude","zoom","WebMercatorViewport","x","y","center","scale","OrthographicView","makeViewport","viewState","target","log2","size"],"mappings":"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","sourcesContent":["import {OrthographicView, WebMercatorViewport, log, Layer, Viewport} from '@deck.gl/core';\nimport {fitBounds} from '@math.gl/web-mercator';\n\nexport type MaskBounds = [number, number, number, number];\n\n/*\n * Compute the bounds of the mask in world space, such that it covers an\n * area currently visible (extended by a buffer) or the area of the masking\n * data, whichever is smaller\n */\nexport function getMaskBounds({\n layers,\n viewport\n}: {\n layers: Layer[];\n viewport: Viewport;\n}): MaskBounds {\n // Join the bounds of layer data\n let bounds: MaskBounds | null = null;\n for (const layer of layers) {\n const subLayerBounds = layer.getBounds();\n if (subLayerBounds) {\n if (bounds) {\n bounds[0] = Math.min(bounds[0], subLayerBounds[0][0]);\n bounds[1] = Math.min(bounds[1], subLayerBounds[0][1]);\n bounds[2] = Math.max(bounds[2], subLayerBounds[1][0]);\n bounds[3] = Math.max(bounds[3], subLayerBounds[1][1]);\n } else {\n bounds = [\n subLayerBounds[0][0],\n subLayerBounds[0][1],\n subLayerBounds[1][0],\n subLayerBounds[1][1]\n ];\n }\n }\n }\n const viewportBounds = viewport.getBounds();\n if (!bounds) {\n return viewportBounds;\n }\n\n // Expand viewport bounds by 2X. Heurestically chosen to avoid masking\n // errors when mask is partially out of view\n const paddedBounds = _doubleBounds(viewportBounds);\n\n // When bounds of the mask are smaller than the viewport bounds simply use\n // mask bounds, so as to maximize resolution & avoid mask rerenders\n if (\n bounds[2] - bounds[0] < paddedBounds[2] - paddedBounds[0] ||\n bounds[3] - bounds[1] < paddedBounds[3] - paddedBounds[1]\n ) {\n return bounds;\n }\n\n // As viewport shrinks, to avoid pixelation along mask edges\n // we need to reduce the bounds and only render the visible portion\n // of the mask.\n // We pad the viewport bounds to capture the section\n // of the mask just outside the viewport to correctly maskByInstance.\n // Intersect mask & padded viewport bounds\n bounds[0] = Math.max(bounds[0], paddedBounds[0]);\n bounds[1] = Math.max(bounds[1], paddedBounds[1]);\n bounds[2] = Math.min(bounds[2], paddedBounds[2]);\n bounds[3] = Math.min(bounds[3], paddedBounds[3]);\n return bounds;\n}\n\n/*\n * Compute viewport to render the mask into, covering the given bounds\n */\nexport function getMaskViewport({\n bounds,\n viewport,\n width,\n height\n}: {\n bounds: MaskBounds;\n viewport: Viewport;\n width: number;\n height: number;\n}): Viewport | null {\n if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {\n return null;\n }\n\n if (viewport.resolution !== undefined) {\n log.warn('MaskExtension is not supported in GlobeView')();\n return null;\n }\n\n // Single pixel border to prevent mask bleeding at edge of texture\n const padding = 1;\n width -= padding * 2;\n height -= padding * 2;\n\n if (viewport.isGeospatial) {\n const {longitude, latitude, zoom} = fitBounds({\n width,\n height,\n bounds: [\n [bounds[0], bounds[1]],\n [bounds[2], bounds[3]]\n ],\n maxZoom: 20\n });\n return new WebMercatorViewport({\n longitude,\n latitude,\n zoom,\n x: padding,\n y: padding,\n width,\n height\n });\n }\n\n const center = [(bounds[0] + bounds[2]) / 2, (bounds[1] + bounds[3]) / 2, 0];\n const scale = Math.min(\n 1048576, // maxZoom of 20: Math.pow(2, 20) = 1048576\n width / (bounds[2] - bounds[0]),\n height / (bounds[3] - bounds[1])\n );\n\n return new OrthographicView({\n x: padding,\n y: padding\n }).makeViewport({\n width,\n height,\n viewState: {\n target: center,\n zoom: Math.log2(scale)\n }\n });\n}\n\nfunction _doubleBounds(bounds: MaskBounds): MaskBounds {\n const size = {\n x: bounds[2] - bounds[0],\n y: bounds[3] - bounds[1]\n };\n const center = {\n x: bounds[0] + 0.5 * size.x,\n y: bounds[1] + 0.5 * size.y\n };\n return [center.x - size.x, center.y - size.y, center.x + size.x, center.y + size.y];\n}\n"],"file":"utils.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collide/collide-effect.ts"],"names":["Framebuffer","Renderbuffer","Texture2D","cssToDeviceRatio","equals","_deepEqual","deepEqual","CollidePass","MaskEffect","DOWNSCALE","CollideEffect","preRender","gl","effects","allEffects","layers","layerFilter","viewports","onViewportActive","views","isPicking","preRenderStats","dummyCollideMap","width","height","collideLayers","filter","props","visible","collideEnabled","length","channels","collidePass","id","e","constructor","maskEffectRendered","didRender","_groupByCollideGroup","viewport","viewportChanged","lastViewport","collideGroup","collideFBO","collideFBOs","renderInfo","resize","canvas","_render","oldRenderInfo","needsRender","layerBounds","some","b","i","renderCollideMap","pass","moduleParameters","devicePixelRatio","channelMap","layer","channelInfo","push","getBounds","Object","keys","createFBO","destroyFBO","getModuleParameters","cleanup","delete","undefined","collideMap","parameters","depthBuffer","format","attachments","fbo","attachment","values"],"mappings":"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","sourcesContent":["import {Framebuffer, Renderbuffer, Texture2D, cssToDeviceRatio} from '@luma.gl/core';\nimport {equals} from '@math.gl/core';\nimport {_deepEqual as deepEqual} from '@deck.gl/core';\nimport type {Effect, Layer, PreRenderOptions, Viewport} from '@deck.gl/core';\nimport CollidePass from './collide-pass';\nimport MaskEffect, {MaskPreRenderStats} from '../mask/mask-effect';\n// import {debugFBO} from '../utils/debug';\n\ntype CollideExtensionProps = {\n collideTestProps?: {};\n collideGroup: string;\n};\n\n// Factor by which to downscale Collide FBO relative to canvas\nconst DOWNSCALE = 2;\n\ntype RenderInfo = {\n collideGroup: string;\n layers: Layer<CollideExtensionProps>[];\n layerBounds: ([number[], number[]] | null)[];\n};\n\n// Class to manage collide effect\nexport default class CollideEffect implements Effect {\n id = 'collide-effect';\n props = null;\n useInPicking = true;\n order = 1;\n\n private channels: Record<string, RenderInfo> = {};\n private collidePass?: CollidePass;\n private collideFBOs: Record<string, Framebuffer> = {};\n private dummyCollideMap?: Texture2D;\n private lastViewport?: Viewport;\n\n preRender(\n gl: WebGLRenderingContext,\n {\n effects: allEffects,\n layers,\n layerFilter,\n viewports,\n onViewportActive,\n views,\n isPicking,\n preRenderStats = {}\n }: PreRenderOptions\n ): void {\n if (!this.dummyCollideMap) {\n this.dummyCollideMap = new Texture2D(gl, {width: 1, height: 1});\n }\n\n if (isPicking) {\n // Do not update on picking pass\n return;\n }\n\n const collideLayers = layers.filter(\n // @ts-ignore\n ({props: {visible, collideEnabled}}) => visible && collideEnabled\n ) as Layer<CollideExtensionProps>[];\n if (collideLayers.length === 0) {\n this.channels = {};\n return;\n }\n\n if (!this.collidePass) {\n this.collidePass = new CollidePass(gl, {id: 'default-collide'});\n }\n\n // Detect if mask has rendered. TODO: better dependency system for Effects\n const effects = allEffects?.filter(e => e.constructor === MaskEffect);\n const maskEffectRendered = (preRenderStats['mask-effect'] as MaskPreRenderStats)?.didRender;\n\n // Collect layers to render\n const channels = this._groupByCollideGroup(gl, collideLayers);\n\n const viewport = viewports[0];\n const viewportChanged =\n !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;\n\n // Resize framebuffers to match canvas\n for (const collideGroup in channels) {\n const collideFBO = this.collideFBOs[collideGroup];\n const renderInfo = channels[collideGroup];\n collideFBO.resize({\n width: gl.canvas.width / DOWNSCALE,\n height: gl.canvas.height / DOWNSCALE\n });\n this._render(renderInfo, {\n effects,\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n });\n }\n\n // debugFBO(this.collideFBOs[Object.keys(channels)[0]], {minimap: true});\n }\n\n private _render(\n renderInfo: RenderInfo,\n {\n effects,\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n }: {\n effects: PreRenderOptions['effects'];\n layerFilter: PreRenderOptions['layerFilter'];\n onViewportActive: PreRenderOptions['onViewportActive'];\n views: PreRenderOptions['views'];\n viewport: Viewport;\n viewportChanged: boolean;\n }\n ) {\n const {collideGroup} = renderInfo;\n const oldRenderInfo = this.channels[collideGroup];\n if (!oldRenderInfo) {\n return;\n }\n\n const needsRender =\n viewportChanged ||\n // If render info is new\n renderInfo === oldRenderInfo ||\n // If sublayers have changed\n !deepEqual(oldRenderInfo.layers, renderInfo.layers, 0) ||\n // If a sublayer's bounds have been updated\n renderInfo.layerBounds.some((b, i) => !equals(b, oldRenderInfo.layerBounds[i]));\n\n this.channels[collideGroup] = renderInfo;\n\n if (needsRender) {\n this.lastViewport = viewport;\n const collideFBO = this.collideFBOs[collideGroup];\n\n // Rerender collide FBO\n this.collidePass!.renderCollideMap(collideFBO, {\n pass: 'collide',\n isPicking: true,\n layers: renderInfo.layers,\n effects,\n layerFilter,\n viewports: viewport ? [viewport] : [],\n onViewportActive,\n views,\n moduleParameters: {\n // To avoid feedback loop forming between Framebuffer and active Texture.\n dummyCollideMap: this.dummyCollideMap,\n devicePixelRatio: cssToDeviceRatio(collideFBO.gl) / DOWNSCALE\n }\n });\n }\n }\n\n /**\n * Group layers by collideGroup\n * Returns a map from collideGroup to render info\n */\n private _groupByCollideGroup(\n gl: WebGLRenderingContext,\n collideLayers: Layer<CollideExtensionProps>[]\n ): Record<string, RenderInfo> {\n const channelMap = {};\n for (const layer of collideLayers) {\n const {collideGroup} = layer.props;\n let channelInfo = channelMap[collideGroup];\n if (!channelInfo) {\n channelInfo = {\n collideGroup,\n layers: [],\n layerBounds: []\n };\n channelMap[collideGroup] = channelInfo;\n }\n channelInfo.layers.push(layer);\n channelInfo.layerBounds.push(layer.getBounds());\n }\n\n // Create any new passes and remove any old ones\n for (const collideGroup of Object.keys(channelMap)) {\n if (!this.collideFBOs[collideGroup]) {\n this.createFBO(gl, collideGroup);\n }\n if (!this.channels[collideGroup]) {\n this.channels[collideGroup] = channelMap[collideGroup];\n }\n }\n for (const collideGroup of Object.keys(this.collideFBOs)) {\n if (!channelMap[collideGroup]) {\n this.destroyFBO(collideGroup);\n }\n }\n\n return channelMap;\n }\n\n getModuleParameters(layer: Layer): {\n collideFBO: Framebuffer;\n dummyCollideMap: Texture2D;\n } {\n const {collideGroup} = (layer as Layer<CollideExtensionProps>).props;\n const {collideFBOs, dummyCollideMap} = this;\n return {collideFBO: collideFBOs[collideGroup], dummyCollideMap};\n }\n\n cleanup(): void {\n if (this.dummyCollideMap) {\n this.dummyCollideMap.delete();\n this.dummyCollideMap = undefined;\n }\n this.channels = {};\n for (const collideGroup of Object.keys(this.collideFBOs)) {\n this.destroyFBO(collideGroup);\n }\n this.collideFBOs = {};\n this.lastViewport = undefined;\n }\n\n createFBO(gl: WebGLRenderingContext, collideGroup: string) {\n const {width, height} = gl.canvas;\n const collideMap = new Texture2D(gl, {\n width,\n height,\n parameters: {\n [gl.TEXTURE_MIN_FILTER]: gl.NEAREST,\n [gl.TEXTURE_MAG_FILTER]: gl.NEAREST,\n [gl.TEXTURE_WRAP_S]: gl.CLAMP_TO_EDGE,\n [gl.TEXTURE_WRAP_T]: gl.CLAMP_TO_EDGE\n }\n });\n\n const depthBuffer = new Renderbuffer(gl, {format: gl.DEPTH_COMPONENT16, width, height});\n this.collideFBOs[collideGroup] = new Framebuffer(gl, {\n id: `Collide-${collideGroup}`,\n width,\n height,\n attachments: {\n [gl.COLOR_ATTACHMENT0]: collideMap,\n [gl.DEPTH_ATTACHMENT]: depthBuffer\n }\n });\n }\n\n destroyFBO(collideGroup: string) {\n const fbo = this.collideFBOs[collideGroup];\n for (const attachment of Object.values(fbo.attachments as Texture2D[])) {\n attachment.delete();\n }\n fbo.delete();\n delete this.collideFBOs[collideGroup];\n }\n}\n"],"file":"collide-effect.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collide/collide-pass.ts"],"names":["withParameters","_LayersPass","LayersPass","CollidePass","renderCollideMap","target","options","gl","padding","scissorTest","scissor","width","height","clearColor","blend","depthTest","depthRange","render","pass","getModuleParameters","drawToCollideMap","pickingActive","pickingAttribute","lightSources"],"mappings":"AAAA,SAAqBA,cAArB,QAA0C,eAA1C;AACA,SAAQC,WAAW,IAAIC,UAAvB,QAAiE,eAAjE;AAIA,eAAe,MAAMC,WAAN,SAA0BD,UAA1B,CAAqC;AAClDE,EAAAA,gBAAgB,CAACC,MAAD,EAAsBC,OAAtB,EAAyD;AACvE,UAAMC,EAAE,GAAG,KAAKA,EAAhB;AAEA,UAAMC,OAAO,GAAG,CAAhB;AAEA,WAAOR,cAAc,CACnBO,EADmB,EAEnB;AACEE,MAAAA,WAAW,EAAE,IADf;AAEEC,MAAAA,OAAO,EAAE,CAACF,OAAD,EAAUA,OAAV,EAAmBH,MAAM,CAACM,KAAP,GAAe,IAAIH,OAAtC,EAA+CH,MAAM,CAACO,MAAP,GAAgB,IAAIJ,OAAnE,CAFX;AAGEK,MAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAHd;AAIEC,MAAAA,KAAK,EAAE,KAJT;AAKEC,MAAAA,SAAS,EAAE,IALb;AAMEC,MAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ;AANd,KAFmB,EAUnB,MAAM,KAAKC,MAAL,CAAY,EAAC,GAAGX,OAAJ;AAAaD,MAAAA,MAAb;AAAqBa,MAAAA,IAAI,EAAE;AAA3B,KAAZ,CAVa,CAArB;AAYD;;AAEDC,EAAAA,mBAAmB,GAAG;AAEpB,WAAO;AACLC,MAAAA,gBAAgB,EAAE,IADb;AAELC,MAAAA,aAAa,EAAE,CAFV;AAGLC,MAAAA,gBAAgB,EAAE,KAHb;AAILC,MAAAA,YAAY,EAAE;AAJT,KAAP;AAMD;;AA5BiD","sourcesContent":["import {Framebuffer, withParameters} from '@luma.gl/core';\nimport {_LayersPass as LayersPass, LayersPassRenderOptions} from '@deck.gl/core';\n\ntype CollidePassRenderOptions = LayersPassRenderOptions & {};\n\nexport default class CollidePass extends LayersPass {\n renderCollideMap(target: Framebuffer, options: CollidePassRenderOptions) {\n const gl = this.gl;\n\n const padding = 1;\n\n return withParameters(\n gl,\n {\n scissorTest: true,\n scissor: [padding, padding, target.width - 2 * padding, target.height - 2 * padding],\n clearColor: [0, 0, 0, 0],\n blend: false,\n depthTest: true,\n depthRange: [0, 1]\n },\n () => this.render({...options, target, pass: 'collide'})\n );\n }\n\n getModuleParameters() {\n // Draw picking colors into collide FBO\n return {\n drawToCollideMap: true,\n pickingActive: 1,\n pickingAttribute: false,\n lightSources: {}\n };\n }\n}\n"],"file":"collide-pass.js"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
-
import { LayerExtension } from '@deck.gl/core';
|
|
3
|
-
import collide from './shader-module';
|
|
4
|
-
import CollideEffect from './collide-effect';
|
|
5
|
-
const defaultProps = {
|
|
6
|
-
getCollidePriority: {
|
|
7
|
-
type: 'accessor',
|
|
8
|
-
value: 0
|
|
9
|
-
},
|
|
10
|
-
collideEnabled: true,
|
|
11
|
-
collideGroup: {
|
|
12
|
-
type: 'string',
|
|
13
|
-
value: 'default'
|
|
14
|
-
},
|
|
15
|
-
collideTestProps: {}
|
|
16
|
-
};
|
|
17
|
-
export default class CollideExtension extends LayerExtension {
|
|
18
|
-
getShaders() {
|
|
19
|
-
return {
|
|
20
|
-
modules: [collide]
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
draw({
|
|
25
|
-
uniforms,
|
|
26
|
-
context,
|
|
27
|
-
moduleParameters
|
|
28
|
-
}) {
|
|
29
|
-
const {
|
|
30
|
-
collideEnabled
|
|
31
|
-
} = this.props;
|
|
32
|
-
const {
|
|
33
|
-
collideFBO,
|
|
34
|
-
drawToCollideMap
|
|
35
|
-
} = moduleParameters;
|
|
36
|
-
const enabled = collideEnabled && Boolean(collideFBO);
|
|
37
|
-
uniforms.collide_enabled = enabled;
|
|
38
|
-
|
|
39
|
-
if (drawToCollideMap) {
|
|
40
|
-
this.props = this.clone(this.props.collideTestProps).props;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
initializeState(context, extension) {
|
|
45
|
-
var _this$context$deck;
|
|
46
|
-
|
|
47
|
-
if (this.getAttributeManager() === null) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
(_this$context$deck = this.context.deck) === null || _this$context$deck === void 0 ? void 0 : _this$context$deck._addDefaultEffect(new CollideEffect());
|
|
52
|
-
const attributeManager = this.getAttributeManager();
|
|
53
|
-
attributeManager.add({
|
|
54
|
-
collidePriorities: {
|
|
55
|
-
size: 1,
|
|
56
|
-
accessor: 'getCollidePriority',
|
|
57
|
-
shaderAttributes: {
|
|
58
|
-
collidePriorities: {
|
|
59
|
-
divisor: 0
|
|
60
|
-
},
|
|
61
|
-
instanceCollidePriorities: {
|
|
62
|
-
divisor: 1
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
getNeedsPickingBuffer() {
|
|
70
|
-
return this.props.collideEnabled;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
_defineProperty(CollideExtension, "defaultProps", defaultProps);
|
|
76
|
-
|
|
77
|
-
_defineProperty(CollideExtension, "extensionName", 'CollideExtension');
|
|
78
|
-
//# sourceMappingURL=collide.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collide/collide.ts"],"names":["LayerExtension","collide","CollideEffect","defaultProps","getCollidePriority","type","value","collideEnabled","collideGroup","collideTestProps","CollideExtension","getShaders","modules","draw","uniforms","context","moduleParameters","props","collideFBO","drawToCollideMap","enabled","Boolean","collide_enabled","clone","initializeState","extension","getAttributeManager","deck","_addDefaultEffect","attributeManager","add","collidePriorities","size","accessor","shaderAttributes","divisor","instanceCollidePriorities","getNeedsPickingBuffer"],"mappings":";AAAA,SAAuCA,cAAvC,QAA4D,eAA5D;AACA,OAAOC,OAAP,MAAoB,iBAApB;AACA,OAAOC,aAAP,MAA0B,kBAA1B;AAEA,MAAMC,YAAY,GAAG;AACnBC,EAAAA,kBAAkB,EAAE;AAACC,IAAAA,IAAI,EAAE,UAAP;AAAmBC,IAAAA,KAAK,EAAE;AAA1B,GADD;AAEnBC,EAAAA,cAAc,EAAE,IAFG;AAGnBC,EAAAA,YAAY,EAAE;AAACH,IAAAA,IAAI,EAAE,QAAP;AAAiBC,IAAAA,KAAK,EAAE;AAAxB,GAHK;AAInBG,EAAAA,gBAAgB,EAAE;AAJC,CAArB;AA+BA,eAAe,MAAMC,gBAAN,SAA+BV,cAA/B,CAA8C;AAI3DW,EAAAA,UAAU,GAA0C;AAClD,WAAO;AAACC,MAAAA,OAAO,EAAE,CAACX,OAAD;AAAV,KAAP;AACD;;AAGDY,EAAAA,IAAI,CAAqC;AAACC,IAAAA,QAAD;AAAWC,IAAAA,OAAX;AAAoBC,IAAAA;AAApB,GAArC,EAAiF;AACnF,UAAM;AAACT,MAAAA;AAAD,QAAmB,KAAKU,KAA9B;AACA,UAAM;AAACC,MAAAA,UAAD;AAAaC,MAAAA;AAAb,QAAiCH,gBAAvC;AACA,UAAMI,OAAO,GAAGb,cAAc,IAAIc,OAAO,CAACH,UAAD,CAAzC;AACAJ,IAAAA,QAAQ,CAACQ,eAAT,GAA2BF,OAA3B;;AAEA,QAAID,gBAAJ,EAAsB;AAGpB,WAAKF,KAAL,GAAa,KAAKM,KAAL,CAAW,KAAKN,KAAL,CAAWR,gBAAtB,EAAwCQ,KAArD;AACD;AACF;;AAEDO,EAAAA,eAAe,CAAqCT,OAArC,EAA4DU,SAA5D,EAA6E;AAAA;;AAC1F,QAAI,KAAKC,mBAAL,OAA+B,IAAnC,EAAyC;AACvC;AACD;;AACD,+BAAKX,OAAL,CAAaY,IAAb,0EAAmBC,iBAAnB,CAAqC,IAAI1B,aAAJ,EAArC;AACA,UAAM2B,gBAAgB,GAAG,KAAKH,mBAAL,EAAzB;AACAG,IAAAA,gBAAgB,CAAEC,GAAlB,CAAsB;AACpBC,MAAAA,iBAAiB,EAAE;AACjBC,QAAAA,IAAI,EAAE,CADW;AAEjBC,QAAAA,QAAQ,EAAE,oBAFO;AAGjBC,QAAAA,gBAAgB,EAAE;AAChBH,UAAAA,iBAAiB,EAAE;AAACI,YAAAA,OAAO,EAAE;AAAV,WADH;AAEhBC,UAAAA,yBAAyB,EAAE;AAACD,YAAAA,OAAO,EAAE;AAAV;AAFX;AAHD;AADC,KAAtB;AAUD;;AAEDE,EAAAA,qBAAqB,GAA8C;AACjE,WAAO,KAAKpB,KAAL,CAAWV,cAAlB;AACD;;AA1C0D;;gBAAxCG,gB,kBACGP,Y;;gBADHO,gB,mBAEI,kB","sourcesContent":["import {Accessor, Layer, LayerContext, LayerExtension} from '@deck.gl/core';\nimport collide from './shader-module';\nimport CollideEffect from './collide-effect';\n\nconst defaultProps = {\n getCollidePriority: {type: 'accessor', value: 0},\n collideEnabled: true,\n collideGroup: {type: 'string', value: 'default'},\n collideTestProps: {}\n};\n\nexport type CollideExtensionProps<DataT = any> = {\n /**\n * Accessor for collision priority. Must return a number in the range -1000 -> 1000. Features with higher values are shown preferentially.\n */\n getCollidePriority?: Accessor<DataT, number>;\n\n /**\n * Enable/disable collisions. If collisions are disabled, all objects are rendered.\n * @default true\n */\n collideEnabled: boolean;\n\n /**\n * Collision group this layer belongs to. If it is not set, the 'default' collision group is used\n */\n collideGroup?: string;\n\n /**\n * Props to override when rendering collision map\n */\n collideTestProps?: {};\n};\n\n/** Allows layers to hide overlapping objects. */\nexport default class CollideExtension extends LayerExtension {\n static defaultProps = defaultProps;\n static extensionName = 'CollideExtension';\n\n getShaders(this: Layer<CollideExtensionProps>): any {\n return {modules: [collide]};\n }\n\n /* eslint-disable camelcase */\n draw(this: Layer<CollideExtensionProps>, {uniforms, context, moduleParameters}: any) {\n const {collideEnabled} = this.props;\n const {collideFBO, drawToCollideMap} = moduleParameters;\n const enabled = collideEnabled && Boolean(collideFBO);\n uniforms.collide_enabled = enabled;\n\n if (drawToCollideMap) {\n // Override any props with those defined in collideTestProps\n // @ts-ignore\n this.props = this.clone(this.props.collideTestProps).props;\n }\n }\n\n initializeState(this: Layer<CollideExtensionProps>, context: LayerContext, extension: this) {\n if (this.getAttributeManager() === null) {\n return;\n }\n this.context.deck?._addDefaultEffect(new CollideEffect());\n const attributeManager = this.getAttributeManager();\n attributeManager!.add({\n collidePriorities: {\n size: 1,\n accessor: 'getCollidePriority',\n shaderAttributes: {\n collidePriorities: {divisor: 0},\n instanceCollidePriorities: {divisor: 1}\n }\n }\n });\n }\n\n getNeedsPickingBuffer(this: Layer<CollideExtensionProps>): boolean {\n return this.props.collideEnabled;\n }\n}\n"],"file":"collide.js"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { project } from '@deck.gl/core';
|
|
2
|
-
const vs = "\n#ifdef NON_INSTANCED_MODEL\nattribute float collidePriorities;\n#else\nattribute float instanceCollidePriorities;\n#endif\n\nuniform sampler2D collide_texture;\nuniform bool collide_sort;\nuniform bool collide_enabled;\n\nvec2 collide_getCoords(vec4 position) {\n vec4 collide_clipspace = project_common_position_to_clipspace(position);\n return (1.0 + collide_clipspace.xy / collide_clipspace.w) / 2.0;\n}\n\nfloat collide_match(vec2 tex, vec3 pickingColor) {\n vec4 collide_pickingColor = texture2D(collide_texture, tex);\n float delta = dot(abs(collide_pickingColor.rgb - pickingColor), vec3(1.0));\n float e = 0.001;\n return step(delta, e);\n}\n\nfloat collide_isVisible(vec2 texCoords, vec3 pickingColor) {\n if (!collide_enabled) {\n return 1.0;\n }\n\n // Visibility test, sample area of 5x5 pixels in order to fade in/out.\n // Due to the locality, the lookups will be cached\n // This reduces the flicker present when objects are shown/hidden\n const int N = 2;\n float accumulator = 0.0;\n vec2 step = vec2(1.0 / project_uViewportSize);\n\n const float floatN = float(N);\n vec2 delta = -floatN * step;\n for(int i = -N; i <= N; i++) {\n delta.x = -step.x * floatN;\n for(int j = -N; j <= N; j++) {\n accumulator += collide_match(texCoords + delta, pickingColor);\n delta.x += step.x;\n }\n delta.y += step.y;\n }\n\n float W = 2.0 * floatN + 1.0;\n return pow(accumulator / (W * W), 2.2);\n}\n";
|
|
3
|
-
const inject = {
|
|
4
|
-
'vs:#decl': "\n float collide_fade = 1.0;\n",
|
|
5
|
-
'vs:DECKGL_FILTER_GL_POSITION': "\n if (collide_sort) {\n #ifdef NON_INSTANCED_MODEL\n float collidePriority = collidePriorities;\n #else\n float collidePriority = instanceCollidePriorities;\n #endif\n position.z = -0.001 * collidePriority * position.w; // Support range -1000 -> 1000\n }\n\n if (collide_enabled) {\n vec4 collide_common_position = project_position(vec4(geometry.worldPosition, 1.0));\n vec2 collide_texCoords = collide_getCoords(collide_common_position);\n collide_fade = collide_isVisible(collide_texCoords, geometry.pickingColor / 255.0);\n if (collide_fade < 0.0001) {\n position = vec4(0.);\n }\n }\n ",
|
|
6
|
-
'vs:DECKGL_FILTER_COLOR': "\n color.a *= collide_fade;\n "
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
const getCollideUniforms = (opts, uniforms) => {
|
|
10
|
-
if (!opts || !('dummyCollideMap' in opts)) {
|
|
11
|
-
return {};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const {
|
|
15
|
-
collideFBO,
|
|
16
|
-
drawToCollideMap,
|
|
17
|
-
dummyCollideMap
|
|
18
|
-
} = opts;
|
|
19
|
-
return {
|
|
20
|
-
collide_sort: Boolean(drawToCollideMap),
|
|
21
|
-
collide_texture: !drawToCollideMap && collideFBO ? collideFBO : dummyCollideMap
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export default {
|
|
26
|
-
name: 'collide',
|
|
27
|
-
dependencies: [project],
|
|
28
|
-
vs,
|
|
29
|
-
inject,
|
|
30
|
-
getUniforms: getCollideUniforms
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=shader-module.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collide/shader-module.ts"],"names":["project","vs","inject","getCollideUniforms","opts","uniforms","collideFBO","drawToCollideMap","dummyCollideMap","collide_sort","Boolean","collide_texture","name","dependencies","getUniforms"],"mappings":"AACA,SAAQA,OAAR,QAAsB,eAAtB;AAGA,MAAMC,EAAE,i7CAAR;AAmDA,MAAMC,MAAM,GAAG;AACb,+CADa;AAIb,6pBAJa;AAuBb;AAvBa,CAAf;;AAqCA,MAAMC,kBAAkB,GAAG,CACzBC,IADyB,EAEzBC,QAFyB,KAGL;AACpB,MAAI,CAACD,IAAD,IAAS,EAAE,qBAAqBA,IAAvB,CAAb,EAA2C;AACzC,WAAO,EAAP;AACD;;AACD,QAAM;AAACE,IAAAA,UAAD;AAAaC,IAAAA,gBAAb;AAA+BC,IAAAA;AAA/B,MAAkDJ,IAAxD;AACA,SAAO;AACLK,IAAAA,YAAY,EAAEC,OAAO,CAACH,gBAAD,CADhB;AAELI,IAAAA,eAAe,EAAE,CAACJ,gBAAD,IAAqBD,UAArB,GAAkCA,UAAlC,GAA+CE;AAF3D,GAAP;AAID,CAZD;;AAcA,eAAe;AACbI,EAAAA,IAAI,EAAE,SADO;AAEbC,EAAAA,YAAY,EAAE,CAACb,OAAD,CAFD;AAGbC,EAAAA,EAHa;AAIbC,EAAAA,MAJa;AAKbY,EAAAA,WAAW,EAAEX;AALA,CAAf","sourcesContent":["import {Framebuffer, Texture2D} from '@luma.gl/core';\nimport {project} from '@deck.gl/core';\nimport type {_ShaderModule as ShaderModule} from '@deck.gl/core';\n\nconst vs = `\n#ifdef NON_INSTANCED_MODEL\nattribute float collidePriorities;\n#else\nattribute float instanceCollidePriorities;\n#endif\n\nuniform sampler2D collide_texture;\nuniform bool collide_sort;\nuniform bool collide_enabled;\n\nvec2 collide_getCoords(vec4 position) {\n vec4 collide_clipspace = project_common_position_to_clipspace(position);\n return (1.0 + collide_clipspace.xy / collide_clipspace.w) / 2.0;\n}\n\nfloat collide_match(vec2 tex, vec3 pickingColor) {\n vec4 collide_pickingColor = texture2D(collide_texture, tex);\n float delta = dot(abs(collide_pickingColor.rgb - pickingColor), vec3(1.0));\n float e = 0.001;\n return step(delta, e);\n}\n\nfloat collide_isVisible(vec2 texCoords, vec3 pickingColor) {\n if (!collide_enabled) {\n return 1.0;\n }\n\n // Visibility test, sample area of 5x5 pixels in order to fade in/out.\n // Due to the locality, the lookups will be cached\n // This reduces the flicker present when objects are shown/hidden\n const int N = 2;\n float accumulator = 0.0;\n vec2 step = vec2(1.0 / project_uViewportSize);\n\n const float floatN = float(N);\n vec2 delta = -floatN * step;\n for(int i = -N; i <= N; i++) {\n delta.x = -step.x * floatN;\n for(int j = -N; j <= N; j++) {\n accumulator += collide_match(texCoords + delta, pickingColor);\n delta.x += step.x;\n }\n delta.y += step.y;\n }\n\n float W = 2.0 * floatN + 1.0;\n return pow(accumulator / (W * W), 2.2);\n}\n`;\n\nconst inject = {\n 'vs:#decl': `\n float collide_fade = 1.0;\n`,\n 'vs:DECKGL_FILTER_GL_POSITION': `\n if (collide_sort) {\n #ifdef NON_INSTANCED_MODEL\n float collidePriority = collidePriorities;\n #else\n float collidePriority = instanceCollidePriorities;\n #endif\n position.z = -0.001 * collidePriority * position.w; // Support range -1000 -> 1000\n }\n\n if (collide_enabled) {\n vec4 collide_common_position = project_position(vec4(geometry.worldPosition, 1.0));\n vec2 collide_texCoords = collide_getCoords(collide_common_position);\n collide_fade = collide_isVisible(collide_texCoords, geometry.pickingColor / 255.0);\n if (collide_fade < 0.0001) {\n position = vec4(0.);\n }\n }\n `,\n 'vs:DECKGL_FILTER_COLOR': `\n color.a *= collide_fade;\n `\n};\n\ntype CollideModuleSettings = {\n collideFBO?: Framebuffer;\n drawToCollideMap?: boolean;\n dummyCollideMap?: Texture2D;\n};\n\n/* eslint-disable camelcase */\ntype CollideUniforms = {collide_sort?: boolean; collide_texture?: Framebuffer | Texture2D};\n\nconst getCollideUniforms = (\n opts: CollideModuleSettings | {},\n uniforms: Record<string, any>\n): CollideUniforms => {\n if (!opts || !('dummyCollideMap' in opts)) {\n return {};\n }\n const {collideFBO, drawToCollideMap, dummyCollideMap} = opts;\n return {\n collide_sort: Boolean(drawToCollideMap),\n collide_texture: !drawToCollideMap && collideFBO ? collideFBO : dummyCollideMap\n };\n};\n\nexport default {\n name: 'collide',\n dependencies: [project],\n vs,\n inject,\n getUniforms: getCollideUniforms\n} as ShaderModule;\n"],"file":"shader-module.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/common/projection-utils.ts"],"names":["WebMercatorViewport","OrthographicViewport","joinLayerBounds","layers","viewport","bounds","Infinity","layer","layerBounds","getBounds","bottomLeftCommon","projectPosition","autoOffset","topRightCommon","Math","min","max","Number","isFinite","MAX_VIEWPORT_SIZE","makeViewport","opts","border","isGeospatial","centerWorld","unprojectPosition","maxSize","width","height","zoom","undefined","scale","log2","round","abs","r","x","y","longitude","latitude","orthographic","target","flipY","getViewportBounds","zRange","viewportBoundsWorld","length","minZ","maxZ","bounds0","z","bounds1","viewportBottomLeftCommon","slice","viewportTopRightCommon","getRenderBounds","viewportBounds","paddedBounds","doubleBounds","dx","dy","centerX","centerY"],"mappings":"AAAA,SAAQA,mBAAR,EAA6BC,oBAA7B,QAAwD,eAAxD;AAUA,OAAO,SAASC,eAAT,CAELC,MAFK,EAILC,QAJK,EAKU;AAEf,QAAMC,MAAc,GAAG,CAACC,QAAD,EAAWA,QAAX,EAAqB,CAACA,QAAtB,EAAgC,CAACA,QAAjC,CAAvB;;AACA,OAAK,MAAMC,KAAX,IAAoBJ,MAApB,EAA4B;AAC1B,UAAMK,WAAW,GAAGD,KAAK,CAACE,SAAN,EAApB;;AACA,QAAID,WAAJ,EAAiB;AACf,YAAME,gBAAgB,GAAGH,KAAK,CAACI,eAAN,CAAsBH,WAAW,CAAC,CAAD,CAAjC,EAAsC;AAACJ,QAAAA,QAAD;AAAWQ,QAAAA,UAAU,EAAE;AAAvB,OAAtC,CAAzB;AACA,YAAMC,cAAc,GAAGN,KAAK,CAACI,eAAN,CAAsBH,WAAW,CAAC,CAAD,CAAjC,EAAsC;AAACJ,QAAAA,QAAD;AAAWQ,QAAAA,UAAU,EAAE;AAAvB,OAAtC,CAAvB;AAEAP,MAAAA,MAAM,CAAC,CAAD,CAAN,GAAYS,IAAI,CAACC,GAAL,CAASV,MAAM,CAAC,CAAD,CAAf,EAAoBK,gBAAgB,CAAC,CAAD,CAApC,CAAZ;AACAL,MAAAA,MAAM,CAAC,CAAD,CAAN,GAAYS,IAAI,CAACC,GAAL,CAASV,MAAM,CAAC,CAAD,CAAf,EAAoBK,gBAAgB,CAAC,CAAD,CAApC,CAAZ;AACAL,MAAAA,MAAM,CAAC,CAAD,CAAN,GAAYS,IAAI,CAACE,GAAL,CAASX,MAAM,CAAC,CAAD,CAAf,EAAoBQ,cAAc,CAAC,CAAD,CAAlC,CAAZ;AACAR,MAAAA,MAAM,CAAC,CAAD,CAAN,GAAYS,IAAI,CAACE,GAAL,CAASX,MAAM,CAAC,CAAD,CAAf,EAAoBQ,cAAc,CAAC,CAAD,CAAlC,CAAZ;AACD;AACF;;AAED,MAAII,MAAM,CAACC,QAAP,CAAgBb,MAAM,CAAC,CAAD,CAAtB,CAAJ,EAAgC;AAC9B,WAAOA,MAAP;AACD;;AACD,SAAO,IAAP;AACD;AAED,MAAMc,iBAAiB,GAAG,IAA1B;AAGA,OAAO,SAASC,YAAT,CAAsBC,IAAtB,EAaa;AAClB,QAAM;AAAChB,IAAAA,MAAD;AAASD,IAAAA,QAAT;AAAmBkB,IAAAA,MAAM,GAAG;AAA5B,MAAiCD,IAAvC;AACA,QAAM;AAACE,IAAAA;AAAD,MAAiBnB,QAAvB;;AAEA,MAAIC,MAAM,CAAC,CAAD,CAAN,IAAaA,MAAM,CAAC,CAAD,CAAnB,IAA0BA,MAAM,CAAC,CAAD,CAAN,IAAaA,MAAM,CAAC,CAAD,CAAjD,EAAsD;AACpD,WAAO,IAAP;AACD;;AAED,QAAMmB,WAAW,GAAGpB,QAAQ,CAACqB,iBAAT,CAA2B,CAC7C,CAACpB,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAAnB,IAA0B,CADmB,EAE7C,CAACA,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAAnB,IAA0B,CAFmB,EAG7C,CAH6C,CAA3B,CAApB;AAMA,QAAMqB,OAAO,GAAGP,iBAAiB,GAAGG,MAAM,GAAG,CAA7C;AACA,MAAI;AAACK,IAAAA,KAAD;AAAQC,IAAAA,MAAR;AAAgBC,IAAAA;AAAhB,MAAwBR,IAA5B;;AACA,MAAIQ,IAAI,KAAKC,SAAb,EAAwB;AAEtB,UAAMC,KAAK,GAAGjB,IAAI,CAACC,GAAL,CAASY,KAAK,IAAKtB,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAAvB,CAAd,EAA2CuB,MAAM,IAAKvB,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAAvB,CAAjD,CAAd;AACAwB,IAAAA,IAAI,GAAGf,IAAI,CAACC,GAAL,CAASD,IAAI,CAACkB,IAAL,CAAUD,KAAV,CAAT,EAA2B,EAA3B,CAAP;AACD,GAJD,MAIO,IAAI,CAACJ,KAAD,IAAU,CAACC,MAAf,EAAuB;AAE5B,UAAMG,KAAK,GAAG,KAAKF,IAAnB;AACAF,IAAAA,KAAK,GAAGb,IAAI,CAACmB,KAAL,CAAWnB,IAAI,CAACoB,GAAL,CAAS7B,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAA3B,IAAkC0B,KAA7C,CAAR;AACAH,IAAAA,MAAM,GAAGd,IAAI,CAACmB,KAAL,CAAWnB,IAAI,CAACoB,GAAL,CAAS7B,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAA3B,IAAkC0B,KAA7C,CAAT;;AACA,QAAIJ,KAAK,GAAGD,OAAR,IAAmBE,MAAM,GAAGF,OAAhC,EAAyC;AACvC,YAAMS,CAAC,GAAGT,OAAO,GAAGZ,IAAI,CAACE,GAAL,CAASW,KAAT,EAAgBC,MAAhB,CAApB;AACAD,MAAAA,KAAK,GAAGb,IAAI,CAACmB,KAAL,CAAWN,KAAK,GAAGQ,CAAnB,CAAR;AACAP,MAAAA,MAAM,GAAGd,IAAI,CAACmB,KAAL,CAAWL,MAAM,GAAGO,CAApB,CAAT;AACAN,MAAAA,IAAI,IAAIf,IAAI,CAACkB,IAAL,CAAUG,CAAV,CAAR;AACD;AACF;;AAID,SAAOZ,YAAY,GACf,IAAIvB,mBAAJ,CAAwB;AACtBoC,IAAAA,CAAC,EAAEd,MADmB;AAEtBe,IAAAA,CAAC,EAAEf,MAFmB;AAGtBK,IAAAA,KAHsB;AAItBC,IAAAA,MAJsB;AAKtBU,IAAAA,SAAS,EAAEd,WAAW,CAAC,CAAD,CALA;AAMtBe,IAAAA,QAAQ,EAAEf,WAAW,CAAC,CAAD,CANC;AAOtBK,IAAAA,IAPsB;AAQtBW,IAAAA,YAAY,EAAE;AARQ,GAAxB,CADe,GAWf,IAAIvC,oBAAJ,CAAyB;AACvBmC,IAAAA,CAAC,EAAEd,MADoB;AAEvBe,IAAAA,CAAC,EAAEf,MAFoB;AAGvBK,IAAAA,KAHuB;AAIvBC,IAAAA,MAJuB;AAKvBa,IAAAA,MAAM,EAAEjB,WALe;AAMvBK,IAAAA,IANuB;AAOvBa,IAAAA,KAAK,EAAE;AAPgB,GAAzB,CAXJ;AAoBD;AAGD,OAAO,SAASC,iBAAT,CAA2BvC,QAA3B,EAA+CwC,MAA/C,EAAkF;AAEvF,MAAIC,mBAAJ;;AACA,MAAID,MAAM,IAAIA,MAAM,CAACE,MAAP,KAAkB,CAAhC,EAAmC;AACjC,UAAM,CAACC,IAAD,EAAOC,IAAP,IAAeJ,MAArB;AACA,UAAMK,OAAO,GAAG7C,QAAQ,CAACK,SAAT,CAAmB;AAACyC,MAAAA,CAAC,EAAEH;AAAJ,KAAnB,CAAhB;AACA,UAAMI,OAAO,GAAG/C,QAAQ,CAACK,SAAT,CAAmB;AAACyC,MAAAA,CAAC,EAAEF;AAAJ,KAAnB,CAAhB;AACAH,IAAAA,mBAAmB,GAAG,CACpB/B,IAAI,CAACC,GAAL,CAASkC,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CADoB,EAEpBrC,IAAI,CAACC,GAAL,CAASkC,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAFoB,EAGpBrC,IAAI,CAACE,GAAL,CAASiC,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAHoB,EAIpBrC,IAAI,CAACE,GAAL,CAASiC,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAJoB,CAAtB;AAMD,GAVD,MAUO;AACLN,IAAAA,mBAAmB,GAAGzC,QAAQ,CAACK,SAAT,EAAtB;AACD;;AAGD,QAAM2C,wBAAwB,GAAGhD,QAAQ,CAACO,eAAT,CAAyBkC,mBAAmB,CAACQ,KAApB,CAA0B,CAA1B,EAA6B,CAA7B,CAAzB,CAAjC;AACA,QAAMC,sBAAsB,GAAGlD,QAAQ,CAACO,eAAT,CAAyBkC,mBAAmB,CAACQ,KAApB,CAA0B,CAA1B,EAA6B,CAA7B,CAAzB,CAA/B;AACA,SAAO,CACLD,wBAAwB,CAAC,CAAD,CADnB,EAELA,wBAAwB,CAAC,CAAD,CAFnB,EAGLE,sBAAsB,CAAC,CAAD,CAHjB,EAILA,sBAAsB,CAAC,CAAD,CAJjB,CAAP;AAMD;AAMD,OAAO,SAASC,eAAT,CACL/C,WADK,EAELJ,QAFK,EAGLwC,MAHK,EAIG;AACR,MAAI,CAACpC,WAAL,EAAkB;AAChB,WAAO,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAAP;AACD;;AAED,QAAMgD,cAAc,GAAGb,iBAAiB,CAACvC,QAAD,EAAWwC,MAAX,CAAxC;AAGA,QAAMa,YAAY,GAAGC,YAAY,CAACF,cAAD,CAAjC;;AAIA,MACEhD,WAAW,CAAC,CAAD,CAAX,GAAiBA,WAAW,CAAC,CAAD,CAA5B,IAAmCiD,YAAY,CAAC,CAAD,CAAZ,GAAkBA,YAAY,CAAC,CAAD,CAAjE,IACAjD,WAAW,CAAC,CAAD,CAAX,GAAiBA,WAAW,CAAC,CAAD,CAA5B,IAAmCiD,YAAY,CAAC,CAAD,CAAZ,GAAkBA,YAAY,CAAC,CAAD,CAFnE,EAGE;AACA,WAAOjD,WAAP;AACD;;AAQD,SAAO,CACLM,IAAI,CAACE,GAAL,CAASR,WAAW,CAAC,CAAD,CAApB,EAAyBiD,YAAY,CAAC,CAAD,CAArC,CADK,EAEL3C,IAAI,CAACE,GAAL,CAASR,WAAW,CAAC,CAAD,CAApB,EAAyBiD,YAAY,CAAC,CAAD,CAArC,CAFK,EAGL3C,IAAI,CAACC,GAAL,CAASP,WAAW,CAAC,CAAD,CAApB,EAAyBiD,YAAY,CAAC,CAAD,CAArC,CAHK,EAIL3C,IAAI,CAACC,GAAL,CAASP,WAAW,CAAC,CAAD,CAApB,EAAyBiD,YAAY,CAAC,CAAD,CAArC,CAJK,CAAP;AAMD;;AAED,SAASC,YAAT,CAAsBrD,MAAtB,EAA8C;AAC5C,QAAMsD,EAAE,GAAGtD,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAA7B;AACA,QAAMuD,EAAE,GAAGvD,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAA7B;AACA,QAAMwD,OAAO,GAAG,CAACxD,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAAnB,IAA0B,CAA1C;AACA,QAAMyD,OAAO,GAAG,CAACzD,MAAM,CAAC,CAAD,CAAN,GAAYA,MAAM,CAAC,CAAD,CAAnB,IAA0B,CAA1C;AACA,SAAO,CAACwD,OAAO,GAAGF,EAAX,EAAeG,OAAO,GAAGF,EAAzB,EAA6BC,OAAO,GAAGF,EAAvC,EAA2CG,OAAO,GAAGF,EAArD,CAAP;AACD","sourcesContent":["import {WebMercatorViewport, OrthographicViewport} from '@deck.gl/core';\nimport type {Layer, Viewport} from '@deck.gl/core';\n\n/** Bounds in CARTESIAN coordinates */\nexport type Bounds = [minX: number, minY: number, maxX: number, maxY: number];\n\n/*\n * Compute the union of bounds from multiple layers\n * Returns bounds in CARTESIAN coordinates\n */\nexport function joinLayerBounds(\n /** The layers to combine */\n layers: Layer[],\n /** A Viewport instance that is used to determine the type of the view */\n viewport: Viewport\n): Bounds | null {\n // Join the bounds of layer data\n const bounds: Bounds = [Infinity, Infinity, -Infinity, -Infinity];\n for (const layer of layers) {\n const layerBounds = layer.getBounds();\n if (layerBounds) {\n const bottomLeftCommon = layer.projectPosition(layerBounds[0], {viewport, autoOffset: false});\n const topRightCommon = layer.projectPosition(layerBounds[1], {viewport, autoOffset: false});\n\n bounds[0] = Math.min(bounds[0], bottomLeftCommon[0]);\n bounds[1] = Math.min(bounds[1], bottomLeftCommon[1]);\n bounds[2] = Math.max(bounds[2], topRightCommon[0]);\n bounds[3] = Math.max(bounds[3], topRightCommon[1]);\n }\n }\n\n if (Number.isFinite(bounds[0])) {\n return bounds;\n }\n return null;\n}\n\nconst MAX_VIEWPORT_SIZE = 2048;\n\n/** Construct a viewport that just covers the target bounds. Used for rendering to common space indexed texture. */\nexport function makeViewport(opts: {\n /** The cartesian bounds of layers that will render into this texture */\n bounds: Bounds;\n /** Target width. If not specified, will be deduced from zoom */\n width?: number;\n /** Target height. If not specified, will be deduced from zoom */\n height?: number;\n /** Target zoom. If not specified, will be deduced from width and height */\n zoom?: number;\n /** Border around the viewport in pixels */\n border?: number;\n /** A viewport used to determine the output type */\n viewport: Viewport;\n}): Viewport | null {\n const {bounds, viewport, border = 0} = opts;\n const {isGeospatial} = viewport;\n\n if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {\n return null;\n }\n\n const centerWorld = viewport.unprojectPosition([\n (bounds[0] + bounds[2]) / 2,\n (bounds[1] + bounds[3]) / 2,\n 0\n ]);\n\n const maxSize = MAX_VIEWPORT_SIZE - border * 2;\n let {width, height, zoom} = opts;\n if (zoom === undefined) {\n // Use width and height to determine zoom\n const scale = Math.min(width! / (bounds[2] - bounds[0]), height! / (bounds[3] - bounds[1]));\n zoom = Math.min(Math.log2(scale), 20);\n } else if (!width || !height) {\n // Use zoom to determine width and height\n const scale = 2 ** zoom;\n width = Math.round(Math.abs(bounds[2] - bounds[0]) * scale);\n height = Math.round(Math.abs(bounds[3] - bounds[1]) * scale);\n if (width > maxSize || height > maxSize) {\n const r = maxSize / Math.max(width, height);\n width = Math.round(width * r);\n height = Math.round(height * r);\n zoom += Math.log2(r);\n }\n }\n\n // TODO - find a more generic way to construct this viewport\n // Geospatial viewports may not be web-mercator\n return isGeospatial\n ? new WebMercatorViewport({\n x: border,\n y: border,\n width,\n height,\n longitude: centerWorld[0],\n latitude: centerWorld[1],\n zoom,\n orthographic: true\n })\n : new OrthographicViewport({\n x: border,\n y: border,\n width,\n height,\n target: centerWorld,\n zoom,\n flipY: false\n });\n}\n\n/** Returns viewport bounds in CARTESIAN coordinates */\nexport function getViewportBounds(viewport: Viewport, zRange?: [number, number]): Bounds {\n // Viewport bounds in world coordinates\n let viewportBoundsWorld: Bounds;\n if (zRange && zRange.length === 2) {\n const [minZ, maxZ] = zRange;\n const bounds0 = viewport.getBounds({z: minZ});\n const bounds1 = viewport.getBounds({z: maxZ});\n viewportBoundsWorld = [\n Math.min(bounds0[0], bounds1[0]),\n Math.min(bounds0[1], bounds1[1]),\n Math.max(bounds0[2], bounds1[2]),\n Math.max(bounds0[3], bounds1[3])\n ];\n } else {\n viewportBoundsWorld = viewport.getBounds();\n }\n\n // Viewport bounds in cartesian coordinates\n const viewportBottomLeftCommon = viewport.projectPosition(viewportBoundsWorld.slice(0, 2));\n const viewportTopRightCommon = viewport.projectPosition(viewportBoundsWorld.slice(2, 4));\n return [\n viewportBottomLeftCommon[0],\n viewportBottomLeftCommon[1],\n viewportTopRightCommon[0],\n viewportTopRightCommon[1]\n ];\n}\n\n/*\n * Determine the common space bounds that best cover the given data for the given viewport\n * Returns bounds in CARTESIAN coordinates\n */\nexport function getRenderBounds(\n layerBounds: Bounds,\n viewport: Viewport,\n zRange?: [number, number]\n): Bounds {\n if (!layerBounds) {\n return [0, 0, 1, 1];\n }\n\n const viewportBounds = getViewportBounds(viewport, zRange);\n // Expand viewport bounds by 2X. Heurestically chosen to avoid masking\n // errors when mask is partially out of view\n const paddedBounds = doubleBounds(viewportBounds);\n\n // When bounds of the layers are smaller than the viewport bounds simply use\n // mask bounds, so as to maximize resolution & avoid rerenders\n if (\n layerBounds[2] - layerBounds[0] <= paddedBounds[2] - paddedBounds[0] &&\n layerBounds[3] - layerBounds[1] <= paddedBounds[3] - paddedBounds[1]\n ) {\n return layerBounds;\n }\n\n // As viewport shrinks, to avoid pixelation along mask edges\n // we need to reduce the bounds and only render the visible portion\n // of the mask.\n // We pad the viewport bounds to capture the section\n // of the mask just outside the viewport to correctly maskByInstance.\n // Intersect mask & padded viewport bounds\n return [\n Math.max(layerBounds[0], paddedBounds[0]),\n Math.max(layerBounds[1], paddedBounds[1]),\n Math.min(layerBounds[2], paddedBounds[2]),\n Math.min(layerBounds[3], paddedBounds[3])\n ];\n}\n\nfunction doubleBounds(bounds: Bounds): Bounds {\n const dx = bounds[2] - bounds[0];\n const dy = bounds[3] - bounds[1];\n const centerX = (bounds[0] + bounds[2]) / 2;\n const centerY = (bounds[1] + bounds[3]) / 2;\n return [centerX - dx, centerY - dy, centerX + dx, centerY + dy];\n}\n"],"file":"projection-utils.js"}
|
package/dist/esm/mask/utils.js
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { OrthographicView, WebMercatorViewport, log } from '@deck.gl/core';
|
|
2
|
-
import { fitBounds } from '@math.gl/web-mercator';
|
|
3
|
-
export function getMaskBounds({
|
|
4
|
-
layers,
|
|
5
|
-
viewport
|
|
6
|
-
}) {
|
|
7
|
-
let bounds = null;
|
|
8
|
-
|
|
9
|
-
for (const layer of layers) {
|
|
10
|
-
const subLayerBounds = layer.getBounds();
|
|
11
|
-
|
|
12
|
-
if (subLayerBounds) {
|
|
13
|
-
if (bounds) {
|
|
14
|
-
bounds[0] = Math.min(bounds[0], subLayerBounds[0][0]);
|
|
15
|
-
bounds[1] = Math.min(bounds[1], subLayerBounds[0][1]);
|
|
16
|
-
bounds[2] = Math.max(bounds[2], subLayerBounds[1][0]);
|
|
17
|
-
bounds[3] = Math.max(bounds[3], subLayerBounds[1][1]);
|
|
18
|
-
} else {
|
|
19
|
-
bounds = [subLayerBounds[0][0], subLayerBounds[0][1], subLayerBounds[1][0], subLayerBounds[1][1]];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const viewportBounds = viewport.getBounds();
|
|
25
|
-
|
|
26
|
-
if (!bounds) {
|
|
27
|
-
return viewportBounds;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const paddedBounds = _doubleBounds(viewportBounds);
|
|
31
|
-
|
|
32
|
-
if (bounds[2] - bounds[0] < paddedBounds[2] - paddedBounds[0] || bounds[3] - bounds[1] < paddedBounds[3] - paddedBounds[1]) {
|
|
33
|
-
return bounds;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
bounds[0] = Math.max(bounds[0], paddedBounds[0]);
|
|
37
|
-
bounds[1] = Math.max(bounds[1], paddedBounds[1]);
|
|
38
|
-
bounds[2] = Math.min(bounds[2], paddedBounds[2]);
|
|
39
|
-
bounds[3] = Math.min(bounds[3], paddedBounds[3]);
|
|
40
|
-
return bounds;
|
|
41
|
-
}
|
|
42
|
-
export function getMaskViewport({
|
|
43
|
-
bounds,
|
|
44
|
-
viewport,
|
|
45
|
-
width,
|
|
46
|
-
height
|
|
47
|
-
}) {
|
|
48
|
-
if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (viewport.resolution !== undefined) {
|
|
53
|
-
log.warn('MaskExtension is not supported in GlobeView')();
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const padding = 1;
|
|
58
|
-
width -= padding * 2;
|
|
59
|
-
height -= padding * 2;
|
|
60
|
-
|
|
61
|
-
if (viewport.isGeospatial) {
|
|
62
|
-
const {
|
|
63
|
-
longitude,
|
|
64
|
-
latitude,
|
|
65
|
-
zoom
|
|
66
|
-
} = fitBounds({
|
|
67
|
-
width,
|
|
68
|
-
height,
|
|
69
|
-
bounds: [[bounds[0], bounds[1]], [bounds[2], bounds[3]]],
|
|
70
|
-
maxZoom: 20
|
|
71
|
-
});
|
|
72
|
-
return new WebMercatorViewport({
|
|
73
|
-
longitude,
|
|
74
|
-
latitude,
|
|
75
|
-
zoom,
|
|
76
|
-
x: padding,
|
|
77
|
-
y: padding,
|
|
78
|
-
width,
|
|
79
|
-
height
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const center = [(bounds[0] + bounds[2]) / 2, (bounds[1] + bounds[3]) / 2, 0];
|
|
84
|
-
const scale = Math.min(1048576, width / (bounds[2] - bounds[0]), height / (bounds[3] - bounds[1]));
|
|
85
|
-
return new OrthographicView({
|
|
86
|
-
x: padding,
|
|
87
|
-
y: padding
|
|
88
|
-
}).makeViewport({
|
|
89
|
-
width,
|
|
90
|
-
height,
|
|
91
|
-
viewState: {
|
|
92
|
-
target: center,
|
|
93
|
-
zoom: Math.log2(scale)
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function _doubleBounds(bounds) {
|
|
99
|
-
const size = {
|
|
100
|
-
x: bounds[2] - bounds[0],
|
|
101
|
-
y: bounds[3] - bounds[1]
|
|
102
|
-
};
|
|
103
|
-
const center = {
|
|
104
|
-
x: bounds[0] + 0.5 * size.x,
|
|
105
|
-
y: bounds[1] + 0.5 * size.y
|
|
106
|
-
};
|
|
107
|
-
return [center.x - size.x, center.y - size.y, center.x + size.x, center.y + size.y];
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mask/utils.ts"],"names":["OrthographicView","WebMercatorViewport","log","fitBounds","getMaskBounds","layers","viewport","bounds","layer","subLayerBounds","getBounds","Math","min","max","viewportBounds","paddedBounds","_doubleBounds","getMaskViewport","width","height","resolution","undefined","warn","padding","isGeospatial","longitude","latitude","zoom","maxZoom","x","y","center","scale","makeViewport","viewState","target","log2","size"],"mappings":"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","sourcesContent":["import {OrthographicView, WebMercatorViewport, log, Layer, Viewport} from '@deck.gl/core';\nimport {fitBounds} from '@math.gl/web-mercator';\n\nexport type MaskBounds = [number, number, number, number];\n\n/*\n * Compute the bounds of the mask in world space, such that it covers an\n * area currently visible (extended by a buffer) or the area of the masking\n * data, whichever is smaller\n */\nexport function getMaskBounds({\n layers,\n viewport\n}: {\n layers: Layer[];\n viewport: Viewport;\n}): MaskBounds {\n // Join the bounds of layer data\n let bounds: MaskBounds | null = null;\n for (const layer of layers) {\n const subLayerBounds = layer.getBounds();\n if (subLayerBounds) {\n if (bounds) {\n bounds[0] = Math.min(bounds[0], subLayerBounds[0][0]);\n bounds[1] = Math.min(bounds[1], subLayerBounds[0][1]);\n bounds[2] = Math.max(bounds[2], subLayerBounds[1][0]);\n bounds[3] = Math.max(bounds[3], subLayerBounds[1][1]);\n } else {\n bounds = [\n subLayerBounds[0][0],\n subLayerBounds[0][1],\n subLayerBounds[1][0],\n subLayerBounds[1][1]\n ];\n }\n }\n }\n const viewportBounds = viewport.getBounds();\n if (!bounds) {\n return viewportBounds;\n }\n\n // Expand viewport bounds by 2X. Heurestically chosen to avoid masking\n // errors when mask is partially out of view\n const paddedBounds = _doubleBounds(viewportBounds);\n\n // When bounds of the mask are smaller than the viewport bounds simply use\n // mask bounds, so as to maximize resolution & avoid mask rerenders\n if (\n bounds[2] - bounds[0] < paddedBounds[2] - paddedBounds[0] ||\n bounds[3] - bounds[1] < paddedBounds[3] - paddedBounds[1]\n ) {\n return bounds;\n }\n\n // As viewport shrinks, to avoid pixelation along mask edges\n // we need to reduce the bounds and only render the visible portion\n // of the mask.\n // We pad the viewport bounds to capture the section\n // of the mask just outside the viewport to correctly maskByInstance.\n // Intersect mask & padded viewport bounds\n bounds[0] = Math.max(bounds[0], paddedBounds[0]);\n bounds[1] = Math.max(bounds[1], paddedBounds[1]);\n bounds[2] = Math.min(bounds[2], paddedBounds[2]);\n bounds[3] = Math.min(bounds[3], paddedBounds[3]);\n return bounds;\n}\n\n/*\n * Compute viewport to render the mask into, covering the given bounds\n */\nexport function getMaskViewport({\n bounds,\n viewport,\n width,\n height\n}: {\n bounds: MaskBounds;\n viewport: Viewport;\n width: number;\n height: number;\n}): Viewport | null {\n if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {\n return null;\n }\n\n if (viewport.resolution !== undefined) {\n log.warn('MaskExtension is not supported in GlobeView')();\n return null;\n }\n\n // Single pixel border to prevent mask bleeding at edge of texture\n const padding = 1;\n width -= padding * 2;\n height -= padding * 2;\n\n if (viewport.isGeospatial) {\n const {longitude, latitude, zoom} = fitBounds({\n width,\n height,\n bounds: [\n [bounds[0], bounds[1]],\n [bounds[2], bounds[3]]\n ],\n maxZoom: 20\n });\n return new WebMercatorViewport({\n longitude,\n latitude,\n zoom,\n x: padding,\n y: padding,\n width,\n height\n });\n }\n\n const center = [(bounds[0] + bounds[2]) / 2, (bounds[1] + bounds[3]) / 2, 0];\n const scale = Math.min(\n 1048576, // maxZoom of 20: Math.pow(2, 20) = 1048576\n width / (bounds[2] - bounds[0]),\n height / (bounds[3] - bounds[1])\n );\n\n return new OrthographicView({\n x: padding,\n y: padding\n }).makeViewport({\n width,\n height,\n viewState: {\n target: center,\n zoom: Math.log2(scale)\n }\n });\n}\n\nfunction _doubleBounds(bounds: MaskBounds): MaskBounds {\n const size = {\n x: bounds[2] - bounds[0],\n y: bounds[3] - bounds[1]\n };\n const center = {\n x: bounds[0] + 0.5 * size.x,\n y: bounds[1] + 0.5 * size.y\n };\n return [center.x - size.x, center.y - size.y, center.x + size.x, center.y + size.y];\n}\n"],"file":"utils.js"}
|
package/src/collide/collide.ts
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import {Accessor, Layer, LayerContext, LayerExtension} from '@deck.gl/core';
|
|
2
|
-
import collide from './shader-module';
|
|
3
|
-
import CollideEffect from './collide-effect';
|
|
4
|
-
|
|
5
|
-
const defaultProps = {
|
|
6
|
-
getCollidePriority: {type: 'accessor', value: 0},
|
|
7
|
-
collideEnabled: true,
|
|
8
|
-
collideGroup: {type: 'string', value: 'default'},
|
|
9
|
-
collideTestProps: {}
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export type CollideExtensionProps<DataT = any> = {
|
|
13
|
-
/**
|
|
14
|
-
* Accessor for collision priority. Must return a number in the range -1000 -> 1000. Features with higher values are shown preferentially.
|
|
15
|
-
*/
|
|
16
|
-
getCollidePriority?: Accessor<DataT, number>;
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Enable/disable collisions. If collisions are disabled, all objects are rendered.
|
|
20
|
-
* @default true
|
|
21
|
-
*/
|
|
22
|
-
collideEnabled: boolean;
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Collision group this layer belongs to. If it is not set, the 'default' collision group is used
|
|
26
|
-
*/
|
|
27
|
-
collideGroup?: string;
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Props to override when rendering collision map
|
|
31
|
-
*/
|
|
32
|
-
collideTestProps?: {};
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/** Allows layers to hide overlapping objects. */
|
|
36
|
-
export default class CollideExtension extends LayerExtension {
|
|
37
|
-
static defaultProps = defaultProps;
|
|
38
|
-
static extensionName = 'CollideExtension';
|
|
39
|
-
|
|
40
|
-
getShaders(this: Layer<CollideExtensionProps>): any {
|
|
41
|
-
return {modules: [collide]};
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/* eslint-disable camelcase */
|
|
45
|
-
draw(this: Layer<CollideExtensionProps>, {uniforms, context, moduleParameters}: any) {
|
|
46
|
-
const {collideEnabled} = this.props;
|
|
47
|
-
const {collideFBO, drawToCollideMap} = moduleParameters;
|
|
48
|
-
const enabled = collideEnabled && Boolean(collideFBO);
|
|
49
|
-
uniforms.collide_enabled = enabled;
|
|
50
|
-
|
|
51
|
-
if (drawToCollideMap) {
|
|
52
|
-
// Override any props with those defined in collideTestProps
|
|
53
|
-
// @ts-ignore
|
|
54
|
-
this.props = this.clone(this.props.collideTestProps).props;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
initializeState(this: Layer<CollideExtensionProps>, context: LayerContext, extension: this) {
|
|
59
|
-
if (this.getAttributeManager() === null) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
this.context.deck?._addDefaultEffect(new CollideEffect());
|
|
63
|
-
const attributeManager = this.getAttributeManager();
|
|
64
|
-
attributeManager!.add({
|
|
65
|
-
collidePriorities: {
|
|
66
|
-
size: 1,
|
|
67
|
-
accessor: 'getCollidePriority',
|
|
68
|
-
shaderAttributes: {
|
|
69
|
-
collidePriorities: {divisor: 0},
|
|
70
|
-
instanceCollidePriorities: {divisor: 1}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
getNeedsPickingBuffer(this: Layer<CollideExtensionProps>): boolean {
|
|
77
|
-
return this.props.collideEnabled;
|
|
78
|
-
}
|
|
79
|
-
}
|