@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.
- package/dist/collision-filter/collision-filter-effect.d.ts +4 -2
- package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -1
- package/dist/collision-filter/collision-filter-effect.js +10 -9
- package/dist/collision-filter/collision-filter-pass.d.ts +3 -2
- package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -1
- package/dist/collision-filter/collision-filter-pass.js +5 -7
- 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 +40 -20
- package/dist/dist.dev.js +571 -535
- package/dist/index.cjs +517 -478
- package/dist/index.cjs.map +4 -4
- package/dist/mask/mask-effect.d.ts +5 -4
- package/dist/mask/mask-effect.d.ts.map +1 -1
- package/dist/mask/mask-effect.js +9 -11
- package/dist/mask/mask-pass.d.ts +45 -3
- package/dist/mask/mask-pass.d.ts.map +1 -1
- package/dist/mask/mask-pass.js +17 -9
- package/dist/path-style/path-style-extension.d.ts.map +1 -1
- package/dist/path-style/path-style-extension.js +1 -0
- package/dist/terrain/terrain-cover.d.ts.map +1 -1
- package/dist/terrain/terrain-cover.js +2 -1
- package/dist/terrain/terrain-effect.d.ts +4 -5
- package/dist/terrain/terrain-effect.d.ts.map +1 -1
- package/dist/terrain/terrain-effect.js +6 -16
- package/dist/terrain/terrain-pass.d.ts +42 -0
- package/dist/terrain/terrain-pass.d.ts.map +1 -1
- package/dist/terrain/terrain-pass.js +24 -16
- package/dist/terrain/terrain-picking-pass.d.ts.map +1 -1
- package/dist/terrain/terrain-picking-pass.js +9 -8
- package/dist/terrain/utils.d.ts +1 -0
- package/dist/terrain/utils.d.ts.map +1 -1
- package/dist/terrain/utils.js +10 -6
- package/dist.min.js +63 -40
- package/package.json +6 -6
- package/src/collision-filter/collision-filter-effect.ts +23 -23
- package/src/collision-filter/collision-filter-pass.ts +7 -11
- package/src/data-filter/data-filter-extension.ts +57 -49
- package/src/data-filter/shader-module.ts +109 -43
- package/src/mask/mask-effect.ts +30 -19
- package/src/mask/mask-pass.ts +22 -16
- package/src/path-style/path-style-extension.ts +1 -0
- package/src/terrain/terrain-cover.ts +2 -1
- package/src/terrain/terrain-effect.ts +8 -19
- package/src/terrain/terrain-pass.ts +37 -34
- package/src/terrain/terrain-picking-pass.ts +19 -23
- 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
|
-
|
|
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;
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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.
|
|
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):
|
|
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;
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
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;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
|
-
|
|
44
|
-
|
|
47
|
+
#ifdef DATAFILTER_TYPE
|
|
48
|
+
void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {
|
|
45
49
|
if (filter_useSoftMargin) {
|
|
46
|
-
|
|
47
|
-
smoothstep(filter_min, filter_softMin, valueFromMin)
|
|
48
|
-
(
|
|
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
|
|
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) {
|