@luma.gl/engine 9.2.6 → 9.3.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) 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.d.ts.map +1 -1
  6. package/dist/animation-loop/make-animation-loop.js +8 -1
  7. package/dist/animation-loop/make-animation-loop.js.map +1 -1
  8. package/dist/animation-loop/request-animation-frame.d.ts.map +1 -1
  9. package/dist/animation-loop/request-animation-frame.js +23 -6
  10. package/dist/animation-loop/request-animation-frame.js.map +1 -1
  11. package/dist/compute/computation.d.ts +3 -7
  12. package/dist/compute/computation.d.ts.map +1 -1
  13. package/dist/compute/computation.js +16 -13
  14. package/dist/compute/computation.js.map +1 -1
  15. package/dist/compute/swap.d.ts +2 -0
  16. package/dist/compute/swap.d.ts.map +1 -1
  17. package/dist/compute/swap.js +10 -5
  18. package/dist/compute/swap.js.map +1 -1
  19. package/dist/debug/debug-framebuffer.d.ts +9 -4
  20. package/dist/debug/debug-framebuffer.d.ts.map +1 -1
  21. package/dist/debug/debug-framebuffer.js +91 -45
  22. package/dist/debug/debug-framebuffer.js.map +1 -1
  23. package/dist/dist.dev.js +2767 -1344
  24. package/dist/dist.min.js +326 -211
  25. package/dist/dynamic-texture/dynamic-texture.d.ts +102 -0
  26. package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -0
  27. package/dist/dynamic-texture/dynamic-texture.js +558 -0
  28. package/dist/dynamic-texture/dynamic-texture.js.map +1 -0
  29. package/dist/dynamic-texture/texture-data.d.ts +144 -0
  30. package/dist/dynamic-texture/texture-data.d.ts.map +1 -0
  31. package/dist/dynamic-texture/texture-data.js +208 -0
  32. package/dist/dynamic-texture/texture-data.js.map +1 -0
  33. package/dist/geometries/cone-geometry.d.ts +3 -1
  34. package/dist/geometries/cone-geometry.d.ts.map +1 -1
  35. package/dist/geometries/cone-geometry.js.map +1 -1
  36. package/dist/geometries/cube-geometry.js +7 -7
  37. package/dist/geometries/cube-geometry.js.map +1 -1
  38. package/dist/geometries/cylinder-geometry.d.ts +2 -1
  39. package/dist/geometries/cylinder-geometry.d.ts.map +1 -1
  40. package/dist/geometries/cylinder-geometry.js.map +1 -1
  41. package/dist/geometries/ico-sphere-geometry.js +3 -1
  42. package/dist/geometries/ico-sphere-geometry.js.map +1 -1
  43. package/dist/geometry/gpu-geometry.d.ts.map +1 -1
  44. package/dist/geometry/gpu-geometry.js +11 -3
  45. package/dist/geometry/gpu-geometry.js.map +1 -1
  46. package/dist/index.cjs +2620 -1267
  47. package/dist/index.cjs.map +4 -4
  48. package/dist/index.d.ts +20 -6
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +12 -4
  51. package/dist/index.js.map +1 -1
  52. package/dist/material/material-factory.d.ts +73 -0
  53. package/dist/material/material-factory.d.ts.map +1 -0
  54. package/dist/material/material-factory.js +111 -0
  55. package/dist/material/material-factory.js.map +1 -0
  56. package/dist/material/material.d.ts +84 -0
  57. package/dist/material/material.d.ts.map +1 -0
  58. package/dist/material/material.js +176 -0
  59. package/dist/material/material.js.map +1 -0
  60. package/dist/model/model.d.ts +47 -16
  61. package/dist/model/model.d.ts.map +1 -1
  62. package/dist/model/model.js +148 -71
  63. package/dist/model/model.js.map +1 -1
  64. package/dist/model/split-uniforms-and-bindings.d.ts +4 -3
  65. package/dist/model/split-uniforms-and-bindings.d.ts.map +1 -1
  66. package/dist/model/split-uniforms-and-bindings.js +2 -2
  67. package/dist/model/split-uniforms-and-bindings.js.map +1 -1
  68. package/dist/models/billboard-texture-model.d.ts +8 -5
  69. package/dist/models/billboard-texture-model.d.ts.map +1 -1
  70. package/dist/models/billboard-texture-model.js +79 -25
  71. package/dist/models/billboard-texture-model.js.map +1 -1
  72. package/dist/models/billboard-texture-module.d.ts +1 -1
  73. package/dist/models/billboard-texture-module.js +1 -1
  74. package/dist/models/clip-space.js +7 -7
  75. package/dist/models/directional-light-model.d.ts +7 -0
  76. package/dist/models/directional-light-model.d.ts.map +1 -0
  77. package/dist/models/directional-light-model.js +23 -0
  78. package/dist/models/directional-light-model.js.map +1 -0
  79. package/dist/models/light-model-utils.d.ts +69 -0
  80. package/dist/models/light-model-utils.d.ts.map +1 -0
  81. package/dist/models/light-model-utils.js +395 -0
  82. package/dist/models/light-model-utils.js.map +1 -0
  83. package/dist/models/point-light-model.d.ts +7 -0
  84. package/dist/models/point-light-model.d.ts.map +1 -0
  85. package/dist/models/point-light-model.js +22 -0
  86. package/dist/models/point-light-model.js.map +1 -0
  87. package/dist/models/spot-light-model.d.ts +7 -0
  88. package/dist/models/spot-light-model.d.ts.map +1 -0
  89. package/dist/models/spot-light-model.js +23 -0
  90. package/dist/models/spot-light-model.js.map +1 -0
  91. package/dist/modules/picking/color-picking.d.ts +5 -9
  92. package/dist/modules/picking/color-picking.d.ts.map +1 -1
  93. package/dist/modules/picking/color-picking.js +122 -115
  94. package/dist/modules/picking/color-picking.js.map +1 -1
  95. package/dist/modules/picking/index-picking.d.ts +4 -4
  96. package/dist/modules/picking/index-picking.d.ts.map +1 -1
  97. package/dist/modules/picking/index-picking.js +36 -16
  98. package/dist/modules/picking/index-picking.js.map +1 -1
  99. package/dist/modules/picking/legacy-color-picking.d.ts +26 -0
  100. package/dist/modules/picking/legacy-color-picking.d.ts.map +1 -0
  101. package/dist/modules/picking/legacy-color-picking.js +7 -0
  102. package/dist/modules/picking/legacy-color-picking.js.map +1 -0
  103. package/dist/modules/picking/picking-manager.d.ts +29 -3
  104. package/dist/modules/picking/picking-manager.d.ts.map +1 -1
  105. package/dist/modules/picking/picking-manager.js +188 -41
  106. package/dist/modules/picking/picking-manager.js.map +1 -1
  107. package/dist/modules/picking/picking-uniforms.d.ts +13 -12
  108. package/dist/modules/picking/picking-uniforms.d.ts.map +1 -1
  109. package/dist/modules/picking/picking-uniforms.js +27 -14
  110. package/dist/modules/picking/picking-uniforms.js.map +1 -1
  111. package/dist/modules/picking/picking.d.ts +25 -0
  112. package/dist/modules/picking/picking.d.ts.map +1 -0
  113. package/dist/modules/picking/picking.js +18 -0
  114. package/dist/modules/picking/picking.js.map +1 -0
  115. package/dist/passes/get-fragment-shader.js +12 -27
  116. package/dist/passes/get-fragment-shader.js.map +1 -1
  117. package/dist/passes/shader-pass-renderer.d.ts +5 -7
  118. package/dist/passes/shader-pass-renderer.d.ts.map +1 -1
  119. package/dist/passes/shader-pass-renderer.js +16 -42
  120. package/dist/passes/shader-pass-renderer.js.map +1 -1
  121. package/dist/scenegraph/group-node.d.ts +5 -0
  122. package/dist/scenegraph/group-node.d.ts.map +1 -1
  123. package/dist/scenegraph/group-node.js +12 -0
  124. package/dist/scenegraph/group-node.js.map +1 -1
  125. package/dist/scenegraph/model-node.d.ts +2 -2
  126. package/dist/scenegraph/model-node.d.ts.map +1 -1
  127. package/dist/scenegraph/model-node.js.map +1 -1
  128. package/dist/scenegraph/scenegraph-node.d.ts +1 -1
  129. package/dist/scenegraph/scenegraph-node.d.ts.map +1 -1
  130. package/dist/scenegraph/scenegraph-node.js +23 -15
  131. package/dist/scenegraph/scenegraph-node.js.map +1 -1
  132. package/dist/shader-inputs.d.ts +9 -7
  133. package/dist/shader-inputs.d.ts.map +1 -1
  134. package/dist/shader-inputs.js +90 -13
  135. package/dist/shader-inputs.js.map +1 -1
  136. package/dist/utils/buffer-layout-order.d.ts.map +1 -1
  137. package/dist/utils/buffer-layout-order.js +12 -2
  138. package/dist/utils/buffer-layout-order.js.map +1 -1
  139. package/dist/utils/shader-module-utils.d.ts +7 -0
  140. package/dist/utils/shader-module-utils.d.ts.map +1 -0
  141. package/dist/utils/shader-module-utils.js +46 -0
  142. package/dist/utils/shader-module-utils.js.map +1 -0
  143. package/package.json +6 -6
  144. package/src/animation-loop/animation-loop.ts +89 -50
  145. package/src/animation-loop/make-animation-loop.ts +14 -5
  146. package/src/animation-loop/request-animation-frame.ts +32 -6
  147. package/src/compute/computation.ts +32 -17
  148. package/src/compute/swap.ts +13 -7
  149. package/src/debug/debug-framebuffer.ts +139 -61
  150. package/src/dynamic-texture/dynamic-texture.ts +730 -0
  151. package/src/dynamic-texture/texture-data.ts +336 -0
  152. package/src/{async-texture/texture-setters.ts.disabled → dynamic-texture/texture-data.ts.disabled} +1 -1
  153. package/src/geometries/cone-geometry.ts +6 -1
  154. package/src/geometries/cube-geometry.ts +7 -7
  155. package/src/geometries/cylinder-geometry.ts +5 -1
  156. package/src/geometries/ico-sphere-geometry.ts +3 -1
  157. package/src/geometry/gpu-geometry.ts +11 -3
  158. package/src/index.ts +38 -8
  159. package/src/material/material-factory.ts +157 -0
  160. package/src/material/material.ts +254 -0
  161. package/src/model/model.ts +196 -93
  162. package/src/model/split-uniforms-and-bindings.ts +8 -6
  163. package/src/models/billboard-texture-model.ts +90 -29
  164. package/src/models/billboard-texture-module.ts +1 -1
  165. package/src/models/clip-space.ts +7 -7
  166. package/src/models/directional-light-model.ts +32 -0
  167. package/src/models/light-model-utils.ts +587 -0
  168. package/src/models/point-light-model.ts +31 -0
  169. package/src/models/spot-light-model.ts +32 -0
  170. package/src/modules/picking/color-picking.ts +123 -122
  171. package/src/modules/picking/index-picking.ts +36 -16
  172. package/src/modules/picking/legacy-color-picking.ts +8 -0
  173. package/src/modules/picking/picking-manager.ts +252 -50
  174. package/src/modules/picking/picking-uniforms.ts +39 -24
  175. package/src/modules/picking/picking.ts +22 -0
  176. package/src/passes/get-fragment-shader.ts +12 -27
  177. package/src/passes/shader-pass-renderer.ts +25 -48
  178. package/src/scenegraph/group-node.ts +16 -0
  179. package/src/scenegraph/model-node.ts +2 -2
  180. package/src/scenegraph/scenegraph-node.ts +27 -16
  181. package/src/shader-inputs.ts +167 -26
  182. package/src/utils/buffer-layout-order.ts +18 -2
  183. package/src/utils/shader-module-utils.ts +65 -0
  184. package/dist/async-texture/async-texture.d.ts +0 -166
  185. package/dist/async-texture/async-texture.d.ts.map +0 -1
  186. package/dist/async-texture/async-texture.js +0 -386
  187. package/dist/async-texture/async-texture.js.map +0 -1
  188. package/dist/factories/pipeline-factory.d.ts +0 -37
  189. package/dist/factories/pipeline-factory.d.ts.map +0 -1
  190. package/dist/factories/pipeline-factory.js +0 -181
  191. package/dist/factories/pipeline-factory.js.map +0 -1
  192. package/dist/factories/shader-factory.d.ts +0 -22
  193. package/dist/factories/shader-factory.d.ts.map +0 -1
  194. package/dist/factories/shader-factory.js +0 -88
  195. package/dist/factories/shader-factory.js.map +0 -1
  196. package/src/async-texture/async-texture.ts +0 -551
  197. package/src/factories/pipeline-factory.ts +0 -224
  198. package/src/factories/shader-factory.ts +0 -103
