@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.
Files changed (273) hide show
  1. package/dist/brushing/brushing-extension.js +80 -0
  2. package/{typed → dist}/brushing/shader-module.d.ts +1 -1
  3. package/{typed → dist}/brushing/shader-module.d.ts.map +1 -1
  4. package/dist/brushing/shader-module.js +92 -0
  5. package/{typed → dist}/clip/clip-extension.d.ts.map +1 -1
  6. package/dist/clip/clip-extension.js +117 -0
  7. package/{typed → dist}/collision-filter/collision-filter-effect.d.ts +4 -2
  8. package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -0
  9. package/dist/collision-filter/collision-filter-effect.js +194 -0
  10. package/dist/collision-filter/collision-filter-extension.js +49 -0
  11. package/{typed → dist}/collision-filter/collision-filter-pass.d.ts +3 -2
  12. package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -0
  13. package/dist/collision-filter/collision-filter-pass.js +23 -0
  14. package/{typed → dist}/collision-filter/shader-module.d.ts.map +1 -1
  15. package/dist/collision-filter/shader-module.js +87 -0
  16. package/dist/data-filter/aggregator.d.ts.map +1 -0
  17. package/dist/{esm/data-filter → data-filter}/aggregator.js +40 -41
  18. package/{typed → dist}/data-filter/data-filter-extension.d.ts +39 -7
  19. package/dist/data-filter/data-filter-extension.d.ts.map +1 -0
  20. package/dist/data-filter/data-filter-extension.js +256 -0
  21. package/dist/data-filter/shader-module.d.ts +39 -0
  22. package/dist/data-filter/shader-module.d.ts.map +1 -0
  23. package/dist/data-filter/shader-module.js +199 -0
  24. package/dist/dist.dev.js +2667 -11058
  25. package/{typed → dist}/fill-style/fill-style-extension.d.ts +2 -30
  26. package/dist/fill-style/fill-style-extension.d.ts.map +1 -0
  27. package/dist/fill-style/fill-style-extension.js +116 -0
  28. package/{typed/fill-style/shaders.glsl.d.ts → dist/fill-style/shader-module.d.ts} +1 -1
  29. package/dist/fill-style/shader-module.d.ts.map +1 -0
  30. package/dist/fill-style/shader-module.js +96 -0
  31. package/dist/fp64/fp64-extension.js +35 -0
  32. package/dist/fp64/project64.glsl.js +81 -0
  33. package/dist/fp64/project64.js +50 -0
  34. package/dist/index.cjs +2795 -0
  35. package/dist/index.cjs.map +7 -0
  36. package/dist/index.d.ts +19 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +11 -0
  39. package/{typed → dist}/mask/mask-effect.d.ts +6 -5
  40. package/dist/mask/mask-effect.d.ts.map +1 -0
  41. package/dist/mask/mask-effect.js +192 -0
  42. package/dist/mask/mask-extension.js +57 -0
  43. package/dist/mask/mask-pass.d.ts +61 -0
  44. package/dist/mask/mask-pass.d.ts.map +1 -0
  45. package/dist/mask/mask-pass.js +52 -0
  46. package/{typed → dist}/mask/shader-module.d.ts.map +1 -1
  47. package/dist/mask/shader-module.js +77 -0
  48. package/{typed → dist}/path-style/path-style-extension.d.ts.map +1 -1
  49. package/dist/path-style/path-style-extension.js +112 -0
  50. package/dist/path-style/shaders.glsl.js +86 -0
  51. package/{typed → dist}/terrain/height-map-builder.d.ts +1 -1
  52. package/dist/terrain/height-map-builder.d.ts.map +1 -0
  53. package/dist/terrain/height-map-builder.js +104 -0
  54. package/{typed → dist}/terrain/shader-module.d.ts +2 -2
  55. package/dist/terrain/shader-module.d.ts.map +1 -0
  56. package/dist/terrain/shader-module.js +137 -0
  57. package/{typed → dist}/terrain/terrain-cover.d.ts +1 -1
  58. package/dist/terrain/terrain-cover.d.ts.map +1 -0
  59. package/dist/terrain/terrain-cover.js +188 -0
  60. package/{typed → dist}/terrain/terrain-effect.d.ts +6 -7
  61. package/dist/terrain/terrain-effect.d.ts.map +1 -0
  62. package/dist/terrain/terrain-effect.js +174 -0
  63. package/dist/terrain/terrain-extension.js +44 -0
  64. package/dist/terrain/terrain-pass.d.ts +53 -0
  65. package/dist/terrain/terrain-pass.d.ts.map +1 -0
  66. package/dist/terrain/terrain-pass.js +69 -0
  67. package/{typed → dist}/terrain/terrain-picking-pass.d.ts +1 -1
  68. package/dist/terrain/terrain-picking-pass.d.ts.map +1 -0
  69. package/dist/terrain/terrain-picking-pass.js +67 -0
  70. package/{typed → dist}/terrain/utils.d.ts +1 -0
  71. package/{typed → dist}/terrain/utils.d.ts.map +1 -1
  72. package/dist/terrain/utils.js +25 -0
  73. package/{typed → dist}/utils/debug.d.ts.map +1 -1
  74. package/dist/utils/debug.js +50 -0
  75. package/dist/utils/projection-utils.js +153 -0
  76. package/dist/utils/syntax-tags.d.ts +6 -0
  77. package/dist/utils/syntax-tags.d.ts.map +1 -0
  78. package/dist/utils/syntax-tags.js +5 -0
  79. package/dist.min.js +918 -1254
  80. package/package.json +19 -16
  81. package/src/brushing/shader-module.ts +4 -3
  82. package/src/clip/clip-extension.ts +10 -9
  83. package/src/collision-filter/collision-filter-effect.ts +35 -31
  84. package/src/collision-filter/collision-filter-pass.ts +7 -13
  85. package/src/collision-filter/shader-module.ts +6 -4
  86. package/src/data-filter/aggregator.ts +8 -13
  87. package/src/data-filter/data-filter-extension.ts +181 -56
  88. package/src/data-filter/shader-module.ts +132 -37
  89. package/src/fill-style/fill-style-extension.ts +4 -5
  90. package/src/fill-style/{shaders.glsl.ts → shader-module.ts} +6 -5
  91. package/src/mask/mask-effect.ts +30 -20
  92. package/src/mask/mask-pass.ts +22 -18
  93. package/src/mask/shader-module.ts +7 -6
  94. package/src/path-style/path-style-extension.ts +1 -0
  95. package/src/terrain/shader-module.ts +14 -13
  96. package/src/terrain/terrain-cover.ts +2 -1
  97. package/src/terrain/terrain-effect.ts +19 -23
  98. package/src/terrain/terrain-pass.ts +37 -37
  99. package/src/terrain/terrain-picking-pass.ts +19 -25
  100. package/src/terrain/utils.ts +13 -7
  101. package/src/utils/debug.ts +1 -2
  102. package/src/utils/syntax-tags.ts +5 -0
  103. package/dist/es5/brushing/brushing-extension.js +0 -108
  104. package/dist/es5/brushing/brushing-extension.js.map +0 -1
  105. package/dist/es5/brushing/shader-module.js +0 -50
  106. package/dist/es5/brushing/shader-module.js.map +0 -1
  107. package/dist/es5/clip/clip-extension.js +0 -98
  108. package/dist/es5/clip/clip-extension.js.map +0 -1
  109. package/dist/es5/collision-filter/collision-filter-effect.js +0 -294
  110. package/dist/es5/collision-filter/collision-filter-effect.js.map +0 -1
  111. package/dist/es5/collision-filter/collision-filter-extension.js +0 -109
  112. package/dist/es5/collision-filter/collision-filter-extension.js.map +0 -1
  113. package/dist/es5/collision-filter/collision-filter-pass.js +0 -79
  114. package/dist/es5/collision-filter/collision-filter-pass.js.map +0 -1
  115. package/dist/es5/collision-filter/shader-module.js +0 -39
  116. package/dist/es5/collision-filter/shader-module.js.map +0 -1
  117. package/dist/es5/data-filter/aggregator.js +0 -79
  118. package/dist/es5/data-filter/aggregator.js.map +0 -1
  119. package/dist/es5/data-filter/data-filter-extension.js +0 -236
  120. package/dist/es5/data-filter/data-filter-extension.js.map +0 -1
  121. package/dist/es5/data-filter/shader-module.js +0 -122
  122. package/dist/es5/data-filter/shader-module.js.map +0 -1
  123. package/dist/es5/fill-style/fill-style-extension.js +0 -190
  124. package/dist/es5/fill-style/fill-style-extension.js.map +0 -1
  125. package/dist/es5/fill-style/shaders.glsl.js +0 -59
  126. package/dist/es5/fill-style/shaders.glsl.js.map +0 -1
  127. package/dist/es5/fp64/fp64-extension.js +0 -55
  128. package/dist/es5/fp64/fp64-extension.js.map +0 -1
  129. package/dist/es5/fp64/project64.glsl.js +0 -9
  130. package/dist/es5/fp64/project64.glsl.js.map +0 -1
  131. package/dist/es5/fp64/project64.js +0 -52
  132. package/dist/es5/fp64/project64.js.map +0 -1
  133. package/dist/es5/index.js +0 -88
  134. package/dist/es5/index.js.map +0 -1
  135. package/dist/es5/mask/mask-effect.js +0 -279
  136. package/dist/es5/mask/mask-effect.js.map +0 -1
  137. package/dist/es5/mask/mask-extension.js +0 -113
  138. package/dist/es5/mask/mask-extension.js.map +0 -1
  139. package/dist/es5/mask/mask-pass.js +0 -106
  140. package/dist/es5/mask/mask-pass.js.map +0 -1
  141. package/dist/es5/mask/shader-module.js +0 -38
  142. package/dist/es5/mask/shader-module.js.map +0 -1
  143. package/dist/es5/path-style/path-style-extension.js +0 -169
  144. package/dist/es5/path-style/path-style-extension.js.map +0 -1
  145. package/dist/es5/path-style/shaders.glsl.js +0 -25
  146. package/dist/es5/path-style/shaders.glsl.js.map +0 -1
  147. package/dist/es5/terrain/height-map-builder.js +0 -111
  148. package/dist/es5/terrain/height-map-builder.js.map +0 -1
  149. package/dist/es5/terrain/shader-module.js +0 -86
  150. package/dist/es5/terrain/shader-module.js.map +0 -1
  151. package/dist/es5/terrain/terrain-cover.js +0 -256
  152. package/dist/es5/terrain/terrain-cover.js.map +0 -1
  153. package/dist/es5/terrain/terrain-effect.js +0 -326
  154. package/dist/es5/terrain/terrain-effect.js.map +0 -1
  155. package/dist/es5/terrain/terrain-extension.js +0 -94
  156. package/dist/es5/terrain/terrain-extension.js.map +0 -1
  157. package/dist/es5/terrain/terrain-pass.js +0 -121
  158. package/dist/es5/terrain/terrain-pass.js.map +0 -1
  159. package/dist/es5/terrain/terrain-picking-pass.js +0 -124
  160. package/dist/es5/terrain/terrain-picking-pass.js.map +0 -1
  161. package/dist/es5/terrain/utils.js +0 -35
  162. package/dist/es5/terrain/utils.js.map +0 -1
  163. package/dist/es5/utils/debug.js +0 -71
  164. package/dist/es5/utils/debug.js.map +0 -1
  165. package/dist/es5/utils/projection-utils.js +0 -168
  166. package/dist/es5/utils/projection-utils.js.map +0 -1
  167. package/dist/esm/brushing/brushing-extension.js +0 -68
  168. package/dist/esm/brushing/brushing-extension.js.map +0 -1
  169. package/dist/esm/brushing/shader-module.js +0 -103
  170. package/dist/esm/brushing/shader-module.js.map +0 -1
  171. package/dist/esm/clip/clip-extension.js +0 -86
  172. package/dist/esm/clip/clip-extension.js.map +0 -1
  173. package/dist/esm/collision-filter/collision-filter-effect.js +0 -246
  174. package/dist/esm/collision-filter/collision-filter-effect.js.map +0 -1
  175. package/dist/esm/collision-filter/collision-filter-extension.js +0 -75
  176. package/dist/esm/collision-filter/collision-filter-extension.js.map +0 -1
  177. package/dist/esm/collision-filter/collision-filter-pass.js +0 -32
  178. package/dist/esm/collision-filter/collision-filter-pass.js.map +0 -1
  179. package/dist/esm/collision-filter/shader-module.js +0 -104
  180. package/dist/esm/collision-filter/shader-module.js.map +0 -1
  181. package/dist/esm/data-filter/aggregator.js.map +0 -1
  182. package/dist/esm/data-filter/data-filter-extension.js +0 -189
  183. package/dist/esm/data-filter/data-filter-extension.js.map +0 -1
  184. package/dist/esm/data-filter/shader-module.js +0 -164
  185. package/dist/esm/data-filter/shader-module.js.map +0 -1
  186. package/dist/esm/fill-style/fill-style-extension.js +0 -156
  187. package/dist/esm/fill-style/fill-style-extension.js.map +0 -1
  188. package/dist/esm/fill-style/shaders.glsl.js +0 -108
  189. package/dist/esm/fill-style/shaders.glsl.js.map +0 -1
  190. package/dist/esm/fp64/fp64-extension.js +0 -20
  191. package/dist/esm/fp64/fp64-extension.js.map +0 -1
  192. package/dist/esm/fp64/project64.glsl.js +0 -82
  193. package/dist/esm/fp64/project64.glsl.js.map +0 -1
  194. package/dist/esm/fp64/project64.js +0 -43
  195. package/dist/esm/fp64/project64.js.map +0 -1
  196. package/dist/esm/index.js +0 -11
  197. package/dist/esm/index.js.map +0 -1
  198. package/dist/esm/mask/mask-effect.js +0 -228
  199. package/dist/esm/mask/mask-effect.js.map +0 -1
  200. package/dist/esm/mask/mask-extension.js +0 -83
  201. package/dist/esm/mask/mask-extension.js.map +0 -1
  202. package/dist/esm/mask/mask-pass.js +0 -58
  203. package/dist/esm/mask/mask-pass.js.map +0 -1
  204. package/dist/esm/mask/shader-module.js +0 -84
  205. package/dist/esm/mask/shader-module.js.map +0 -1
  206. package/dist/esm/path-style/path-style-extension.js +0 -130
  207. package/dist/esm/path-style/path-style-extension.js.map +0 -1
  208. package/dist/esm/path-style/shaders.glsl.js +0 -84
  209. package/dist/esm/path-style/shaders.glsl.js.map +0 -1
  210. package/dist/esm/terrain/height-map-builder.js +0 -86
  211. package/dist/esm/terrain/height-map-builder.js.map +0 -1
  212. package/dist/esm/terrain/shader-module.js +0 -127
  213. package/dist/esm/terrain/shader-module.js.map +0 -1
  214. package/dist/esm/terrain/terrain-cover.js +0 -212
  215. package/dist/esm/terrain/terrain-cover.js.map +0 -1
  216. package/dist/esm/terrain/terrain-effect.js +0 -219
  217. package/dist/esm/terrain/terrain-effect.js.map +0 -1
  218. package/dist/esm/terrain/terrain-extension.js +0 -59
  219. package/dist/esm/terrain/terrain-extension.js.map +0 -1
  220. package/dist/esm/terrain/terrain-pass.js +0 -71
  221. package/dist/esm/terrain/terrain-pass.js.map +0 -1
  222. package/dist/esm/terrain/terrain-picking-pass.js +0 -73
  223. package/dist/esm/terrain/terrain-picking-pass.js.map +0 -1
  224. package/dist/esm/terrain/utils.js +0 -19
  225. package/dist/esm/terrain/utils.js.map +0 -1
  226. package/dist/esm/utils/debug.js +0 -61
  227. package/dist/esm/utils/debug.js.map +0 -1
  228. package/dist/esm/utils/projection-utils.js +0 -134
  229. package/dist/esm/utils/projection-utils.js.map +0 -1
  230. package/typed/collision-filter/collision-filter-effect.d.ts.map +0 -1
  231. package/typed/collision-filter/collision-filter-pass.d.ts.map +0 -1
  232. package/typed/data-filter/aggregator.d.ts.map +0 -1
  233. package/typed/data-filter/data-filter-extension.d.ts.map +0 -1
  234. package/typed/data-filter/shader-module.d.ts +0 -9
  235. package/typed/data-filter/shader-module.d.ts.map +0 -1
  236. package/typed/fill-style/fill-style-extension.d.ts.map +0 -1
  237. package/typed/fill-style/shaders.glsl.d.ts.map +0 -1
  238. package/typed/index.d.ts +0 -19
  239. package/typed/index.d.ts.map +0 -1
  240. package/typed/mask/mask-effect.d.ts.map +0 -1
  241. package/typed/mask/mask-pass.d.ts +0 -19
  242. package/typed/mask/mask-pass.d.ts.map +0 -1
  243. package/typed/terrain/height-map-builder.d.ts.map +0 -1
  244. package/typed/terrain/shader-module.d.ts.map +0 -1
  245. package/typed/terrain/terrain-cover.d.ts.map +0 -1
  246. package/typed/terrain/terrain-effect.d.ts.map +0 -1
  247. package/typed/terrain/terrain-pass.d.ts +0 -11
  248. package/typed/terrain/terrain-pass.d.ts.map +0 -1
  249. package/typed/terrain/terrain-picking-pass.d.ts.map +0 -1
  250. /package/{typed → dist}/brushing/brushing-extension.d.ts +0 -0
  251. /package/{typed → dist}/brushing/brushing-extension.d.ts.map +0 -0
  252. /package/{typed → dist}/clip/clip-extension.d.ts +0 -0
  253. /package/{typed → dist}/collision-filter/collision-filter-extension.d.ts +0 -0
  254. /package/{typed → dist}/collision-filter/collision-filter-extension.d.ts.map +0 -0
  255. /package/{typed → dist}/collision-filter/shader-module.d.ts +0 -0
  256. /package/{typed → dist}/data-filter/aggregator.d.ts +0 -0
  257. /package/{typed → dist}/fp64/fp64-extension.d.ts +0 -0
  258. /package/{typed → dist}/fp64/fp64-extension.d.ts.map +0 -0
  259. /package/{typed → dist}/fp64/project64.d.ts +0 -0
  260. /package/{typed → dist}/fp64/project64.d.ts.map +0 -0
  261. /package/{typed → dist}/fp64/project64.glsl.d.ts +0 -0
  262. /package/{typed → dist}/fp64/project64.glsl.d.ts.map +0 -0
  263. /package/{typed → dist}/mask/mask-extension.d.ts +0 -0
  264. /package/{typed → dist}/mask/mask-extension.d.ts.map +0 -0
  265. /package/{typed → dist}/mask/shader-module.d.ts +0 -0
  266. /package/{typed → dist}/path-style/path-style-extension.d.ts +0 -0
  267. /package/{typed → dist}/path-style/shaders.glsl.d.ts +0 -0
  268. /package/{typed → dist}/path-style/shaders.glsl.d.ts.map +0 -0
  269. /package/{typed → dist}/terrain/terrain-extension.d.ts +0 -0
  270. /package/{typed → dist}/terrain/terrain-extension.d.ts.map +0 -0
  271. /package/{typed → dist}/utils/debug.d.ts +0 -0
  272. /package/{typed → dist}/utils/projection-utils.d.ts +0 -0
  273. /package/{typed → dist}/utils/projection-utils.d.ts.map +0 -0
