@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,144 +1,178 @@
1
1
  // luma.gl
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
- import { pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS } from "./picking-uniforms.js";
4
+ import { pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS, INVALID_INDEX } from "./picking-uniforms.js";
5
5
  const source = /* wgsl */ `\
6
6
  ${WGSL_UNIFORMS}
7
- `;
8
- const vs = /* glsl */ `\
9
- ${GLSL_UNIFORMS}
10
- out vec4 picking_vRGBcolor_Avalid;
11
7
 
12
- // Normalize unsigned byte color to 0-1 range
13
- vec3 picking_normalizeColor(vec3 color) {
14
- return picking.useFloatColors > 0.5 ? color : color / 255.0;
15
- }
8
+ const COLOR_PICKING_INVALID_INDEX = ${INVALID_INDEX};
9
+ const COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
10
+ const COLOR_PICKING_MAX_BATCH_INDEX = 254;
16
11
 
17
- // Normalize unsigned byte color to 0-1 range
18
- vec4 picking_normalizeColor(vec4 color) {
19
- return picking.useFloatColors > 0.5 ? color : color / 255.0;
12
+ fn picking_setObjectIndex(objectIndex: i32) -> i32 {
13
+ return objectIndex;
20
14
  }
21
15
 
22
- bool picking_isColorZero(vec3 color) {
23
- return dot(color, vec3(1.0)) < 0.00001;
16
+ fn picking_isObjectHighlighted(objectIndex: i32) -> bool {
17
+ return
18
+ picking.isHighlightActive != 0 &&
19
+ picking.highlightedBatchIndex == picking.batchIndex &&
20
+ picking.highlightedObjectIndex == objectIndex;
24
21
  }
25
22
 
26
- bool picking_isColorValid(vec3 color) {
27
- return dot(color, vec3(1.0)) > 0.00001;
23
+ fn picking_filterHighlightColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
24
+ if (picking.isActive != 0 || !picking_isObjectHighlighted(objectIndex)) {
25
+ return color;
26
+ }
27
+
28
+ let highLightAlpha = picking.highlightColor.a;
29
+ let blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
30
+ if (blendedAlpha == 0.0) {
31
+ return vec4<f32>(color.rgb, 0.0);
32
+ }
33
+
34
+ let highLightRatio = highLightAlpha / blendedAlpha;
35
+ let blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
36
+ return vec4<f32>(blendedRGB, blendedAlpha);
28
37
  }
29
38
 
30
- // Check if this vertex is highlighted
31
- bool isVertexHighlighted(vec3 vertexColor) {
32
- vec3 highlightedObjectColor = picking_normalizeColor(picking.highlightedObjectColor);
39
+ fn picking_canEncodePickInfo(objectIndex: i32) -> bool {
33
40
  return
34
- bool(picking.isHighlightActive) && picking_isColorZero(abs(vertexColor - highlightedObjectColor));
41
+ objectIndex != COLOR_PICKING_INVALID_INDEX &&
42
+ objectIndex >= 0 &&
43
+ objectIndex <= COLOR_PICKING_MAX_OBJECT_INDEX &&
44
+ picking.batchIndex >= 0 &&
45
+ picking.batchIndex <= COLOR_PICKING_MAX_BATCH_INDEX;
35
46
  }
36
47
 
37
- // Set the current picking color
38
- void picking_setPickingColor(vec3 pickingColor) {
39
- pickingColor = picking_normalizeColor(pickingColor);
40
-
41
- if (bool(picking.isActive)) {
42
- // Use alpha as the validity flag. If pickingColor is [0, 0, 0] fragment is non-pickable
43
- picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));
44
-
45
- if (!bool(picking.isAttribute)) {
46
- // Stores the picking color so that the fragment shader can render it during picking
47
- picking_vRGBcolor_Avalid.rgb = pickingColor;
48
- }
49
- } else {
50
- // Do the comparison with selected item color in vertex shader as it should mean fewer compares
51
- picking_vRGBcolor_Avalid.a = float(isVertexHighlighted(pickingColor));
48
+ fn picking_getPickingColor(objectIndex: i32) -> vec4<f32> {
49
+ if (!picking_canEncodePickInfo(objectIndex)) {
50
+ return vec4<f32>(0.0, 0.0, 0.0, 0.0);
52
51
  }
52
+
53
+ let encodedObjectIndex = objectIndex + 1;
54
+ let red = encodedObjectIndex % 256;
55
+ let green = (encodedObjectIndex / 256) % 256;
56
+ let blue = (encodedObjectIndex / 65536) % 256;
57
+ let alpha = picking.batchIndex + 1;
58
+
59
+ return vec4<f32>(
60
+ f32(red) / 255.0,
61
+ f32(green) / 255.0,
62
+ f32(blue) / 255.0,
63
+ f32(alpha) / 255.0
64
+ );
53
65
  }
54
66
 
55
- void picking_setObjectIndex(uint objectIndex) {
56
- if (bool(picking.isActive)) {
57
- uint index = objectIndex;
58
- if (picking.indexMode == PICKING_INDEX_MODE_INSTANCE) {
59
- index = uint(gl_InstanceID);
67
+ fn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
68
+ if (picking.isActive != 0) {
69
+ if (!picking_canEncodePickInfo(objectIndex)) {
70
+ discard;
60
71
  }
61
- picking_vRGBcolor_Avalid.r = float(index % 255) / 255.0;
62
- picking_vRGBcolor_Avalid.g = float((index / 255) % 255) / 255.0;
63
- picking_vRGBcolor_Avalid.b = float((index / 255 / 255) %255) / 255.0;
72
+ return picking_getPickingColor(objectIndex);
64
73
  }
65
- }
66
74
 
67
- void picking_setPickingAttribute(float value) {
68
- if (bool(picking.isAttribute)) {
69
- picking_vRGBcolor_Avalid.r = value;
70
- }
75
+ return color;
71
76
  }
77
+ `;
78
+ const vs = /* glsl */ `\
79
+ ${GLSL_UNIFORMS}
72
80
 
73
- void picking_setPickingAttribute(vec2 value) {
74
- if (bool(picking.isAttribute)) {
75
- picking_vRGBcolor_Avalid.rg = value;
76
- }
77
- }
81
+ const int INDEX_PICKING_MODE_INSTANCE = 0;
82
+ const int INDEX_PICKING_MODE_CUSTOM = 1;
83
+
84
+ const int COLOR_PICKING_INVALID_INDEX = ${INVALID_INDEX};
78
85
 
79
- void picking_setPickingAttribute(vec3 value) {
80
- if (bool(picking.isAttribute)) {
81
- picking_vRGBcolor_Avalid.rgb = value;
86
+ flat out int picking_objectIndex;
87
+
88
+ void picking_setObjectIndex(int objectIndex) {
89
+ switch (picking.indexMode) {
90
+ case INDEX_PICKING_MODE_INSTANCE:
91
+ picking_objectIndex = gl_InstanceID;
92
+ break;
93
+ case INDEX_PICKING_MODE_CUSTOM:
94
+ picking_objectIndex = objectIndex;
95
+ break;
82
96
  }
83
97
  }
84
98
  `;