@@ -4,87 +4,101 @@
4
4
 
5
5
  import type {ShaderModule} from '@luma.gl/shadertools';
6
6
 
7
- import type {PickingProps, PickingUniforms, PickingBindings} from './picking-uniforms';
8
- import {pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS} from './picking-uniforms';
7
+ import type {PickingBindings, PickingProps, PickingUniforms} from './picking-uniforms';
8
+ import {pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS, INVALID_INDEX} from './picking-uniforms';
9
9
 
10
10
  const source = /* wgsl */ `\
11
11
  ${WGSL_UNIFORMS}
12
- `;
13
12
 
14
- const vs = /* glsl */ `\
15
- ${GLSL_UNIFORMS}
16
- out vec4 picking_vRGBcolor_Avalid;
13
+ const COLOR_PICKING_INVALID_INDEX = ${INVALID_INDEX};
14
+ const COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
15
+ const COLOR_PICKING_MAX_BATCH_INDEX = 254;
17
16
 
18
- // Normalize unsigned byte color to 0-1 range
19
- vec3 picking_normalizeColor(vec3 color) {
20
- return picking.useFloatColors > 0.5 ? color : color / 255.0;
17
+ fn picking_setObjectIndex(objectIndex: i32) -> i32 {
18
+ return objectIndex;
21
19
  }
22
20
 
23
- // Normalize unsigned byte color to 0-1 range
24
- vec4 picking_normalizeColor(vec4 color) {
25
- return picking.useFloatColors > 0.5 ? color : color / 255.0;
21
+ fn picking_isObjectHighlighted(objectIndex: i32) -> bool {
22
+ return
23
+ picking.isHighlightActive != 0 &&
24
+ picking.highlightedBatchIndex == picking.batchIndex &&
25
+ picking.highlightedObjectIndex == objectIndex;
26
26
  }
27
27
 
28
- bool picking_isColorZero(vec3 color) {
29
- return dot(color, vec3(1.0)) < 0.00001;
30
- }
28
+ fn picking_filterHighlightColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
29
+ if (picking.isActive != 0 || !picking_isObjectHighlighted(objectIndex)) {
30
+ return color;
31
+ }
32
+
33
+ let highLightAlpha = picking.highlightColor.a;
34
+ let blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
35
+ if (blendedAlpha == 0.0) {
36
+ return vec4<f32>(color.rgb, 0.0);
37
+ }
31
38
 
32
- bool picking_isColorValid(vec3 color) {
33
- return dot(color, vec3(1.0)) > 0.00001;
39
+ let highLightRatio = highLightAlpha / blendedAlpha;
40
+ let blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
41
+ return vec4<f32>(blendedRGB, blendedAlpha);
34
42
  }
35
43
 
36
- // Check if this vertex is highlighted
37
- bool isVertexHighlighted(vec3 vertexColor) {
38
- vec3 highlightedObjectColor = picking_normalizeColor(picking.highlightedObjectColor);
44
+ fn picking_canEncodePickInfo(objectIndex: i32) -> bool {
39
45
  return
40
- bool(picking.isHighlightActive) && picking_isColorZero(abs(vertexColor - highlightedObjectColor));
46
+ objectIndex != COLOR_PICKING_INVALID_INDEX &&
47
+ objectIndex >= 0 &&
48
+ objectIndex <= COLOR_PICKING_MAX_OBJECT_INDEX &&
49
+ picking.batchIndex >= 0 &&
50
+ picking.batchIndex <= COLOR_PICKING_MAX_BATCH_INDEX;
41
51
  }
42
52
 
43
- // Set the current picking color
44
- void picking_setPickingColor(vec3 pickingColor) {
45
- pickingColor = picking_normalizeColor(pickingColor);
46
-
47
- if (bool(picking.isActive)) {
48
- // Use alpha as the validity flag. If pickingColor is [0, 0, 0] fragment is non-pickable
49
- picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));
50
-
51
- if (!bool(picking.isAttribute)) {
52
- // Stores the picking color so that the fragment shader can render it during picking
53
- picking_vRGBcolor_Avalid.rgb = pickingColor;
54
- }
55
- } else {
56
- // Do the comparison with selected item color in vertex shader as it should mean fewer compares
57
- picking_vRGBcolor_Avalid.a = float(isVertexHighlighted(pickingColor));
53
+ fn picking_getPickingColor(objectIndex: i32) -> vec4<f32> {
54
+ if (!picking_canEncodePickInfo(objectIndex)) {
55
+ return vec4<f32>(0.0, 0.0, 0.0, 0.0);
58
56
  }
57
+
58
+ let encodedObjectIndex = objectIndex + 1;
59
+ let red = encodedObjectIndex % 256;
60
+ let green = (encodedObjectIndex / 256) % 256;
61
+ let blue = (encodedObjectIndex / 65536) % 256;
62
+ let alpha = picking.batchIndex + 1;
63
+
64
+ return vec4<f32>(
65
+ f32(red) / 255.0,
66
+ f32(green) / 255.0,
67
+ f32(blue) / 255.0,
68
+ f32(alpha) / 255.0
69
+ );
59
70
  }
60
71
 
61
- void picking_setObjectIndex(uint objectIndex) {
62
- if (bool(picking.isActive)) {
63
- uint index = objectIndex;
64
- if (picking.indexMode == PICKING_INDEX_MODE_INSTANCE) {
65
- index = uint(gl_InstanceID);
72
+ fn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
73
+ if (picking.isActive != 0) {
74
+ if (!picking_canEncodePickInfo(objectIndex)) {
75
+ discard;
66
76
  }
67
- picking_vRGBcolor_Avalid.r = float(index % 255) / 255.0;
68
- picking_vRGBcolor_Avalid.g = float((index / 255) % 255) / 255.0;
69
- picking_vRGBcolor_Avalid.b = float((index / 255 / 255) %255) / 255.0;
77
+ return picking_getPickingColor(objectIndex);
70
78
  }
71
- }
72
79
 
73
- void picking_setPickingAttribute(float value) {
74
- if (bool(picking.isAttribute)) {
75
- picking_vRGBcolor_Avalid.r = value;
76
- }
80
+ return color;
77
81
  }
82
+ `;
78
83
 
