@deck.gl/extensions 9.0.0-beta.2 → 9.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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/{esm/brushing → brushing}/shader-module.js +24 -30
- package/dist/clip/clip-extension.js +117 -0
- package/{typed → dist}/collision-filter/collision-filter-effect.d.ts.map +1 -1
- package/dist/collision-filter/collision-filter-effect.js +193 -0
- package/dist/collision-filter/collision-filter-extension.js +49 -0
- package/{typed → dist}/collision-filter/collision-filter-pass.d.ts.map +1 -1
- package/dist/collision-filter/collision-filter-pass.js +25 -0
- package/dist/{esm/collision-filter → collision-filter}/shader-module.js +17 -24
- package/dist/data-filter/aggregator.js +104 -0
- package/{typed → dist}/data-filter/data-filter-extension.d.ts +36 -5
- package/dist/data-filter/data-filter-extension.d.ts.map +1 -0
- package/dist/data-filter/data-filter-extension.js +243 -0
- package/{typed → dist}/data-filter/shader-module.d.ts +1 -1
- package/dist/data-filter/shader-module.d.ts.map +1 -0
- package/dist/data-filter/shader-module.js +187 -0
- package/dist/dist.dev.js +1847 -13033
- package/dist/fill-style/fill-style-extension.js +118 -0
- package/dist/{esm/fill-style → fill-style}/shaders.glsl.js +37 -43
- package/dist/fp64/fp64-extension.js +35 -0
- package/dist/{esm/fp64 → fp64}/project64.glsl.js +19 -1
- package/dist/fp64/project64.js +50 -0
- package/dist/index.cjs +2814 -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 +1 -1
- package/dist/mask/mask-effect.d.ts.map +1 -0
- package/dist/mask/mask-effect.js +194 -0
- package/dist/mask/mask-extension.js +57 -0
- package/{typed → dist}/mask/mask-pass.d.ts.map +1 -1
- package/dist/mask/mask-pass.js +44 -0
- package/dist/{esm/mask → mask}/shader-module.js +18 -21
- package/dist/path-style/path-style-extension.js +111 -0
- package/dist/{esm/path-style → path-style}/shaders.glsl.js +20 -13
- 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 +139 -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 +187 -0
- package/{typed → dist}/terrain/terrain-effect.d.ts +1 -1
- package/dist/terrain/terrain-effect.d.ts.map +1 -0
- package/dist/terrain/terrain-effect.js +184 -0
- package/dist/terrain/terrain-extension.js +44 -0
- package/{typed → dist}/terrain/terrain-pass.d.ts +2 -2
- package/dist/terrain/terrain-pass.d.ts.map +1 -0
- package/dist/terrain/terrain-pass.js +61 -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 +66 -0
- package/dist/terrain/utils.js +21 -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.min.js +104 -208
- package/package.json +19 -12
- package/src/collision-filter/collision-filter-effect.ts +12 -8
- package/src/collision-filter/collision-filter-pass.ts +1 -3
- package/src/data-filter/data-filter-extension.ts +136 -29
- package/src/data-filter/shader-module.ts +31 -3
- package/src/mask/mask-effect.ts +0 -1
- package/src/mask/mask-pass.ts +1 -3
- package/src/terrain/terrain-effect.ts +8 -2
- package/src/terrain/terrain-pass.ts +2 -5
- package/src/terrain/terrain-picking-pass.ts +1 -3
- package/src/utils/debug.ts +1 -2
- 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.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.map +0 -1
- package/dist/esm/data-filter/aggregator.js +0 -102
- 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.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.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.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.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/data-filter/data-filter-extension.d.ts.map +0 -1
- package/typed/data-filter/shader-module.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/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.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}/clip/clip-extension.d.ts.map +0 -0
- /package/{typed → dist}/collision-filter/collision-filter-effect.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/collision-filter-pass.d.ts +0 -0
- /package/{typed → dist}/collision-filter/shader-module.d.ts +0 -0
- /package/{typed → dist}/collision-filter/shader-module.d.ts.map +0 -0
- /package/{typed → dist}/data-filter/aggregator.d.ts +0 -0
- /package/{typed → dist}/data-filter/aggregator.d.ts.map +0 -0
- /package/{typed → dist}/fill-style/fill-style-extension.d.ts +0 -0
- /package/{typed → dist}/fill-style/fill-style-extension.d.ts.map +0 -0
- /package/{typed → dist}/fill-style/shaders.glsl.d.ts +0 -0
- /package/{typed → dist}/fill-style/shaders.glsl.d.ts.map +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/mask-pass.d.ts +0 -0
- /package/{typed → dist}/mask/shader-module.d.ts +0 -0
- /package/{typed → dist}/mask/shader-module.d.ts.map +0 -0
- /package/{typed → dist}/path-style/path-style-extension.d.ts +0 -0
- /package/{typed → dist}/path-style/path-style-extension.d.ts.map +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}/terrain/utils.d.ts +0 -0
- /package/{typed → dist}/terrain/utils.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
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import { log, getShaderAssembler } from '@deck.gl/core';
|
|
2
|
-
import { terrainModule } from './shader-module';
|
|
3
|
-
import { TerrainCover } from './terrain-cover';
|
|
4
|
-
import { TerrainPass } from './terrain-pass';
|
|
5
|
-
import { TerrainPickingPass } from './terrain-picking-pass';
|
|
6
|
-
import { HeightMapBuilder } from './height-map-builder';
|
|
7
|
-
export class TerrainEffect {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.id = 'terrain-effect';
|
|
10
|
-
this.props = null;
|
|
11
|
-
this.useInPicking = true;
|
|
12
|
-
this.isPicking = false;
|
|
13
|
-
this.isDrapingEnabled = false;
|
|
14
|
-
this.dummyHeightMap = void 0;
|
|
15
|
-
this.heightMap = void 0;
|
|
16
|
-
this.terrainPass = void 0;
|
|
17
|
-
this.terrainPickingPass = void 0;
|
|
18
|
-
this.terrainCovers = new Map();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
initialize(device) {
|
|
22
|
-
this.dummyHeightMap = device.createTexture({
|
|
23
|
-
width: 1,
|
|
24
|
-
height: 1,
|
|
25
|
-
data: new Uint8Array([0, 0, 0, 0])
|
|
26
|
-
});
|
|
27
|
-
this.terrainPass = new TerrainPass(device, {
|
|
28
|
-
id: 'terrain'
|
|
29
|
-
});
|
|
30
|
-
this.terrainPickingPass = new TerrainPickingPass(device, {
|
|
31
|
-
id: 'terrain-picking'
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
if (HeightMapBuilder.isSupported(device)) {
|
|
35
|
-
this.heightMap = new HeightMapBuilder(device);
|
|
36
|
-
} else {
|
|
37
|
-
log.warn('Terrain offset mode is not supported by this browser')();
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
getShaderAssembler().addDefaultModule(terrainModule);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
preRender(device, opts) {
|
|
44
|
-
if (!this.dummyHeightMap) {
|
|
45
|
-
this.initialize(device);
|
|
46
|
-
|
|
47
|
-
for (const layer of opts.layers) {
|
|
48
|
-
if (layer.props.operation.includes('terrain')) {
|
|
49
|
-
layer.setChangeFlags({
|
|
50
|
-
extensionsChanged: true
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (opts.pickZ) {
|
|
57
|
-
this.isDrapingEnabled = false;
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const {
|
|
62
|
-
viewports,
|
|
63
|
-
isPicking = false
|
|
64
|
-
} = opts;
|
|
65
|
-
this.isPicking = isPicking;
|
|
66
|
-
this.isDrapingEnabled = true;
|
|
67
|
-
const viewport = viewports[0];
|
|
68
|
-
const layers = (isPicking ? this.terrainPickingPass : this.terrainPass).getRenderableLayers(viewport, opts);
|
|
69
|
-
const terrainLayers = layers.filter(l => l.props.operation.includes('terrain'));
|
|
70
|
-
|
|
71
|
-
if (terrainLayers.length === 0) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (!isPicking) {
|
|
76
|
-
const offsetLayers = layers.filter(l => l.state.terrainDrawMode === 'offset');
|
|
77
|
-
|
|
78
|
-
if (offsetLayers.length > 0) {
|
|
79
|
-
this._updateHeightMap(terrainLayers, viewport, opts);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const drapeLayers = layers.filter(l => l.state.terrainDrawMode === 'drape');
|
|
84
|
-
|
|
85
|
-
this._updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
getModuleParameters(layer) {
|
|
89
|
-
var _this$heightMap, _this$heightMap2;
|
|
90
|
-
|
|
91
|
-
const {
|
|
92
|
-
terrainDrawMode
|
|
93
|
-
} = layer.state;
|
|
94
|
-
return {
|
|
95
|
-
heightMap: (_this$heightMap = this.heightMap) === null || _this$heightMap === void 0 ? void 0 : _this$heightMap.getRenderFramebuffer(),
|
|
96
|
-
heightMapBounds: (_this$heightMap2 = this.heightMap) === null || _this$heightMap2 === void 0 ? void 0 : _this$heightMap2.bounds,
|
|
97
|
-
dummyHeightMap: this.dummyHeightMap,
|
|
98
|
-
terrainCover: this.isDrapingEnabled ? this.terrainCovers.get(layer.id) : null,
|
|
99
|
-
useTerrainHeightMap: terrainDrawMode === 'offset',
|
|
100
|
-
terrainSkipRender: terrainDrawMode === 'drape' || !layer.props.operation.includes('draw')
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
cleanup() {
|
|
105
|
-
if (this.dummyHeightMap) {
|
|
106
|
-
this.dummyHeightMap.delete();
|
|
107
|
-
this.dummyHeightMap = undefined;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (this.heightMap) {
|
|
111
|
-
this.heightMap.delete();
|
|
112
|
-
this.heightMap = undefined;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
for (const terrainCover of this.terrainCovers.values()) {
|
|
116
|
-
terrainCover.delete();
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
this.terrainCovers.clear();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
_updateHeightMap(terrainLayers, viewport, opts) {
|
|
123
|
-
if (!this.heightMap) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const shouldUpdate = this.heightMap.shouldUpdate({
|
|
128
|
-
layers: terrainLayers,
|
|
129
|
-
viewport
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
if (!shouldUpdate) {
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
this.terrainPass.renderHeightMap(this.heightMap, { ...opts,
|
|
137
|
-
layers: terrainLayers,
|
|
138
|
-
moduleParameters: {
|
|
139
|
-
heightMapBounds: this.heightMap.bounds,
|
|
140
|
-
dummyHeightMap: this.dummyHeightMap,
|
|
141
|
-
devicePixelRatio: 1,
|
|
142
|
-
drawToTerrainHeightMap: true
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
_updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts) {
|
|
148
|
-
const layerNeedsRedraw = {};
|
|
149
|
-
|
|
150
|
-
for (const layer of drapeLayers) {
|
|
151
|
-
if (layer.state.terrainCoverNeedsRedraw) {
|
|
152
|
-
layerNeedsRedraw[layer.id] = true;
|
|
153
|
-
layer.state.terrainCoverNeedsRedraw = false;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
for (const terrainCover of this.terrainCovers.values()) {
|
|
158
|
-
terrainCover.isDirty = terrainCover.isDirty || terrainCover.shouldUpdate({
|
|
159
|
-
layerNeedsRedraw
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
for (const layer of terrainLayers) {
|
|
164
|
-
this._updateTerrainCover(layer, drapeLayers, viewport, opts);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
if (!this.isPicking) {
|
|
168
|
-
this._pruneTerrainCovers();
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
_updateTerrainCover(terrainLayer, drapeLayers, viewport, opts) {
|
|
173
|
-
const renderPass = this.isPicking ? this.terrainPickingPass : this.terrainPass;
|
|
174
|
-
let terrainCover = this.terrainCovers.get(terrainLayer.id);
|
|
175
|
-
|
|
176
|
-
if (!terrainCover) {
|
|
177
|
-
terrainCover = new TerrainCover(terrainLayer);
|
|
178
|
-
this.terrainCovers.set(terrainLayer.id, terrainCover);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
try {
|
|
182
|
-
const isDirty = terrainCover.shouldUpdate({
|
|
183
|
-
targetLayer: terrainLayer,
|
|
184
|
-
viewport,
|
|
185
|
-
layers: drapeLayers
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
if (this.isPicking || terrainCover.isDirty || isDirty) {
|
|
189
|
-
renderPass.renderTerrainCover(terrainCover, { ...opts,
|
|
190
|
-
layers: drapeLayers,
|
|
191
|
-
moduleParameters: {
|
|
192
|
-
dummyHeightMap: this.dummyHeightMap,
|
|
193
|
-
terrainSkipRender: false,
|
|
194
|
-
devicePixelRatio: 1
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
terrainCover.isDirty = false;
|
|
198
|
-
}
|
|
199
|
-
} catch (err) {
|
|
200
|
-
terrainLayer.raiseError(err, `Error rendering terrain cover ${terrainCover.id}`);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
_pruneTerrainCovers() {
|
|
205
|
-
const idsToRemove = [];
|
|
206
|
-
|
|
207
|
-
for (const [id, terrainCover] of this.terrainCovers) {
|
|
208
|
-
if (!terrainCover.isActive) {
|
|
209
|
-
idsToRemove.push(id);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
for (const id of idsToRemove) {
|
|
214
|
-
this.terrainCovers.delete(id);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=terrain-effect.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/terrain/terrain-effect.ts"],"names":["log","getShaderAssembler","terrainModule","TerrainCover","TerrainPass","TerrainPickingPass","HeightMapBuilder","TerrainEffect","id","props","useInPicking","isPicking","isDrapingEnabled","dummyHeightMap","heightMap","terrainPass","terrainPickingPass","terrainCovers","Map","initialize","device","createTexture","width","height","data","Uint8Array","isSupported","warn","addDefaultModule","preRender","opts","layer","layers","operation","includes","setChangeFlags","extensionsChanged","pickZ","viewports","viewport","getRenderableLayers","terrainLayers","filter","l","length","offsetLayers","state","terrainDrawMode","_updateHeightMap","drapeLayers","_updateTerrainCovers","getModuleParameters","getRenderFramebuffer","heightMapBounds","bounds","terrainCover","get","useTerrainHeightMap","terrainSkipRender","cleanup","delete","undefined","values","clear","shouldUpdate","renderHeightMap","moduleParameters","devicePixelRatio","drawToTerrainHeightMap","layerNeedsRedraw","terrainCoverNeedsRedraw","isDirty","_updateTerrainCover","_pruneTerrainCovers","terrainLayer","renderPass","set","targetLayer","renderTerrainCover","err","raiseError","idsToRemove","isActive","push"],"mappings":"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","sourcesContent":["import {Device, Texture} from '@luma.gl/core';\nimport {log, getShaderAssembler} from '@deck.gl/core';\n\nimport {terrainModule, TerrainModuleSettings} from './shader-module';\nimport {TerrainCover} from './terrain-cover';\nimport {TerrainPass} from './terrain-pass';\nimport {TerrainPickingPass, TerrainPickingPassRenderOptions} from './terrain-picking-pass';\nimport {HeightMapBuilder} from './height-map-builder';\n\nimport type {Effect, PreRenderOptions, Layer, Viewport} from '@deck.gl/core';\n\n/** Class to manage terrain effect */\nexport class TerrainEffect implements Effect {\n id = 'terrain-effect';\n props = null;\n useInPicking = true;\n\n /** true if picking in the current pass */\n private isPicking: boolean = false;\n /** true if should use in the current pass */\n private isDrapingEnabled: boolean = false;\n /** An empty texture as placeholder */\n private dummyHeightMap?: Texture;\n /** A texture encoding the ground elevation, updated once per redraw. Used by layers with offset mode */\n private heightMap?: HeightMapBuilder;\n private terrainPass!: TerrainPass;\n private terrainPickingPass!: TerrainPickingPass;\n /** One texture for each primitive terrain layer, into which the draped layers render */\n private terrainCovers: Map<string, TerrainCover> = new Map();\n\n initialize(device: Device) {\n this.dummyHeightMap = device.createTexture({\n width: 1,\n height: 1,\n data: new Uint8Array([0, 0, 0, 0])\n });\n this.terrainPass = new TerrainPass(device, {id: 'terrain'});\n this.terrainPickingPass = new TerrainPickingPass(device, {id: 'terrain-picking'});\n\n if (HeightMapBuilder.isSupported(device)) {\n this.heightMap = new HeightMapBuilder(device);\n } else {\n log.warn('Terrain offset mode is not supported by this browser')();\n }\n\n getShaderAssembler().addDefaultModule(terrainModule);\n }\n\n preRender(device: Device, opts: PreRenderOptions): void {\n if (!this.dummyHeightMap) {\n // First time this effect is in use, initialize resources and register the shader module\n this.initialize(device);\n for (const layer of opts.layers) {\n // Force the terrain layer (and its descendents) to rebuild their models with the new shader\n if (layer.props.operation.includes('terrain')) {\n layer.setChangeFlags({extensionsChanged: true});\n }\n }\n }\n\n // @ts-expect-error pickZ only defined in picking pass\n if (opts.pickZ) {\n // Do not update if picking attributes\n this.isDrapingEnabled = false;\n return;\n }\n\n const {viewports, isPicking = false} = opts;\n this.isPicking = isPicking;\n this.isDrapingEnabled = true;\n\n // TODO - support multiple views?\n const viewport = viewports[0];\n const layers = (isPicking ? this.terrainPickingPass : this.terrainPass).getRenderableLayers(\n viewport,\n opts as TerrainPickingPassRenderOptions\n );\n\n const terrainLayers = layers.filter(l => l.props.operation.includes('terrain'));\n if (terrainLayers.length === 0) {\n return;\n }\n\n if (!isPicking) {\n const offsetLayers = layers.filter(l => l.state.terrainDrawMode === 'offset');\n if (offsetLayers.length > 0) {\n this._updateHeightMap(terrainLayers, viewport, opts);\n }\n }\n\n const drapeLayers = layers.filter(l => l.state.terrainDrawMode === 'drape');\n this._updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts);\n }\n\n getModuleParameters(layer: Layer): TerrainModuleSettings {\n const {terrainDrawMode} = layer.state;\n\n return {\n // @ts-expect-error\n heightMap: this.heightMap?.getRenderFramebuffer(),\n heightMapBounds: this.heightMap?.bounds,\n dummyHeightMap: this.dummyHeightMap!,\n terrainCover: this.isDrapingEnabled ? this.terrainCovers.get(layer.id) : null,\n useTerrainHeightMap: terrainDrawMode === 'offset',\n terrainSkipRender: terrainDrawMode === 'drape' || !layer.props.operation.includes('draw')\n };\n }\n\n cleanup(): void {\n if (this.dummyHeightMap) {\n this.dummyHeightMap.delete();\n this.dummyHeightMap = undefined;\n }\n\n if (this.heightMap) {\n this.heightMap.delete();\n this.heightMap = undefined;\n }\n\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.delete();\n }\n this.terrainCovers.clear();\n }\n\n private _updateHeightMap(terrainLayers: Layer[], viewport: Viewport, opts: PreRenderOptions) {\n if (!this.heightMap) {\n // Not supported\n return;\n }\n\n const shouldUpdate = this.heightMap.shouldUpdate({layers: terrainLayers, viewport});\n if (!shouldUpdate) {\n return;\n }\n\n this.terrainPass.renderHeightMap(this.heightMap, {\n ...opts,\n layers: terrainLayers,\n moduleParameters: {\n heightMapBounds: this.heightMap.bounds,\n dummyHeightMap: this.dummyHeightMap,\n devicePixelRatio: 1,\n drawToTerrainHeightMap: true\n }\n });\n }\n\n private _updateTerrainCovers(\n terrainLayers: Layer[],\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n // Mark a terrain cover as dirty if one of the drape layers needs redraw\n const layerNeedsRedraw: Record<string, boolean> = {};\n for (const layer of drapeLayers) {\n if (layer.state.terrainCoverNeedsRedraw) {\n layerNeedsRedraw[layer.id] = true;\n layer.state.terrainCoverNeedsRedraw = false;\n }\n }\n for (const terrainCover of this.terrainCovers.values()) {\n terrainCover.isDirty = terrainCover.isDirty || terrainCover.shouldUpdate({layerNeedsRedraw});\n }\n\n for (const layer of terrainLayers) {\n this._updateTerrainCover(layer, drapeLayers, viewport, opts);\n }\n\n if (!this.isPicking) {\n this._pruneTerrainCovers();\n }\n }\n\n private _updateTerrainCover(\n terrainLayer: Layer,\n drapeLayers: Layer[],\n viewport: Viewport,\n opts: PreRenderOptions\n ) {\n const renderPass = this.isPicking ? this.terrainPickingPass : this.terrainPass;\n let terrainCover = this.terrainCovers.get(terrainLayer.id);\n if (!terrainCover) {\n terrainCover = new TerrainCover(terrainLayer);\n this.terrainCovers.set(terrainLayer.id, terrainCover);\n }\n try {\n const isDirty = terrainCover.shouldUpdate({\n targetLayer: terrainLayer,\n viewport,\n layers: drapeLayers\n });\n if (this.isPicking || terrainCover.isDirty || isDirty) {\n renderPass.renderTerrainCover(terrainCover, {\n ...opts,\n layers: drapeLayers,\n moduleParameters: {\n dummyHeightMap: this.dummyHeightMap,\n terrainSkipRender: false,\n devicePixelRatio: 1\n }\n });\n terrainCover.isDirty = false;\n }\n } catch (err) {\n terrainLayer.raiseError(err as Error, `Error rendering terrain cover ${terrainCover.id}`);\n }\n }\n\n private _pruneTerrainCovers() {\n /** Prune the cache, remove textures for layers that have been removed */\n const idsToRemove: string[] = [];\n for (const [id, terrainCover] of this.terrainCovers) {\n if (!terrainCover.isActive) {\n idsToRemove.push(id);\n }\n }\n for (const id of idsToRemove) {\n this.terrainCovers.delete(id);\n }\n }\n}\n"],"file":"terrain-effect.js"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { LayerExtension } from '@deck.gl/core';
|
|
2
|
-
import { TerrainEffect } from './terrain-effect';
|
|
3
|
-
import { terrainModule } from './shader-module';
|
|
4
|
-
const defaultProps = {
|
|
5
|
-
terrainDrawMode: undefined
|
|
6
|
-
};
|
|
7
|
-
export default class TerrainExtension extends LayerExtension {
|
|
8
|
-
getShaders() {
|
|
9
|
-
return {
|
|
10
|
-
modules: [terrainModule]
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
initializeState() {
|
|
15
|
-
var _this$context$deck;
|
|
16
|
-
|
|
17
|
-
(_this$context$deck = this.context.deck) === null || _this$context$deck === void 0 ? void 0 : _this$context$deck._addDefaultEffect(new TerrainEffect());
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
updateState(params) {
|
|
21
|
-
const {
|
|
22
|
-
props,
|
|
23
|
-
oldProps
|
|
24
|
-
} = params;
|
|
25
|
-
|
|
26
|
-
if (this.state.terrainDrawMode && props.terrainDrawMode === oldProps.terrainDrawMode && props.extruded === oldProps.extruded) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
let {
|
|
31
|
-
terrainDrawMode
|
|
32
|
-
} = props;
|
|
33
|
-
|
|
34
|
-
if (!terrainDrawMode) {
|
|
35
|
-
var _this$getAttributeMan;
|
|
36
|
-
|
|
37
|
-
const is3d = this.props.extruded;
|
|
38
|
-
const attributes = (_this$getAttributeMan = this.getAttributeManager()) === null || _this$getAttributeMan === void 0 ? void 0 : _this$getAttributeMan.attributes;
|
|
39
|
-
const hasAnchor = attributes && 'instancePositions' in attributes;
|
|
40
|
-
terrainDrawMode = is3d || hasAnchor ? 'offset' : 'drape';
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
this.setState({
|
|
44
|
-
terrainDrawMode
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
onNeedsRedraw() {
|
|
49
|
-
const state = this.state;
|
|
50
|
-
|
|
51
|
-
if (state.terrainDrawMode === 'drape') {
|
|
52
|
-
state.terrainCoverNeedsRedraw = true;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
TerrainExtension.defaultProps = defaultProps;
|
|
58
|
-
TerrainExtension.extensionName = 'TerrainExtension';
|
|
59
|
-
//# sourceMappingURL=terrain-extension.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/terrain/terrain-extension.ts"],"names":["LayerExtension","TerrainEffect","terrainModule","defaultProps","terrainDrawMode","undefined","TerrainExtension","getShaders","modules","initializeState","context","deck","_addDefaultEffect","updateState","params","props","oldProps","state","extruded","is3d","attributes","getAttributeManager","hasAnchor","setState","onNeedsRedraw","terrainCoverNeedsRedraw","extensionName"],"mappings":"AAAA,SAAQA,cAAR,QAA+C,eAA/C;AACA,SAAQC,aAAR,QAA4B,kBAA5B;AACA,SAAQC,aAAR,QAA4B,iBAA5B;AAIA,MAAMC,YAAY,GAAG;AACnBC,EAAAA,eAAe,EAAEC;AADE,CAArB;AAoBA,eAAe,MAAMC,gBAAN,SAA+BN,cAA/B,CAA8C;AAI3DO,EAAAA,UAAU,GAA0C;AAClD,WAAO;AACLC,MAAAA,OAAO,EAAE,CAACN,aAAD;AADJ,KAAP;AAGD;;AAEDO,EAAAA,eAAe,GAAqC;AAAA;;AAClD,+BAAKC,OAAL,CAAaC,IAAb,0EAAmBC,iBAAnB,CAAqC,IAAIX,aAAJ,EAArC;AACD;;AAEDY,EAAAA,WAAW,CAETC,MAFS,EAGT;AACA,UAAM;AAACC,MAAAA,KAAD;AAAQC,MAAAA;AAAR,QAAoBF,MAA1B;;AAEA,QACE,KAAKG,KAAL,CAAWb,eAAX,IACAW,KAAK,CAACX,eAAN,KAA0BY,QAAQ,CAACZ,eADnC,IAGAW,KAAK,CAACG,QAAN,KAAmBF,QAAQ,CAACE,QAJ9B,EAKE;AACA;AACD;;AAED,QAAI;AAACd,MAAAA;AAAD,QAAoBW,KAAxB;;AACA,QAAI,CAACX,eAAL,EAAsB;AAAA;;AAGpB,YAAMe,IAAI,GAAG,KAAKJ,KAAL,CAAWG,QAAxB;AACA,YAAME,UAAU,4BAAG,KAAKC,mBAAL,EAAH,0DAAG,sBAA4BD,UAA/C;AACA,YAAME,SAAS,GAAGF,UAAU,IAAI,uBAAuBA,UAAvD;AACAhB,MAAAA,eAAe,GAAGe,IAAI,IAAIG,SAAR,GAAoB,QAApB,GAA+B,OAAjD;AACD;;AACD,SAAKC,QAAL,CAAc;AAACnB,MAAAA;AAAD,KAAd;AACD;;AAEDoB,EAAAA,aAAa,GAAwB;AACnC,UAAMP,KAAK,GAAG,KAAKA,KAAnB;;AACA,QAAIA,KAAK,CAACb,eAAN,KAA0B,OAA9B,EAAuC;AACrCa,MAAAA,KAAK,CAACQ,uBAAN,GAAgC,IAAhC;AACD;AACF;;AA9C0D;AAAxCnB,gB,CACZH,Y,GAAeA,Y;AADHG,gB,CAEZoB,a,GAAgB,kB","sourcesContent":["import {LayerExtension, UpdateParameters} from '@deck.gl/core';\nimport {TerrainEffect} from './terrain-effect';\nimport {terrainModule} from './shader-module';\n\nimport type {Layer} from '@deck.gl/core';\n\nconst defaultProps = {\n terrainDrawMode: undefined\n};\n\nexport type TerrainExtensionProps = {\n /**\n * controls whether an object is drawn over the terrain surface by its anchor (usually defined by an accessor called `getPosition`, e.g. icon, scatterplot) or by its geometry (e.g. path, polygon).\n * If not specified, it is automatically deduced from the layer.\n */\n terrainDrawMode?: 'offset' | 'drape';\n};\n\ntype TerrainExtensionState = {\n /** Resolved fitting mode */\n terrainDrawMode: 'offset' | 'drape';\n /** Set when a layer is flagged as needs redraw */\n terrainCoverNeedsRedraw: boolean;\n};\n\n/** Allows layers to show/hide objects by a geofence. */\nexport default class TerrainExtension extends LayerExtension {\n static defaultProps = defaultProps;\n static extensionName = 'TerrainExtension';\n\n getShaders(this: Layer<TerrainExtensionProps>): any {\n return {\n modules: [terrainModule]\n };\n }\n\n initializeState(this: Layer<TerrainExtensionProps>) {\n this.context.deck?._addDefaultEffect(new TerrainEffect());\n }\n\n updateState(\n this: Layer<TerrainExtensionProps>,\n params: UpdateParameters<Layer<TerrainExtensionProps>>\n ) {\n const {props, oldProps} = params;\n\n if (\n this.state.terrainDrawMode &&\n props.terrainDrawMode === oldProps.terrainDrawMode &&\n // @ts-ignore `extruded` may not exist in props\n props.extruded === oldProps.extruded\n ) {\n return;\n }\n\n let {terrainDrawMode} = props;\n if (!terrainDrawMode) {\n // props.extruded is used as an indication that the layer is 2.5D\n // @ts-ignore `extruded` may not exist in props\n const is3d = this.props.extruded as boolean;\n const attributes = this.getAttributeManager()?.attributes;\n const hasAnchor = attributes && 'instancePositions' in attributes;\n terrainDrawMode = is3d || hasAnchor ? 'offset' : 'drape';\n }\n this.setState({terrainDrawMode});\n }\n\n onNeedsRedraw(this: Layer<{}>): void {\n const state = this.state as TerrainExtensionState;\n if (state.terrainDrawMode === 'drape') {\n state.terrainCoverNeedsRedraw = true;\n }\n }\n}\n"],"file":"terrain-extension.js"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { withGLParameters } from '@luma.gl/webgl';
|
|
2
|
-
import { GL } from '@luma.gl/constants';
|
|
3
|
-
import { _LayersPass as LayersPass } from '@deck.gl/core';
|
|
4
|
-
export class TerrainPass extends LayersPass {
|
|
5
|
-
getRenderableLayers(viewport, opts) {
|
|
6
|
-
const {
|
|
7
|
-
layers
|
|
8
|
-
} = opts;
|
|
9
|
-
const result = [];
|
|
10
|
-
|
|
11
|
-
const drawParamsByIndex = this._getDrawLayerParams(viewport, opts, true);
|
|
12
|
-
|
|
13
|
-
for (let i = 0; i < layers.length; i++) {
|
|
14
|
-
const layer = layers[i];
|
|
15
|
-
|
|
16
|
-
if (!layer.isComposite && drawParamsByIndex[i].shouldDrawLayer) {
|
|
17
|
-
result.push(layer);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return result;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
renderHeightMap(heightMap, opts) {
|
|
25
|
-
const target = heightMap.getRenderFramebuffer();
|
|
26
|
-
const viewport = heightMap.renderViewport;
|
|
27
|
-
|
|
28
|
-
if (!target || !viewport) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
target.resize(viewport);
|
|
33
|
-
withGLParameters(this.device, {
|
|
34
|
-
clearColor: [0, 0, 0, 0],
|
|
35
|
-
blend: true,
|
|
36
|
-
blendFunc: [1, 1],
|
|
37
|
-
blendEquation: 32776,
|
|
38
|
-
depthTest: false
|
|
39
|
-
}, () => this.render({ ...opts,
|
|
40
|
-
target,
|
|
41
|
-
pass: 'terrain-height-map',
|
|
42
|
-
layers: opts.layers,
|
|
43
|
-
viewports: [viewport],
|
|
44
|
-
effects: []
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
renderTerrainCover(terrainCover, opts) {
|
|
49
|
-
const target = terrainCover.getRenderFramebuffer();
|
|
50
|
-
const viewport = terrainCover.renderViewport;
|
|
51
|
-
|
|
52
|
-
if (!target || !viewport) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const layers = terrainCover.filterLayers(opts.layers);
|
|
57
|
-
target.resize(viewport);
|
|
58
|
-
withGLParameters(this.device, {
|
|
59
|
-
clearColor: [0, 0, 0, 0],
|
|
60
|
-
depthTest: false
|
|
61
|
-
}, () => this.render({ ...opts,
|
|
62
|
-
target,
|
|
63
|
-
pass: `terrain-cover-${terrainCover.id}`,
|
|
64
|
-
layers,
|
|
65
|
-
effects: [],
|
|
66
|
-
viewports: [viewport]
|
|
67
|
-
}));
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=terrain-pass.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/terrain/terrain-pass.ts"],"names":["withGLParameters","GL","_LayersPass","LayersPass","TerrainPass","getRenderableLayers","viewport","opts","layers","result","drawParamsByIndex","_getDrawLayerParams","i","length","layer","isComposite","shouldDrawLayer","push","renderHeightMap","heightMap","target","getRenderFramebuffer","renderViewport","resize","device","clearColor","blend","blendFunc","blendEquation","depthTest","render","pass","viewports","effects","renderTerrainCover","terrainCover","filterLayers","id"],"mappings":"AAAA,SAAQA,gBAAR,QAA+B,gBAA/B;AACA,SAAQC,EAAR,QAAiB,oBAAjB;AACA,SAAyBC,WAAW,IAAIC,UAAxC,QAAkF,eAAlF;AAOA,OAAO,MAAMC,WAAN,SAA0BD,UAA1B,CAAqC;AAC1CE,EAAAA,mBAAmB,CAACC,QAAD,EAAqBC,IAArB,EAA8D;AAC/E,UAAM;AAACC,MAAAA;AAAD,QAAWD,IAAjB;AACA,UAAME,MAAe,GAAG,EAAxB;;AACA,UAAMC,iBAAiB,GAAG,KAAKC,mBAAL,CAAyBL,QAAzB,EAAmCC,IAAnC,EAAyC,IAAzC,CAA1B;;AACA,SAAK,IAAIK,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGJ,MAAM,CAACK,MAA3B,EAAmCD,CAAC,EAApC,EAAwC;AACtC,YAAME,KAAK,GAAGN,MAAM,CAACI,CAAD,CAApB;;AACA,UAAI,CAACE,KAAK,CAACC,WAAP,IAAsBL,iBAAiB,CAACE,CAAD,CAAjB,CAAqBI,eAA/C,EAAgE;AAC9DP,QAAAA,MAAM,CAACQ,IAAP,CAAYH,KAAZ;AACD;AACF;;AAED,WAAOL,MAAP;AACD;;AAEDS,EAAAA,eAAe,CAACC,SAAD,EAA8BZ,IAA9B,EAAuE;AAEpF,UAAMa,MAAM,GAAGD,SAAS,CAACE,oBAAV,EAAf;AACA,UAAMf,QAAQ,GAAGa,SAAS,CAACG,cAA3B;;AAEA,QAAI,CAACF,MAAD,IAAW,CAACd,QAAhB,EAA0B;AACxB;AACD;;AAEDc,IAAAA,MAAM,CAACG,MAAP,CAAcjB,QAAd;AAEAN,IAAAA,gBAAgB,CACd,KAAKwB,MADS,EAEd;AACEC,MAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADd;AAEEC,MAAAA,KAAK,EAAE,IAFT;AAGEC,MAAAA,SAAS,EAAE,MAHb;AAIEC,MAAAA,aAAa,OAJf;AAKEC,MAAAA,SAAS,EAAE;AALb,KAFc,EASd,MACE,KAAKC,MAAL,CAAY,EACV,GAAGvB,IADO;AAEVa,MAAAA,MAFU;AAGVW,MAAAA,IAAI,EAAE,oBAHI;AAIVvB,MAAAA,MAAM,EAAED,IAAI,CAACC,MAJH;AAKVwB,MAAAA,SAAS,EAAE,CAAC1B,QAAD,CALD;AAMV2B,MAAAA,OAAO,EAAE;AANC,KAAZ,CAVY,CAAhB;AAmBD;;AAEDC,EAAAA,kBAAkB,CAACC,YAAD,EAA6B5B,IAA7B,EAAsE;AAEtF,UAAMa,MAAM,GAAGe,YAAY,CAACd,oBAAb,EAAf;AACA,UAAMf,QAAQ,GAAG6B,YAAY,CAACb,cAA9B;;AAEA,QAAI,CAACF,MAAD,IAAW,CAACd,QAAhB,EAA0B;AACxB;AACD;;AAED,UAAME,MAAM,GAAG2B,YAAY,CAACC,YAAb,CAA0B7B,IAAI,CAACC,MAA/B,CAAf;AACAY,IAAAA,MAAM,CAACG,MAAP,CAAcjB,QAAd;AAEAN,IAAAA,gBAAgB,CACd,KAAKwB,MADS,EAEd;AACEC,MAAAA,UAAU,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADd;AAEEI,MAAAA,SAAS,EAAE;AAFb,KAFc,EAMd,MACE,KAAKC,MAAL,CAAY,EACV,GAAGvB,IADO;AAEVa,MAAAA,MAFU;AAGVW,MAAAA,IAAI,EAAG,iBAAgBI,YAAY,CAACE,EAAG,EAH7B;AAIV7B,MAAAA,MAJU;AAKVyB,MAAAA,OAAO,EAAE,EALC;AAMVD,MAAAA,SAAS,EAAE,CAAC1B,QAAD;AAND,KAAZ,CAPY,CAAhB;AAgBD;;AA3EyC","sourcesContent":["import {withGLParameters} from '@luma.gl/webgl';\nimport {GL} from '@luma.gl/constants';\nimport {Layer, Viewport, _LayersPass as LayersPass, LayersPassRenderOptions} from '@deck.gl/core';\nimport type {HeightMapBuilder} from './height-map-builder';\nimport type {TerrainCover} from './terrain-cover';\n\nexport type TerrainPassRenderOptions = LayersPassRenderOptions;\n\n/** Renders textures used by the TerrainEffect render pass */\nexport class TerrainPass extends LayersPass {\n getRenderableLayers(viewport: Viewport, opts: TerrainPassRenderOptions): Layer[] {\n const {layers} = opts;\n const result: Layer[] = [];\n const drawParamsByIndex = this._getDrawLayerParams(viewport, opts, true);\n for (let i = 0; i < layers.length; i++) {\n const layer = layers[i];\n if (!layer.isComposite && drawParamsByIndex[i].shouldDrawLayer) {\n result.push(layer);\n }\n }\n\n return result;\n }\n\n renderHeightMap(heightMap: HeightMapBuilder, opts: Partial<TerrainPassRenderOptions>) {\n // console.log('Updating height map')\n const target = heightMap.getRenderFramebuffer();\n const viewport = heightMap.renderViewport;\n\n if (!target || !viewport) {\n return;\n }\n\n target.resize(viewport);\n\n withGLParameters(\n this.device,\n {\n clearColor: [0, 0, 0, 0],\n blend: true,\n blendFunc: [GL.ONE, GL.ONE],\n blendEquation: GL.MAX,\n depthTest: false\n },\n () =>\n this.render({\n ...opts,\n target,\n pass: 'terrain-height-map',\n layers: opts.layers!,\n viewports: [viewport],\n effects: []\n })\n );\n }\n\n renderTerrainCover(terrainCover: TerrainCover, opts: Partial<TerrainPassRenderOptions>) {\n // console.log('Updating terrain cover ' + terrainCover.id)\n const target = terrainCover.getRenderFramebuffer();\n const viewport = terrainCover.renderViewport;\n\n if (!target || !viewport) {\n return;\n }\n\n const layers = terrainCover.filterLayers(opts.layers!);\n target.resize(viewport);\n\n withGLParameters(\n this.device,\n {\n clearColor: [0, 0, 0, 0],\n depthTest: false\n },\n () =>\n this.render({\n ...opts,\n target,\n pass: `terrain-cover-${terrainCover.id}`,\n layers,\n effects: [],\n viewports: [viewport]\n })\n );\n }\n}\n"],"file":"terrain-pass.js"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { _PickLayersPass as PickLayersPass } from '@deck.gl/core';
|
|
2
|
-
import { withGLParameters } from '@luma.gl/webgl';
|
|
3
|
-
export class TerrainPickingPass extends PickLayersPass {
|
|
4
|
-
constructor(...args) {
|
|
5
|
-
super(...args);
|
|
6
|
-
this.drawParameters = {};
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
getRenderableLayers(viewport, opts) {
|
|
10
|
-
const {
|
|
11
|
-
layers
|
|
12
|
-
} = opts;
|
|
13
|
-
const result = [];
|
|
14
|
-
this.drawParameters = {};
|
|
15
|
-
|
|
16
|
-
this._resetColorEncoder(opts.pickZ);
|
|
17
|
-
|
|
18
|
-
const drawParamsByIndex = this._getDrawLayerParams(viewport, opts);
|
|
19
|
-
|
|
20
|
-
for (let i = 0; i < layers.length; i++) {
|
|
21
|
-
const layer = layers[i];
|
|
22
|
-
|
|
23
|
-
if (!layer.isComposite && drawParamsByIndex[i].shouldDrawLayer) {
|
|
24
|
-
result.push(layer);
|
|
25
|
-
this.drawParameters[layer.id] = drawParamsByIndex[i].layerParameters;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return result;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
renderTerrainCover(terrainCover, opts) {
|
|
33
|
-
const target = terrainCover.getPickingFramebuffer();
|
|
34
|
-
const viewport = terrainCover.renderViewport;
|
|
35
|
-
|
|
36
|
-
if (!target || !viewport) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const layers = terrainCover.filterLayers(opts.layers);
|
|
41
|
-
const terrainLayer = terrainCover.targetLayer;
|
|
42
|
-
|
|
43
|
-
if (terrainLayer.props.pickable) {
|
|
44
|
-
layers.unshift(terrainLayer);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
target.resize(viewport);
|
|
48
|
-
withGLParameters(this.device, {
|
|
49
|
-
depthTest: false
|
|
50
|
-
}, () => this.render({ ...opts,
|
|
51
|
-
pickingFBO: target,
|
|
52
|
-
pass: `terrain-cover-picking-${terrainCover.id}`,
|
|
53
|
-
layers,
|
|
54
|
-
effects: [],
|
|
55
|
-
viewports: [viewport],
|
|
56
|
-
cullRect: undefined,
|
|
57
|
-
deviceRect: viewport,
|
|
58
|
-
pickZ: false
|
|
59
|
-
}));
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
getLayerParameters(layer, layerIndex, viewport) {
|
|
63
|
-
if (this.drawParameters[layer.id]) {
|
|
64
|
-
return this.drawParameters[layer.id];
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const parameters = super.getLayerParameters(layer, layerIndex, viewport);
|
|
68
|
-
parameters.blend = true;
|
|
69
|
-
return parameters;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=terrain-picking-pass.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/terrain/terrain-picking-pass.ts"],"names":["_PickLayersPass","PickLayersPass","withGLParameters","TerrainPickingPass","drawParameters","getRenderableLayers","viewport","opts","layers","result","_resetColorEncoder","pickZ","drawParamsByIndex","_getDrawLayerParams","i","length","layer","isComposite","shouldDrawLayer","push","id","layerParameters","renderTerrainCover","terrainCover","target","getPickingFramebuffer","renderViewport","filterLayers","terrainLayer","targetLayer","props","pickable","unshift","resize","device","depthTest","render","pickingFBO","pass","effects","viewports","cullRect","undefined","deviceRect","getLayerParameters","layerIndex","parameters","blend"],"mappings":"AAAA,SAIEA,eAAe,IAAIC,cAJrB,QAKO,eALP;AAMA,SAAQC,gBAAR,QAA+B,gBAA/B;AAQA,OAAO,MAAMC,kBAAN,SAAiCF,cAAjC,CAAgD;AAAA;AAAA;AAAA,SAOrDG,cAPqD,GAOf,EAPe;AAAA;;AASrDC,EAAAA,mBAAmB,CAACC,QAAD,EAAqBC,IAArB,EAAqE;AACtF,UAAM;AAACC,MAAAA;AAAD,QAAWD,IAAjB;AACA,UAAME,MAAe,GAAG,EAAxB;AACA,SAAKL,cAAL,GAAsB,EAAtB;;AACA,SAAKM,kBAAL,CAAwBH,IAAI,CAACI,KAA7B;;AACA,UAAMC,iBAAiB,GAAG,KAAKC,mBAAL,CAAyBP,QAAzB,EAAmCC,IAAnC,CAA1B;;AACA,SAAK,IAAIO,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGN,MAAM,CAACO,MAA3B,EAAmCD,CAAC,EAApC,EAAwC;AACtC,YAAME,KAAK,GAAGR,MAAM,CAACM,CAAD,CAApB;;AACA,UAAI,CAACE,KAAK,CAACC,WAAP,IAAsBL,iBAAiB,CAACE,CAAD,CAAjB,CAAqBI,eAA/C,EAAgE;AAC9DT,QAAAA,MAAM,CAACU,IAAP,CAAYH,KAAZ;AACA,aAAKZ,cAAL,CAAoBY,KAAK,CAACI,EAA1B,IAAgCR,iBAAiB,CAACE,CAAD,CAAjB,CAAqBO,eAArD;AACD;AACF;;AAED,WAAOZ,MAAP;AACD;;AAEDa,EAAAA,kBAAkB,CAACC,YAAD,EAA6BhB,IAA7B,EAA6E;AAE7F,UAAMiB,MAAM,GAAGD,YAAY,CAACE,qBAAb,EAAf;AACA,UAAMnB,QAAQ,GAAGiB,YAAY,CAACG,cAA9B;;AAEA,QAAI,CAACF,MAAD,IAAW,CAAClB,QAAhB,EAA0B;AACxB;AACD;;AAED,UAAME,MAAM,GAAGe,YAAY,CAACI,YAAb,CAA0BpB,IAAI,CAACC,MAA/B,CAAf;AACA,UAAMoB,YAAY,GAAGL,YAAY,CAACM,WAAlC;;AACA,QAAID,YAAY,CAACE,KAAb,CAAmBC,QAAvB,EAAiC;AAC/BvB,MAAAA,MAAM,CAACwB,OAAP,CAAeJ,YAAf;AACD;;AACDJ,IAAAA,MAAM,CAACS,MAAP,CAAc3B,QAAd;AAEAJ,IAAAA,gBAAgB,CACd,KAAKgC,MADS,EAEd;AACEC,MAAAA,SAAS,EAAE;AADb,KAFc,EAKd,MACE,KAAKC,MAAL,CAAY,EACV,GAAG7B,IADO;AAEV8B,MAAAA,UAAU,EAAEb,MAFF;AAGVc,MAAAA,IAAI,EAAG,yBAAwBf,YAAY,CAACH,EAAG,EAHrC;AAIVZ,MAAAA,MAJU;AAKV+B,MAAAA,OAAO,EAAE,EALC;AAMVC,MAAAA,SAAS,EAAE,CAAClC,QAAD,CAND;AASVmC,MAAAA,QAAQ,EAAEC,SATA;AAUVC,MAAAA,UAAU,EAAErC,QAVF;AAWVK,MAAAA,KAAK,EAAE;AAXG,KAAZ,CANY,CAAhB;AAoBD;;AAESiC,EAAAA,kBAAkB,CAAC5B,KAAD,EAAe6B,UAAf,EAAmCvC,QAAnC,EAA4D;AACtF,QAAI,KAAKF,cAAL,CAAoBY,KAAK,CAACI,EAA1B,CAAJ,EAAmC;AACjC,aAAO,KAAKhB,cAAL,CAAoBY,KAAK,CAACI,EAA1B,CAAP;AACD;;AACD,UAAM0B,UAAU,GAAG,MAAMF,kBAAN,CAAyB5B,KAAzB,EAAgC6B,UAAhC,EAA4CvC,QAA5C,CAAnB;AACAwC,IAAAA,UAAU,CAACC,KAAX,GAAmB,IAAnB;AACA,WAAOD,UAAP;AACD;;AAvEoD","sourcesContent":["import {\n Layer,\n Viewport,\n LayersPassRenderOptions,\n _PickLayersPass as PickLayersPass\n} from '@deck.gl/core';\nimport {withGLParameters} from '@luma.gl/webgl';\nimport type {TerrainCover} from './terrain-cover';\n\nexport type TerrainPickingPassRenderOptions = LayersPassRenderOptions & {\n pickZ: boolean;\n};\n\n/** Renders textures used by the TerrainEffect picking pass */\nexport class TerrainPickingPass extends PickLayersPass {\n /** Save layer index for use when drawing to terrain cover.\n * When a terrain cover's picking buffer is rendered,\n * we need to make sure each layer receives a consistent index (encoded in the alpha channel)\n * so that a picked color can be decoded back to the correct layer.\n * Updated in getRenderableLayers which is called in TerrainEffect.preRender\n */\n drawParameters: Record<string, any> = {};\n\n getRenderableLayers(viewport: Viewport, opts: TerrainPickingPassRenderOptions): Layer[] {\n const {layers} = opts;\n const result: Layer[] = [];\n this.drawParameters = {};\n this._resetColorEncoder(opts.pickZ);\n const drawParamsByIndex = this._getDrawLayerParams(viewport, opts);\n for (let i = 0; i < layers.length; i++) {\n const layer = layers[i];\n if (!layer.isComposite && drawParamsByIndex[i].shouldDrawLayer) {\n result.push(layer);\n this.drawParameters[layer.id] = drawParamsByIndex[i].layerParameters;\n }\n }\n\n return result;\n }\n\n renderTerrainCover(terrainCover: TerrainCover, opts: Partial<TerrainPickingPassRenderOptions>) {\n // console.log('Updating terrain cover for picking ' + terrainCover.id)\n const target = terrainCover.getPickingFramebuffer();\n const viewport = terrainCover.renderViewport;\n\n if (!target || !viewport) {\n return;\n }\n\n const layers = terrainCover.filterLayers(opts.layers!);\n const terrainLayer = terrainCover.targetLayer;\n if (terrainLayer.props.pickable) {\n layers.unshift(terrainLayer);\n }\n target.resize(viewport);\n\n withGLParameters(\n this.device,\n {\n depthTest: false\n },\n () =>\n this.render({\n ...opts,\n pickingFBO: target,\n pass: `terrain-cover-picking-${terrainCover.id}`,\n layers,\n effects: [],\n viewports: [viewport],\n // Disable the default culling because TileLayer would cull sublayers based on the screen viewport,\n // not the viewport of the terrain cover. Culling is already done by `terrainCover.filterLayers`\n cullRect: undefined,\n deviceRect: viewport,\n pickZ: false\n })\n );\n }\n\n protected getLayerParameters(layer: Layer, layerIndex: number, viewport: Viewport): any {\n if (this.drawParameters[layer.id]) {\n return this.drawParameters[layer.id];\n }\n const parameters = super.getLayerParameters(layer, layerIndex, viewport);\n parameters.blend = true;\n return parameters;\n }\n}\n"],"file":"terrain-picking-pass.js"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { GL } from '@luma.gl/constants';
|
|
2
|
-
export function createRenderTarget(device, opts) {
|
|
3
|
-
return device.createFramebuffer({
|
|
4
|
-
id: opts.id,
|
|
5
|
-
colorAttachments: [device.createTexture({ ...(opts.float && {
|
|
6
|
-
format: device.info.type === 'webgl2' ? 'rgba32float' : 'rgba8unorm',
|
|
7
|
-
type: 5126
|
|
8
|
-
}),
|
|
9
|
-
mipmaps: false,
|
|
10
|
-
sampler: {
|
|
11
|
-
minFilter: 'linear',
|
|
12
|
-
magFilter: 'linear',
|
|
13
|
-
addressModeU: 'clamp-to-edge',
|
|
14
|
-
addressModeV: 'clamp-to-edge'
|
|
15
|
-
}
|
|
16
|
-
})]
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/terrain/utils.ts"],"names":["GL","createRenderTarget","device","opts","createFramebuffer","id","colorAttachments","createTexture","float","format","info","type","mipmaps","sampler","minFilter","magFilter","addressModeU","addressModeV"],"mappings":"AACA,SAAQA,EAAR,QAAiB,oBAAjB;AAEA,OAAO,SAASC,kBAAT,CACLC,MADK,EAELC,IAFK,EAML;AACA,SAAOD,MAAM,CAACE,iBAAP,CAAyB;AAC9BC,IAAAA,EAAE,EAAEF,IAAI,CAACE,EADqB;AAE9BC,IAAAA,gBAAgB,EAAE,CAChBJ,MAAM,CAACK,aAAP,CAAqB,EACnB,IAAIJ,IAAI,CAACK,KAAL,IAAc;AAChBC,QAAAA,MAAM,EAAEP,MAAM,CAACQ,IAAP,CAAYC,IAAZ,KAAqB,QAArB,GAAgC,aAAhC,GAAgD,YADxC;AAEhBA,QAAAA,IAAI;AAFY,OAAlB,CADmB;AAKnBC,MAAAA,OAAO,EAAE,KALU;AAMnBC,MAAAA,OAAO,EAAE;AACPC,QAAAA,SAAS,EAAE,QADJ;AAEPC,QAAAA,SAAS,EAAE,QAFJ;AAGPC,QAAAA,YAAY,EAAE,eAHP;AAIPC,QAAAA,YAAY,EAAE;AAJP;AANU,KAArB,CADgB;AAFY,GAAzB,CAAP;AAkBD","sourcesContent":["import type {Device} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nexport function createRenderTarget(\n device: Device,\n opts: {\n id: string;\n float?: boolean;\n }\n) {\n return device.createFramebuffer({\n id: opts.id,\n colorAttachments: [\n device.createTexture({\n ...(opts.float && {\n format: device.info.type === 'webgl2' ? 'rgba32float' : 'rgba8unorm',\n type: GL.FLOAT\n }),\n mipmaps: false,\n sampler: {\n minFilter: 'linear',\n magFilter: 'linear',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge'\n }\n })\n ]\n });\n}\n"],"file":"utils.js"}
|
package/dist/esm/utils/debug.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { readPixelsToArray } from '@luma.gl/webgl';
|
|
2
|
-
export const debugFBO = function (fbo, {
|
|
3
|
-
minimap,
|
|
4
|
-
opaque
|
|
5
|
-
} = {}) {
|
|
6
|
-
const color = readPixelsToArray(fbo);
|
|
7
|
-
let canvas = document.getElementById('fbo-canvas');
|
|
8
|
-
const canvasHeight = (minimap ? 2 : 1) * fbo.height;
|
|
9
|
-
|
|
10
|
-
if (!canvas) {
|
|
11
|
-
canvas = document.createElement('canvas');
|
|
12
|
-
canvas.id = 'fbo-canvas';
|
|
13
|
-
canvas.style.zIndex = '100';
|
|
14
|
-
canvas.style.position = 'absolute';
|
|
15
|
-
canvas.style.top = '0';
|
|
16
|
-
canvas.style.right = '0';
|
|
17
|
-
canvas.style.border = 'blue 1px solid';
|
|
18
|
-
canvas.style.transform = 'scaleY(-1)';
|
|
19
|
-
document.body.appendChild(canvas);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
if (canvas.width !== fbo.width || canvas.height !== canvasHeight) {
|
|
23
|
-
canvas.width = fbo.width;
|
|
24
|
-
canvas.height = canvasHeight;
|
|
25
|
-
canvas.style.width = '400px';
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const ctx = canvas.getContext('2d');
|
|
29
|
-
const imageData = ctx.createImageData(canvas.width, canvas.height);
|
|
30
|
-
|
|
31
|
-
if (minimap) {
|
|
32
|
-
const zoom = 8;
|
|
33
|
-
const {
|
|
34
|
-
width,
|
|
35
|
-
height
|
|
36
|
-
} = canvas;
|
|
37
|
-
|
|
38
|
-
for (let y = 0; y < height; y++) {
|
|
39
|
-
for (let x = 0; x < width; x++) {
|
|
40
|
-
const d = 4 * (x + y * width);
|
|
41
|
-
const s = 4 * (Math.floor(x / zoom) + Math.floor(y / zoom) * width);
|
|
42
|
-
imageData.data[d + 0] = color[s + 0];
|
|
43
|
-
imageData.data[d + 1] = color[s + 1];
|
|
44
|
-
imageData.data[d + 2] = color[s + 2];
|
|
45
|
-
imageData.data[d + 3] = opaque ? 255 : color[s + 3];
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const offset = minimap ? color.length : 0;
|
|
51
|
-
|
|
52
|
-
for (let i = 0; i < color.length; i += 4) {
|
|
53
|
-
imageData.data[offset + i + 0] = color[i + 0];
|
|
54
|
-
imageData.data[offset + i + 1] = color[i + 1];
|
|
55
|
-
imageData.data[offset + i + 2] = color[i + 2];
|
|
56
|
-
imageData.data[offset + i + 3] = opaque ? 255 : color[i + 3];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
ctx.putImageData(imageData, 0, 0);
|
|
60
|
-
};
|
|
61
|
-
//# sourceMappingURL=debug.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/debug.ts"],"names":["readPixelsToArray","debugFBO","fbo","minimap","opaque","color","canvas","document","getElementById","canvasHeight","height","createElement","id","style","zIndex","position","top","right","border","transform","body","appendChild","width","ctx","getContext","imageData","createImageData","zoom","y","x","d","s","Math","floor","data","offset","length","i","putImageData"],"mappings":"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","sourcesContent":["/* global document */\n\nimport {Framebuffer} from '@luma.gl/core';\nimport {readPixelsToArray} from '@luma.gl/webgl';\n\n/** Debug utility to draw FBO contents onto screen */\n// eslint-disable-next-line\nexport const debugFBO = function (\n fbo: Framebuffer,\n {minimap, opaque}: {minimap?: boolean; opaque?: boolean} = {}\n) {\n const color = readPixelsToArray(fbo);\n let canvas = document.getElementById('fbo-canvas') as HTMLCanvasElement;\n const canvasHeight = (minimap ? 2 : 1) * fbo.height;\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = 'fbo-canvas';\n canvas.style.zIndex = '100';\n canvas.style.position = 'absolute';\n canvas.style.top = '0';\n canvas.style.right = '0';\n canvas.style.border = 'blue 1px solid';\n canvas.style.transform = 'scaleY(-1)';\n document.body.appendChild(canvas);\n }\n if (canvas.width !== fbo.width || canvas.height !== canvasHeight) {\n canvas.width = fbo.width;\n canvas.height = canvasHeight;\n canvas.style.width = '400px';\n }\n const ctx = canvas.getContext('2d')!;\n const imageData = ctx.createImageData(canvas.width, canvas.height);\n\n // Minimap\n if (minimap) {\n const zoom = 8; // Zoom factor for minimap\n const {width, height} = canvas;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const d = 4 * (x + y * width); // destination pixel\n const s = 4 * (Math.floor(x / zoom) + Math.floor(y / zoom) * width); // source\n imageData.data[d + 0] = color[s + 0];\n imageData.data[d + 1] = color[s + 1];\n imageData.data[d + 2] = color[s + 2];\n imageData.data[d + 3] = opaque ? 255 : color[s + 3];\n }\n }\n }\n\n // Full map\n const offset = minimap ? color.length : 0;\n for (let i = 0; i < color.length; i += 4) {\n imageData.data[offset + i + 0] = color[i + 0];\n imageData.data[offset + i + 1] = color[i + 1];\n imageData.data[offset + i + 2] = color[i + 2];\n imageData.data[offset + i + 3] = opaque ? 255 : color[i + 3];\n }\n\n ctx.putImageData(imageData, 0, 0);\n};\n"],"file":"debug.js"}
|