85
99
  const fs = /* glsl */ `\
86
100
  ${GLSL_UNIFORMS}
87
101
 
88
- in vec4 picking_vRGBcolor_Avalid;
102
+ const int COLOR_PICKING_INVALID_INDEX = ${INVALID_INDEX};
103
+ const int COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
104
+ const int COLOR_PICKING_MAX_BATCH_INDEX = 254;
105
+
106
+ flat in int picking_objectIndex;
107
+
108
+ bool picking_isFragmentHighlighted() {
109
+ return
110
+ bool(picking.isHighlightActive) &&
111
+ picking.highlightedBatchIndex == picking.batchIndex &&
112
+ picking.highlightedObjectIndex == picking_objectIndex
113
+ ;
114
+ }
89
115
 
90
- /*
91
- * Returns highlight color if this item is selected.
92
- */
93
116
  vec4 picking_filterHighlightColor(vec4 color) {
94
- // If we are still picking, we don't highlight
95
- if (picking.isActive > 0.5) {
117
+ if (bool(picking.isActive)) {
96
118
  return color;
97
119
  }
98
120
 
99
- bool selected = bool(picking_vRGBcolor_Avalid.a);
121
+ if (!picking_isFragmentHighlighted()) {
122
+ return color;
123
+ }
100
124
 
101
- if (selected) {
102
- // Blend in highlight color based on its alpha value
103
- float highLightAlpha = picking.highlightColor.a;
104
- float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
105
- float highLightRatio = highLightAlpha / blendedAlpha;
125
+ float highLightAlpha = picking.highlightColor.a;
126
+ float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
127
+ float highLightRatio = highLightAlpha / blendedAlpha;
106
128
 
107
- vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
108
- return vec4(blendedRGB, blendedAlpha);
109
- } else {
110
- return color;
129
+ vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
130
+ return vec4(blendedRGB, blendedAlpha);
131
+ }
132
+
133
+ bool picking_canEncodePickInfo(int objectIndex) {
134
+ return
135
+ objectIndex != COLOR_PICKING_INVALID_INDEX &&
136
+ objectIndex >= 0 &&
137
+ objectIndex <= COLOR_PICKING_MAX_OBJECT_INDEX &&
138
+ picking.batchIndex >= 0 &&
139
+ picking.batchIndex <= COLOR_PICKING_MAX_BATCH_INDEX;
140
+ }
141
+
142
+ vec4 picking_getPickingColor() {
143
+ if (!picking_canEncodePickInfo(picking_objectIndex)) {
144
+ return vec4(0.0);
111
145
  }
146
+
147
+ int encodedObjectIndex = picking_objectIndex + 1;
148
+ int red = encodedObjectIndex % 256;
149
+ int green = (encodedObjectIndex / 256) % 256;
150
+ int blue = (encodedObjectIndex / 65536) % 256;
151
+ int alpha = picking.batchIndex + 1;
152
+
153
+ return vec4(float(red), float(green), float(blue), float(alpha)) / 255.0;
112
154
  }
113
155
 
114
- /*
115
- * Returns picking color if picking enabled else unmodified argument.
116
- */
117
156
  vec4 picking_filterPickingColor(vec4 color) {
118
157
  if (bool(picking.isActive)) {
119
- if (picking_vRGBcolor_Avalid.a == 0.0) {
158
+ if (!picking_canEncodePickInfo(picking_objectIndex)) {
120
159
  discard;
121
160
  }
122
- return picking_vRGBcolor_Avalid;
161
+ return picking_getPickingColor();
123
162
  }
163
+
124
164
  return color;
125
165
  }
126
166
 
127
- /*
128
- * Returns picking color if picking is enabled if not
129
- * highlight color if this item is selected, otherwise unmodified argument.
130
- */
131
167
  vec4 picking_filterColor(vec4 color) {
132
- vec4 highlightColor = picking_filterHighlightColor(color);
133
- return picking_filterPickingColor(highlightColor);
168
+ vec4 outColor = color;
169
+ outColor = picking_filterHighlightColor(outColor);
170
+ outColor = picking_filterPickingColor(outColor);
171
+ return outColor;
134
172
  }
135
173
  `;
