@deck.gl/extensions 9.0.6 → 9.0.8

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.
@@ -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;AAwGF,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,8 +44,8 @@ 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_ATTRIB
48
+ void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {
45
49
  if (filter_useSoftMargin) {
46
50
  dataFilter_value = dataFilter_reduceValue(
47
51
  smoothstep(filter_min, filter_softMin, valueFromMin) *
@@ -52,6 +56,10 @@ dataFilter_value = dataFilter_reduceValue(
52
56
  step(filter_min, valueFromMin) * step(valueFromMax, filter_max)
53
57
  );
54
58
  }
59
+ }
60
+ #endif
61
+ #ifdef DATACATEGORY_ATTRIB
62
+ void dataFilter_setCategoryValue(DATACATEGORY_TYPE category) {
55
63
  #if DATACATEGORY_CHANNELS == 1
56
64
  int dataFilter_masks = filter_categoryBitMask[int(category / 32.0)];
57
65
  #elif DATACATEGORY_CHANNELS == 2
@@ -71,10 +79,8 @@ if(dataFilter_bits == 0.0) dataFilter_value = 0.0;
71
79
  #else
72
80
  if(any(equal(dataFilter_bits, DATACATEGORY_TYPE(0.0)))) dataFilter_value = 0.0;
73
81
  #endif
74
- } else {
75
- dataFilter_value = 1.0;
76
- }
77
82
  }
83
+ #endif
78
84
  `;
79
85
  const fs = `
80
86
  uniform bool filter_transformColor;
@@ -136,15 +142,22 @@ function getUniforms64(opts) {
136
142
  }
