@deck.gl/extensions 9.0.0-beta.10 → 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 (50) hide show
  1. package/dist/collision-filter/collision-filter-effect.d.ts +4 -2
  2. package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -1
  3. package/dist/collision-filter/collision-filter-effect.js +10 -9
  4. package/dist/collision-filter/collision-filter-pass.d.ts +3 -2
  5. package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -1
  6. package/dist/collision-filter/collision-filter-pass.js +5 -7
  7. package/dist/data-filter/data-filter-extension.d.ts +5 -5
  8. package/dist/data-filter/data-filter-extension.d.ts.map +1 -1
  9. package/dist/data-filter/data-filter-extension.js +45 -38
  10. package/dist/data-filter/shader-module.d.ts +30 -0
  11. package/dist/data-filter/shader-module.d.ts.map +1 -1
  12. package/dist/data-filter/shader-module.js +40 -20
  13. package/dist/dist.dev.js +571 -535
  14. package/dist/index.cjs +517 -478
  15. package/dist/index.cjs.map +4 -4
  16. package/dist/mask/mask-effect.d.ts +5 -4
  17. package/dist/mask/mask-effect.d.ts.map +1 -1
  18. package/dist/mask/mask-effect.js +9 -11
  19. package/dist/mask/mask-pass.d.ts +45 -3
  20. package/dist/mask/mask-pass.d.ts.map +1 -1
  21. package/dist/mask/mask-pass.js +17 -9
  22. package/dist/path-style/path-style-extension.d.ts.map +1 -1
  23. package/dist/path-style/path-style-extension.js +1 -0
  24. package/dist/terrain/terrain-cover.d.ts.map +1 -1
  25. package/dist/terrain/terrain-cover.js +2 -1
  26. package/dist/terrain/terrain-effect.d.ts +4 -5
  27. package/dist/terrain/terrain-effect.d.ts.map +1 -1
  28. package/dist/terrain/terrain-effect.js +6 -16
  29. package/dist/terrain/terrain-pass.d.ts +42 -0
  30. package/dist/terrain/terrain-pass.d.ts.map +1 -1
  31. package/dist/terrain/terrain-pass.js +24 -16
  32. package/dist/terrain/terrain-picking-pass.d.ts.map +1 -1
  33. package/dist/terrain/terrain-picking-pass.js +9 -8
  34. package/dist/terrain/utils.d.ts +1 -0
  35. package/dist/terrain/utils.d.ts.map +1 -1
  36. package/dist/terrain/utils.js +10 -6
  37. package/dist.min.js +63 -40
  38. package/package.json +6 -6
  39. package/src/collision-filter/collision-filter-effect.ts +23 -23
  40. package/src/collision-filter/collision-filter-pass.ts +7 -11
  41. package/src/data-filter/data-filter-extension.ts +57 -49
  42. package/src/data-filter/shader-module.ts +109 -43
  43. package/src/mask/mask-effect.ts +30 -19
  44. package/src/mask/mask-pass.ts +22 -16
  45. package/src/path-style/path-style-extension.ts +1 -0
  46. package/src/terrain/terrain-cover.ts +2 -1
  47. package/src/terrain/terrain-effect.ts +8 -19
  48. package/src/terrain/terrain-pass.ts +37 -34
  49. package/src/terrain/terrain-picking-pass.ts +19 -23
  50. package/src/terrain/utils.ts +12 -6
@@ -1,16 +1,18 @@
1
1
  import { Device, Framebuffer, Texture } from '@luma.gl/core';
