@deck.gl/extensions 8.9.0-beta.1 → 8.9.0-beta.2
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 +6 -6
- package/dist/es5/clip/clip.js.map +1 -1
- package/dist/es5/collide/collide-effect.js +3 -2
- package/dist/es5/collide/collide-effect.js.map +1 -1
- package/dist/es5/data-filter/shader-module.js.map +1 -1
- package/dist/es5/mask/mask-effect.js +2 -2
- package/dist/es5/mask/mask-effect.js.map +1 -1
- package/dist/es5/terrain/terrain-effect.js +2 -2
- package/dist/es5/terrain/terrain-effect.js.map +1 -1
- package/dist/esm/clip/clip.js.map +1 -1
- package/dist/esm/collide/collide-effect.js +3 -2
- package/dist/esm/collide/collide-effect.js.map +1 -1
- package/dist/esm/data-filter/shader-module.js.map +1 -1
- package/dist/esm/mask/mask-effect.js +2 -2
- package/dist/esm/mask/mask-effect.js.map +1 -1
- package/dist/esm/terrain/terrain-effect.js +1 -2
- package/dist/esm/terrain/terrain-effect.js.map +1 -1
- package/dist.min.js +3 -3
- package/package.json +2 -2
- package/src/clip/clip.ts +1 -1
- package/src/collide/collide-effect.ts +3 -2
- package/src/data-filter/shader-module.ts +1 -1
- package/src/mask/mask-effect.ts +2 -2
- package/src/terrain/terrain-effect.ts +1 -2
- package/typed/clip/clip.d.ts +4 -1
- package/typed/clip/clip.d.ts.map +1 -1
- package/typed/collide/collide-effect.d.ts +1 -1
- package/typed/collide/collide-effect.d.ts.map +1 -1
- package/typed/data-filter/shader-module.d.ts.map +1 -1
- package/typed/mask/mask-effect.d.ts +1 -1
- package/typed/mask/mask-effect.d.ts.map +1 -1
- package/typed/terrain/height-map.d.ts +1 -1
- package/typed/terrain/terrain-effect.d.ts.map +1 -1
package/dist/dist.dev.js
CHANGED
|
@@ -2521,7 +2521,7 @@ float collide_isVisible(vec2 texCoords, vec3 pickingColor) {
|
|
|
2521
2521
|
viewports,
|
|
2522
2522
|
onViewportActive,
|
|
2523
2523
|
views,
|
|
2524
|
-
|
|
2524
|
+
isPicking
|
|
2525
2525
|
}) {
|
|
2526
2526
|
let didRender = false;
|
|
2527
2527
|
if (!this.dummyMaskMap) {
|
|
@@ -2530,7 +2530,7 @@ float collide_isVisible(vec2 texCoords, vec3 pickingColor) {
|
|
|
2530
2530
|
height: 1
|
|
2531
2531
|
});
|
|
2532
2532
|
}
|
|
2533
|
-
if (
|
|
2533
|
+
if (isPicking) {
|
|
2534
2534
|
return {
|
|
2535
2535
|
didRender
|
|
2536
2536
|
};
|
|
@@ -2703,7 +2703,7 @@ float collide_isVisible(vec2 texCoords, vec3 pickingColor) {
|
|
|
2703
2703
|
viewports,
|
|
2704
2704
|
onViewportActive,
|
|
2705
2705
|
views,
|
|
2706
|
-
|
|
2706
|
+
isPicking,
|
|
2707
2707
|
preRenderStats = {}
|
|
2708
2708
|
}) {
|
|
2709
2709
|
if (!this.dummyCollideMap) {
|
|
@@ -2712,7 +2712,7 @@ float collide_isVisible(vec2 texCoords, vec3 pickingColor) {
|
|
|
2712
2712
|
height: 1
|
|
2713
2713
|
});
|
|
2714
2714
|
}
|
|
2715
|
-
if (
|
|
2715
|
+
if (isPicking) {
|
|
2716
2716
|
return;
|
|
2717
2717
|
}
|
|
2718
2718
|
const collideLayers = layers.filter(
|
|
@@ -2776,6 +2776,7 @@ float collide_isVisible(vec2 texCoords, vec3 pickingColor) {
|
|
|
2776
2776
|
const collideFBO = this.collideFBOs[collideGroup];
|
|
2777
2777
|
this.collidePass.renderCollideMap(collideFBO, {
|
|
2778
2778
|
pass: "collide",
|
|
2779
|
+
isPicking: true,
|
|
2779
2780
|
layers: renderInfo.layers,
|
|
2780
2781
|
effects,
|
|
2781
2782
|
layerFilter,
|
|
@@ -3767,9 +3768,8 @@ if ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_US
|
|
|
3767
3768
|
}
|
|
3768
3769
|
const {
|
|
3769
3770
|
viewports,
|
|
3770
|
-
|
|
3771
|
+
isPicking = false
|
|
3771
3772
|
} = opts;
|
|
3772
|
-
const isPicking = pass.startsWith("picking");
|
|
3773
3773
|
this.isPicking = isPicking;
|
|
3774
3774
|
this.isDrapingEnabled = true;
|
|
3775
3775
|
const viewport = viewports[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/clip/clip.ts"],"names":["defaultProps","clipBounds","clipByInstance","undefined","shaderFunction","shaderModuleVs","name","vs","injectionVs","shaderModuleFs","fs","injectionFs","ClipExtension","getAttributeManager","attributes","props","Boolean","state","modules","inject","uniforms","clip_bounds","corner0","projectPosition","corner1","Math","min","max","LayerExtension"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoBA;;;;;;AAIA,IAAMA,YAAY,GAAG;AACnBC,EAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADO;AAEnBC,EAAAA,cAAc,EAAEC;AAFG,CAArB;AAiBA,IAAMC,cAAc,oNAApB;AAYA,IAAMC,cAA4B,GAAG;AACnCC,EAAAA,IAAI,EAAE,SAD6B;AAEnCC,EAAAA,EAAE,EAAEH;AAF+B,CAArC;AAKA,IAAMI,WAAW,GAAG;AAClB,iDADkB;AAIlB,6GAJkB;AAOlB,iDAPkB;AAUlB;AAVkB,CAApB;AAmBA,IAAMC,cAA4B,GAAG;AACnCH,EAAAA,IAAI,EAAE,SAD6B;AAEnCI,EAAAA,EAAE,EAAEN;AAF+B,CAArC;AAKA,IAAMO,WAAW,GAAG;AAClB,qDADkB;AAIlB,qFAJkB;AAOlB,qDAPkB;AAUlB;AAVkB,CAApB;;IAgBqBC,a;;;;;;;;;;;;WAInB,sBAA4C;AAM1C,UAAIV,cAAc,IAAG,uBAAuB,KAAKW,mBAAL,GAA2BC,UAArD,CAAlB;;AAEA,UAAI,KAAKC,KAAL,CAAWb,cAAX,KAA8BC,SAAlC,EAA6C;AAC3CD,QAAAA,cAAc,GAAGc,OAAO,CAAC,KAAKD,KAAL,CAAWb,cAAZ,CAAxB;AACD;;AACD,WAAKe,KAAL,CAAWf,cAAX,GAA4BA,cAA5B;AAEA,aAAOA,cAAc,GACjB;AACEgB,QAAAA,OAAO,EAAE,CAACb,cAAD,CADX;AAEEc,QAAAA,MAAM,EAAEX;AAFV,OADiB,GAKjB;AACEU,QAAAA,OAAO,EAAE,CAACT,cAAD,CADX;AAEEU,QAAAA,MAAM,EAAER;AAFV,OALJ;AASD;;;WAGD,oBAAuE;AAAA,UAAtBS,QAAsB,QAAtBA,QAAsB;AACrE,UAAOnB,UAAP,GAAqB,KAAKc,KAA1B,CAAOd,UAAP;;AACA,UAAI,KAAKgB,KAAL,CAAWf,cAAf,EAA+B;AAC7BkB,QAAAA,QAAQ,CAACC,WAAT,GAAuBpB,UAAvB;AACD,OAFD,MAEO;AACL,YAAMqB,OAAO,GAAG,KAAKC,eAAL,CAAqB,CAACtB,UAAU,CAAC,CAAD,CAAX,EAAgBA,UAAU,CAAC,CAAD,CAA1B,EAA+B,CAA/B,CAArB,CAAhB;AACA,YAAMuB,OAAO,GAAG,KAAKD,eAAL,CAAqB,CAACtB,UAAU,CAAC,CAAD,CAAX,EAAgBA,UAAU,CAAC,CAAD,CAA1B,EAA+B,CAA/B,CAArB,CAAhB;AAEAmB,QAAAA,QAAQ,CAACC,WAAT,GAAuB,CACrBI,IAAI,CAACC,GAAL,CAASJ,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CADqB,EAErBC,IAAI,CAACC,GAAL,CAASJ,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAFqB,EAGrBC,IAAI,CAACE,GAAL,CAASL,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAHqB,EAIrBC,IAAI,CAACE,GAAL,CAASL,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAJqB,CAAvB;AAMD;AACF;;;EA5CwCI,oB;;;8BAAtBhB,a,
|
|
1
|
+
{"version":3,"sources":["../../../src/clip/clip.ts"],"names":["defaultProps","clipBounds","clipByInstance","undefined","shaderFunction","shaderModuleVs","name","vs","injectionVs","shaderModuleFs","fs","injectionFs","ClipExtension","getAttributeManager","attributes","props","Boolean","state","modules","inject","uniforms","clip_bounds","corner0","projectPosition","corner1","Math","min","max","LayerExtension"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoBA;;;;;;AAIA,IAAMA,YAAY,GAAG;AACnBC,EAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADO;AAEnBC,EAAAA,cAAc,EAAEC;AAFG,CAArB;AAiBA,IAAMC,cAAc,oNAApB;AAYA,IAAMC,cAA4B,GAAG;AACnCC,EAAAA,IAAI,EAAE,SAD6B;AAEnCC,EAAAA,EAAE,EAAEH;AAF+B,CAArC;AAKA,IAAMI,WAAW,GAAG;AAClB,iDADkB;AAIlB,6GAJkB;AAOlB,iDAPkB;AAUlB;AAVkB,CAApB;AAmBA,IAAMC,cAA4B,GAAG;AACnCH,EAAAA,IAAI,EAAE,SAD6B;AAEnCI,EAAAA,EAAE,EAAEN;AAF+B,CAArC;AAKA,IAAMO,WAAW,GAAG;AAClB,qDADkB;AAIlB,qFAJkB;AAOlB,qDAPkB;AAUlB;AAVkB,CAApB;;IAgBqBC,a;;;;;;;;;;;;WAInB,sBAA4C;AAM1C,UAAIV,cAAc,IAAG,uBAAuB,KAAKW,mBAAL,GAA2BC,UAArD,CAAlB;;AAEA,UAAI,KAAKC,KAAL,CAAWb,cAAX,KAA8BC,SAAlC,EAA6C;AAC3CD,QAAAA,cAAc,GAAGc,OAAO,CAAC,KAAKD,KAAL,CAAWb,cAAZ,CAAxB;AACD;;AACD,WAAKe,KAAL,CAAWf,cAAX,GAA4BA,cAA5B;AAEA,aAAOA,cAAc,GACjB;AACEgB,QAAAA,OAAO,EAAE,CAACb,cAAD,CADX;AAEEc,QAAAA,MAAM,EAAEX;AAFV,OADiB,GAKjB;AACEU,QAAAA,OAAO,EAAE,CAACT,cAAD,CADX;AAEEU,QAAAA,MAAM,EAAER;AAFV,OALJ;AASD;;;WAGD,oBAAuE;AAAA,UAAtBS,QAAsB,QAAtBA,QAAsB;AACrE,UAAOnB,UAAP,GAAqB,KAAKc,KAA1B,CAAOd,UAAP;;AACA,UAAI,KAAKgB,KAAL,CAAWf,cAAf,EAA+B;AAC7BkB,QAAAA,QAAQ,CAACC,WAAT,GAAuBpB,UAAvB;AACD,OAFD,MAEO;AACL,YAAMqB,OAAO,GAAG,KAAKC,eAAL,CAAqB,CAACtB,UAAU,CAAC,CAAD,CAAX,EAAgBA,UAAU,CAAC,CAAD,CAA1B,EAA+B,CAA/B,CAArB,CAAhB;AACA,YAAMuB,OAAO,GAAG,KAAKD,eAAL,CAAqB,CAACtB,UAAU,CAAC,CAAD,CAAX,EAAgBA,UAAU,CAAC,CAAD,CAA1B,EAA+B,CAA/B,CAArB,CAAhB;AAEAmB,QAAAA,QAAQ,CAACC,WAAT,GAAuB,CACrBI,IAAI,CAACC,GAAL,CAASJ,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CADqB,EAErBC,IAAI,CAACC,GAAL,CAASJ,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAFqB,EAGrBC,IAAI,CAACE,GAAL,CAASL,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAHqB,EAIrBC,IAAI,CAACE,GAAL,CAASL,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAJqB,CAAvB;AAMD;AACF;;;EA5CwCI,oB;;;8BAAtBhB,a,kBACGZ,Y;8BADHY,a,mBAEI,e","sourcesContent":["// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport {LayerExtension, _ShaderModule as ShaderModule} from '@deck.gl/core';\n\nimport type {Layer} from '@deck.gl/core';\n\nconst defaultProps = {\n clipBounds: [0, 0, 1, 1],\n clipByInstance: undefined\n};\n\nexport type ClipExtensionProps = {\n /** Rectangular bounds to be used for clipping the rendered region, in `[left, bottom, right, top]`.\n * @default [0, 0, 1, 1]\n */\n clipBounds?: [number, number, number, number];\n /**\n * Controls whether an object is clipped by its anchor (e.g. icon, point) or by its geometry (e.g. path, polygon).\n * If not specified, it is automatically deduced from the layer.\n */\n clipByInstance?: boolean;\n};\n\nconst shaderFunction = `\nuniform vec4 clip_bounds;\n\nbool clip_isInBounds(vec2 position) {\n return position.x >= clip_bounds[0] && position.y >= clip_bounds[1] && position.x < clip_bounds[2] && position.y < clip_bounds[3];\n}\n`;\n\n/*\n * The vertex-shader version clips geometries by their anchor position\n * e.g. ScatterplotLayer - show if the center of a circle is within bounds\n */\nconst shaderModuleVs: ShaderModule = {\n name: 'clip-vs',\n vs: shaderFunction\n};\n\nconst injectionVs = {\n 'vs:#decl': `\nvarying float clip_isVisible;\n`,\n 'vs:DECKGL_FILTER_GL_POSITION': `\n clip_isVisible = float(clip_isInBounds(geometry.worldPosition.xy));\n`,\n 'fs:#decl': `\nvarying float clip_isVisible;\n`,\n 'fs:DECKGL_FILTER_COLOR': `\n if (clip_isVisible < 0.5) discard;\n`\n};\n\n/*\n * The fragment-shader version clips pixels at the bounds\n * e.g. PolygonLayer - show the part of the polygon that intersect with the bounds\n */\nconst shaderModuleFs: ShaderModule = {\n name: 'clip-fs',\n fs: shaderFunction\n};\n\nconst injectionFs = {\n 'vs:#decl': `\nvarying vec2 clip_commonPosition;\n`,\n 'vs:DECKGL_FILTER_GL_POSITION': `\n clip_commonPosition = geometry.position.xy;\n`,\n 'fs:#decl': `\nvarying vec2 clip_commonPosition;\n`,\n 'fs:DECKGL_FILTER_COLOR': `\n if (!clip_isInBounds(clip_commonPosition)) discard;\n`\n};\n\n/** Adds support for clipping rendered layers by rectangular bounds. */\nexport default class ClipExtension extends LayerExtension {\n static defaultProps = defaultProps;\n static extensionName = 'ClipExtension';\n\n getShaders(this: Layer<ClipExtensionProps>) {\n // If `clipByInstance: true`, the entire object is shown/hidden based on its anchor position (done by vertex shader)\n // Otherwise, the object is trimmed by the clip bounds (done by fragment shader)\n\n // Default behavior: consider a layer instanced if it has attribute `instancePositions`\n // @ts-expect-error attributeManager is always defined for primitive layers\n let clipByInstance = 'instancePositions' in this.getAttributeManager().attributes;\n // Users can override by setting the `clipByInstance` prop\n if (this.props.clipByInstance !== undefined) {\n clipByInstance = Boolean(this.props.clipByInstance);\n }\n this.state.clipByInstance = clipByInstance;\n\n return clipByInstance\n ? {\n modules: [shaderModuleVs],\n inject: injectionVs\n }\n : {\n modules: [shaderModuleFs],\n inject: injectionFs\n };\n }\n\n /* eslint-disable camelcase */\n draw(this: Layer<Required<ClipExtensionProps>>, {uniforms}: any): void {\n const {clipBounds} = this.props;\n if (this.state.clipByInstance) {\n uniforms.clip_bounds = clipBounds;\n } else {\n const corner0 = this.projectPosition([clipBounds[0], clipBounds[1], 0]);\n const corner1 = this.projectPosition([clipBounds[2], clipBounds[3], 0]);\n\n uniforms.clip_bounds = [\n Math.min(corner0[0], corner1[0]),\n Math.min(corner0[1], corner1[1]),\n Math.max(corner0[0], corner1[0]),\n Math.max(corner0[1], corner1[1])\n ];\n }\n }\n}\n"],"file":"clip.js"}
|
|
@@ -56,7 +56,7 @@ var CollideEffect = function () {
|
|
|
56
56
|
viewports = _ref.viewports,
|
|
57
57
|
onViewportActive = _ref.onViewportActive,
|
|
58
58
|
views = _ref.views,
|
|
59
|
-
|
|
59
|
+
isPicking = _ref.isPicking,
|
|
60
60
|
_ref$preRenderStats = _ref.preRenderStats,
|
|
61
61
|
preRenderStats = _ref$preRenderStats === void 0 ? {} : _ref$preRenderStats;
|
|
62
62
|
|
|
@@ -67,7 +67,7 @@ var CollideEffect = function () {
|
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
if (
|
|
70
|
+
if (isPicking) {
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -143,6 +143,7 @@ var CollideEffect = function () {
|
|
|
143
143
|
var collideFBO = this.collideFBOs[collideGroup];
|
|
144
144
|
this.collidePass.renderCollideMap(collideFBO, {
|
|
145
145
|
pass: 'collide',
|
|
146
|
+
isPicking: true,
|
|
146
147
|
layers: renderInfo.layers,
|
|
147
148
|
effects: effects,
|
|
148
149
|
layerFilter: layerFilter,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collide/collide-effect.ts"],"names":["DOWNSCALE","CollideEffect","gl","allEffects","effects","layers","layerFilter","viewports","onViewportActive","views","pass","preRenderStats","dummyCollideMap","Texture2D","width","height","startsWith","collideLayers","filter","props","visible","collideEnabled","length","channels","collidePass","CollidePass","id","e","constructor","MaskEffect","maskEffectRendered","didRender","_groupByCollideGroup","viewport","viewportChanged","lastViewport","equals","collideGroup","collideFBO","collideFBOs","renderInfo","resize","canvas","_render","oldRenderInfo","needsRender","layerBounds","some","b","i","renderCollideMap","moduleParameters","devicePixelRatio","channelMap","layer","channelInfo","push","getBounds","Object","keys","createFBO","destroyFBO","delete","undefined","collideMap","parameters","depthBuffer","Renderbuffer","format","Framebuffer","attachments","fbo","values","attachment"],"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 pass,\n preRenderStats = {}\n }: PreRenderOptions\n ): void {\n if (!this.dummyCollideMap) {\n this.dummyCollideMap = new Texture2D(gl, {width: 1, height: 1});\n }\n\n if (pass.startsWith('picking')) {\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 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
|
+
{"version":3,"sources":["../../../src/collide/collide-effect.ts"],"names":["DOWNSCALE","CollideEffect","gl","allEffects","effects","layers","layerFilter","viewports","onViewportActive","views","isPicking","preRenderStats","dummyCollideMap","Texture2D","width","height","collideLayers","filter","props","visible","collideEnabled","length","channels","collidePass","CollidePass","id","e","constructor","MaskEffect","maskEffectRendered","didRender","_groupByCollideGroup","viewport","viewportChanged","lastViewport","equals","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","delete","undefined","collideMap","parameters","depthBuffer","Renderbuffer","format","Framebuffer","attachments","fbo","values","attachment"],"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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/data-filter/shader-module.ts"],"names":["vs","fs","getUniforms","opts","filterRange","filterEnabled","filterTransformSize","filterTransformColor","filterSoftRange","Number","isFinite","filter_min","filter_softMin","filter_softMax","filter_max","map","r","filter_enabled","filter_useSoftMargin","Boolean","filter_transformSize","filter_transformColor","getUniforms64","uniforms","min64High","Math","fround","filter_min64High","max64High","filter_max64High","x","i","inject","shaderModule","name","shaderModule64"],"mappings":"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","sourcesContent":["import {_ShaderModule as ShaderModule} from '@deck.gl/core
|
|
1
|
+
{"version":3,"sources":["../../../src/data-filter/shader-module.ts"],"names":["vs","fs","getUniforms","opts","filterRange","filterEnabled","filterTransformSize","filterTransformColor","filterSoftRange","Number","isFinite","filter_min","filter_softMin","filter_softMax","filter_max","map","r","filter_enabled","filter_useSoftMargin","Boolean","filter_transformSize","filter_transformColor","getUniforms64","uniforms","min64High","Math","fround","filter_min64High","max64High","filter_max64High","x","i","inject","shaderModule","name","shaderModule64"],"mappings":"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","sourcesContent":["import {_ShaderModule as ShaderModule} from '@deck.gl/core';\n\nimport type {DataFilterExtensionProps} from './data-filter';\n\n/*\n * data filter shader module\n */\nconst vs = `\nuniform DATAFILTER_TYPE filter_min;\nuniform DATAFILTER_TYPE filter_softMin;\nuniform DATAFILTER_TYPE filter_softMax;\nuniform DATAFILTER_TYPE filter_max;\nuniform bool filter_useSoftMargin;\nuniform bool filter_enabled;\nuniform bool filter_transformSize;\n\n#ifdef NON_INSTANCED_MODEL\n #define DATAFILTER_ATTRIB filterValues\n #define DATAFILTER_ATTRIB_64LOW filterValues64Low\n#else\n #define DATAFILTER_ATTRIB instanceFilterValues\n #define DATAFILTER_ATTRIB_64LOW instanceFilterValues64Low\n#endif\n\nattribute DATAFILTER_TYPE DATAFILTER_ATTRIB;\n#ifdef DATAFILTER_DOUBLE\n attribute DATAFILTER_TYPE DATAFILTER_ATTRIB_64LOW;\n\n uniform DATAFILTER_TYPE filter_min64High;\n uniform DATAFILTER_TYPE filter_max64High;\n#endif\n\nvarying float dataFilter_value;\n\nfloat dataFilter_reduceValue(float value) {\n return value;\n}\nfloat dataFilter_reduceValue(vec2 value) {\n return min(value.x, value.y);\n}\nfloat dataFilter_reduceValue(vec3 value) {\n return min(min(value.x, value.y), value.z);\n}\nfloat dataFilter_reduceValue(vec4 value) {\n return min(min(value.x, value.y), min(value.z, value.w));\n}\nvoid dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {\n if (filter_enabled) {\n if (filter_useSoftMargin) {\n dataFilter_value = dataFilter_reduceValue(\n smoothstep(filter_min, filter_softMin, valueFromMin) *\n (1.0 - smoothstep(filter_softMax, filter_max, valueFromMax))\n );\n } else {\n dataFilter_value = dataFilter_reduceValue(\n step(filter_min, valueFromMin) * step(valueFromMax, filter_max)\n );\n }\n } else {\n dataFilter_value = 1.0;\n }\n}\n`;\n\nconst fs = `\nuniform bool filter_transformColor;\nvarying float dataFilter_value;\n`;\n\ntype DataFilterModuleSettings = {\n extensions: any[]; // used to detect if layer props are present\n} & DataFilterExtensionProps;\n\n/* eslint-disable camelcase */\nfunction getUniforms(opts?: DataFilterModuleSettings | {}): Record<string, any> {\n if (!opts || !('extensions' in opts)) {\n return {};\n }\n const {\n filterRange = [-1, 1],\n filterEnabled = true,\n filterTransformSize = true,\n filterTransformColor = true\n } = opts;\n const filterSoftRange = opts.filterSoftRange || filterRange;\n\n return {\n ...(Number.isFinite(filterRange[0])\n ? {\n filter_min: filterRange[0],\n filter_softMin: filterSoftRange[0],\n filter_softMax: filterSoftRange[1],\n filter_max: filterRange[1]\n }\n : {\n filter_min: filterRange.map(r => r[0]),\n filter_softMin: filterSoftRange.map(r => r[0]),\n filter_softMax: filterSoftRange.map(r => r[1]),\n filter_max: filterRange.map(r => r[1])\n }),\n filter_enabled: filterEnabled,\n filter_useSoftMargin: Boolean(opts.filterSoftRange),\n filter_transformSize: filterEnabled && filterTransformSize,\n filter_transformColor: filterEnabled && filterTransformColor\n };\n}\n\nfunction getUniforms64(opts?: DataFilterModuleSettings | {}): Record<string, any> {\n if (!opts || !('extensions' in opts)) {\n return {};\n }\n const uniforms = getUniforms(opts);\n if (Number.isFinite(uniforms.filter_min)) {\n const min64High = Math.fround(uniforms.filter_min);\n uniforms.filter_min -= min64High;\n uniforms.filter_softMin -= min64High;\n uniforms.filter_min64High = min64High;\n\n const max64High = Math.fround(uniforms.filter_max);\n uniforms.filter_max -= max64High;\n uniforms.filter_softMax -= max64High;\n uniforms.filter_max64High = max64High;\n } else {\n const min64High = uniforms.filter_min.map(Math.fround);\n uniforms.filter_min = uniforms.filter_min.map((x, i) => x - min64High[i]);\n uniforms.filter_softMin = uniforms.filter_softMin.map((x, i) => x - min64High[i]);\n uniforms.filter_min64High = min64High;\n\n const max64High = uniforms.filter_max.map(Math.fround);\n uniforms.filter_max = uniforms.filter_max.map((x, i) => x - max64High[i]);\n uniforms.filter_softMax = uniforms.filter_softMax.map((x, i) => x - max64High[i]);\n uniforms.filter_max64High = max64High;\n }\n return uniforms;\n}\n\nconst inject = {\n 'vs:#main-start': `\n #ifdef DATAFILTER_DOUBLE\n dataFilter_setValue(\n DATAFILTER_ATTRIB - filter_min64High + DATAFILTER_ATTRIB_64LOW,\n DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW\n );\n #else\n dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB);\n #endif\n `,\n\n 'vs:#main-end': `\n if (dataFilter_value == 0.0) {\n gl_Position = vec4(0.);\n }\n `,\n\n 'vs:DECKGL_FILTER_SIZE': `\n if (filter_transformSize) {\n size = size * dataFilter_value;\n }\n `,\n\n 'fs:DECKGL_FILTER_COLOR': `\n if (dataFilter_value == 0.0) discard;\n if (filter_transformColor) {\n color.a *= dataFilter_value;\n }\n `\n};\n\nexport const shaderModule: ShaderModule<DataFilterModuleSettings> = {\n name: 'data-filter',\n vs,\n fs,\n inject,\n getUniforms\n};\n\nexport const shaderModule64: ShaderModule<DataFilterModuleSettings> = {\n name: 'data-filter-fp64',\n vs,\n fs,\n inject,\n getUniforms: getUniforms64\n};\n"],"file":"shader-module.js"}
|
|
@@ -52,7 +52,7 @@ var MaskEffect = function () {
|
|
|
52
52
|
viewports = _ref.viewports,
|
|
53
53
|
onViewportActive = _ref.onViewportActive,
|
|
54
54
|
views = _ref.views,
|
|
55
|
-
|
|
55
|
+
isPicking = _ref.isPicking;
|
|
56
56
|
var didRender = false;
|
|
57
57
|
|
|
58
58
|
if (!this.dummyMaskMap) {
|
|
@@ -62,7 +62,7 @@ var MaskEffect = function () {
|
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
if (
|
|
65
|
+
if (isPicking) {
|
|
66
66
|
return {
|
|
67
67
|
didRender: didRender
|
|
68
68
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mask/mask-effect.ts"],"names":["MaskEffect","gl","layers","layerFilter","viewports","onViewportActive","views","pass","didRender","dummyMaskMap","Texture2D","width","height","startsWith","maskLayers","filter","l","props","visible","operation","includes","length","masks","channels","maskPass","MaskPass","id","maskMap","channelMap","_sortMaskChannels","viewport","viewportChanged","lastViewport","equals","maskId","result","_renderChannel","channelInfo","oldChannelInfo","index","maskChanged","layerBounds","some","b","i","bounds","maskBounds","maskViewport","getBounds","render","channel","moduleParameters","devicePixelRatio","coordinateOrigin","coordinateSystem","channelCount","layer","root","log","warn","findIndex","c","push","maskChannels","delete","undefined"],"mappings":";;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;;;IA2BqBA,U;;;8CACd,a;iDACG,I;wDACO,I;iDACP,C;;oDAG+B,E;iDACM,I;;;;;;;;WAK7C,mBACEC,EADF,QAGsB;AAAA,UADnBC,MACmB,QADnBA,MACmB;AAAA,UADXC,WACW,QADXA,WACW;AAAA,UADEC,SACF,QADEA,SACF;AAAA,UADaC,gBACb,QADaA,gBACb;AAAA,UAD+BC,KAC/B,QAD+BA,KAC/B;AAAA,UADsCC,IACtC,QADsCA,IACtC;AACpB,UAAIC,SAAS,GAAG,KAAhB;;AACA,UAAI,CAAC,KAAKC,YAAV,EAAwB;AACtB,aAAKA,YAAL,GAAoB,IAAIC,gBAAJ,CAAcT,EAAd,EAAkB;AACpCU,UAAAA,KAAK,EAAE,CAD6B;AAEpCC,UAAAA,MAAM,EAAE;AAF4B,SAAlB,CAApB;AAID;;AAED,UAAIL,IAAI,CAACM,UAAL,CAAgB,SAAhB,CAAJ,EAAgC;AAE9B,eAAO;AAACL,UAAAA,SAAS,EAATA;AAAD,SAAP;AACD;;AAED,UAAMM,UAAU,GAAGZ,MAAM,CAACa,MAAP,CAAc,UAAAC,CAAC;AAAA,eAAIA,CAAC,CAACC,KAAF,CAAQC,OAAR,IAAmBF,CAAC,CAACC,KAAF,CAAQE,SAAR,CAAkBC,QAAlB,CAA2B,MAA3B,CAAvB;AAAA,OAAf,CAAnB;;AACA,UAAIN,UAAU,CAACO,MAAX,KAAsB,CAA1B,EAA6B;AAC3B,aAAKC,KAAL,GAAa,IAAb;AACA,aAAKC,QAAL,CAAcF,MAAd,GAAuB,CAAvB;AACA,eAAO;AAACb,UAAAA,SAAS,EAATA;AAAD,SAAP;AACD;;AACD,WAAKc,KAAL,GAAa,EAAb;;AAEA,UAAI,CAAC,KAAKE,QAAV,EAAoB;AAClB,aAAKA,QAAL,GAAgB,IAAIC,iBAAJ,CAAaxB,EAAb,EAAiB;AAACyB,UAAAA,EAAE,EAAE;AAAL,SAAjB,CAAhB;AACA,aAAKC,OAAL,GAAe,KAAKH,QAAL,CAAcG,OAA7B;AACD;;AAGD,UAAMC,UAAU,GAAG,KAAKC,iBAAL,CAAuBf,UAAvB,CAAnB;;AAEA,UAAMgB,QAAQ,GAAG1B,SAAS,CAAC,CAAD,CAA1B;AACA,UAAM2B,eAAe,GAAG,CAAC,KAAKC,YAAN,IAAsB,CAAC,KAAKA,YAAL,CAAkBC,MAAlB,CAAyBH,QAAzB,CAA/C;;AAEA,WAAK,IAAMI,MAAX,IAAqBN,UAArB,EAAiC;AAC/B,YAAMO,MAAM,GAAG,KAAKC,cAAL,CAAoBR,UAAU,CAACM,MAAD,CAA9B,EAAwC;AACrD/B,UAAAA,WAAW,EAAXA,WADqD;AAErDE,UAAAA,gBAAgB,EAAhBA,gBAFqD;AAGrDC,UAAAA,KAAK,EAALA,KAHqD;AAIrDwB,UAAAA,QAAQ,EAARA,QAJqD;AAKrDC,UAAAA,eAAe,EAAfA;AALqD,SAAxC,CAAf;;AAOAvB,QAAAA,SAAS,KAATA,SAAS,GAAK2B,MAAL,CAAT;AACD;;AAGD,aAAO;AAAC3B,QAAAA,SAAS,EAATA;AAAD,OAAP;AACD;;;WAED,wBACE6B,WADF,SAeW;AAAA,UAZPlC,WAYO,SAZPA,WAYO;AAAA,UAXPE,gBAWO,SAXPA,gBAWO;AAAA,UAVPC,KAUO,SAVPA,KAUO;AAAA,UATPwB,QASO,SATPA,QASO;AAAA,UARPC,eAQO,SARPA,eAQO;AACT,UAAIvB,SAAS,GAAG,KAAhB;AACA,UAAM8B,cAAc,GAAG,KAAKf,QAAL,CAAcc,WAAW,CAACE,KAA1B,CAAvB;;AACA,UAAI,CAACD,cAAL,EAAqB;AACnB,eAAO9B,SAAP;AACD;;AAED,UAAMgC,WAAW,GAEfH,WAAW,KAAKC,cAAhB,IAEAA,cAAc,CAACpC,MAAf,CAAsBmB,MAAtB,KAAiCgB,WAAW,CAACnC,MAAZ,CAAmBmB,MAFpD,IAIAgB,WAAW,CAACI,WAAZ,CAAwBC,IAAxB,CAA6B,UAACC,CAAD,EAAIC,CAAJ;AAAA,eAAUD,CAAC,KAAKL,cAAc,CAACG,WAAf,CAA2BG,CAA3B,CAAhB;AAAA,OAA7B,CANF;AAQAP,MAAAA,WAAW,CAACQ,MAAZ,GAAqBP,cAAc,CAACO,MAApC;AACAR,MAAAA,WAAW,CAACS,UAAZ,GAAyBR,cAAc,CAACQ,UAAxC;AACA,WAAKvB,QAAL,CAAcc,WAAW,CAACE,KAA1B,IAAmCF,WAAnC;;AAEA,UAAIG,WAAW,IAAIT,eAAnB,EAAoC;AAElC,aAAKC,YAAL,GAAoBF,QAApB;AAEAO,QAAAA,WAAW,CAACQ,MAAZ,GAAqB,0BAAc;AAAC3C,UAAAA,MAAM,EAAEmC,WAAW,CAACnC,MAArB;AAA6B4B,UAAAA,QAAQ,EAARA;AAA7B,SAAd,CAArB;;AAEA,YAAIU,WAAW,IAAI,CAAC,mBAAOH,WAAW,CAACQ,MAAnB,EAA2BP,cAAc,CAACO,MAA1C,CAApB,EAAuE;AAErE,cAAOrB,QAAP,GAA4B,IAA5B,CAAOA,QAAP;AAAA,cAAiBG,OAAjB,GAA4B,IAA5B,CAAiBA,OAAjB;AAEA,cAAMoB,YAAY,GAAG,4BAAgB;AACnCF,YAAAA,MAAM,EAAER,WAAW,CAACQ,MADe;AAEnCf,YAAAA,QAAQ,EAARA,QAFmC;AAGnCnB,YAAAA,KAAK,EAAEgB,OAAO,CAAChB,KAHoB;AAInCC,YAAAA,MAAM,EAAEe,OAAO,CAACf;AAJmB,WAAhB,CAArB;AAOAyB,UAAAA,WAAW,CAACS,UAAZ,GAAyBC,YAAY,GAAGA,YAAY,CAACC,SAAb,EAAH,GAA8B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAAnE;AAGAxB,UAAAA,QAAQ,CAACyB,MAAT,CAAgB;AACd1C,YAAAA,IAAI,EAAE,MADQ;AAEd2C,YAAAA,OAAO,EAAEb,WAAW,CAACE,KAFP;AAGdrC,YAAAA,MAAM,EAAEmC,WAAW,CAACnC,MAHN;AAIdC,YAAAA,WAAW,EAAXA,WAJc;AAKdC,YAAAA,SAAS,EAAE2C,YAAY,GAAG,CAACA,YAAD,CAAH,GAAoB,EAL7B;AAMd1C,YAAAA,gBAAgB,EAAhBA,gBANc;AAOdC,YAAAA,KAAK,EAALA,KAPc;AAQd6C,YAAAA,gBAAgB,EAAE;AAChBC,cAAAA,gBAAgB,EAAE;AADF;AARJ,WAAhB;AAaA5C,UAAAA,SAAS,GAAG,IAAZ;AACD;AACF;;AAGD,WAAKc,KAAL,CAAWe,WAAW,CAACX,EAAvB,IAA6B;AAC3Ba,QAAAA,KAAK,EAAEF,WAAW,CAACE,KADQ;AAE3BM,QAAAA,MAAM,EAAER,WAAW,CAACS,UAFO;AAG3BO,QAAAA,gBAAgB,EAAEhB,WAAW,CAACgB,gBAHH;AAI3BC,QAAAA,gBAAgB,EAAEjB,WAAW,CAACiB;AAJH,OAA7B;AAOA,aAAO9C,SAAP;AACD;;;WASD,2BAA0BM,UAA1B,EAAwE;AAAA;;AACtE,UAAMc,UAAU,GAAG,EAAnB;AACA,UAAI2B,YAAY,GAAG,CAAnB;;AAFsE,iDAGlDzC,UAHkD;AAAA;;AAAA;AAAA;AAAA,cAG3D0C,KAH2D;AAIpE,cAAO9B,EAAP,GAAa8B,KAAK,CAACC,IAAnB,CAAO/B,EAAP;AACA,cAAIW,WAAW,GAAGT,UAAU,CAACF,EAAD,CAA5B;;AACA,cAAI,CAACW,WAAL,EAAkB;AAChB,gBAAI,EAAEkB,YAAF,GAAiB,CAArB,EAAwB;AACtBG,wBAAIC,IAAJ,CAAS,8CAAT;;AACA;AACD;;AACDtB,YAAAA,WAAW,GAAG;AACZX,cAAAA,EAAE,EAAFA,EADY;AAEZa,cAAAA,KAAK,EAAE,KAAI,CAAChB,QAAL,CAAcqC,SAAd,CAAwB,UAAAC,CAAC;AAAA,uBAAI,CAAAA,CAAC,SAAD,IAAAA,CAAC,WAAD,YAAAA,CAAC,CAAEnC,EAAH,MAAUA,EAAd;AAAA,eAAzB,CAFK;AAGZxB,cAAAA,MAAM,EAAE,EAHI;AAIZuC,cAAAA,WAAW,EAAE,EAJD;AAKZY,cAAAA,gBAAgB,EAAEG,KAAK,CAACC,IAAN,CAAWxC,KAAX,CAAiBoC,gBALvB;AAMZC,cAAAA,gBAAgB,EAAEE,KAAK,CAACC,IAAN,CAAWxC,KAAX,CAAiBqC;AANvB,aAAd;AAQA1B,YAAAA,UAAU,CAACF,EAAD,CAAV,GAAiBW,WAAjB;AACD;;AACDA,UAAAA,WAAW,CAACnC,MAAZ,CAAmB4D,IAAnB,CAAwBN,KAAxB;AACAnB,UAAAA,WAAW,CAACI,WAAZ,CAAwBqB,IAAxB,CAA6BN,KAAK,CAACR,SAAN,EAA7B;AAtBoE;;AAGtE,4DAAgC;AAAA;;AAAA,mCAM1B;AAcL;AAvBqE;AAAA;AAAA;AAAA;AAAA;;AAyBtE,WAAK,IAAIJ,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,CAApB,EAAuBA,CAAC,EAAxB,EAA4B;AAC1B,YAAMP,WAAW,GAAG,KAAKd,QAAL,CAAcqB,CAAd,CAApB;;AACA,YAAI,CAACP,WAAD,IAAgB,EAAEA,WAAW,CAACX,EAAZ,IAAkBE,UAApB,CAApB,EAAqD;AAEnD,eAAKL,QAAL,CAAcqB,CAAd,IAAmB,IAAnB;AACD;AACF;;AAED,WAAK,IAAMV,MAAX,IAAqBN,UAArB,EAAiC;AAC/B,YAAMS,YAAW,GAAGT,UAAU,CAACM,MAAD,CAA9B;;AAEA,YAAIG,YAAW,CAACE,KAAZ,GAAoB,CAAxB,EAA2B;AACzBF,UAAAA,YAAW,CAACE,KAAZ,GAAoB,KAAKhB,QAAL,CAAcqC,SAAd,CAAwB,UAAAC,CAAC;AAAA,mBAAI,CAACA,CAAL;AAAA,WAAzB,CAApB;AACA,eAAKtC,QAAL,CAAcc,YAAW,CAACE,KAA1B,IAAmCF,YAAnC;AACD;AACF;;AACD,aAAOT,UAAP;AACD;;;WAED,+BAGE;AACA,aAAO;AACLD,QAAAA,OAAO,EAAE,KAAKL,KAAL,GAAa,KAAKK,OAAlB,GAA4B,KAAKlB,YADrC;AAELsD,QAAAA,YAAY,EAAE,KAAKzC;AAFd,OAAP;AAID;;;WAED,mBAAgB;AACd,UAAI,KAAKb,YAAT,EAAuB;AACrB,aAAKA,YAAL,CAAkBuD,MAAlB;AACA,aAAKvD,YAAL,GAAoBwD,SAApB;AACD;;AAED,UAAI,KAAKzC,QAAT,EAAmB;AACjB,aAAKA,QAAL,CAAcwC,MAAd;AACA,aAAKxC,QAAL,GAAgByC,SAAhB;AACA,aAAKtC,OAAL,GAAesC,SAAf;AACD;;AAED,WAAKjC,YAAL,GAAoBiC,SAApB;AACA,WAAK3C,KAAL,GAAa,IAAb;AACA,WAAKC,QAAL,CAAcF,MAAd,GAAuB,CAAvB;AACD","sourcesContent":["import {Layer, Viewport, Effect, PreRenderOptions, CoordinateSystem, log} from '@deck.gl/core';\nimport {Texture2D} from '@luma.gl/core';\nimport {equals} from '@math.gl/core';\nimport MaskPass from './mask-pass';\nimport {getMaskBounds, getMaskViewport, MaskBounds} from './utils';\n// import {debugFBO} from '../utils/debug';\n\ntype Mask = {\n /** The channel index */\n index: number;\n bounds: MaskBounds;\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\ntype Channel = {\n id: string;\n index: number;\n layers: Layer[];\n bounds: MaskBounds;\n maskBounds: MaskBounds;\n layerBounds: MaskBounds[];\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\nexport type MaskPreRenderStats = {\n didRender: boolean;\n};\n\n// Class to manage mask effect\nexport default class MaskEffect implements Effect {\n id = 'mask-effect';\n props = null;\n useInPicking = true;\n order = 0;\n\n private dummyMaskMap?: Texture2D;\n private channels: (Channel | null)[] = [];\n private masks: Record<string, Mask> | null = null;\n private maskPass?: MaskPass;\n private maskMap?: Texture2D;\n private lastViewport?: Viewport;\n\n preRender(\n gl: WebGLRenderingContext,\n {layers, layerFilter, viewports, onViewportActive, views, pass}: PreRenderOptions\n ): MaskPreRenderStats {\n let didRender = false;\n if (!this.dummyMaskMap) {\n this.dummyMaskMap = new Texture2D(gl, {\n width: 1,\n height: 1\n });\n }\n\n if (pass.startsWith('picking')) {\n // Do not update on picking pass\n return {didRender};\n }\n\n const maskLayers = layers.filter(l => l.props.visible && l.props.operation.includes('mask'));\n if (maskLayers.length === 0) {\n this.masks = null;\n this.channels.length = 0;\n return {didRender};\n }\n this.masks = {};\n\n if (!this.maskPass) {\n this.maskPass = new MaskPass(gl, {id: 'default-mask'});\n this.maskMap = this.maskPass.maskMap;\n }\n\n // Map layers to channels\n const channelMap = this._sortMaskChannels(maskLayers);\n // TODO - support multiple views\n const viewport = viewports[0];\n const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);\n\n for (const maskId in channelMap) {\n const result = this._renderChannel(channelMap[maskId], {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n });\n didRender ||= result;\n }\n\n // debugFBO(this.maskMap, {opaque: true});\n return {didRender};\n }\n\n private _renderChannel(\n channelInfo: Channel,\n {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n }: {\n layerFilter: PreRenderOptions['layerFilter'];\n onViewportActive: PreRenderOptions['onViewportActive'];\n views: PreRenderOptions['views'];\n viewport: Viewport;\n viewportChanged: boolean;\n }\n ): boolean {\n let didRender = false;\n const oldChannelInfo = this.channels[channelInfo.index];\n if (!oldChannelInfo) {\n return didRender;\n }\n\n const maskChanged =\n // If a channel is new\n channelInfo === oldChannelInfo ||\n // If sublayers have changed\n oldChannelInfo.layers.length !== channelInfo.layers.length ||\n // If a sublayer's positions have been updated, the cached bounds will change shallowly\n channelInfo.layerBounds.some((b, i) => b !== oldChannelInfo.layerBounds[i]);\n\n channelInfo.bounds = oldChannelInfo.bounds;\n channelInfo.maskBounds = oldChannelInfo.maskBounds;\n this.channels[channelInfo.index] = channelInfo;\n\n if (maskChanged || viewportChanged) {\n // Recalculate mask bounds\n this.lastViewport = viewport;\n\n channelInfo.bounds = getMaskBounds({layers: channelInfo.layers, viewport});\n\n if (maskChanged || !equals(channelInfo.bounds, oldChannelInfo.bounds)) {\n // Rerender mask FBO\n const {maskPass, maskMap} = this;\n\n const maskViewport = getMaskViewport({\n bounds: channelInfo.bounds,\n viewport,\n width: maskMap.width,\n height: maskMap.height\n });\n\n channelInfo.maskBounds = maskViewport ? maskViewport.getBounds() : [0, 0, 1, 1];\n\n // @ts-ignore (2532) This method is only called from preRender where maskPass is defined\n maskPass.render({\n pass: 'mask',\n channel: channelInfo.index,\n layers: channelInfo.layers,\n layerFilter,\n viewports: maskViewport ? [maskViewport] : [],\n onViewportActive,\n views,\n moduleParameters: {\n devicePixelRatio: 1\n }\n });\n\n didRender = true;\n }\n }\n\n // @ts-ignore (2532) This method is only called from preRender where masks is defined\n this.masks[channelInfo.id] = {\n index: channelInfo.index,\n bounds: channelInfo.maskBounds,\n coordinateOrigin: channelInfo.coordinateOrigin,\n coordinateSystem: channelInfo.coordinateSystem\n };\n\n return didRender;\n }\n\n /**\n * Find a channel to render each mask into\n * If a maskId already exists, diff and update the existing channel\n * Otherwise replace a removed mask\n * Otherwise create a new channel\n * Returns a map from mask layer id to channel info\n */\n private _sortMaskChannels(maskLayers: Layer[]): Record<string, Channel> {\n const channelMap = {};\n let channelCount = 0;\n for (const layer of maskLayers) {\n const {id} = layer.root;\n let channelInfo = channelMap[id];\n if (!channelInfo) {\n if (++channelCount > 4) {\n log.warn('Too many mask layers. The max supported is 4')();\n continue; // eslint-disable-line no-continue\n }\n channelInfo = {\n id,\n index: this.channels.findIndex(c => c?.id === id),\n layers: [],\n layerBounds: [],\n coordinateOrigin: layer.root.props.coordinateOrigin,\n coordinateSystem: layer.root.props.coordinateSystem\n };\n channelMap[id] = channelInfo;\n }\n channelInfo.layers.push(layer);\n channelInfo.layerBounds.push(layer.getBounds());\n }\n\n for (let i = 0; i < 4; i++) {\n const channelInfo = this.channels[i];\n if (!channelInfo || !(channelInfo.id in channelMap)) {\n // The mask id at this channel no longer exists\n this.channels[i] = null;\n }\n }\n\n for (const maskId in channelMap) {\n const channelInfo = channelMap[maskId];\n\n if (channelInfo.index < 0) {\n channelInfo.index = this.channels.findIndex(c => !c);\n this.channels[channelInfo.index] = channelInfo;\n }\n }\n return channelMap;\n }\n\n getModuleParameters(): {\n maskMap: Texture2D;\n maskChannels: Record<string, Mask> | null;\n } {\n return {\n maskMap: this.masks ? this.maskMap : this.dummyMaskMap,\n maskChannels: this.masks\n };\n }\n\n cleanup(): void {\n if (this.dummyMaskMap) {\n this.dummyMaskMap.delete();\n this.dummyMaskMap = undefined;\n }\n\n if (this.maskPass) {\n this.maskPass.delete();\n this.maskPass = undefined;\n this.maskMap = undefined;\n }\n\n this.lastViewport = undefined;\n this.masks = null;\n this.channels.length = 0;\n }\n}\n"],"file":"mask-effect.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/mask/mask-effect.ts"],"names":["MaskEffect","gl","layers","layerFilter","viewports","onViewportActive","views","isPicking","didRender","dummyMaskMap","Texture2D","width","height","maskLayers","filter","l","props","visible","operation","includes","length","masks","channels","maskPass","MaskPass","id","maskMap","channelMap","_sortMaskChannels","viewport","viewportChanged","lastViewport","equals","maskId","result","_renderChannel","channelInfo","oldChannelInfo","index","maskChanged","layerBounds","some","b","i","bounds","maskBounds","maskViewport","getBounds","render","pass","channel","moduleParameters","devicePixelRatio","coordinateOrigin","coordinateSystem","channelCount","layer","root","log","warn","findIndex","c","push","maskChannels","delete","undefined"],"mappings":"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","sourcesContent":["import {Layer, Viewport, Effect, PreRenderOptions, CoordinateSystem, log} from '@deck.gl/core';\nimport {Texture2D} from '@luma.gl/core';\nimport {equals} from '@math.gl/core';\nimport MaskPass from './mask-pass';\nimport {getMaskBounds, getMaskViewport, MaskBounds} from './utils';\n// import {debugFBO} from '../utils/debug';\n\ntype Mask = {\n /** The channel index */\n index: number;\n bounds: MaskBounds;\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\ntype Channel = {\n id: string;\n index: number;\n layers: Layer[];\n bounds: MaskBounds;\n maskBounds: MaskBounds;\n layerBounds: MaskBounds[];\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\nexport type MaskPreRenderStats = {\n didRender: boolean;\n};\n\n// Class to manage mask effect\nexport default class MaskEffect implements Effect {\n id = 'mask-effect';\n props = null;\n useInPicking = true;\n order = 0;\n\n private dummyMaskMap?: Texture2D;\n private channels: (Channel | null)[] = [];\n private masks: Record<string, Mask> | null = null;\n private maskPass?: MaskPass;\n private maskMap?: Texture2D;\n private lastViewport?: Viewport;\n\n preRender(\n gl: WebGLRenderingContext,\n {layers, layerFilter, viewports, onViewportActive, views, isPicking}: PreRenderOptions\n ): MaskPreRenderStats {\n let didRender = false;\n if (!this.dummyMaskMap) {\n this.dummyMaskMap = new Texture2D(gl, {\n width: 1,\n height: 1\n });\n }\n\n if (isPicking) {\n // Do not update on picking pass\n return {didRender};\n }\n\n const maskLayers = layers.filter(l => l.props.visible && l.props.operation.includes('mask'));\n if (maskLayers.length === 0) {\n this.masks = null;\n this.channels.length = 0;\n return {didRender};\n }\n this.masks = {};\n\n if (!this.maskPass) {\n this.maskPass = new MaskPass(gl, {id: 'default-mask'});\n this.maskMap = this.maskPass.maskMap;\n }\n\n // Map layers to channels\n const channelMap = this._sortMaskChannels(maskLayers);\n // TODO - support multiple views\n const viewport = viewports[0];\n const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);\n\n for (const maskId in channelMap) {\n const result = this._renderChannel(channelMap[maskId], {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n });\n didRender ||= result;\n }\n\n // debugFBO(this.maskMap, {opaque: true});\n return {didRender};\n }\n\n private _renderChannel(\n channelInfo: Channel,\n {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n }: {\n layerFilter: PreRenderOptions['layerFilter'];\n onViewportActive: PreRenderOptions['onViewportActive'];\n views: PreRenderOptions['views'];\n viewport: Viewport;\n viewportChanged: boolean;\n }\n ): boolean {\n let didRender = false;\n const oldChannelInfo = this.channels[channelInfo.index];\n if (!oldChannelInfo) {\n return didRender;\n }\n\n const maskChanged =\n // If a channel is new\n channelInfo === oldChannelInfo ||\n // If sublayers have changed\n oldChannelInfo.layers.length !== channelInfo.layers.length ||\n // If a sublayer's positions have been updated, the cached bounds will change shallowly\n channelInfo.layerBounds.some((b, i) => b !== oldChannelInfo.layerBounds[i]);\n\n channelInfo.bounds = oldChannelInfo.bounds;\n channelInfo.maskBounds = oldChannelInfo.maskBounds;\n this.channels[channelInfo.index] = channelInfo;\n\n if (maskChanged || viewportChanged) {\n // Recalculate mask bounds\n this.lastViewport = viewport;\n\n channelInfo.bounds = getMaskBounds({layers: channelInfo.layers, viewport});\n\n if (maskChanged || !equals(channelInfo.bounds, oldChannelInfo.bounds)) {\n // Rerender mask FBO\n const {maskPass, maskMap} = this;\n\n const maskViewport = getMaskViewport({\n bounds: channelInfo.bounds,\n viewport,\n width: maskMap.width,\n height: maskMap.height\n });\n\n channelInfo.maskBounds = maskViewport ? maskViewport.getBounds() : [0, 0, 1, 1];\n\n // @ts-ignore (2532) This method is only called from preRender where maskPass is defined\n maskPass.render({\n pass: 'mask',\n channel: channelInfo.index,\n layers: channelInfo.layers,\n layerFilter,\n viewports: maskViewport ? [maskViewport] : [],\n onViewportActive,\n views,\n moduleParameters: {\n devicePixelRatio: 1\n }\n });\n\n didRender = true;\n }\n }\n\n // @ts-ignore (2532) This method is only called from preRender where masks is defined\n this.masks[channelInfo.id] = {\n index: channelInfo.index,\n bounds: channelInfo.maskBounds,\n coordinateOrigin: channelInfo.coordinateOrigin,\n coordinateSystem: channelInfo.coordinateSystem\n };\n\n return didRender;\n }\n\n /**\n * Find a channel to render each mask into\n * If a maskId already exists, diff and update the existing channel\n * Otherwise replace a removed mask\n * Otherwise create a new channel\n * Returns a map from mask layer id to channel info\n */\n private _sortMaskChannels(maskLayers: Layer[]): Record<string, Channel> {\n const channelMap = {};\n let channelCount = 0;\n for (const layer of maskLayers) {\n const {id} = layer.root;\n let channelInfo = channelMap[id];\n if (!channelInfo) {\n if (++channelCount > 4) {\n log.warn('Too many mask layers. The max supported is 4')();\n continue; // eslint-disable-line no-continue\n }\n channelInfo = {\n id,\n index: this.channels.findIndex(c => c?.id === id),\n layers: [],\n layerBounds: [],\n coordinateOrigin: layer.root.props.coordinateOrigin,\n coordinateSystem: layer.root.props.coordinateSystem\n };\n channelMap[id] = channelInfo;\n }\n channelInfo.layers.push(layer);\n channelInfo.layerBounds.push(layer.getBounds());\n }\n\n for (let i = 0; i < 4; i++) {\n const channelInfo = this.channels[i];\n if (!channelInfo || !(channelInfo.id in channelMap)) {\n // The mask id at this channel no longer exists\n this.channels[i] = null;\n }\n }\n\n for (const maskId in channelMap) {\n const channelInfo = channelMap[maskId];\n\n if (channelInfo.index < 0) {\n channelInfo.index = this.channels.findIndex(c => !c);\n this.channels[channelInfo.index] = channelInfo;\n }\n }\n return channelMap;\n }\n\n getModuleParameters(): {\n maskMap: Texture2D;\n maskChannels: Record<string, Mask> | null;\n } {\n return {\n maskMap: this.masks ? this.maskMap : this.dummyMaskMap,\n maskChannels: this.masks\n };\n }\n\n cleanup(): void {\n if (this.dummyMaskMap) {\n this.dummyMaskMap.delete();\n this.dummyMaskMap = undefined;\n }\n\n if (this.maskPass) {\n this.maskPass.delete();\n this.maskPass = undefined;\n this.maskMap = undefined;\n }\n\n this.lastViewport = undefined;\n this.masks = null;\n this.channels.length = 0;\n }\n}\n"],"file":"mask-effect.js"}
|
|
@@ -109,8 +109,8 @@ var TerrainEffect = function () {
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
var viewports = opts.viewports,
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
_opts$isPicking = opts.isPicking,
|
|
113
|
+
isPicking = _opts$isPicking === void 0 ? false : _opts$isPicking;
|
|
114
114
|
this.isPicking = isPicking;
|
|
115
115
|
this.isDrapingEnabled = true;
|
|
116
116
|
var viewport = viewports[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/terrain/terrain-effect.ts"],"names":["TerrainEffect","Map","gl","dummyHeightMap","Texture2D","width","height","data","Uint8Array","terrainPass","TerrainPass","id","terrainPickingPass","TerrainPickingPass","HeightMapBuilder","isSupported","heightMap","log","warn","ProgramManager","getDefaultProgramManager","addDefaultModule","terrainModule","opts","initialize","layers","layer","props","operation","includes","setChangeFlags","extensionsChanged","pickZ","isDrapingEnabled","viewports","pass","isPicking","startsWith","viewport","getRenderableLayers","terrainLayers","filter","l","length","offsetLayers","state","terrainFittingMode","_updateHeightMap","drapeLayers","_updateTerrainCovers","getRenderFramebuffer","heightMapBounds","bounds","terrainCover","terrainCovers","get","useTerrainHeightMap","terrainSkipRender","delete","undefined","values","clear","shouldUpdate","renderHeightMap","moduleParameters","devicePixelRatio","drawToTerrainHeightMap","layerNeedsRedraw","terrainCoverNeedsRedraw","isDirty","_updateTerrainCover","_pruneTerrainCovers","terrainLayer","renderPass","TerrainCover","set","targetLayer","renderTerrainCover","err","raiseError","idsToRemove","isActive","push"],"mappings":"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","sourcesContent":["import {Texture2D, ProgramManager} from '@luma.gl/core';\nimport {log} from '@deck.gl/core';\n\nimport {terrainModule, TerrainModuleSettings} from './shader-module';\nimport {TerrainCover} from './terrain-cover';\nimport {TerrainPass} from './terrain-pass';\nimport {TerrainPickingPass, TerrainPickingPassRenderOptions} from './terrain-picking-pass';\nimport {HeightMapBuilder} from './height-map-builder';\n\nimport type {Effect, PreRenderOptions, Layer, Viewport} from '@deck.gl/core';\n\n/** Class to manage terrain effect */\nexport class TerrainEffect implements Effect {\n id = 'terrain-effect';\n props = null;\n useInPicking = true;\n\n /** true if picking in the current pass */\n private isPicking: boolean = false;\n /** true if should use in the current pass */\n private isDrapingEnabled: boolean = false;\n /** An empty texture as placeholder */\n private dummyHeightMap: Texture2D;\n /** A texture encoding the ground elevation, updated once per redraw. Used by layers with offset mode */\n private heightMap?: HeightMapBuilder;\n private terrainPass!: TerrainPass;\n private terrainPickingPass!: TerrainPickingPass;\n /** One texture for each primitive terrain layer, into which the draped layers render */\n private terrainCovers: Map<string, TerrainCover> = new Map();\n\n initialize(gl: WebGLRenderingContext) {\n this.dummyHeightMap = new Texture2D(gl, {\n width: 1,\n height: 1,\n data: new Uint8Array([0, 0, 0, 0])\n });\n this.terrainPass = new TerrainPass(gl, {id: 'terrain'});\n this.terrainPickingPass = new TerrainPickingPass(gl, {id: 'terrain-picking'});\n\n if (HeightMapBuilder.isSupported(gl)) {\n this.heightMap = new HeightMapBuilder(gl);\n } else {\n log.warn('Terrain offset mode is not supported by this browser')();\n }\n\n ProgramManager.getDefaultProgramManager(gl).addDefaultModule(terrainModule);\n }\n\n preRender(gl: WebGLRenderingContext, opts: PreRenderOptions): void {\n if (!this.dummyHeightMap) {\n // First time this effect is in use, initialize resources and register the shader module\n this.initialize(gl);\n for (const layer of opts.layers) {\n // Force the terrain layer (and its descendents) to rebuild their models with the new shader\n if (layer.props.operation.includes('terrain')) {\n layer.setChangeFlags({extensionsChanged: true});\n }\n }\n }\n\n // @ts-expect-error pickZ only defined in picking pass\n if (opts.pickZ) {\n // Do not update if picking attributes\n this.isDrapingEnabled = false;\n return;\n }\n\n const {viewports, pass} = opts;\n const isPicking = pass.startsWith('picking');\n this.isPicking = isPicking;\n this.isDrapingEnabled = true;\n\n // TODO - support multiple views?\n const viewport = viewports[0];\n const layers = (isPicking ? this.terrainPickingPass : this.terrainPass).getRenderableLayers(\n viewport,\n opts as TerrainPickingPassRenderOptions\n );\n\n const terrainLayers = layers.filter(l => l.props.operation.includes('terrain'));\n if (terrainLayers.length === 0) {\n return;\n }\n\n if (!isPicking) {\n const offsetLayers = layers.filter(l => l.state.terrainFittingMode === 'offset');\n if (offsetLayers.length > 0) {\n this._updateHeightMap(terrainLayers, viewport, opts);\n }\n }\n\n const drapeLayers = layers.filter(l => l.state.terrainFittingMode === 'drape');\n this._updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts);\n }\n\n getModuleParameters(layer: Layer): TerrainModuleSettings {\n const {terrainFittingMode} = layer.state;\n\n return {\n heightMap: this.heightMap?.getRenderFramebuffer(),\n heightMapBounds: this.heightMap?.bounds,\n dummyHeightMap: this.dummyHeightMap,\n terrainCover: this.isDrapingEnabled ? this.terrainCovers.get(layer.id) : null,\n useTerrainHeightMap: terrainFittingMode === 'offset',\n terrainSkipRender: terrainFittingMode === 'drape' || !layer.props.operation.includes('draw')\n };\n }\n\n cleanup(): void {\n if (this.dummyHeightMap) {\n this.dummyHeightMap.delete();\n this.dummyHeightMap = undefined;\n }\n\n if (this.heightMap) {\n this.heightMap.delete();\n this.heightMap = undefined;\n }\n\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.delete();\n }\n this.terrainCovers.clear();\n }\n\n private _updateHeightMap(terrainLayers: Layer[], viewport: Viewport, opts: PreRenderOptions) {\n if (!this.heightMap) {\n // Not supported\n return;\n }\n\n const shouldUpdate = this.heightMap.shouldUpdate({layers: terrainLayers, viewport});\n if (!shouldUpdate) {\n return;\n }\n\n this.terrainPass.renderHeightMap(this.heightMap, {\n ...opts,\n layers: terrainLayers,\n moduleParameters: {\n heightMapBounds: this.heightMap.bounds,\n dummyHeightMap: this.dummyHeightMap,\n devicePixelRatio: 1,\n drawToTerrainHeightMap: true\n }\n });\n }\n\n private _updateTerrainCovers(\n terrainLayers: Layer[],\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n // Mark a terrain cover as dirty if one of the drape layers needs redraw\n const layerNeedsRedraw: Record<string, boolean> = {};\n for (const layer of drapeLayers) {\n if (layer.state.terrainCoverNeedsRedraw) {\n layerNeedsRedraw[layer.id] = true;\n layer.state.terrainCoverNeedsRedraw = false;\n }\n }\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.isDirty = terrainCover.isDirty || terrainCover.shouldUpdate({layerNeedsRedraw});\n }\n\n for (const layer of terrainLayers) {\n this._updateTerrainCover(layer, drapeLayers, viewport, opts);\n }\n\n if (!this.isPicking) {\n this._pruneTerrainCovers();\n }\n }\n\n private _updateTerrainCover(\n terrainLayer: Layer,\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n const renderPass = this.isPicking ? this.terrainPickingPass : this.terrainPass;\n let terrainCover = this.terrainCovers.get(terrainLayer.id);\n if (!terrainCover) {\n terrainCover = new TerrainCover(terrainLayer);\n this.terrainCovers.set(terrainLayer.id, terrainCover);\n }\n try {\n const isDirty = terrainCover.shouldUpdate({\n targetLayer: terrainLayer,\n viewport,\n layers: drapeLayers\n });\n if (this.isPicking || terrainCover.isDirty || isDirty) {\n renderPass.renderTerrainCover(terrainCover, {\n ...opts,\n layers: drapeLayers,\n moduleParameters: {\n dummyHeightMap: this.dummyHeightMap,\n terrainSkipRender: false,\n devicePixelRatio: 1\n }\n });\n terrainCover.isDirty = false;\n }\n } catch (err) {\n terrainLayer.raiseError(err as Error, `Error rendering terrain cover ${terrainCover.id}`);\n }\n }\n\n private _pruneTerrainCovers() {\n /** Prune the cache, remove textures for layers that have been removed */\n const idsToRemove: string[] = [];\n for (const [id, terrainCover] of this.terrainCovers) {\n if (!terrainCover.isActive) {\n idsToRemove.push(id);\n }\n }\n for (const id of idsToRemove) {\n this.terrainCovers.delete(id);\n }\n }\n}\n"],"file":"terrain-effect.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/terrain/terrain-effect.ts"],"names":["TerrainEffect","Map","gl","dummyHeightMap","Texture2D","width","height","data","Uint8Array","terrainPass","TerrainPass","id","terrainPickingPass","TerrainPickingPass","HeightMapBuilder","isSupported","heightMap","log","warn","ProgramManager","getDefaultProgramManager","addDefaultModule","terrainModule","opts","initialize","layers","layer","props","operation","includes","setChangeFlags","extensionsChanged","pickZ","isDrapingEnabled","viewports","isPicking","viewport","getRenderableLayers","terrainLayers","filter","l","length","offsetLayers","state","terrainFittingMode","_updateHeightMap","drapeLayers","_updateTerrainCovers","getRenderFramebuffer","heightMapBounds","bounds","terrainCover","terrainCovers","get","useTerrainHeightMap","terrainSkipRender","delete","undefined","values","clear","shouldUpdate","renderHeightMap","moduleParameters","devicePixelRatio","drawToTerrainHeightMap","layerNeedsRedraw","terrainCoverNeedsRedraw","isDirty","_updateTerrainCover","_pruneTerrainCovers","terrainLayer","renderPass","TerrainCover","set","targetLayer","renderTerrainCover","err","raiseError","idsToRemove","isActive","push"],"mappings":"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","sourcesContent":["import {Texture2D, ProgramManager} from '@luma.gl/core';\nimport {log} from '@deck.gl/core';\n\nimport {terrainModule, TerrainModuleSettings} from './shader-module';\nimport {TerrainCover} from './terrain-cover';\nimport {TerrainPass} from './terrain-pass';\nimport {TerrainPickingPass, TerrainPickingPassRenderOptions} from './terrain-picking-pass';\nimport {HeightMapBuilder} from './height-map-builder';\n\nimport type {Effect, PreRenderOptions, Layer, Viewport} from '@deck.gl/core';\n\n/** Class to manage terrain effect */\nexport class TerrainEffect implements Effect {\n id = 'terrain-effect';\n props = null;\n useInPicking = true;\n\n /** true if picking in the current pass */\n private isPicking: boolean = false;\n /** true if should use in the current pass */\n private isDrapingEnabled: boolean = false;\n /** An empty texture as placeholder */\n private dummyHeightMap: Texture2D;\n /** A texture encoding the ground elevation, updated once per redraw. Used by layers with offset mode */\n private heightMap?: HeightMapBuilder;\n private terrainPass!: TerrainPass;\n private terrainPickingPass!: TerrainPickingPass;\n /** One texture for each primitive terrain layer, into which the draped layers render */\n private terrainCovers: Map<string, TerrainCover> = new Map();\n\n initialize(gl: WebGLRenderingContext) {\n this.dummyHeightMap = new Texture2D(gl, {\n width: 1,\n height: 1,\n data: new Uint8Array([0, 0, 0, 0])\n });\n this.terrainPass = new TerrainPass(gl, {id: 'terrain'});\n this.terrainPickingPass = new TerrainPickingPass(gl, {id: 'terrain-picking'});\n\n if (HeightMapBuilder.isSupported(gl)) {\n this.heightMap = new HeightMapBuilder(gl);\n } else {\n log.warn('Terrain offset mode is not supported by this browser')();\n }\n\n ProgramManager.getDefaultProgramManager(gl).addDefaultModule(terrainModule);\n }\n\n preRender(gl: WebGLRenderingContext, opts: PreRenderOptions): void {\n if (!this.dummyHeightMap) {\n // First time this effect is in use, initialize resources and register the shader module\n this.initialize(gl);\n for (const layer of opts.layers) {\n // Force the terrain layer (and its descendents) to rebuild their models with the new shader\n if (layer.props.operation.includes('terrain')) {\n layer.setChangeFlags({extensionsChanged: true});\n }\n }\n }\n\n // @ts-expect-error pickZ only defined in picking pass\n if (opts.pickZ) {\n // Do not update if picking attributes\n this.isDrapingEnabled = false;\n return;\n }\n\n const {viewports, isPicking = false} = opts;\n this.isPicking = isPicking;\n this.isDrapingEnabled = true;\n\n // TODO - support multiple views?\n const viewport = viewports[0];\n const layers = (isPicking ? this.terrainPickingPass : this.terrainPass).getRenderableLayers(\n viewport,\n opts as TerrainPickingPassRenderOptions\n );\n\n const terrainLayers = layers.filter(l => l.props.operation.includes('terrain'));\n if (terrainLayers.length === 0) {\n return;\n }\n\n if (!isPicking) {\n const offsetLayers = layers.filter(l => l.state.terrainFittingMode === 'offset');\n if (offsetLayers.length > 0) {\n this._updateHeightMap(terrainLayers, viewport, opts);\n }\n }\n\n const drapeLayers = layers.filter(l => l.state.terrainFittingMode === 'drape');\n this._updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts);\n }\n\n getModuleParameters(layer: Layer): TerrainModuleSettings {\n const {terrainFittingMode} = layer.state;\n\n return {\n heightMap: this.heightMap?.getRenderFramebuffer(),\n heightMapBounds: this.heightMap?.bounds,\n dummyHeightMap: this.dummyHeightMap,\n terrainCover: this.isDrapingEnabled ? this.terrainCovers.get(layer.id) : null,\n useTerrainHeightMap: terrainFittingMode === 'offset',\n terrainSkipRender: terrainFittingMode === 'drape' || !layer.props.operation.includes('draw')\n };\n }\n\n cleanup(): void {\n if (this.dummyHeightMap) {\n this.dummyHeightMap.delete();\n this.dummyHeightMap = undefined;\n }\n\n if (this.heightMap) {\n this.heightMap.delete();\n this.heightMap = undefined;\n }\n\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.delete();\n }\n this.terrainCovers.clear();\n }\n\n private _updateHeightMap(terrainLayers: Layer[], viewport: Viewport, opts: PreRenderOptions) {\n if (!this.heightMap) {\n // Not supported\n return;\n }\n\n const shouldUpdate = this.heightMap.shouldUpdate({layers: terrainLayers, viewport});\n if (!shouldUpdate) {\n return;\n }\n\n this.terrainPass.renderHeightMap(this.heightMap, {\n ...opts,\n layers: terrainLayers,\n moduleParameters: {\n heightMapBounds: this.heightMap.bounds,\n dummyHeightMap: this.dummyHeightMap,\n devicePixelRatio: 1,\n drawToTerrainHeightMap: true\n }\n });\n }\n\n private _updateTerrainCovers(\n terrainLayers: Layer[],\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n // Mark a terrain cover as dirty if one of the drape layers needs redraw\n const layerNeedsRedraw: Record<string, boolean> = {};\n for (const layer of drapeLayers) {\n if (layer.state.terrainCoverNeedsRedraw) {\n layerNeedsRedraw[layer.id] = true;\n layer.state.terrainCoverNeedsRedraw = false;\n }\n }\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.isDirty = terrainCover.isDirty || terrainCover.shouldUpdate({layerNeedsRedraw});\n }\n\n for (const layer of terrainLayers) {\n this._updateTerrainCover(layer, drapeLayers, viewport, opts);\n }\n\n if (!this.isPicking) {\n this._pruneTerrainCovers();\n }\n }\n\n private _updateTerrainCover(\n terrainLayer: Layer,\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n const renderPass = this.isPicking ? this.terrainPickingPass : this.terrainPass;\n let terrainCover = this.terrainCovers.get(terrainLayer.id);\n if (!terrainCover) {\n terrainCover = new TerrainCover(terrainLayer);\n this.terrainCovers.set(terrainLayer.id, terrainCover);\n }\n try {\n const isDirty = terrainCover.shouldUpdate({\n targetLayer: terrainLayer,\n viewport,\n layers: drapeLayers\n });\n if (this.isPicking || terrainCover.isDirty || isDirty) {\n renderPass.renderTerrainCover(terrainCover, {\n ...opts,\n layers: drapeLayers,\n moduleParameters: {\n dummyHeightMap: this.dummyHeightMap,\n terrainSkipRender: false,\n devicePixelRatio: 1\n }\n });\n terrainCover.isDirty = false;\n }\n } catch (err) {\n terrainLayer.raiseError(err as Error, `Error rendering terrain cover ${terrainCover.id}`);\n }\n }\n\n private _pruneTerrainCovers() {\n /** Prune the cache, remove textures for layers that have been removed */\n const idsToRemove: string[] = [];\n for (const [id, terrainCover] of this.terrainCovers) {\n if (!terrainCover.isActive) {\n idsToRemove.push(id);\n }\n }\n for (const id of idsToRemove) {\n this.terrainCovers.delete(id);\n }\n }\n}\n"],"file":"terrain-effect.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/clip/clip.ts"],"names":["LayerExtension","defaultProps","clipBounds","clipByInstance","undefined","shaderFunction","shaderModuleVs","name","vs","injectionVs","shaderModuleFs","fs","injectionFs","ClipExtension","getShaders","getAttributeManager","attributes","props","Boolean","state","modules","inject","draw","uniforms","clip_bounds","corner0","projectPosition","corner1","Math","min","max"],"mappings":";AAoBA,SAAQA,cAAR,QAA4D,eAA5D;AAIA,MAAMC,YAAY,GAAG;AACnBC,EAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADO;AAEnBC,EAAAA,cAAc,EAAEC;AAFG,CAArB;AAiBA,MAAMC,cAAc,oNAApB;AAYA,MAAMC,cAA4B,GAAG;AACnCC,EAAAA,IAAI,EAAE,SAD6B;AAEnCC,EAAAA,EAAE,EAAEH;AAF+B,CAArC;AAKA,MAAMI,WAAW,GAAG;AAClB,iDADkB;AAIlB,6GAJkB;AAOlB,iDAPkB;AAUlB;AAVkB,CAApB;AAmBA,MAAMC,cAA4B,GAAG;AACnCH,EAAAA,IAAI,EAAE,SAD6B;AAEnCI,EAAAA,EAAE,EAAEN;AAF+B,CAArC;AAKA,MAAMO,WAAW,GAAG;AAClB,qDADkB;AAIlB,qFAJkB;AAOlB,qDAPkB;AAUlB;AAVkB,CAApB;AAgBA,eAAe,MAAMC,aAAN,SAA4Bb,cAA5B,CAA2C;AAIxDc,EAAAA,UAAU,GAAkC;AAM1C,QAAIX,cAAc,IAAG,uBAAuB,KAAKY,mBAAL,GAA2BC,UAArD,CAAlB;;AAEA,QAAI,KAAKC,KAAL,CAAWd,cAAX,KAA8BC,SAAlC,EAA6C;AAC3CD,MAAAA,cAAc,GAAGe,OAAO,CAAC,KAAKD,KAAL,CAAWd,cAAZ,CAAxB;AACD;;AACD,SAAKgB,KAAL,CAAWhB,cAAX,GAA4BA,cAA5B;AAEA,WAAOA,cAAc,GACjB;AACEiB,MAAAA,OAAO,EAAE,CAACd,cAAD,CADX;AAEEe,MAAAA,MAAM,EAAEZ;AAFV,KADiB,GAKjB;AACEW,MAAAA,OAAO,EAAE,CAACV,cAAD,CADX;AAEEW,MAAAA,MAAM,EAAET;AAFV,KALJ;AASD;;AAGDU,EAAAA,IAAI,CAA4C;AAACC,IAAAA;AAAD,GAA5C,EAAmE;AACrE,UAAM;AAACrB,MAAAA;AAAD,QAAe,KAAKe,KAA1B;;AACA,QAAI,KAAKE,KAAL,CAAWhB,cAAf,EAA+B;AAC7BoB,MAAAA,QAAQ,CAACC,WAAT,GAAuBtB,UAAvB;AACD,KAFD,MAEO;AACL,YAAMuB,OAAO,GAAG,KAAKC,eAAL,CAAqB,CAACxB,UAAU,CAAC,CAAD,CAAX,EAAgBA,UAAU,CAAC,CAAD,CAA1B,EAA+B,CAA/B,CAArB,CAAhB;AACA,YAAMyB,OAAO,GAAG,KAAKD,eAAL,CAAqB,CAACxB,UAAU,CAAC,CAAD,CAAX,EAAgBA,UAAU,CAAC,CAAD,CAA1B,EAA+B,CAA/B,CAArB,CAAhB;AAEAqB,MAAAA,QAAQ,CAACC,WAAT,GAAuB,CACrBI,IAAI,CAACC,GAAL,CAASJ,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CADqB,EAErBC,IAAI,CAACC,GAAL,CAASJ,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAFqB,EAGrBC,IAAI,CAACE,GAAL,CAASL,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAHqB,EAIrBC,IAAI,CAACE,GAAL,CAASL,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAJqB,CAAvB;AAMD;AACF;;AA5CuD;;gBAArCd,a,
|
|
1
|
+
{"version":3,"sources":["../../../src/clip/clip.ts"],"names":["LayerExtension","defaultProps","clipBounds","clipByInstance","undefined","shaderFunction","shaderModuleVs","name","vs","injectionVs","shaderModuleFs","fs","injectionFs","ClipExtension","getShaders","getAttributeManager","attributes","props","Boolean","state","modules","inject","draw","uniforms","clip_bounds","corner0","projectPosition","corner1","Math","min","max"],"mappings":";AAoBA,SAAQA,cAAR,QAA4D,eAA5D;AAIA,MAAMC,YAAY,GAAG;AACnBC,EAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADO;AAEnBC,EAAAA,cAAc,EAAEC;AAFG,CAArB;AAiBA,MAAMC,cAAc,oNAApB;AAYA,MAAMC,cAA4B,GAAG;AACnCC,EAAAA,IAAI,EAAE,SAD6B;AAEnCC,EAAAA,EAAE,EAAEH;AAF+B,CAArC;AAKA,MAAMI,WAAW,GAAG;AAClB,iDADkB;AAIlB,6GAJkB;AAOlB,iDAPkB;AAUlB;AAVkB,CAApB;AAmBA,MAAMC,cAA4B,GAAG;AACnCH,EAAAA,IAAI,EAAE,SAD6B;AAEnCI,EAAAA,EAAE,EAAEN;AAF+B,CAArC;AAKA,MAAMO,WAAW,GAAG;AAClB,qDADkB;AAIlB,qFAJkB;AAOlB,qDAPkB;AAUlB;AAVkB,CAApB;AAgBA,eAAe,MAAMC,aAAN,SAA4Bb,cAA5B,CAA2C;AAIxDc,EAAAA,UAAU,GAAkC;AAM1C,QAAIX,cAAc,IAAG,uBAAuB,KAAKY,mBAAL,GAA2BC,UAArD,CAAlB;;AAEA,QAAI,KAAKC,KAAL,CAAWd,cAAX,KAA8BC,SAAlC,EAA6C;AAC3CD,MAAAA,cAAc,GAAGe,OAAO,CAAC,KAAKD,KAAL,CAAWd,cAAZ,CAAxB;AACD;;AACD,SAAKgB,KAAL,CAAWhB,cAAX,GAA4BA,cAA5B;AAEA,WAAOA,cAAc,GACjB;AACEiB,MAAAA,OAAO,EAAE,CAACd,cAAD,CADX;AAEEe,MAAAA,MAAM,EAAEZ;AAFV,KADiB,GAKjB;AACEW,MAAAA,OAAO,EAAE,CAACV,cAAD,CADX;AAEEW,MAAAA,MAAM,EAAET;AAFV,KALJ;AASD;;AAGDU,EAAAA,IAAI,CAA4C;AAACC,IAAAA;AAAD,GAA5C,EAAmE;AACrE,UAAM;AAACrB,MAAAA;AAAD,QAAe,KAAKe,KAA1B;;AACA,QAAI,KAAKE,KAAL,CAAWhB,cAAf,EAA+B;AAC7BoB,MAAAA,QAAQ,CAACC,WAAT,GAAuBtB,UAAvB;AACD,KAFD,MAEO;AACL,YAAMuB,OAAO,GAAG,KAAKC,eAAL,CAAqB,CAACxB,UAAU,CAAC,CAAD,CAAX,EAAgBA,UAAU,CAAC,CAAD,CAA1B,EAA+B,CAA/B,CAArB,CAAhB;AACA,YAAMyB,OAAO,GAAG,KAAKD,eAAL,CAAqB,CAACxB,UAAU,CAAC,CAAD,CAAX,EAAgBA,UAAU,CAAC,CAAD,CAA1B,EAA+B,CAA/B,CAArB,CAAhB;AAEAqB,MAAAA,QAAQ,CAACC,WAAT,GAAuB,CACrBI,IAAI,CAACC,GAAL,CAASJ,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CADqB,EAErBC,IAAI,CAACC,GAAL,CAASJ,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAFqB,EAGrBC,IAAI,CAACE,GAAL,CAASL,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAHqB,EAIrBC,IAAI,CAACE,GAAL,CAASL,OAAO,CAAC,CAAD,CAAhB,EAAqBE,OAAO,CAAC,CAAD,CAA5B,CAJqB,CAAvB;AAMD;AACF;;AA5CuD;;gBAArCd,a,kBACGZ,Y;;gBADHY,a,mBAEI,e","sourcesContent":["// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport {LayerExtension, _ShaderModule as ShaderModule} from '@deck.gl/core';\n\nimport type {Layer} from '@deck.gl/core';\n\nconst defaultProps = {\n clipBounds: [0, 0, 1, 1],\n clipByInstance: undefined\n};\n\nexport type ClipExtensionProps = {\n /** Rectangular bounds to be used for clipping the rendered region, in `[left, bottom, right, top]`.\n * @default [0, 0, 1, 1]\n */\n clipBounds?: [number, number, number, number];\n /**\n * Controls whether an object is clipped by its anchor (e.g. icon, point) or by its geometry (e.g. path, polygon).\n * If not specified, it is automatically deduced from the layer.\n */\n clipByInstance?: boolean;\n};\n\nconst shaderFunction = `\nuniform vec4 clip_bounds;\n\nbool clip_isInBounds(vec2 position) {\n return position.x >= clip_bounds[0] && position.y >= clip_bounds[1] && position.x < clip_bounds[2] && position.y < clip_bounds[3];\n}\n`;\n\n/*\n * The vertex-shader version clips geometries by their anchor position\n * e.g. ScatterplotLayer - show if the center of a circle is within bounds\n */\nconst shaderModuleVs: ShaderModule = {\n name: 'clip-vs',\n vs: shaderFunction\n};\n\nconst injectionVs = {\n 'vs:#decl': `\nvarying float clip_isVisible;\n`,\n 'vs:DECKGL_FILTER_GL_POSITION': `\n clip_isVisible = float(clip_isInBounds(geometry.worldPosition.xy));\n`,\n 'fs:#decl': `\nvarying float clip_isVisible;\n`,\n 'fs:DECKGL_FILTER_COLOR': `\n if (clip_isVisible < 0.5) discard;\n`\n};\n\n/*\n * The fragment-shader version clips pixels at the bounds\n * e.g. PolygonLayer - show the part of the polygon that intersect with the bounds\n */\nconst shaderModuleFs: ShaderModule = {\n name: 'clip-fs',\n fs: shaderFunction\n};\n\nconst injectionFs = {\n 'vs:#decl': `\nvarying vec2 clip_commonPosition;\n`,\n 'vs:DECKGL_FILTER_GL_POSITION': `\n clip_commonPosition = geometry.position.xy;\n`,\n 'fs:#decl': `\nvarying vec2 clip_commonPosition;\n`,\n 'fs:DECKGL_FILTER_COLOR': `\n if (!clip_isInBounds(clip_commonPosition)) discard;\n`\n};\n\n/** Adds support for clipping rendered layers by rectangular bounds. */\nexport default class ClipExtension extends LayerExtension {\n static defaultProps = defaultProps;\n static extensionName = 'ClipExtension';\n\n getShaders(this: Layer<ClipExtensionProps>) {\n // If `clipByInstance: true`, the entire object is shown/hidden based on its anchor position (done by vertex shader)\n // Otherwise, the object is trimmed by the clip bounds (done by fragment shader)\n\n // Default behavior: consider a layer instanced if it has attribute `instancePositions`\n // @ts-expect-error attributeManager is always defined for primitive layers\n let clipByInstance = 'instancePositions' in this.getAttributeManager().attributes;\n // Users can override by setting the `clipByInstance` prop\n if (this.props.clipByInstance !== undefined) {\n clipByInstance = Boolean(this.props.clipByInstance);\n }\n this.state.clipByInstance = clipByInstance;\n\n return clipByInstance\n ? {\n modules: [shaderModuleVs],\n inject: injectionVs\n }\n : {\n modules: [shaderModuleFs],\n inject: injectionFs\n };\n }\n\n /* eslint-disable camelcase */\n draw(this: Layer<Required<ClipExtensionProps>>, {uniforms}: any): void {\n const {clipBounds} = this.props;\n if (this.state.clipByInstance) {\n uniforms.clip_bounds = clipBounds;\n } else {\n const corner0 = this.projectPosition([clipBounds[0], clipBounds[1], 0]);\n const corner1 = this.projectPosition([clipBounds[2], clipBounds[3], 0]);\n\n uniforms.clip_bounds = [\n Math.min(corner0[0], corner1[0]),\n Math.min(corner0[1], corner1[1]),\n Math.max(corner0[0], corner1[0]),\n Math.max(corner0[1], corner1[1])\n ];\n }\n }\n}\n"],"file":"clip.js"}
|
|
@@ -33,7 +33,7 @@ export default class CollideEffect {
|
|
|
33
33
|
viewports,
|
|
34
34
|
onViewportActive,
|
|
35
35
|
views,
|
|
36
|
-
|
|
36
|
+
isPicking,
|
|
37
37
|
preRenderStats = {}
|
|
38
38
|
}) {
|
|
39
39
|
var _preRenderStats$mask;
|
|
@@ -45,7 +45,7 @@ export default class CollideEffect {
|
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
if (
|
|
48
|
+
if (isPicking) {
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -119,6 +119,7 @@ export default class CollideEffect {
|
|
|
119
119
|
const collideFBO = this.collideFBOs[collideGroup];
|
|
120
120
|
this.collidePass.renderCollideMap(collideFBO, {
|
|
121
121
|
pass: 'collide',
|
|
122
|
+
isPicking: true,
|
|
122
123
|
layers: renderInfo.layers,
|
|
123
124
|
effects,
|
|
124
125
|
layerFilter,
|
|
@@ -1 +1 @@
|
|
|
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","pass","preRenderStats","dummyCollideMap","width","height","startsWith","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","moduleParameters","devicePixelRatio","channelMap","layer","channelInfo","push","getBounds","Object","keys","createFBO","destroyFBO","getModuleParameters","cleanup","delete","undefined","collideMap","parameters","depthBuffer","format","attachments","fbo","attachment","values"],"mappings":";AAAA,SAAQA,WAAR,EAAqBC,YAArB,EAAmCC,SAAnC,EAA8CC,gBAA9C,QAAqE,eAArE;AACA,SAAQC,MAAR,QAAqB,eAArB;AACA,SAAQC,UAAU,IAAIC,SAAtB,QAAsC,eAAtC;AAEA,OAAOC,WAAP,MAAwB,gBAAxB;AACA,OAAOC,UAAP,MAA6C,qBAA7C;AASA,MAAMC,SAAS,GAAG,CAAlB;AASA,eAAe,MAAMC,aAAN,CAAsC;AAAA;AAAA,gCAC9C,gBAD8C;;AAAA,mCAE3C,IAF2C;;AAAA,0CAGpC,IAHoC;;AAAA,mCAI3C,CAJ2C;;AAAA,sCAMJ,EANI;;AAAA;;AAAA,yCAQA,EARA;;AAAA;;AAAA;AAAA;;AAYnDC,EAAAA,SAAS,CACPC,EADO,EAEP;AACEC,IAAAA,OAAO,EAAEC,UADX;AAEEC,IAAAA,MAFF;AAGEC,IAAAA,WAHF;AAIEC,IAAAA,SAJF;AAKEC,IAAAA,gBALF;AAMEC,IAAAA,KANF;AAOEC,IAAAA,IAPF;AAQEC,IAAAA,cAAc,GAAG;AARnB,GAFO,EAYD;AAAA;;AACN,QAAI,CAAC,KAAKC,eAAV,EAA2B;AACzB,WAAKA,eAAL,GAAuB,IAAIpB,SAAJ,CAAcU,EAAd,EAAkB;AAACW,QAAAA,KAAK,EAAE,CAAR;AAAWC,QAAAA,MAAM,EAAE;AAAnB,OAAlB,CAAvB;AACD;;AAED,QAAIJ,IAAI,CAACK,UAAL,CAAgB,SAAhB,CAAJ,EAAgC;AAE9B;AACD;;AAED,UAAMC,aAAa,GAAGX,MAAM,CAACY,MAAP,CAEpB,CAAC;AAACC,MAAAA,KAAK,EAAE;AAACC,QAAAA,OAAD;AAAUC,QAAAA;AAAV;AAAR,KAAD,KAAwCD,OAAO,IAAIC,cAF/B,CAAtB;;AAIA,QAAIJ,aAAa,CAACK,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,WAAKC,QAAL,GAAgB,EAAhB;AACA;AACD;;AAED,QAAI,CAAC,KAAKC,WAAV,EAAuB;AACrB,WAAKA,WAAL,GAAmB,IAAI1B,WAAJ,CAAgBK,EAAhB,EAAoB;AAACsB,QAAAA,EAAE,EAAE;AAAL,OAApB,CAAnB;AACD;;AAGD,UAAMrB,OAAO,GAAGC,UAAH,aAAGA,UAAH,uBAAGA,UAAU,CAAEa,MAAZ,CAAmBQ,CAAC,IAAIA,CAAC,CAACC,WAAF,KAAkB5B,UAA1C,CAAhB;AACA,UAAM6B,kBAAkB,2BAAIhB,cAAc,CAAC,aAAD,CAAlB,yDAAG,qBAAuDiB,SAAlF;;AAGA,UAAMN,QAAQ,GAAG,KAAKO,oBAAL,CAA0B3B,EAA1B,EAA8Bc,aAA9B,CAAjB;;AAEA,UAAMc,QAAQ,GAAGvB,SAAS,CAAC,CAAD,CAA1B;AACA,UAAMwB,eAAe,GACnB,CAAC,KAAKC,YAAN,IAAsB,CAAC,KAAKA,YAAL,CAAkBtC,MAAlB,CAAyBoC,QAAzB,CAAvB,IAA6DH,kBAD/D;;AAIA,SAAK,MAAMM,YAAX,IAA2BX,QAA3B,EAAqC;AACnC,YAAMY,UAAU,GAAG,KAAKC,WAAL,CAAiBF,YAAjB,CAAnB;AACA,YAAMG,UAAU,GAAGd,QAAQ,CAACW,YAAD,CAA3B;AACAC,MAAAA,UAAU,CAACG,MAAX,CAAkB;AAChBxB,QAAAA,KAAK,EAAEX,EAAE,CAACoC,MAAH,CAAUzB,KAAV,GAAkBd,SADT;AAEhBe,QAAAA,MAAM,EAAEZ,EAAE,CAACoC,MAAH,CAAUxB,MAAV,GAAmBf;AAFX,OAAlB;;AAIA,WAAKwC,OAAL,CAAaH,UAAb,EAAyB;AACvBjC,QAAAA,OADuB;AAEvBG,QAAAA,WAFuB;AAGvBE,QAAAA,gBAHuB;AAIvBC,QAAAA,KAJuB;AAKvBqB,QAAAA,QALuB;AAMvBC,QAAAA;AANuB,OAAzB;AAQD;AAGF;;AAEOQ,EAAAA,OAAO,CACbH,UADa,EAEb;AACEjC,IAAAA,OADF;AAEEG,IAAAA,WAFF;AAGEE,IAAAA,gBAHF;AAIEC,IAAAA,KAJF;AAKEqB,IAAAA,QALF;AAMEC,IAAAA;AANF,GAFa,EAiBb;AACA,UAAM;AAACE,MAAAA;AAAD,QAAiBG,UAAvB;AACA,UAAMI,aAAa,GAAG,KAAKlB,QAAL,CAAcW,YAAd,CAAtB;;AACA,QAAI,CAACO,aAAL,EAAoB;AAClB;AACD;;AAED,UAAMC,WAAW,GACfV,eAAe,IAEfK,UAAU,KAAKI,aAFf,IAIA,CAAC5C,SAAS,CAAC4C,aAAa,CAACnC,MAAf,EAAuB+B,UAAU,CAAC/B,MAAlC,EAA0C,CAA1C,CAJV,IAMA+B,UAAU,CAACM,WAAX,CAAuBC,IAAvB,CAA4B,CAACC,CAAD,EAAIC,CAAJ,KAAU,CAACnD,MAAM,CAACkD,CAAD,EAAIJ,aAAa,CAACE,WAAd,CAA0BG,CAA1B,CAAJ,CAA7C,CAPF;AASA,SAAKvB,QAAL,CAAcW,YAAd,IAA8BG,UAA9B;;AAEA,QAAIK,WAAJ,EAAiB;AACf,WAAKT,YAAL,GAAoBF,QAApB;AACA,YAAMI,UAAU,GAAG,KAAKC,WAAL,CAAiBF,YAAjB,CAAnB;AAGA,WAAKV,WAAL,CAAkBuB,gBAAlB,CAAmCZ,UAAnC,EAA+C;AAC7CxB,QAAAA,IAAI,EAAE,SADuC;AAE7CL,QAAAA,MAAM,EAAE+B,UAAU,CAAC/B,MAF0B;AAG7CF,QAAAA,OAH6C;AAI7CG,QAAAA,WAJ6C;AAK7CC,QAAAA,SAAS,EAAEuB,QAAQ,GAAG,CAACA,QAAD,CAAH,GAAgB,EALU;AAM7CtB,QAAAA,gBAN6C;AAO7CC,QAAAA,KAP6C;AAQ7CsC,QAAAA,gBAAgB,EAAE;AAEhBnC,UAAAA,eAAe,EAAE,KAAKA,eAFN;AAGhBoC,UAAAA,gBAAgB,EAAEvD,gBAAgB,CAACyC,UAAU,CAAChC,EAAZ,CAAhB,GAAkCH;AAHpC;AAR2B,OAA/C;AAcD;AACF;;AAMO8B,EAAAA,oBAAoB,CAC1B3B,EAD0B,EAE1Bc,aAF0B,EAGE;AAC5B,UAAMiC,UAAU,GAAG,EAAnB;;AACA,SAAK,MAAMC,KAAX,IAAoBlC,aAApB,EAAmC;AACjC,YAAM;AAACiB,QAAAA;AAAD,UAAiBiB,KAAK,CAAChC,KAA7B;AACA,UAAIiC,WAAW,GAAGF,UAAU,CAAChB,YAAD,CAA5B;;AACA,UAAI,CAACkB,WAAL,EAAkB;AAChBA,QAAAA,WAAW,GAAG;AACZlB,UAAAA,YADY;AAEZ5B,UAAAA,MAAM,EAAE,EAFI;AAGZqC,UAAAA,WAAW,EAAE;AAHD,SAAd;AAKAO,QAAAA,UAAU,CAAChB,YAAD,CAAV,GAA2BkB,WAA3B;AACD;;AACDA,MAAAA,WAAW,CAAC9C,MAAZ,CAAmB+C,IAAnB,CAAwBF,KAAxB;AACAC,MAAAA,WAAW,CAACT,WAAZ,CAAwBU,IAAxB,CAA6BF,KAAK,CAACG,SAAN,EAA7B;AACD;;AAGD,SAAK,MAAMpB,YAAX,IAA2BqB,MAAM,CAACC,IAAP,CAAYN,UAAZ,CAA3B,EAAoD;AAClD,UAAI,CAAC,KAAKd,WAAL,CAAiBF,YAAjB,CAAL,EAAqC;AACnC,aAAKuB,SAAL,CAAetD,EAAf,EAAmB+B,YAAnB;AACD;;AACD,UAAI,CAAC,KAAKX,QAAL,CAAcW,YAAd,CAAL,EAAkC;AAChC,aAAKX,QAAL,CAAcW,YAAd,IAA8BgB,UAAU,CAAChB,YAAD,CAAxC;AACD;AACF;;AACD,SAAK,MAAMA,YAAX,IAA2BqB,MAAM,CAACC,IAAP,CAAY,KAAKpB,WAAjB,CAA3B,EAA0D;AACxD,UAAI,CAACc,UAAU,CAAChB,YAAD,CAAf,EAA+B;AAC7B,aAAKwB,UAAL,CAAgBxB,YAAhB;AACD;AACF;;AAED,WAAOgB,UAAP;AACD;;AAEDS,EAAAA,mBAAmB,CAACR,KAAD,EAGjB;AACA,UAAM;AAACjB,MAAAA;AAAD,QAAkBiB,KAAD,CAAwChC,KAA/D;AACA,UAAM;AAACiB,MAAAA,WAAD;AAAcvB,MAAAA;AAAd,QAAiC,IAAvC;AACA,WAAO;AAACsB,MAAAA,UAAU,EAAEC,WAAW,CAACF,YAAD,CAAxB;AAAwCrB,MAAAA;AAAxC,KAAP;AACD;;AAED+C,EAAAA,OAAO,GAAS;AACd,QAAI,KAAK/C,eAAT,EAA0B;AACxB,WAAKA,eAAL,CAAqBgD,MAArB;AACA,WAAKhD,eAAL,GAAuBiD,SAAvB;AACD;;AACD,SAAKvC,QAAL,GAAgB,EAAhB;;AACA,SAAK,MAAMW,YAAX,IAA2BqB,MAAM,CAACC,IAAP,CAAY,KAAKpB,WAAjB,CAA3B,EAA0D;AACxD,WAAKsB,UAAL,CAAgBxB,YAAhB;AACD;;AACD,SAAKE,WAAL,GAAmB,EAAnB;AACA,SAAKH,YAAL,GAAoB6B,SAApB;AACD;;AAEDL,EAAAA,SAAS,CAACtD,EAAD,EAA4B+B,YAA5B,EAAkD;AACzD,UAAM;AAACpB,MAAAA,KAAD;AAAQC,MAAAA;AAAR,QAAkBZ,EAAE,CAACoC,MAA3B;AACA,UAAMwB,UAAU,GAAG,IAAItE,SAAJ,CAAcU,EAAd,EAAkB;AACnCW,MAAAA,KADmC;AAEnCC,MAAAA,MAFmC;AAGnCiD,MAAAA,UAAU,EAAE;AACV,qBADU;AAEV,qBAFU;AAGV,sBAHU;AAIV;AAJU;AAHuB,KAAlB,CAAnB;AAWA,UAAMC,WAAW,GAAG,IAAIzE,YAAJ,CAAiBW,EAAjB,EAAqB;AAAC+D,MAAAA,MAAM,OAAP;AAA+BpD,MAAAA,KAA/B;AAAsCC,MAAAA;AAAtC,KAArB,CAApB;AACA,SAAKqB,WAAL,CAAiBF,YAAjB,IAAiC,IAAI3C,WAAJ,CAAgBY,EAAhB,EAAoB;AACnDsB,MAAAA,EAAE,oBAAaS,YAAb,CADiD;AAEnDpB,MAAAA,KAFmD;AAGnDC,MAAAA,MAHmD;AAInDoD,MAAAA,WAAW,EAAE;AACX,iBAAwBJ,UADb;AAEX,iBAAuBE;AAFZ;AAJsC,KAApB,CAAjC;AASD;;AAEDP,EAAAA,UAAU,CAACxB,YAAD,EAAuB;AAC/B,UAAMkC,GAAG,GAAG,KAAKhC,WAAL,CAAiBF,YAAjB,CAAZ;;AACA,SAAK,MAAMmC,UAAX,IAAyBd,MAAM,CAACe,MAAP,CAAcF,GAAG,CAACD,WAAlB,CAAzB,EAAwE;AACtEE,MAAAA,UAAU,CAACR,MAAX;AACD;;AACDO,IAAAA,GAAG,CAACP,MAAJ;AACA,WAAO,KAAKzB,WAAL,CAAiBF,YAAjB,CAAP;AACD;;AAxOkD","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 pass,\n preRenderStats = {}\n }: PreRenderOptions\n ): void {\n if (!this.dummyCollideMap) {\n this.dummyCollideMap = new Texture2D(gl, {width: 1, height: 1});\n }\n\n if (pass.startsWith('picking')) {\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 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
|
+
{"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":";AAAA,SAAQA,WAAR,EAAqBC,YAArB,EAAmCC,SAAnC,EAA8CC,gBAA9C,QAAqE,eAArE;AACA,SAAQC,MAAR,QAAqB,eAArB;AACA,SAAQC,UAAU,IAAIC,SAAtB,QAAsC,eAAtC;AAEA,OAAOC,WAAP,MAAwB,gBAAxB;AACA,OAAOC,UAAP,MAA6C,qBAA7C;AASA,MAAMC,SAAS,GAAG,CAAlB;AASA,eAAe,MAAMC,aAAN,CAAsC;AAAA;AAAA,gCAC9C,gBAD8C;;AAAA,mCAE3C,IAF2C;;AAAA,0CAGpC,IAHoC;;AAAA,mCAI3C,CAJ2C;;AAAA,sCAMJ,EANI;;AAAA;;AAAA,yCAQA,EARA;;AAAA;;AAAA;AAAA;;AAYnDC,EAAAA,SAAS,CACPC,EADO,EAEP;AACEC,IAAAA,OAAO,EAAEC,UADX;AAEEC,IAAAA,MAFF;AAGEC,IAAAA,WAHF;AAIEC,IAAAA,SAJF;AAKEC,IAAAA,gBALF;AAMEC,IAAAA,KANF;AAOEC,IAAAA,SAPF;AAQEC,IAAAA,cAAc,GAAG;AARnB,GAFO,EAYD;AAAA;;AACN,QAAI,CAAC,KAAKC,eAAV,EAA2B;AACzB,WAAKA,eAAL,GAAuB,IAAIpB,SAAJ,CAAcU,EAAd,EAAkB;AAACW,QAAAA,KAAK,EAAE,CAAR;AAAWC,QAAAA,MAAM,EAAE;AAAnB,OAAlB,CAAvB;AACD;;AAED,QAAIJ,SAAJ,EAAe;AAEb;AACD;;AAED,UAAMK,aAAa,GAAGV,MAAM,CAACW,MAAP,CAEpB,CAAC;AAACC,MAAAA,KAAK,EAAE;AAACC,QAAAA,OAAD;AAAUC,QAAAA;AAAV;AAAR,KAAD,KAAwCD,OAAO,IAAIC,cAF/B,CAAtB;;AAIA,QAAIJ,aAAa,CAACK,MAAd,KAAyB,CAA7B,EAAgC;AAC9B,WAAKC,QAAL,GAAgB,EAAhB;AACA;AACD;;AAED,QAAI,CAAC,KAAKC,WAAV,EAAuB;AACrB,WAAKA,WAAL,GAAmB,IAAIzB,WAAJ,CAAgBK,EAAhB,EAAoB;AAACqB,QAAAA,EAAE,EAAE;AAAL,OAApB,CAAnB;AACD;;AAGD,UAAMpB,OAAO,GAAGC,UAAH,aAAGA,UAAH,uBAAGA,UAAU,CAAEY,MAAZ,CAAmBQ,CAAC,IAAIA,CAAC,CAACC,WAAF,KAAkB3B,UAA1C,CAAhB;AACA,UAAM4B,kBAAkB,2BAAIf,cAAc,CAAC,aAAD,CAAlB,yDAAG,qBAAuDgB,SAAlF;;AAGA,UAAMN,QAAQ,GAAG,KAAKO,oBAAL,CAA0B1B,EAA1B,EAA8Ba,aAA9B,CAAjB;;AAEA,UAAMc,QAAQ,GAAGtB,SAAS,CAAC,CAAD,CAA1B;AACA,UAAMuB,eAAe,GACnB,CAAC,KAAKC,YAAN,IAAsB,CAAC,KAAKA,YAAL,CAAkBrC,MAAlB,CAAyBmC,QAAzB,CAAvB,IAA6DH,kBAD/D;;AAIA,SAAK,MAAMM,YAAX,IAA2BX,QAA3B,EAAqC;AACnC,YAAMY,UAAU,GAAG,KAAKC,WAAL,CAAiBF,YAAjB,CAAnB;AACA,YAAMG,UAAU,GAAGd,QAAQ,CAACW,YAAD,CAA3B;AACAC,MAAAA,UAAU,CAACG,MAAX,CAAkB;AAChBvB,QAAAA,KAAK,EAAEX,EAAE,CAACmC,MAAH,CAAUxB,KAAV,GAAkBd,SADT;AAEhBe,QAAAA,MAAM,EAAEZ,EAAE,CAACmC,MAAH,CAAUvB,MAAV,GAAmBf;AAFX,OAAlB;;AAIA,WAAKuC,OAAL,CAAaH,UAAb,EAAyB;AACvBhC,QAAAA,OADuB;AAEvBG,QAAAA,WAFuB;AAGvBE,QAAAA,gBAHuB;AAIvBC,QAAAA,KAJuB;AAKvBoB,QAAAA,QALuB;AAMvBC,QAAAA;AANuB,OAAzB;AAQD;AAGF;;AAEOQ,EAAAA,OAAO,CACbH,UADa,EAEb;AACEhC,IAAAA,OADF;AAEEG,IAAAA,WAFF;AAGEE,IAAAA,gBAHF;AAIEC,IAAAA,KAJF;AAKEoB,IAAAA,QALF;AAMEC,IAAAA;AANF,GAFa,EAiBb;AACA,UAAM;AAACE,MAAAA;AAAD,QAAiBG,UAAvB;AACA,UAAMI,aAAa,GAAG,KAAKlB,QAAL,CAAcW,YAAd,CAAtB;;AACA,QAAI,CAACO,aAAL,EAAoB;AAClB;AACD;;AAED,UAAMC,WAAW,GACfV,eAAe,IAEfK,UAAU,KAAKI,aAFf,IAIA,CAAC3C,SAAS,CAAC2C,aAAa,CAAClC,MAAf,EAAuB8B,UAAU,CAAC9B,MAAlC,EAA0C,CAA1C,CAJV,IAMA8B,UAAU,CAACM,WAAX,CAAuBC,IAAvB,CAA4B,CAACC,CAAD,EAAIC,CAAJ,KAAU,CAAClD,MAAM,CAACiD,CAAD,EAAIJ,aAAa,CAACE,WAAd,CAA0BG,CAA1B,CAAJ,CAA7C,CAPF;AASA,SAAKvB,QAAL,CAAcW,YAAd,IAA8BG,UAA9B;;AAEA,QAAIK,WAAJ,EAAiB;AACf,WAAKT,YAAL,GAAoBF,QAApB;AACA,YAAMI,UAAU,GAAG,KAAKC,WAAL,CAAiBF,YAAjB,CAAnB;AAGA,WAAKV,WAAL,CAAkBuB,gBAAlB,CAAmCZ,UAAnC,EAA+C;AAC7Ca,QAAAA,IAAI,EAAE,SADuC;AAE7CpC,QAAAA,SAAS,EAAE,IAFkC;AAG7CL,QAAAA,MAAM,EAAE8B,UAAU,CAAC9B,MAH0B;AAI7CF,QAAAA,OAJ6C;AAK7CG,QAAAA,WAL6C;AAM7CC,QAAAA,SAAS,EAAEsB,QAAQ,GAAG,CAACA,QAAD,CAAH,GAAgB,EANU;AAO7CrB,QAAAA,gBAP6C;AAQ7CC,QAAAA,KAR6C;AAS7CsC,QAAAA,gBAAgB,EAAE;AAEhBnC,UAAAA,eAAe,EAAE,KAAKA,eAFN;AAGhBoC,UAAAA,gBAAgB,EAAEvD,gBAAgB,CAACwC,UAAU,CAAC/B,EAAZ,CAAhB,GAAkCH;AAHpC;AAT2B,OAA/C;AAeD;AACF;;AAMO6B,EAAAA,oBAAoB,CAC1B1B,EAD0B,EAE1Ba,aAF0B,EAGE;AAC5B,UAAMkC,UAAU,GAAG,EAAnB;;AACA,SAAK,MAAMC,KAAX,IAAoBnC,aAApB,EAAmC;AACjC,YAAM;AAACiB,QAAAA;AAAD,UAAiBkB,KAAK,CAACjC,KAA7B;AACA,UAAIkC,WAAW,GAAGF,UAAU,CAACjB,YAAD,CAA5B;;AACA,UAAI,CAACmB,WAAL,EAAkB;AAChBA,QAAAA,WAAW,GAAG;AACZnB,UAAAA,YADY;AAEZ3B,UAAAA,MAAM,EAAE,EAFI;AAGZoC,UAAAA,WAAW,EAAE;AAHD,SAAd;AAKAQ,QAAAA,UAAU,CAACjB,YAAD,CAAV,GAA2BmB,WAA3B;AACD;;AACDA,MAAAA,WAAW,CAAC9C,MAAZ,CAAmB+C,IAAnB,CAAwBF,KAAxB;AACAC,MAAAA,WAAW,CAACV,WAAZ,CAAwBW,IAAxB,CAA6BF,KAAK,CAACG,SAAN,EAA7B;AACD;;AAGD,SAAK,MAAMrB,YAAX,IAA2BsB,MAAM,CAACC,IAAP,CAAYN,UAAZ,CAA3B,EAAoD;AAClD,UAAI,CAAC,KAAKf,WAAL,CAAiBF,YAAjB,CAAL,EAAqC;AACnC,aAAKwB,SAAL,CAAetD,EAAf,EAAmB8B,YAAnB;AACD;;AACD,UAAI,CAAC,KAAKX,QAAL,CAAcW,YAAd,CAAL,EAAkC;AAChC,aAAKX,QAAL,CAAcW,YAAd,IAA8BiB,UAAU,CAACjB,YAAD,CAAxC;AACD;AACF;;AACD,SAAK,MAAMA,YAAX,IAA2BsB,MAAM,CAACC,IAAP,CAAY,KAAKrB,WAAjB,CAA3B,EAA0D;AACxD,UAAI,CAACe,UAAU,CAACjB,YAAD,CAAf,EAA+B;AAC7B,aAAKyB,UAAL,CAAgBzB,YAAhB;AACD;AACF;;AAED,WAAOiB,UAAP;AACD;;AAEDS,EAAAA,mBAAmB,CAACR,KAAD,EAGjB;AACA,UAAM;AAAClB,MAAAA;AAAD,QAAkBkB,KAAD,CAAwCjC,KAA/D;AACA,UAAM;AAACiB,MAAAA,WAAD;AAActB,MAAAA;AAAd,QAAiC,IAAvC;AACA,WAAO;AAACqB,MAAAA,UAAU,EAAEC,WAAW,CAACF,YAAD,CAAxB;AAAwCpB,MAAAA;AAAxC,KAAP;AACD;;AAED+C,EAAAA,OAAO,GAAS;AACd,QAAI,KAAK/C,eAAT,EAA0B;AACxB,WAAKA,eAAL,CAAqBgD,MAArB;AACA,WAAKhD,eAAL,GAAuBiD,SAAvB;AACD;;AACD,SAAKxC,QAAL,GAAgB,EAAhB;;AACA,SAAK,MAAMW,YAAX,IAA2BsB,MAAM,CAACC,IAAP,CAAY,KAAKrB,WAAjB,CAA3B,EAA0D;AACxD,WAAKuB,UAAL,CAAgBzB,YAAhB;AACD;;AACD,SAAKE,WAAL,GAAmB,EAAnB;AACA,SAAKH,YAAL,GAAoB8B,SAApB;AACD;;AAEDL,EAAAA,SAAS,CAACtD,EAAD,EAA4B8B,YAA5B,EAAkD;AACzD,UAAM;AAACnB,MAAAA,KAAD;AAAQC,MAAAA;AAAR,QAAkBZ,EAAE,CAACmC,MAA3B;AACA,UAAMyB,UAAU,GAAG,IAAItE,SAAJ,CAAcU,EAAd,EAAkB;AACnCW,MAAAA,KADmC;AAEnCC,MAAAA,MAFmC;AAGnCiD,MAAAA,UAAU,EAAE;AACV,qBADU;AAEV,qBAFU;AAGV,sBAHU;AAIV;AAJU;AAHuB,KAAlB,CAAnB;AAWA,UAAMC,WAAW,GAAG,IAAIzE,YAAJ,CAAiBW,EAAjB,EAAqB;AAAC+D,MAAAA,MAAM,OAAP;AAA+BpD,MAAAA,KAA/B;AAAsCC,MAAAA;AAAtC,KAArB,CAApB;AACA,SAAKoB,WAAL,CAAiBF,YAAjB,IAAiC,IAAI1C,WAAJ,CAAgBY,EAAhB,EAAoB;AACnDqB,MAAAA,EAAE,oBAAaS,YAAb,CADiD;AAEnDnB,MAAAA,KAFmD;AAGnDC,MAAAA,MAHmD;AAInDoD,MAAAA,WAAW,EAAE;AACX,iBAAwBJ,UADb;AAEX,iBAAuBE;AAFZ;AAJsC,KAApB,CAAjC;AASD;;AAEDP,EAAAA,UAAU,CAACzB,YAAD,EAAuB;AAC/B,UAAMmC,GAAG,GAAG,KAAKjC,WAAL,CAAiBF,YAAjB,CAAZ;;AACA,SAAK,MAAMoC,UAAX,IAAyBd,MAAM,CAACe,MAAP,CAAcF,GAAG,CAACD,WAAlB,CAAzB,EAAwE;AACtEE,MAAAA,UAAU,CAACR,MAAX;AACD;;AACDO,IAAAA,GAAG,CAACP,MAAJ;AACA,WAAO,KAAK1B,WAAL,CAAiBF,YAAjB,CAAP;AACD;;AAzOkD","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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/data-filter/shader-module.ts"],"names":["vs","fs","getUniforms","opts","filterRange","filterEnabled","filterTransformSize","filterTransformColor","filterSoftRange","Number","isFinite","filter_min","filter_softMin","filter_softMax","filter_max","map","r","filter_enabled","filter_useSoftMargin","Boolean","filter_transformSize","filter_transformColor","getUniforms64","uniforms","min64High","Math","fround","filter_min64High","max64High","filter_max64High","x","i","inject","shaderModule","name","shaderModule64"],"mappings":"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","sourcesContent":["import {_ShaderModule as ShaderModule} from '@deck.gl/core
|
|
1
|
+
{"version":3,"sources":["../../../src/data-filter/shader-module.ts"],"names":["vs","fs","getUniforms","opts","filterRange","filterEnabled","filterTransformSize","filterTransformColor","filterSoftRange","Number","isFinite","filter_min","filter_softMin","filter_softMax","filter_max","map","r","filter_enabled","filter_useSoftMargin","Boolean","filter_transformSize","filter_transformColor","getUniforms64","uniforms","min64High","Math","fround","filter_min64High","max64High","filter_max64High","x","i","inject","shaderModule","name","shaderModule64"],"mappings":"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","sourcesContent":["import {_ShaderModule as ShaderModule} from '@deck.gl/core';\n\nimport type {DataFilterExtensionProps} from './data-filter';\n\n/*\n * data filter shader module\n */\nconst vs = `\nuniform DATAFILTER_TYPE filter_min;\nuniform DATAFILTER_TYPE filter_softMin;\nuniform DATAFILTER_TYPE filter_softMax;\nuniform DATAFILTER_TYPE filter_max;\nuniform bool filter_useSoftMargin;\nuniform bool filter_enabled;\nuniform bool filter_transformSize;\n\n#ifdef NON_INSTANCED_MODEL\n #define DATAFILTER_ATTRIB filterValues\n #define DATAFILTER_ATTRIB_64LOW filterValues64Low\n#else\n #define DATAFILTER_ATTRIB instanceFilterValues\n #define DATAFILTER_ATTRIB_64LOW instanceFilterValues64Low\n#endif\n\nattribute DATAFILTER_TYPE DATAFILTER_ATTRIB;\n#ifdef DATAFILTER_DOUBLE\n attribute DATAFILTER_TYPE DATAFILTER_ATTRIB_64LOW;\n\n uniform DATAFILTER_TYPE filter_min64High;\n uniform DATAFILTER_TYPE filter_max64High;\n#endif\n\nvarying float dataFilter_value;\n\nfloat dataFilter_reduceValue(float value) {\n return value;\n}\nfloat dataFilter_reduceValue(vec2 value) {\n return min(value.x, value.y);\n}\nfloat dataFilter_reduceValue(vec3 value) {\n return min(min(value.x, value.y), value.z);\n}\nfloat dataFilter_reduceValue(vec4 value) {\n return min(min(value.x, value.y), min(value.z, value.w));\n}\nvoid dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {\n if (filter_enabled) {\n if (filter_useSoftMargin) {\n dataFilter_value = dataFilter_reduceValue(\n smoothstep(filter_min, filter_softMin, valueFromMin) *\n (1.0 - smoothstep(filter_softMax, filter_max, valueFromMax))\n );\n } else {\n dataFilter_value = dataFilter_reduceValue(\n step(filter_min, valueFromMin) * step(valueFromMax, filter_max)\n );\n }\n } else {\n dataFilter_value = 1.0;\n }\n}\n`;\n\nconst fs = `\nuniform bool filter_transformColor;\nvarying float dataFilter_value;\n`;\n\ntype DataFilterModuleSettings = {\n extensions: any[]; // used to detect if layer props are present\n} & DataFilterExtensionProps;\n\n/* eslint-disable camelcase */\nfunction getUniforms(opts?: DataFilterModuleSettings | {}): Record<string, any> {\n if (!opts || !('extensions' in opts)) {\n return {};\n }\n const {\n filterRange = [-1, 1],\n filterEnabled = true,\n filterTransformSize = true,\n filterTransformColor = true\n } = opts;\n const filterSoftRange = opts.filterSoftRange || filterRange;\n\n return {\n ...(Number.isFinite(filterRange[0])\n ? {\n filter_min: filterRange[0],\n filter_softMin: filterSoftRange[0],\n filter_softMax: filterSoftRange[1],\n filter_max: filterRange[1]\n }\n : {\n filter_min: filterRange.map(r => r[0]),\n filter_softMin: filterSoftRange.map(r => r[0]),\n filter_softMax: filterSoftRange.map(r => r[1]),\n filter_max: filterRange.map(r => r[1])\n }),\n filter_enabled: filterEnabled,\n filter_useSoftMargin: Boolean(opts.filterSoftRange),\n filter_transformSize: filterEnabled && filterTransformSize,\n filter_transformColor: filterEnabled && filterTransformColor\n };\n}\n\nfunction getUniforms64(opts?: DataFilterModuleSettings | {}): Record<string, any> {\n if (!opts || !('extensions' in opts)) {\n return {};\n }\n const uniforms = getUniforms(opts);\n if (Number.isFinite(uniforms.filter_min)) {\n const min64High = Math.fround(uniforms.filter_min);\n uniforms.filter_min -= min64High;\n uniforms.filter_softMin -= min64High;\n uniforms.filter_min64High = min64High;\n\n const max64High = Math.fround(uniforms.filter_max);\n uniforms.filter_max -= max64High;\n uniforms.filter_softMax -= max64High;\n uniforms.filter_max64High = max64High;\n } else {\n const min64High = uniforms.filter_min.map(Math.fround);\n uniforms.filter_min = uniforms.filter_min.map((x, i) => x - min64High[i]);\n uniforms.filter_softMin = uniforms.filter_softMin.map((x, i) => x - min64High[i]);\n uniforms.filter_min64High = min64High;\n\n const max64High = uniforms.filter_max.map(Math.fround);\n uniforms.filter_max = uniforms.filter_max.map((x, i) => x - max64High[i]);\n uniforms.filter_softMax = uniforms.filter_softMax.map((x, i) => x - max64High[i]);\n uniforms.filter_max64High = max64High;\n }\n return uniforms;\n}\n\nconst inject = {\n 'vs:#main-start': `\n #ifdef DATAFILTER_DOUBLE\n dataFilter_setValue(\n DATAFILTER_ATTRIB - filter_min64High + DATAFILTER_ATTRIB_64LOW,\n DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW\n );\n #else\n dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB);\n #endif\n `,\n\n 'vs:#main-end': `\n if (dataFilter_value == 0.0) {\n gl_Position = vec4(0.);\n }\n `,\n\n 'vs:DECKGL_FILTER_SIZE': `\n if (filter_transformSize) {\n size = size * dataFilter_value;\n }\n `,\n\n 'fs:DECKGL_FILTER_COLOR': `\n if (dataFilter_value == 0.0) discard;\n if (filter_transformColor) {\n color.a *= dataFilter_value;\n }\n `\n};\n\nexport const shaderModule: ShaderModule<DataFilterModuleSettings> = {\n name: 'data-filter',\n vs,\n fs,\n inject,\n getUniforms\n};\n\nexport const shaderModule64: ShaderModule<DataFilterModuleSettings> = {\n name: 'data-filter-fp64',\n vs,\n fs,\n inject,\n getUniforms: getUniforms64\n};\n"],"file":"shader-module.js"}
|
|
@@ -33,7 +33,7 @@ export default class MaskEffect {
|
|
|
33
33
|
viewports,
|
|
34
34
|
onViewportActive,
|
|
35
35
|
views,
|
|
36
|
-
|
|
36
|
+
isPicking
|
|
37
37
|
}) {
|
|
38
38
|
let didRender = false;
|
|
39
39
|
|
|
@@ -44,7 +44,7 @@ export default class MaskEffect {
|
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
if (
|
|
47
|
+
if (isPicking) {
|
|
48
48
|
return {
|
|
49
49
|
didRender
|
|
50
50
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mask/mask-effect.ts"],"names":["log","Texture2D","equals","MaskPass","getMaskBounds","getMaskViewport","MaskEffect","preRender","gl","layers","layerFilter","viewports","onViewportActive","views","pass","didRender","dummyMaskMap","width","height","startsWith","maskLayers","filter","l","props","visible","operation","includes","length","masks","channels","maskPass","id","maskMap","channelMap","_sortMaskChannels","viewport","viewportChanged","lastViewport","maskId","result","_renderChannel","channelInfo","oldChannelInfo","index","maskChanged","layerBounds","some","b","i","bounds","maskBounds","maskViewport","getBounds","render","channel","moduleParameters","devicePixelRatio","coordinateOrigin","coordinateSystem","channelCount","layer","root","warn","findIndex","c","push","getModuleParameters","maskChannels","cleanup","delete","undefined"],"mappings":"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","sourcesContent":["import {Layer, Viewport, Effect, PreRenderOptions, CoordinateSystem, log} from '@deck.gl/core';\nimport {Texture2D} from '@luma.gl/core';\nimport {equals} from '@math.gl/core';\nimport MaskPass from './mask-pass';\nimport {getMaskBounds, getMaskViewport, MaskBounds} from './utils';\n// import {debugFBO} from '../utils/debug';\n\ntype Mask = {\n /** The channel index */\n index: number;\n bounds: MaskBounds;\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\ntype Channel = {\n id: string;\n index: number;\n layers: Layer[];\n bounds: MaskBounds;\n maskBounds: MaskBounds;\n layerBounds: MaskBounds[];\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\nexport type MaskPreRenderStats = {\n didRender: boolean;\n};\n\n// Class to manage mask effect\nexport default class MaskEffect implements Effect {\n id = 'mask-effect';\n props = null;\n useInPicking = true;\n order = 0;\n\n private dummyMaskMap?: Texture2D;\n private channels: (Channel | null)[] = [];\n private masks: Record<string, Mask> | null = null;\n private maskPass?: MaskPass;\n private maskMap?: Texture2D;\n private lastViewport?: Viewport;\n\n preRender(\n gl: WebGLRenderingContext,\n {layers, layerFilter, viewports, onViewportActive, views, pass}: PreRenderOptions\n ): MaskPreRenderStats {\n let didRender = false;\n if (!this.dummyMaskMap) {\n this.dummyMaskMap = new Texture2D(gl, {\n width: 1,\n height: 1\n });\n }\n\n if (pass.startsWith('picking')) {\n // Do not update on picking pass\n return {didRender};\n }\n\n const maskLayers = layers.filter(l => l.props.visible && l.props.operation.includes('mask'));\n if (maskLayers.length === 0) {\n this.masks = null;\n this.channels.length = 0;\n return {didRender};\n }\n this.masks = {};\n\n if (!this.maskPass) {\n this.maskPass = new MaskPass(gl, {id: 'default-mask'});\n this.maskMap = this.maskPass.maskMap;\n }\n\n // Map layers to channels\n const channelMap = this._sortMaskChannels(maskLayers);\n // TODO - support multiple views\n const viewport = viewports[0];\n const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);\n\n for (const maskId in channelMap) {\n const result = this._renderChannel(channelMap[maskId], {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n });\n didRender ||= result;\n }\n\n // debugFBO(this.maskMap, {opaque: true});\n return {didRender};\n }\n\n private _renderChannel(\n channelInfo: Channel,\n {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n }: {\n layerFilter: PreRenderOptions['layerFilter'];\n onViewportActive: PreRenderOptions['onViewportActive'];\n views: PreRenderOptions['views'];\n viewport: Viewport;\n viewportChanged: boolean;\n }\n ): boolean {\n let didRender = false;\n const oldChannelInfo = this.channels[channelInfo.index];\n if (!oldChannelInfo) {\n return didRender;\n }\n\n const maskChanged =\n // If a channel is new\n channelInfo === oldChannelInfo ||\n // If sublayers have changed\n oldChannelInfo.layers.length !== channelInfo.layers.length ||\n // If a sublayer's positions have been updated, the cached bounds will change shallowly\n channelInfo.layerBounds.some((b, i) => b !== oldChannelInfo.layerBounds[i]);\n\n channelInfo.bounds = oldChannelInfo.bounds;\n channelInfo.maskBounds = oldChannelInfo.maskBounds;\n this.channels[channelInfo.index] = channelInfo;\n\n if (maskChanged || viewportChanged) {\n // Recalculate mask bounds\n this.lastViewport = viewport;\n\n channelInfo.bounds = getMaskBounds({layers: channelInfo.layers, viewport});\n\n if (maskChanged || !equals(channelInfo.bounds, oldChannelInfo.bounds)) {\n // Rerender mask FBO\n const {maskPass, maskMap} = this;\n\n const maskViewport = getMaskViewport({\n bounds: channelInfo.bounds,\n viewport,\n width: maskMap.width,\n height: maskMap.height\n });\n\n channelInfo.maskBounds = maskViewport ? maskViewport.getBounds() : [0, 0, 1, 1];\n\n // @ts-ignore (2532) This method is only called from preRender where maskPass is defined\n maskPass.render({\n pass: 'mask',\n channel: channelInfo.index,\n layers: channelInfo.layers,\n layerFilter,\n viewports: maskViewport ? [maskViewport] : [],\n onViewportActive,\n views,\n moduleParameters: {\n devicePixelRatio: 1\n }\n });\n\n didRender = true;\n }\n }\n\n // @ts-ignore (2532) This method is only called from preRender where masks is defined\n this.masks[channelInfo.id] = {\n index: channelInfo.index,\n bounds: channelInfo.maskBounds,\n coordinateOrigin: channelInfo.coordinateOrigin,\n coordinateSystem: channelInfo.coordinateSystem\n };\n\n return didRender;\n }\n\n /**\n * Find a channel to render each mask into\n * If a maskId already exists, diff and update the existing channel\n * Otherwise replace a removed mask\n * Otherwise create a new channel\n * Returns a map from mask layer id to channel info\n */\n private _sortMaskChannels(maskLayers: Layer[]): Record<string, Channel> {\n const channelMap = {};\n let channelCount = 0;\n for (const layer of maskLayers) {\n const {id} = layer.root;\n let channelInfo = channelMap[id];\n if (!channelInfo) {\n if (++channelCount > 4) {\n log.warn('Too many mask layers. The max supported is 4')();\n continue; // eslint-disable-line no-continue\n }\n channelInfo = {\n id,\n index: this.channels.findIndex(c => c?.id === id),\n layers: [],\n layerBounds: [],\n coordinateOrigin: layer.root.props.coordinateOrigin,\n coordinateSystem: layer.root.props.coordinateSystem\n };\n channelMap[id] = channelInfo;\n }\n channelInfo.layers.push(layer);\n channelInfo.layerBounds.push(layer.getBounds());\n }\n\n for (let i = 0; i < 4; i++) {\n const channelInfo = this.channels[i];\n if (!channelInfo || !(channelInfo.id in channelMap)) {\n // The mask id at this channel no longer exists\n this.channels[i] = null;\n }\n }\n\n for (const maskId in channelMap) {\n const channelInfo = channelMap[maskId];\n\n if (channelInfo.index < 0) {\n channelInfo.index = this.channels.findIndex(c => !c);\n this.channels[channelInfo.index] = channelInfo;\n }\n }\n return channelMap;\n }\n\n getModuleParameters(): {\n maskMap: Texture2D;\n maskChannels: Record<string, Mask> | null;\n } {\n return {\n maskMap: this.masks ? this.maskMap : this.dummyMaskMap,\n maskChannels: this.masks\n };\n }\n\n cleanup(): void {\n if (this.dummyMaskMap) {\n this.dummyMaskMap.delete();\n this.dummyMaskMap = undefined;\n }\n\n if (this.maskPass) {\n this.maskPass.delete();\n this.maskPass = undefined;\n this.maskMap = undefined;\n }\n\n this.lastViewport = undefined;\n this.masks = null;\n this.channels.length = 0;\n }\n}\n"],"file":"mask-effect.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/mask/mask-effect.ts"],"names":["log","Texture2D","equals","MaskPass","getMaskBounds","getMaskViewport","MaskEffect","preRender","gl","layers","layerFilter","viewports","onViewportActive","views","isPicking","didRender","dummyMaskMap","width","height","maskLayers","filter","l","props","visible","operation","includes","length","masks","channels","maskPass","id","maskMap","channelMap","_sortMaskChannels","viewport","viewportChanged","lastViewport","maskId","result","_renderChannel","channelInfo","oldChannelInfo","index","maskChanged","layerBounds","some","b","i","bounds","maskBounds","maskViewport","getBounds","render","pass","channel","moduleParameters","devicePixelRatio","coordinateOrigin","coordinateSystem","channelCount","layer","root","warn","findIndex","c","push","getModuleParameters","maskChannels","cleanup","delete","undefined"],"mappings":";AAAA,SAAqEA,GAArE,QAA+E,eAA/E;AACA,SAAQC,SAAR,QAAwB,eAAxB;AACA,SAAQC,MAAR,QAAqB,eAArB;AACA,OAAOC,QAAP,MAAqB,aAArB;AACA,SAAQC,aAAR,EAAuBC,eAAvB,QAAyD,SAAzD;AA2BA,eAAe,MAAMC,UAAN,CAAmC;AAAA;AAAA,gCAC3C,aAD2C;;AAAA,mCAExC,IAFwC;;AAAA,0CAGjC,IAHiC;;AAAA,mCAIxC,CAJwC;;AAAA;;AAAA,sCAOT,EAPS;;AAAA,mCAQH,IARG;;AAAA;;AAAA;;AAAA;AAAA;;AAahDC,EAAAA,SAAS,CACPC,EADO,EAEP;AAACC,IAAAA,MAAD;AAASC,IAAAA,WAAT;AAAsBC,IAAAA,SAAtB;AAAiCC,IAAAA,gBAAjC;AAAmDC,IAAAA,KAAnD;AAA0DC,IAAAA;AAA1D,GAFO,EAGa;AACpB,QAAIC,SAAS,GAAG,KAAhB;;AACA,QAAI,CAAC,KAAKC,YAAV,EAAwB;AACtB,WAAKA,YAAL,GAAoB,IAAIf,SAAJ,CAAcO,EAAd,EAAkB;AACpCS,QAAAA,KAAK,EAAE,CAD6B;AAEpCC,QAAAA,MAAM,EAAE;AAF4B,OAAlB,CAApB;AAID;;AAED,QAAIJ,SAAJ,EAAe;AAEb,aAAO;AAACC,QAAAA;AAAD,OAAP;AACD;;AAED,UAAMI,UAAU,GAAGV,MAAM,CAACW,MAAP,CAAcC,CAAC,IAAIA,CAAC,CAACC,KAAF,CAAQC,OAAR,IAAmBF,CAAC,CAACC,KAAF,CAAQE,SAAR,CAAkBC,QAAlB,CAA2B,MAA3B,CAAtC,CAAnB;;AACA,QAAIN,UAAU,CAACO,MAAX,KAAsB,CAA1B,EAA6B;AAC3B,WAAKC,KAAL,GAAa,IAAb;AACA,WAAKC,QAAL,CAAcF,MAAd,GAAuB,CAAvB;AACA,aAAO;AAACX,QAAAA;AAAD,OAAP;AACD;;AACD,SAAKY,KAAL,GAAa,EAAb;;AAEA,QAAI,CAAC,KAAKE,QAAV,EAAoB;AAClB,WAAKA,QAAL,GAAgB,IAAI1B,QAAJ,CAAaK,EAAb,EAAiB;AAACsB,QAAAA,EAAE,EAAE;AAAL,OAAjB,CAAhB;AACA,WAAKC,OAAL,GAAe,KAAKF,QAAL,CAAcE,OAA7B;AACD;;AAGD,UAAMC,UAAU,GAAG,KAAKC,iBAAL,CAAuBd,UAAvB,CAAnB;;AAEA,UAAMe,QAAQ,GAAGvB,SAAS,CAAC,CAAD,CAA1B;AACA,UAAMwB,eAAe,GAAG,CAAC,KAAKC,YAAN,IAAsB,CAAC,KAAKA,YAAL,CAAkBlC,MAAlB,CAAyBgC,QAAzB,CAA/C;;AAEA,SAAK,MAAMG,MAAX,IAAqBL,UAArB,EAAiC;AAC/B,YAAMM,MAAM,GAAG,KAAKC,cAAL,CAAoBP,UAAU,CAACK,MAAD,CAA9B,EAAwC;AACrD3B,QAAAA,WADqD;AAErDE,QAAAA,gBAFqD;AAGrDC,QAAAA,KAHqD;AAIrDqB,QAAAA,QAJqD;AAKrDC,QAAAA;AALqD,OAAxC,CAAf;;AAOApB,MAAAA,SAAS,KAATA,SAAS,GAAKuB,MAAL,CAAT;AACD;;AAGD,WAAO;AAACvB,MAAAA;AAAD,KAAP;AACD;;AAEOwB,EAAAA,cAAc,CACpBC,WADoB,EAEpB;AACE9B,IAAAA,WADF;AAEEE,IAAAA,gBAFF;AAGEC,IAAAA,KAHF;AAIEqB,IAAAA,QAJF;AAKEC,IAAAA;AALF,GAFoB,EAeX;AACT,QAAIpB,SAAS,GAAG,KAAhB;AACA,UAAM0B,cAAc,GAAG,KAAKb,QAAL,CAAcY,WAAW,CAACE,KAA1B,CAAvB;;AACA,QAAI,CAACD,cAAL,EAAqB;AACnB,aAAO1B,SAAP;AACD;;AAED,UAAM4B,WAAW,GAEfH,WAAW,KAAKC,cAAhB,IAEAA,cAAc,CAAChC,MAAf,CAAsBiB,MAAtB,KAAiCc,WAAW,CAAC/B,MAAZ,CAAmBiB,MAFpD,IAIAc,WAAW,CAACI,WAAZ,CAAwBC,IAAxB,CAA6B,CAACC,CAAD,EAAIC,CAAJ,KAAUD,CAAC,KAAKL,cAAc,CAACG,WAAf,CAA2BG,CAA3B,CAA7C,CANF;AAQAP,IAAAA,WAAW,CAACQ,MAAZ,GAAqBP,cAAc,CAACO,MAApC;AACAR,IAAAA,WAAW,CAACS,UAAZ,GAAyBR,cAAc,CAACQ,UAAxC;AACA,SAAKrB,QAAL,CAAcY,WAAW,CAACE,KAA1B,IAAmCF,WAAnC;;AAEA,QAAIG,WAAW,IAAIR,eAAnB,EAAoC;AAElC,WAAKC,YAAL,GAAoBF,QAApB;AAEAM,MAAAA,WAAW,CAACQ,MAAZ,GAAqB5C,aAAa,CAAC;AAACK,QAAAA,MAAM,EAAE+B,WAAW,CAAC/B,MAArB;AAA6ByB,QAAAA;AAA7B,OAAD,CAAlC;;AAEA,UAAIS,WAAW,IAAI,CAACzC,MAAM,CAACsC,WAAW,CAACQ,MAAb,EAAqBP,cAAc,CAACO,MAApC,CAA1B,EAAuE;AAErE,cAAM;AAACnB,UAAAA,QAAD;AAAWE,UAAAA;AAAX,YAAsB,IAA5B;AAEA,cAAMmB,YAAY,GAAG7C,eAAe,CAAC;AACnC2C,UAAAA,MAAM,EAAER,WAAW,CAACQ,MADe;AAEnCd,UAAAA,QAFmC;AAGnCjB,UAAAA,KAAK,EAAEc,OAAO,CAACd,KAHoB;AAInCC,UAAAA,MAAM,EAAEa,OAAO,CAACb;AAJmB,SAAD,CAApC;AAOAsB,QAAAA,WAAW,CAACS,UAAZ,GAAyBC,YAAY,GAAGA,YAAY,CAACC,SAAb,EAAH,GAA8B,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAAnE;AAGAtB,QAAAA,QAAQ,CAACuB,MAAT,CAAgB;AACdC,UAAAA,IAAI,EAAE,MADQ;AAEdC,UAAAA,OAAO,EAAEd,WAAW,CAACE,KAFP;AAGdjC,UAAAA,MAAM,EAAE+B,WAAW,CAAC/B,MAHN;AAIdC,UAAAA,WAJc;AAKdC,UAAAA,SAAS,EAAEuC,YAAY,GAAG,CAACA,YAAD,CAAH,GAAoB,EAL7B;AAMdtC,UAAAA,gBANc;AAOdC,UAAAA,KAPc;AAQd0C,UAAAA,gBAAgB,EAAE;AAChBC,YAAAA,gBAAgB,EAAE;AADF;AARJ,SAAhB;AAaAzC,QAAAA,SAAS,GAAG,IAAZ;AACD;AACF;;AAGD,SAAKY,KAAL,CAAWa,WAAW,CAACV,EAAvB,IAA6B;AAC3BY,MAAAA,KAAK,EAAEF,WAAW,CAACE,KADQ;AAE3BM,MAAAA,MAAM,EAAER,WAAW,CAACS,UAFO;AAG3BQ,MAAAA,gBAAgB,EAAEjB,WAAW,CAACiB,gBAHH;AAI3BC,MAAAA,gBAAgB,EAAElB,WAAW,CAACkB;AAJH,KAA7B;AAOA,WAAO3C,SAAP;AACD;;AASOkB,EAAAA,iBAAiB,CAACd,UAAD,EAA+C;AACtE,UAAMa,UAAU,GAAG,EAAnB;AACA,QAAI2B,YAAY,GAAG,CAAnB;;AACA,SAAK,MAAMC,KAAX,IAAoBzC,UAApB,EAAgC;AAC9B,YAAM;AAACW,QAAAA;AAAD,UAAO8B,KAAK,CAACC,IAAnB;AACA,UAAIrB,WAAW,GAAGR,UAAU,CAACF,EAAD,CAA5B;;AACA,UAAI,CAACU,WAAL,EAAkB;AAChB,YAAI,EAAEmB,YAAF,GAAiB,CAArB,EAAwB;AACtB3D,UAAAA,GAAG,CAAC8D,IAAJ,CAAS,8CAAT;AACA;AACD;;AACDtB,QAAAA,WAAW,GAAG;AACZV,UAAAA,EADY;AAEZY,UAAAA,KAAK,EAAE,KAAKd,QAAL,CAAcmC,SAAd,CAAwBC,CAAC,IAAI,CAAAA,CAAC,SAAD,IAAAA,CAAC,WAAD,YAAAA,CAAC,CAAElC,EAAH,MAAUA,EAAvC,CAFK;AAGZrB,UAAAA,MAAM,EAAE,EAHI;AAIZmC,UAAAA,WAAW,EAAE,EAJD;AAKZa,UAAAA,gBAAgB,EAAEG,KAAK,CAACC,IAAN,CAAWvC,KAAX,CAAiBmC,gBALvB;AAMZC,UAAAA,gBAAgB,EAAEE,KAAK,CAACC,IAAN,CAAWvC,KAAX,CAAiBoC;AANvB,SAAd;AAQA1B,QAAAA,UAAU,CAACF,EAAD,CAAV,GAAiBU,WAAjB;AACD;;AACDA,MAAAA,WAAW,CAAC/B,MAAZ,CAAmBwD,IAAnB,CAAwBL,KAAxB;AACApB,MAAAA,WAAW,CAACI,WAAZ,CAAwBqB,IAAxB,CAA6BL,KAAK,CAACT,SAAN,EAA7B;AACD;;AAED,SAAK,IAAIJ,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,CAApB,EAAuBA,CAAC,EAAxB,EAA4B;AAC1B,YAAMP,WAAW,GAAG,KAAKZ,QAAL,CAAcmB,CAAd,CAApB;;AACA,UAAI,CAACP,WAAD,IAAgB,EAAEA,WAAW,CAACV,EAAZ,IAAkBE,UAApB,CAApB,EAAqD;AAEnD,aAAKJ,QAAL,CAAcmB,CAAd,IAAmB,IAAnB;AACD;AACF;;AAED,SAAK,MAAMV,MAAX,IAAqBL,UAArB,EAAiC;AAC/B,YAAMQ,WAAW,GAAGR,UAAU,CAACK,MAAD,CAA9B;;AAEA,UAAIG,WAAW,CAACE,KAAZ,GAAoB,CAAxB,EAA2B;AACzBF,QAAAA,WAAW,CAACE,KAAZ,GAAoB,KAAKd,QAAL,CAAcmC,SAAd,CAAwBC,CAAC,IAAI,CAACA,CAA9B,CAApB;AACA,aAAKpC,QAAL,CAAcY,WAAW,CAACE,KAA1B,IAAmCF,WAAnC;AACD;AACF;;AACD,WAAOR,UAAP;AACD;;AAEDkC,EAAAA,mBAAmB,GAGjB;AACA,WAAO;AACLnC,MAAAA,OAAO,EAAE,KAAKJ,KAAL,GAAa,KAAKI,OAAlB,GAA4B,KAAKf,YADrC;AAELmD,MAAAA,YAAY,EAAE,KAAKxC;AAFd,KAAP;AAID;;AAEDyC,EAAAA,OAAO,GAAS;AACd,QAAI,KAAKpD,YAAT,EAAuB;AACrB,WAAKA,YAAL,CAAkBqD,MAAlB;AACA,WAAKrD,YAAL,GAAoBsD,SAApB;AACD;;AAED,QAAI,KAAKzC,QAAT,EAAmB;AACjB,WAAKA,QAAL,CAAcwC,MAAd;AACA,WAAKxC,QAAL,GAAgByC,SAAhB;AACA,WAAKvC,OAAL,GAAeuC,SAAf;AACD;;AAED,SAAKlC,YAAL,GAAoBkC,SAApB;AACA,SAAK3C,KAAL,GAAa,IAAb;AACA,SAAKC,QAAL,CAAcF,MAAd,GAAuB,CAAvB;AACD;;AA9N+C","sourcesContent":["import {Layer, Viewport, Effect, PreRenderOptions, CoordinateSystem, log} from '@deck.gl/core';\nimport {Texture2D} from '@luma.gl/core';\nimport {equals} from '@math.gl/core';\nimport MaskPass from './mask-pass';\nimport {getMaskBounds, getMaskViewport, MaskBounds} from './utils';\n// import {debugFBO} from '../utils/debug';\n\ntype Mask = {\n /** The channel index */\n index: number;\n bounds: MaskBounds;\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\ntype Channel = {\n id: string;\n index: number;\n layers: Layer[];\n bounds: MaskBounds;\n maskBounds: MaskBounds;\n layerBounds: MaskBounds[];\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\nexport type MaskPreRenderStats = {\n didRender: boolean;\n};\n\n// Class to manage mask effect\nexport default class MaskEffect implements Effect {\n id = 'mask-effect';\n props = null;\n useInPicking = true;\n order = 0;\n\n private dummyMaskMap?: Texture2D;\n private channels: (Channel | null)[] = [];\n private masks: Record<string, Mask> | null = null;\n private maskPass?: MaskPass;\n private maskMap?: Texture2D;\n private lastViewport?: Viewport;\n\n preRender(\n gl: WebGLRenderingContext,\n {layers, layerFilter, viewports, onViewportActive, views, isPicking}: PreRenderOptions\n ): MaskPreRenderStats {\n let didRender = false;\n if (!this.dummyMaskMap) {\n this.dummyMaskMap = new Texture2D(gl, {\n width: 1,\n height: 1\n });\n }\n\n if (isPicking) {\n // Do not update on picking pass\n return {didRender};\n }\n\n const maskLayers = layers.filter(l => l.props.visible && l.props.operation.includes('mask'));\n if (maskLayers.length === 0) {\n this.masks = null;\n this.channels.length = 0;\n return {didRender};\n }\n this.masks = {};\n\n if (!this.maskPass) {\n this.maskPass = new MaskPass(gl, {id: 'default-mask'});\n this.maskMap = this.maskPass.maskMap;\n }\n\n // Map layers to channels\n const channelMap = this._sortMaskChannels(maskLayers);\n // TODO - support multiple views\n const viewport = viewports[0];\n const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);\n\n for (const maskId in channelMap) {\n const result = this._renderChannel(channelMap[maskId], {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n });\n didRender ||= result;\n }\n\n // debugFBO(this.maskMap, {opaque: true});\n return {didRender};\n }\n\n private _renderChannel(\n channelInfo: Channel,\n {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n }: {\n layerFilter: PreRenderOptions['layerFilter'];\n onViewportActive: PreRenderOptions['onViewportActive'];\n views: PreRenderOptions['views'];\n viewport: Viewport;\n viewportChanged: boolean;\n }\n ): boolean {\n let didRender = false;\n const oldChannelInfo = this.channels[channelInfo.index];\n if (!oldChannelInfo) {\n return didRender;\n }\n\n const maskChanged =\n // If a channel is new\n channelInfo === oldChannelInfo ||\n // If sublayers have changed\n oldChannelInfo.layers.length !== channelInfo.layers.length ||\n // If a sublayer's positions have been updated, the cached bounds will change shallowly\n channelInfo.layerBounds.some((b, i) => b !== oldChannelInfo.layerBounds[i]);\n\n channelInfo.bounds = oldChannelInfo.bounds;\n channelInfo.maskBounds = oldChannelInfo.maskBounds;\n this.channels[channelInfo.index] = channelInfo;\n\n if (maskChanged || viewportChanged) {\n // Recalculate mask bounds\n this.lastViewport = viewport;\n\n channelInfo.bounds = getMaskBounds({layers: channelInfo.layers, viewport});\n\n if (maskChanged || !equals(channelInfo.bounds, oldChannelInfo.bounds)) {\n // Rerender mask FBO\n const {maskPass, maskMap} = this;\n\n const maskViewport = getMaskViewport({\n bounds: channelInfo.bounds,\n viewport,\n width: maskMap.width,\n height: maskMap.height\n });\n\n channelInfo.maskBounds = maskViewport ? maskViewport.getBounds() : [0, 0, 1, 1];\n\n // @ts-ignore (2532) This method is only called from preRender where maskPass is defined\n maskPass.render({\n pass: 'mask',\n channel: channelInfo.index,\n layers: channelInfo.layers,\n layerFilter,\n viewports: maskViewport ? [maskViewport] : [],\n onViewportActive,\n views,\n moduleParameters: {\n devicePixelRatio: 1\n }\n });\n\n didRender = true;\n }\n }\n\n // @ts-ignore (2532) This method is only called from preRender where masks is defined\n this.masks[channelInfo.id] = {\n index: channelInfo.index,\n bounds: channelInfo.maskBounds,\n coordinateOrigin: channelInfo.coordinateOrigin,\n coordinateSystem: channelInfo.coordinateSystem\n };\n\n return didRender;\n }\n\n /**\n * Find a channel to render each mask into\n * If a maskId already exists, diff and update the existing channel\n * Otherwise replace a removed mask\n * Otherwise create a new channel\n * Returns a map from mask layer id to channel info\n */\n private _sortMaskChannels(maskLayers: Layer[]): Record<string, Channel> {\n const channelMap = {};\n let channelCount = 0;\n for (const layer of maskLayers) {\n const {id} = layer.root;\n let channelInfo = channelMap[id];\n if (!channelInfo) {\n if (++channelCount > 4) {\n log.warn('Too many mask layers. The max supported is 4')();\n continue; // eslint-disable-line no-continue\n }\n channelInfo = {\n id,\n index: this.channels.findIndex(c => c?.id === id),\n layers: [],\n layerBounds: [],\n coordinateOrigin: layer.root.props.coordinateOrigin,\n coordinateSystem: layer.root.props.coordinateSystem\n };\n channelMap[id] = channelInfo;\n }\n channelInfo.layers.push(layer);\n channelInfo.layerBounds.push(layer.getBounds());\n }\n\n for (let i = 0; i < 4; i++) {\n const channelInfo = this.channels[i];\n if (!channelInfo || !(channelInfo.id in channelMap)) {\n // The mask id at this channel no longer exists\n this.channels[i] = null;\n }\n }\n\n for (const maskId in channelMap) {\n const channelInfo = channelMap[maskId];\n\n if (channelInfo.index < 0) {\n channelInfo.index = this.channels.findIndex(c => !c);\n this.channels[channelInfo.index] = channelInfo;\n }\n }\n return channelMap;\n }\n\n getModuleParameters(): {\n maskMap: Texture2D;\n maskChannels: Record<string, Mask> | null;\n } {\n return {\n maskMap: this.masks ? this.maskMap : this.dummyMaskMap,\n maskChannels: this.masks\n };\n }\n\n cleanup(): void {\n if (this.dummyMaskMap) {\n this.dummyMaskMap.delete();\n this.dummyMaskMap = undefined;\n }\n\n if (this.maskPass) {\n this.maskPass.delete();\n this.maskPass = undefined;\n this.maskMap = undefined;\n }\n\n this.lastViewport = undefined;\n this.masks = null;\n this.channels.length = 0;\n }\n}\n"],"file":"mask-effect.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/terrain/terrain-effect.ts"],"names":["Texture2D","ProgramManager","log","terrainModule","TerrainCover","TerrainPass","TerrainPickingPass","HeightMapBuilder","TerrainEffect","Map","initialize","gl","dummyHeightMap","width","height","data","Uint8Array","terrainPass","id","terrainPickingPass","isSupported","heightMap","warn","getDefaultProgramManager","addDefaultModule","preRender","opts","layer","layers","props","operation","includes","setChangeFlags","extensionsChanged","pickZ","isDrapingEnabled","viewports","pass","isPicking","startsWith","viewport","getRenderableLayers","terrainLayers","filter","l","length","offsetLayers","state","terrainFittingMode","_updateHeightMap","drapeLayers","_updateTerrainCovers","getModuleParameters","getRenderFramebuffer","heightMapBounds","bounds","terrainCover","terrainCovers","get","useTerrainHeightMap","terrainSkipRender","cleanup","delete","undefined","values","clear","shouldUpdate","renderHeightMap","moduleParameters","devicePixelRatio","drawToTerrainHeightMap","layerNeedsRedraw","terrainCoverNeedsRedraw","isDirty","_updateTerrainCover","_pruneTerrainCovers","terrainLayer","renderPass","set","targetLayer","renderTerrainCover","err","raiseError","idsToRemove","isActive","push"],"mappings":"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","sourcesContent":["import {Texture2D, ProgramManager} from '@luma.gl/core';\nimport {log} from '@deck.gl/core';\n\nimport {terrainModule, TerrainModuleSettings} from './shader-module';\nimport {TerrainCover} from './terrain-cover';\nimport {TerrainPass} from './terrain-pass';\nimport {TerrainPickingPass, TerrainPickingPassRenderOptions} from './terrain-picking-pass';\nimport {HeightMapBuilder} from './height-map-builder';\n\nimport type {Effect, PreRenderOptions, Layer, Viewport} from '@deck.gl/core';\n\n/** Class to manage terrain effect */\nexport class TerrainEffect implements Effect {\n id = 'terrain-effect';\n props = null;\n useInPicking = true;\n\n /** true if picking in the current pass */\n private isPicking: boolean = false;\n /** true if should use in the current pass */\n private isDrapingEnabled: boolean = false;\n /** An empty texture as placeholder */\n private dummyHeightMap: Texture2D;\n /** A texture encoding the ground elevation, updated once per redraw. Used by layers with offset mode */\n private heightMap?: HeightMapBuilder;\n private terrainPass!: TerrainPass;\n private terrainPickingPass!: TerrainPickingPass;\n /** One texture for each primitive terrain layer, into which the draped layers render */\n private terrainCovers: Map<string, TerrainCover> = new Map();\n\n initialize(gl: WebGLRenderingContext) {\n this.dummyHeightMap = new Texture2D(gl, {\n width: 1,\n height: 1,\n data: new Uint8Array([0, 0, 0, 0])\n });\n this.terrainPass = new TerrainPass(gl, {id: 'terrain'});\n this.terrainPickingPass = new TerrainPickingPass(gl, {id: 'terrain-picking'});\n\n if (HeightMapBuilder.isSupported(gl)) {\n this.heightMap = new HeightMapBuilder(gl);\n } else {\n log.warn('Terrain offset mode is not supported by this browser')();\n }\n\n ProgramManager.getDefaultProgramManager(gl).addDefaultModule(terrainModule);\n }\n\n preRender(gl: WebGLRenderingContext, opts: PreRenderOptions): void {\n if (!this.dummyHeightMap) {\n // First time this effect is in use, initialize resources and register the shader module\n this.initialize(gl);\n for (const layer of opts.layers) {\n // Force the terrain layer (and its descendents) to rebuild their models with the new shader\n if (layer.props.operation.includes('terrain')) {\n layer.setChangeFlags({extensionsChanged: true});\n }\n }\n }\n\n // @ts-expect-error pickZ only defined in picking pass\n if (opts.pickZ) {\n // Do not update if picking attributes\n this.isDrapingEnabled = false;\n return;\n }\n\n const {viewports, pass} = opts;\n const isPicking = pass.startsWith('picking');\n this.isPicking = isPicking;\n this.isDrapingEnabled = true;\n\n // TODO - support multiple views?\n const viewport = viewports[0];\n const layers = (isPicking ? this.terrainPickingPass : this.terrainPass).getRenderableLayers(\n viewport,\n opts as TerrainPickingPassRenderOptions\n );\n\n const terrainLayers = layers.filter(l => l.props.operation.includes('terrain'));\n if (terrainLayers.length === 0) {\n return;\n }\n\n if (!isPicking) {\n const offsetLayers = layers.filter(l => l.state.terrainFittingMode === 'offset');\n if (offsetLayers.length > 0) {\n this._updateHeightMap(terrainLayers, viewport, opts);\n }\n }\n\n const drapeLayers = layers.filter(l => l.state.terrainFittingMode === 'drape');\n this._updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts);\n }\n\n getModuleParameters(layer: Layer): TerrainModuleSettings {\n const {terrainFittingMode} = layer.state;\n\n return {\n heightMap: this.heightMap?.getRenderFramebuffer(),\n heightMapBounds: this.heightMap?.bounds,\n dummyHeightMap: this.dummyHeightMap,\n terrainCover: this.isDrapingEnabled ? this.terrainCovers.get(layer.id) : null,\n useTerrainHeightMap: terrainFittingMode === 'offset',\n terrainSkipRender: terrainFittingMode === 'drape' || !layer.props.operation.includes('draw')\n };\n }\n\n cleanup(): void {\n if (this.dummyHeightMap) {\n this.dummyHeightMap.delete();\n this.dummyHeightMap = undefined;\n }\n\n if (this.heightMap) {\n this.heightMap.delete();\n this.heightMap = undefined;\n }\n\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.delete();\n }\n this.terrainCovers.clear();\n }\n\n private _updateHeightMap(terrainLayers: Layer[], viewport: Viewport, opts: PreRenderOptions) {\n if (!this.heightMap) {\n // Not supported\n return;\n }\n\n const shouldUpdate = this.heightMap.shouldUpdate({layers: terrainLayers, viewport});\n if (!shouldUpdate) {\n return;\n }\n\n this.terrainPass.renderHeightMap(this.heightMap, {\n ...opts,\n layers: terrainLayers,\n moduleParameters: {\n heightMapBounds: this.heightMap.bounds,\n dummyHeightMap: this.dummyHeightMap,\n devicePixelRatio: 1,\n drawToTerrainHeightMap: true\n }\n });\n }\n\n private _updateTerrainCovers(\n terrainLayers: Layer[],\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n // Mark a terrain cover as dirty if one of the drape layers needs redraw\n const layerNeedsRedraw: Record<string, boolean> = {};\n for (const layer of drapeLayers) {\n if (layer.state.terrainCoverNeedsRedraw) {\n layerNeedsRedraw[layer.id] = true;\n layer.state.terrainCoverNeedsRedraw = false;\n }\n }\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.isDirty = terrainCover.isDirty || terrainCover.shouldUpdate({layerNeedsRedraw});\n }\n\n for (const layer of terrainLayers) {\n this._updateTerrainCover(layer, drapeLayers, viewport, opts);\n }\n\n if (!this.isPicking) {\n this._pruneTerrainCovers();\n }\n }\n\n private _updateTerrainCover(\n terrainLayer: Layer,\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n const renderPass = this.isPicking ? this.terrainPickingPass : this.terrainPass;\n let terrainCover = this.terrainCovers.get(terrainLayer.id);\n if (!terrainCover) {\n terrainCover = new TerrainCover(terrainLayer);\n this.terrainCovers.set(terrainLayer.id, terrainCover);\n }\n try {\n const isDirty = terrainCover.shouldUpdate({\n targetLayer: terrainLayer,\n viewport,\n layers: drapeLayers\n });\n if (this.isPicking || terrainCover.isDirty || isDirty) {\n renderPass.renderTerrainCover(terrainCover, {\n ...opts,\n layers: drapeLayers,\n moduleParameters: {\n dummyHeightMap: this.dummyHeightMap,\n terrainSkipRender: false,\n devicePixelRatio: 1\n }\n });\n terrainCover.isDirty = false;\n }\n } catch (err) {\n terrainLayer.raiseError(err as Error, `Error rendering terrain cover ${terrainCover.id}`);\n }\n }\n\n private _pruneTerrainCovers() {\n /** Prune the cache, remove textures for layers that have been removed */\n const idsToRemove: string[] = [];\n for (const [id, terrainCover] of this.terrainCovers) {\n if (!terrainCover.isActive) {\n idsToRemove.push(id);\n }\n }\n for (const id of idsToRemove) {\n this.terrainCovers.delete(id);\n }\n }\n}\n"],"file":"terrain-effect.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/terrain/terrain-effect.ts"],"names":["Texture2D","ProgramManager","log","terrainModule","TerrainCover","TerrainPass","TerrainPickingPass","HeightMapBuilder","TerrainEffect","Map","initialize","gl","dummyHeightMap","width","height","data","Uint8Array","terrainPass","id","terrainPickingPass","isSupported","heightMap","warn","getDefaultProgramManager","addDefaultModule","preRender","opts","layer","layers","props","operation","includes","setChangeFlags","extensionsChanged","pickZ","isDrapingEnabled","viewports","isPicking","viewport","getRenderableLayers","terrainLayers","filter","l","length","offsetLayers","state","terrainFittingMode","_updateHeightMap","drapeLayers","_updateTerrainCovers","getModuleParameters","getRenderFramebuffer","heightMapBounds","bounds","terrainCover","terrainCovers","get","useTerrainHeightMap","terrainSkipRender","cleanup","delete","undefined","values","clear","shouldUpdate","renderHeightMap","moduleParameters","devicePixelRatio","drawToTerrainHeightMap","layerNeedsRedraw","terrainCoverNeedsRedraw","isDirty","_updateTerrainCover","_pruneTerrainCovers","terrainLayer","renderPass","set","targetLayer","renderTerrainCover","err","raiseError","idsToRemove","isActive","push"],"mappings":";AAAA,SAAQA,SAAR,EAAmBC,cAAnB,QAAwC,eAAxC;AACA,SAAQC,GAAR,QAAkB,eAAlB;AAEA,SAAQC,aAAR,QAAmD,iBAAnD;AACA,SAAQC,YAAR,QAA2B,iBAA3B;AACA,SAAQC,WAAR,QAA0B,gBAA1B;AACA,SAAQC,kBAAR,QAAkE,wBAAlE;AACA,SAAQC,gBAAR,QAA+B,sBAA/B;AAKA,OAAO,MAAMC,aAAN,CAAsC;AAAA;AAAA,gCACtC,gBADsC;;AAAA,mCAEnC,IAFmC;;AAAA,0CAG5B,IAH4B;;AAAA,uCAMd,KANc;;AAAA,8CAQP,KARO;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,2CAgBQ,IAAIC,GAAJ,EAhBR;AAAA;;AAkB3CC,EAAAA,UAAU,CAACC,EAAD,EAA4B;AACpC,SAAKC,cAAL,GAAsB,IAAIZ,SAAJ,CAAcW,EAAd,EAAkB;AACtCE,MAAAA,KAAK,EAAE,CAD+B;AAEtCC,MAAAA,MAAM,EAAE,CAF8B;AAGtCC,MAAAA,IAAI,EAAE,IAAIC,UAAJ,CAAe,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAAf;AAHgC,KAAlB,CAAtB;AAKA,SAAKC,WAAL,GAAmB,IAAIZ,WAAJ,CAAgBM,EAAhB,EAAoB;AAACO,MAAAA,EAAE,EAAE;AAAL,KAApB,CAAnB;AACA,SAAKC,kBAAL,GAA0B,IAAIb,kBAAJ,CAAuBK,EAAvB,EAA2B;AAACO,MAAAA,EAAE,EAAE;AAAL,KAA3B,CAA1B;;AAEA,QAAIX,gBAAgB,CAACa,WAAjB,CAA6BT,EAA7B,CAAJ,EAAsC;AACpC,WAAKU,SAAL,GAAiB,IAAId,gBAAJ,CAAqBI,EAArB,CAAjB;AACD,KAFD,MAEO;AACLT,MAAAA,GAAG,CAACoB,IAAJ,CAAS,sDAAT;AACD;;AAEDrB,IAAAA,cAAc,CAACsB,wBAAf,CAAwCZ,EAAxC,EAA4Ca,gBAA5C,CAA6DrB,aAA7D;AACD;;AAEDsB,EAAAA,SAAS,CAACd,EAAD,EAA4Be,IAA5B,EAA0D;AACjE,QAAI,CAAC,KAAKd,cAAV,EAA0B;AAExB,WAAKF,UAAL,CAAgBC,EAAhB;;AACA,WAAK,MAAMgB,KAAX,IAAoBD,IAAI,CAACE,MAAzB,EAAiC;AAE/B,YAAID,KAAK,CAACE,KAAN,CAAYC,SAAZ,CAAsBC,QAAtB,CAA+B,SAA/B,CAAJ,EAA+C;AAC7CJ,UAAAA,KAAK,CAACK,cAAN,CAAqB;AAACC,YAAAA,iBAAiB,EAAE;AAApB,WAArB;AACD;AACF;AACF;;AAGD,QAAIP,IAAI,CAACQ,KAAT,EAAgB;AAEd,WAAKC,gBAAL,GAAwB,KAAxB;AACA;AACD;;AAED,UAAM;AAACC,MAAAA,SAAD;AAAYC,MAAAA,SAAS,GAAG;AAAxB,QAAiCX,IAAvC;AACA,SAAKW,SAAL,GAAiBA,SAAjB;AACA,SAAKF,gBAAL,GAAwB,IAAxB;AAGA,UAAMG,QAAQ,GAAGF,SAAS,CAAC,CAAD,CAA1B;AACA,UAAMR,MAAM,GAAG,CAACS,SAAS,GAAG,KAAKlB,kBAAR,GAA6B,KAAKF,WAA5C,EAAyDsB,mBAAzD,CACbD,QADa,EAEbZ,IAFa,CAAf;AAKA,UAAMc,aAAa,GAAGZ,MAAM,CAACa,MAAP,CAAcC,CAAC,IAAIA,CAAC,CAACb,KAAF,CAAQC,SAAR,CAAkBC,QAAlB,CAA2B,SAA3B,CAAnB,CAAtB;;AACA,QAAIS,aAAa,CAACG,MAAd,KAAyB,CAA7B,EAAgC;AAC9B;AACD;;AAED,QAAI,CAACN,SAAL,EAAgB;AACd,YAAMO,YAAY,GAAGhB,MAAM,CAACa,MAAP,CAAcC,CAAC,IAAIA,CAAC,CAACG,KAAF,CAAQC,kBAAR,KAA+B,QAAlD,CAArB;;AACA,UAAIF,YAAY,CAACD,MAAb,GAAsB,CAA1B,EAA6B;AAC3B,aAAKI,gBAAL,CAAsBP,aAAtB,EAAqCF,QAArC,EAA+CZ,IAA/C;AACD;AACF;;AAED,UAAMsB,WAAW,GAAGpB,MAAM,CAACa,MAAP,CAAcC,CAAC,IAAIA,CAAC,CAACG,KAAF,CAAQC,kBAAR,KAA+B,OAAlD,CAApB;;AACA,SAAKG,oBAAL,CAA0BT,aAA1B,EAAyCQ,WAAzC,EAAsDV,QAAtD,EAAgEZ,IAAhE;AACD;;AAEDwB,EAAAA,mBAAmB,CAACvB,KAAD,EAAsC;AAAA;;AACvD,UAAM;AAACmB,MAAAA;AAAD,QAAuBnB,KAAK,CAACkB,KAAnC;AAEA,WAAO;AACLxB,MAAAA,SAAS,qBAAE,KAAKA,SAAP,oDAAE,gBAAgB8B,oBAAhB,EADN;AAELC,MAAAA,eAAe,sBAAE,KAAK/B,SAAP,qDAAE,iBAAgBgC,MAF5B;AAGLzC,MAAAA,cAAc,EAAE,KAAKA,cAHhB;AAIL0C,MAAAA,YAAY,EAAE,KAAKnB,gBAAL,GAAwB,KAAKoB,aAAL,CAAmBC,GAAnB,CAAuB7B,KAAK,CAACT,EAA7B,CAAxB,GAA2D,IAJpE;AAKLuC,MAAAA,mBAAmB,EAAEX,kBAAkB,KAAK,QALvC;AAMLY,MAAAA,iBAAiB,EAAEZ,kBAAkB,KAAK,OAAvB,IAAkC,CAACnB,KAAK,CAACE,KAAN,CAAYC,SAAZ,CAAsBC,QAAtB,CAA+B,MAA/B;AANjD,KAAP;AAQD;;AAED4B,EAAAA,OAAO,GAAS;AACd,QAAI,KAAK/C,cAAT,EAAyB;AACvB,WAAKA,cAAL,CAAoBgD,MAApB;AACA,WAAKhD,cAAL,GAAsBiD,SAAtB;AACD;;AAED,QAAI,KAAKxC,SAAT,EAAoB;AAClB,WAAKA,SAAL,CAAeuC,MAAf;AACA,WAAKvC,SAAL,GAAiBwC,SAAjB;AACD;;AAED,SAAK,MAAMP,YAAX,IAA2B,KAAKC,aAAL,CAAmBO,MAAnB,EAA3B,EAAwD;AACtDR,MAAAA,YAAY,CAACM,MAAb;AACD;;AACD,SAAKL,aAAL,CAAmBQ,KAAnB;AACD;;AAEOhB,EAAAA,gBAAgB,CAACP,aAAD,EAAyBF,QAAzB,EAA6CZ,IAA7C,EAAqE;AAC3F,QAAI,CAAC,KAAKL,SAAV,EAAqB;AAEnB;AACD;;AAED,UAAM2C,YAAY,GAAG,KAAK3C,SAAL,CAAe2C,YAAf,CAA4B;AAACpC,MAAAA,MAAM,EAAEY,aAAT;AAAwBF,MAAAA;AAAxB,KAA5B,CAArB;;AACA,QAAI,CAAC0B,YAAL,EAAmB;AACjB;AACD;;AAED,SAAK/C,WAAL,CAAiBgD,eAAjB,CAAiC,KAAK5C,SAAtC,EAAiD,EAC/C,GAAGK,IAD4C;AAE/CE,MAAAA,MAAM,EAAEY,aAFuC;AAG/C0B,MAAAA,gBAAgB,EAAE;AAChBd,QAAAA,eAAe,EAAE,KAAK/B,SAAL,CAAegC,MADhB;AAEhBzC,QAAAA,cAAc,EAAE,KAAKA,cAFL;AAGhBuD,QAAAA,gBAAgB,EAAE,CAHF;AAIhBC,QAAAA,sBAAsB,EAAE;AAJR;AAH6B,KAAjD;AAUD;;AAEOnB,EAAAA,oBAAoB,CAC1BT,aAD0B,EAE1BQ,WAF0B,EAG1BV,QAH0B,EAI1BZ,IAJ0B,EAK1B;AAEA,UAAM2C,gBAAyC,GAAG,EAAlD;;AACA,SAAK,MAAM1C,KAAX,IAAoBqB,WAApB,EAAiC;AAC/B,UAAIrB,KAAK,CAACkB,KAAN,CAAYyB,uBAAhB,EAAyC;AACvCD,QAAAA,gBAAgB,CAAC1C,KAAK,CAACT,EAAP,CAAhB,GAA6B,IAA7B;AACAS,QAAAA,KAAK,CAACkB,KAAN,CAAYyB,uBAAZ,GAAsC,KAAtC;AACD;AACF;;AACD,SAAK,MAAMhB,YAAX,IAA2B,KAAKC,aAAL,CAAmBO,MAAnB,EAA3B,EAAwD;AACtDR,MAAAA,YAAY,CAACiB,OAAb,GAAuBjB,YAAY,CAACiB,OAAb,IAAwBjB,YAAY,CAACU,YAAb,CAA0B;AAACK,QAAAA;AAAD,OAA1B,CAA/C;AACD;;AAED,SAAK,MAAM1C,KAAX,IAAoBa,aAApB,EAAmC;AACjC,WAAKgC,mBAAL,CAAyB7C,KAAzB,EAAgCqB,WAAhC,EAA6CV,QAA7C,EAAuDZ,IAAvD;AACD;;AAED,QAAI,CAAC,KAAKW,SAAV,EAAqB;AACnB,WAAKoC,mBAAL;AACD;AACF;;AAEOD,EAAAA,mBAAmB,CACzBE,YADyB,EAEzB1B,WAFyB,EAGzBV,QAHyB,EAIzBZ,IAJyB,EAKzB;AACA,UAAMiD,UAAU,GAAG,KAAKtC,SAAL,GAAiB,KAAKlB,kBAAtB,GAA2C,KAAKF,WAAnE;AACA,QAAIqC,YAAY,GAAG,KAAKC,aAAL,CAAmBC,GAAnB,CAAuBkB,YAAY,CAACxD,EAApC,CAAnB;;AACA,QAAI,CAACoC,YAAL,EAAmB;AACjBA,MAAAA,YAAY,GAAG,IAAIlD,YAAJ,CAAiBsE,YAAjB,CAAf;AACA,WAAKnB,aAAL,CAAmBqB,GAAnB,CAAuBF,YAAY,CAACxD,EAApC,EAAwCoC,YAAxC;AACD;;AACD,QAAI;AACF,YAAMiB,OAAO,GAAGjB,YAAY,CAACU,YAAb,CAA0B;AACxCa,QAAAA,WAAW,EAAEH,YAD2B;AAExCpC,QAAAA,QAFwC;AAGxCV,QAAAA,MAAM,EAAEoB;AAHgC,OAA1B,CAAhB;;AAKA,UAAI,KAAKX,SAAL,IAAkBiB,YAAY,CAACiB,OAA/B,IAA0CA,OAA9C,EAAuD;AACrDI,QAAAA,UAAU,CAACG,kBAAX,CAA8BxB,YAA9B,EAA4C,EAC1C,GAAG5B,IADuC;AAE1CE,UAAAA,MAAM,EAAEoB,WAFkC;AAG1CkB,UAAAA,gBAAgB,EAAE;AAChBtD,YAAAA,cAAc,EAAE,KAAKA,cADL;AAEhB8C,YAAAA,iBAAiB,EAAE,KAFH;AAGhBS,YAAAA,gBAAgB,EAAE;AAHF;AAHwB,SAA5C;AASAb,QAAAA,YAAY,CAACiB,OAAb,GAAuB,KAAvB;AACD;AACF,KAlBD,CAkBE,OAAOQ,GAAP,EAAY;AACZL,MAAAA,YAAY,CAACM,UAAb,CAAwBD,GAAxB,0CAAuEzB,YAAY,CAACpC,EAApF;AACD;AACF;;AAEOuD,EAAAA,mBAAmB,GAAG;AAE5B,UAAMQ,WAAqB,GAAG,EAA9B;;AACA,SAAK,MAAM,CAAC/D,EAAD,EAAKoC,YAAL,CAAX,IAAiC,KAAKC,aAAtC,EAAqD;AACnD,UAAI,CAACD,YAAY,CAAC4B,QAAlB,EAA4B;AAC1BD,QAAAA,WAAW,CAACE,IAAZ,CAAiBjE,EAAjB;AACD;AACF;;AACD,SAAK,MAAMA,EAAX,IAAiB+D,WAAjB,EAA8B;AAC5B,WAAK1B,aAAL,CAAmBK,MAAnB,CAA0B1C,EAA1B;AACD;AACF;;AAhN0C","sourcesContent":["import {Texture2D, ProgramManager} from '@luma.gl/core';\nimport {log} from '@deck.gl/core';\n\nimport {terrainModule, TerrainModuleSettings} from './shader-module';\nimport {TerrainCover} from './terrain-cover';\nimport {TerrainPass} from './terrain-pass';\nimport {TerrainPickingPass, TerrainPickingPassRenderOptions} from './terrain-picking-pass';\nimport {HeightMapBuilder} from './height-map-builder';\n\nimport type {Effect, PreRenderOptions, Layer, Viewport} from '@deck.gl/core';\n\n/** Class to manage terrain effect */\nexport class TerrainEffect implements Effect {\n id = 'terrain-effect';\n props = null;\n useInPicking = true;\n\n /** true if picking in the current pass */\n private isPicking: boolean = false;\n /** true if should use in the current pass */\n private isDrapingEnabled: boolean = false;\n /** An empty texture as placeholder */\n private dummyHeightMap: Texture2D;\n /** A texture encoding the ground elevation, updated once per redraw. Used by layers with offset mode */\n private heightMap?: HeightMapBuilder;\n private terrainPass!: TerrainPass;\n private terrainPickingPass!: TerrainPickingPass;\n /** One texture for each primitive terrain layer, into which the draped layers render */\n private terrainCovers: Map<string, TerrainCover> = new Map();\n\n initialize(gl: WebGLRenderingContext) {\n this.dummyHeightMap = new Texture2D(gl, {\n width: 1,\n height: 1,\n data: new Uint8Array([0, 0, 0, 0])\n });\n this.terrainPass = new TerrainPass(gl, {id: 'terrain'});\n this.terrainPickingPass = new TerrainPickingPass(gl, {id: 'terrain-picking'});\n\n if (HeightMapBuilder.isSupported(gl)) {\n this.heightMap = new HeightMapBuilder(gl);\n } else {\n log.warn('Terrain offset mode is not supported by this browser')();\n }\n\n ProgramManager.getDefaultProgramManager(gl).addDefaultModule(terrainModule);\n }\n\n preRender(gl: WebGLRenderingContext, opts: PreRenderOptions): void {\n if (!this.dummyHeightMap) {\n // First time this effect is in use, initialize resources and register the shader module\n this.initialize(gl);\n for (const layer of opts.layers) {\n // Force the terrain layer (and its descendents) to rebuild their models with the new shader\n if (layer.props.operation.includes('terrain')) {\n layer.setChangeFlags({extensionsChanged: true});\n }\n }\n }\n\n // @ts-expect-error pickZ only defined in picking pass\n if (opts.pickZ) {\n // Do not update if picking attributes\n this.isDrapingEnabled = false;\n return;\n }\n\n const {viewports, isPicking = false} = opts;\n this.isPicking = isPicking;\n this.isDrapingEnabled = true;\n\n // TODO - support multiple views?\n const viewport = viewports[0];\n const layers = (isPicking ? this.terrainPickingPass : this.terrainPass).getRenderableLayers(\n viewport,\n opts as TerrainPickingPassRenderOptions\n );\n\n const terrainLayers = layers.filter(l => l.props.operation.includes('terrain'));\n if (terrainLayers.length === 0) {\n return;\n }\n\n if (!isPicking) {\n const offsetLayers = layers.filter(l => l.state.terrainFittingMode === 'offset');\n if (offsetLayers.length > 0) {\n this._updateHeightMap(terrainLayers, viewport, opts);\n }\n }\n\n const drapeLayers = layers.filter(l => l.state.terrainFittingMode === 'drape');\n this._updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts);\n }\n\n getModuleParameters(layer: Layer): TerrainModuleSettings {\n const {terrainFittingMode} = layer.state;\n\n return {\n heightMap: this.heightMap?.getRenderFramebuffer(),\n heightMapBounds: this.heightMap?.bounds,\n dummyHeightMap: this.dummyHeightMap,\n terrainCover: this.isDrapingEnabled ? this.terrainCovers.get(layer.id) : null,\n useTerrainHeightMap: terrainFittingMode === 'offset',\n terrainSkipRender: terrainFittingMode === 'drape' || !layer.props.operation.includes('draw')\n };\n }\n\n cleanup(): void {\n if (this.dummyHeightMap) {\n this.dummyHeightMap.delete();\n this.dummyHeightMap = undefined;\n }\n\n if (this.heightMap) {\n this.heightMap.delete();\n this.heightMap = undefined;\n }\n\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.delete();\n }\n this.terrainCovers.clear();\n }\n\n private _updateHeightMap(terrainLayers: Layer[], viewport: Viewport, opts: PreRenderOptions) {\n if (!this.heightMap) {\n // Not supported\n return;\n }\n\n const shouldUpdate = this.heightMap.shouldUpdate({layers: terrainLayers, viewport});\n if (!shouldUpdate) {\n return;\n }\n\n this.terrainPass.renderHeightMap(this.heightMap, {\n ...opts,\n layers: terrainLayers,\n moduleParameters: {\n heightMapBounds: this.heightMap.bounds,\n dummyHeightMap: this.dummyHeightMap,\n devicePixelRatio: 1,\n drawToTerrainHeightMap: true\n }\n });\n }\n\n private _updateTerrainCovers(\n terrainLayers: Layer[],\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n // Mark a terrain cover as dirty if one of the drape layers needs redraw\n const layerNeedsRedraw: Record<string, boolean> = {};\n for (const layer of drapeLayers) {\n if (layer.state.terrainCoverNeedsRedraw) {\n layerNeedsRedraw[layer.id] = true;\n layer.state.terrainCoverNeedsRedraw = false;\n }\n }\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.isDirty = terrainCover.isDirty || terrainCover.shouldUpdate({layerNeedsRedraw});\n }\n\n for (const layer of terrainLayers) {\n this._updateTerrainCover(layer, drapeLayers, viewport, opts);\n }\n\n if (!this.isPicking) {\n this._pruneTerrainCovers();\n }\n }\n\n private _updateTerrainCover(\n terrainLayer: Layer,\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n const renderPass = this.isPicking ? this.terrainPickingPass : this.terrainPass;\n let terrainCover = this.terrainCovers.get(terrainLayer.id);\n if (!terrainCover) {\n terrainCover = new TerrainCover(terrainLayer);\n this.terrainCovers.set(terrainLayer.id, terrainCover);\n }\n try {\n const isDirty = terrainCover.shouldUpdate({\n targetLayer: terrainLayer,\n viewport,\n layers: drapeLayers\n });\n if (this.isPicking || terrainCover.isDirty || isDirty) {\n renderPass.renderTerrainCover(terrainCover, {\n ...opts,\n layers: drapeLayers,\n moduleParameters: {\n dummyHeightMap: this.dummyHeightMap,\n terrainSkipRender: false,\n devicePixelRatio: 1\n }\n });\n terrainCover.isDirty = false;\n }\n } catch (err) {\n terrainLayer.raiseError(err as Error, `Error rendering terrain cover ${terrainCover.id}`);\n }\n }\n\n private _pruneTerrainCovers() {\n /** Prune the cache, remove textures for layers that have been removed */\n const idsToRemove: string[] = [];\n for (const [id, terrainCover] of this.terrainCovers) {\n if (!terrainCover.isActive) {\n idsToRemove.push(id);\n }\n }\n for (const id of idsToRemove) {\n this.terrainCovers.delete(id);\n }\n }\n}\n"],"file":"terrain-effect.js"}
|
package/dist.min.js
CHANGED
|
@@ -1245,8 +1245,8 @@ float collide_isVisible(vec2 texCoords, vec3 pickingColor) {
|
|
|
1245
1245
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function _e(e){return rt(e)||tt(e)||Le(e)||nt()}function it(e){if(Array.isArray(e))return e}function at(e,r){var t=e==null?null:typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(t!=null){var n=[],i=!0,a=!1,o,s;try{for(t=t.call(e);!(i=(o=t.next()).done)&&(n.push(o.value),!(r&&n.length===r));i=!0);}catch(f){a=!0,s=f}finally{try{!i&&t.return!=null&&t.return()}finally{if(a)throw s}}return n}}function ot(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
1246
1246
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function j(e,r){return it(e)||at(e,r)||Le(e,r)||ot()}function st(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function Ii(e,r){for(var t=0;t<r.length;t++){var n=r[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function ft(e,r,t){return r&&Ii(e.prototype,r),t&&Ii(e,t),e}function w(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function ge(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}function ce(e,r){var t=Nn([],r,e);return kn(t,t,1/t[3]),t}function Ce(e,r,t){return e<r?r:e>t?t:e}function Fs(e){return Math.log(e)*Math.LOG2E}var lr=Math.log2||Fs;function Z(e,r){if(!e)throw new Error(r||"@math.gl/web-mercator: assertion failed.")}var $=Math.PI,Li=$/4,te=$/180,lt=180/$,ke=512,Fi=4003e4,xe=85.051129,ct=1.5;function cr(e){return Math.pow(2,e)}function ne(e){var r=j(e,2),t=r[0],n=r[1];Z(Number.isFinite(t)),Z(Number.isFinite(n)&&n>=-90&&n<=90,"invalid latitude");var i=t*te,a=n*te,o=ke*(i+$)/(2*$),s=ke*($+Math.log(Math.tan(Li+a*.5)))/(2*$);return[o,s]}function K(e){var r=j(e,2),t=r[0],n=r[1],i=t/ke*(2*$)-$,a=2*(Math.atan(Math.exp(n/ke*(2*$)-$))-Li);return[i*lt,a*lt]}function ut(e){var r=e.latitude,t=e.longitude,n=e.highPrecision,i=n===void 0?!1:n;Z(Number.isFinite(r)&&Number.isFinite(t));var a=ke,o=Math.cos(r*te),s=a/360,f=s/o,l=a/Fi/o,c={unitsPerMeter:[l,l,l],metersPerUnit:[1/l,1/l,1/l],unitsPerDegree:[s,f,l],degreesPerUnit:[1/s,1/f,1/l]};if(i){var p=te*Math.tan(r*te)/o,v=s*p/2,d=a/Fi*p,m=d/f*l;c.unitsPerDegree2=[0,v,d],c.unitsPerMeter2=[m,0,m]}return c}function pt(e){var r=e.height,t=e.pitch,n=e.bearing,i=e.altitude,a=e.scale,o=e.center,s=ge();Se(s,s,[0,0,-i]),In(s,s,-t*te),Fn(s,s,n*te);var f=a/r;return Je(s,s,[f,f,f]),o&&Se(s,s,Tn([],o)),s}function Ci(e){var r=e.width,t=e.height,n=e.altitude,i=e.pitch,a=i===void 0?0:i,o=e.offset,s=e.center,f=e.scale,l=e.nearZMultiplier,c=l===void 0?1:l,p=e.farZMultiplier,v=p===void 0?1:p,d=e.fovy,m=d===void 0?ye(ct):d;n!==void 0&&(m=ye(n));var h=m*te,_=a*te,g=ur(m),M=g;s&&(M+=s[2]*f/Math.cos(_)/t);var y=h*(.5+(o?o[1]:0)/t),x=Math.sin(y)*M/Math.sin(Ce(Math.PI/2-_-y,.01,Math.PI-.01)),P=Math.sin(_)*x+M,b=M*10,S=Math.min(P*v,b);return{fov:h,aspect:r/t,focalDistance:g,near:c,far:S}}function vt(e){var r=Ci(e),t=r.fov,n=r.aspect,i=r.near,a=r.far,o=Ln([],t,n,i,a);return o}function ye(e){return 2*Math.atan(.5/e)*lt}function ur(e){return .5/Math.tan(.5*e*te)}function dt(e,r){var t=j(e,3),n=t[0],i=t[1],a=t[2],o=a===void 0?0:a;return Z(Number.isFinite(n)&&Number.isFinite(i)&&Number.isFinite(o)),ce(r,[n,i,o,1])}function pr(e,r){var t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,n=j(e,3),i=n[0],a=n[1],o=n[2];if(Z(Number.isFinite(i)&&Number.isFinite(a),"invalid pixel coordinate"),Number.isFinite(o)){var s=ce(r,[i,a,o,1]);return s}var f=ce(r,[i,a,0,1]),l=ce(r,[i,a,1,1]),c=f[2],p=l[2],v=c===p?0:((t||0)-c)/(p-c);return Xe([],f,l,v)}function Me(e){var r=e.width,t=e.height,n=e.bounds,i=e.minExtent,a=i===void 0?0:i,o=e.maxZoom,s=o===void 0?24:o,f=e.offset,l=f===void 0?[0,0]:f,c=j(n,2),p=j(c[0],2),v=p[0],d=p[1],m=j(c[1],2),h=m[0],_=m[1],g=Ls(e.padding),M=ne([v,Ce(_,-xe,xe)]),y=ne([h,Ce(d,-xe,xe)]),x=[Math.max(Math.abs(y[0]-M[0]),a),Math.max(Math.abs(y[1]-M[1]),a)],P=[r-g.left-g.right-Math.abs(l[0])*2,t-g.top-g.bottom-Math.abs(l[1])*2];Z(P[0]>0&&P[1]>0);var b=P[0]/x[0],S=P[1]/x[1],B=(g.right-g.left)/2/b,N=(g.bottom-g.top)/2/S,z=[(y[0]+M[0])/2+B,(y[1]+M[1])/2+N],L=K(z),E=Math.min(s,lr(Math.abs(Math.min(b,S))));return Z(Number.isFinite(E)),{longitude:L[0],latitude:L[1],zoom:E}}function Ls(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;return typeof e=="number"?{top:e,bottom:e,left:e,right:e}:(Z(Number.isFinite(e.top)&&Number.isFinite(e.bottom)&&Number.isFinite(e.left)&&Number.isFinite(e.right)),e)}var ki=Math.PI/180;function vr(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,t=e.width,n=e.height,i=e.unproject,a={targetZ:r},o=i([0,n],a),s=i([t,n],a),f,l,c=e.fovy?.5*e.fovy*ki:Math.atan(.5/e.altitude),p=(90-e.pitch)*ki;return c>p-.01?(f=Ni(e,0,r),l=Ni(e,t,r)):(f=i([0,0],a),l=i([t,0],a)),[o,s,l,f]}function Ni(e,r,t){var n=e.pixelUnprojectionMatrix,i=ce(n,[r,0,1,1]),a=ce(n,[r,e.height,1,1]),o=t*e.distanceScales.unitsPerMeter[2],s=(o-i[2])/(a[2]-i[2]),f=Xe([],i,a,s),l=K(f);return l.push(t),l}var ji=function(){function e(){var r=this,t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{width:1,height:1};st(this,e),w(this,"latitude",void 0),w(this,"longitude",void 0),w(this,"zoom",void 0),w(this,"pitch",void 0),w(this,"bearing",void 0),w(this,"altitude",void 0),w(this,"fovy",void 0),w(this,"meterOffset",void 0),w(this,"center",void 0),w(this,"width",void 0),w(this,"height",void 0),w(this,"scale",void 0),w(this,"distanceScales",void 0),w(this,"viewMatrix",void 0),w(this,"projectionMatrix",void 0),w(this,"viewProjectionMatrix",void 0),w(this,"pixelProjectionMatrix",void 0),w(this,"pixelUnprojectionMatrix",void 0),w(this,"equals",function(E){return E instanceof e?E.width===r.width&&E.height===r.height&&Wr(E.projectionMatrix,r.projectionMatrix)&&Wr(E.viewMatrix,r.viewMatrix):!1}),w(this,"project",function(E){var C=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},O=C.topLeft,J=O===void 0?!0:O,H=r.projectPosition(E),U=dt(H,r.pixelProjectionMatrix),ve=j(U,2),De=ve[0],Ee=ve[1],Te=J?Ee:r.height-Ee;return E.length===2?[De,Te]:[De,Te,U[2]]}),w(this,"unproject",function(E){var C=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},O=C.topLeft,J=O===void 0?!0:O,H=C.targetZ,U=H===void 0?void 0:H,ve=j(E,3),De=ve[0],Ee=ve[1],Te=ve[2],eo=J?Ee:r.height-Ee,ro=U&&U*r.distanceScales.unitsPerMeter[2],to=pr([De,eo,Te],r.pixelUnprojectionMatrix,ro),no=r.unprojectPosition(to),wr=j(no,3),Ar=wr[0],Sr=wr[1],io=wr[2];return Number.isFinite(Te)?[Ar,Sr,io]:Number.isFinite(U)?[Ar,Sr,U]:[Ar,Sr]}),w(this,"projectPosition",function(E){var C=ne(E),O=j(C,2),J=O[0],H=O[1],U=(E[2]||0)*r.distanceScales.unitsPerMeter[2];return[J,H,U]}),w(this,"unprojectPosition",function(E){var C=K(E),O=j(C,2),J=O[0],H=O[1],U=(E[2]||0)*r.distanceScales.metersPerUnit[2];return[J,H,U]});var n=t.width,i=t.height,a=t.altitude,o=a===void 0?null:a,s=t.fovy,f=s===void 0?null:s,l=t.latitude,c=l===void 0?0:l,p=t.longitude,v=p===void 0?0:p,d=t.zoom,m=d===void 0?0:d,h=t.pitch,_=h===void 0?0:h,g=t.bearing,M=g===void 0?0:g,y=t.position,x=y===void 0?null:y,P=t.nearZMultiplier,b=P===void 0?.02:P,S=t.farZMultiplier,B=S===void 0?1.01:S;n=n||1,i=i||1,f===null&&o===null?(o=ct,f=ye(o)):f===null?f=ye(o):o===null&&(o=ur(f));var N=cr(m);o=Math.max(.75,o);var z=ut({longitude:v,latitude:c}),L=ne([v,c]);L.push(0),x&&En(L,L,wn([],x,z.unitsPerMeter)),this.projectionMatrix=vt({width:n,height:i,scale:N,center:L,pitch:_,fovy:f,nearZMultiplier:b,farZMultiplier:B}),this.viewMatrix=pt({height:i,scale:N,center:L,pitch:_,bearing:M,altitude:o}),this.width=n,this.height=i,this.scale=N,this.latitude=c,this.longitude=v,this.zoom=m,this.pitch=_,this.bearing=M,this.altitude=o,this.fovy=f,this.center=L,this.meterOffset=x||[0,0,0],this.distanceScales=z,this._initMatrices(),Object.freeze(this)}return ft(e,[{key:"_initMatrices",value:function(){var t=this.width,n=this.height,i=this.projectionMatrix,a=this.viewMatrix,o=ge();Qe(o,o,i),Qe(o,o,a),this.viewProjectionMatrix=o;var s=ge();Je(s,s,[t/2,-n/2,1]),Se(s,s,[1,-1,0]),Qe(s,s,o);var f=Rn(ge(),s);if(!f)throw new Error("Pixel project matrix not invertible");this.pixelProjectionMatrix=s,this.pixelUnprojectionMatrix=f}},{key:"projectFlat",value:function(t){return ne(t)}},{key:"unprojectFlat",value:function(t){return K(t)}},{key:"getMapCenterByLngLatPosition",value:function(t){var n=t.lngLat,i=t.pos,a=pr(i,this.pixelUnprojectionMatrix),o=ne(n),s=Ur([],o,On([],a)),f=Ur([],this.center,s);return K(f)}},{key:"fitBounds",value:function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=this.width,a=this.height,o=Me(Object.assign({width:i,height:a,bounds:t},n)),s=o.longitude,f=o.latitude,l=o.zoom;return new e({width:i,height:a,longitude:s,latitude:f,zoom:l})}},{key:"getBounds",value:function(t){var n=this.getBoundingRegion(t),i=Math.min.apply(Math,_e(n.map(function(f){return f[0]}))),a=Math.max.apply(Math,_e(n.map(function(f){return f[0]}))),o=Math.min.apply(Math,_e(n.map(function(f){return f[1]}))),s=Math.max.apply(Math,_e(n.map(function(f){return f[1]})));return[[i,o],[a,s]]}},{key:"getBoundingRegion",value:function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return vr(this,t.z||0)}},{key:"getLocationAtPoint",value:function(t){var n=t.lngLat,i=t.pos;return this.getMapCenterByLngLatPosition({lngLat:n,pos:i})}}]),e}();function ks(e,r){var t=typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=Ns(e))||r&&e&&typeof e.length=="number"){t&&(e=t);var n=0,i=function(){};return{s:i,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(l){throw l},f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
|
|
1247
1247
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,o=!1,s;return{s:function(){t=t.call(e)},n:function(){var l=t.next();return a=l.done,l},e:function(l){o=!0,s=l},f:function(){try{!a&&t.return!=null&&t.return()}finally{if(o)throw s}}}}function Ns(e,r){if(e){if(typeof e=="string")return Di(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if(t==="Object"&&e.constructor&&(t=e.constructor.name),t==="Map"||t==="Set")return Array.from(e);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return Di(e,r)}}function Di(e,r){(r==null||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}function Bi(e){var r=e.layers,t=e.viewport,n=null,i=ks(r),a;try{for(i.s();!(a=i.n()).done;){var o=a.value,s=o.getBounds();s&&(n?(n[0]=Math.min(n[0],s[0][0]),n[1]=Math.min(n[1],s[0][1]),n[2]=Math.max(n[2],s[1][0]),n[3]=Math.max(n[3],s[1][1])):n=[s[0][0],s[0][1],s[1][0],s[1][1]])}}catch(c){i.e(c)}finally{i.f()}var f=t.getBounds();if(!n)return f;var l=js(f);return n[2]-n[0]<l[2]-l[0]||n[3]-n[1]<l[3]-l[1]||(n[0]=Math.max(n[0],l[0]),n[1]=Math.max(n[1],l[1]),n[2]=Math.min(n[2],l[2]),n[3]=Math.min(n[3],l[3])),n}function zi(e){var r=e.bounds,t=e.viewport,n=e.width,i=e.height;if(r[2]<=r[0]||r[3]<=r[1])return null;if(t.resolution!==void 0)return Pe.log.warn("MaskExtension is not supported in GlobeView")(),null;var a=1;if(n-=a*2,i-=a*2,t.isGeospatial){var o=Me({width:n,height:i,bounds:[[r[0],r[1]],[r[2],r[3]]],maxZoom:20}),s=o.longitude,f=o.latitude,l=o.zoom;return new Pe.WebMercatorViewport({longitude:s,latitude:f,zoom:l,x:a,y:a,width:n,height:i})}var c=[(r[0]+r[2])/2,(r[1]+r[3])/2,0],p=Math.min(1048576,n/(r[2]-r[0]),i/(r[3]-r[1]));return new Pe.OrthographicView({x:a,y:a}).makeViewport({width:n,height:i,viewState:{target:c,zoom:Math.log2(p)}})}function js(e){var r={x:e[2]-e[0],y:e[3]-e[1]},t={x:e[0]+.5*r.x,y:e[1]+.5*r.y};return[t.x-r.x,t.y-r.y,t.x+r.x,t.y+r.y]}function Ds(e,r){var t=typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=Bs(e))||r&&e&&typeof e.length=="number"){t&&(e=t);var n=0,i=function(){};return{s:i,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(l){throw l},f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
|
|
1248
|
-
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,o=!1,s;return{s:function(){t=t.call(e)},n:function(){var l=t.next();return a=l.done,l},e:function(l){o=!0,s=l},f:function(){try{!a&&t.return!=null&&t.return()}finally{if(o)throw s}}}}function Bs(e,r){if(e){if(typeof e=="string")return Vi(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if(t==="Object"&&e.constructor&&(t=e.constructor.name),t==="Map"||t==="Set")return Array.from(e);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return Vi(e,r)}}function Vi(e,r){(r==null||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}var dr=function(){function e(){(0,Ui.default)(this,e),(0,X.default)(this,"id","mask-effect"),(0,X.default)(this,"props",null),(0,X.default)(this,"useInPicking",!0),(0,X.default)(this,"order",0),(0,X.default)(this,"dummyMaskMap",void 0),(0,X.default)(this,"channels",[]),(0,X.default)(this,"masks",null),(0,X.default)(this,"maskPass",void 0),(0,X.default)(this,"maskMap",void 0),(0,X.default)(this,"lastViewport",void 0)}return(0,qi.default)(e,[{key:"preRender",value:function(t,n){var i=n.layers,a=n.layerFilter,o=n.viewports,s=n.onViewportActive,f=n.views,l=n.
|
|
1249
|
-
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,o=!1,s;return{s:function(){t=t.call(e)},n:function(){var l=t.next();return a=l.done,l},e:function(l){o=!0,s=l},f:function(){try{!a&&t.return!=null&&t.return()}finally{if(o)throw s}}}}function Vs(e,r){if(e){if(typeof e=="string")return Gi(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if(t==="Object"&&e.constructor&&(t=e.constructor.name),t==="Map"||t==="Set")return Array.from(e);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return Gi(e,r)}}function Gi(e,r){(r==null||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}var mt=2,Ki=function(){function e(){(0,Hi.default)(this,e),(0,D.default)(this,"id","collide-effect"),(0,D.default)(this,"props",null),(0,D.default)(this,"useInPicking",!0),(0,D.default)(this,"order",1),(0,D.default)(this,"channels",{}),(0,D.default)(this,"collidePass",void 0),(0,D.default)(this,"collideFBOs",{}),(0,D.default)(this,"dummyCollideMap",void 0),(0,D.default)(this,"lastViewport",void 0)}return(0,Zi.default)(e,[{key:"preRender",value:function(t,n){var i,a=n.effects,o=n.layers,s=n.layerFilter,f=n.viewports,l=n.onViewportActive,c=n.views,p=n.
|
|
1248
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,o=!1,s;return{s:function(){t=t.call(e)},n:function(){var l=t.next();return a=l.done,l},e:function(l){o=!0,s=l},f:function(){try{!a&&t.return!=null&&t.return()}finally{if(o)throw s}}}}function Bs(e,r){if(e){if(typeof e=="string")return Vi(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if(t==="Object"&&e.constructor&&(t=e.constructor.name),t==="Map"||t==="Set")return Array.from(e);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return Vi(e,r)}}function Vi(e,r){(r==null||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}var dr=function(){function e(){(0,Ui.default)(this,e),(0,X.default)(this,"id","mask-effect"),(0,X.default)(this,"props",null),(0,X.default)(this,"useInPicking",!0),(0,X.default)(this,"order",0),(0,X.default)(this,"dummyMaskMap",void 0),(0,X.default)(this,"channels",[]),(0,X.default)(this,"masks",null),(0,X.default)(this,"maskPass",void 0),(0,X.default)(this,"maskMap",void 0),(0,X.default)(this,"lastViewport",void 0)}return(0,qi.default)(e,[{key:"preRender",value:function(t,n){var i=n.layers,a=n.layerFilter,o=n.viewports,s=n.onViewportActive,f=n.views,l=n.isPicking,c=!1;if(this.dummyMaskMap||(this.dummyMaskMap=new Yi.Texture2D(t,{width:1,height:1})),l)return{didRender:c};var p=i.filter(function(g){return g.props.visible&&g.props.operation.includes("mask")});if(p.length===0)return this.masks=null,this.channels.length=0,{didRender:c};this.masks={},this.maskPass||(this.maskPass=new Ri(t,{id:"default-mask"}),this.maskMap=this.maskPass.maskMap);var v=this._sortMaskChannels(p),d=o[0],m=!this.lastViewport||!this.lastViewport.equals(d);for(var h in v){var _=this._renderChannel(v[h],{layerFilter:a,onViewportActive:s,views:f,viewport:d,viewportChanged:m});c||(c=_)}return{didRender:c}}},{key:"_renderChannel",value:function(t,n){var i=n.layerFilter,a=n.onViewportActive,o=n.views,s=n.viewport,f=n.viewportChanged,l=!1,c=this.channels[t.index];if(!c)return l;var p=t===c||c.layers.length!==t.layers.length||t.layerBounds.some(function(h,_){return h!==c.layerBounds[_]});if(t.bounds=c.bounds,t.maskBounds=c.maskBounds,this.channels[t.index]=t,(p||f)&&(this.lastViewport=s,t.bounds=Bi({layers:t.layers,viewport:s}),p||!de(t.bounds,c.bounds))){var v=this.maskPass,d=this.maskMap,m=zi({bounds:t.bounds,viewport:s,width:d.width,height:d.height});t.maskBounds=m?m.getBounds():[0,0,1,1],v.render({pass:"mask",channel:t.index,layers:t.layers,layerFilter:i,viewports:m?[m]:[],onViewportActive:a,views:o,moduleParameters:{devicePixelRatio:1}}),l=!0}return this.masks[t.id]={index:t.index,bounds:t.maskBounds,coordinateOrigin:t.coordinateOrigin,coordinateSystem:t.coordinateSystem},l}},{key:"_sortMaskChannels",value:function(t){var n=this,i={},a=0,o=Ds(t),s;try{var f=function(){var h=s.value,_=h.root.id,g=i[_];if(!g){if(++a>4)return Wi.log.warn("Too many mask layers. The max supported is 4")(),"continue";g={id:_,index:n.channels.findIndex(function(M){return M?.id===_}),layers:[],layerBounds:[],coordinateOrigin:h.root.props.coordinateOrigin,coordinateSystem:h.root.props.coordinateSystem},i[_]=g}g.layers.push(h),g.layerBounds.push(h.getBounds())};for(o.s();!(s=o.n()).done;)var l=f()}catch(m){o.e(m)}finally{o.f()}for(var c=0;c<4;c++){var p=this.channels[c];(!p||!(p.id in i))&&(this.channels[c]=null)}for(var v in i){var d=i[v];d.index<0&&(d.index=this.channels.findIndex(function(m){return!m}),this.channels[d.index]=d)}return i}},{key:"getModuleParameters",value:function(){return{maskMap:this.masks?this.maskMap:this.dummyMaskMap,maskChannels:this.masks}}},{key:"cleanup",value:function(){this.dummyMaskMap&&(this.dummyMaskMap.delete(),this.dummyMaskMap=void 0),this.maskPass&&(this.maskPass.delete(),this.maskPass=void 0,this.maskMap=void 0),this.lastViewport=void 0,this.masks=null,this.channels.length=0}}]),e}();function zs(e,r){var t=typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=Vs(e))||r&&e&&typeof e.length=="number"){t&&(e=t);var n=0,i=function(){};return{s:i,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(l){throw l},f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
|
|
1249
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,o=!1,s;return{s:function(){t=t.call(e)},n:function(){var l=t.next();return a=l.done,l},e:function(l){o=!0,s=l},f:function(){try{!a&&t.return!=null&&t.return()}finally{if(o)throw s}}}}function Vs(e,r){if(e){if(typeof e=="string")return Gi(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if(t==="Object"&&e.constructor&&(t=e.constructor.name),t==="Map"||t==="Set")return Array.from(e);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return Gi(e,r)}}function Gi(e,r){(r==null||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}var mt=2,Ki=function(){function e(){(0,Hi.default)(this,e),(0,D.default)(this,"id","collide-effect"),(0,D.default)(this,"props",null),(0,D.default)(this,"useInPicking",!0),(0,D.default)(this,"order",1),(0,D.default)(this,"channels",{}),(0,D.default)(this,"collidePass",void 0),(0,D.default)(this,"collideFBOs",{}),(0,D.default)(this,"dummyCollideMap",void 0),(0,D.default)(this,"lastViewport",void 0)}return(0,Zi.default)(e,[{key:"preRender",value:function(t,n){var i,a=n.effects,o=n.layers,s=n.layerFilter,f=n.viewports,l=n.onViewportActive,c=n.views,p=n.isPicking,v=n.preRenderStats,d=v===void 0?{}:v;if(this.dummyCollideMap||(this.dummyCollideMap=new se.Texture2D(t,{width:1,height:1})),!p){var m=o.filter(function(S){var B=S.props,N=B.visible,z=B.collideEnabled;return N&&z});if(m.length===0){this.channels={};return}this.collidePass||(this.collidePass=new yi(t,{id:"default-collide"}));var h=a?.filter(function(S){return S.constructor===dr}),_=(i=d["mask-effect"])===null||i===void 0?void 0:i.didRender,g=this._groupByCollideGroup(t,m),M=f[0],y=!this.lastViewport||!this.lastViewport.equals(M)||_;for(var x in g){var P=this.collideFBOs[x],b=g[x];P.resize({width:t.canvas.width/mt,height:t.canvas.height/mt}),this._render(b,{effects:h,layerFilter:s,onViewportActive:l,views:c,viewport:M,viewportChanged:y})}}}},{key:"_render",value:function(t,n){var i=n.effects,a=n.layerFilter,o=n.onViewportActive,s=n.views,f=n.viewport,l=n.viewportChanged,c=t.collideGroup,p=this.channels[c];if(p){var v=l||t===p||!(0,$i._deepEqual)(p.layers,t.layers,0)||t.layerBounds.some(function(m,h){return!de(m,p.layerBounds[h])});if(this.channels[c]=t,v){this.lastViewport=f;var d=this.collideFBOs[c];this.collidePass.renderCollideMap(d,{pass:"collide",isPicking:!0,layers:t.layers,effects:i,layerFilter:a,viewports:f?[f]:[],onViewportActive:o,views:s,moduleParameters:{dummyCollideMap:this.dummyCollideMap,devicePixelRatio:(0,se.cssToDeviceRatio)(d.gl)/mt}})}}}},{key:"_groupByCollideGroup",value:function(t,n){var i={},a=zs(n),o;try{for(a.s();!(o=a.n()).done;){var s=o.value,f=s.props.collideGroup,l=i[f];l||(l={collideGroup:f,layers:[],layerBounds:[]},i[f]=l),l.layers.push(s),l.layerBounds.push(s.getBounds())}}catch(_){a.e(_)}finally{a.f()}for(var c=0,p=Object.keys(i);c<p.length;c++){var v=p[c];this.collideFBOs[v]||this.createFBO(t,v),this.channels[v]||(this.channels[v]=i[v])}for(var d=0,m=Object.keys(this.collideFBOs);d<m.length;d++){var h=m[d];i[h]||this.destroyFBO(h)}return i}},{key:"getModuleParameters",value:function(t){var n=t.props.collideGroup,i=this.collideFBOs,a=this.dummyCollideMap;return{collideFBO:i[n],dummyCollideMap:a}}},{key:"cleanup",value:function(){this.dummyCollideMap&&(this.dummyCollideMap.delete(),this.dummyCollideMap=void 0),this.channels={};for(var t=0,n=Object.keys(this.collideFBOs);t<n.length;t++){var i=n[t];this.destroyFBO(i)}this.collideFBOs={},this.lastViewport=void 0}},{key:"createFBO",value:function(t,n){var i,a,o=t.canvas,s=o.width,f=o.height,l=new se.Texture2D(t,{width:s,height:f,parameters:(i={},(0,D.default)(i,10241,9728),(0,D.default)(i,10240,9728),(0,D.default)(i,10242,33071),(0,D.default)(i,10243,33071),i)}),c=new se.Renderbuffer(t,{format:33189,width:s,height:f});this.collideFBOs[n]=new se.Framebuffer(t,{id:"Collide-".concat(n),width:s,height:f,attachments:(a={},(0,D.default)(a,36064,l),(0,D.default)(a,36096,c),a)})}},{key:"destroyFBO",value:function(t){for(var n=this.collideFBOs[t],i=0,a=Object.values(n.attachments);i<a.length;i++){var o=a[i];o.delete()}n.delete(),delete this.collideFBOs[t]}}]),e}();function Us(e){var r=qs();return function(){var n=(0,ht.default)(e),i;if(r){var a=(0,ht.default)(this).constructor;i=Reflect.construct(n,arguments,a)}else i=n.apply(this,arguments);return(0,ea.default)(this,i)}}function qs(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}var Ws={getCollidePriority:{type:"accessor",value:0},collideEnabled:!0,collideGroup:{type:"string",value:"default"},collideTestProps:{}},mr=function(e){(0,Ji.default)(t,e);var r=Us(t);function t(){return(0,Xi.default)(this,t),r.apply(this,arguments)}return(0,Qi.default)(t,[{key:"getShaders",value:function(){return{modules:[li]}}},{key:"draw",value:function(i){var a=i.uniforms,o=i.context,s=i.moduleParameters,f=this.props.collideEnabled,l=s.collideFBO,c=s.drawToCollideMap,p=f&&Boolean(l);a.collide_enabled=p,c&&(this.props=this.clone(this.props.collideTestProps).props)}},{key:"initializeState",value:function(i,a){var o;if(this.getAttributeManager()!==null){(o=this.context.deck)===null||o===void 0||o._addDefaultEffect(new Ki);var s=this.getAttributeManager();s.add({collidePriorities:{size:1,accessor:"getCollidePriority",shaderAttributes:{collidePriorities:{divisor:0},instanceCollidePriorities:{divisor:1}}}})}}},{key:"getNeedsPickingBuffer",value:function(){return this.props.collideEnabled}}]),t}(ra.LayerExtension);(0,_t.default)(mr,"defaultProps",Ws);(0,_t.default)(mr,"extensionName","CollideExtension");var ia=u(I()),aa=u(F()),oa=u(q()),sa=u(W()),gt=u(V()),yt=u(A()),ue=u(T());var ta=u(T()),Ys=`
|
|
1250
1250
|
uniform vec4 mask_bounds;
|
|
1251
1251
|
uniform bool mask_maskByInstance;
|
|
1252
1252
|
vec2 mask_getCoords(vec4 position) {
|
|
@@ -1356,4 +1356,4 @@ if ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_US
|
|
|
1356
1356
|
`},getUniforms:function(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;if("dummyHeightMap"in r){var n=r.drawToTerrainHeightMap,i=r.heightMap,a=r.heightMapBounds,o=r.dummyHeightMap,s=r.terrainCover,f=r.useTerrainHeightMap,l=r.terrainSkipRender,c=t.project_uCommonOrigin,p=l?ie.SKIP:ie.NONE,v=o,d=null;if(n)p=ie.WRITE_HEIGHT_MAP,d=a;else if(f&&i)p=ie.USE_HEIGHT_MAP,v=i,d=a;else if(s){var m=r.pickingActive;v=m?s.getPickingFramebuffer():s.getRenderFramebuffer(),m&&(p=ie.SKIP),v?(p=p===ie.SKIP?ie.USE_COVER_ONLY:ie.USE_COVER,d=s.bounds):v=o}return{terrain_mode:p,terrain_map:v,terrain_bounds:d?[d[0]-c[0],d[1]-c[1],d[2]-d[0],d[3]-d[1]]:[0,0,0,0]}}return null}};var ma=u(I()),ha=u(F()),Q=u(A());var pe=u(A()),be=u(Y());function ca(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),t.push.apply(t,n)}return t}function ua(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?ca(Object(t),!0).forEach(function(n){(0,pe.default)(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ca(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function Ne(e,r){var t;return new be.Framebuffer(e,{id:r.id,attachments:(0,pe.default)({},36064,new be.Texture2D(e,ua(ua({},r.float&&{format:(0,be.isWebGL2)(e)?34836:6408,type:5126}),{},{mipmaps:!1,parameters:(t={},(0,pe.default)(t,10241,9729),(0,pe.default)(t,10240,9729),(0,pe.default)(t,10242,33071),(0,pe.default)(t,10243,33071),t)})))})}var va=u(Dr()),gr=u(T());function Qs(e,r){var t=typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=Js(e))||r&&e&&typeof e.length=="number"){t&&(e=t);var n=0,i=function(){};return{s:i,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(l){throw l},f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
|
|
1357
1357
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,o=!1,s;return{s:function(){t=t.call(e)},n:function(){var l=t.next();return a=l.done,l},e:function(l){o=!0,s=l},f:function(){try{!a&&t.return!=null&&t.return()}finally{if(o)throw s}}}}function Js(e,r){if(e){if(typeof e=="string")return pa(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if(t==="Object"&&e.constructor&&(t=e.constructor.name),t==="Map"||t==="Set")return Array.from(e);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return pa(e,r)}}function pa(e,r){(r==null||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}function yr(e,r){var t=[1/0,1/0,-1/0,-1/0],n=Qs(e),i;try{for(n.s();!(i=n.n()).done;){var a=i.value,o=a.getBounds();if(o){var s=a.projectPosition(o[0],{viewport:r,autoOffset:!1}),f=a.projectPosition(o[1],{viewport:r,autoOffset:!1});t[0]=Math.min(t[0],s[0]),t[1]=Math.min(t[1],s[1]),t[2]=Math.max(t[2],f[0]),t[3]=Math.max(t[3],f[1])}}}catch(l){n.e(l)}finally{n.f()}return Number.isFinite(t[0])?t:null}var ef=2048;function xr(e){var r=e.bounds,t=e.viewport,n=e.border,i=n===void 0?0:n,a=t.isGeospatial;if(r[2]<=r[0]||r[3]<=r[1])return null;var o=t.unprojectPosition([(r[0]+r[2])/2,(r[1]+r[3])/2,0]),s=ef-i*2,f=e.width,l=e.height,c=e.zoom;if(c===void 0){var p=Math.min(f/(r[2]-r[0]),l/(r[3]-r[1]));c=Math.min(Math.log2(p),20)}else if(!f||!l){var v=Math.pow(2,c);if(f=Math.round(Math.abs(r[2]-r[0])*v),l=Math.round(Math.abs(r[3]-r[1])*v),f>s||l>s){var d=s/Math.max(f,l);f=Math.round(f*d),l=Math.round(l*d),c+=Math.log2(d)}}return a?new gr.WebMercatorViewport({x:i,y:i,width:f,height:l,longitude:o[0],latitude:o[1],zoom:c,orthographic:!0}):new gr.OrthographicViewport({x:i,y:i,width:f,height:l,target:o,zoom:c,flipY:!1})}function rf(e,r){var t;if(r&&r.length===2){var n=(0,va.default)(r,2),i=n[0],a=n[1],o=e.getBounds({z:i}),s=e.getBounds({z:a});t=[Math.min(o[0],s[0]),Math.min(o[1],s[1]),Math.max(o[2],s[2]),Math.max(o[3],s[3])]}else t=e.getBounds();var f=e.projectPosition(t.slice(0,2)),l=e.projectPosition(t.slice(2,4));return[f[0],f[1],l[0],l[1]]}function Mr(e,r,t){if(!e)return[0,0,1,1];var n=rf(r,t),i=tf(n);return e[2]-e[0]<=i[2]-i[0]&&e[3]-e[1]<=i[3]-i[1]?e:[Math.max(e[0],i[0]),Math.max(e[1],i[1]),Math.min(e[2],i[2]),Math.min(e[3],i[3])]}function tf(e){var r=e[2]-e[0],t=e[3]-e[1],n=(e[0]+e[2])/2,i=(e[1]+e[3])/2;return[n-r,i-t,n+r,i+t]}function nf(e,r){var t=typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=af(e))||r&&e&&typeof e.length=="number"){t&&(e=t);var n=0,i=function(){};return{s:i,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(l){throw l},f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
|
|
1358
1358
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,o=!1,s;return{s:function(){t=t.call(e)},n:function(){var l=t.next();return a=l.done,l},e:function(l){o=!0,s=l},f:function(){try{!a&&t.return!=null&&t.return()}finally{if(o)throw s}}}}function af(e,r){if(e){if(typeof e=="string")return da(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if(t==="Object"&&e.constructor&&(t=e.constructor.name),t==="Map"||t==="Set")return Array.from(e);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return da(e,r)}}function da(e,r){(r==null||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}var _a=function(){function e(r){(0,ma.default)(this,e),(0,Q.default)(this,"isDirty",!0),(0,Q.default)(this,"targetLayer",void 0),(0,Q.default)(this,"renderViewport",null),(0,Q.default)(this,"bounds",null),(0,Q.default)(this,"fbo",void 0),(0,Q.default)(this,"pickingFbo",void 0),(0,Q.default)(this,"layers",[]),(0,Q.default)(this,"tile",void 0),(0,Q.default)(this,"targetBounds",null),(0,Q.default)(this,"targetBoundsCommon",null),this.targetLayer=r,this.tile=ga(r)}return(0,ha.default)(e,[{key:"id",get:function(){return this.targetLayer.id}},{key:"isActive",get:function(){return Boolean(this.targetLayer.getCurrentLayer())}},{key:"shouldUpdate",value:function(t){var n=t.targetLayer,i=t.viewport,a=t.layers,o=t.layerNeedsRedraw;n&&(this.targetLayer=n);var s=i?this._updateViewport(i):!1,f=a?this._updateLayers(a):!1;if(o){var l=nf(this.layers),c;try{for(l.s();!(c=l.n()).done;){var p=c.value;if(o[p]){f=!0;break}}}catch(v){l.e(v)}finally{l.f()}}return f||s}},{key:"_updateLayers",value:function(t){var n=!1;if(t=this.tile?of(this.tile,t):t,t.length!==this.layers.length)n=!0;else for(var i=0;i<t.length;i++){var a=t[i].id;if(a!==this.layers[i]){n=!0;break}}return n&&(this.layers=t.map(function(o){return o.id})),n}},{key:"_updateViewport",value:function(t){var n=this.targetLayer,i=!1;if(this.targetBounds!==n.getBounds()&&(i=!0,this.targetBounds=n.getBounds(),this.targetBoundsCommon=yr([n],t)),!this.targetBoundsCommon)return!1;var a=Math.ceil(t.zoom+.5);if(this.tile)this.bounds=this.targetBoundsCommon;else{var o,s=(o=this.renderViewport)===null||o===void 0?void 0:o.zoom;i=i||a!==s;var f=Mr(this.targetBoundsCommon,t),l=this.bounds;i=i||!l||f.some(function(c,p){return c!==l[p]}),this.bounds=f}return i&&(this.renderViewport=xr({bounds:this.bounds,zoom:a,viewport:t})),i}},{key:"getRenderFramebuffer",value:function(){return!this.renderViewport||this.layers.length===0?null:(this.fbo||(this.fbo=Ne(this.targetLayer.context.gl,{id:this.id})),this.fbo)}},{key:"getPickingFramebuffer",value:function(){return!this.renderViewport||this.layers.length===0&&!this.targetLayer.props.pickable?null:(this.pickingFbo||(this.pickingFbo=Ne(this.targetLayer.context.gl,{id:"".concat(this.id,"-picking")})),this.pickingFbo)}},{key:"filterLayers",value:function(t){var n=this;return t.filter(function(i){var a=i.id;return n.layers.includes(a)})}},{key:"delete",value:function(){var t=this.fbo,n=this.pickingFbo;t&&(t.texture.delete(),t.delete()),n&&(n.texture.delete(),n.delete())}}]),e}();function of(e,r){return r.filter(function(t){var n=ga(t);return n?sf(e.bbox,n.bbox):!0})}function ga(e){for(;e;){var r=e.props.tile;if(r)return r;e=e.parent}return null}function sf(e,r){return"west"in e&&"west"in r?e.west<r.east&&r.west<e.east&&e.south<r.north&&r.south<e.north:"left"in e&&"left"in r?e.left<r.right&&r.left<e.right&&e.top<r.bottom&&r.top<e.bottom:!1}var xa=u(A()),Ma=u(I()),Pa=u(F()),ba=u(q()),Oa=u(W()),xt=u(V()),Mt=u(Y()),Ea=u(T());function ya(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),t.push.apply(t,n)}return t}function Pr(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?ya(Object(t),!0).forEach(function(n){(0,xa.default)(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ya(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function ff(e){var r=lf();return function(){var n=(0,xt.default)(e),i;if(r){var a=(0,xt.default)(this).constructor;i=Reflect.construct(n,arguments,a)}else i=n.apply(this,arguments);return(0,Oa.default)(this,i)}}function lf(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}var Ta=function(e){(0,ba.default)(t,e);var r=ff(t);function t(){return(0,Ma.default)(this,t),r.apply(this,arguments)}return(0,Pa.default)(t,[{key:"getRenderableLayers",value:function(i,a){for(var o=a.layers,s=[],f=this._getDrawLayerParams(i,a,!0),l=0;l<o.length;l++){var c=o[l];!c.isComposite&&f[l].shouldDrawLayer&&s.push(c)}return s}},{key:"renderHeightMap",value:function(i,a){var o=this,s=i.getRenderFramebuffer(),f=i.renderViewport;!s||!f||(s.resize(f),(0,Mt.withParameters)(this.gl,{clearColor:[0,0,0,0],blend:!0,blendFunc:[1,1],blendEquation:32776,depthTest:!1},function(){return o.render(Pr(Pr({},a),{},{target:s,pass:"terrain-height-map",layers:a.layers,viewports:[f],effects:[]}))}))}},{key:"renderTerrainCover",value:function(i,a){var o=this,s=i.getRenderFramebuffer(),f=i.renderViewport;if(!(!s||!f)){var l=i.filterLayers(a.layers);s.resize(f),(0,Mt.withParameters)(this.gl,{depthTest:!1},function(){return o.render(Pr(Pr({},a),{},{target:s,pass:"terrain-cover-".concat(i.id),layers:l,effects:[],viewports:[f]}))})}}}]),t}(Ea._LayersPass);var Sa=u(I()),Ra=u(F()),Ia=u(qe()),Fa=u(Jr()),La=u(q()),Ca=u(W()),br=u(V()),Pt=u(A()),ka=u(T()),Na=u(Y());function wa(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),t.push.apply(t,n)}return t}function Aa(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?wa(Object(t),!0).forEach(function(n){(0,Pt.default)(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):wa(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function cf(e){var r=uf();return function(){var n=(0,br.default)(e),i;if(r){var a=(0,br.default)(this).constructor;i=Reflect.construct(n,arguments,a)}else i=n.apply(this,arguments);return(0,Ca.default)(this,i)}}function uf(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}var ja=function(e){(0,La.default)(t,e);var r=cf(t);function t(){var n;(0,Sa.default)(this,t);for(var i=arguments.length,a=new Array(i),o=0;o<i;o++)a[o]=arguments[o];return n=r.call.apply(r,[this].concat(a)),(0,Pt.default)((0,Ia.default)(n),"drawParameters",{}),n}return(0,Ra.default)(t,[{key:"getRenderableLayers",value:function(i,a){var o=a.layers,s=[];this.drawParameters={},this._resetColorEncoder(a.pickZ);for(var f=this._getDrawLayerParams(i,a),l=0;l<o.length;l++){var c=o[l];!c.isComposite&&f[l].shouldDrawLayer&&(s.push(c),this.drawParameters[c.id]=f[l].layerParameters)}return s}},{key:"renderTerrainCover",value:function(i,a){var o=this,s=i.getPickingFramebuffer(),f=i.renderViewport;if(!(!s||!f)){var l=i.filterLayers(a.layers),c=i.targetLayer;c.props.pickable&&l.unshift(c),s.resize(f),(0,Na.withParameters)(this.gl,{depthTest:!1},function(){return o.render(Aa(Aa({},a),{},{pickingFBO:s,pass:"terrain-cover-picking-".concat(i.id),layers:l,effects:[],viewports:[f],cullRect:void 0,deviceRect:f,pickZ:!1}))})}}},{key:"getLayerParameters",value:function(i,a,o){if(this.drawParameters[i.id])return this.drawParameters[i.id];var s=(0,Fa.default)((0,br.default)(t.prototype),"getLayerParameters",this).call(this,i,a,o);return s.blend=!0,s}}]),t}(ka._PickLayersPass);var Ba=u(I()),za=u(F()),fe=u(A()),Va=u(Y());var Da=2048,bt=function(){function e(r){(0,Ba.default)(this,e),(0,fe.default)(this,"renderViewport",null),(0,fe.default)(this,"bounds",null),(0,fe.default)(this,"fbo",void 0),(0,fe.default)(this,"gl",void 0),(0,fe.default)(this,"layers",[]),(0,fe.default)(this,"layersBounds",[]),(0,fe.default)(this,"layersBoundsCommon",null),(0,fe.default)(this,"lastViewport",null),this.gl=r}return(0,za.default)(e,[{key:"getRenderFramebuffer",value:function(){return this.renderViewport?(this.fbo||(this.fbo=Ne(this.gl,{id:"height-map",float:!0})),this.fbo):null}},{key:"shouldUpdate",value:function(t){var n=this,i=t.layers,a=t.viewport,o=i.length!==this.layers.length||i.some(function(v,d){return v!==n.layers[d]||v.props.transitions||v.getBounds()!==n.layersBounds[d]});o&&(this.layers=i,this.layersBounds=i.map(function(v){return v.getBounds()}),this.layersBoundsCommon=yr(i,a));var s=!this.lastViewport||!a.equals(this.lastViewport);if(!this.layersBoundsCommon)this.renderViewport=null;else if(o||s){var f=Mr(this.layersBoundsCommon,a);this.bounds=f,this.lastViewport=a;var l=a.scale,c=(f[2]-f[0])*l,p=(f[3]-f[1])*l;return this.renderViewport=c>0||p>0?xr({bounds:[a.center[0]-1,a.center[1]-1,a.center[0]+1,a.center[1]+1],zoom:a.zoom,width:Math.min(c,Da),height:Math.min(p,Da),viewport:a}):null,!0}return!1}},{key:"delete",value:function(){this.fbo&&(this.fbo.color.delete(),this.fbo.delete())}}],[{key:"isSupported",value:function(t){return Va.Framebuffer.isSupported(t,{colorBufferFloat:!0})}}]),e}();function Ua(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),t.push.apply(t,n)}return t}function Or(e){for(var r=1;r<arguments.length;r++){var t=arguments[r]!=null?arguments[r]:{};r%2?Ua(Object(t),!0).forEach(function(n){(0,G.default)(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):Ua(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function Oe(e,r){var t=typeof Symbol<"u"&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=pf(e))||r&&e&&typeof e.length=="number"){t&&(e=t);var n=0,i=function(){};return{s:i,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(l){throw l},f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
|
|
1359
|
-
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,o=!1,s;return{s:function(){t=t.call(e)},n:function(){var l=t.next();return a=l.done,l},e:function(l){o=!0,s=l},f:function(){try{!a&&t.return!=null&&t.return()}finally{if(o)throw s}}}}function pf(e,r){if(e){if(typeof e=="string")return qa(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if(t==="Object"&&e.constructor&&(t=e.constructor.name),t==="Map"||t==="Set")return Array.from(e);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return qa(e,r)}}function qa(e,r){(r==null||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}var Za=function(){function e(){(0,Ya.default)(this,e),(0,G.default)(this,"id","terrain-effect"),(0,G.default)(this,"props",null),(0,G.default)(this,"useInPicking",!0),(0,G.default)(this,"isPicking",!1),(0,G.default)(this,"isDrapingEnabled",!1),(0,G.default)(this,"dummyHeightMap",void 0),(0,G.default)(this,"heightMap",void 0),(0,G.default)(this,"terrainPass",void 0),(0,G.default)(this,"terrainPickingPass",void 0),(0,G.default)(this,"terrainCovers",new Map)}return(0,Ga.default)(e,[{key:"initialize",value:function(t){this.dummyHeightMap=new Er.Texture2D(t,{width:1,height:1,data:new Uint8Array([0,0,0,0])}),this.terrainPass=new Ta(t,{id:"terrain"}),this.terrainPickingPass=new ja(t,{id:"terrain-picking"}),bt.isSupported(t)?this.heightMap=new bt(t):Ha.log.warn("Terrain offset mode is not supported by this browser")(),Er.ProgramManager.getDefaultProgramManager(t).addDefaultModule(_r)}},{key:"preRender",value:function(t,n){if(!this.dummyHeightMap){this.initialize(t);var i=Oe(n.layers),a;try{for(i.s();!(a=i.n()).done;){var o=a.value;o.props.operation.includes("terrain")&&o.setChangeFlags({extensionsChanged:!0})}}catch(h){i.e(h)}finally{i.f()}}if(n.pickZ){this.isDrapingEnabled=!1;return}var s=n.viewports,f=n.
|
|
1359
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,o=!1,s;return{s:function(){t=t.call(e)},n:function(){var l=t.next();return a=l.done,l},e:function(l){o=!0,s=l},f:function(){try{!a&&t.return!=null&&t.return()}finally{if(o)throw s}}}}function pf(e,r){if(e){if(typeof e=="string")return qa(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);if(t==="Object"&&e.constructor&&(t=e.constructor.name),t==="Map"||t==="Set")return Array.from(e);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return qa(e,r)}}function qa(e,r){(r==null||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}var Za=function(){function e(){(0,Ya.default)(this,e),(0,G.default)(this,"id","terrain-effect"),(0,G.default)(this,"props",null),(0,G.default)(this,"useInPicking",!0),(0,G.default)(this,"isPicking",!1),(0,G.default)(this,"isDrapingEnabled",!1),(0,G.default)(this,"dummyHeightMap",void 0),(0,G.default)(this,"heightMap",void 0),(0,G.default)(this,"terrainPass",void 0),(0,G.default)(this,"terrainPickingPass",void 0),(0,G.default)(this,"terrainCovers",new Map)}return(0,Ga.default)(e,[{key:"initialize",value:function(t){this.dummyHeightMap=new Er.Texture2D(t,{width:1,height:1,data:new Uint8Array([0,0,0,0])}),this.terrainPass=new Ta(t,{id:"terrain"}),this.terrainPickingPass=new ja(t,{id:"terrain-picking"}),bt.isSupported(t)?this.heightMap=new bt(t):Ha.log.warn("Terrain offset mode is not supported by this browser")(),Er.ProgramManager.getDefaultProgramManager(t).addDefaultModule(_r)}},{key:"preRender",value:function(t,n){if(!this.dummyHeightMap){this.initialize(t);var i=Oe(n.layers),a;try{for(i.s();!(a=i.n()).done;){var o=a.value;o.props.operation.includes("terrain")&&o.setChangeFlags({extensionsChanged:!0})}}catch(h){i.e(h)}finally{i.f()}}if(n.pickZ){this.isDrapingEnabled=!1;return}var s=n.viewports,f=n.isPicking,l=f===void 0?!1:f;this.isPicking=l,this.isDrapingEnabled=!0;var c=s[0],p=(l?this.terrainPickingPass:this.terrainPass).getRenderableLayers(c,n),v=p.filter(function(h){return h.props.operation.includes("terrain")});if(v.length!==0){if(!l){var d=p.filter(function(h){return h.state.terrainFittingMode==="offset"});d.length>0&&this._updateHeightMap(v,c,n)}var m=p.filter(function(h){return h.state.terrainFittingMode==="drape"});this._updateTerrainCovers(v,m,c,n)}}},{key:"getModuleParameters",value:function(t){var n,i,a=t.state.terrainFittingMode;return{heightMap:(n=this.heightMap)===null||n===void 0?void 0:n.getRenderFramebuffer(),heightMapBounds:(i=this.heightMap)===null||i===void 0?void 0:i.bounds,dummyHeightMap:this.dummyHeightMap,terrainCover:this.isDrapingEnabled?this.terrainCovers.get(t.id):null,useTerrainHeightMap:a==="offset",terrainSkipRender:a==="drape"||!t.props.operation.includes("draw")}}},{key:"cleanup",value:function(){this.dummyHeightMap&&(this.dummyHeightMap.delete(),this.dummyHeightMap=void 0),this.heightMap&&(this.heightMap.delete(),this.heightMap=void 0);var t=Oe(this.terrainCovers.values()),n;try{for(t.s();!(n=t.n()).done;){var i=n.value;i.delete()}}catch(a){t.e(a)}finally{t.f()}this.terrainCovers.clear()}},{key:"_updateHeightMap",value:function(t,n,i){if(this.heightMap){var a=this.heightMap.shouldUpdate({layers:t,viewport:n});a&&this.terrainPass.renderHeightMap(this.heightMap,Or(Or({},i),{},{layers:t,moduleParameters:{heightMapBounds:this.heightMap.bounds,dummyHeightMap:this.dummyHeightMap,devicePixelRatio:1,drawToTerrainHeightMap:!0}}))}}},{key:"_updateTerrainCovers",value:function(t,n,i,a){var o={},s=Oe(n),f;try{for(s.s();!(f=s.n()).done;){var l=f.value;l.state.terrainCoverNeedsRedraw&&(o[l.id]=!0,l.state.terrainCoverNeedsRedraw=!1)}}catch(_){s.e(_)}finally{s.f()}var c=Oe(this.terrainCovers.values()),p;try{for(c.s();!(p=c.n()).done;){var v=p.value;v.isDirty=v.isDirty||v.shouldUpdate({layerNeedsRedraw:o})}}catch(_){c.e(_)}finally{c.f()}var d=Oe(t),m;try{for(d.s();!(m=d.n()).done;){var h=m.value;this._updateTerrainCover(h,n,i,a)}}catch(_){d.e(_)}finally{d.f()}this.isPicking||this._pruneTerrainCovers()}},{key:"_updateTerrainCover",value:function(t,n,i,a){var o=this.isPicking?this.terrainPickingPass:this.terrainPass,s=this.terrainCovers.get(t.id);s||(s=new _a(t),this.terrainCovers.set(t.id,s));try{var f=s.shouldUpdate({targetLayer:t,viewport:i,layers:n});(this.isPicking||s.isDirty||f)&&(o.renderTerrainCover(s,Or(Or({},a),{},{layers:n,moduleParameters:{dummyHeightMap:this.dummyHeightMap,terrainSkipRender:!1,devicePixelRatio:1}})),s.isDirty=!1)}catch(l){t.raiseError(l,"Error rendering terrain cover ".concat(s.id))}}},{key:"_pruneTerrainCovers",value:function(){var t=[],n=Oe(this.terrainCovers),i;try{for(n.s();!(i=n.n()).done;){var a=(0,Wa.default)(i.value,2),o=a[0],s=a[1];s.isActive||t.push(o)}}catch(p){n.e(p)}finally{n.f()}for(var f=0,l=t;f<l.length;f++){var c=l[f];this.terrainCovers.delete(c)}}}]),e}();function vf(e){var r=df();return function(){var n=(0,Ot.default)(e),i;if(r){var a=(0,Ot.default)(this).constructor;i=Reflect.construct(n,arguments,a)}else i=n.apply(this,arguments);return(0,Qa.default)(this,i)}}function df(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}var mf={terrainFittingMode:void 0},Tr=function(e){(0,Xa.default)(t,e);var r=vf(t);function t(){return(0,$a.default)(this,t),r.apply(this,arguments)}return(0,Ka.default)(t,[{key:"getShaders",value:function(){return{modules:[_r]}}},{key:"initializeState",value:function(){var i;(i=this.context.deck)===null||i===void 0||i._addDefaultEffect(new Za)}},{key:"updateState",value:function(i){var a=i.props,o=i.oldProps;if(!(this.state.terrainFittingMode&&a.terrainFittingMode===o.terrainFittingMode&&a.extruded===o.extruded)){var s=a.terrainFittingMode;if(!s){var f,l=this.props.extruded,c=(f=this.getAttributeManager())===null||f===void 0?void 0:f.attributes,p=c&&"instancePositions"in c;s=l||p?"offset":"drape"}this.setState({terrainFittingMode:s})}}},{key:"onNeedsRedraw",value:function(){var i=this.state;i.terrainFittingMode==="drape"&&(i.terrainCoverNeedsRedraw=!0)}}]),t}(Ja.LayerExtension);(0,Et.default)(Tr,"defaultProps",mf);(0,Et.default)(Tr,"extensionName","TerrainExtension");return uo(je);})();
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@deck.gl/extensions",
|
|
3
3
|
"description": "Plug-and-play functionalities for deck.gl layers",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "8.9.0-beta.
|
|
5
|
+
"version": "8.9.0-beta.2",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"@math.gl/web-mercator": "^3.6.2",
|
|
41
41
|
"gl-matrix": "^3.0.0"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "5dae086e4f3eb46c30d8e761f9d600be4f68e949"
|
|
44
44
|
}
|
package/src/clip/clip.ts
CHANGED
|
@@ -97,7 +97,7 @@ varying vec2 clip_commonPosition;
|
|
|
97
97
|
|
|
98
98
|
/** Adds support for clipping rendered layers by rectangular bounds. */
|
|
99
99
|
export default class ClipExtension extends LayerExtension {
|
|
100
|
-
static defaultProps
|
|
100
|
+
static defaultProps = defaultProps;
|
|
101
101
|
static extensionName = 'ClipExtension';
|
|
102
102
|
|
|
103
103
|
getShaders(this: Layer<ClipExtensionProps>) {
|
|
@@ -42,7 +42,7 @@ export default class CollideEffect implements Effect {
|
|
|
42
42
|
viewports,
|
|
43
43
|
onViewportActive,
|
|
44
44
|
views,
|
|
45
|
-
|
|
45
|
+
isPicking,
|
|
46
46
|
preRenderStats = {}
|
|
47
47
|
}: PreRenderOptions
|
|
48
48
|
): void {
|
|
@@ -50,7 +50,7 @@ export default class CollideEffect implements Effect {
|
|
|
50
50
|
this.dummyCollideMap = new Texture2D(gl, {width: 1, height: 1});
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
if (
|
|
53
|
+
if (isPicking) {
|
|
54
54
|
// Do not update on picking pass
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
@@ -142,6 +142,7 @@ export default class CollideEffect implements Effect {
|
|
|
142
142
|
// Rerender collide FBO
|
|
143
143
|
this.collidePass!.renderCollideMap(collideFBO, {
|
|
144
144
|
pass: 'collide',
|
|
145
|
+
isPicking: true,
|
|
145
146
|
layers: renderInfo.layers,
|
|
146
147
|
effects,
|
|
147
148
|
layerFilter,
|
package/src/mask/mask-effect.ts
CHANGED
|
@@ -44,7 +44,7 @@ export default class MaskEffect implements Effect {
|
|
|
44
44
|
|
|
45
45
|
preRender(
|
|
46
46
|
gl: WebGLRenderingContext,
|
|
47
|
-
{layers, layerFilter, viewports, onViewportActive, views,
|
|
47
|
+
{layers, layerFilter, viewports, onViewportActive, views, isPicking}: PreRenderOptions
|
|
48
48
|
): MaskPreRenderStats {
|
|
49
49
|
let didRender = false;
|
|
50
50
|
if (!this.dummyMaskMap) {
|
|
@@ -54,7 +54,7 @@ export default class MaskEffect implements Effect {
|
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
if (
|
|
57
|
+
if (isPicking) {
|
|
58
58
|
// Do not update on picking pass
|
|
59
59
|
return {didRender};
|
|
60
60
|
}
|
|
@@ -65,8 +65,7 @@ export class TerrainEffect implements Effect {
|
|
|
65
65
|
return;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
const {viewports,
|
|
69
|
-
const isPicking = pass.startsWith('picking');
|
|
68
|
+
const {viewports, isPicking = false} = opts;
|
|
70
69
|
this.isPicking = isPicking;
|
|
71
70
|
this.isDrapingEnabled = true;
|
|
72
71
|
|
package/typed/clip/clip.d.ts
CHANGED
|
@@ -13,7 +13,10 @@ export declare type ClipExtensionProps = {
|
|
|
13
13
|
};
|
|
14
14
|
/** Adds support for clipping rendered layers by rectangular bounds. */
|
|
15
15
|
export default class ClipExtension extends LayerExtension {
|
|
16
|
-
static defaultProps:
|
|
16
|
+
static defaultProps: {
|
|
17
|
+
clipBounds: number[];
|
|
18
|
+
clipByInstance: undefined;
|
|
19
|
+
};
|
|
17
20
|
static extensionName: string;
|
|
18
21
|
getShaders(this: Layer<ClipExtensionProps>): {
|
|
19
22
|
modules: ShaderModule<any>[];
|
package/typed/clip/clip.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clip.d.ts","sourceRoot":"","sources":["../../src/clip/clip.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAC,cAAc,EAAE,aAAa,IAAI,YAAY,EAAC,MAAM,eAAe,CAAC;AAE5E,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,eAAe,CAAC;AAOzC,oBAAY,kBAAkB,GAAG;IAC/B;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AA0DF,uEAAuE;AACvE,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,cAAc;IACvD,MAAM,CAAC,YAAY
|
|
1
|
+
{"version":3,"file":"clip.d.ts","sourceRoot":"","sources":["../../src/clip/clip.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAC,cAAc,EAAE,aAAa,IAAI,YAAY,EAAC,MAAM,eAAe,CAAC;AAE5E,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,eAAe,CAAC;AAOzC,oBAAY,kBAAkB,GAAG;IAC/B;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AA0DF,uEAAuE;AACvE,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,cAAc;IACvD,MAAM,CAAC,YAAY;;;MAAgB;IACnC,MAAM,CAAC,aAAa,SAAmB;IAEvC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,kBAAkB,CAAC;;;;;;;;;IAyB1C,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,EAAE,EAAC,QAAQ,EAAC,EAAE,GAAG,GAAG,IAAI;CAgBvE"}
|
|
@@ -10,7 +10,7 @@ export default class CollideEffect implements Effect {
|
|
|
10
10
|
private collideFBOs;
|
|
11
11
|
private dummyCollideMap?;
|
|
12
12
|
private lastViewport?;
|
|
13
|
-
preRender(gl: WebGLRenderingContext, { effects: allEffects, layers, layerFilter, viewports, onViewportActive, views,
|
|
13
|
+
preRender(gl: WebGLRenderingContext, { effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats }: PreRenderOptions): void;
|
|
14
14
|
private _render;
|
|
15
15
|
/**
|
|
16
16
|
* Group layers by collideGroup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collide-effect.d.ts","sourceRoot":"","sources":["../../src/collide/collide-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAgB,SAAS,EAAmB,MAAM,eAAe,CAAC;AAGrF,OAAO,KAAK,EAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAW,MAAM,eAAe,CAAC;AAoB7E,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,MAAM;IAClD,EAAE,SAAoB;IACtB,KAAK,OAAQ;IACb,YAAY,UAAQ;IACpB,KAAK,SAAK;IAEV,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,eAAe,CAAC,CAAY;IACpC,OAAO,CAAC,YAAY,CAAC,CAAW;IAEhC,SAAS,CACP,EAAE,EAAE,qBAAqB,EACzB,EACE,OAAO,EAAE,UAAU,EACnB,MAAM,EACN,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,
|
|
1
|
+
{"version":3,"file":"collide-effect.d.ts","sourceRoot":"","sources":["../../src/collide/collide-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAgB,SAAS,EAAmB,MAAM,eAAe,CAAC;AAGrF,OAAO,KAAK,EAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAW,MAAM,eAAe,CAAC;AAoB7E,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,MAAM;IAClD,EAAE,SAAoB;IACtB,KAAK,OAAQ;IACb,YAAY,UAAQ;IACpB,KAAK,SAAK;IAEV,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,eAAe,CAAC,CAAY;IACpC,OAAO,CAAC,YAAY,CAAC,CAAW;IAEhC,SAAS,CACP,EAAE,EAAE,qBAAqB,EACzB,EACE,OAAO,EAAE,UAAU,EACnB,MAAM,EACN,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,SAAS,EACT,cAAmB,EACpB,EAAE,gBAAgB,GAClB,IAAI;IAuDP,OAAO,CAAC,OAAO;IA0Df;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAsC5B,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG;QACjC,UAAU,EAAE,WAAW,CAAC;QACxB,eAAe,EAAE,SAAS,CAAC;KAC5B;IAMD,OAAO,IAAI,IAAI;IAaf,SAAS,CAAC,EAAE,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM;IAyBzD,UAAU,CAAC,YAAY,EAAE,MAAM;CAQhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader-module.d.ts","sourceRoot":"","sources":["../../src/data-filter/shader-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,IAAI,YAAY,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"shader-module.d.ts","sourceRoot":"","sources":["../../src/data-filter/shader-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,IAAI,YAAY,EAAC,MAAM,eAAe,CAAC;AAE5D,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,eAAe,CAAC;AAmE5D,aAAK,wBAAwB,GAAG;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC;CACnB,GAAG,wBAAwB,CAAC;AAiG7B,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,wBAAwB,CAM/D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,wBAAwB,CAMjE,CAAC"}
|
|
@@ -22,7 +22,7 @@ export default class MaskEffect implements Effect {
|
|
|
22
22
|
private maskPass?;
|
|
23
23
|
private maskMap?;
|
|
24
24
|
private lastViewport?;
|
|
25
|
-
preRender(gl: WebGLRenderingContext, { layers, layerFilter, viewports, onViewportActive, views,
|
|
25
|
+
preRender(gl: WebGLRenderingContext, { layers, layerFilter, viewports, onViewportActive, views, isPicking }: PreRenderOptions): MaskPreRenderStats;
|
|
26
26
|
private _renderChannel;
|
|
27
27
|
/**
|
|
28
28
|
* Find a channel to render each mask into
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mask-effect.d.ts","sourceRoot":"","sources":["../../src/mask/mask-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAM,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAiC,UAAU,EAAC,MAAM,SAAS,CAAC;AAGnE,aAAK,IAAI,GAAG;IACV,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,CAAC;AAaF,oBAAY,kBAAkB,GAAG;IAC/B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,UAAW,YAAW,MAAM;IAC/C,EAAE,SAAiB;IACnB,KAAK,OAAQ;IACb,YAAY,UAAQ;IACpB,KAAK,SAAK;IAEV,OAAO,CAAC,YAAY,CAAC,CAAY;IACjC,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAY;IAC5B,OAAO,CAAC,YAAY,CAAC,CAAW;IAEhC,SAAS,CACP,EAAE,EAAE,qBAAqB,EACzB,EAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"mask-effect.d.ts","sourceRoot":"","sources":["../../src/mask/mask-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAM,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAiC,UAAU,EAAC,MAAM,SAAS,CAAC;AAGnE,aAAK,IAAI,GAAG;IACV,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,gBAAgB,EAAE,gBAAgB,CAAC;CACpC,CAAC;AAaF,oBAAY,kBAAkB,GAAG;IAC/B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,UAAW,YAAW,MAAM;IAC/C,EAAE,SAAiB;IACnB,KAAK,OAAQ;IACb,YAAY,UAAQ;IACpB,KAAK,SAAK;IAEV,OAAO,CAAC,YAAY,CAAC,CAAY;IACjC,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAY;IAC5B,OAAO,CAAC,YAAY,CAAC,CAAW;IAEhC,SAAS,CACP,EAAE,EAAE,qBAAqB,EACzB,EAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAC,EAAE,gBAAgB,GACrF,kBAAkB;IAgDrB,OAAO,CAAC,cAAc;IAkFtB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IA4CzB,mBAAmB,IAAI;QACrB,OAAO,EAAE,SAAS,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;KAC3C;IAOD,OAAO,IAAI,IAAI;CAgBhB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Framebuffer } from '@luma.gl/core';
|
|
2
|
-
import { Bounds } from '../
|
|
2
|
+
import { Bounds } from '../utils/projection-utils';
|
|
3
3
|
import type { Viewport, Layer } from '@deck.gl/core/typed';
|
|
4
4
|
export declare class HeightMap {
|
|
5
5
|
/** Viewport used to draw into the texture */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terrain-effect.d.ts","sourceRoot":"","sources":["../../src/terrain/terrain-effect.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,qBAAqB,EAAC,MAAM,iBAAiB,CAAC;AAMrE,OAAO,KAAK,EAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAW,MAAM,eAAe,CAAC;AAE7E,qCAAqC;AACrC,qBAAa,aAAc,YAAW,MAAM;IAC1C,EAAE,SAAoB;IACtB,KAAK,OAAQ;IACb,YAAY,UAAQ;IAEpB,0CAA0C;IAC1C,OAAO,CAAC,SAAS,CAAkB;IACnC,6CAA6C;IAC7C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,sCAAsC;IACtC,OAAO,CAAC,cAAc,CAAY;IAClC,wGAAwG;IACxG,OAAO,CAAC,SAAS,CAAC,CAAmB;IACrC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,kBAAkB,CAAsB;IAChD,wFAAwF;IACxF,OAAO,CAAC,aAAa,CAAwC;IAE7D,UAAU,CAAC,EAAE,EAAE,qBAAqB;IAkBpC,SAAS,CAAC,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"terrain-effect.d.ts","sourceRoot":"","sources":["../../src/terrain/terrain-effect.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,qBAAqB,EAAC,MAAM,iBAAiB,CAAC;AAMrE,OAAO,KAAK,EAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAW,MAAM,eAAe,CAAC;AAE7E,qCAAqC;AACrC,qBAAa,aAAc,YAAW,MAAM;IAC1C,EAAE,SAAoB;IACtB,KAAK,OAAQ;IACb,YAAY,UAAQ;IAEpB,0CAA0C;IAC1C,OAAO,CAAC,SAAS,CAAkB;IACnC,6CAA6C;IAC7C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,sCAAsC;IACtC,OAAO,CAAC,cAAc,CAAY;IAClC,wGAAwG;IACxG,OAAO,CAAC,SAAS,CAAC,CAAmB;IACrC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,kBAAkB,CAAsB;IAChD,wFAAwF;IACxF,OAAO,CAAC,aAAa,CAAwC;IAE7D,UAAU,CAAC,EAAE,EAAE,qBAAqB;IAkBpC,SAAS,CAAC,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IA8ClE,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,qBAAqB;IAaxD,OAAO,IAAI,IAAI;IAiBf,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,mBAAmB;CAY5B"}
|