79
- void picking_setPickingAttribute(vec2 value) {
80
- if (bool(picking.isAttribute)) {
81
- picking_vRGBcolor_Avalid.rg = value;
82
- }
83
- }
84
+ const vs = /* glsl */ `\
85
+ ${GLSL_UNIFORMS}
84
86
 
85
- void picking_setPickingAttribute(vec3 value) {
86
- if (bool(picking.isAttribute)) {
87
- picking_vRGBcolor_Avalid.rgb = value;
87
+ const int INDEX_PICKING_MODE_INSTANCE = 0;
88
+ const int INDEX_PICKING_MODE_CUSTOM = 1;
89
+
90
+ const int COLOR_PICKING_INVALID_INDEX = ${INVALID_INDEX};
91
+
92
+ flat out int picking_objectIndex;
93
+
94
+ void picking_setObjectIndex(int objectIndex) {
95
+ switch (picking.indexMode) {
96
+ case INDEX_PICKING_MODE_INSTANCE:
97
+ picking_objectIndex = gl_InstanceID;
98
+ break;
99
+ case INDEX_PICKING_MODE_CUSTOM:
100
+ picking_objectIndex = objectIndex;
101
+ break;
88
102
  }
89
103
  }
90
104
  `;
@@ -92,61 +106,81 @@ void picking_setPickingAttribute(vec3 value) {
92
106
  const fs = /* glsl */ `\
93
107
  ${GLSL_UNIFORMS}
94
108
 
95
- in vec4 picking_vRGBcolor_Avalid;
109
+ const int COLOR_PICKING_INVALID_INDEX = ${INVALID_INDEX};
110
+ const int COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
111
+ const int COLOR_PICKING_MAX_BATCH_INDEX = 254;
112
+
113
+ flat in int picking_objectIndex;
114
+
115
+ bool picking_isFragmentHighlighted() {
116
+ return
117
+ bool(picking.isHighlightActive) &&
118
+ picking.highlightedBatchIndex == picking.batchIndex &&
119
+ picking.highlightedObjectIndex == picking_objectIndex
120
+ ;
121
+ }
96
122
 
97
- /*
98
- * Returns highlight color if this item is selected.
99
- */
100
123
  vec4 picking_filterHighlightColor(vec4 color) {
101
- // If we are still picking, we don't highlight
102
- if (picking.isActive > 0.5) {
124
+ if (bool(picking.isActive)) {
103
125
  return color;
104
126
  }
105
127
 
106
- bool selected = bool(picking_vRGBcolor_Avalid.a);
128
+ if (!picking_isFragmentHighlighted()) {
129
+ return color;
130
+ }
107
131
 
108
- if (selected) {
109
- // Blend in highlight color based on its alpha value
110
- float highLightAlpha = picking.highlightColor.a;
111
- float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
112
- float highLightRatio = highLightAlpha / blendedAlpha;
132
+ float highLightAlpha = picking.highlightColor.a;
133
+ float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
134
+ float highLightRatio = highLightAlpha / blendedAlpha;
113
135
 
114
- vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
115
- return vec4(blendedRGB, blendedAlpha);
116
- } else {
117
- return color;
136
+ vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
137
+ return vec4(blendedRGB, blendedAlpha);
138
+ }
139
+
140
+ bool picking_canEncodePickInfo(int objectIndex) {
141
+ return
142
+ objectIndex != COLOR_PICKING_INVALID_INDEX &&
143
+ objectIndex >= 0 &&
144
+ objectIndex <= COLOR_PICKING_MAX_OBJECT_INDEX &&
145
+ picking.batchIndex >= 0 &&
146
+ picking.batchIndex <= COLOR_PICKING_MAX_BATCH_INDEX;
147
+ }
148
+
149
+ vec4 picking_getPickingColor() {
150
+ if (!picking_canEncodePickInfo(picking_objectIndex)) {
151
+ return vec4(0.0);
118
152
  }
153
+
154
+ int encodedObjectIndex = picking_objectIndex + 1;
155
+ int red = encodedObjectIndex % 256;
156
+ int green = (encodedObjectIndex / 256) % 256;
157
+ int blue = (encodedObjectIndex / 65536) % 256;
158
+ int alpha = picking.batchIndex + 1;
159
+
160
+ return vec4(float(red), float(green), float(blue), float(alpha)) / 255.0;
119
161
  }
120
162
 
121
- /*
122
- * Returns picking color if picking enabled else unmodified argument.
123
- */
124
163
  vec4 picking_filterPickingColor(vec4 color) {
125
164
  if (bool(picking.isActive)) {
126
- if (picking_vRGBcolor_Avalid.a == 0.0) {
165
+ if (!picking_canEncodePickInfo(picking_objectIndex)) {
127
166
  discard;
128
167
  }
129
- return picking_vRGBcolor_Avalid;
168
+ return picking_getPickingColor();
130
169
  }
170
+
131
171
  return color;
132
172
  }
133
173
 
134
- /*
135
- * Returns picking color if picking is enabled if not
136
- * highlight color if this item is selected, otherwise unmodified argument.
137
- */
138
174
  vec4 picking_filterColor(vec4 color) {
139
- vec4 highlightColor = picking_filterHighlightColor(color);
140
- return picking_filterPickingColor(highlightColor);
175
+ vec4 outColor = color;
176
+ outColor = picking_filterHighlightColor(outColor);
177
+ outColor = picking_filterPickingColor(outColor);
178
+ return outColor;
141
179
  }
142
180
  `;
143
181
 
144
182
  /**
145
- * Provides support for color-coding-based picking and highlighting.
146
- * In particular, supports picking a specific instance in an instanced
147
- * draw call and highlighting an instance based on its picking color,
148
- * and correspondingly, supports picking and highlighting groups of
149
- * primitives with the same picking color in non-instanced draw-calls
183
+ * Provides support for object-index based color picking and highlighting.
150
184
  */
151
185
  export const picking = {
152
186
  ...pickingUniforms,
@@ -155,36 +189,3 @@ export const picking = {
155
189
  vs,
156
190
  fs
157
191
  } as const satisfies ShaderModule<PickingProps, PickingUniforms, PickingBindings>;
158
-
159
- // function getUniforms(opts: PickingProps = {}, prevUniforms?: PickingUniforms): PickingUniforms {
160
- // const uniforms = {} as PickingUniforms;
161
-
162
- // if (opts.highlightedObjectColor === undefined) {
163
- // // Unless highlightedObjectColor explicitly null or set, do not update state
164
- // } else if (opts.highlightedObjectColor === null) {
165
- // uniforms.isHighlightActive = false;
166
- // } else {
167
- // uniforms.isHighlightActive = true;
168
- // const highlightedObjectColor = opts.highlightedObjectColor.slice(0, 3);
169
- // uniforms.highlightedObjectColor = highlightedObjectColor;
170
- // }
171
-
172
- // if (opts.highlightColor) {
173
- // const color = Array.from(opts.highlightColor, x => x / 255);
174
- // if (!Number.isFinite(color[3])) {
175
- // color[3] = 1;
176
- // }
177
- // uniforms.highlightColor = color;
178
- // }
179
-
180
- // if (opts.isActive !== undefined) {
181
- // uniforms.isActive = Boolean(opts.isActive);
182
- // uniforms.isAttribute = Boolean(opts.isAttribute);
183
- // }
184
-
185
- // if (opts.useFloatColors !== undefined) {
186
- // uniforms.useFloatColors = Boolean(opts.useFloatColors);
187
- // }
188
-
189
- // return uniforms;
190
- // }
@@ -16,25 +16,45 @@ const INDEX_PICKING_MODE_INSTANCE = 0;
16
16
  const INDEX_PICKING_MODE_CUSTOM = 1;
17
17
  const INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1
18
18
 
19
- struct indexPickingFragmentInputs = {
20
- objectIndex: int32;
21
- };
22
-
23
- let indexPickingFragmentInputs: indexPickingFragmentInputs;
24
-
25
19
  /**
26
- * Vertex shaders should call this function to set the object index.
27
- * If using instance or vertex mode, argument will be ignored, 0 can be supplied.
20
+ * WGSL shaders need to carry the returned object index through their own stage outputs.
28
21
  */
29
- fn picking_setObjectIndex(objectIndex: int32) {
30
- switch (picking.indexMode) {
31
- case INDEX_PICKING_MODE_INSTANCE, default: {
32
- picking_objectIndex = instance_index;
33
- };
34
- case INDEX_PICKING_MODE_CUSTOM: {
35
- picking_objectIndex = objectIndex;
36
- };
22
+ fn picking_setObjectIndex(objectIndex: i32) -> i32 {
23
+ return objectIndex;
24
+ }
25
+
26
+ fn picking_isObjectHighlighted(objectIndex: i32) -> bool {
27
+ return
28
+ picking.isHighlightActive != 0 &&
29
+ picking.highlightedBatchIndex == picking.batchIndex &&
30
+ picking.highlightedObjectIndex == objectIndex;
31
+ }
32
+
33
+ fn picking_filterHighlightColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
34
+ if (picking.isActive != 0 || !picking_isObjectHighlighted(objectIndex)) {
35
+ return color;
36
+ }
37
+
38
+ let highLightAlpha = picking.highlightColor.a;
39
+ let blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
40
+ if (blendedAlpha == 0.0) {
41
+ return vec4<f32>(color.rgb, 0.0);
42
+ }
43
+
44
+ let highLightRatio = highLightAlpha / blendedAlpha;
45
+ let blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
46
+ return vec4<f32>(blendedRGB, blendedAlpha);
47
+ }
48
+
49
+ fn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
50
+ if (picking.isActive != 0 && objectIndex == INDEX_PICKING_INVALID_INDEX) {
51
+ discard;
37
52
  }
53
+ return color;
54
+ }
55
+
56
+ fn picking_getPickingColor(objectIndex: i32) -> vec2<i32> {
57
+ return vec2<i32>(objectIndex, picking.batchIndex);
38
58
  }
39
59
 
40
60
  `;
@@ -0,0 +1,8 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {picking as shadertoolsPicking} from '@luma.gl/shadertools';
6
+
7
+ /** @deprecated Use `picking`/`colorPicking` for object picking. */
8
+ export const legacyColorPicking = shadertoolsPicking;