@luma.gl/engine 9.2.6 → 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.
Files changed (186) hide show
  1. package/dist/animation-loop/animation-loop.d.ts +11 -5
  2. package/dist/animation-loop/animation-loop.d.ts.map +1 -1
  3. package/dist/animation-loop/animation-loop.js +83 -47
  4. package/dist/animation-loop/animation-loop.js.map +1 -1
  5. package/dist/animation-loop/make-animation-loop.js +7 -1
  6. package/dist/animation-loop/make-animation-loop.js.map +1 -1
  7. package/dist/animation-loop/request-animation-frame.d.ts.map +1 -1
  8. package/dist/animation-loop/request-animation-frame.js +23 -6
  9. package/dist/animation-loop/request-animation-frame.js.map +1 -1
  10. package/dist/compute/computation.d.ts +3 -7
  11. package/dist/compute/computation.d.ts.map +1 -1
  12. package/dist/compute/computation.js +16 -13
  13. package/dist/compute/computation.js.map +1 -1
  14. package/dist/compute/swap.d.ts +2 -0
  15. package/dist/compute/swap.d.ts.map +1 -1
  16. package/dist/compute/swap.js +10 -5
  17. package/dist/compute/swap.js.map +1 -1
  18. package/dist/dist.dev.js +2639 -1290
  19. package/dist/dist.min.js +325 -210
  20. package/dist/dynamic-texture/dynamic-texture.d.ts +102 -0
  21. package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -0
  22. package/dist/dynamic-texture/dynamic-texture.js +556 -0
  23. package/dist/dynamic-texture/dynamic-texture.js.map +1 -0
  24. package/dist/dynamic-texture/texture-data.d.ts +144 -0
  25. package/dist/dynamic-texture/texture-data.d.ts.map +1 -0
  26. package/dist/dynamic-texture/texture-data.js +208 -0
  27. package/dist/dynamic-texture/texture-data.js.map +1 -0
  28. package/dist/geometries/cone-geometry.d.ts +3 -1
  29. package/dist/geometries/cone-geometry.d.ts.map +1 -1
  30. package/dist/geometries/cone-geometry.js.map +1 -1
  31. package/dist/geometries/cylinder-geometry.d.ts +2 -1
  32. package/dist/geometries/cylinder-geometry.d.ts.map +1 -1
  33. package/dist/geometries/cylinder-geometry.js.map +1 -1
  34. package/dist/geometry/gpu-geometry.d.ts.map +1 -1
  35. package/dist/geometry/gpu-geometry.js +8 -3
  36. package/dist/geometry/gpu-geometry.js.map +1 -1
  37. package/dist/index.cjs +2497 -1212
  38. package/dist/index.cjs.map +4 -4
  39. package/dist/index.d.ts +20 -6
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +12 -4
  42. package/dist/index.js.map +1 -1
  43. package/dist/material/material-factory.d.ts +73 -0
  44. package/dist/material/material-factory.d.ts.map +1 -0
  45. package/dist/material/material-factory.js +111 -0
  46. package/dist/material/material-factory.js.map +1 -0
  47. package/dist/material/material.d.ts +84 -0
  48. package/dist/material/material.d.ts.map +1 -0
  49. package/dist/material/material.js +176 -0
  50. package/dist/material/material.js.map +1 -0
  51. package/dist/model/model.d.ts +47 -16
  52. package/dist/model/model.d.ts.map +1 -1
  53. package/dist/model/model.js +113 -47
  54. package/dist/model/model.js.map +1 -1
  55. package/dist/model/split-uniforms-and-bindings.d.ts +4 -3
  56. package/dist/model/split-uniforms-and-bindings.d.ts.map +1 -1
  57. package/dist/model/split-uniforms-and-bindings.js +2 -2
  58. package/dist/model/split-uniforms-and-bindings.js.map +1 -1
  59. package/dist/models/billboard-texture-model.d.ts +8 -5
  60. package/dist/models/billboard-texture-model.d.ts.map +1 -1
  61. package/dist/models/billboard-texture-model.js +77 -23
  62. package/dist/models/billboard-texture-model.js.map +1 -1
  63. package/dist/models/billboard-texture-module.d.ts +1 -1
  64. package/dist/models/billboard-texture-module.js +1 -1
  65. package/dist/models/clip-space.js +7 -7
  66. package/dist/models/directional-light-model.d.ts +7 -0
  67. package/dist/models/directional-light-model.d.ts.map +1 -0
  68. package/dist/models/directional-light-model.js +23 -0
  69. package/dist/models/directional-light-model.js.map +1 -0
  70. package/dist/models/light-model-utils.d.ts +69 -0
  71. package/dist/models/light-model-utils.d.ts.map +1 -0
  72. package/dist/models/light-model-utils.js +395 -0
  73. package/dist/models/light-model-utils.js.map +1 -0
  74. package/dist/models/point-light-model.d.ts +7 -0
  75. package/dist/models/point-light-model.d.ts.map +1 -0
  76. package/dist/models/point-light-model.js +22 -0
  77. package/dist/models/point-light-model.js.map +1 -0
  78. package/dist/models/spot-light-model.d.ts +7 -0
  79. package/dist/models/spot-light-model.d.ts.map +1 -0
  80. package/dist/models/spot-light-model.js +23 -0
  81. package/dist/models/spot-light-model.js.map +1 -0
  82. package/dist/modules/picking/color-picking.d.ts +5 -9
  83. package/dist/modules/picking/color-picking.d.ts.map +1 -1
  84. package/dist/modules/picking/color-picking.js +122 -115
  85. package/dist/modules/picking/color-picking.js.map +1 -1
  86. package/dist/modules/picking/index-picking.d.ts +4 -4
  87. package/dist/modules/picking/index-picking.d.ts.map +1 -1
  88. package/dist/modules/picking/index-picking.js +36 -16
  89. package/dist/modules/picking/index-picking.js.map +1 -1
  90. package/dist/modules/picking/legacy-color-picking.d.ts +26 -0
  91. package/dist/modules/picking/legacy-color-picking.d.ts.map +1 -0
  92. package/dist/modules/picking/legacy-color-picking.js +7 -0
  93. package/dist/modules/picking/legacy-color-picking.js.map +1 -0
  94. package/dist/modules/picking/picking-manager.d.ts +29 -3
  95. package/dist/modules/picking/picking-manager.d.ts.map +1 -1
  96. package/dist/modules/picking/picking-manager.js +188 -41
  97. package/dist/modules/picking/picking-manager.js.map +1 -1
  98. package/dist/modules/picking/picking-uniforms.d.ts +13 -12
  99. package/dist/modules/picking/picking-uniforms.d.ts.map +1 -1
  100. package/dist/modules/picking/picking-uniforms.js +27 -14
  101. package/dist/modules/picking/picking-uniforms.js.map +1 -1
  102. package/dist/modules/picking/picking.d.ts +25 -0
  103. package/dist/modules/picking/picking.d.ts.map +1 -0
  104. package/dist/modules/picking/picking.js +18 -0
  105. package/dist/modules/picking/picking.js.map +1 -0
  106. package/dist/passes/get-fragment-shader.js +12 -27
  107. package/dist/passes/get-fragment-shader.js.map +1 -1
  108. package/dist/passes/shader-pass-renderer.d.ts +5 -7
  109. package/dist/passes/shader-pass-renderer.d.ts.map +1 -1
  110. package/dist/passes/shader-pass-renderer.js +16 -42
  111. package/dist/passes/shader-pass-renderer.js.map +1 -1
  112. package/dist/scenegraph/group-node.d.ts +5 -0
  113. package/dist/scenegraph/group-node.d.ts.map +1 -1
  114. package/dist/scenegraph/group-node.js +12 -0
  115. package/dist/scenegraph/group-node.js.map +1 -1
  116. package/dist/scenegraph/model-node.d.ts +2 -2
  117. package/dist/scenegraph/model-node.d.ts.map +1 -1
  118. package/dist/scenegraph/model-node.js.map +1 -1
  119. package/dist/scenegraph/scenegraph-node.d.ts +1 -1
  120. package/dist/scenegraph/scenegraph-node.d.ts.map +1 -1
  121. package/dist/scenegraph/scenegraph-node.js +23 -15
  122. package/dist/scenegraph/scenegraph-node.js.map +1 -1
  123. package/dist/shader-inputs.d.ts +9 -7
  124. package/dist/shader-inputs.d.ts.map +1 -1
  125. package/dist/shader-inputs.js +84 -4
  126. package/dist/shader-inputs.js.map +1 -1
  127. package/dist/utils/buffer-layout-order.d.ts.map +1 -1
  128. package/dist/utils/buffer-layout-order.js +12 -2
  129. package/dist/utils/buffer-layout-order.js.map +1 -1
  130. package/dist/utils/shader-module-utils.d.ts +7 -0
  131. package/dist/utils/shader-module-utils.d.ts.map +1 -0
  132. package/dist/utils/shader-module-utils.js +46 -0
  133. package/dist/utils/shader-module-utils.js.map +1 -0
  134. package/package.json +6 -6
  135. package/src/animation-loop/animation-loop.ts +89 -50
  136. package/src/animation-loop/make-animation-loop.ts +13 -5
  137. package/src/animation-loop/request-animation-frame.ts +32 -6
  138. package/src/compute/computation.ts +32 -17
  139. package/src/compute/swap.ts +13 -7
  140. package/src/dynamic-texture/dynamic-texture.ts +732 -0
  141. package/src/dynamic-texture/texture-data.ts +336 -0
  142. package/src/geometries/cone-geometry.ts +6 -1
  143. package/src/geometries/cylinder-geometry.ts +5 -1
  144. package/src/geometry/gpu-geometry.ts +8 -3
  145. package/src/index.ts +38 -8
  146. package/src/material/material-factory.ts +157 -0
  147. package/src/material/material.ts +254 -0
  148. package/src/model/model.ts +158 -67
  149. package/src/model/split-uniforms-and-bindings.ts +8 -6
  150. package/src/models/billboard-texture-model.ts +88 -27
  151. package/src/models/billboard-texture-module.ts +1 -1
  152. package/src/models/clip-space.ts +7 -7
  153. package/src/models/directional-light-model.ts +32 -0
  154. package/src/models/light-model-utils.ts +587 -0
  155. package/src/models/point-light-model.ts +31 -0
  156. package/src/models/spot-light-model.ts +32 -0
  157. package/src/modules/picking/color-picking.ts +123 -122
  158. package/src/modules/picking/index-picking.ts +36 -16
  159. package/src/modules/picking/legacy-color-picking.ts +8 -0
  160. package/src/modules/picking/picking-manager.ts +252 -50
  161. package/src/modules/picking/picking-uniforms.ts +39 -24
  162. package/src/modules/picking/picking.ts +22 -0
  163. package/src/passes/get-fragment-shader.ts +12 -27
  164. package/src/passes/shader-pass-renderer.ts +25 -48
  165. package/src/scenegraph/group-node.ts +16 -0
  166. package/src/scenegraph/model-node.ts +2 -2
  167. package/src/scenegraph/scenegraph-node.ts +27 -16
  168. package/src/shader-inputs.ts +165 -15
  169. package/src/utils/buffer-layout-order.ts +18 -2
  170. package/src/utils/shader-module-utils.ts +65 -0
  171. package/dist/async-texture/async-texture.d.ts +0 -166
  172. package/dist/async-texture/async-texture.d.ts.map +0 -1
  173. package/dist/async-texture/async-texture.js +0 -386
  174. package/dist/async-texture/async-texture.js.map +0 -1
  175. package/dist/factories/pipeline-factory.d.ts +0 -37
  176. package/dist/factories/pipeline-factory.d.ts.map +0 -1
  177. package/dist/factories/pipeline-factory.js +0 -181
  178. package/dist/factories/pipeline-factory.js.map +0 -1
  179. package/dist/factories/shader-factory.d.ts +0 -22
  180. package/dist/factories/shader-factory.d.ts.map +0 -1
  181. package/dist/factories/shader-factory.js +0 -88
  182. package/dist/factories/shader-factory.js.map +0 -1
  183. package/src/async-texture/async-texture.ts +0 -551
  184. package/src/factories/pipeline-factory.ts +0 -224
  185. package/src/factories/shader-factory.ts +0 -103
  186. /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 the new picking module
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 = this.device.createFramebuffer({
33
- colorAttachments: ['rgba8unorm', 'rg32sint'],
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.props.shaderInputs.setProps({ picking: { highlightedObjectIndex: null } });
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.props.shaderInputs?.setProps({ picking: { isActive: true } });
48
- const pickingPass = this.device.beginRenderPass({
49
- framebuffer,
50
- clearColors: [new Float32Array([0, 0, 0, 0]), new Int32Array([-1, -1, 0, 0])],
51
- clearDepth: 1
52
- });
53
- return pickingPass;
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
- // use the center pixel location in device pixel range
58
- const [pickX, pickY] = this.getPickPosition(mousePosition);
59
- // Read back
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
- const pickInfo = {
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.props.shaderInputs?.setProps({
82
- picking: {
83
- isActive: false,
84
- highlightedBatchIndex: pickInfo.batchIndex,
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 devicePixels = this.device.getDefaultCanvasContext().cssToDevicePixels(mousePosition);
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":"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"}
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 to use instance_index (built-in) or a custom application supplied index (usually from an attribute) */
13
- indexMode?: 'instance' | 'custom';
14
- /** Batch index (used when rendering multiple models to identify which model was picked), defaults to 0 */
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
- /** Index of the highlighted batch, defaults to 0 */
17
+ /** Identifier of the highlighted batch */
17
18
  highlightedBatchIndex?: number | null;
18
- /** Set an index to highlight that item, or `null` to explicitly clear **/
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
- /** Set to true when picking an attribute value instead of object index */
35
+ /** Whether the current payload comes from instance_index or a custom integer attribute */
35
36
  indexMode: 0 | 1;
36
- /** Index of batch currently being rendered */
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 (defaults to 0) */
43
+ /** Indicates which batch to visually highlight an item in */
43
44
  highlightedBatchIndex: number;
44
- /** Indicates which index in the batch to highlight an item in */
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\nuniform 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";
49
- export declare const WGSL_UNIFORMS = "struct pickingUniforms {\n isActive: int32;\n indexMode: int32;\n batchIndex: int32;\n\n isHighlightActive: int32;\n highlightedBatchIndex: int32;\n highlightedObjectIndex: int32;\n highlightColor: vec4<f32>;\n} picking;\n";
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: true;
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;AAEhC;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kHAAkH;IAClH,SAAS,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IAClC,0GAA0G;IAC1G,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,oDAAoD;IACpD,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,0EAA0E;IAC1E,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,0EAA0E;IAC1E,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IAEnB,qCAAqC;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gGAAgG;IAChG,cAAc,EAAE,YAAY,CAAC;IAC7B,6EAA6E;IAC7E,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,sBAAsB,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,EAAE,CAAC;AAejC,eAAO,MAAM,aAAa,mQAczB,CAAC;AAEF,eAAO,MAAM,aAAa,0OAWzB,CAAC;AAEF,iBAAS,WAAW,CAAC,KAAK,GAAE,YAAiB,EAAE,YAAY,CAAC,EAAE,eAAe,GAAG,eAAe,CA2C9F;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe;oBACb,YAAY;uBACT,eAAe;;;;;;;;;;;;;CAgBgD,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: int32;
35
- indexMode: int32;
36
- batchIndex: int32;
34
+ isActive: i32,
35
+ indexMode: i32,
36
+ batchIndex: i32,
37
37
 
38
- isHighlightActive: int32;
39
- highlightedBatchIndex: int32;
40
- highlightedObjectIndex: int32;
41
- highlightColor: vec4<f32>;
42
- } picking;
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 'custom':
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 highlightedObjectColor explicitly null or set, do not update state
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
- if (typeof props.highlightedBatchIndex === 'number') {
75
- uniforms.highlightedBatchIndex = props.highlightedBatchIndex;
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: true,
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;AAoDhC,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;;;;;;;;;;;CAWvC,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,QAAQ;YACX,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;YACvB,MAAM;QACR,KAAK,SAAS;YACZ,YAAY;YACZ,MAAM;IACV,CAAC;IAED,QAAQ,KAAK,CAAC,sBAAsB,EAAE,CAAC;QACrC,KAAK,SAAS;YACZ,4EAA4E;YAC5E,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,IAAI,OAAO,KAAK,CAAC,qBAAqB,KAAK,QAAQ,EAAE,CAAC;QACpD,QAAQ,CAAC,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,CAAC;IAC/D,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,IAAI;QACvB,qBAAqB,EAAE,aAAa;QACpC,sBAAsB,EAAE,aAAa;QACrC,cAAc,EAAE,uBAAuB;KACxC;IAED,WAAW;CACoE,CAAC"}
1
+ {"version":3,"file":"picking-uniforms.js","sourceRoot":"","sources":["../../../src/modules/picking/picking-uniforms.ts"],"names":[],"mappings":"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"}
@@ -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
- // Binding 0:1 is reserved for shader passes
30
- // @group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;
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 texSize = textureDimensions(texture, 0);
43
- var fragColor = textureSample(texture, sampler, fragUV);
44
- fragColor = ${func}(gl_FragColor, texSize, texCoord);
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
- // Binding 0:1 is reserved for shader passes
53
- @group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;
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 texSize = textureDimensions(texture, 0);
66
- var fragColor = textureSample(texture, sampler, fragUV);
67
- fragColor = ${func}(gl_FragColor, texSize, texCoord);
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;;;;;;;;;;;;;;;;gBAgBJ,IAAI;;;CAGnB,CAAC;AACF,CAAC;AAED,0CAA0C;AAC1C,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC;;;;;;;;;;;;;;;;gBAgBJ,IAAI;;;CAGnB,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"}
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"}