@deck.gl/extensions 9.0.5 → 9.0.7
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/data-filter/data-filter-extension.d.ts +5 -5
- package/dist/data-filter/data-filter-extension.d.ts.map +1 -1
- package/dist/data-filter/data-filter-extension.js +45 -38
- package/dist/data-filter/shader-module.d.ts +30 -0
- package/dist/data-filter/shader-module.d.ts.map +1 -1
- package/dist/data-filter/shader-module.js +30 -17
- package/dist/dist.dev.js +112 -82
- package/dist/index.cjs +81 -56
- package/dist/index.cjs.map +2 -2
- package/dist/terrain/terrain-cover.d.ts.map +1 -1
- package/dist/terrain/terrain-cover.js +2 -1
- package/dist/terrain/utils.d.ts +1 -0
- package/dist/terrain/utils.d.ts.map +1 -1
- package/dist/terrain/utils.js +9 -6
- package/dist.min.js +38 -22
- package/package.json +2 -2
- package/src/collision-filter/collision-filter-effect.ts +1 -1
- package/src/data-filter/data-filter-extension.ts +57 -49
- package/src/data-filter/shader-module.ts +98 -41
- package/src/terrain/terrain-cover.ts +2 -1
- package/src/terrain/utils.ts +11 -6
|
@@ -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
|
|
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":"AAsBA,OAAO,KAAK,EAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAC,MAAM,eAAe,CAAC;AACnF,OAAO,EAA0B,cAAc,EAAM,MAAM,eAAe,CAAC;AAiB3E,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtC,MAAM,MAAM,wBAAwB,CAAC,KAAK,GAAG,GAAG,IAAI;IAClD;;;OAGG;IACH,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACpD;;;OAGG;IACH,iBAAiB,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC,CAAC;IACvE;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IACpD;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IAC/D;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,gBAAgB,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;IACxD;;OAEG;IACH,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE;QAC5B,kCAAkC;QAClC,EAAE,EAAE,MAAM,CAAC;QACX,uDAAuD;QACvD,KAAK,EAAE,MAAM,CAAC;KACf,KAAK,IAAI,CAAC;CACZ,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;
|
|
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:
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
defines
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
:
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|
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
|
|
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;
|
|
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
|
-
|
|
44
|
-
|
|
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
|
|
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
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
#
|
|
266
|
-
|
|
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
|
-
|
|
274
|
-
|
|
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
|
-
|
|
293
|
-
|
|
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
|
-
|
|
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
|
-
|
|
321
|
+
int dataFilter_masks = filter_categoryBitMask[int(category / 32.0)];
|
|
307
322
|
#elif DATACATEGORY_CHANNELS == 2 // Two 64-bit masks
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
|
|
328
|
+
ivec3 dataFilter_masks = filter_categoryBitMask.xyz;
|
|
314
329
|
#else // Four 32-bit masks
|
|
315
|
-
|
|
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
|
-
|
|
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
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
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:
|
|
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
|
-
|
|
1217
|
-
|
|
1218
|
-
defines
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
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
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
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
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
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
|
|
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
|
|
1358
|
+
...filterValues?.getValue(),
|
|
1331
1359
|
...filterCategoryValues?.getValue(),
|
|
1332
1360
|
...filterIndices?.getValue()
|
|
1333
1361
|
});
|
|
@@ -4162,11 +4190,12 @@ if ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_US
|
|
|
4162
4190
|
type: GLEnum.FLOAT
|
|
4163
4191
|
},
|
|
4164
4192
|
mipmaps: false,
|
|
4165
|
-
sampler: {
|
|
4193
|
+
sampler: opts.interpolate === false ? {
|
|
4194
|
+
minFilter: "nearest",
|
|
4195
|
+
magFilter: "nearest"
|
|
4196
|
+
} : {
|
|
4166
4197
|
minFilter: "linear",
|
|
4167
|
-
magFilter: "linear"
|
|
4168
|
-
addressModeU: "clamp-to-edge",
|
|
4169
|
-
addressModeV: "clamp-to-edge"
|
|
4198
|
+
magFilter: "linear"
|
|
4170
4199
|
}
|
|
4171
4200
|
})
|
|
4172
4201
|
]
|
|
@@ -4290,7 +4319,8 @@ if ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_US
|
|
|
4290
4319
|
}
|
|
4291
4320
|
if (!this.pickingFbo) {
|
|
4292
4321
|
this.pickingFbo = createRenderTarget(this.targetLayer.context.device, {
|
|
4293
|
-
id: `${this.id}-picking
|
|
4322
|
+
id: `${this.id}-picking`,
|
|
4323
|
+
interpolate: false
|
|
4294
4324
|
});
|
|
4295
4325
|
}
|
|
4296
4326
|
return this.pickingFbo;
|