@@ -1,6 +1,13 @@
1
- import {Layer, Viewport, Effect, PreRenderOptions, CoordinateSystem, log} from '@deck.gl/core';
2
- import type {Device, Texture} from '@luma.gl/core';
3
- // import {readPixelsToArray} from '@luma.gl/webgl-legacy';
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: number;
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: number;
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
- preRender(
47
- device: Device,
48
- {layers, layerFilter, viewports, onViewportActive, views, isPicking}: PreRenderOptions
49
- ): MaskPreRenderStats {
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
@@ -1,11 +1,18 @@
1
- import type {Device, Framebuffer, Texture} from '@luma.gl/core';
2
- import {withGLParameters} from '@luma.gl/webgl';
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: number;
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 = [false, false, false, false];
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
- return withGLParameters(
46
- this.device,
47
- {
48
- blend: true,
49
- blendFunc: [GL.ZERO, GL.ONE],
50
- blendEquation: GL.FUNC_SUBTRACT,
51
- colorMask,
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
 
@@ -177,6 +177,7 @@ export default class PathStyleExtension extends LayerExtension<PathStyleExtensio
177
177
 
178
178
  prevP = p;
179
179
  }
180
+ result[geometrySize - 1] = 0;
180
181
  return result;
181
182
  }
182
183
  }