136
174
  /**
137
- * Provides support for color-coding-based picking and highlighting.
138
- * In particular, supports picking a specific instance in an instanced
139
- * draw call and highlighting an instance based on its picking color,
140
- * and correspondingly, supports picking and highlighting groups of
141
- * primitives with the same picking color in non-instanced draw-calls
175
+ * Provides support for object-index based color picking and highlighting.
142
176
  */
143
177
  export const picking = {
144
178
  ...pickingUniforms,
@@ -147,31 +181,4 @@ export const picking = {
147
181
  vs,
148
182
  fs
149
183
  };
150
- // function getUniforms(opts: PickingProps = {}, prevUniforms?: PickingUniforms): PickingUniforms {
151
- // const uniforms = {} as PickingUniforms;
152
- // if (opts.highlightedObjectColor === undefined) {
153
- // // Unless highlightedObjectColor explicitly null or set, do not update state
154
- // } else if (opts.highlightedObjectColor === null) {
155
- // uniforms.isHighlightActive = false;
156
- // } else {
157
- // uniforms.isHighlightActive = true;
158
- // const highlightedObjectColor = opts.highlightedObjectColor.slice(0, 3);
159
- // uniforms.highlightedObjectColor = highlightedObjectColor;
160
- // }
161
- // if (opts.highlightColor) {
162
- // const color = Array.from(opts.highlightColor, x => x / 255);
163
- // if (!Number.isFinite(color[3])) {
164
- // color[3] = 1;
165
- // }
166
- // uniforms.highlightColor = color;
167
- // }
168
- // if (opts.isActive !== undefined) {
169
- // uniforms.isActive = Boolean(opts.isActive);
170
- // uniforms.isAttribute = Boolean(opts.isAttribute);
171
- // }
172
- // if (opts.useFloatColors !== undefined) {
173
- // uniforms.useFloatColors = Boolean(opts.useFloatColors);
174
- // }
175
- // return uniforms;
176
- // }
177
184
  //# sourceMappingURL=color-picking.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"color-picking.js","sourceRoot":"","sources":["../../../src/modules/picking/color-picking.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,OAAO,EAAC,eAAe,EAAE,aAAa,EAAE,aAAa,EAAC,8BAA2B;AAEjF,MAAM,MAAM,GAAG,UAAU,CAAC;EACxB,aAAa;CACd,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Ed,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDd,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,eAAe;IAClB,IAAI,EAAE,SAAS;IACf,MAAM;IACN,EAAE;IACF,EAAE;CAC6E,CAAC;AAElF,mGAAmG;AACnG,4CAA4C;AAE5C,qDAAqD;AACrD,mFAAmF;AACnF,uDAAuD;AACvD,0CAA0C;AAC1C,aAAa;AACb,yCAAyC;AACzC,8EAA8E;AAC9E,gEAAgE;AAChE,MAAM;AAEN,+BAA+B;AAC/B,mEAAmE;AACnE,wCAAwC;AACxC,sBAAsB;AACtB,QAAQ;AACR,uCAAuC;AACvC,MAAM;AAEN,uCAAuC;AACvC,kDAAkD;AAClD,wDAAwD;AACxD,MAAM;AAEN,6CAA6C;AAC7C,8DAA8D;AAC9D,MAAM;AAEN,qBAAqB;AACrB,IAAI"}
1
+ {"version":3,"file":"color-picking.js","sourceRoot":"","sources":["../../../src/modules/picking/color-picking.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,OAAO,EAAC,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAC,8BAA2B;AAEhG,MAAM,MAAM,GAAG,UAAU,CAAC;EACxB,aAAa;;sCAEuB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqElD,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;;;;0CAK2B,aAAa;;;;;;;;;;;;;;CActD,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;0CAE2B,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEtD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,eAAe;IAClB,IAAI,EAAE,SAAS;IACf,MAAM;IACN,EAAE;IACF,EAAE;CAC6E,CAAC"}
@@ -12,9 +12,9 @@ import type { PickingProps, PickingUniforms } from "./picking-uniforms.js";
12
12
  */
13
13
  export declare const picking: {
14
14
  readonly name: "picking";
15
- readonly source: "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\n\nconst INDEX_PICKING_MODE_INSTANCE = 0;\nconst INDEX_PICKING_MODE_CUSTOM = 1;\nconst INDEX_PICKING_INVALID_INDEX = -1; // 2^32 - 1\n\nstruct indexPickingFragmentInputs = {\n objectIndex: int32;\n};\n\nlet indexPickingFragmentInputs: indexPickingFragmentInputs;\n\n/**\n * Vertex shaders should call this function to set the object index.\n * If using instance or vertex mode, argument will be ignored, 0 can be supplied.\n */\nfn picking_setObjectIndex(objectIndex: int32) {\n switch (picking.indexMode) {\n case INDEX_PICKING_MODE_INSTANCE, default: {\n picking_objectIndex = instance_index;\n };\n case INDEX_PICKING_MODE_CUSTOM: {\n picking_objectIndex = objectIndex;\n };\n }\n}\n\n";
16
- readonly vs: "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\n\nconst int INDEX_PICKING_MODE_INSTANCE = 0;\nconst int INDEX_PICKING_MODE_CUSTOM = 1;\n\nconst int INDEX_PICKING_INVALID_INDEX = -1; // 2^32 - 1\n\nflat out int picking_objectIndex;\n\n/**\n * Vertex shaders should call this function to set the object index.\n * If using instance or vertex mode, argument will be ignored, 0 can be supplied.\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";
17
- readonly fs: "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\n\nconst int INDEX_PICKING_INVALID_INDEX = -1; // 2^32 - 1\n\nflat in int picking_objectIndex;\n\n/**\n * Check if this vertex is highlighted (part of the selected batch and object)\n */ \nbool picking_isFragmentHighlighted() {\n return \n bool(picking.isHighlightActive) &&\n picking.highlightedBatchIndex == picking.batchIndex &&\n picking.highlightedObjectIndex == picking_objectIndex\n ;\n}\n\n/**\n * Returns highlight color if this item is selected.\n */\nvec4 picking_filterHighlightColor(vec4 color) {\n // If we are still picking, we don't highlight\n if (bool(picking.isActive)) {\n return color;\n }\n\n // If we are not highlighted, return color as is\n if (!picking_isFragmentHighlighted()) {\n return color;\n }\n \n // Blend in highlight color based on its alpha value\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\n/*\n * Returns picking color if picking enabled else unmodified argument.\n */\nivec4 picking_getPickingColor() {\n // Assumes that colorAttachment0 is rg32int\n // TODO? - we could render indices into a second color attachment and not mess with fragColor\n return ivec4(picking_objectIndex, picking.batchIndex, 0u, 0u); \n}\n\nvec4 picking_filterPickingColor(vec4 color) {\n if (bool(picking.isActive)) {\n if (picking_objectIndex == INDEX_PICKING_INVALID_INDEX) {\n discard;\n }\n }\n return color;\n}\n\n/*\n * Returns picking color if picking is enabled if not\n * highlight color if this item is selected, otherwise unmodified argument.\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";
15
+ 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";
16
+ 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 INDEX_PICKING_INVALID_INDEX = -1; // 2^32 - 1\n\nflat out int picking_objectIndex;\n\n/**\n * Vertex shaders should call this function to set the object index.\n * If using instance or vertex mode, argument will be ignored, 0 can be supplied.\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";
17
+ 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 INDEX_PICKING_INVALID_INDEX = -1; // 2^32 - 1\n\nflat in int picking_objectIndex;\n\n/**\n * Check if this vertex is highlighted (part of the selected batch and object)\n */ \nbool picking_isFragmentHighlighted() {\n return \n bool(picking.isHighlightActive) &&\n picking.highlightedBatchIndex == picking.batchIndex &&\n picking.highlightedObjectIndex == picking_objectIndex\n ;\n}\n\n/**\n * Returns highlight color if this item is selected.\n */\nvec4 picking_filterHighlightColor(vec4 color) {\n // If we are still picking, we don't highlight\n if (bool(picking.isActive)) {\n return color;\n }\n\n // If we are not highlighted, return color as is\n if (!picking_isFragmentHighlighted()) {\n return color;\n }\n \n // Blend in highlight color based on its alpha value\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\n/*\n * Returns picking color if picking enabled else unmodified argument.\n */\nivec4 picking_getPickingColor() {\n // Assumes that colorAttachment0 is rg32int\n // TODO? - we could render indices into a second color attachment and not mess with fragColor\n return ivec4(picking_objectIndex, picking.batchIndex, 0u, 0u); \n}\n\nvec4 picking_filterPickingColor(vec4 color) {\n if (bool(picking.isActive)) {\n if (picking_objectIndex == INDEX_PICKING_INVALID_INDEX) {\n discard;\n }\n }\n return color;\n}\n\n/*\n * Returns picking color if picking is enabled if not\n * highlight color if this item is selected, otherwise unmodified argument.\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";
18
18
  readonly props: PickingProps;
19
19
  readonly uniforms: PickingUniforms;
20
20
  readonly uniformTypes: Required<import("@luma.gl/shadertools").UniformTypes<PickingUniforms>>;
@@ -22,7 +22,7 @@ export declare const picking: {
22
22
  readonly isActive: false;
23
23
  readonly indexMode: 0;
24
24
  readonly batchIndex: 0;
25
- readonly isHighlightActive: true;
25
+ readonly isHighlightActive: false;
26
26
  readonly highlightedBatchIndex: -1;
27
27
  readonly highlightedObjectIndex: -1;
28
28
  readonly highlightColor: import("@math.gl/types").NumberArray4;
@@ -1 +1 @@
1
- {"version":3,"file":"index-picking.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/index-picking.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkB,YAAY,EAAE,eAAe,EAAC,8BAA2B;AAoIvF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;CAM6D,CAAC"}
1
+ {"version":3,"file":"index-picking.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/index-picking.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkB,YAAY,EAAE,eAAe,EAAC,8BAA2B;AAwJvF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;CAM6D,CAAC"}
@@ -10,25 +10,45 @@ const INDEX_PICKING_MODE_INSTANCE = 0;
10
10
  const INDEX_PICKING_MODE_CUSTOM = 1;
11
11
  const INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1
12
12
 
13
- struct indexPickingFragmentInputs = {
14
- objectIndex: int32;
15
- };
16
-
17
- let indexPickingFragmentInputs: indexPickingFragmentInputs;
18
-
19
13
  /**
20
- * Vertex shaders should call this function to set the object index.
21
- * If using instance or vertex mode, argument will be ignored, 0 can be supplied.
14
+ * WGSL shaders need to carry the returned object index through their own stage outputs.
22
15
  */
23
- fn picking_setObjectIndex(objectIndex: int32) {
24
- switch (picking.indexMode) {
25
- case INDEX_PICKING_MODE_INSTANCE, default: {
26
- picking_objectIndex = instance_index;
27
- };
28
- case INDEX_PICKING_MODE_CUSTOM: {
29
- picking_objectIndex = objectIndex;
30
- };
16
+ fn picking_setObjectIndex(objectIndex: i32) -> i32 {
17
+ return objectIndex;
18
+ }
19
+
20
+ fn picking_isObjectHighlighted(objectIndex: i32) -> bool {
21
+ return
22
+ picking.isHighlightActive != 0 &&
23
+ picking.highlightedBatchIndex == picking.batchIndex &&
24
+ picking.highlightedObjectIndex == objectIndex;
25
+ }
26
+
27
+ fn picking_filterHighlightColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
28
+ if (picking.isActive != 0 || !picking_isObjectHighlighted(objectIndex)) {
29
+ return color;
30
+ }
31
+
32
+ let highLightAlpha = picking.highlightColor.a;
33
+ let blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
34
+ if (blendedAlpha == 0.0) {
35
+ return vec4<f32>(color.rgb, 0.0);
31
36
  }
37
+
38
+ let highLightRatio = highLightAlpha / blendedAlpha;
39
+ let blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
40
+ return vec4<f32>(blendedRGB, blendedAlpha);
41
+ }
42
+
43
+ fn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
44
+ if (picking.isActive != 0 && objectIndex == INDEX_PICKING_INVALID_INDEX) {
45
+ discard;
46
+ }
47
+ return color;
48
+ }
49
+
50
+ fn picking_getPickingColor(objectIndex: i32) -> vec2<i32> {
51
+ return vec2<i32>(objectIndex, picking.batchIndex);
32
52
  }
33
53
 
34
54
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"index-picking.js","sourceRoot":"","sources":["../../../src/modules/picking/index-picking.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,OAAO,EAAC,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAC,8BAA2B;AAEhG,UAAU;AAEV,MAAM,MAAM,GAAG,UAAU,CAAC;EACxB,aAAa;;;;sCAIuB,aAAa;;;;;;;;;;;;;;;;;;;;;;;CAuBlD,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;;;;0CAK2B,aAAa;;;;;;;;;;;;;;;;;;CAkBtD,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;0CAE2B,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEtD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,eAAe;IAClB,IAAI,EAAE,SAAS;IACf,MAAM;IACN,EAAE;IACF,EAAE;CAC6E,CAAC"}
1
+ {"version":3,"file":"index-picking.js","sourceRoot":"","sources":["../../../src/modules/picking/index-picking.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,OAAO,EAAC,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAC,8BAA2B;AAEhG,UAAU;AAEV,MAAM,MAAM,GAAG,UAAU,CAAC;EACxB,aAAa;;;;sCAIuB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ClD,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;;;;0CAK2B,aAAa;;;;;;;;;;;;;;;;;;CAkBtD,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;0CAE2B,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEtD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,eAAe;IAClB,IAAI,EAAE,SAAS;IACf,MAAM;IACN,EAAE;IACF,EAAE;CAC6E,CAAC"}
@@ -0,0 +1,26 @@
1
+ /** @deprecated Use `picking`/`colorPicking` for object picking. */
2
+ export declare const legacyColorPicking: {
3
+ readonly props: import("@luma.gl/shadertools").PickingProps;
4
+ readonly uniforms: import("@luma.gl/shadertools").PickingUniforms;
5
+ readonly name: "picking";
6
+ readonly uniformTypes: {
7
+ readonly isActive: "f32";
8
+ readonly isAttribute: "f32";
9
+ readonly isHighlightActive: "f32";
10
+ readonly useFloatColors: "f32";
11
+ readonly highlightedObjectColor: "vec3<f32>";
12
+ readonly highlightColor: "vec4<f32>";
13
+ };
14
+ readonly defaultUniforms: {
15
+ readonly isActive: false;
16
+ readonly isAttribute: false;
17
+ readonly isHighlightActive: false;
18
+ readonly useFloatColors: true;
19
+ readonly highlightedObjectColor: [0, 0, 0];
20
+ readonly highlightColor: import("@math.gl/types").NumberArray4;
21
+ };
22
+ readonly vs: "layout(std140) uniform pickingUniforms {\n float isActive;\n float isAttribute;\n float isHighlightActive;\n float useFloatColors;\n vec3 highlightedObjectColor;\n vec4 highlightColor;\n} picking;\n\nout vec4 picking_vRGBcolor_Avalid;\n\n// Normalize unsigned byte color to 0-1 range\nvec3 picking_normalizeColor(vec3 color) {\n return picking.useFloatColors > 0.5 ? color : color / 255.0;\n}\n\n// Normalize unsigned byte color to 0-1 range\nvec4 picking_normalizeColor(vec4 color) {\n return picking.useFloatColors > 0.5 ? color : color / 255.0;\n}\n\nbool picking_isColorZero(vec3 color) {\n return dot(color, vec3(1.0)) < 0.00001;\n}\n\nbool picking_isColorValid(vec3 color) {\n return dot(color, vec3(1.0)) > 0.00001;\n}\n\n// Check if this vertex is highlighted \nbool isVertexHighlighted(vec3 vertexColor) {\n vec3 highlightedObjectColor = picking_normalizeColor(picking.highlightedObjectColor);\n return\n bool(picking.isHighlightActive) && picking_isColorZero(abs(vertexColor - highlightedObjectColor));\n}\n\n// Set the current picking color\nvoid picking_setPickingColor(vec3 pickingColor) {\n pickingColor = picking_normalizeColor(pickingColor);\n\n if (bool(picking.isActive)) {\n // Use alpha as the validity flag. If pickingColor is [0, 0, 0] fragment is non-pickable\n picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));\n\n if (!bool(picking.isAttribute)) {\n // Stores the picking color so that the fragment shader can render it during picking\n picking_vRGBcolor_Avalid.rgb = pickingColor;\n }\n } else {\n // Do the comparison with selected item color in vertex shader as it should mean fewer compares\n picking_vRGBcolor_Avalid.a = float(isVertexHighlighted(pickingColor));\n }\n}\n\nvoid picking_setPickingAttribute(float value) {\n if (bool(picking.isAttribute)) {\n picking_vRGBcolor_Avalid.r = value;\n }\n}\n\nvoid picking_setPickingAttribute(vec2 value) {\n if (bool(picking.isAttribute)) {\n picking_vRGBcolor_Avalid.rg = value;\n }\n}\n\nvoid picking_setPickingAttribute(vec3 value) {\n if (bool(picking.isAttribute)) {\n picking_vRGBcolor_Avalid.rgb = value;\n }\n}\n";
23
+ readonly fs: "layout(std140) uniform pickingUniforms {\n float isActive;\n float isAttribute;\n float isHighlightActive;\n float useFloatColors;\n vec3 highlightedObjectColor;\n vec4 highlightColor;\n} picking;\n\nin vec4 picking_vRGBcolor_Avalid;\n\n/*\n * Returns highlight color if this item is selected.\n */\nvec4 picking_filterHighlightColor(vec4 color) {\n // If we are still picking, we don't highlight\n if (picking.isActive > 0.5) {\n return color;\n }\n\n bool selected = bool(picking_vRGBcolor_Avalid.a);\n\n if (selected) {\n // Blend in highlight color based on its alpha value\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 } else {\n return color;\n }\n}\n\n/*\n * Returns picking color if picking enabled else unmodified argument.\n */\nvec4 picking_filterPickingColor(vec4 color) {\n if (bool(picking.isActive)) {\n if (picking_vRGBcolor_Avalid.a == 0.0) {\n discard;\n }\n return picking_vRGBcolor_Avalid;\n }\n return color;\n}\n\n/*\n * Returns picking color if picking is enabled if not\n * highlight color if this item is selected, otherwise unmodified argument.\n */\nvec4 picking_filterColor(vec4 color) {\n vec4 highlightColor = picking_filterHighlightColor(color);\n return picking_filterPickingColor(highlightColor);\n}\n";
24
+ readonly getUniforms: (opts?: import("@luma.gl/shadertools").PickingProps, prevUniforms?: import("@luma.gl/shadertools").PickingUniforms) => import("@luma.gl/shadertools").PickingUniforms;
25
+ };
26
+ //# sourceMappingURL=legacy-color-picking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-color-picking.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/legacy-color-picking.ts"],"names":[],"mappings":"AAMA,mEAAmE;AACnE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;CAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { picking as shadertoolsPicking } from '@luma.gl/shadertools';
5
+ /** @deprecated Use `picking`/`colorPicking` for object picking. */
6
+ export const legacyColorPicking = shadertoolsPicking;
7
+ //# sourceMappingURL=legacy-color-picking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-color-picking.js","sourceRoot":"","sources":["../../../src/modules/picking/legacy-color-picking.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,OAAO,IAAI,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAEnE,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC"}
@@ -1,28 +1,46 @@
1
1
  import { Device, Framebuffer } from '@luma.gl/core';
2
2
  import { ShaderInputs } from "../../shader-inputs.js";
3
3
  import { pickingUniforms } from "./picking-uniforms.js";
4
+ declare const COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
5
+ declare const COLOR_PICKING_MAX_BATCH_INDEX = 254;
4
6
  /** Information about picked object */
5
7
  export type PickInfo = {
6
8
  batchIndex: number | null;
7
9
  objectIndex: number | null;
8
10
  };
11
+ export type PickingMode = 'auto' | 'index' | 'color';
12
+ export type ResolvedPickingMode = Exclude<PickingMode, 'auto'>;
13
+ /** @deprecated Use `PickingMode`. */
14
+ export type PickingBackend = PickingMode;
15
+ /** @deprecated Use `ResolvedPickingMode`. */
16
+ export type ResolvedPickingBackend = ResolvedPickingMode;
9
17
  export type PickingManagerProps = {
10
- /** Shader Inputs from models to pick */
18
+ /** Shader inputs from models to pick */
11
19
  shaderInputs?: ShaderInputs<{
12
20
  picking: typeof pickingUniforms.props;
13
21
  }>;
14
22
  /** Callback */
15
23
  onObjectPicked?: (info: PickInfo) => void;
24
+ /** Select a picking mode. Defaults to `color`. Use `auto` to prefer `index` when supported. */
25
+ mode?: PickingMode;
26
+ /** @deprecated Use `mode`. */
27
+ backend?: PickingBackend;
16
28
  };
29
+ export declare function resolvePickingMode(deviceType: Device['type'], mode?: PickingMode, indexPickingSupported?: boolean): ResolvedPickingMode;
30
+ export declare function supportsIndexPicking(device: Device): boolean;
31
+ /** @deprecated Use `resolvePickingMode`. */
32
+ export declare const resolvePickingBackend: typeof resolvePickingMode;
33
+ export declare function decodeIndexPickInfo(pixelData: Int32Array): PickInfo;
34
+ export declare function decodeColorPickInfo(pixelData: Uint8Array): PickInfo;
17
35
  /**
18
- * Helper class for using the new picking module
19
- * @todo Port to WebGPU
36
+ * Helper class for using object picking with backend-specific readback.
20
37
  * @todo Support multiple models
21
38
  * @todo Switching picking module
22
39
  */
23
40
  export declare class PickingManager {
24
41
  device: Device;
25
42
  props: Required<PickingManagerProps>;
43
+ mode: ResolvedPickingMode;
26
44
  /** Info from latest pick operation */
27
45
  pickInfo: PickInfo;
28
46
  /** Framebuffer used for picking */
@@ -41,5 +59,13 @@ export declare class PickingManager {
41
59
  * use the center pixel location in device pixel range
42
60
  */
43
61
  getPickPosition(mousePosition: [number, number]): [number, number];
62
+ protected createIndexFramebuffer(): Framebuffer;
63
+ protected createColorFramebuffer(): Framebuffer;
64
+ protected setPickingProps(props: Partial<typeof pickingUniforms.props>): void;
65
+ protected readPickInfo(framebuffer: Framebuffer, pickPosition: [number, number]): Promise<PickInfo | null>;
66
+ protected readIndexPickInfo(framebuffer: Framebuffer, [pickX, pickY]: [number, number]): Promise<PickInfo | null>;
67
+ protected readColorPickInfo(framebuffer: Framebuffer, [pickX, pickY]: [number, number]): Promise<PickInfo | null>;
68
+ protected hasPickInfoChanged(pickInfo: PickInfo): boolean;
44
69
  }
70
+ export { COLOR_PICKING_MAX_BATCH_INDEX, COLOR_PICKING_MAX_OBJECT_INDEX };
45
71
  //# sourceMappingURL=picking-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"picking-manager.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/picking-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AAClD,OAAO,EAAC,YAAY,EAAC,+BAA4B;AACjD,OAAO,EAAC,eAAe,EAAgB,8BAA2B;AAGlE,sCAAsC;AACtC,MAAM,MAAM,QAAQ,GAAG;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,wCAAwC;IACxC,YAAY,CAAC,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,OAAO,eAAe,CAAC,KAAK,CAAA;KAAC,CAAC,CAAC;IACrE,eAAe;IACf,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC3C,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACrC,sCAAsC;IACtC,QAAQ,EAAE,QAAQ,CAAyC;IAC3D,mCAAmC;IACnC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAQ;IAEvC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAGhD;gBAEU,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;IAKtD,OAAO;IAKP,cAAc;IAUd,wCAAwC;IACxC,cAAc;IAId,2CAA2C;IAC3C,eAAe;IAeT,cAAc,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA4C/E;;;OAGG;IACH,eAAe,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAMnE"}
1
+ {"version":3,"file":"picking-manager.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/picking-manager.ts"],"names":[],"mappings":"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"}