2
- import type { Effect, Layer, PreRenderOptions } from '@deck.gl/core';
2
+ import type { Effect, EffectContext, Layer, PreRenderOptions } from '@deck.gl/core';
3
3
  export default class CollisionFilterEffect implements Effect {
4
4
  id: string;
5
5
  props: null;
6
6
  useInPicking: boolean;
7
7
  order: number;
8
+ private context?;
8
9
  private channels;
9
10
  private collisionFilterPass?;
10
11
  private collisionFBOs;
11
12
  private dummyCollisionMap?;
12
13
  private lastViewport?;
13
- preRender(device: Device, { effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats }: PreRenderOptions): void;
14
+ setup(context: EffectContext): void;
15
+ preRender({ effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats }: PreRenderOptions): void;
14
16
  private _render;
15
17
  /**
16
18
  * Group layers by collisionGroup
@@ -1 +1 @@
1
- {"version":3,"file":"collision-filter-effect.d.ts","sourceRoot":"","sources":["../../src/collision-filter/collision-filter-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAG3D,OAAO,KAAK,EAAC,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAW,MAAM,eAAe,CAAC;AAoB7E,MAAM,CAAC,OAAO,OAAO,qBAAsB,YAAW,MAAM;IAC1D,EAAE,SAA6B;IAC/B,KAAK,OAAQ;IACb,YAAY,UAAQ;IACpB,KAAK,SAAK;IAEV,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,iBAAiB,CAAC,CAAU;IACpC,OAAO,CAAC,YAAY,CAAC,CAAW;IAEhC,SAAS,CACP,MAAM,EAAE,MAAM,EACd,EACE,OAAO,EAAE,UAAU,EACnB,MAAM,EACN,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,SAAS,EACT,cAAmB,EACpB,EAAE,gBAAgB,GAClB,IAAI;IAyDP,OAAO,CAAC,OAAO;IA+Df;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAqC9B,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG;QACjC,YAAY,EAAE,WAAW,CAAC;QAC1B,iBAAiB,EAAE,OAAO,CAAC;KAC5B;IAMD,OAAO,IAAI,IAAI;IAaf,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;IAmChD,UAAU,CAAC,cAAc,EAAE,MAAM;CAOlC"}
1
+ {"version":3,"file":"collision-filter-effect.d.ts","sourceRoot":"","sources":["../../src/collision-filter/collision-filter-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAG3D,OAAO,KAAK,EAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,gBAAgB,EAAW,MAAM,eAAe,CAAC;AAoB5F,MAAM,CAAC,OAAO,OAAO,qBAAsB,YAAW,MAAM;IAC1D,EAAE,SAA6B;IAC/B,KAAK,OAAQ;IACb,YAAY,UAAQ;IACpB,KAAK,SAAK;IAEV,OAAO,CAAC,OAAO,CAAC,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAClD,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,iBAAiB,CAAC,CAAU;IACpC,OAAO,CAAC,YAAY,CAAC,CAAW;IAEhC,KAAK,CAAC,OAAO,EAAE,aAAa;IAO5B,SAAS,CAAC,EACR,OAAO,EAAE,UAAU,EACnB,MAAM,EACN,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,SAAS,EACT,cAAmB,EACpB,EAAE,gBAAgB,GAAG,IAAI;IAoD1B,OAAO,CAAC,OAAO;IA+Df;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAqC9B,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG;QACjC,YAAY,EAAE,WAAW,CAAC;QAC1B,iBAAiB,EAAE,OAAO,CAAC;KAC5B;IAMD,OAAO,IAAI,IAAI;IAaf,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;IAmChD,UAAU,CAAC,cAAc,EAAE,MAAM;CAOlC"}
@@ -1,7 +1,6 @@
1
1
  import { equals } from '@math.gl/core';
2
2
  import { _deepEqual as deepEqual } from '@deck.gl/core';
3
3
  import CollisionFilterPass from "./collision-filter-pass.js";
4
- import MaskEffect from "../mask/mask-effect.js";
5
4
  // Factor by which to downscale Collision FBO relative to canvas
6
5
  const DOWNSCALE = 2;
7
6
  export default class CollisionFilterEffect {
@@ -13,10 +12,15 @@ export default class CollisionFilterEffect {
13
12
  this.channels = {};
14
13
  this.collisionFBOs = {};
15
14
  }
16
- preRender(device, { effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats = {} }) {
17
- if (!this.dummyCollisionMap) {
18
- this.dummyCollisionMap = device.createTexture({ width: 1, height: 1 });
19
- }
15
+ setup(context) {
16
+ this.context = context;
17
+ const { device } = context;
18
+ this.dummyCollisionMap = device.createTexture({ width: 1, height: 1 });
19
+ this.collisionFilterPass = new CollisionFilterPass(device, { id: 'default-collision-filter' });
20
+ }
21
+ preRender({ effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats = {} }) {
22
+ // This can only be called in preRender() after setup() where context is populated
23
+ const { device } = this.context;
20
24
  if (isPicking) {
21
25
  // Do not update on picking pass
22
26
  return;
@@ -28,11 +32,8 @@ export default class CollisionFilterEffect {
28
32
  this.channels = {};
29
33
  return;
30
34
  }
31
- if (!this.collisionFilterPass) {
32
- this.collisionFilterPass = new CollisionFilterPass(device, { id: 'default-collision-filter' });
33
- }
34
35
  // Detect if mask has rendered. TODO: better dependency system for Effects
35
- const effects = allEffects?.filter(e => e.constructor === MaskEffect);
36
+ const effects = allEffects?.filter(e => e.useInPicking && preRenderStats[e.id]);
36
37
  const maskEffectRendered = preRenderStats['mask-effect']?.didRender;
37
38
  // Collect layers to render
38
39
  const channels = this._groupByCollisionGroup(device, collisionLayers);
@@ -1,8 +1,9 @@
1
1
  import { Framebuffer } from '@luma.gl/core';
2
- import { _LayersPass as LayersPass, LayersPassRenderOptions } from '@deck.gl/core';
2
+ import { Layer, _LayersPass as LayersPass, LayersPassRenderOptions, Viewport } from '@deck.gl/core';
3
3
  type CollisionFilterPassRenderOptions = LayersPassRenderOptions & {};
4
4
  export default class CollisionFilterPass extends LayersPass {
5
- renderCollisionMap(target: Framebuffer, options: CollisionFilterPassRenderOptions): any;
5
+ renderCollisionMap(target: Framebuffer, options: CollisionFilterPassRenderOptions): void;
6
+ protected getLayerParameters(layer: Layer, layerIndex: number, viewport: Viewport): any;
6
7
  getModuleParameters(): {
7
8
  drawToCollisionMap: boolean;
8
9
  picking: {
@@ -1 +1 @@
1
- {"version":3,"file":"collision-filter-pass.d.ts","sourceRoot":"","sources":["../../src/collision-filter/collision-filter-pass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAC,WAAW,IAAI,UAAU,EAAE,uBAAuB,EAAC,MAAM,eAAe,CAAC;AAEjF,KAAK,gCAAgC,GAAG,uBAAuB,GAAG,EAAE,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,UAAU;IACzD,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,gCAAgC;IAgBjF,mBAAmB;;;;;;;;CAWpB"}
1
+ {"version":3,"file":"collision-filter-pass.d.ts","sourceRoot":"","sources":["../../src/collision-filter/collision-filter-pass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAC,KAAK,EAAE,WAAW,IAAI,UAAU,EAAE,uBAAuB,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAC;AAElG,KAAK,gCAAgC,GAAG,uBAAuB,GAAG,EAAE,CAAC;AAErE,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,UAAU;IACzD,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,gCAAgC;IAQjF,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG;IAIvF,mBAAmB;;;;;;;;CAWpB"}
@@ -3,13 +3,11 @@ export default class CollisionFilterPass extends LayersPass {
3
3
  renderCollisionMap(target, options) {
4
4
  const padding = 1;
5
5
  const clearColor = [0, 0, 0, 0];
6
- return this.device.withParametersWebGL({
7
- scissorTest: true,
8
- scissor: [padding, padding, target.width - 2 * padding, target.height - 2 * padding],
9
- blend: false,
10
- depthTest: true,
11
- depthRange: [0, 1]
12
- }, () => this.render({ ...options, clearColor, target, pass: 'collision' }));
6
+ const scissorRect = [padding, padding, target.width - 2 * padding, target.height - 2 * padding];
7
+ this.render({ ...options, clearColor, scissorRect, target, pass: 'collision' });
8
+ }
9
+ getLayerParameters(layer, layerIndex, viewport) {
10
+ return { ...layer.props.parameters, blend: false, depthRange: [0, 1], depthTest: true };
13
11
  }
14
12
  getModuleParameters() {
15
13
  // Draw picking colors into collision FBO
@@ -56,15 +56,15 @@ export type DataFilterExtensionProps<DataT = any> = {
56
56
  };
57
57
  type DataFilterExtensionOptions = {
58
58
  /**
59
- * The size of the category filter (number of columns to filter by). The category filter can show/hide data based on 1-4 properties of each object.
60
- * @default 1
59
+ * The size of the category filter (number of columns to filter by). The category filter can show/hide data based on 1-4 properties of each object. Set to `0` to disable category filtering.
60
+ * @default 0
61
61
  */
62
- categorySize?: 1 | 2 | 3 | 4;
62
+ categorySize?: 0 | 1 | 2 | 3 | 4;
63
63
  /**
64
- * The size of the filter (number of columns to filter by). The data filter can show/hide data based on 1-4 numeric properties of each object.
64
+ * The size of the filter (number of columns to filter by). The data filter can show/hide data based on 1-4 numeric properties of each object. Set to `0` to disable numeric filtering.
65
65
  * @default 1
66
66
  */
67
- filterSize?: 1 | 2 | 3 | 4;
67
+ filterSize?: 0 | 1 | 2 | 3 | 4;
68
68
  /**
69
69
  * Use 64-bit precision instead of 32-bit.
70
70
  * @default false
@@ -1 +1 @@
1
- {"version":3,"file":"data-filter-extension.d.ts","sourceRoot":"","sources":["../../src/data-filter/data-filter-extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-filter-extension.d.ts","sourceRoot":"","sources":["../../src/data-filter/data-filter-extension.ts"],"names":[],"mappings":"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"}
@@ -32,7 +32,7 @@ const defaultProps = {
32
32
  filterTransformColor: true
33
33
  };
34
34
  const defaultOptions = {
35
- categorySize: 1,
35
+ categorySize: 0,
36
36
  filterSize: 1,
37
37
  fp64: false,
38
38
  countItems: false
@@ -52,50 +52,57 @@ export default class DataFilterExtension extends LayerExtension {
52
52
  }
53
53
  getShaders(extension) {
54
54
  const { categorySize, filterSize, fp64 } = extension.opts;
55
- return {
56
- modules: [fp64 ? shaderModule64 : shaderModule],
57
- defines: {
58
- DATACATEGORY_TYPE: DATA_TYPE_FROM_SIZE[categorySize],
59
- DATACATEGORY_CHANNELS: categorySize,
60
- DATAFILTER_TYPE: DATA_TYPE_FROM_SIZE[filterSize],
61
- DATAFILTER_DOUBLE: Boolean(fp64)
62
- }
63
- };
55
+ const defines = {};
56
+ if (categorySize) {
57
+ defines.DATACATEGORY_TYPE = DATA_TYPE_FROM_SIZE[categorySize];
58
+ defines.DATACATEGORY_CHANNELS = categorySize;
59
+ }
60
+ if (filterSize) {
61
+ defines.DATAFILTER_TYPE = DATA_TYPE_FROM_SIZE[filterSize];
62
+ defines.DATAFILTER_DOUBLE = Boolean(fp64);
63
+ }
64
+ return { modules: [fp64 ? shaderModule64 : shaderModule], defines };
64
65
  }
65
66
  initializeState(context, extension) {
66
67
  const attributeManager = this.getAttributeManager();
67
68
  const { categorySize, filterSize, fp64 } = extension.opts;
68
69
  if (attributeManager) {
69
- attributeManager.add({
70
- filterValues: {
71
- size: filterSize,
72
- type: fp64 ? 'float64' : 'float32',
73
- accessor: 'getFilterValue',
74
- shaderAttributes: {
75
- filterValues: {
76
- divisor: 0
77
- },
78
- instanceFilterValues: {
79
- divisor: 1
70
+ if (filterSize) {
71
+ attributeManager.add({
72
+ filterValues: {
73
+ size: filterSize,
74
+ type: fp64 ? 'float64' : 'float32',
75
+ accessor: 'getFilterValue',
76
+ shaderAttributes: {
77
+ filterValues: {
78
+ divisor: 0
79
+ },
80
+ instanceFilterValues: {
81
+ divisor: 1
82
+ }
80
83
  }
81
84
  }
82
- },
83
- filterCategoryValues: {
84
- size: categorySize,
85
- accessor: 'getFilterCategory',
86
- transform: categorySize === 1
87
- ? d => extension._getCategoryKey.call(this, d, 0)
88
- : d => d.map((x, i) => extension._getCategoryKey.call(this, x, i)),
89
- shaderAttributes: {
90
- filterCategoryValues: {
91
- divisor: 0
92
- },
93
- instanceFilterCategoryValues: {
94
- divisor: 1
85
+ });
86
+ }
87
+ if (categorySize) {
88
+ attributeManager.add({
89
+ filterCategoryValues: {
90
+ size: categorySize,
91
+ accessor: 'getFilterCategory',
92
+ transform: categorySize === 1
93
+ ? d => extension._getCategoryKey.call(this, d, 0)
94
+ : d => d.map((x, i) => extension._getCategoryKey.call(this, x, i)),
95
+ shaderAttributes: {
96
+ filterCategoryValues: {
97
+ divisor: 0
98
+ },
99
+ instanceFilterCategoryValues: {
100
+ divisor: 1
101
+ }
95
102
  }
96
103
  }
97
- }
98
- });
104
+ });
105
+ }
99
106
  }
100
107
  const { device } = this.context;
101
108
  if (attributeManager && extension.opts.countItems) {
@@ -133,7 +140,7 @@ export default class DataFilterExtension extends LayerExtension {
133
140
  if (this.state.filterModel) {
134
141
  const filterNeedsUpdate =
135
142
  // attributeManager must be defined for filterModel to be set
136
- attributeManager.attributes.filterValues.needsUpdate() ||
143
+ attributeManager.attributes.filterValues?.needsUpdate() ||
137
144
  attributeManager.attributes.filterCategoryValues?.needsUpdate() ||
138
145
  props.filterEnabled !== oldProps.filterEnabled ||
139
146
  props.filterRange !== oldProps.filterRange ||
@@ -178,7 +185,7 @@ export default class DataFilterExtension extends LayerExtension {
178
185
  filterModel.updateModuleSettings(params.moduleParameters);
179
186
  // @ts-expect-error filterValue and filterIndices should always have buffer value
180
187
  filterModel.setAttributes({
181
- ...filterValues.getValue(),
188
+ ...filterValues?.getValue(),
182
189
  ...filterCategoryValues?.getValue(),
183
190
  ...filterIndices?.getValue()
184
191
  });
@@ -1,5 +1,35 @@
1
1
  import type { ShaderModule } from '@luma.gl/shadertools';
2
2
  import type { DataFilterExtensionProps } from "./data-filter-extension.js";
3
+ export type Defines = {
4
+ /**
5
+ * Primitive type of parameter used for category filtering. If undefined, category filtering disabled.
6
+ */
7
+ DATACATEGORY_TYPE?: 'float' | 'vec2' | 'vec3' | 'vec4';
8
+ /**
9
+ * Number of category filtering channels. Must match dimension of `DATACATEGORY_TYPE`
10
+ */
11
+ DATACATEGORY_CHANNELS?: 1 | 2 | 3 | 4;
12
+ /**
13
+ * Primitive type of parameter used for numeric filtering. If undefined, numeric filtering disabled.
14
+ */
15
+ DATAFILTER_TYPE?: 'float' | 'vec2' | 'vec3' | 'vec4';
16
+ /**
17
+ * Enable 64-bit precision in numeric filter.
18
+ */
19
+ DATAFILTER_DOUBLE?: boolean;
20
+ /**
21
+ * Numeric filter attribute
22
+ */
23
+ DATAFILTER_ATTRIB?: 'filterValues' | 'instanceFilterValues';
24
+ /**
25
+ * Numeric filter attribute (low bits). Only used when `DATAFILTER_DOUBLE = true`
26
+ */
27
+ DATAFILTER_ATTRIB_64LOW?: 'filterValues64Low' | 'instanceFilterValues64Low';
28
+ /**
29
+ * Category filter attribute
30
+ */
31
+ DATACATEGORY_ATTRIB?: 'filterCategoryValues' | 'instanceFilterCategoryValues';
32
+ };
3
33
  type DataFilterModuleSettings = {
4
34
  extensions: any[];
5
35
  } & DataFilterExtensionProps;