@@ -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
- ${TERRAIN_MODE_CONSTANTS}
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
- ${TERRAIN_MODE_CONSTANTS}
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
- // @ts-expect-error
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 {Device, Texture} from '@luma.gl/core';
2
- import {log, getShaderAssembler} from '@deck.gl/core';
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
- initialize(device: Device) {
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
- getShaderAssembler().addDefaultModule(terrainModule);
46
+ deck._addDefaultShaderModule(terrainModule);
47
47
  }
48
48
 
49
- preRender(device: Device, opts: PreRenderOptions): void {
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, isPicking = false} = opts;
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
- // @ts-expect-error
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
- terrainCover.isDirty = false;
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 {withGLParameters} from '@luma.gl/webgl';
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
- withGLParameters(
37
- this.device,
38
- {
39
- clearColor: [0, 0, 0, 0],
40
- blend: true,
41
- blendFunc: [GL.ONE, GL.ONE],
42
- blendEquation: GL.MAX,
43
- depthTest: false
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
- withGLParameters(
70
- this.device,
71
- {
72
- clearColor: [0, 0, 0, 0],
73
- depthTest: false
74
- },
75
- () =>
76
- this.render({
77
- ...opts,
78
- target,
79
- pass: `terrain-cover-${terrainCover.id}`,
80
- layers,
81
- effects: [],
82
- viewports: [viewport]
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
- withGLParameters(
58
- this.device,
59
- {
60
- depthTest: false
61
- },
62
- () =>
63
- this.render({
64
- ...opts,
65
- pickingFBO: target,
66
- pass: `terrain-cover-picking-${terrainCover.id}`,
67
- layers,
68
- effects: [],
69
- viewports: [viewport],
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
- return this.drawParameters[layer.id];
74
+ parameters = this.drawParameters[layer.id];
75
+ } else {
76
+ parameters = super.getLayerParameters(layer, layerIndex, viewport);
77
+ parameters.blend = true;
82
78
  }
83
- const parameters = super.getLayerParameters(layer, layerIndex, viewport);
84
- parameters.blend = true;
85
- return parameters;
79
+ return {...parameters, depthTest: false};
86
80
  }
87
81
  }
@@ -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: device.info.type === 'webgl2' ? 'rgba32float' : 'rgba8unorm',
18
+ format: 'rgba32float',
17
19
  type: GL.FLOAT
18
20
  }),
19
21
  mipmaps: false,
20
- sampler: {
21
- minFilter: 'linear',
22
- magFilter: 'linear',
23
- addressModeU: 'clamp-to-edge',
24
- addressModeV: 'clamp-to-edge'
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
  });
@@ -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 = readPixelsToArray(fbo);
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) {
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Marks GLSL shaders for syntax highlighting: glsl`...`
3
+ * Install https://marketplace.visualstudio.com/items?itemName=boyswan.glsl-literal
4
+ */
5
+ export const glsl = (s: TemplateStringsArray) => `${s}`;