@deck.gl/extensions 9.0.0-beta.1 → 9.0.0-beta.11
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/brushing/brushing-extension.js +80 -0
- package/{typed → dist}/brushing/shader-module.d.ts +1 -1
- package/{typed → dist}/brushing/shader-module.d.ts.map +1 -1
- package/dist/brushing/shader-module.js +92 -0
- package/{typed → dist}/clip/clip-extension.d.ts.map +1 -1
- package/dist/clip/clip-extension.js +117 -0
- package/{typed → dist}/collision-filter/collision-filter-effect.d.ts +4 -2
- package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -0
- package/dist/collision-filter/collision-filter-effect.js +194 -0
- package/dist/collision-filter/collision-filter-extension.js +49 -0
- package/{typed → dist}/collision-filter/collision-filter-pass.d.ts +3 -2
- package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -0
- package/dist/collision-filter/collision-filter-pass.js +23 -0
- package/{typed → dist}/collision-filter/shader-module.d.ts.map +1 -1
- package/dist/collision-filter/shader-module.js +87 -0
- package/dist/data-filter/aggregator.d.ts.map +1 -0
- package/dist/{esm/data-filter → data-filter}/aggregator.js +40 -41
- package/{typed → dist}/data-filter/data-filter-extension.d.ts +39 -7
- package/dist/data-filter/data-filter-extension.d.ts.map +1 -0
- package/dist/data-filter/data-filter-extension.js +256 -0
- package/dist/data-filter/shader-module.d.ts +39 -0
- package/dist/data-filter/shader-module.d.ts.map +1 -0
- package/dist/data-filter/shader-module.js +199 -0
- package/dist/dist.dev.js +2667 -11058
- package/{typed → dist}/fill-style/fill-style-extension.d.ts +2 -30
- package/dist/fill-style/fill-style-extension.d.ts.map +1 -0
- package/dist/fill-style/fill-style-extension.js +116 -0
- package/{typed/fill-style/shaders.glsl.d.ts → dist/fill-style/shader-module.d.ts} +1 -1
- package/dist/fill-style/shader-module.d.ts.map +1 -0
- package/dist/fill-style/shader-module.js +96 -0
- package/dist/fp64/fp64-extension.js +35 -0
- package/dist/fp64/project64.glsl.js +81 -0
- package/dist/fp64/project64.js +50 -0
- package/dist/index.cjs +2795 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/{typed → dist}/mask/mask-effect.d.ts +6 -5
- package/dist/mask/mask-effect.d.ts.map +1 -0
- package/dist/mask/mask-effect.js +192 -0
- package/dist/mask/mask-extension.js +57 -0
- package/dist/mask/mask-pass.d.ts +61 -0
- package/dist/mask/mask-pass.d.ts.map +1 -0
- package/dist/mask/mask-pass.js +52 -0
- package/{typed → dist}/mask/shader-module.d.ts.map +1 -1
- package/dist/mask/shader-module.js +77 -0
- package/{typed → dist}/path-style/path-style-extension.d.ts.map +1 -1
- package/dist/path-style/path-style-extension.js +112 -0
- package/dist/path-style/shaders.glsl.js +86 -0
- package/{typed → dist}/terrain/height-map-builder.d.ts +1 -1
- package/dist/terrain/height-map-builder.d.ts.map +1 -0
- package/dist/terrain/height-map-builder.js +104 -0
- package/{typed → dist}/terrain/shader-module.d.ts +2 -2
- package/dist/terrain/shader-module.d.ts.map +1 -0
- package/dist/terrain/shader-module.js +137 -0
- package/{typed → dist}/terrain/terrain-cover.d.ts +1 -1
- package/dist/terrain/terrain-cover.d.ts.map +1 -0
- package/dist/terrain/terrain-cover.js +188 -0
- package/{typed → dist}/terrain/terrain-effect.d.ts +6 -7
- package/dist/terrain/terrain-effect.d.ts.map +1 -0
- package/dist/terrain/terrain-effect.js +174 -0
- package/dist/terrain/terrain-extension.js +44 -0
- package/dist/terrain/terrain-pass.d.ts +53 -0
- package/dist/terrain/terrain-pass.d.ts.map +1 -0
- package/dist/terrain/terrain-pass.js +69 -0
- package/{typed → dist}/terrain/terrain-picking-pass.d.ts +1 -1
- package/dist/terrain/terrain-picking-pass.d.ts.map +1 -0
- package/dist/terrain/terrain-picking-pass.js +67 -0
- package/{typed → dist}/terrain/utils.d.ts +1 -0
- package/{typed → dist}/terrain/utils.d.ts.map +1 -1
- package/dist/terrain/utils.js +25 -0
- package/{typed → dist}/utils/debug.d.ts.map +1 -1
- package/dist/utils/debug.js +50 -0
- package/dist/utils/projection-utils.js +153 -0
- package/dist/utils/syntax-tags.d.ts +6 -0
- package/dist/utils/syntax-tags.d.ts.map +1 -0
- package/dist/utils/syntax-tags.js +5 -0
- package/dist.min.js +918 -1254
- package/package.json +19 -16
- package/src/brushing/shader-module.ts +4 -3
- package/src/clip/clip-extension.ts +10 -9
- package/src/collision-filter/collision-filter-effect.ts +35 -31
- package/src/collision-filter/collision-filter-pass.ts +7 -13
- package/src/collision-filter/shader-module.ts +6 -4
- package/src/data-filter/aggregator.ts +8 -13
- package/src/data-filter/data-filter-extension.ts +181 -56
- package/src/data-filter/shader-module.ts +132 -37
- package/src/fill-style/fill-style-extension.ts +4 -5
- package/src/fill-style/{shaders.glsl.ts → shader-module.ts} +6 -5
- package/src/mask/mask-effect.ts +30 -20
- package/src/mask/mask-pass.ts +22 -18
- package/src/mask/shader-module.ts +7 -6
- package/src/path-style/path-style-extension.ts +1 -0
- package/src/terrain/shader-module.ts +14 -13
- package/src/terrain/terrain-cover.ts +2 -1
- package/src/terrain/terrain-effect.ts +19 -23
- package/src/terrain/terrain-pass.ts +37 -37
- package/src/terrain/terrain-picking-pass.ts +19 -25
- package/src/terrain/utils.ts +13 -7
- package/src/utils/debug.ts +1 -2
- package/src/utils/syntax-tags.ts +5 -0
- package/dist/es5/brushing/brushing-extension.js +0 -108
- package/dist/es5/brushing/brushing-extension.js.map +0 -1
- package/dist/es5/brushing/shader-module.js +0 -50
- package/dist/es5/brushing/shader-module.js.map +0 -1
- package/dist/es5/clip/clip-extension.js +0 -98
- package/dist/es5/clip/clip-extension.js.map +0 -1
- package/dist/es5/collision-filter/collision-filter-effect.js +0 -294
- package/dist/es5/collision-filter/collision-filter-effect.js.map +0 -1
- package/dist/es5/collision-filter/collision-filter-extension.js +0 -109
- package/dist/es5/collision-filter/collision-filter-extension.js.map +0 -1
- package/dist/es5/collision-filter/collision-filter-pass.js +0 -79
- package/dist/es5/collision-filter/collision-filter-pass.js.map +0 -1
- package/dist/es5/collision-filter/shader-module.js +0 -39
- package/dist/es5/collision-filter/shader-module.js.map +0 -1
- package/dist/es5/data-filter/aggregator.js +0 -79
- package/dist/es5/data-filter/aggregator.js.map +0 -1
- package/dist/es5/data-filter/data-filter-extension.js +0 -236
- package/dist/es5/data-filter/data-filter-extension.js.map +0 -1
- package/dist/es5/data-filter/shader-module.js +0 -122
- package/dist/es5/data-filter/shader-module.js.map +0 -1
- package/dist/es5/fill-style/fill-style-extension.js +0 -190
- package/dist/es5/fill-style/fill-style-extension.js.map +0 -1
- package/dist/es5/fill-style/shaders.glsl.js +0 -59
- package/dist/es5/fill-style/shaders.glsl.js.map +0 -1
- package/dist/es5/fp64/fp64-extension.js +0 -55
- package/dist/es5/fp64/fp64-extension.js.map +0 -1
- package/dist/es5/fp64/project64.glsl.js +0 -9
- package/dist/es5/fp64/project64.glsl.js.map +0 -1
- package/dist/es5/fp64/project64.js +0 -52
- package/dist/es5/fp64/project64.js.map +0 -1
- package/dist/es5/index.js +0 -88
- package/dist/es5/index.js.map +0 -1
- package/dist/es5/mask/mask-effect.js +0 -279
- package/dist/es5/mask/mask-effect.js.map +0 -1
- package/dist/es5/mask/mask-extension.js +0 -113
- package/dist/es5/mask/mask-extension.js.map +0 -1
- package/dist/es5/mask/mask-pass.js +0 -106
- package/dist/es5/mask/mask-pass.js.map +0 -1
- package/dist/es5/mask/shader-module.js +0 -38
- package/dist/es5/mask/shader-module.js.map +0 -1
- package/dist/es5/path-style/path-style-extension.js +0 -169
- package/dist/es5/path-style/path-style-extension.js.map +0 -1
- package/dist/es5/path-style/shaders.glsl.js +0 -25
- package/dist/es5/path-style/shaders.glsl.js.map +0 -1
- package/dist/es5/terrain/height-map-builder.js +0 -111
- package/dist/es5/terrain/height-map-builder.js.map +0 -1
- package/dist/es5/terrain/shader-module.js +0 -86
- package/dist/es5/terrain/shader-module.js.map +0 -1
- package/dist/es5/terrain/terrain-cover.js +0 -256
- package/dist/es5/terrain/terrain-cover.js.map +0 -1
- package/dist/es5/terrain/terrain-effect.js +0 -326
- package/dist/es5/terrain/terrain-effect.js.map +0 -1
- package/dist/es5/terrain/terrain-extension.js +0 -94
- package/dist/es5/terrain/terrain-extension.js.map +0 -1
- package/dist/es5/terrain/terrain-pass.js +0 -121
- package/dist/es5/terrain/terrain-pass.js.map +0 -1
- package/dist/es5/terrain/terrain-picking-pass.js +0 -124
- package/dist/es5/terrain/terrain-picking-pass.js.map +0 -1
- package/dist/es5/terrain/utils.js +0 -35
- package/dist/es5/terrain/utils.js.map +0 -1
- package/dist/es5/utils/debug.js +0 -71
- package/dist/es5/utils/debug.js.map +0 -1
- package/dist/es5/utils/projection-utils.js +0 -168
- package/dist/es5/utils/projection-utils.js.map +0 -1
- package/dist/esm/brushing/brushing-extension.js +0 -68
- package/dist/esm/brushing/brushing-extension.js.map +0 -1
- package/dist/esm/brushing/shader-module.js +0 -103
- package/dist/esm/brushing/shader-module.js.map +0 -1
- package/dist/esm/clip/clip-extension.js +0 -86
- package/dist/esm/clip/clip-extension.js.map +0 -1
- package/dist/esm/collision-filter/collision-filter-effect.js +0 -246
- package/dist/esm/collision-filter/collision-filter-effect.js.map +0 -1
- package/dist/esm/collision-filter/collision-filter-extension.js +0 -75
- package/dist/esm/collision-filter/collision-filter-extension.js.map +0 -1
- package/dist/esm/collision-filter/collision-filter-pass.js +0 -32
- package/dist/esm/collision-filter/collision-filter-pass.js.map +0 -1
- package/dist/esm/collision-filter/shader-module.js +0 -104
- package/dist/esm/collision-filter/shader-module.js.map +0 -1
- package/dist/esm/data-filter/aggregator.js.map +0 -1
- package/dist/esm/data-filter/data-filter-extension.js +0 -189
- package/dist/esm/data-filter/data-filter-extension.js.map +0 -1
- package/dist/esm/data-filter/shader-module.js +0 -164
- package/dist/esm/data-filter/shader-module.js.map +0 -1
- package/dist/esm/fill-style/fill-style-extension.js +0 -156
- package/dist/esm/fill-style/fill-style-extension.js.map +0 -1
- package/dist/esm/fill-style/shaders.glsl.js +0 -108
- package/dist/esm/fill-style/shaders.glsl.js.map +0 -1
- package/dist/esm/fp64/fp64-extension.js +0 -20
- package/dist/esm/fp64/fp64-extension.js.map +0 -1
- package/dist/esm/fp64/project64.glsl.js +0 -82
- package/dist/esm/fp64/project64.glsl.js.map +0 -1
- package/dist/esm/fp64/project64.js +0 -43
- package/dist/esm/fp64/project64.js.map +0 -1
- package/dist/esm/index.js +0 -11
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/mask/mask-effect.js +0 -228
- package/dist/esm/mask/mask-effect.js.map +0 -1
- package/dist/esm/mask/mask-extension.js +0 -83
- package/dist/esm/mask/mask-extension.js.map +0 -1
- package/dist/esm/mask/mask-pass.js +0 -58
- package/dist/esm/mask/mask-pass.js.map +0 -1
- package/dist/esm/mask/shader-module.js +0 -84
- package/dist/esm/mask/shader-module.js.map +0 -1
- package/dist/esm/path-style/path-style-extension.js +0 -130
- package/dist/esm/path-style/path-style-extension.js.map +0 -1
- package/dist/esm/path-style/shaders.glsl.js +0 -84
- package/dist/esm/path-style/shaders.glsl.js.map +0 -1
- package/dist/esm/terrain/height-map-builder.js +0 -86
- package/dist/esm/terrain/height-map-builder.js.map +0 -1
- package/dist/esm/terrain/shader-module.js +0 -127
- package/dist/esm/terrain/shader-module.js.map +0 -1
- package/dist/esm/terrain/terrain-cover.js +0 -212
- package/dist/esm/terrain/terrain-cover.js.map +0 -1
- package/dist/esm/terrain/terrain-effect.js +0 -219
- package/dist/esm/terrain/terrain-effect.js.map +0 -1
- package/dist/esm/terrain/terrain-extension.js +0 -59
- package/dist/esm/terrain/terrain-extension.js.map +0 -1
- package/dist/esm/terrain/terrain-pass.js +0 -71
- package/dist/esm/terrain/terrain-pass.js.map +0 -1
- package/dist/esm/terrain/terrain-picking-pass.js +0 -73
- package/dist/esm/terrain/terrain-picking-pass.js.map +0 -1
- package/dist/esm/terrain/utils.js +0 -19
- package/dist/esm/terrain/utils.js.map +0 -1
- package/dist/esm/utils/debug.js +0 -61
- package/dist/esm/utils/debug.js.map +0 -1
- package/dist/esm/utils/projection-utils.js +0 -134
- package/dist/esm/utils/projection-utils.js.map +0 -1
- package/typed/collision-filter/collision-filter-effect.d.ts.map +0 -1
- package/typed/collision-filter/collision-filter-pass.d.ts.map +0 -1
- package/typed/data-filter/aggregator.d.ts.map +0 -1
- package/typed/data-filter/data-filter-extension.d.ts.map +0 -1
- package/typed/data-filter/shader-module.d.ts +0 -9
- package/typed/data-filter/shader-module.d.ts.map +0 -1
- package/typed/fill-style/fill-style-extension.d.ts.map +0 -1
- package/typed/fill-style/shaders.glsl.d.ts.map +0 -1
- package/typed/index.d.ts +0 -19
- package/typed/index.d.ts.map +0 -1
- package/typed/mask/mask-effect.d.ts.map +0 -1
- package/typed/mask/mask-pass.d.ts +0 -19
- package/typed/mask/mask-pass.d.ts.map +0 -1
- package/typed/terrain/height-map-builder.d.ts.map +0 -1
- package/typed/terrain/shader-module.d.ts.map +0 -1
- package/typed/terrain/terrain-cover.d.ts.map +0 -1
- package/typed/terrain/terrain-effect.d.ts.map +0 -1
- package/typed/terrain/terrain-pass.d.ts +0 -11
- package/typed/terrain/terrain-pass.d.ts.map +0 -1
- package/typed/terrain/terrain-picking-pass.d.ts.map +0 -1
- /package/{typed → dist}/brushing/brushing-extension.d.ts +0 -0
- /package/{typed → dist}/brushing/brushing-extension.d.ts.map +0 -0
- /package/{typed → dist}/clip/clip-extension.d.ts +0 -0
- /package/{typed → dist}/collision-filter/collision-filter-extension.d.ts +0 -0
- /package/{typed → dist}/collision-filter/collision-filter-extension.d.ts.map +0 -0
- /package/{typed → dist}/collision-filter/shader-module.d.ts +0 -0
- /package/{typed → dist}/data-filter/aggregator.d.ts +0 -0
- /package/{typed → dist}/fp64/fp64-extension.d.ts +0 -0
- /package/{typed → dist}/fp64/fp64-extension.d.ts.map +0 -0
- /package/{typed → dist}/fp64/project64.d.ts +0 -0
- /package/{typed → dist}/fp64/project64.d.ts.map +0 -0
- /package/{typed → dist}/fp64/project64.glsl.d.ts +0 -0
- /package/{typed → dist}/fp64/project64.glsl.d.ts.map +0 -0
- /package/{typed → dist}/mask/mask-extension.d.ts +0 -0
- /package/{typed → dist}/mask/mask-extension.d.ts.map +0 -0
- /package/{typed → dist}/mask/shader-module.d.ts +0 -0
- /package/{typed → dist}/path-style/path-style-extension.d.ts +0 -0
- /package/{typed → dist}/path-style/shaders.glsl.d.ts +0 -0
- /package/{typed → dist}/path-style/shaders.glsl.d.ts.map +0 -0
- /package/{typed → dist}/terrain/terrain-extension.d.ts +0 -0
- /package/{typed → dist}/terrain/terrain-extension.d.ts.map +0 -0
- /package/{typed → dist}/utils/debug.d.ts +0 -0
- /package/{typed → dist}/utils/projection-utils.d.ts +0 -0
- /package/{typed → dist}/utils/projection-utils.d.ts.map +0 -0
package/src/mask/mask-effect.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
Layer,
|
|
3
|
+
Viewport,
|
|
4
|
+
Effect,
|
|
5
|
+
EffectContext,
|
|
6
|
+
PreRenderOptions,
|
|
7
|
+
CoordinateSystem,
|
|
8
|
+
log
|
|
9
|
+
} from '@deck.gl/core';
|
|
10
|
+
import type {Texture} from '@luma.gl/core';
|
|
4
11
|
import {equals} from '@math.gl/core';
|
|
5
12
|
import MaskPass from './mask-pass';
|
|
6
13
|
import {joinLayerBounds, getRenderBounds, makeViewport, Bounds} from '../utils/projection-utils';
|
|
@@ -8,7 +15,7 @@ import {joinLayerBounds, getRenderBounds, makeViewport, Bounds} from '../utils/p
|
|
|
8
15
|
|
|
9
16
|
type Mask = {
|
|
10
17
|
/** The channel index */
|
|
11
|
-
index:
|
|
18
|
+
index: 0 | 1 | 2 | 3;
|
|
12
19
|
bounds: Bounds;
|
|
13
20
|
coordinateOrigin: [number, number, number];
|
|
14
21
|
coordinateSystem: CoordinateSystem;
|
|
@@ -16,7 +23,7 @@ type Mask = {
|
|
|
16
23
|
|
|
17
24
|
type Channel = {
|
|
18
25
|
id: string;
|
|
19
|
-
index:
|
|
26
|
+
index: 0 | 1 | 2 | 3;
|
|
20
27
|
layers: Layer[];
|
|
21
28
|
bounds: Bounds | null;
|
|
22
29
|
maskBounds: Bounds;
|
|
@@ -43,17 +50,25 @@ export default class MaskEffect implements Effect {
|
|
|
43
50
|
private maskMap?: Texture;
|
|
44
51
|
private lastViewport?: Viewport;
|
|
45
52
|
|
|
46
|
-
|
|
47
|
-
device
|
|
48
|
-
|
|
49
|
-
|
|
53
|
+
setup({device}: EffectContext) {
|
|
54
|
+
this.dummyMaskMap = device.createTexture({
|
|
55
|
+
width: 1,
|
|
56
|
+
height: 1
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
this.maskPass = new MaskPass(device, {id: 'default-mask'});
|
|
60
|
+
this.maskMap = this.maskPass.maskMap;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
preRender({
|
|
64
|
+
layers,
|
|
65
|
+
layerFilter,
|
|
66
|
+
viewports,
|
|
67
|
+
onViewportActive,
|
|
68
|
+
views,
|
|
69
|
+
isPicking
|
|
70
|
+
}: PreRenderOptions): MaskPreRenderStats {
|
|
50
71
|
let didRender = false;
|
|
51
|
-
if (!this.dummyMaskMap) {
|
|
52
|
-
this.dummyMaskMap = device.createTexture({
|
|
53
|
-
width: 1,
|
|
54
|
-
height: 1
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
72
|
|
|
58
73
|
if (isPicking) {
|
|
59
74
|
// Do not update on picking pass
|
|
@@ -68,11 +83,6 @@ export default class MaskEffect implements Effect {
|
|
|
68
83
|
}
|
|
69
84
|
this.masks = {};
|
|
70
85
|
|
|
71
|
-
if (!this.maskPass) {
|
|
72
|
-
this.maskPass = new MaskPass(device, {id: 'default-mask'});
|
|
73
|
-
this.maskMap = this.maskPass.maskMap;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
86
|
// Map layers to channels
|
|
77
87
|
const channelMap = this._sortMaskChannels(maskLayers);
|
|
78
88
|
// TODO - support multiple views
|
package/src/mask/mask-pass.ts
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import type {Device, Framebuffer, Texture} from '@luma.gl/core';
|
|
2
|
-
import {
|
|
3
|
-
import {GL} from '@luma.gl/constants';
|
|
4
|
-
import {_LayersPass as LayersPass, LayersPassRenderOptions} from '@deck.gl/core';
|
|
1
|
+
import type {Device, Framebuffer, RenderPipelineParameters, Texture} from '@luma.gl/core';
|
|
2
|
+
import {Layer, _LayersPass as LayersPass, LayersPassRenderOptions, Viewport} from '@deck.gl/core';
|
|
5
3
|
|
|
6
4
|
type MaskPassRenderOptions = LayersPassRenderOptions & {
|
|
7
5
|
/** The channel to render into, 0:red, 1:green, 2:blue, 3:alpha */
|
|
8
|
-
channel:
|
|
6
|
+
channel: 0 | 1 | 2 | 3;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const MASK_BLENDING: RenderPipelineParameters = {
|
|
10
|
+
blendColorOperation: 'subtract',
|
|
11
|
+
blendColorSrcFactor: 'zero',
|
|
12
|
+
blendColorDstFactor: 'one',
|
|
13
|
+
blendAlphaOperation: 'subtract',
|
|
14
|
+
blendAlphaSrcFactor: 'zero',
|
|
15
|
+
blendAlphaDstFactor: 'one'
|
|
9
16
|
};
|
|
10
17
|
|
|
11
18
|
export default class MaskPass extends LayersPass {
|
|
@@ -38,21 +45,18 @@ export default class MaskPass extends LayersPass {
|
|
|
38
45
|
}
|
|
39
46
|
|
|
40
47
|
render(options: MaskPassRenderOptions) {
|
|
41
|
-
const colorMask =
|
|
42
|
-
colorMask[options.channel] = true;
|
|
48
|
+
const colorMask = 2 ** options.channel;
|
|
43
49
|
const clearColor = [255, 255, 255, 255];
|
|
50
|
+
super.render({...options, clearColor, colorMask, target: this.fbo, pass: 'mask'});
|
|
51
|
+
}
|
|
44
52
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
depthTest: false
|
|
53
|
-
},
|
|
54
|
-
() => super.render({...options, clearColor, target: this.fbo, pass: 'mask'})
|
|
55
|
-
);
|
|
53
|
+
protected getLayerParameters(layer: Layer<{}>, layerIndex: number, viewport: Viewport) {
|
|
54
|
+
return {
|
|
55
|
+
...layer.props.parameters,
|
|
56
|
+
blend: true,
|
|
57
|
+
depthTest: false,
|
|
58
|
+
...MASK_BLENDING
|
|
59
|
+
};
|
|
56
60
|
}
|
|
57
61
|
|
|
58
62
|
shouldDrawLayer(layer) {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type {ShaderModule} from '@luma.gl/shadertools';
|
|
2
2
|
import {project} from '@deck.gl/core';
|
|
3
3
|
import type {Texture} from '@luma.gl/core';
|
|
4
|
+
import {glsl} from '../utils/syntax-tags';
|
|
4
5
|
|
|
5
|
-
const vs = `
|
|
6
|
+
const vs = glsl`
|
|
6
7
|
uniform vec4 mask_bounds;
|
|
7
8
|
uniform bool mask_maskByInstance;
|
|
8
9
|
vec2 mask_getCoords(vec4 position) {
|
|
@@ -10,7 +11,7 @@ vec2 mask_getCoords(vec4 position) {
|
|
|
10
11
|
}
|
|
11
12
|
`;
|
|
12
13
|
|
|
13
|
-
const fs = `
|
|
14
|
+
const fs = glsl`
|
|
14
15
|
uniform sampler2D mask_texture;
|
|
15
16
|
uniform int mask_channel;
|
|
16
17
|
uniform bool mask_enabled;
|
|
@@ -40,10 +41,10 @@ bool mask_isInBounds(vec2 texCoords) {
|
|
|
40
41
|
`;
|
|
41
42
|
|
|
42
43
|
const inject = {
|
|
43
|
-
'vs:#decl': `
|
|
44
|
+
'vs:#decl': glsl`
|
|
44
45
|
out vec2 mask_texCoords;
|
|
45
46
|
`,
|
|
46
|
-
'vs:#main-end': `
|
|
47
|
+
'vs:#main-end': glsl`
|
|
47
48
|
vec4 mask_common_position;
|
|
48
49
|
if (mask_maskByInstance) {
|
|
49
50
|
mask_common_position = project_position(vec4(geometry.worldPosition, 1.0));
|
|
@@ -52,10 +53,10 @@ out vec2 mask_texCoords;
|
|
|
52
53
|
}
|
|
53
54
|
mask_texCoords = mask_getCoords(mask_common_position);
|
|
54
55
|
`,
|
|
55
|
-
'fs:#decl': `
|
|
56
|
+
'fs:#decl': glsl`
|
|
56
57
|
in vec2 mask_texCoords;
|
|
57
58
|
`,
|
|
58
|
-
'fs:#main-start': `
|
|
59
|
+
'fs:#main-start': glsl`
|
|
59
60
|
if (mask_enabled) {
|
|
60
61
|
bool mask = mask_isInBounds(mask_texCoords);
|
|
61
62
|
|
|
@@ -6,6 +6,7 @@ import {project} from '@deck.gl/core';
|
|
|
6
6
|
import type {Texture} from '@luma.gl/core';
|
|
7
7
|
import type {Bounds} from '../utils/projection-utils';
|
|
8
8
|
import type {TerrainCover} from './terrain-cover';
|
|
9
|
+
import {glsl} from '../utils/syntax-tags';
|
|
9
10
|
|
|
10
11
|
/** Module parameters expected by the terrain shader module */
|
|
11
12
|
export type TerrainModuleSettings = {
|
|
@@ -43,20 +44,20 @@ export const terrainModule = {
|
|
|
43
44
|
name: 'terrain',
|
|
44
45
|
dependencies: [project],
|
|
45
46
|
inject: {
|
|
46
|
-
'vs:#decl':
|
|
47
|
+
'vs:#decl':
|
|
48
|
+
glsl`
|
|
47
49
|
uniform float terrain_mode;
|
|
48
50
|
uniform sampler2D terrain_map;
|
|
49
51
|
uniform vec4 terrain_bounds;
|
|
50
52
|
out vec3 commonPos;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
'vs:#main-start': `
|
|
53
|
+
` + TERRAIN_MODE_CONSTANTS,
|
|
54
|
+
'vs:#main-start': glsl`
|
|
54
55
|
if (terrain_mode == TERRAIN_MODE_SKIP) {
|
|
55
56
|
gl_Position = vec4(0.0);
|
|
56
57
|
return;
|
|
57
58
|
}
|
|
58
59
|
`,
|
|
59
|
-
'vs:DECKGL_FILTER_GL_POSITION': `
|
|
60
|
+
'vs:DECKGL_FILTER_GL_POSITION': glsl`
|
|
60
61
|
commonPos = geometry.position.xyz;
|
|
61
62
|
if (terrain_mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {
|
|
62
63
|
vec2 texCoords = (commonPos.xy - terrain_bounds.xy) / terrain_bounds.zw;
|
|
@@ -75,20 +76,20 @@ if (terrain_mode == TERRAIN_MODE_USE_HEIGHT_MAP) {
|
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
`,
|
|
78
|
-
'fs:#decl':
|
|
79
|
+
'fs:#decl':
|
|
80
|
+
glsl`
|
|
79
81
|
uniform float terrain_mode;
|
|
80
82
|
uniform sampler2D terrain_map;
|
|
81
83
|
uniform vec4 terrain_bounds;
|
|
82
84
|
in vec3 commonPos;
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
'fs:#main-start': `
|
|
85
|
+
` + TERRAIN_MODE_CONSTANTS,
|
|
86
|
+
'fs:#main-start': glsl`
|
|
86
87
|
if (terrain_mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {
|
|
87
88
|
fragColor = vec4(commonPos.z, 0.0, 0.0, 1.0);
|
|
88
89
|
return;
|
|
89
90
|
}
|
|
90
91
|
`,
|
|
91
|
-
'fs:DECKGL_FILTER_COLOR': `
|
|
92
|
+
'fs:DECKGL_FILTER_COLOR': glsl`
|
|
92
93
|
if ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_USE_COVER_ONLY)) {
|
|
93
94
|
vec2 texCoords = (commonPos.xy - terrain_bounds.xy) / terrain_bounds.zw;
|
|
94
95
|
vec4 pixel = texture(terrain_map, texCoords);
|
|
@@ -118,7 +119,7 @@ if ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_US
|
|
|
118
119
|
|
|
119
120
|
let mode: number = terrainSkipRender ? TERRAIN_MODE.SKIP : TERRAIN_MODE.NONE;
|
|
120
121
|
// height map if case USE_HEIGHT_MAP, terrain cover if USE_COVER, otherwise empty
|
|
121
|
-
let sampler = dummyHeightMap as Texture;
|
|
122
|
+
let sampler: Texture | undefined = dummyHeightMap as Texture;
|
|
122
123
|
// height map bounds if case USE_HEIGHT_MAP, terrain cover bounds if USE_COVER, otherwise null
|
|
123
124
|
let bounds: number[] | null = null;
|
|
124
125
|
if (drawToTerrainHeightMap) {
|
|
@@ -131,10 +132,10 @@ if ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_US
|
|
|
131
132
|
} else if (terrainCover) {
|
|
132
133
|
// This is a terrain layer
|
|
133
134
|
const isPicking = opts.picking?.isActive;
|
|
134
|
-
|
|
135
|
-
sampler = isPicking
|
|
135
|
+
const fbo = isPicking
|
|
136
136
|
? terrainCover.getPickingFramebuffer()
|
|
137
137
|
: terrainCover.getRenderFramebuffer();
|
|
138
|
+
sampler = fbo?.colorAttachments[0].texture;
|
|
138
139
|
if (isPicking) {
|
|
139
140
|
// Never render the layer itself in picking pass
|
|
140
141
|
mode = TERRAIN_MODE.SKIP;
|
|
@@ -174,7 +174,8 @@ export class TerrainCover {
|
|
|
174
174
|
}
|
|
175
175
|
if (!this.pickingFbo) {
|
|
176
176
|
this.pickingFbo = createRenderTarget(this.targetLayer.context.device, {
|
|
177
|
-
id: `${this.id}-picking
|
|
177
|
+
id: `${this.id}-picking`,
|
|
178
|
+
interpolate: false
|
|
178
179
|
});
|
|
179
180
|
}
|
|
180
181
|
return this.pickingFbo;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {log
|
|
1
|
+
import {Texture} from '@luma.gl/core';
|
|
2
|
+
import {log} from '@deck.gl/core';
|
|
3
3
|
|
|
4
4
|
import {terrainModule, TerrainModuleSettings} from './shader-module';
|
|
5
5
|
import {TerrainCover} from './terrain-cover';
|
|
@@ -7,7 +7,7 @@ import {TerrainPass} from './terrain-pass';
|
|
|
7
7
|
import {TerrainPickingPass, TerrainPickingPassRenderOptions} from './terrain-picking-pass';
|
|
8
8
|
import {HeightMapBuilder} from './height-map-builder';
|
|
9
9
|
|
|
10
|
-
import type {Effect, PreRenderOptions, Layer, Viewport} from '@deck.gl/core';
|
|
10
|
+
import type {Effect, EffectContext, PreRenderOptions, Layer, Viewport} from '@deck.gl/core';
|
|
11
11
|
|
|
12
12
|
/** Class to manage terrain effect */
|
|
13
13
|
export class TerrainEffect implements Effect {
|
|
@@ -28,7 +28,7 @@ export class TerrainEffect implements Effect {
|
|
|
28
28
|
/** One texture for each primitive terrain layer, into which the draped layers render */
|
|
29
29
|
private terrainCovers: Map<string, TerrainCover> = new Map();
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
setup({device, deck}: EffectContext) {
|
|
32
32
|
this.dummyHeightMap = device.createTexture({
|
|
33
33
|
width: 1,
|
|
34
34
|
height: 1,
|
|
@@ -43,21 +43,10 @@ export class TerrainEffect implements Effect {
|
|
|
43
43
|
log.warn('Terrain offset mode is not supported by this browser')();
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
deck._addDefaultShaderModule(terrainModule);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
preRender(
|
|
50
|
-
if (!this.dummyHeightMap) {
|
|
51
|
-
// First time this effect is in use, initialize resources and register the shader module
|
|
52
|
-
this.initialize(device);
|
|
53
|
-
for (const layer of opts.layers) {
|
|
54
|
-
// Force the terrain layer (and its descendents) to rebuild their models with the new shader
|
|
55
|
-
if (layer.props.operation.includes('terrain')) {
|
|
56
|
-
layer.setChangeFlags({extensionsChanged: true});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
49
|
+
preRender(opts: PreRenderOptions): void {
|
|
61
50
|
// @ts-expect-error pickZ only defined in picking pass
|
|
62
51
|
if (opts.pickZ) {
|
|
63
52
|
// Do not update if picking attributes
|
|
@@ -65,7 +54,8 @@ export class TerrainEffect implements Effect {
|
|
|
65
54
|
return;
|
|
66
55
|
}
|
|
67
56
|
|
|
68
|
-
const {viewports
|
|
57
|
+
const {viewports} = opts;
|
|
58
|
+
const isPicking = opts.pass.startsWith('picking');
|
|
69
59
|
this.isPicking = isPicking;
|
|
70
60
|
this.isDrapingEnabled = true;
|
|
71
61
|
|
|
@@ -92,12 +82,11 @@ export class TerrainEffect implements Effect {
|
|
|
92
82
|
this._updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts);
|
|
93
83
|
}
|
|
94
84
|
|
|
95
|
-
getModuleParameters(layer: Layer): TerrainModuleSettings {
|
|
85
|
+
getModuleParameters(layer: Layer): Omit<TerrainModuleSettings, 'picking'> {
|
|
96
86
|
const {terrainDrawMode} = layer.state;
|
|
97
87
|
|
|
98
88
|
return {
|
|
99
|
-
|
|
100
|
-
heightMap: this.heightMap?.getRenderFramebuffer(),
|
|
89
|
+
heightMap: this.heightMap?.getRenderFramebuffer()?.colorAttachments[0].texture || null,
|
|
101
90
|
heightMapBounds: this.heightMap?.bounds,
|
|
102
91
|
dummyHeightMap: this.dummyHeightMap!,
|
|
103
92
|
terrainCover: this.isDrapingEnabled ? this.terrainCovers.get(layer.id) : null,
|
|
@@ -106,7 +95,7 @@ export class TerrainEffect implements Effect {
|
|
|
106
95
|
};
|
|
107
96
|
}
|
|
108
97
|
|
|
109
|
-
cleanup(): void {
|
|
98
|
+
cleanup({deck}: EffectContext): void {
|
|
110
99
|
if (this.dummyHeightMap) {
|
|
111
100
|
this.dummyHeightMap.delete();
|
|
112
101
|
this.dummyHeightMap = undefined;
|
|
@@ -121,6 +110,8 @@ export class TerrainEffect implements Effect {
|
|
|
121
110
|
terrainCover.delete();
|
|
122
111
|
}
|
|
123
112
|
this.terrainCovers.clear();
|
|
113
|
+
|
|
114
|
+
deck._removeDefaultShaderModule(terrainModule);
|
|
124
115
|
}
|
|
125
116
|
|
|
126
117
|
private _updateHeightMap(terrainLayers: Layer[], viewport: Viewport, opts: PreRenderOptions) {
|
|
@@ -201,7 +192,12 @@ export class TerrainEffect implements Effect {
|
|
|
201
192
|
devicePixelRatio: 1
|
|
202
193
|
}
|
|
203
194
|
});
|
|
204
|
-
|
|
195
|
+
|
|
196
|
+
if (!this.isPicking) {
|
|
197
|
+
// IsDirty refers to the normal fbo, not the picking fbo.
|
|
198
|
+
// Only mark it as not dirty if the normal fbo was updated.
|
|
199
|
+
terrainCover.isDirty = false;
|
|
200
|
+
}
|
|
205
201
|
}
|
|
206
202
|
} catch (err) {
|
|
207
203
|
terrainLayer.raiseError(err as Error, `Error rendering terrain cover ${terrainCover.id}`);
|
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {GL} from '@luma.gl/constants';
|
|
1
|
+
import {RenderPipelineParameters} from '@luma.gl/core';
|
|
3
2
|
import {Layer, Viewport, _LayersPass as LayersPass, LayersPassRenderOptions} from '@deck.gl/core';
|
|
4
3
|
import type {HeightMapBuilder} from './height-map-builder';
|
|
5
4
|
import type {TerrainCover} from './terrain-cover';
|
|
6
5
|
|
|
7
6
|
export type TerrainPassRenderOptions = LayersPassRenderOptions;
|
|
8
7
|
|
|
8
|
+
const TERRAIN_BLENDING: RenderPipelineParameters = {
|
|
9
|
+
blendColorOperation: 'max',
|
|
10
|
+
blendColorSrcFactor: 'one',
|
|
11
|
+
blendColorDstFactor: 'one',
|
|
12
|
+
blendAlphaOperation: 'max',
|
|
13
|
+
blendAlphaSrcFactor: 'one',
|
|
14
|
+
blendAlphaDstFactor: 'one'
|
|
15
|
+
};
|
|
16
|
+
|
|
9
17
|
/** Renders textures used by the TerrainEffect render pass */
|
|
10
18
|
export class TerrainPass extends LayersPass {
|
|
11
19
|
getRenderableLayers(viewport: Viewport, opts: TerrainPassRenderOptions): Layer[] {
|
|
@@ -33,25 +41,15 @@ export class TerrainPass extends LayersPass {
|
|
|
33
41
|
|
|
34
42
|
target.resize(viewport);
|
|
35
43
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
() =>
|
|
46
|
-
this.render({
|
|
47
|
-
...opts,
|
|
48
|
-
target,
|
|
49
|
-
pass: 'terrain-height-map',
|
|
50
|
-
layers: opts.layers!,
|
|
51
|
-
viewports: [viewport],
|
|
52
|
-
effects: []
|
|
53
|
-
})
|
|
54
|
-
);
|
|
44
|
+
this.render({
|
|
45
|
+
...opts,
|
|
46
|
+
target,
|
|
47
|
+
pass: 'terrain-height-map',
|
|
48
|
+
layers: opts.layers!,
|
|
49
|
+
viewports: [viewport],
|
|
50
|
+
effects: [],
|
|
51
|
+
clearColor: [0, 0, 0, 0]
|
|
52
|
+
});
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
renderTerrainCover(terrainCover: TerrainCover, opts: Partial<TerrainPassRenderOptions>) {
|
|
@@ -66,21 +64,23 @@ export class TerrainPass extends LayersPass {
|
|
|
66
64
|
const layers = terrainCover.filterLayers(opts.layers!);
|
|
67
65
|
target.resize(viewport);
|
|
68
66
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
67
|
+
this.render({
|
|
68
|
+
...opts,
|
|
69
|
+
target,
|
|
70
|
+
pass: `terrain-cover-${terrainCover.id}`,
|
|
71
|
+
layers,
|
|
72
|
+
effects: [],
|
|
73
|
+
viewports: [viewport],
|
|
74
|
+
clearColor: [0, 0, 0, 0]
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
protected getLayerParameters(layer: Layer<{}>, layerIndex: number, viewport: Viewport) {
|
|
79
|
+
return {
|
|
80
|
+
...layer.props.parameters,
|
|
81
|
+
blend: true,
|
|
82
|
+
depthTest: false,
|
|
83
|
+
...(layer.props.operation.includes('terrain') && TERRAIN_BLENDING)
|
|
84
|
+
};
|
|
85
85
|
}
|
|
86
86
|
}
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
LayersPassRenderOptions,
|
|
5
5
|
_PickLayersPass as PickLayersPass
|
|
6
6
|
} from '@deck.gl/core';
|
|
7
|
-
import {withGLParameters} from '@luma.gl/webgl';
|
|
8
7
|
import type {TerrainCover} from './terrain-cover';
|
|
9
8
|
|
|
10
9
|
export type TerrainPickingPassRenderOptions = LayersPassRenderOptions & {
|
|
@@ -54,34 +53,29 @@ export class TerrainPickingPass extends PickLayersPass {
|
|
|
54
53
|
}
|
|
55
54
|
target.resize(viewport);
|
|
56
55
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
// Disable the default culling because TileLayer would cull sublayers based on the screen viewport,
|
|
71
|
-
// not the viewport of the terrain cover. Culling is already done by `terrainCover.filterLayers`
|
|
72
|
-
cullRect: undefined,
|
|
73
|
-
deviceRect: viewport,
|
|
74
|
-
pickZ: false
|
|
75
|
-
})
|
|
76
|
-
);
|
|
56
|
+
this.render({
|
|
57
|
+
...opts,
|
|
58
|
+
pickingFBO: target,
|
|
59
|
+
pass: `terrain-cover-picking-${terrainCover.id}`,
|
|
60
|
+
layers,
|
|
61
|
+
effects: [],
|
|
62
|
+
viewports: [viewport],
|
|
63
|
+
// Disable the default culling because TileLayer would cull sublayers based on the screen viewport,
|
|
64
|
+
// not the viewport of the terrain cover. Culling is already done by `terrainCover.filterLayers`
|
|
65
|
+
cullRect: undefined,
|
|
66
|
+
deviceRect: viewport,
|
|
67
|
+
pickZ: false
|
|
68
|
+
});
|
|
77
69
|
}
|
|
78
70
|
|
|
79
71
|
protected getLayerParameters(layer: Layer, layerIndex: number, viewport: Viewport): any {
|
|
72
|
+
let parameters: any;
|
|
80
73
|
if (this.drawParameters[layer.id]) {
|
|
81
|
-
|
|
74
|
+
parameters = this.drawParameters[layer.id];
|
|
75
|
+
} else {
|
|
76
|
+
parameters = super.getLayerParameters(layer, layerIndex, viewport);
|
|
77
|
+
parameters.blend = true;
|
|
82
78
|
}
|
|
83
|
-
|
|
84
|
-
parameters.blend = true;
|
|
85
|
-
return parameters;
|
|
79
|
+
return {...parameters, depthTest: false};
|
|
86
80
|
}
|
|
87
81
|
}
|
package/src/terrain/utils.ts
CHANGED
|
@@ -6,23 +6,29 @@ export function createRenderTarget(
|
|
|
6
6
|
opts: {
|
|
7
7
|
id: string;
|
|
8
8
|
float?: boolean;
|
|
9
|
+
interpolate?: boolean;
|
|
9
10
|
}
|
|
10
11
|
) {
|
|
11
12
|
return device.createFramebuffer({
|
|
12
13
|
id: opts.id,
|
|
13
14
|
colorAttachments: [
|
|
14
15
|
device.createTexture({
|
|
16
|
+
id: opts.id,
|
|
15
17
|
...(opts.float && {
|
|
16
|
-
format:
|
|
18
|
+
format: 'rgba32float',
|
|
17
19
|
type: GL.FLOAT
|
|
18
20
|
}),
|
|
19
21
|
mipmaps: false,
|
|
20
|
-
sampler:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
sampler:
|
|
23
|
+
opts.interpolate === false
|
|
24
|
+
? {
|
|
25
|
+
minFilter: 'nearest',
|
|
26
|
+
magFilter: 'nearest'
|
|
27
|
+
}
|
|
28
|
+
: {
|
|
29
|
+
minFilter: 'linear',
|
|
30
|
+
magFilter: 'linear'
|
|
31
|
+
}
|
|
26
32
|
})
|
|
27
33
|
]
|
|
28
34
|
});
|
package/src/utils/debug.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/* global document */
|
|
2
2
|
|
|
3
3
|
import {Framebuffer} from '@luma.gl/core';
|
|
4
|
-
import {readPixelsToArray} from '@luma.gl/webgl';
|
|
5
4
|
|
|
6
5
|
/** Debug utility to draw FBO contents onto screen */
|
|
7
6
|
// eslint-disable-next-line
|
|
@@ -9,7 +8,7 @@ export const debugFBO = function (
|
|
|
9
8
|
fbo: Framebuffer,
|
|
10
9
|
{minimap, opaque}: {minimap?: boolean; opaque?: boolean} = {}
|
|
11
10
|
) {
|
|
12
|
-
const color =
|
|
11
|
+
const color = fbo.device.readPixelsToArrayWebGL(fbo);
|
|
13
12
|
let canvas = document.getElementById('fbo-canvas') as HTMLCanvasElement;
|
|
14
13
|
const canvasHeight = (minimap ? 2 : 1) * fbo.height;
|
|
15
14
|
if (!canvas) {
|