@deck.gl/extensions 8.9.0-alpha.5 → 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 +3688 -14538
- package/dist/es5/brushing/brushing.js +0 -8
- package/dist/es5/brushing/brushing.js.map +1 -1
- package/dist/es5/clip/clip.js +5 -5
- package/dist/es5/clip/clip.js.map +1 -1
- package/dist/es5/collide/collide-effect.js +286 -0
- package/dist/es5/collide/collide-effect.js.map +1 -0
- package/dist/es5/collide/collide-pass.js +80 -0
- package/dist/es5/collide/collide-pass.js.map +1 -0
- package/dist/es5/collide/collide.js +116 -0
- package/dist/es5/collide/collide.js.map +1 -0
- package/dist/es5/collide/shader-module.js +39 -0
- package/dist/es5/collide/shader-module.js.map +1 -0
- package/dist/es5/common/projection-utils.js +164 -0
- package/dist/es5/common/projection-utils.js.map +1 -0
- package/dist/es5/data-filter/shader-module.js +1 -0
- package/dist/es5/data-filter/shader-module.js.map +1 -1
- package/dist/es5/fill-style/fill-style.js +16 -125
- package/dist/es5/fill-style/fill-style.js.map +1 -1
- package/dist/es5/fill-style/shaders.glsl.js +6 -8
- package/dist/es5/fill-style/shaders.glsl.js.map +1 -1
- package/dist/es5/fp64/project64.glsl.js +1 -1
- package/dist/es5/index.js +16 -0
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mask/mask-effect.js +280 -0
- package/dist/es5/mask/mask-effect.js.map +1 -0
- package/dist/es5/mask/mask-pass.js +106 -0
- package/dist/es5/mask/mask-pass.js.map +1 -0
- package/dist/es5/mask/mask.js +17 -4
- package/dist/es5/mask/mask.js.map +1 -1
- package/dist/es5/mask/shader-module.js +1 -1
- package/dist/es5/mask/shader-module.js.map +1 -1
- package/dist/es5/mask/utils.js +136 -0
- package/dist/es5/mask/utils.js.map +1 -0
- package/dist/es5/path-style/shaders.glsl.js +1 -1
- package/dist/es5/terrain/height-map-builder.js +116 -0
- package/dist/es5/terrain/height-map-builder.js.map +1 -0
- package/dist/es5/terrain/shader-module.js +84 -0
- package/dist/es5/terrain/shader-module.js.map +1 -0
- package/dist/es5/terrain/terrain-cover.js +259 -0
- package/dist/es5/terrain/terrain-cover.js.map +1 -0
- package/dist/es5/terrain/terrain-effect.js +337 -0
- package/dist/es5/terrain/terrain-effect.js.map +1 -0
- package/dist/es5/terrain/terrain-pass.js +122 -0
- package/dist/es5/terrain/terrain-pass.js.map +1 -0
- package/dist/es5/terrain/terrain-picking-pass.js +130 -0
- package/dist/es5/terrain/terrain-picking-pass.js.map +1 -0
- package/dist/es5/terrain/terrain.js +101 -0
- package/dist/es5/terrain/terrain.js.map +1 -0
- package/dist/es5/terrain/utils.js +32 -0
- package/dist/es5/terrain/utils.js.map +1 -0
- package/dist/es5/utils/debug.js +71 -0
- package/dist/es5/utils/debug.js.map +1 -0
- package/dist/esm/brushing/brushing.js +0 -7
- package/dist/esm/brushing/brushing.js.map +1 -1
- package/dist/esm/clip/clip.js +5 -4
- package/dist/esm/clip/clip.js.map +1 -1
- package/dist/esm/collide/collide-effect.js +251 -0
- package/dist/esm/collide/collide-effect.js.map +1 -0
- package/dist/esm/collide/collide-pass.js +30 -0
- package/dist/esm/collide/collide-pass.js.map +1 -0
- package/dist/esm/collide/collide.js +78 -0
- package/dist/esm/collide/collide.js.map +1 -0
- package/dist/esm/collide/shader-module.js +32 -0
- package/dist/esm/collide/shader-module.js.map +1 -0
- package/dist/esm/common/projection-utils.js +130 -0
- package/dist/esm/common/projection-utils.js.map +1 -0
- package/dist/esm/data-filter/shader-module.js +1 -0
- package/dist/esm/data-filter/shader-module.js.map +1 -1
- package/dist/esm/fill-style/fill-style.js +20 -72
- package/dist/esm/fill-style/fill-style.js.map +1 -1
- package/dist/esm/fill-style/shaders.glsl.js +5 -7
- package/dist/esm/fill-style/shaders.glsl.js.map +1 -1
- package/dist/esm/fp64/project64.glsl.js +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mask/mask-effect.js +233 -0
- package/dist/esm/mask/mask-effect.js.map +1 -0
- package/dist/esm/mask/mask-pass.js +62 -0
- package/dist/esm/mask/mask-pass.js.map +1 -0
- package/dist/esm/mask/mask.js +14 -3
- package/dist/esm/mask/mask.js.map +1 -1
- package/dist/esm/mask/shader-module.js +1 -1
- package/dist/esm/mask/shader-module.js.map +1 -1
- package/dist/esm/mask/utils.js +109 -0
- package/dist/esm/mask/utils.js.map +1 -0
- package/dist/esm/path-style/shaders.glsl.js +1 -1
- package/dist/esm/terrain/height-map-builder.js +92 -0
- package/dist/esm/terrain/height-map-builder.js.map +1 -0
- package/dist/esm/terrain/shader-module.js +73 -0
- package/dist/esm/terrain/shader-module.js.map +1 -0
- package/dist/esm/terrain/terrain-cover.js +219 -0
- package/dist/esm/terrain/terrain-cover.js.map +1 -0
- package/dist/esm/terrain/terrain-effect.js +230 -0
- package/dist/esm/terrain/terrain-effect.js.map +1 -0
- package/dist/esm/terrain/terrain-pass.js +69 -0
- package/dist/esm/terrain/terrain-pass.js.map +1 -0
- package/dist/esm/terrain/terrain-picking-pass.js +75 -0
- package/dist/esm/terrain/terrain-picking-pass.js.map +1 -0
- package/dist/esm/terrain/terrain.js +62 -0
- package/dist/esm/terrain/terrain.js.map +1 -0
- package/dist/esm/terrain/utils.js +21 -0
- package/dist/esm/terrain/utils.js.map +1 -0
- package/dist/esm/utils/debug.js +61 -0
- package/dist/esm/utils/debug.js.map +1 -0
- package/dist.min.js +1359 -1
- package/package.json +6 -4
- package/src/brushing/brushing.ts +0 -11
- package/src/clip/clip.ts +7 -6
- package/src/collide/collide-effect.ts +258 -0
- package/src/collide/collide-pass.ts +35 -0
- package/src/collide/collide.ts +79 -0
- package/src/collide/shader-module.ts +113 -0
- package/src/common/projection-utils.ts +187 -0
- package/src/data-filter/shader-module.ts +7 -1
- package/src/fill-style/fill-style.ts +15 -53
- package/src/fill-style/shaders.glsl.ts +6 -7
- package/src/index.ts +4 -0
- package/src/mask/mask-effect.ts +255 -0
- package/src/mask/mask-pass.ts +67 -0
- package/src/mask/mask.ts +17 -7
- package/src/mask/shader-module.ts +7 -1
- package/src/mask/utils.ts +148 -0
- package/src/terrain/height-map-builder.ts +120 -0
- package/src/terrain/shader-module.ts +161 -0
- package/src/terrain/terrain-cover.ts +225 -0
- package/src/terrain/terrain-effect.ts +222 -0
- package/src/terrain/terrain-pass.ts +86 -0
- package/src/terrain/terrain-picking-pass.ts +87 -0
- package/src/terrain/terrain.ts +74 -0
- package/src/terrain/utils.ts +29 -0
- package/src/utils/debug.ts +59 -0
- package/typed/brushing/brushing.d.ts +0 -1
- package/typed/brushing/brushing.d.ts.map +1 -1
- package/typed/brushing/brushing.js +83 -0
- package/typed/brushing/shader-module.js +116 -0
- package/typed/clip/clip.d.ts +5 -2
- package/typed/clip/clip.d.ts.map +1 -1
- package/typed/clip/clip.js +114 -0
- package/typed/collide/collide-effect.d.ts +28 -0
- package/typed/collide/collide-effect.d.ts.map +1 -0
- package/typed/collide/collide-pass.d.ts +14 -0
- package/typed/collide/collide-pass.d.ts.map +1 -0
- package/typed/collide/collide.d.ts +41 -0
- package/typed/collide/collide.d.ts.map +1 -0
- package/typed/collide/shader-module.d.ts +4 -0
- package/typed/collide/shader-module.d.ts.map +1 -0
- package/typed/common/projection-utils.d.ts +27 -0
- package/typed/common/projection-utils.d.ts.map +1 -0
- package/typed/data-filter/aggregator.js +98 -0
- package/typed/data-filter/data-filter.js +159 -0
- package/typed/data-filter/shader-module.d.ts.map +1 -1
- package/typed/data-filter/shader-module.js +152 -0
- package/typed/fill-style/fill-style.d.ts +14 -5
- package/typed/fill-style/fill-style.d.ts.map +1 -1
- package/typed/fill-style/fill-style.js +152 -0
- package/typed/fill-style/shaders.glsl.d.ts.map +1 -1
- package/typed/fill-style/shaders.glsl.js +95 -0
- package/typed/fp64/fp64.js +34 -0
- package/typed/fp64/project64.glsl.js +100 -0
- package/typed/fp64/project64.js +50 -0
- package/typed/index.d.ts +4 -0
- package/typed/index.d.ts.map +1 -1
- package/typed/index.js +9 -0
- package/typed/mask/mask-effect.d.ts +42 -0
- package/typed/mask/mask-effect.d.ts.map +1 -0
- package/typed/mask/mask-pass.d.ts +19 -0
- package/typed/mask/mask-pass.d.ts.map +1 -0
- package/typed/mask/mask.d.ts +9 -3
- package/typed/mask/mask.d.ts.map +1 -1
- package/typed/mask/mask.js +48 -0
- package/typed/mask/shader-module.d.ts.map +1 -1
- package/typed/mask/shader-module.js +73 -0
- package/typed/mask/utils.d.ts +13 -0
- package/typed/mask/utils.d.ts.map +1 -0
- package/typed/path-style/path-style.js +107 -0
- package/typed/path-style/shaders.glsl.js +93 -0
- package/typed/terrain/height-map-builder.d.ts +38 -0
- package/typed/terrain/height-map-builder.d.ts.map +1 -0
- package/typed/terrain/height-map.d.ts +27 -0
- package/typed/terrain/height-map.d.ts.map +1 -0
- package/typed/terrain/shader-module-offset.d.ts +4 -0
- package/typed/terrain/shader-module-offset.d.ts.map +1 -0
- package/typed/terrain/shader-module-source.d.ts +4 -0
- package/typed/terrain/shader-module-source.d.ts.map +1 -0
- package/typed/terrain/shader-module.d.ts +31 -0
- package/typed/terrain/shader-module.d.ts.map +1 -0
- package/typed/terrain/terrain-cover.d.ts +46 -0
- package/typed/terrain/terrain-cover.d.ts.map +1 -0
- package/typed/terrain/terrain-effect.d.ts +29 -0
- package/typed/terrain/terrain-effect.d.ts.map +1 -0
- package/typed/terrain/terrain-pass.d.ts +11 -0
- package/typed/terrain/terrain-pass.d.ts.map +1 -0
- package/typed/terrain/terrain-picking-pass.d.ts +19 -0
- package/typed/terrain/terrain-picking-pass.d.ts.map +1 -0
- package/typed/terrain/terrain.d.ts +21 -0
- package/typed/terrain/terrain.d.ts.map +1 -0
- package/typed/terrain/utils.d.ts +5 -0
- package/typed/terrain/utils.d.ts.map +1 -0
- package/typed/utils/debug.d.ts +6 -0
- package/typed/utils/debug.d.ts.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/clip/clip.ts"],"names":["LayerExtension","defaultProps","clipBounds","shaderFunction","shaderModuleVs","name","vs","injectionVs","shaderModuleFs","fs","injectionFs","ClipExtension","getShaders","
|
|
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"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import { Framebuffer, Renderbuffer, Texture2D, cssToDeviceRatio } from '@luma.gl/core';
|
|
3
|
+
import { equals } from '@math.gl/core';
|
|
4
|
+
import { _deepEqual as deepEqual } from '@deck.gl/core';
|
|
5
|
+
import CollidePass from './collide-pass';
|
|
6
|
+
import MaskEffect from '../mask/mask-effect';
|
|
7
|
+
const DOWNSCALE = 2;
|
|
8
|
+
export default class CollideEffect {
|
|
9
|
+
constructor() {
|
|
10
|
+
_defineProperty(this, "id", 'collide-effect');
|
|
11
|
+
|
|
12
|
+
_defineProperty(this, "props", null);
|
|
13
|
+
|
|
14
|
+
_defineProperty(this, "useInPicking", true);
|
|
15
|
+
|
|
16
|
+
_defineProperty(this, "order", 1);
|
|
17
|
+
|
|
18
|
+
_defineProperty(this, "channels", {});
|
|
19
|
+
|
|
20
|
+
_defineProperty(this, "collidePass", void 0);
|
|
21
|
+
|
|
22
|
+
_defineProperty(this, "collideFBOs", {});
|
|
23
|
+
|
|
24
|
+
_defineProperty(this, "dummyCollideMap", void 0);
|
|
25
|
+
|
|
26
|
+
_defineProperty(this, "lastViewport", void 0);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
preRender(gl, {
|
|
30
|
+
effects: allEffects,
|
|
31
|
+
layers,
|
|
32
|
+
layerFilter,
|
|
33
|
+
viewports,
|
|
34
|
+
onViewportActive,
|
|
35
|
+
views,
|
|
36
|
+
isPicking,
|
|
37
|
+
preRenderStats = {}
|
|
38
|
+
}) {
|
|
39
|
+
var _preRenderStats$mask;
|
|
40
|
+
|
|
41
|
+
if (!this.dummyCollideMap) {
|
|
42
|
+
this.dummyCollideMap = new Texture2D(gl, {
|
|
43
|
+
width: 1,
|
|
44
|
+
height: 1
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (isPicking) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const collideLayers = layers.filter(({
|
|
53
|
+
props: {
|
|
54
|
+
visible,
|
|
55
|
+
collideEnabled
|
|
56
|
+
}
|
|
57
|
+
}) => visible && collideEnabled);
|
|
58
|
+
|
|
59
|
+
if (collideLayers.length === 0) {
|
|
60
|
+
this.channels = {};
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!this.collidePass) {
|
|
65
|
+
this.collidePass = new CollidePass(gl, {
|
|
66
|
+
id: 'default-collide'
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const effects = allEffects === null || allEffects === void 0 ? void 0 : allEffects.filter(e => e.constructor === MaskEffect);
|
|
71
|
+
const maskEffectRendered = (_preRenderStats$mask = preRenderStats['mask-effect']) === null || _preRenderStats$mask === void 0 ? void 0 : _preRenderStats$mask.didRender;
|
|
72
|
+
|
|
73
|
+
const channels = this._groupByCollideGroup(gl, collideLayers);
|
|
74
|
+
|
|
75
|
+
const viewport = viewports[0];
|
|
76
|
+
const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;
|
|
77
|
+
|
|
78
|
+
for (const collideGroup in channels) {
|
|
79
|
+
const collideFBO = this.collideFBOs[collideGroup];
|
|
80
|
+
const renderInfo = channels[collideGroup];
|
|
81
|
+
collideFBO.resize({
|
|
82
|
+
width: gl.canvas.width / DOWNSCALE,
|
|
83
|
+
height: gl.canvas.height / DOWNSCALE
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
this._render(renderInfo, {
|
|
87
|
+
effects,
|
|
88
|
+
layerFilter,
|
|
89
|
+
onViewportActive,
|
|
90
|
+
views,
|
|
91
|
+
viewport,
|
|
92
|
+
viewportChanged
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
_render(renderInfo, {
|
|
98
|
+
effects,
|
|
99
|
+
layerFilter,
|
|
100
|
+
onViewportActive,
|
|
101
|
+
views,
|
|
102
|
+
viewport,
|
|
103
|
+
viewportChanged
|
|
104
|
+
}) {
|
|
105
|
+
const {
|
|
106
|
+
collideGroup
|
|
107
|
+
} = renderInfo;
|
|
108
|
+
const oldRenderInfo = this.channels[collideGroup];
|
|
109
|
+
|
|
110
|
+
if (!oldRenderInfo) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const needsRender = viewportChanged || renderInfo === oldRenderInfo || !deepEqual(oldRenderInfo.layers, renderInfo.layers, 0) || renderInfo.layerBounds.some((b, i) => !equals(b, oldRenderInfo.layerBounds[i]));
|
|
115
|
+
this.channels[collideGroup] = renderInfo;
|
|
116
|
+
|
|
117
|
+
if (needsRender) {
|
|
118
|
+
this.lastViewport = viewport;
|
|
119
|
+
const collideFBO = this.collideFBOs[collideGroup];
|
|
120
|
+
this.collidePass.renderCollideMap(collideFBO, {
|
|
121
|
+
pass: 'collide',
|
|
122
|
+
isPicking: true,
|
|
123
|
+
layers: renderInfo.layers,
|
|
124
|
+
effects,
|
|
125
|
+
layerFilter,
|
|
126
|
+
viewports: viewport ? [viewport] : [],
|
|
127
|
+
onViewportActive,
|
|
128
|
+
views,
|
|
129
|
+
moduleParameters: {
|
|
130
|
+
dummyCollideMap: this.dummyCollideMap,
|
|
131
|
+
devicePixelRatio: cssToDeviceRatio(collideFBO.gl) / DOWNSCALE
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
_groupByCollideGroup(gl, collideLayers) {
|
|
138
|
+
const channelMap = {};
|
|
139
|
+
|
|
140
|
+
for (const layer of collideLayers) {
|
|
141
|
+
const {
|
|
142
|
+
collideGroup
|
|
143
|
+
} = layer.props;
|
|
144
|
+
let channelInfo = channelMap[collideGroup];
|
|
145
|
+
|
|
146
|
+
if (!channelInfo) {
|
|
147
|
+
channelInfo = {
|
|
148
|
+
collideGroup,
|
|
149
|
+
layers: [],
|
|
150
|
+
layerBounds: []
|
|
151
|
+
};
|
|
152
|
+
channelMap[collideGroup] = channelInfo;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
channelInfo.layers.push(layer);
|
|
156
|
+
channelInfo.layerBounds.push(layer.getBounds());
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
for (const collideGroup of Object.keys(channelMap)) {
|
|
160
|
+
if (!this.collideFBOs[collideGroup]) {
|
|
161
|
+
this.createFBO(gl, collideGroup);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (!this.channels[collideGroup]) {
|
|
165
|
+
this.channels[collideGroup] = channelMap[collideGroup];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
for (const collideGroup of Object.keys(this.collideFBOs)) {
|
|
170
|
+
if (!channelMap[collideGroup]) {
|
|
171
|
+
this.destroyFBO(collideGroup);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return channelMap;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
getModuleParameters(layer) {
|
|
179
|
+
const {
|
|
180
|
+
collideGroup
|
|
181
|
+
} = layer.props;
|
|
182
|
+
const {
|
|
183
|
+
collideFBOs,
|
|
184
|
+
dummyCollideMap
|
|
185
|
+
} = this;
|
|
186
|
+
return {
|
|
187
|
+
collideFBO: collideFBOs[collideGroup],
|
|
188
|
+
dummyCollideMap
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
cleanup() {
|
|
193
|
+
if (this.dummyCollideMap) {
|
|
194
|
+
this.dummyCollideMap.delete();
|
|
195
|
+
this.dummyCollideMap = undefined;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
this.channels = {};
|
|
199
|
+
|
|
200
|
+
for (const collideGroup of Object.keys(this.collideFBOs)) {
|
|
201
|
+
this.destroyFBO(collideGroup);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
this.collideFBOs = {};
|
|
205
|
+
this.lastViewport = undefined;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
createFBO(gl, collideGroup) {
|
|
209
|
+
const {
|
|
210
|
+
width,
|
|
211
|
+
height
|
|
212
|
+
} = gl.canvas;
|
|
213
|
+
const collideMap = new Texture2D(gl, {
|
|
214
|
+
width,
|
|
215
|
+
height,
|
|
216
|
+
parameters: {
|
|
217
|
+
[10241]: 9728,
|
|
218
|
+
[10240]: 9728,
|
|
219
|
+
[10242]: 33071,
|
|
220
|
+
[10243]: 33071
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
const depthBuffer = new Renderbuffer(gl, {
|
|
224
|
+
format: 33189,
|
|
225
|
+
width,
|
|
226
|
+
height
|
|
227
|
+
});
|
|
228
|
+
this.collideFBOs[collideGroup] = new Framebuffer(gl, {
|
|
229
|
+
id: "Collide-".concat(collideGroup),
|
|
230
|
+
width,
|
|
231
|
+
height,
|
|
232
|
+
attachments: {
|
|
233
|
+
[36064]: collideMap,
|
|
234
|
+
[36096]: depthBuffer
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
destroyFBO(collideGroup) {
|
|
240
|
+
const fbo = this.collideFBOs[collideGroup];
|
|
241
|
+
|
|
242
|
+
for (const attachment of Object.values(fbo.attachments)) {
|
|
243
|
+
attachment.delete();
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
fbo.delete();
|
|
247
|
+
delete this.collideFBOs[collideGroup];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=collide-effect.js.map
|
|
@@ -0,0 +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","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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { withParameters } from '@luma.gl/core';
|
|
2
|
+
import { _LayersPass as LayersPass } from '@deck.gl/core';
|
|
3
|
+
export default class CollidePass extends LayersPass {
|
|
4
|
+
renderCollideMap(target, options) {
|
|
5
|
+
const gl = this.gl;
|
|
6
|
+
const padding = 1;
|
|
7
|
+
return withParameters(gl, {
|
|
8
|
+
scissorTest: true,
|
|
9
|
+
scissor: [padding, padding, target.width - 2 * padding, target.height - 2 * padding],
|
|
10
|
+
clearColor: [0, 0, 0, 0],
|
|
11
|
+
blend: false,
|
|
12
|
+
depthTest: true,
|
|
13
|
+
depthRange: [0, 1]
|
|
14
|
+
}, () => this.render({ ...options,
|
|
15
|
+
target,
|
|
16
|
+
pass: 'collide'
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
getModuleParameters() {
|
|
21
|
+
return {
|
|
22
|
+
drawToCollideMap: true,
|
|
23
|
+
pickingActive: 1,
|
|
24
|
+
pickingAttribute: false,
|
|
25
|
+
lightSources: {}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=collide-pass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/collide/collide-pass.ts"],"names":["withParameters","_LayersPass","LayersPass","CollidePass","renderCollideMap","target","options","gl","padding","scissorTest","scissor","width","height","clearColor","blend","depthTest","depthRange","render","pass","getModuleParameters","drawToCollideMap","pickingActive","pickingAttribute","lightSources"],"mappings":"AAAA,SAAqBA,cAArB,QAA0C,eAA1C;AACA,SAAQC,WAAW,IAAIC,UAAvB,QAAiE,eAAjE;AAIA,eAAe,MAAMC,WAAN,SAA0BD,UAA1B,CAAqC;AAClDE,EAAAA,gBAAgB,CAACC,MAAD,EAAsBC,OAAtB,EAAyD;AACvE,UAAMC,EAAE,GAAG,KAAKA,EAAhB;AAEA,UAAMC,OAAO,GAAG,CAAhB;AAEA,WAAOR,cAAc,CACnBO,EADmB,EAEnB;AACEE,MAAAA,WAAW,EAAE,IADf;AAEEC,MAAAA,OAAO,EAAE,CAACF,OAAD,EAAUA,OAAV,EAAmBH,MAAM,CAACM,KAAP,GAAe,IAAIH,OAAtC,EAA+CH,MAAM,CAACO,MAAP,GAAgB,IAAIJ,OAAnE,CAFX;AAGEK,MAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAHd;AAIEC,MAAAA,KAAK,EAAE,KAJT;AAKEC,MAAAA,SAAS,EAAE,IALb;AAMEC,MAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ;AANd,KAFmB,EAUnB,MAAM,KAAKC,MAAL,CAAY,EAAC,GAAGX,OAAJ;AAAaD,MAAAA,MAAb;AAAqBa,MAAAA,IAAI,EAAE;AAA3B,KAAZ,CAVa,CAArB;AAYD;;AAEDC,EAAAA,mBAAmB,GAAG;AAEpB,WAAO;AACLC,MAAAA,gBAAgB,EAAE,IADb;AAELC,MAAAA,aAAa,EAAE,CAFV;AAGLC,MAAAA,gBAAgB,EAAE,KAHb;AAILC,MAAAA,YAAY,EAAE;AAJT,KAAP;AAMD;;AA5BiD","sourcesContent":["import {Framebuffer, withParameters} from '@luma.gl/core';\nimport {_LayersPass as LayersPass, LayersPassRenderOptions} from '@deck.gl/core';\n\ntype CollidePassRenderOptions = LayersPassRenderOptions & {};\n\nexport default class CollidePass extends LayersPass {\n renderCollideMap(target: Framebuffer, options: CollidePassRenderOptions) {\n const gl = this.gl;\n\n const padding = 1;\n\n return withParameters(\n gl,\n {\n scissorTest: true,\n scissor: [padding, padding, target.width - 2 * padding, target.height - 2 * padding],\n clearColor: [0, 0, 0, 0],\n blend: false,\n depthTest: true,\n depthRange: [0, 1]\n },\n () => this.render({...options, target, pass: 'collide'})\n );\n }\n\n getModuleParameters() {\n // Draw picking colors into collide FBO\n return {\n drawToCollideMap: true,\n pickingActive: 1,\n pickingAttribute: false,\n lightSources: {}\n };\n }\n}\n"],"file":"collide-pass.js"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import { LayerExtension } from '@deck.gl/core';
|
|
3
|
+
import collide from './shader-module';
|
|
4
|
+
import CollideEffect from './collide-effect';
|
|
5
|
+
const defaultProps = {
|
|
6
|
+
getCollidePriority: {
|
|
7
|
+
type: 'accessor',
|
|
8
|
+
value: 0
|
|
9
|
+
},
|
|
10
|
+
collideEnabled: true,
|
|
11
|
+
collideGroup: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
value: 'default'
|
|
14
|
+
},
|
|
15
|
+
collideTestProps: {}
|
|
16
|
+
};
|
|
17
|
+
export default class CollideExtension extends LayerExtension {
|
|
18
|
+
getShaders() {
|
|
19
|
+
return {
|
|
20
|
+
modules: [collide]
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
draw({
|
|
25
|
+
uniforms,
|
|
26
|
+
context,
|
|
27
|
+
moduleParameters
|
|
28
|
+
}) {
|
|
29
|
+
const {
|
|
30
|
+
collideEnabled
|
|
31
|
+
} = this.props;
|
|
32
|
+
const {
|
|
33
|
+
collideFBO,
|
|
34
|
+
drawToCollideMap
|
|
35
|
+
} = moduleParameters;
|
|
36
|
+
const enabled = collideEnabled && Boolean(collideFBO);
|
|
37
|
+
uniforms.collide_enabled = enabled;
|
|
38
|
+
|
|
39
|
+
if (drawToCollideMap) {
|
|
40
|
+
this.props = this.clone(this.props.collideTestProps).props;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
initializeState(context, extension) {
|
|
45
|
+
var _this$context$deck;
|
|
46
|
+
|
|
47
|
+
if (this.getAttributeManager() === null) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
(_this$context$deck = this.context.deck) === null || _this$context$deck === void 0 ? void 0 : _this$context$deck._addDefaultEffect(new CollideEffect());
|
|
52
|
+
const attributeManager = this.getAttributeManager();
|
|
53
|
+
attributeManager.add({
|
|
54
|
+
collidePriorities: {
|
|
55
|
+
size: 1,
|
|
56
|
+
accessor: 'getCollidePriority',
|
|
57
|
+
shaderAttributes: {
|
|
58
|
+
collidePriorities: {
|
|
59
|
+
divisor: 0
|
|
60
|
+
},
|
|
61
|
+
instanceCollidePriorities: {
|
|
62
|
+
divisor: 1
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
getNeedsPickingBuffer() {
|
|
70
|
+
return this.props.collideEnabled;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
_defineProperty(CollideExtension, "defaultProps", defaultProps);
|
|
76
|
+
|
|
77
|
+
_defineProperty(CollideExtension, "extensionName", 'CollideExtension');
|
|
78
|
+
//# sourceMappingURL=collide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/collide/collide.ts"],"names":["LayerExtension","collide","CollideEffect","defaultProps","getCollidePriority","type","value","collideEnabled","collideGroup","collideTestProps","CollideExtension","getShaders","modules","draw","uniforms","context","moduleParameters","props","collideFBO","drawToCollideMap","enabled","Boolean","collide_enabled","clone","initializeState","extension","getAttributeManager","deck","_addDefaultEffect","attributeManager","add","collidePriorities","size","accessor","shaderAttributes","divisor","instanceCollidePriorities","getNeedsPickingBuffer"],"mappings":";AAAA,SAAuCA,cAAvC,QAA4D,eAA5D;AACA,OAAOC,OAAP,MAAoB,iBAApB;AACA,OAAOC,aAAP,MAA0B,kBAA1B;AAEA,MAAMC,YAAY,GAAG;AACnBC,EAAAA,kBAAkB,EAAE;AAACC,IAAAA,IAAI,EAAE,UAAP;AAAmBC,IAAAA,KAAK,EAAE;AAA1B,GADD;AAEnBC,EAAAA,cAAc,EAAE,IAFG;AAGnBC,EAAAA,YAAY,EAAE;AAACH,IAAAA,IAAI,EAAE,QAAP;AAAiBC,IAAAA,KAAK,EAAE;AAAxB,GAHK;AAInBG,EAAAA,gBAAgB,EAAE;AAJC,CAArB;AA+BA,eAAe,MAAMC,gBAAN,SAA+BV,cAA/B,CAA8C;AAI3DW,EAAAA,UAAU,GAA0C;AAClD,WAAO;AAACC,MAAAA,OAAO,EAAE,CAACX,OAAD;AAAV,KAAP;AACD;;AAGDY,EAAAA,IAAI,CAAqC;AAACC,IAAAA,QAAD;AAAWC,IAAAA,OAAX;AAAoBC,IAAAA;AAApB,GAArC,EAAiF;AACnF,UAAM;AAACT,MAAAA;AAAD,QAAmB,KAAKU,KAA9B;AACA,UAAM;AAACC,MAAAA,UAAD;AAAaC,MAAAA;AAAb,QAAiCH,gBAAvC;AACA,UAAMI,OAAO,GAAGb,cAAc,IAAIc,OAAO,CAACH,UAAD,CAAzC;AACAJ,IAAAA,QAAQ,CAACQ,eAAT,GAA2BF,OAA3B;;AAEA,QAAID,gBAAJ,EAAsB;AAGpB,WAAKF,KAAL,GAAa,KAAKM,KAAL,CAAW,KAAKN,KAAL,CAAWR,gBAAtB,EAAwCQ,KAArD;AACD;AACF;;AAEDO,EAAAA,eAAe,CAAqCT,OAArC,EAA4DU,SAA5D,EAA6E;AAAA;;AAC1F,QAAI,KAAKC,mBAAL,OAA+B,IAAnC,EAAyC;AACvC;AACD;;AACD,+BAAKX,OAAL,CAAaY,IAAb,0EAAmBC,iBAAnB,CAAqC,IAAI1B,aAAJ,EAArC;AACA,UAAM2B,gBAAgB,GAAG,KAAKH,mBAAL,EAAzB;AACAG,IAAAA,gBAAgB,CAAEC,GAAlB,CAAsB;AACpBC,MAAAA,iBAAiB,EAAE;AACjBC,QAAAA,IAAI,EAAE,CADW;AAEjBC,QAAAA,QAAQ,EAAE,oBAFO;AAGjBC,QAAAA,gBAAgB,EAAE;AAChBH,UAAAA,iBAAiB,EAAE;AAACI,YAAAA,OAAO,EAAE;AAAV,WADH;AAEhBC,UAAAA,yBAAyB,EAAE;AAACD,YAAAA,OAAO,EAAE;AAAV;AAFX;AAHD;AADC,KAAtB;AAUD;;AAEDE,EAAAA,qBAAqB,GAA8C;AACjE,WAAO,KAAKpB,KAAL,CAAWV,cAAlB;AACD;;AA1C0D;;gBAAxCG,gB,kBACGP,Y;;gBADHO,gB,mBAEI,kB","sourcesContent":["import {Accessor, Layer, LayerContext, LayerExtension} from '@deck.gl/core';\nimport collide from './shader-module';\nimport CollideEffect from './collide-effect';\n\nconst defaultProps = {\n getCollidePriority: {type: 'accessor', value: 0},\n collideEnabled: true,\n collideGroup: {type: 'string', value: 'default'},\n collideTestProps: {}\n};\n\nexport type CollideExtensionProps<DataT = any> = {\n /**\n * Accessor for collision priority. Must return a number in the range -1000 -> 1000. Features with higher values are shown preferentially.\n */\n getCollidePriority?: Accessor<DataT, number>;\n\n /**\n * Enable/disable collisions. If collisions are disabled, all objects are rendered.\n * @default true\n */\n collideEnabled: boolean;\n\n /**\n * Collision group this layer belongs to. If it is not set, the 'default' collision group is used\n */\n collideGroup?: string;\n\n /**\n * Props to override when rendering collision map\n */\n collideTestProps?: {};\n};\n\n/** Allows layers to hide overlapping objects. */\nexport default class CollideExtension extends LayerExtension {\n static defaultProps = defaultProps;\n static extensionName = 'CollideExtension';\n\n getShaders(this: Layer<CollideExtensionProps>): any {\n return {modules: [collide]};\n }\n\n /* eslint-disable camelcase */\n draw(this: Layer<CollideExtensionProps>, {uniforms, context, moduleParameters}: any) {\n const {collideEnabled} = this.props;\n const {collideFBO, drawToCollideMap} = moduleParameters;\n const enabled = collideEnabled && Boolean(collideFBO);\n uniforms.collide_enabled = enabled;\n\n if (drawToCollideMap) {\n // Override any props with those defined in collideTestProps\n // @ts-ignore\n this.props = this.clone(this.props.collideTestProps).props;\n }\n }\n\n initializeState(this: Layer<CollideExtensionProps>, context: LayerContext, extension: this) {\n if (this.getAttributeManager() === null) {\n return;\n }\n this.context.deck?._addDefaultEffect(new CollideEffect());\n const attributeManager = this.getAttributeManager();\n attributeManager!.add({\n collidePriorities: {\n size: 1,\n accessor: 'getCollidePriority',\n shaderAttributes: {\n collidePriorities: {divisor: 0},\n instanceCollidePriorities: {divisor: 1}\n }\n }\n });\n }\n\n getNeedsPickingBuffer(this: Layer<CollideExtensionProps>): boolean {\n return this.props.collideEnabled;\n }\n}\n"],"file":"collide.js"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { project } from '@deck.gl/core';
|
|
2
|
+
const vs = "\n#ifdef NON_INSTANCED_MODEL\nattribute float collidePriorities;\n#else\nattribute float instanceCollidePriorities;\n#endif\n\nuniform sampler2D collide_texture;\nuniform bool collide_sort;\nuniform bool collide_enabled;\n\nvec2 collide_getCoords(vec4 position) {\n vec4 collide_clipspace = project_common_position_to_clipspace(position);\n return (1.0 + collide_clipspace.xy / collide_clipspace.w) / 2.0;\n}\n\nfloat collide_match(vec2 tex, vec3 pickingColor) {\n vec4 collide_pickingColor = texture2D(collide_texture, tex);\n float delta = dot(abs(collide_pickingColor.rgb - pickingColor), vec3(1.0));\n float e = 0.001;\n return step(delta, e);\n}\n\nfloat collide_isVisible(vec2 texCoords, vec3 pickingColor) {\n if (!collide_enabled) {\n return 1.0;\n }\n\n // Visibility test, sample area of 5x5 pixels in order to fade in/out.\n // Due to the locality, the lookups will be cached\n // This reduces the flicker present when objects are shown/hidden\n const int N = 2;\n float accumulator = 0.0;\n vec2 step = vec2(1.0 / project_uViewportSize);\n\n const float floatN = float(N);\n vec2 delta = -floatN * step;\n for(int i = -N; i <= N; i++) {\n delta.x = -step.x * floatN;\n for(int j = -N; j <= N; j++) {\n accumulator += collide_match(texCoords + delta, pickingColor);\n delta.x += step.x;\n }\n delta.y += step.y;\n }\n\n float W = 2.0 * floatN + 1.0;\n return pow(accumulator / (W * W), 2.2);\n}\n";
|
|
3
|
+
const inject = {
|
|
4
|
+
'vs:#decl': "\n float collide_fade = 1.0;\n",
|
|
5
|
+
'vs:DECKGL_FILTER_GL_POSITION': "\n if (collide_sort) {\n #ifdef NON_INSTANCED_MODEL\n float collidePriority = collidePriorities;\n #else\n float collidePriority = instanceCollidePriorities;\n #endif\n position.z = -0.001 * collidePriority * position.w; // Support range -1000 -> 1000\n }\n\n if (collide_enabled) {\n vec4 collide_common_position = project_position(vec4(geometry.worldPosition, 1.0));\n vec2 collide_texCoords = collide_getCoords(collide_common_position);\n collide_fade = collide_isVisible(collide_texCoords, geometry.pickingColor / 255.0);\n if (collide_fade < 0.0001) {\n position = vec4(0.);\n }\n }\n ",
|
|
6
|
+
'vs:DECKGL_FILTER_COLOR': "\n color.a *= collide_fade;\n "
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const getCollideUniforms = (opts, uniforms) => {
|
|
10
|
+
if (!opts || !('dummyCollideMap' in opts)) {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const {
|
|
15
|
+
collideFBO,
|
|
16
|
+
drawToCollideMap,
|
|
17
|
+
dummyCollideMap
|
|
18
|
+
} = opts;
|
|
19
|
+
return {
|
|
20
|
+
collide_sort: Boolean(drawToCollideMap),
|
|
21
|
+
collide_texture: !drawToCollideMap && collideFBO ? collideFBO : dummyCollideMap
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
name: 'collide',
|
|
27
|
+
dependencies: [project],
|
|
28
|
+
vs,
|
|
29
|
+
inject,
|
|
30
|
+
getUniforms: getCollideUniforms
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=shader-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/collide/shader-module.ts"],"names":["project","vs","inject","getCollideUniforms","opts","uniforms","collideFBO","drawToCollideMap","dummyCollideMap","collide_sort","Boolean","collide_texture","name","dependencies","getUniforms"],"mappings":"AACA,SAAQA,OAAR,QAAsB,eAAtB;AAGA,MAAMC,EAAE,i7CAAR;AAmDA,MAAMC,MAAM,GAAG;AACb,+CADa;AAIb,6pBAJa;AAuBb;AAvBa,CAAf;;AAqCA,MAAMC,kBAAkB,GAAG,CACzBC,IADyB,EAEzBC,QAFyB,KAGL;AACpB,MAAI,CAACD,IAAD,IAAS,EAAE,qBAAqBA,IAAvB,CAAb,EAA2C;AACzC,WAAO,EAAP;AACD;;AACD,QAAM;AAACE,IAAAA,UAAD;AAAaC,IAAAA,gBAAb;AAA+BC,IAAAA;AAA/B,MAAkDJ,IAAxD;AACA,SAAO;AACLK,IAAAA,YAAY,EAAEC,OAAO,CAACH,gBAAD,CADhB;AAELI,IAAAA,eAAe,EAAE,CAACJ,gBAAD,IAAqBD,UAArB,GAAkCA,UAAlC,GAA+CE;AAF3D,GAAP;AAID,CAZD;;AAcA,eAAe;AACbI,EAAAA,IAAI,EAAE,SADO;AAEbC,EAAAA,YAAY,EAAE,CAACb,OAAD,CAFD;AAGbC,EAAAA,EAHa;AAIbC,EAAAA,MAJa;AAKbY,EAAAA,WAAW,EAAEX;AALA,CAAf","sourcesContent":["import {Framebuffer, Texture2D} from '@luma.gl/core';\nimport {project} from '@deck.gl/core';\nimport type {_ShaderModule as ShaderModule} from '@deck.gl/core';\n\nconst vs = `\n#ifdef NON_INSTANCED_MODEL\nattribute float collidePriorities;\n#else\nattribute float instanceCollidePriorities;\n#endif\n\nuniform sampler2D collide_texture;\nuniform bool collide_sort;\nuniform bool collide_enabled;\n\nvec2 collide_getCoords(vec4 position) {\n vec4 collide_clipspace = project_common_position_to_clipspace(position);\n return (1.0 + collide_clipspace.xy / collide_clipspace.w) / 2.0;\n}\n\nfloat collide_match(vec2 tex, vec3 pickingColor) {\n vec4 collide_pickingColor = texture2D(collide_texture, tex);\n float delta = dot(abs(collide_pickingColor.rgb - pickingColor), vec3(1.0));\n float e = 0.001;\n return step(delta, e);\n}\n\nfloat collide_isVisible(vec2 texCoords, vec3 pickingColor) {\n if (!collide_enabled) {\n return 1.0;\n }\n\n // Visibility test, sample area of 5x5 pixels in order to fade in/out.\n // Due to the locality, the lookups will be cached\n // This reduces the flicker present when objects are shown/hidden\n const int N = 2;\n float accumulator = 0.0;\n vec2 step = vec2(1.0 / project_uViewportSize);\n\n const float floatN = float(N);\n vec2 delta = -floatN * step;\n for(int i = -N; i <= N; i++) {\n delta.x = -step.x * floatN;\n for(int j = -N; j <= N; j++) {\n accumulator += collide_match(texCoords + delta, pickingColor);\n delta.x += step.x;\n }\n delta.y += step.y;\n }\n\n float W = 2.0 * floatN + 1.0;\n return pow(accumulator / (W * W), 2.2);\n}\n`;\n\nconst inject = {\n 'vs:#decl': `\n float collide_fade = 1.0;\n`,\n 'vs:DECKGL_FILTER_GL_POSITION': `\n if (collide_sort) {\n #ifdef NON_INSTANCED_MODEL\n float collidePriority = collidePriorities;\n #else\n float collidePriority = instanceCollidePriorities;\n #endif\n position.z = -0.001 * collidePriority * position.w; // Support range -1000 -> 1000\n }\n\n if (collide_enabled) {\n vec4 collide_common_position = project_position(vec4(geometry.worldPosition, 1.0));\n vec2 collide_texCoords = collide_getCoords(collide_common_position);\n collide_fade = collide_isVisible(collide_texCoords, geometry.pickingColor / 255.0);\n if (collide_fade < 0.0001) {\n position = vec4(0.);\n }\n }\n `,\n 'vs:DECKGL_FILTER_COLOR': `\n color.a *= collide_fade;\n `\n};\n\ntype CollideModuleSettings = {\n collideFBO?: Framebuffer;\n drawToCollideMap?: boolean;\n dummyCollideMap?: Texture2D;\n};\n\n/* eslint-disable camelcase */\ntype CollideUniforms = {collide_sort?: boolean; collide_texture?: Framebuffer | Texture2D};\n\nconst getCollideUniforms = (\n opts: CollideModuleSettings | {},\n uniforms: Record<string, any>\n): CollideUniforms => {\n if (!opts || !('dummyCollideMap' in opts)) {\n return {};\n }\n const {collideFBO, drawToCollideMap, dummyCollideMap} = opts;\n return {\n collide_sort: Boolean(drawToCollideMap),\n collide_texture: !drawToCollideMap && collideFBO ? collideFBO : dummyCollideMap\n };\n};\n\nexport default {\n name: 'collide',\n dependencies: [project],\n vs,\n inject,\n getUniforms: getCollideUniforms\n} as ShaderModule;\n"],"file":"shader-module.js"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { WebMercatorViewport, OrthographicViewport } from '@deck.gl/core';
|
|
2
|
+
export function joinLayerBounds(layers, viewport) {
|
|
3
|
+
const bounds = [Infinity, Infinity, -Infinity, -Infinity];
|
|
4
|
+
|
|
5
|
+
for (const layer of layers) {
|
|
6
|
+
const layerBounds = layer.getBounds();
|
|
7
|
+
|
|
8
|
+
if (layerBounds) {
|
|
9
|
+
const bottomLeftCommon = layer.projectPosition(layerBounds[0], {
|
|
10
|
+
viewport,
|
|
11
|
+
autoOffset: false
|
|
12
|
+
});
|
|
13
|
+
const topRightCommon = layer.projectPosition(layerBounds[1], {
|
|
14
|
+
viewport,
|
|
15
|
+
autoOffset: false
|
|
16
|
+
});
|
|
17
|
+
bounds[0] = Math.min(bounds[0], bottomLeftCommon[0]);
|
|
18
|
+
bounds[1] = Math.min(bounds[1], bottomLeftCommon[1]);
|
|
19
|
+
bounds[2] = Math.max(bounds[2], topRightCommon[0]);
|
|
20
|
+
bounds[3] = Math.max(bounds[3], topRightCommon[1]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (Number.isFinite(bounds[0])) {
|
|
25
|
+
return bounds;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const MAX_VIEWPORT_SIZE = 2048;
|
|
31
|
+
export function makeViewport(opts) {
|
|
32
|
+
const {
|
|
33
|
+
bounds,
|
|
34
|
+
viewport,
|
|
35
|
+
border = 0
|
|
36
|
+
} = opts;
|
|
37
|
+
const {
|
|
38
|
+
isGeospatial
|
|
39
|
+
} = viewport;
|
|
40
|
+
|
|
41
|
+
if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const centerWorld = viewport.unprojectPosition([(bounds[0] + bounds[2]) / 2, (bounds[1] + bounds[3]) / 2, 0]);
|
|
46
|
+
const maxSize = MAX_VIEWPORT_SIZE - border * 2;
|
|
47
|
+
let {
|
|
48
|
+
width,
|
|
49
|
+
height,
|
|
50
|
+
zoom
|
|
51
|
+
} = opts;
|
|
52
|
+
|
|
53
|
+
if (zoom === undefined) {
|
|
54
|
+
const scale = Math.min(width / (bounds[2] - bounds[0]), height / (bounds[3] - bounds[1]));
|
|
55
|
+
zoom = Math.min(Math.log2(scale), 20);
|
|
56
|
+
} else if (!width || !height) {
|
|
57
|
+
const scale = 2 ** zoom;
|
|
58
|
+
width = Math.round(Math.abs(bounds[2] - bounds[0]) * scale);
|
|
59
|
+
height = Math.round(Math.abs(bounds[3] - bounds[1]) * scale);
|
|
60
|
+
|
|
61
|
+
if (width > maxSize || height > maxSize) {
|
|
62
|
+
const r = maxSize / Math.max(width, height);
|
|
63
|
+
width = Math.round(width * r);
|
|
64
|
+
height = Math.round(height * r);
|
|
65
|
+
zoom += Math.log2(r);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return isGeospatial ? new WebMercatorViewport({
|
|
70
|
+
x: border,
|
|
71
|
+
y: border,
|
|
72
|
+
width,
|
|
73
|
+
height,
|
|
74
|
+
longitude: centerWorld[0],
|
|
75
|
+
latitude: centerWorld[1],
|
|
76
|
+
zoom,
|
|
77
|
+
orthographic: true
|
|
78
|
+
}) : new OrthographicViewport({
|
|
79
|
+
x: border,
|
|
80
|
+
y: border,
|
|
81
|
+
width,
|
|
82
|
+
height,
|
|
83
|
+
target: centerWorld,
|
|
84
|
+
zoom,
|
|
85
|
+
flipY: false
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export function getViewportBounds(viewport, zRange) {
|
|
89
|
+
let viewportBoundsWorld;
|
|
90
|
+
|
|
91
|
+
if (zRange && zRange.length === 2) {
|
|
92
|
+
const [minZ, maxZ] = zRange;
|
|
93
|
+
const bounds0 = viewport.getBounds({
|
|
94
|
+
z: minZ
|
|
95
|
+
});
|
|
96
|
+
const bounds1 = viewport.getBounds({
|
|
97
|
+
z: maxZ
|
|
98
|
+
});
|
|
99
|
+
viewportBoundsWorld = [Math.min(bounds0[0], bounds1[0]), Math.min(bounds0[1], bounds1[1]), Math.max(bounds0[2], bounds1[2]), Math.max(bounds0[3], bounds1[3])];
|
|
100
|
+
} else {
|
|
101
|
+
viewportBoundsWorld = viewport.getBounds();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const viewportBottomLeftCommon = viewport.projectPosition(viewportBoundsWorld.slice(0, 2));
|
|
105
|
+
const viewportTopRightCommon = viewport.projectPosition(viewportBoundsWorld.slice(2, 4));
|
|
106
|
+
return [viewportBottomLeftCommon[0], viewportBottomLeftCommon[1], viewportTopRightCommon[0], viewportTopRightCommon[1]];
|
|
107
|
+
}
|
|
108
|
+
export function getRenderBounds(layerBounds, viewport, zRange) {
|
|
109
|
+
if (!layerBounds) {
|
|
110
|
+
return [0, 0, 1, 1];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const viewportBounds = getViewportBounds(viewport, zRange);
|
|
114
|
+
const paddedBounds = doubleBounds(viewportBounds);
|
|
115
|
+
|
|
116
|
+
if (layerBounds[2] - layerBounds[0] <= paddedBounds[2] - paddedBounds[0] && layerBounds[3] - layerBounds[1] <= paddedBounds[3] - paddedBounds[1]) {
|
|
117
|
+
return layerBounds;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return [Math.max(layerBounds[0], paddedBounds[0]), Math.max(layerBounds[1], paddedBounds[1]), Math.min(layerBounds[2], paddedBounds[2]), Math.min(layerBounds[3], paddedBounds[3])];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function doubleBounds(bounds) {
|
|
124
|
+
const dx = bounds[2] - bounds[0];
|
|
125
|
+
const dy = bounds[3] - bounds[1];
|
|
126
|
+
const centerX = (bounds[0] + bounds[2]) / 2;
|
|
127
|
+
const centerY = (bounds[1] + bounds[3]) / 2;
|
|
128
|
+
return [centerX - dx, centerY - dy, centerX + dx, centerY + dy];
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=projection-utils.js.map
|