@@ -1 +1 @@
1
- {"version":3,"file":"shader-module.d.ts","sourceRoot":"","sources":["../../src/data-filter/shader-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAC,wBAAwB,EAAC,mCAAgC;AA+FtE,KAAK,wBAAwB,GAAG;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC;CACnB,GAAG,wBAAwB,CAAC;AAkG7B,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,wBAAwB,CAM/D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,wBAAwB,CAMjE,CAAC"}
1
+ {"version":3,"file":"shader-module.d.ts","sourceRoot":"","sources":["../../src/data-filter/shader-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAC,wBAAwB,EAAC,mCAAgC;AAMtE,MAAM,MAAM,OAAO,GAAG;IAEpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACvD;;OAEG;IACH,qBAAqB,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEtC;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAErD;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAG5B;;OAEG;IACH,iBAAiB,CAAC,EAAE,cAAc,GAAG,sBAAsB,CAAC;IAC5D;;OAEG;IACH,uBAAuB,CAAC,EAAE,mBAAmB,GAAG,2BAA2B,CAAC;IAC5E;;OAEG;IACH,mBAAmB,CAAC,EAAE,sBAAsB,GAAG,8BAA8B,CAAC;CAC/E,CAAC;AAiHF,KAAK,wBAAwB,GAAG;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC;CACnB,GAAG,wBAAwB,CAAC;AA0G7B,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,wBAAwB,CAM/D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,wBAAwB,CAMjE,CAAC"}
@@ -1,24 +1,20 @@
1
1
  import { glsl } from "../utils/syntax-tags.js";
2
- /*
3
- * data filter shader module
4
- */
5
2
  const vs = `
6
- uniform DATAFILTER_TYPE filter_min;
7
- uniform DATAFILTER_TYPE filter_softMin;
8
- uniform DATAFILTER_TYPE filter_softMax;
9
- uniform DATAFILTER_TYPE filter_max;
10
3
  uniform bool filter_useSoftMargin;
11
4
  uniform bool filter_enabled;
12
5
  uniform bool filter_transformSize;
13
6
  uniform ivec4 filter_categoryBitMask;
7
+ #ifdef DATAFILTER_TYPE
8
+ uniform DATAFILTER_TYPE filter_min;
9
+ uniform DATAFILTER_TYPE filter_softMin;
10
+ uniform DATAFILTER_TYPE filter_softMax;
11
+ uniform DATAFILTER_TYPE filter_max;
14
12
  #ifdef NON_INSTANCED_MODEL
15
13
  #define DATAFILTER_ATTRIB filterValues
16
14
  #define DATAFILTER_ATTRIB_64LOW filterValues64Low
17
- #define DATACATEGORY_ATTRIB filterCategoryValues
18
15
  #else
19
16
  #define DATAFILTER_ATTRIB instanceFilterValues
20
17
  #define DATAFILTER_ATTRIB_64LOW instanceFilterValues64Low
21
- #define DATACATEGORY_ATTRIB instanceFilterCategoryValues
22
18
  #endif
23
19
  in DATAFILTER_TYPE DATAFILTER_ATTRIB;
24
20
  #ifdef DATAFILTER_DOUBLE
@@ -26,7 +22,15 @@ in DATAFILTER_TYPE DATAFILTER_ATTRIB_64LOW;
26
22
  uniform DATAFILTER_TYPE filter_min64High;
27
23
  uniform DATAFILTER_TYPE filter_max64High;
28
24
  #endif
25
+ #endif
26
+ #ifdef DATACATEGORY_TYPE
27
+ #ifdef NON_INSTANCED_MODEL
28
+ #define DATACATEGORY_ATTRIB filterCategoryValues
29
+ #else
30
+ #define DATACATEGORY_ATTRIB instanceFilterCategoryValues
31
+ #endif
29
32
  in DATACATEGORY_TYPE DATACATEGORY_ATTRIB;
33
+ #endif
30
34
  out float dataFilter_value;
31
35
  float dataFilter_reduceValue(float value) {
32
36
  return value;
@@ -40,18 +44,29 @@ return min(min(value.x, value.y), value.z);
40
44
  float dataFilter_reduceValue(vec4 value) {
41
45
  return min(min(value.x, value.y), min(value.z, value.w));
42
46
  }
43
- void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax, DATACATEGORY_TYPE category) {
44
- if (filter_enabled) {
47
+ #ifdef DATAFILTER_TYPE
48
+ void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {
45
49
  if (filter_useSoftMargin) {
46
- dataFilter_value = dataFilter_reduceValue(
47
- smoothstep(filter_min, filter_softMin, valueFromMin) *
48
- (1.0 - smoothstep(filter_softMax, filter_max, valueFromMax))
50
+ DATAFILTER_TYPE leftInRange = mix(
51
+ smoothstep(filter_min, filter_softMin, valueFromMin),
52
+ step(filter_min, valueFromMin),
53
+ step(filter_softMin, filter_min)
54
+ );
55
+ DATAFILTER_TYPE rightInRange = mix(
56
+ 1.0 - smoothstep(filter_softMax, filter_max, valueFromMax),
57
+ step(valueFromMax, filter_max),
58
+ step(filter_max, filter_softMax)
49
59
  );
60
+ dataFilter_value = dataFilter_reduceValue(leftInRange * rightInRange);
50
61
  } else {
51
62
  dataFilter_value = dataFilter_reduceValue(
52
63
  step(filter_min, valueFromMin) * step(valueFromMax, filter_max)
53
64
  );
54
65
  }
66
+ }
67
+ #endif
68
+ #ifdef DATACATEGORY_ATTRIB
69
+ void dataFilter_setCategoryValue(DATACATEGORY_TYPE category) {
55
70
  #if DATACATEGORY_CHANNELS == 1
56
71
  int dataFilter_masks = filter_categoryBitMask[int(category / 32.0)];
57
72
  #elif DATACATEGORY_CHANNELS == 2
@@ -71,10 +86,8 @@ if(dataFilter_bits == 0.0) dataFilter_value = 0.0;
71
86
  #else
72
87
  if(any(equal(dataFilter_bits, DATACATEGORY_TYPE(0.0)))) dataFilter_value = 0.0;
73
88
  #endif
74
- } else {
75
- dataFilter_value = 1.0;
76
- }
77
89
  }
90
+ #endif
78
91
  `;
79
92
  const fs = `
80
93
  uniform bool filter_transformColor;
@@ -136,15 +149,22 @@ function getUniforms64(opts) {
136
149
  }
137
150
  const inject = {
138
151
  'vs:#main-start': `
152
+ dataFilter_value = 1.0;
153
+ if (filter_enabled) {
154
+ #ifdef DATAFILTER_ATTRIB
139
155
  #ifdef DATAFILTER_DOUBLE
140
156
  dataFilter_setValue(
141
157
  DATAFILTER_ATTRIB - filter_min64High + DATAFILTER_ATTRIB_64LOW,
142
- DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW,
143
- DATACATEGORY_ATTRIB
158
+ DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW
144
159
  );
145
160
  #else
146
- dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB, DATACATEGORY_ATTRIB);
161
+ dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB);
147
162
  #endif
163
+ #endif
164
+ #ifdef DATACATEGORY_ATTRIB
165
+ dataFilter_setCategoryValue(DATACATEGORY_ATTRIB);
166
+ #endif
167
+ }
148
168
  `,
149
169
  'vs:#main-end': `
150
170
  if (dataFilter_value == 0.0) {