137
143
  const inject = {
138
144
  'vs:#main-start': `
145
+ dataFilter_value = 1.0;
146
+ if (filter_enabled) {
147
+ #ifdef DATAFILTER_ATTRIB
139
148
  #ifdef DATAFILTER_DOUBLE
140
149
  dataFilter_setValue(
141
150
  DATAFILTER_ATTRIB - filter_min64High + DATAFILTER_ATTRIB_64LOW,
142
- DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW,
143
- DATACATEGORY_ATTRIB
151
+ DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW
144
152
  );
145
153
  #else
146
- dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB, DATACATEGORY_ATTRIB);
154
+ dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB);
147
155
  #endif
156
+ #endif
157
+ #ifdef DATACATEGORY_ATTRIB
158
+ dataFilter_setCategoryValue(DATACATEGORY_ATTRIB);
159
+ #endif
160
+ }
148
161
  `,
149
162
  'vs:#main-end': `
150
163
  if (dataFilter_value == 0.0) {
package/dist/dist.dev.js CHANGED
@@ -247,33 +247,43 @@ var __exports__ = (() => {
247
247
 
248
248
  // src/data-filter/shader-module.ts
249
249
  var vs2 = glsl`
250
- uniform DATAFILTER_TYPE filter_min;
251
- uniform DATAFILTER_TYPE filter_softMin;
252
- uniform DATAFILTER_TYPE filter_softMax;
253
- uniform DATAFILTER_TYPE filter_max;
254
250
  uniform bool filter_useSoftMargin;
255
251
  uniform bool filter_enabled;
256
252
  uniform bool filter_transformSize;
257
253
  uniform ivec4 filter_categoryBitMask;
258
254
 
259
- #ifdef NON_INSTANCED_MODEL
260
- #define DATAFILTER_ATTRIB filterValues
261
- #define DATAFILTER_ATTRIB_64LOW filterValues64Low
262
- #define DATACATEGORY_ATTRIB filterCategoryValues
263
- #else
264
- #define DATAFILTER_ATTRIB instanceFilterValues
265
- #define DATAFILTER_ATTRIB_64LOW instanceFilterValues64Low
266
- #define DATACATEGORY_ATTRIB instanceFilterCategoryValues
255
+ #ifdef DATAFILTER_TYPE
256
+ uniform DATAFILTER_TYPE filter_min;
257
+ uniform DATAFILTER_TYPE filter_softMin;
258
+ uniform DATAFILTER_TYPE filter_softMax;
259
+ uniform DATAFILTER_TYPE filter_max;
260
+
261
+ #ifdef NON_INSTANCED_MODEL
262
+ #define DATAFILTER_ATTRIB filterValues
263
+ #define DATAFILTER_ATTRIB_64LOW filterValues64Low
264
+ #else
265
+ #define DATAFILTER_ATTRIB instanceFilterValues
266
+ #define DATAFILTER_ATTRIB_64LOW instanceFilterValues64Low
267
+ #endif
268
+
269
+ in DATAFILTER_TYPE DATAFILTER_ATTRIB;
270
+ #ifdef DATAFILTER_DOUBLE
271
+ in DATAFILTER_TYPE DATAFILTER_ATTRIB_64LOW;
272
+
273
+ uniform DATAFILTER_TYPE filter_min64High;
274
+ uniform DATAFILTER_TYPE filter_max64High;
275
+ #endif
267
276
  #endif
268
277
 
269
- in DATAFILTER_TYPE DATAFILTER_ATTRIB;
270
- #ifdef DATAFILTER_DOUBLE
271
- in DATAFILTER_TYPE DATAFILTER_ATTRIB_64LOW;
272
278
 
273
- uniform DATAFILTER_TYPE filter_min64High;
274
- uniform DATAFILTER_TYPE filter_max64High;
279
+ #ifdef DATACATEGORY_TYPE
280
+ #ifdef NON_INSTANCED_MODEL
281
+ #define DATACATEGORY_ATTRIB filterCategoryValues
282
+ #else
283
+ #define DATACATEGORY_ATTRIB instanceFilterCategoryValues
284
+ #endif
285
+ in DATACATEGORY_TYPE DATACATEGORY_ATTRIB;
275
286
  #endif
276
- in DATACATEGORY_TYPE DATACATEGORY_ATTRIB;
277
287
 
278
288
  out float dataFilter_value;
279
289
 
@@ -289,30 +299,35 @@ float dataFilter_reduceValue(vec3 value) {
289
299
  float dataFilter_reduceValue(vec4 value) {
290
300
  return min(min(value.x, value.y), min(value.z, value.w));
291
301
  }
292
- void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax, DATACATEGORY_TYPE category) {
293
- if (filter_enabled) {
302
+
303
+ #ifdef DATAFILTER_ATTRIB
304
+ void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {
294
305
  if (filter_useSoftMargin) {
295
306
  dataFilter_value = dataFilter_reduceValue(
296
307
  smoothstep(filter_min, filter_softMin, valueFromMin) *
297
- (1.0 - smoothstep(filter_softMax, filter_max, valueFromMax))
308
+ (1.0 - smoothstep(filter_softMax, filter_max, valueFromMax))
298
309
  );
299
310
  } else {
300
311
  dataFilter_value = dataFilter_reduceValue(
301
312
  step(filter_min, valueFromMin) * step(valueFromMax, filter_max)
302
313
  );
303
314
  }
315
+ }
316
+ #endif
304
317
 
318
+ #ifdef DATACATEGORY_ATTRIB
319
+ void dataFilter_setCategoryValue(DATACATEGORY_TYPE category) {
305
320
  #if DATACATEGORY_CHANNELS == 1 // One 128-bit mask
306
- int dataFilter_masks = filter_categoryBitMask[int(category / 32.0)];
321
+ int dataFilter_masks = filter_categoryBitMask[int(category / 32.0)];
307
322
  #elif DATACATEGORY_CHANNELS == 2 // Two 64-bit masks
308
- ivec2 dataFilter_masks = ivec2(
309
- filter_categoryBitMask[int(category.x / 32.0)],
310
- filter_categoryBitMask[int(category.y / 32.0) + 2]
311
- );
323
+ ivec2 dataFilter_masks = ivec2(
324
+ filter_categoryBitMask[int(category.x / 32.0)],
325
+ filter_categoryBitMask[int(category.y / 32.0) + 2]
326
+ );
312
327
  #elif DATACATEGORY_CHANNELS == 3 // Three 32-bit masks
313
- ivec3 dataFilter_masks = filter_categoryBitMask.xyz;
328
+ ivec3 dataFilter_masks = filter_categoryBitMask.xyz;
314
329
  #else // Four 32-bit masks
315
- ivec4 dataFilter_masks = filter_categoryBitMask;
330
+ ivec4 dataFilter_masks = filter_categoryBitMask;
316
331
  #endif
317
332
 
318
333
  // Shift mask and extract relevant bits
@@ -320,14 +335,12 @@ void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFrom
320
335
  dataFilter_bits = mod(floor(dataFilter_bits), 2.0);
321
336
 
322
337
  #if DATACATEGORY_CHANNELS == 1
323
- if(dataFilter_bits == 0.0) dataFilter_value = 0.0;
338
+ if(dataFilter_bits == 0.0) dataFilter_value = 0.0;
324
339
  #else
325
340
  if(any(equal(dataFilter_bits, DATACATEGORY_TYPE(0.0)))) dataFilter_value = 0.0;
326
341
  #endif
327
- } else {
328
- dataFilter_value = 1.0;
329
342
  }
330
- }
343
+ #endif
331
344
  `;
332
345
  var fs2 = glsl`
333
346
  uniform bool filter_transformColor;
@@ -390,15 +403,23 @@ in float dataFilter_value;
390
403
  }
391
404
  var inject2 = {
392
405
  "vs:#main-start": glsl`
393
- #ifdef DATAFILTER_DOUBLE
394
- dataFilter_setValue(
395
- DATAFILTER_ATTRIB - filter_min64High + DATAFILTER_ATTRIB_64LOW,
396
- DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW,
397
- DATACATEGORY_ATTRIB
398
- );
399
- #else
400
- dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB, DATACATEGORY_ATTRIB);
401
- #endif
406
+ dataFilter_value = 1.0;
407
+ if (filter_enabled) {
408
+ #ifdef DATAFILTER_ATTRIB
409
+ #ifdef DATAFILTER_DOUBLE
410
+ dataFilter_setValue(
411
+ DATAFILTER_ATTRIB - filter_min64High + DATAFILTER_ATTRIB_64LOW,
412
+ DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW
413
+ );
414
+ #else
415
+ dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB);
416
+ #endif
417
+ #endif
418
+
419
+ #ifdef DATACATEGORY_ATTRIB
420
+ dataFilter_setCategoryValue(DATACATEGORY_ATTRIB);
421
+ #endif
422
+ }
402
423
  `,
403
424
  "vs:#main-end": glsl`
404
425
  if (dataFilter_value == 0.0) {
@@ -1196,7 +1217,7 @@ void main() {
1196
1217
  filterTransformColor: true
1197
1218
  };
1198
1219
  var defaultOptions = {
1199
- categorySize: 1,
1220
+ categorySize: 0,
1200
1221
  filterSize: 1,
1201
1222
  fp64: false,
1202
1223
  countItems: false
@@ -1213,48 +1234,55 @@ void main() {
1213
1234
  }
1214
1235
  getShaders(extension) {
1215
1236
  const { categorySize, filterSize, fp64: fp642 } = extension.opts;
1216
- return {
1217
- modules: [fp642 ? shaderModule64 : shaderModule],
1218
- defines: {
1219
- DATACATEGORY_TYPE: DATA_TYPE_FROM_SIZE[categorySize],
1220
- DATACATEGORY_CHANNELS: categorySize,
1221
- DATAFILTER_TYPE: DATA_TYPE_FROM_SIZE[filterSize],
1222
- DATAFILTER_DOUBLE: Boolean(fp642)
1223
- }
1224
- };
1237
+ const defines = {};
1238
+ if (categorySize) {
1239
+ defines.DATACATEGORY_TYPE = DATA_TYPE_FROM_SIZE[categorySize];
1240
+ defines.DATACATEGORY_CHANNELS = categorySize;
1241
+ }
1242
+ if (filterSize) {
1243
+ defines.DATAFILTER_TYPE = DATA_TYPE_FROM_SIZE[filterSize];
1244
+ defines.DATAFILTER_DOUBLE = Boolean(fp642);
1245
+ }
1246
+ return { modules: [fp642 ? shaderModule64 : shaderModule], defines };
1225
1247
  }
1226
1248
  initializeState(context, extension) {
1227
1249
  const attributeManager = this.getAttributeManager();
1228
1250
  const { categorySize, filterSize, fp64: fp642 } = extension.opts;
1229
1251
  if (attributeManager) {
1230
- attributeManager.add({
1231
- filterValues: {
1232
- size: filterSize,
1233
- type: fp642 ? "float64" : "float32",
1234
- accessor: "getFilterValue",
1235
- shaderAttributes: {
1236
- filterValues: {
1237
- divisor: 0
1238
- },
1239
- instanceFilterValues: {
1240
- divisor: 1
1252
+ if (filterSize) {
1253
+ attributeManager.add({
1254
+ filterValues: {
1255
+ size: filterSize,
1256
+ type: fp642 ? "float64" : "float32",
1257
+ accessor: "getFilterValue",
1258
+ shaderAttributes: {
1259
+ filterValues: {
1260
+ divisor: 0
1261
+ },
1262
+ instanceFilterValues: {
1263
+ divisor: 1
1264
+ }
1241
1265
  }
1242
1266
  }
1243
- },
1244
- filterCategoryValues: {
1245
- size: categorySize,
1246
- accessor: "getFilterCategory",
1247
- transform: categorySize === 1 ? (d) => extension._getCategoryKey.call(this, d, 0) : (d) => d.map((x, i) => extension._getCategoryKey.call(this, x, i)),
1248
- shaderAttributes: {
1249
- filterCategoryValues: {
1250
- divisor: 0
1251
- },
1252
- instanceFilterCategoryValues: {
1253
- divisor: 1
1267
+ });
1268
+ }
1269
+ if (categorySize) {
1270
+ attributeManager.add({
1271
+ filterCategoryValues: {
1272
+ size: categorySize,
1273
+ accessor: "getFilterCategory",
1274
+ transform: categorySize === 1 ? (d) => extension._getCategoryKey.call(this, d, 0) : (d) => d.map((x, i) => extension._getCategoryKey.call(this, x, i)),
1275
+ shaderAttributes: {
1276
+ filterCategoryValues: {
1277
+ divisor: 0
1278
+ },
1279
+ instanceFilterCategoryValues: {
1280
+ divisor: 1
1281
+ }
1254
1282
  }
1255
1283
  }
1256
- }
1257
- });
1284
+ });
1285
+ }
1258
1286
  }
1259
1287
  const { device } = this.context;
1260
1288
  if (attributeManager && extension.opts.countItems) {
@@ -1291,7 +1319,7 @@ void main() {
1291
1319
  const attributeManager = this.getAttributeManager();
1292
1320
  const { categorySize } = extension.opts;
1293
1321
  if (this.state.filterModel) {
1294
- const filterNeedsUpdate = attributeManager.attributes.filterValues.needsUpdate() || attributeManager.attributes.filterCategoryValues?.needsUpdate() || props.filterEnabled !== oldProps.filterEnabled || props.filterRange !== oldProps.filterRange || props.filterSoftRange !== oldProps.filterSoftRange || props.filterCategories !== oldProps.filterCategories;
1322
+ const filterNeedsUpdate = attributeManager.attributes.filterValues?.needsUpdate() || attributeManager.attributes.filterCategoryValues?.needsUpdate() || props.filterEnabled !== oldProps.filterEnabled || props.filterRange !== oldProps.filterRange || props.filterSoftRange !== oldProps.filterSoftRange || props.filterCategories !== oldProps.filterCategories;
1295
1323
  if (filterNeedsUpdate) {
1296
1324
  this.setState({ filterNeedsUpdate });
1297
1325
  }
@@ -1327,7 +1355,7 @@ void main() {
1327
1355
  this.context.device.clearWebGL({ framebuffer: filterFBO, color: [0, 0, 0, 0] });
1328
1356
  filterModel.updateModuleSettings(params.moduleParameters);
1329
1357
  filterModel.setAttributes({
1330
- ...filterValues.getValue(),
1358
+ ...filterValues?.getValue(),
1331
1359
  ...filterCategoryValues?.getValue(),
1332
1360
  ...filterIndices?.getValue()
1333
1361
  });