@luma.gl/engine 9.2.5 → 9.3.0-alpha.10
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/animation-loop/animation-loop.d.ts +11 -5
- package/dist/animation-loop/animation-loop.d.ts.map +1 -1
- package/dist/animation-loop/animation-loop.js +83 -47
- package/dist/animation-loop/animation-loop.js.map +1 -1
- package/dist/animation-loop/make-animation-loop.js +7 -1
- package/dist/animation-loop/make-animation-loop.js.map +1 -1
- package/dist/animation-loop/request-animation-frame.d.ts.map +1 -1
- package/dist/animation-loop/request-animation-frame.js +23 -6
- package/dist/animation-loop/request-animation-frame.js.map +1 -1
- package/dist/compute/computation.d.ts +3 -7
- package/dist/compute/computation.d.ts.map +1 -1
- package/dist/compute/computation.js +16 -13
- package/dist/compute/computation.js.map +1 -1
- package/dist/compute/swap.d.ts +2 -0
- package/dist/compute/swap.d.ts.map +1 -1
- package/dist/compute/swap.js +10 -5
- package/dist/compute/swap.js.map +1 -1
- package/dist/dist.dev.js +2639 -1290
- package/dist/dist.min.js +325 -210
- package/dist/dynamic-texture/dynamic-texture.d.ts +102 -0
- package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -0
- package/dist/dynamic-texture/dynamic-texture.js +556 -0
- package/dist/dynamic-texture/dynamic-texture.js.map +1 -0
- package/dist/dynamic-texture/texture-data.d.ts +144 -0
- package/dist/dynamic-texture/texture-data.d.ts.map +1 -0
- package/dist/dynamic-texture/texture-data.js +208 -0
- package/dist/dynamic-texture/texture-data.js.map +1 -0
- package/dist/geometries/cone-geometry.d.ts +3 -1
- package/dist/geometries/cone-geometry.d.ts.map +1 -1
- package/dist/geometries/cone-geometry.js.map +1 -1
- package/dist/geometries/cylinder-geometry.d.ts +2 -1
- package/dist/geometries/cylinder-geometry.d.ts.map +1 -1
- package/dist/geometries/cylinder-geometry.js.map +1 -1
- package/dist/geometry/gpu-geometry.d.ts.map +1 -1
- package/dist/geometry/gpu-geometry.js +8 -3
- package/dist/geometry/gpu-geometry.js.map +1 -1
- package/dist/index.cjs +2497 -1212
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +20 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/material/material-factory.d.ts +73 -0
- package/dist/material/material-factory.d.ts.map +1 -0
- package/dist/material/material-factory.js +111 -0
- package/dist/material/material-factory.js.map +1 -0
- package/dist/material/material.d.ts +84 -0
- package/dist/material/material.d.ts.map +1 -0
- package/dist/material/material.js +176 -0
- package/dist/material/material.js.map +1 -0
- package/dist/model/model.d.ts +47 -16
- package/dist/model/model.d.ts.map +1 -1
- package/dist/model/model.js +113 -47
- package/dist/model/model.js.map +1 -1
- package/dist/model/split-uniforms-and-bindings.d.ts +4 -3
- package/dist/model/split-uniforms-and-bindings.d.ts.map +1 -1
- package/dist/model/split-uniforms-and-bindings.js +2 -2
- package/dist/model/split-uniforms-and-bindings.js.map +1 -1
- package/dist/models/billboard-texture-model.d.ts +8 -5
- package/dist/models/billboard-texture-model.d.ts.map +1 -1
- package/dist/models/billboard-texture-model.js +77 -23
- package/dist/models/billboard-texture-model.js.map +1 -1
- package/dist/models/billboard-texture-module.d.ts +1 -1
- package/dist/models/billboard-texture-module.js +1 -1
- package/dist/models/clip-space.js +7 -7
- package/dist/models/directional-light-model.d.ts +7 -0
- package/dist/models/directional-light-model.d.ts.map +1 -0
- package/dist/models/directional-light-model.js +23 -0
- package/dist/models/directional-light-model.js.map +1 -0
- package/dist/models/light-model-utils.d.ts +69 -0
- package/dist/models/light-model-utils.d.ts.map +1 -0
- package/dist/models/light-model-utils.js +395 -0
- package/dist/models/light-model-utils.js.map +1 -0
- package/dist/models/point-light-model.d.ts +7 -0
- package/dist/models/point-light-model.d.ts.map +1 -0
- package/dist/models/point-light-model.js +22 -0
- package/dist/models/point-light-model.js.map +1 -0
- package/dist/models/spot-light-model.d.ts +7 -0
- package/dist/models/spot-light-model.d.ts.map +1 -0
- package/dist/models/spot-light-model.js +23 -0
- package/dist/models/spot-light-model.js.map +1 -0
- package/dist/modules/picking/color-picking.d.ts +5 -9
- package/dist/modules/picking/color-picking.d.ts.map +1 -1
- package/dist/modules/picking/color-picking.js +122 -115
- package/dist/modules/picking/color-picking.js.map +1 -1
- package/dist/modules/picking/index-picking.d.ts +4 -4
- package/dist/modules/picking/index-picking.d.ts.map +1 -1
- package/dist/modules/picking/index-picking.js +36 -16
- package/dist/modules/picking/index-picking.js.map +1 -1
- package/dist/modules/picking/legacy-color-picking.d.ts +26 -0
- package/dist/modules/picking/legacy-color-picking.d.ts.map +1 -0
- package/dist/modules/picking/legacy-color-picking.js +7 -0
- package/dist/modules/picking/legacy-color-picking.js.map +1 -0
- package/dist/modules/picking/picking-manager.d.ts +29 -3
- package/dist/modules/picking/picking-manager.d.ts.map +1 -1
- package/dist/modules/picking/picking-manager.js +188 -41
- package/dist/modules/picking/picking-manager.js.map +1 -1
- package/dist/modules/picking/picking-uniforms.d.ts +13 -12
- package/dist/modules/picking/picking-uniforms.d.ts.map +1 -1
- package/dist/modules/picking/picking-uniforms.js +27 -14
- package/dist/modules/picking/picking-uniforms.js.map +1 -1
- package/dist/modules/picking/picking.d.ts +25 -0
- package/dist/modules/picking/picking.d.ts.map +1 -0
- package/dist/modules/picking/picking.js +18 -0
- package/dist/modules/picking/picking.js.map +1 -0
- package/dist/passes/get-fragment-shader.js +12 -27
- package/dist/passes/get-fragment-shader.js.map +1 -1
- package/dist/passes/shader-pass-renderer.d.ts +5 -7
- package/dist/passes/shader-pass-renderer.d.ts.map +1 -1
- package/dist/passes/shader-pass-renderer.js +16 -42
- package/dist/passes/shader-pass-renderer.js.map +1 -1
- package/dist/scenegraph/group-node.d.ts +5 -0
- package/dist/scenegraph/group-node.d.ts.map +1 -1
- package/dist/scenegraph/group-node.js +12 -0
- package/dist/scenegraph/group-node.js.map +1 -1
- package/dist/scenegraph/model-node.d.ts +2 -2
- package/dist/scenegraph/model-node.d.ts.map +1 -1
- package/dist/scenegraph/model-node.js.map +1 -1
- package/dist/scenegraph/scenegraph-node.d.ts +1 -1
- package/dist/scenegraph/scenegraph-node.d.ts.map +1 -1
- package/dist/scenegraph/scenegraph-node.js +23 -15
- package/dist/scenegraph/scenegraph-node.js.map +1 -1
- package/dist/shader-inputs.d.ts +9 -7
- package/dist/shader-inputs.d.ts.map +1 -1
- package/dist/shader-inputs.js +84 -4
- package/dist/shader-inputs.js.map +1 -1
- package/dist/utils/buffer-layout-order.d.ts.map +1 -1
- package/dist/utils/buffer-layout-order.js +12 -2
- package/dist/utils/buffer-layout-order.js.map +1 -1
- package/dist/utils/shader-module-utils.d.ts +7 -0
- package/dist/utils/shader-module-utils.d.ts.map +1 -0
- package/dist/utils/shader-module-utils.js +46 -0
- package/dist/utils/shader-module-utils.js.map +1 -0
- package/package.json +6 -6
- package/src/animation-loop/animation-loop.ts +89 -50
- package/src/animation-loop/make-animation-loop.ts +13 -5
- package/src/animation-loop/request-animation-frame.ts +32 -6
- package/src/compute/computation.ts +32 -17
- package/src/compute/swap.ts +13 -7
- package/src/dynamic-texture/dynamic-texture.ts +732 -0
- package/src/dynamic-texture/texture-data.ts +336 -0
- package/src/geometries/cone-geometry.ts +6 -1
- package/src/geometries/cylinder-geometry.ts +5 -1
- package/src/geometry/gpu-geometry.ts +8 -3
- package/src/index.ts +38 -8
- package/src/material/material-factory.ts +157 -0
- package/src/material/material.ts +254 -0
- package/src/model/model.ts +158 -67
- package/src/model/split-uniforms-and-bindings.ts +8 -6
- package/src/models/billboard-texture-model.ts +88 -27
- package/src/models/billboard-texture-module.ts +1 -1
- package/src/models/clip-space.ts +7 -7
- package/src/models/directional-light-model.ts +32 -0
- package/src/models/light-model-utils.ts +587 -0
- package/src/models/point-light-model.ts +31 -0
- package/src/models/spot-light-model.ts +32 -0
- package/src/modules/picking/color-picking.ts +123 -122
- package/src/modules/picking/index-picking.ts +36 -16
- package/src/modules/picking/legacy-color-picking.ts +8 -0
- package/src/modules/picking/picking-manager.ts +252 -50
- package/src/modules/picking/picking-uniforms.ts +39 -24
- package/src/modules/picking/picking.ts +22 -0
- package/src/passes/get-fragment-shader.ts +12 -27
- package/src/passes/shader-pass-renderer.ts +25 -48
- package/src/scenegraph/group-node.ts +16 -0
- package/src/scenegraph/model-node.ts +2 -2
- package/src/scenegraph/scenegraph-node.ts +27 -16
- package/src/shader-inputs.ts +165 -15
- package/src/utils/buffer-layout-order.ts +18 -2
- package/src/utils/shader-module-utils.ts +65 -0
- package/dist/async-texture/async-texture.d.ts +0 -166
- package/dist/async-texture/async-texture.d.ts.map +0 -1
- package/dist/async-texture/async-texture.js +0 -386
- package/dist/async-texture/async-texture.js.map +0 -1
- package/dist/factories/pipeline-factory.d.ts +0 -37
- package/dist/factories/pipeline-factory.d.ts.map +0 -1
- package/dist/factories/pipeline-factory.js +0 -181
- package/dist/factories/pipeline-factory.js.map +0 -1
- package/dist/factories/shader-factory.d.ts +0 -22
- package/dist/factories/shader-factory.d.ts.map +0 -1
- package/dist/factories/shader-factory.js +0 -88
- package/dist/factories/shader-factory.js.map +0 -1
- package/src/async-texture/async-texture.ts +0 -551
- package/src/factories/pipeline-factory.ts +0 -224
- package/src/factories/shader-factory.ts +0 -103
- /package/src/{async-texture/texture-setters.ts.disabled → dynamic-texture/texture-data.ts.disabled} +0 -0
|
@@ -1,27 +1,70 @@
|
|
|
1
1
|
// luma.gl
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { Buffer, Texture } from '@luma.gl/core';
|
|
4
5
|
import { INVALID_INDEX } from "./picking-uniforms.js";
|
|
6
|
+
const INDEX_PICKING_ATTACHMENT_INDEX = 1;
|
|
7
|
+
const INDEX_PICKING_CLEAR_COLOR = new Int32Array([INVALID_INDEX, INVALID_INDEX, 0, 0]);
|
|
8
|
+
const COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
|
|
9
|
+
const COLOR_PICKING_MAX_BATCH_INDEX = 254;
|
|
10
|
+
export function resolvePickingMode(deviceType, mode = 'color', indexPickingSupported = deviceType === 'webgpu') {
|
|
11
|
+
if (mode === 'auto') {
|
|
12
|
+
return indexPickingSupported ? 'index' : 'color';
|
|
13
|
+
}
|
|
14
|
+
if (mode === 'index' && !indexPickingSupported) {
|
|
15
|
+
throw new Error(`Picking mode "${mode}" requires WebGPU or a WebGL device that supports renderable rg32sint textures.`);
|
|
16
|
+
}
|
|
17
|
+
return mode;
|
|
18
|
+
}
|
|
19
|
+
export function supportsIndexPicking(device) {
|
|
20
|
+
return (device.type === 'webgpu' ||
|
|
21
|
+
(device.type === 'webgl' && device.isTextureFormatRenderable('rg32sint')));
|
|
22
|
+
}
|
|
23
|
+
/** @deprecated Use `resolvePickingMode`. */
|
|
24
|
+
export const resolvePickingBackend = resolvePickingMode;
|
|
25
|
+
export function decodeIndexPickInfo(pixelData) {
|
|
26
|
+
return {
|
|
27
|
+
objectIndex: pixelData[0] === INVALID_INDEX ? null : pixelData[0],
|
|
28
|
+
batchIndex: pixelData[1] === INVALID_INDEX ? null : pixelData[1]
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function decodeColorPickInfo(pixelData) {
|
|
32
|
+
const encodedObjectIndex = pixelData[0] + pixelData[1] * 256 + pixelData[2] * 65536;
|
|
33
|
+
if (encodedObjectIndex === 0) {
|
|
34
|
+
return { objectIndex: null, batchIndex: null };
|
|
35
|
+
}
|
|
36
|
+
const batchIndex = pixelData[3] > 0 ? pixelData[3] - 1 : 0;
|
|
37
|
+
return {
|
|
38
|
+
objectIndex: encodedObjectIndex - 1,
|
|
39
|
+
batchIndex
|
|
40
|
+
};
|
|
41
|
+
}
|
|
5
42
|
/**
|
|
6
|
-
* Helper class for using
|
|
7
|
-
* @todo Port to WebGPU
|
|
43
|
+
* Helper class for using object picking with backend-specific readback.
|
|
8
44
|
* @todo Support multiple models
|
|
9
45
|
* @todo Switching picking module
|
|
10
46
|
*/
|
|
11
47
|
export class PickingManager {
|
|
12
48
|
device;
|
|
13
49
|
props;
|
|
50
|
+
mode;
|
|
14
51
|
/** Info from latest pick operation */
|
|
15
52
|
pickInfo = { batchIndex: null, objectIndex: null };
|
|
16
53
|
/** Framebuffer used for picking */
|
|
17
54
|
framebuffer = null;
|
|
18
55
|
static defaultProps = {
|
|
19
56
|
shaderInputs: undefined,
|
|
20
|
-
onObjectPicked: () => { }
|
|
57
|
+
onObjectPicked: () => { },
|
|
58
|
+
mode: 'color',
|
|
59
|
+
backend: 'color'
|
|
21
60
|
};
|
|
22
61
|
constructor(device, props) {
|
|
23
62
|
this.device = device;
|
|
24
63
|
this.props = { ...PickingManager.defaultProps, ...props };
|
|
64
|
+
const requestedMode = props.mode ?? props.backend ?? PickingManager.defaultProps.mode;
|
|
65
|
+
this.props.mode = requestedMode;
|
|
66
|
+
this.props.backend = requestedMode;
|
|
67
|
+
this.mode = resolvePickingMode(this.device.type, requestedMode, supportsIndexPicking(this.device));
|
|
25
68
|
}
|
|
26
69
|
destroy() {
|
|
27
70
|
this.framebuffer?.destroy();
|
|
@@ -29,61 +72,47 @@ export class PickingManager {
|
|
|
29
72
|
// TODO - Ask for a cached framebuffer? a Framebuffer factory?
|
|
30
73
|
getFramebuffer() {
|
|
31
74
|
if (!this.framebuffer) {
|
|
32
|
-
this.framebuffer =
|
|
33
|
-
|
|
34
|
-
depthStencilAttachment: 'depth24plus'
|
|
35
|
-
});
|
|
75
|
+
this.framebuffer =
|
|
76
|
+
this.mode === 'index' ? this.createIndexFramebuffer() : this.createColorFramebuffer();
|
|
36
77
|
}
|
|
37
78
|
return this.framebuffer;
|
|
38
79
|
}
|
|
39
80
|
/** Clear highlighted / picked object */
|
|
40
81
|
clearPickState() {
|
|
41
|
-
this.
|
|
82
|
+
this.setPickingProps({ highlightedBatchIndex: null, highlightedObjectIndex: null });
|
|
42
83
|
}
|
|
43
84
|
/** Prepare for rendering picking colors */
|
|
44
85
|
beginRenderPass() {
|
|
45
86
|
const framebuffer = this.getFramebuffer();
|
|
46
87
|
framebuffer.resize(this.device.getDefaultCanvasContext().getDevicePixelSize());
|
|
47
|
-
this.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
88
|
+
this.setPickingProps({ isActive: true });
|
|
89
|
+
return this.mode === 'index'
|
|
90
|
+
? this.device.beginRenderPass({
|
|
91
|
+
framebuffer,
|
|
92
|
+
clearColors: [new Float32Array([0, 0, 0, 0]), INDEX_PICKING_CLEAR_COLOR],
|
|
93
|
+
clearDepth: 1
|
|
94
|
+
})
|
|
95
|
+
: this.device.beginRenderPass({
|
|
96
|
+
framebuffer,
|
|
97
|
+
clearColor: [0, 0, 0, 0],
|
|
98
|
+
clearDepth: 1
|
|
99
|
+
});
|
|
54
100
|
}
|
|
55
101
|
async updatePickInfo(mousePosition) {
|
|
56
102
|
const framebuffer = this.getFramebuffer();
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
const pixelData = this.device.readPixelsToArrayWebGL(framebuffer, {
|
|
61
|
-
sourceX: pickX,
|
|
62
|
-
sourceY: pickY,
|
|
63
|
-
sourceWidth: 1,
|
|
64
|
-
sourceHeight: 1,
|
|
65
|
-
sourceAttachment: 1
|
|
66
|
-
});
|
|
67
|
-
if (!pixelData) {
|
|
103
|
+
const pickPosition = this.getPickPosition(mousePosition);
|
|
104
|
+
const pickInfo = await this.readPickInfo(framebuffer, pickPosition);
|
|
105
|
+
if (!pickInfo) {
|
|
68
106
|
return null;
|
|
69
107
|
}
|
|
70
|
-
|
|
71
|
-
objectIndex: pixelData[0] === INVALID_INDEX ? null : pixelData[0],
|
|
72
|
-
batchIndex: pixelData[1] === INVALID_INDEX ? null : pixelData[1]
|
|
73
|
-
};
|
|
74
|
-
// Call callback if picked object has changed
|
|
75
|
-
if (pickInfo.objectIndex !== this.pickInfo.objectIndex ||
|
|
76
|
-
pickInfo.batchIndex !== this.pickInfo.batchIndex) {
|
|
108
|
+
if (this.hasPickInfoChanged(pickInfo)) {
|
|
77
109
|
this.pickInfo = pickInfo;
|
|
78
110
|
this.props.onObjectPicked(pickInfo);
|
|
79
|
-
// console.log(`Object ${pickInfo.objectIndex} in batch ${pickInfo.batchIndex} was picked`)
|
|
80
111
|
}
|
|
81
|
-
this.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
highlightedObjectIndex: pickInfo.objectIndex
|
|
86
|
-
}
|
|
112
|
+
this.setPickingProps({
|
|
113
|
+
isActive: false,
|
|
114
|
+
highlightedBatchIndex: pickInfo.batchIndex,
|
|
115
|
+
highlightedObjectIndex: pickInfo.objectIndex
|
|
87
116
|
});
|
|
88
117
|
return this.pickInfo;
|
|
89
118
|
}
|
|
@@ -92,10 +121,128 @@ export class PickingManager {
|
|
|
92
121
|
* use the center pixel location in device pixel range
|
|
93
122
|
*/
|
|
94
123
|
getPickPosition(mousePosition) {
|
|
95
|
-
const
|
|
124
|
+
const yInvert = this.device.type !== 'webgpu';
|
|
125
|
+
const devicePixels = this.device
|
|
126
|
+
.getDefaultCanvasContext()
|
|
127
|
+
.cssToDevicePixels(mousePosition, yInvert);
|
|
96
128
|
const pickX = devicePixels.x + Math.floor(devicePixels.width / 2);
|
|
97
129
|
const pickY = devicePixels.y + Math.floor(devicePixels.height / 2);
|
|
98
130
|
return [pickX, pickY];
|
|
99
131
|
}
|
|
132
|
+
createIndexFramebuffer() {
|
|
133
|
+
const colorTexture = this.device.createTexture({
|
|
134
|
+
format: 'rgba8unorm',
|
|
135
|
+
width: 1,
|
|
136
|
+
height: 1,
|
|
137
|
+
usage: Texture.RENDER_ATTACHMENT
|
|
138
|
+
});
|
|
139
|
+
const pickingTexture = this.device.createTexture({
|
|
140
|
+
format: 'rg32sint',
|
|
141
|
+
width: 1,
|
|
142
|
+
height: 1,
|
|
143
|
+
usage: Texture.RENDER_ATTACHMENT | Texture.COPY_SRC
|
|
144
|
+
});
|
|
145
|
+
return this.device.createFramebuffer({
|
|
146
|
+
colorAttachments: [colorTexture, pickingTexture],
|
|
147
|
+
depthStencilAttachment: 'depth24plus'
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
createColorFramebuffer() {
|
|
151
|
+
const pickingTexture = this.device.createTexture({
|
|
152
|
+
format: 'rgba8unorm',
|
|
153
|
+
width: 1,
|
|
154
|
+
height: 1,
|
|
155
|
+
usage: Texture.RENDER_ATTACHMENT | Texture.COPY_SRC
|
|
156
|
+
});
|
|
157
|
+
return this.device.createFramebuffer({
|
|
158
|
+
colorAttachments: [pickingTexture],
|
|
159
|
+
depthStencilAttachment: 'depth24plus'
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
setPickingProps(props) {
|
|
163
|
+
this.props.shaderInputs?.setProps({ picking: props });
|
|
164
|
+
}
|
|
165
|
+
async readPickInfo(framebuffer, pickPosition) {
|
|
166
|
+
return this.mode === 'index'
|
|
167
|
+
? this.readIndexPickInfo(framebuffer, pickPosition)
|
|
168
|
+
: this.readColorPickInfo(framebuffer, pickPosition);
|
|
169
|
+
}
|
|
170
|
+
async readIndexPickInfo(framebuffer, [pickX, pickY]) {
|
|
171
|
+
if (this.device.type === 'webgpu') {
|
|
172
|
+
const pickTexture = framebuffer.colorAttachments[INDEX_PICKING_ATTACHMENT_INDEX]?.texture;
|
|
173
|
+
if (!pickTexture) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
const layout = pickTexture.computeMemoryLayout({ width: 1, height: 1 });
|
|
177
|
+
const readBuffer = this.device.createBuffer({
|
|
178
|
+
byteLength: layout.byteLength,
|
|
179
|
+
usage: Buffer.COPY_DST | Buffer.MAP_READ
|
|
180
|
+
});
|
|
181
|
+
try {
|
|
182
|
+
pickTexture.readBuffer({
|
|
183
|
+
x: pickX,
|
|
184
|
+
y: pickY,
|
|
185
|
+
width: 1,
|
|
186
|
+
height: 1
|
|
187
|
+
}, readBuffer);
|
|
188
|
+
const pickDataView = await readBuffer.readAsync(0, layout.byteLength);
|
|
189
|
+
return decodeIndexPickInfo(new Int32Array(pickDataView.buffer, pickDataView.byteOffset, 2));
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
readBuffer.destroy();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const pixelData = this.device.readPixelsToArrayWebGL(framebuffer, {
|
|
196
|
+
sourceX: pickX,
|
|
197
|
+
sourceY: pickY,
|
|
198
|
+
sourceWidth: 1,
|
|
199
|
+
sourceHeight: 1,
|
|
200
|
+
sourceAttachment: INDEX_PICKING_ATTACHMENT_INDEX
|
|
201
|
+
});
|
|
202
|
+
return pixelData
|
|
203
|
+
? decodeIndexPickInfo(new Int32Array(pixelData.buffer, pixelData.byteOffset, 2))
|
|
204
|
+
: null;
|
|
205
|
+
}
|
|
206
|
+
async readColorPickInfo(framebuffer, [pickX, pickY]) {
|
|
207
|
+
if (this.device.type === 'webgpu') {
|
|
208
|
+
const pickTexture = framebuffer.colorAttachments[0]?.texture;
|
|
209
|
+
if (!pickTexture) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
const layout = pickTexture.computeMemoryLayout({ width: 1, height: 1 });
|
|
213
|
+
const readBuffer = this.device.createBuffer({
|
|
214
|
+
byteLength: layout.byteLength,
|
|
215
|
+
usage: Buffer.COPY_DST | Buffer.MAP_READ
|
|
216
|
+
});
|
|
217
|
+
try {
|
|
218
|
+
pickTexture.readBuffer({
|
|
219
|
+
x: pickX,
|
|
220
|
+
y: pickY,
|
|
221
|
+
width: 1,
|
|
222
|
+
height: 1
|
|
223
|
+
}, readBuffer);
|
|
224
|
+
const pickDataView = await readBuffer.readAsync(0, layout.byteLength);
|
|
225
|
+
return decodeColorPickInfo(new Uint8Array(pickDataView.buffer, pickDataView.byteOffset, 4));
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
readBuffer.destroy();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const pixelData = this.device.readPixelsToArrayWebGL(framebuffer, {
|
|
232
|
+
sourceX: pickX,
|
|
233
|
+
sourceY: pickY,
|
|
234
|
+
sourceWidth: 1,
|
|
235
|
+
sourceHeight: 1,
|
|
236
|
+
sourceAttachment: 0
|
|
237
|
+
});
|
|
238
|
+
return pixelData
|
|
239
|
+
? decodeColorPickInfo(new Uint8Array(pixelData.buffer, pixelData.byteOffset, 4))
|
|
240
|
+
: null;
|
|
241
|
+
}
|
|
242
|
+
hasPickInfoChanged(pickInfo) {
|
|
243
|
+
return (pickInfo.objectIndex !== this.pickInfo.objectIndex ||
|
|
244
|
+
pickInfo.batchIndex !== this.pickInfo.batchIndex);
|
|
245
|
+
}
|
|
100
246
|
}
|
|
247
|
+
export { COLOR_PICKING_MAX_BATCH_INDEX, COLOR_PICKING_MAX_OBJECT_INDEX };
|
|
101
248
|
//# sourceMappingURL=picking-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picking-manager.js","sourceRoot":"","sources":["../../../src/modules/picking/picking-manager.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;
|
|
1
|
+
{"version":3,"file":"picking-manager.js","sourceRoot":"","sources":["../../../src/modules/picking/picking-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { NumberArray4 } from '@math.gl/types';
|
|
2
2
|
export declare const INVALID_INDEX = -1;
|
|
3
|
+
export type PickingPayloadMode = 'instance' | 'attribute';
|
|
3
4
|
/**
|
|
4
5
|
* Props for the picking module, which depending on mode renders picking colors or highlighted item.
|
|
5
6
|
* When active, renders picking colors, assumed to be rendered to off-screen "picking" buffer.
|
|
@@ -9,13 +10,13 @@ export declare const INVALID_INDEX = -1;
|
|
|
9
10
|
export type PickingProps = {
|
|
10
11
|
/** Are we picking? I.e. rendering picking colors? */
|
|
11
12
|
isActive?: boolean;
|
|
12
|
-
/** Whether
|
|
13
|
-
indexMode?:
|
|
14
|
-
/**
|
|
13
|
+
/** Whether the payload is sourced from the builtin instance index or a custom integer attribute */
|
|
14
|
+
indexMode?: PickingPayloadMode;
|
|
15
|
+
/** Identifier of the batch currently being rendered */
|
|
15
16
|
batchIndex?: number;
|
|
16
|
-
/**
|
|
17
|
+
/** Identifier of the highlighted batch */
|
|
17
18
|
highlightedBatchIndex?: number | null;
|
|
18
|
-
/** Set
|
|
19
|
+
/** Set the highlighted object index, or `null` to explicitly clear **/
|
|
19
20
|
highlightedObjectIndex?: number | null;
|
|
20
21
|
/** Color of visual highlight of "selected" item () */
|
|
21
22
|
highlightColor?: NumberArray4;
|
|
@@ -31,22 +32,22 @@ export type PickingUniforms = {
|
|
|
31
32
|
* When false, renders normal colors, with the exception of selected object which is rendered with highlight
|
|
32
33
|
*/
|
|
33
34
|
isActive: boolean;
|
|
34
|
-
/**
|
|
35
|
+
/** Whether the current payload comes from instance_index or a custom integer attribute */
|
|
35
36
|
indexMode: 0 | 1;
|
|
36
|
-
/**
|
|
37
|
+
/** Identifier of the batch currently being rendered */
|
|
37
38
|
batchIndex: number;
|
|
38
39
|
/** Do we have a highlighted item? */
|
|
39
40
|
isHighlightActive: boolean;
|
|
40
41
|
/** Color of visual highlight of "selected" item. Note: RGBA components must in the range 0-1 */
|
|
41
42
|
highlightColor: NumberArray4;
|
|
42
|
-
/** Indicates which batch to visually highlight an item in
|
|
43
|
+
/** Indicates which batch to visually highlight an item in */
|
|
43
44
|
highlightedBatchIndex: number;
|
|
44
|
-
/** Indicates which index in the batch to highlight
|
|
45
|
+
/** Indicates which object index in the batch to highlight */
|
|
45
46
|
highlightedObjectIndex: number;
|
|
46
47
|
};
|
|
47
48
|
export type PickingBindings = {};
|
|
48
|
-
export declare const GLSL_UNIFORMS = "precision highp float;\nprecision highp int;\n\
|
|
49
|
-
export declare const WGSL_UNIFORMS = "struct pickingUniforms {\n isActive:
|
|
49
|
+
export declare const GLSL_UNIFORMS = "precision highp float;\nprecision highp int;\n\nlayout(std140) uniform pickingUniforms {\n int isActive;\n int indexMode;\n int batchIndex;\n\n int isHighlightActive;\n int highlightedBatchIndex;\n int highlightedObjectIndex;\n vec4 highlightColor;\n} picking;\n";
|
|
50
|
+
export declare const WGSL_UNIFORMS = "struct pickingUniforms {\n isActive: i32,\n indexMode: i32,\n batchIndex: i32,\n\n isHighlightActive: i32,\n highlightedBatchIndex: i32,\n highlightedObjectIndex: i32,\n highlightColor: vec4<f32>,\n};\n\n@group(0) @binding(auto) var<uniform> picking: pickingUniforms;\n";
|
|
50
51
|
declare function getUniforms(props?: PickingProps, prevUniforms?: PickingUniforms): PickingUniforms;
|
|
51
52
|
/**
|
|
52
53
|
* Provides support for color-based picking and highlighting.
|
|
@@ -68,7 +69,7 @@ export declare const pickingUniforms: {
|
|
|
68
69
|
readonly isActive: false;
|
|
69
70
|
readonly indexMode: 0;
|
|
70
71
|
readonly batchIndex: 0;
|
|
71
|
-
readonly isHighlightActive:
|
|
72
|
+
readonly isHighlightActive: false;
|
|
72
73
|
readonly highlightedBatchIndex: -1;
|
|
73
74
|
readonly highlightedObjectIndex: -1;
|
|
74
75
|
readonly highlightColor: NumberArray4;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picking-uniforms.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/picking-uniforms.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAMjD,eAAO,MAAM,aAAa,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"picking-uniforms.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/picking-uniforms.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAMjD,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,WAAW,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mGAAmG;IACnG,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,0CAA0C;IAC1C,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,uEAAuE;IACvE,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,sDAAsD;IACtD,cAAc,CAAC,EAAE,YAAY,CAAC;CAC/B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,0FAA0F;IAC1F,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IAEnB,qCAAqC;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gGAAgG;IAChG,cAAc,EAAE,YAAY,CAAC;IAC7B,6DAA6D;IAC7D,qBAAqB,EAAE,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,sBAAsB,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,EAAE,CAAC;AAejC,eAAO,MAAM,aAAa,kRAczB,CAAC;AAEF,eAAO,MAAM,aAAa,yRAazB,CAAC;AAEF,iBAAS,WAAW,CAAC,KAAK,GAAE,YAAiB,EAAE,YAAY,CAAC,EAAE,eAAe,GAAG,eAAe,CAuD9F;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe;oBACb,YAAY;uBACT,eAAe;;;;;;;;;;;;;CAgBgD,CAAC"}
|
|
@@ -18,7 +18,7 @@ export const GLSL_UNIFORMS = /* glsl */ `\
|
|
|
18
18
|
precision highp float;
|
|
19
19
|
precision highp int;
|
|
20
20
|
|
|
21
|
-
uniform pickingUniforms {
|
|
21
|
+
layout(std140) uniform pickingUniforms {
|
|
22
22
|
int isActive;
|
|
23
23
|
int indexMode;
|
|
24
24
|
int batchIndex;
|
|
@@ -31,15 +31,17 @@ uniform pickingUniforms {
|
|
|
31
31
|
`;
|
|
32
32
|
export const WGSL_UNIFORMS = /* wgsl */ `\
|
|
33
33
|
struct pickingUniforms {
|
|
34
|
-
isActive:
|
|
35
|
-
indexMode:
|
|
36
|
-
batchIndex:
|
|
34
|
+
isActive: i32,
|
|
35
|
+
indexMode: i32,
|
|
36
|
+
batchIndex: i32,
|
|
37
37
|
|
|
38
|
-
isHighlightActive:
|
|
39
|
-
highlightedBatchIndex:
|
|
40
|
-
highlightedObjectIndex:
|
|
41
|
-
highlightColor: vec4<f32
|
|
42
|
-
}
|
|
38
|
+
isHighlightActive: i32,
|
|
39
|
+
highlightedBatchIndex: i32,
|
|
40
|
+
highlightedObjectIndex: i32,
|
|
41
|
+
highlightColor: vec4<f32>,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
@group(0) @binding(auto) var<uniform> picking: pickingUniforms;
|
|
43
45
|
`;
|
|
44
46
|
function getUniforms(props = {}, prevUniforms) {
|
|
45
47
|
const uniforms = { ...prevUniforms };
|
|
@@ -51,16 +53,19 @@ function getUniforms(props = {}, prevUniforms) {
|
|
|
51
53
|
case 'instance':
|
|
52
54
|
uniforms.indexMode = 0;
|
|
53
55
|
break;
|
|
54
|
-
case '
|
|
56
|
+
case 'attribute':
|
|
55
57
|
uniforms.indexMode = 1;
|
|
56
58
|
break;
|
|
57
59
|
case undefined:
|
|
58
60
|
// no change
|
|
59
61
|
break;
|
|
60
62
|
}
|
|
63
|
+
if (typeof props.batchIndex === 'number') {
|
|
64
|
+
uniforms.batchIndex = props.batchIndex;
|
|
65
|
+
}
|
|
61
66
|
switch (props.highlightedObjectIndex) {
|
|
62
67
|
case undefined:
|
|
63
|
-
// Unless
|
|
68
|
+
// Unless highlighted payload explicitly null or set, do not update state
|
|
64
69
|
break;
|
|
65
70
|
case null:
|
|
66
71
|
// Clear highlight
|
|
@@ -71,8 +76,16 @@ function getUniforms(props = {}, prevUniforms) {
|
|
|
71
76
|
uniforms.isHighlightActive = true;
|
|
72
77
|
uniforms.highlightedObjectIndex = props.highlightedObjectIndex;
|
|
73
78
|
}
|
|
74
|
-
|
|
75
|
-
|
|
79
|
+
switch (props.highlightedBatchIndex) {
|
|
80
|
+
case undefined:
|
|
81
|
+
break;
|
|
82
|
+
case null:
|
|
83
|
+
uniforms.isHighlightActive = false;
|
|
84
|
+
uniforms.highlightedBatchIndex = INVALID_INDEX;
|
|
85
|
+
break;
|
|
86
|
+
default:
|
|
87
|
+
uniforms.isHighlightActive = true;
|
|
88
|
+
uniforms.highlightedBatchIndex = props.highlightedBatchIndex;
|
|
76
89
|
}
|
|
77
90
|
if (props.highlightColor) {
|
|
78
91
|
uniforms.highlightColor = props.highlightColor;
|
|
@@ -99,7 +112,7 @@ export const pickingUniforms = {
|
|
|
99
112
|
isActive: false,
|
|
100
113
|
indexMode: 0,
|
|
101
114
|
batchIndex: 0,
|
|
102
|
-
isHighlightActive:
|
|
115
|
+
isHighlightActive: false,
|
|
103
116
|
highlightedBatchIndex: INVALID_INDEX,
|
|
104
117
|
highlightedObjectIndex: INVALID_INDEX,
|
|
105
118
|
highlightColor: DEFAULT_HIGHLIGHT_COLOR
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picking-uniforms.js","sourceRoot":"","sources":["../../../src/modules/picking/picking-uniforms.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,qDAAqD;AACrD,MAAM,uBAAuB,GAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"picking-uniforms.js","sourceRoot":"","sources":["../../../src/modules/picking/picking-uniforms.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,qDAAqD;AACrD,MAAM,uBAAuB,GAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC;AAqDhC,gBAAgB;AAEhB,MAAM,YAAY,GAA0E;IAC1F,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,KAAK;IAChB,UAAU,EAAE,KAAK;IAEjB,iBAAiB,EAAE,KAAK;IACxB,qBAAqB,EAAE,KAAK;IAC5B,sBAAsB,EAAE,KAAK;IAC7B,cAAc,EAAE,WAAW;CAC5B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;;;CAcvC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;;CAavC,CAAC;AAEF,SAAS,WAAW,CAAC,QAAsB,EAAE,EAAE,YAA8B;IAC3E,MAAM,QAAQ,GAAG,EAAC,GAAG,YAAY,EAAoB,CAAC;IAEtD,UAAU;IACV,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,QAAQ,KAAK,CAAC,SAAS,EAAE,CAAC;QACxB,KAAK,UAAU;YACb,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;YACvB,MAAM;QACR,KAAK,WAAW;YACd,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;YACvB,MAAM;QACR,KAAK,SAAS;YACZ,YAAY;YACZ,MAAM;IACV,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACzC,QAAQ,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,QAAQ,KAAK,CAAC,sBAAsB,EAAE,CAAC;QACrC,KAAK,SAAS;YACZ,yEAAyE;YACzE,MAAM;QACR,KAAK,IAAI;YACP,kBAAkB;YAClB,QAAQ,CAAC,iBAAiB,GAAG,KAAK,CAAC;YACnC,QAAQ,CAAC,sBAAsB,GAAG,aAAa,CAAC;YAChD,MAAM;QACR;YACE,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAClC,QAAQ,CAAC,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC;IACnE,CAAC;IAED,QAAQ,KAAK,CAAC,qBAAqB,EAAE,CAAC;QACpC,KAAK,SAAS;YACZ,MAAM;QACR,KAAK,IAAI;YACP,QAAQ,CAAC,iBAAiB,GAAG,KAAK,CAAC;YACnC,QAAQ,CAAC,qBAAqB,GAAG,aAAa,CAAC;YAC/C,MAAM;QACR;YACE,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAClC,QAAQ,CAAC,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,CAAC;IACjE,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,QAAQ,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IACjD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,EAAkB;IACzB,QAAQ,EAAE,EAAqB;IAE/B,IAAI,EAAE,SAAS;IAEf,YAAY;IACZ,eAAe,EAAE;QACf,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,iBAAiB,EAAE,KAAK;QACxB,qBAAqB,EAAE,aAAa;QACpC,sBAAsB,EAAE,aAAa;QACrC,cAAc,EAAE,uBAAuB;KACxC;IAED,WAAW;CACoE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { PickingProps, PickingUniforms } from "./picking-uniforms.js";
|
|
2
|
+
/**
|
|
3
|
+
* Unified object-picking shader module.
|
|
4
|
+
* Uses color picking on GLSL/WebGL paths and index picking on WGSL/WebGPU paths.
|
|
5
|
+
*/
|
|
6
|
+
export declare const picking: {
|
|
7
|
+
readonly name: "picking";
|
|
8
|
+
readonly source: "struct pickingUniforms {\n isActive: i32,\n indexMode: i32,\n batchIndex: i32,\n\n isHighlightActive: i32,\n highlightedBatchIndex: i32,\n highlightedObjectIndex: i32,\n highlightColor: vec4<f32>,\n};\n\n@group(0) @binding(auto) var<uniform> picking: pickingUniforms;\n\n\nconst INDEX_PICKING_MODE_INSTANCE = 0;\nconst INDEX_PICKING_MODE_CUSTOM = 1;\nconst INDEX_PICKING_INVALID_INDEX = -1; // 2^32 - 1\n\n/**\n * WGSL shaders need to carry the returned object index through their own stage outputs.\n */\nfn picking_setObjectIndex(objectIndex: i32) -> i32 {\n return objectIndex;\n}\n\nfn picking_isObjectHighlighted(objectIndex: i32) -> bool {\n return\n picking.isHighlightActive != 0 &&\n picking.highlightedBatchIndex == picking.batchIndex &&\n picking.highlightedObjectIndex == objectIndex;\n}\n\nfn picking_filterHighlightColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {\n if (picking.isActive != 0 || !picking_isObjectHighlighted(objectIndex)) {\n return color;\n }\n\n let highLightAlpha = picking.highlightColor.a;\n let blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\n if (blendedAlpha == 0.0) {\n return vec4<f32>(color.rgb, 0.0);\n }\n\n let highLightRatio = highLightAlpha / blendedAlpha;\n let blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);\n return vec4<f32>(blendedRGB, blendedAlpha);\n}\n\nfn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {\n if (picking.isActive != 0 && objectIndex == INDEX_PICKING_INVALID_INDEX) {\n discard;\n }\n return color;\n}\n\nfn picking_getPickingColor(objectIndex: i32) -> vec2<i32> {\n return vec2<i32>(objectIndex, picking.batchIndex);\n}\n\n";
|
|
9
|
+
readonly vs: "precision highp float;\nprecision highp int;\n\nlayout(std140) uniform pickingUniforms {\n int isActive;\n int indexMode;\n int batchIndex;\n\n int isHighlightActive;\n int highlightedBatchIndex;\n int highlightedObjectIndex;\n vec4 highlightColor;\n} picking;\n\n\nconst int INDEX_PICKING_MODE_INSTANCE = 0;\nconst int INDEX_PICKING_MODE_CUSTOM = 1;\n\nconst int COLOR_PICKING_INVALID_INDEX = -1;\n\nflat out int picking_objectIndex;\n\nvoid picking_setObjectIndex(int objectIndex) {\n switch (picking.indexMode) {\n case INDEX_PICKING_MODE_INSTANCE:\n picking_objectIndex = gl_InstanceID;\n break;\n case INDEX_PICKING_MODE_CUSTOM:\n picking_objectIndex = objectIndex;\n break;\n }\n}\n";
|
|
10
|
+
readonly fs: "precision highp float;\nprecision highp int;\n\nlayout(std140) uniform pickingUniforms {\n int isActive;\n int indexMode;\n int batchIndex;\n\n int isHighlightActive;\n int highlightedBatchIndex;\n int highlightedObjectIndex;\n vec4 highlightColor;\n} picking;\n\n\nconst int COLOR_PICKING_INVALID_INDEX = -1;\nconst int COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;\nconst int COLOR_PICKING_MAX_BATCH_INDEX = 254;\n\nflat in int picking_objectIndex;\n\nbool picking_isFragmentHighlighted() {\n return\n bool(picking.isHighlightActive) &&\n picking.highlightedBatchIndex == picking.batchIndex &&\n picking.highlightedObjectIndex == picking_objectIndex\n ;\n}\n\nvec4 picking_filterHighlightColor(vec4 color) {\n if (bool(picking.isActive)) {\n return color;\n }\n\n if (!picking_isFragmentHighlighted()) {\n return color;\n }\n\n float highLightAlpha = picking.highlightColor.a;\n float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\n float highLightRatio = highLightAlpha / blendedAlpha;\n\n vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n}\n\nbool picking_canEncodePickInfo(int objectIndex) {\n return\n objectIndex != COLOR_PICKING_INVALID_INDEX &&\n objectIndex >= 0 &&\n objectIndex <= COLOR_PICKING_MAX_OBJECT_INDEX &&\n picking.batchIndex >= 0 &&\n picking.batchIndex <= COLOR_PICKING_MAX_BATCH_INDEX;\n}\n\nvec4 picking_getPickingColor() {\n if (!picking_canEncodePickInfo(picking_objectIndex)) {\n return vec4(0.0);\n }\n\n int encodedObjectIndex = picking_objectIndex + 1;\n int red = encodedObjectIndex % 256;\n int green = (encodedObjectIndex / 256) % 256;\n int blue = (encodedObjectIndex / 65536) % 256;\n int alpha = picking.batchIndex + 1;\n\n return vec4(float(red), float(green), float(blue), float(alpha)) / 255.0;\n}\n\nvec4 picking_filterPickingColor(vec4 color) {\n if (bool(picking.isActive)) {\n if (!picking_canEncodePickInfo(picking_objectIndex)) {\n discard;\n }\n return picking_getPickingColor();\n }\n\n return color;\n}\n\nvec4 picking_filterColor(vec4 color) {\n vec4 outColor = color;\n outColor = picking_filterHighlightColor(outColor);\n outColor = picking_filterPickingColor(outColor);\n return outColor;\n}\n";
|
|
11
|
+
readonly props: PickingProps;
|
|
12
|
+
readonly uniforms: PickingUniforms;
|
|
13
|
+
readonly uniformTypes: Required<import("@luma.gl/shadertools").UniformTypes<PickingUniforms>>;
|
|
14
|
+
readonly defaultUniforms: {
|
|
15
|
+
readonly isActive: false;
|
|
16
|
+
readonly indexMode: 0;
|
|
17
|
+
readonly batchIndex: 0;
|
|
18
|
+
readonly isHighlightActive: false;
|
|
19
|
+
readonly highlightedBatchIndex: -1;
|
|
20
|
+
readonly highlightedObjectIndex: -1;
|
|
21
|
+
readonly highlightColor: import("@math.gl/types").NumberArray4;
|
|
22
|
+
};
|
|
23
|
+
readonly getUniforms: (props?: PickingProps, prevUniforms?: PickingUniforms) => PickingUniforms;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=picking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picking.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/picking.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkB,YAAY,EAAE,eAAe,EAAC,8BAA2B;AAKvF;;;GAGG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;CAM6D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { pickingUniforms } from "./picking-uniforms.js";
|
|
5
|
+
import { picking as colorPicking } from "./color-picking.js";
|
|
6
|
+
import { picking as indexPicking } from "./index-picking.js";
|
|
7
|
+
/**
|
|
8
|
+
* Unified object-picking shader module.
|
|
9
|
+
* Uses color picking on GLSL/WebGL paths and index picking on WGSL/WebGPU paths.
|
|
10
|
+
*/
|
|
11
|
+
export const picking = {
|
|
12
|
+
...pickingUniforms,
|
|
13
|
+
name: 'picking',
|
|
14
|
+
source: indexPicking.source,
|
|
15
|
+
vs: colorPicking.vs,
|
|
16
|
+
fs: colorPicking.fs
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=picking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picking.js","sourceRoot":"","sources":["../../../src/modules/picking/picking.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,OAAO,EAAC,eAAe,EAAC,8BAA2B;AACnD,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,2BAAwB;AACxD,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,2BAAwB;AAExD;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,eAAe;IAClB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,YAAY,CAAC,MAAM;IAC3B,EAAE,EAAE,YAAY,CAAC,EAAE;IACnB,EAAE,EAAE,YAAY,CAAC,EAAE;CAC4D,CAAC"}
|
|
@@ -26,22 +26,16 @@ export function getFragmentShaderForRenderPass(options) {
|
|
|
26
26
|
/** Get a filtering WGSL fragment shader */
|
|
27
27
|
function getFilterShaderWGSL(func) {
|
|
28
28
|
return /* wgsl */ `\
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@group(0) @binding(1) var texture: texture_2d<f32>;
|
|
32
|
-
@group(0) @binding(2) var sampler: sampler;
|
|
33
|
-
|
|
34
|
-
struct FragmentInputs {
|
|
35
|
-
@location(0) fragUV: vec2f,
|
|
36
|
-
@location(1) fragPosition: vec4f,
|
|
37
|
-
@location(2) fragCoordinate: vec4f
|
|
38
|
-
};
|
|
29
|
+
@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
|
|
30
|
+
@group(0) @binding(2) var sourceTextureSampler: sampler;
|
|
39
31
|
|
|
40
32
|
@fragment
|
|
41
33
|
fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
|
|
42
|
-
let
|
|
43
|
-
|
|
44
|
-
|
|
34
|
+
let texCoord = inputs.coordinate;
|
|
35
|
+
let texSize = vec2f(textureDimensions(sourceTexture));
|
|
36
|
+
|
|
37
|
+
var fragColor = textureSample(sourceTexture, sourceTextureSampler, texCoord);
|
|
38
|
+
fragColor = ${func}(fragColor, texSize, texCoord);
|
|
45
39
|
return fragColor;
|
|
46
40
|
}
|
|
47
41
|
`;
|
|
@@ -49,23 +43,14 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
|
|
|
49
43
|
/** Get a sampling WGSL fragment shader */
|
|
50
44
|
function getSamplerShaderWGSL(func) {
|
|
51
45
|
return /* wgsl */ `\
|
|
52
|
-
|
|
53
|
-
@group(0) @binding(
|
|
54
|
-
@group(0) @binding(1) var texture: texture_2d<f32>;
|
|
55
|
-
@group(0) @binding(2) var sampler: sampler;
|
|
56
|
-
|
|
57
|
-
struct FragmentInputs = {
|
|
58
|
-
@location(0) fragUV: vec2f,
|
|
59
|
-
@location(1) fragPosition: vec4f,
|
|
60
|
-
@location(2) fragCoordinate: vec4f
|
|
61
|
-
};
|
|
46
|
+
@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
|
|
47
|
+
@group(0) @binding(2) var sourceTextureSampler: sampler;
|
|
62
48
|
|
|
63
49
|
@fragment
|
|
64
50
|
fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
|
|
65
|
-
let
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
return fragColor;
|
|
51
|
+
let texCoord = inputs.coordinate;
|
|
52
|
+
let texSize = vec2f(textureDimensions(sourceTexture));
|
|
53
|
+
return ${func}(sourceTexture, sourceTextureSampler, texSize, texCoord);
|
|
69
54
|
}
|
|
70
55
|
`;
|
|
71
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-fragment-shader.js","sourceRoot":"","sources":["../../src/passes/get-fragment-shader.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAIpC;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAI9C;IACC,MAAM,EAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAC,GAAG,OAAO,CAAC;IACtD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,MAAM,UAAU,GAAG,GAAG,UAAU,CAAC,IAAI,kBAAkB,CAAC;YACxD,OAAO,eAAe,KAAK,MAAM;gBAC/B,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC;gBACjC,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAEtC,KAAK,QAAQ;YACX,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,IAAI,cAAc,CAAC;YACrD,OAAO,eAAe,KAAK,MAAM;gBAC/B,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC;gBACnC,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAExC;YACE,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,+CAA+C,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,UAAU,CAAC
|
|
1
|
+
{"version":3,"file":"get-fragment-shader.js","sourceRoot":"","sources":["../../src/passes/get-fragment-shader.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAIpC;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAI9C;IACC,MAAM,EAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAC,GAAG,OAAO,CAAC;IACtD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,MAAM,UAAU,GAAG,GAAG,UAAU,CAAC,IAAI,kBAAkB,CAAC;YACxD,OAAO,eAAe,KAAK,MAAM;gBAC/B,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC;gBACjC,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAEtC,KAAK,QAAQ;YACX,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,IAAI,cAAc,CAAC;YACrD,OAAO,eAAe,KAAK,MAAM;gBAC/B,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC;gBACnC,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAExC;YACE,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,+CAA+C,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,UAAU,CAAC;;;;;;;;;;gBAUJ,IAAI;;;CAGnB,CAAC;AACF,CAAC;AAED,0CAA0C;AAC1C,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC;;;;;;;;WAQT,IAAI;;CAEd,CAAC;AACF,CAAC;AAED,2CAA2C;AAC3C,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,UAAU,CAAC;;;;;;;;;;;;;;;;;gBAiBJ,IAAI;;CAEnB,CAAC;AACF,CAAC;AAED,0CAA0C;AAC1C,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC;;;;;;;;;;;;;;;;gBAgBJ,IAAI;;CAEnB,CAAC;AACF,CAAC"}
|