@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
@@ -0,0 +1,395 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { Matrix4 } from '@math.gl/core';
5
+ import { Model } from "../model/model.js";
6
+ import { ShaderInputs } from "../shader-inputs.js";
7
+ const DEFAULT_POINT_LIGHT_RADIUS_FACTOR = 0.02;
8
+ const DEFAULT_SPOT_LIGHT_LENGTH_FACTOR = 0.12;
9
+ const DEFAULT_DIRECTIONAL_LIGHT_LENGTH_FACTOR = 0.15;
10
+ const DEFAULT_DIRECTIONAL_LIGHT_RADIUS_FACTOR = 0.2;
11
+ const DEFAULT_DIRECTION_FALLBACK = [0, 1, 0];
12
+ const DEFAULT_LIGHT_COLOR = [255, 255, 255];
13
+ const DEFAULT_MARKER_SCALE = 1;
14
+ const DIRECTIONAL_ANCHOR_DISTANCE_FACTOR = 0.35;
15
+ const LIGHT_COLOR_FACTOR = 255;
16
+ const MIN_SCENE_SCALE = 1;
17
+ const SPOTLIGHT_OUTER_CONE_EPSILON = 0.01;
18
+ const LIGHT_MARKER_PARAMETERS = {
19
+ depthCompare: 'less-equal',
20
+ depthWriteEnabled: false,
21
+ cullMode: 'none'
22
+ };
23
+ const INSTANCE_BUFFER_LAYOUT = [
24
+ { name: 'instancePosition', format: 'float32x3', stepMode: 'instance' },
25
+ { name: 'instanceDirection', format: 'float32x3', stepMode: 'instance' },
26
+ { name: 'instanceScale', format: 'float32x3', stepMode: 'instance' },
27
+ { name: 'instanceColor', format: 'float32x4', stepMode: 'instance' }
28
+ ];
29
+ const lightMarker = {
30
+ name: 'lightMarker',
31
+ props: {},
32
+ uniforms: {},
33
+ uniformTypes: {
34
+ viewProjectionMatrix: 'mat4x4<f32>'
35
+ }
36
+ };
37
+ const CENTERED_LOCAL_POSITION_WGSL = 'inputs.positions * inputs.instanceScale';
38
+ const APEX_LOCAL_POSITION_WGSL = 'vec3<f32>(inputs.positions.x * inputs.instanceScale.x, (inputs.positions.y - 0.5) * inputs.instanceScale.y, inputs.positions.z * inputs.instanceScale.z)';
39
+ const CENTERED_LOCAL_POSITION_GLSL = 'positions * instanceScale';
40
+ const APEX_LOCAL_POSITION_GLSL = 'vec3(positions.x * instanceScale.x, (positions.y - 0.5) * instanceScale.y, positions.z * instanceScale.z)';
41
+ export class BaseLightModel extends Model {
42
+ lightModelProps;
43
+ _instanceData;
44
+ _managedBuffers;
45
+ buildInstanceData;
46
+ sizePropNames;
47
+ constructor(device, props, options) {
48
+ const instanceData = options.buildInstanceData(props);
49
+ const managedBuffers = createManagedInstanceBuffers(device, props.id || options.idPrefix, instanceData);
50
+ const shaderInputs = new ShaderInputs({ lightMarker });
51
+ shaderInputs.setProps({
52
+ lightMarker: { viewProjectionMatrix: createViewProjectionMatrix(props) }
53
+ });
54
+ const { source, vs, fs } = getLightMarkerShaders(options.anchorMode);
55
+ const modelProps = props;
56
+ super(device, {
57
+ ...modelProps,
58
+ id: props.id || options.idPrefix,
59
+ source,
60
+ vs,
61
+ fs,
62
+ geometry: options.geometry,
63
+ shaderInputs,
64
+ bufferLayout: [...INSTANCE_BUFFER_LAYOUT],
65
+ attributes: managedBuffers,
66
+ instanceCount: instanceData.instanceCount,
67
+ parameters: mergeLightMarkerParameters(props.parameters)
68
+ });
69
+ this.lightModelProps = props;
70
+ this._instanceData = instanceData;
71
+ this._managedBuffers = managedBuffers;
72
+ this.buildInstanceData = options.buildInstanceData;
73
+ this.sizePropNames = options.sizePropNames;
74
+ }
75
+ destroy() {
76
+ super.destroy();
77
+ destroyManagedInstanceBuffers(this._managedBuffers);
78
+ this._managedBuffers = {};
79
+ }
80
+ draw(renderPass) {
81
+ if (this.instanceCount === 0) {
82
+ return true;
83
+ }
84
+ return super.draw(renderPass);
85
+ }
86
+ setProps(props) {
87
+ this.lightModelProps = { ...this.lightModelProps, ...props };
88
+ if (props.parameters) {
89
+ this.setParameters(mergeLightMarkerParameters(this.lightModelProps.parameters));
90
+ }
91
+ if ('viewMatrix' in props || 'projectionMatrix' in props) {
92
+ this.shaderInputs.setProps({
93
+ lightMarker: { viewProjectionMatrix: createViewProjectionMatrix(this.lightModelProps) }
94
+ });
95
+ this.setNeedsRedraw('lightMarker camera');
96
+ }
97
+ if (shouldRebuildInstanceData(props, this.sizePropNames)) {
98
+ this.rebuildInstanceData();
99
+ }
100
+ }
101
+ rebuildInstanceData() {
102
+ const nextInstanceData = this.buildInstanceData(this.lightModelProps);
103
+ const nextManagedBuffers = createManagedInstanceBuffers(this.device, this.id, nextInstanceData);
104
+ this.setAttributes(nextManagedBuffers);
105
+ this.setInstanceCount(nextInstanceData.instanceCount);
106
+ destroyManagedInstanceBuffers(this._managedBuffers);
107
+ this._managedBuffers = nextManagedBuffers;
108
+ this._instanceData = nextInstanceData;
109
+ }
110
+ }
111
+ export function buildPointLightInstanceData(props) {
112
+ const pointLights = getPointLights(props.lights);
113
+ const context = getLightMarkerContext(props);
114
+ const pointLightRadius = props.pointLightRadius ??
115
+ DEFAULT_POINT_LIGHT_RADIUS_FACTOR * context.sceneScale * context.markerScale;
116
+ return createLightMarkerInstanceData(pointLights.length, (light, _index) => ({
117
+ color: getDisplayColor(light),
118
+ direction: DEFAULT_DIRECTION_FALLBACK,
119
+ position: light.position,
120
+ scale: [pointLightRadius, pointLightRadius, pointLightRadius]
121
+ }), pointLights);
122
+ }
123
+ export function buildSpotLightInstanceData(props) {
124
+ const spotLights = getSpotLights(props.lights);
125
+ const context = getLightMarkerContext(props);
126
+ const spotLightLength = props.spotLightLength ??
127
+ DEFAULT_SPOT_LIGHT_LENGTH_FACTOR * context.sceneScale * context.markerScale;
128
+ return createLightMarkerInstanceData(spotLights.length, (light, _index) => {
129
+ const outerConeAngle = clamp(light.outerConeAngle ?? Math.PI / 4, 0, Math.PI / 2 - SPOTLIGHT_OUTER_CONE_EPSILON);
130
+ const radius = Math.tan(outerConeAngle) * spotLightLength;
131
+ return {
132
+ color: getDisplayColor(light),
133
+ direction: normalizeDirection(light.direction),
134
+ position: light.position,
135
+ scale: [radius, spotLightLength, radius]
136
+ };
137
+ }, spotLights);
138
+ }
139
+ export function buildDirectionalLightInstanceData(props) {
140
+ const directionalLights = getDirectionalLights(props.lights);
141
+ const context = getLightMarkerContext(props);
142
+ const directionalLightLength = props.directionalLightLength ??
143
+ DEFAULT_DIRECTIONAL_LIGHT_LENGTH_FACTOR * context.sceneScale * context.markerScale;
144
+ const directionalLightRadius = directionalLightLength * DEFAULT_DIRECTIONAL_LIGHT_RADIUS_FACTOR;
145
+ return createLightMarkerInstanceData(directionalLights.length, (light, _index) => {
146
+ const direction = normalizeDirection(light.direction);
147
+ const position = [
148
+ context.sceneCenter[0] -
149
+ direction[0] * context.sceneScale * DIRECTIONAL_ANCHOR_DISTANCE_FACTOR,
150
+ context.sceneCenter[1] -
151
+ direction[1] * context.sceneScale * DIRECTIONAL_ANCHOR_DISTANCE_FACTOR,
152
+ context.sceneCenter[2] -
153
+ direction[2] * context.sceneScale * DIRECTIONAL_ANCHOR_DISTANCE_FACTOR
154
+ ];
155
+ return {
156
+ color: getDisplayColor(light),
157
+ direction,
158
+ position,
159
+ scale: [directionalLightRadius, directionalLightLength, directionalLightRadius]
160
+ };
161
+ }, directionalLights);
162
+ }
163
+ export function getPointLights(lights) {
164
+ return lights.filter((light) => light.type === 'point');
165
+ }
166
+ export function getSpotLights(lights) {
167
+ return lights.filter((light) => light.type === 'spot');
168
+ }
169
+ export function getDirectionalLights(lights) {
170
+ return lights.filter((light) => light.type === 'directional');
171
+ }
172
+ export function getLightMarkerContext(props) {
173
+ const bounds = getSceneBounds(props.lights, props.bounds);
174
+ const sceneCenter = [
175
+ (bounds[0][0] + bounds[1][0]) / 2,
176
+ (bounds[0][1] + bounds[1][1]) / 2,
177
+ (bounds[0][2] + bounds[1][2]) / 2
178
+ ];
179
+ const sceneScale = Math.max(Math.hypot(bounds[1][0] - bounds[0][0], bounds[1][1] - bounds[0][1], bounds[1][2] - bounds[0][2]), MIN_SCENE_SCALE);
180
+ return {
181
+ bounds,
182
+ markerScale: Math.max(props.markerScale ?? DEFAULT_MARKER_SCALE, 0),
183
+ sceneCenter,
184
+ sceneScale
185
+ };
186
+ }
187
+ export function getDisplayColor(light) {
188
+ const color = light.color || DEFAULT_LIGHT_COLOR;
189
+ const intensity = Math.max(light.intensity ?? 1, 0);
190
+ const brightness = clamp(0.35 + 0.3 * Math.log10(intensity + 1), 0.35, 1);
191
+ return [
192
+ clamp(color[0] / LIGHT_COLOR_FACTOR, 0, 1) * brightness,
193
+ clamp(color[1] / LIGHT_COLOR_FACTOR, 0, 1) * brightness,
194
+ clamp(color[2] / LIGHT_COLOR_FACTOR, 0, 1) * brightness,
195
+ 1
196
+ ];
197
+ }
198
+ export function normalizeDirection(direction) {
199
+ const [x, y, z] = direction || DEFAULT_DIRECTION_FALLBACK;
200
+ const length = Math.hypot(x, y, z);
201
+ if (length === 0) {
202
+ return [...DEFAULT_DIRECTION_FALLBACK];
203
+ }
204
+ return [x / length, y / length, z / length];
205
+ }
206
+ function createLightMarkerInstanceData(instanceCount, getInstance, lights = []) {
207
+ const instancePositions = new Float32Array(instanceCount * 3);
208
+ const instanceDirections = new Float32Array(instanceCount * 3);
209
+ const instanceScales = new Float32Array(instanceCount * 3);
210
+ const instanceColors = new Float32Array(instanceCount * 4);
211
+ for (const [index, light] of lights.entries()) {
212
+ const instance = getInstance(light, index);
213
+ instancePositions.set(instance.position, index * 3);
214
+ instanceDirections.set(instance.direction, index * 3);
215
+ instanceScales.set(instance.scale, index * 3);
216
+ instanceColors.set(instance.color, index * 4);
217
+ }
218
+ return {
219
+ instanceCount,
220
+ instancePositions,
221
+ instanceDirections,
222
+ instanceScales,
223
+ instanceColors
224
+ };
225
+ }
226
+ function getSceneBounds(lights, bounds) {
227
+ if (bounds) {
228
+ return cloneBounds(bounds);
229
+ }
230
+ const positions = [
231
+ ...getPointLights(lights).map(light => light.position),
232
+ ...getSpotLights(lights).map(light => light.position)
233
+ ];
234
+ if (positions.length === 0) {
235
+ return [
236
+ [-0.5, -0.5, -0.5],
237
+ [0.5, 0.5, 0.5]
238
+ ];
239
+ }
240
+ const minBounds = [...positions[0]];
241
+ const maxBounds = [...positions[0]];
242
+ for (const position of positions.slice(1)) {
243
+ minBounds[0] = Math.min(minBounds[0], position[0]);
244
+ minBounds[1] = Math.min(minBounds[1], position[1]);
245
+ minBounds[2] = Math.min(minBounds[2], position[2]);
246
+ maxBounds[0] = Math.max(maxBounds[0], position[0]);
247
+ maxBounds[1] = Math.max(maxBounds[1], position[1]);
248
+ maxBounds[2] = Math.max(maxBounds[2], position[2]);
249
+ }
250
+ return [minBounds, maxBounds];
251
+ }
252
+ function cloneBounds(bounds) {
253
+ return [[...bounds[0]], [...bounds[1]]];
254
+ }
255
+ function createManagedInstanceBuffers(device, idPrefix, instanceData) {
256
+ return {
257
+ instancePosition: device.createBuffer({
258
+ id: `${idPrefix}-instance-position`,
259
+ data: getBufferDataOrPlaceholder(instanceData.instancePositions, 3)
260
+ }),
261
+ instanceDirection: device.createBuffer({
262
+ id: `${idPrefix}-instance-direction`,
263
+ data: getBufferDataOrPlaceholder(instanceData.instanceDirections, 3)
264
+ }),
265
+ instanceScale: device.createBuffer({
266
+ id: `${idPrefix}-instance-scale`,
267
+ data: getBufferDataOrPlaceholder(instanceData.instanceScales, 3)
268
+ }),
269
+ instanceColor: device.createBuffer({
270
+ id: `${idPrefix}-instance-color`,
271
+ data: getBufferDataOrPlaceholder(instanceData.instanceColors, 4)
272
+ })
273
+ };
274
+ }
275
+ function getBufferDataOrPlaceholder(data, size) {
276
+ return data.length > 0 ? data : new Float32Array(size);
277
+ }
278
+ function destroyManagedInstanceBuffers(managedBuffers) {
279
+ for (const buffer of Object.values(managedBuffers)) {
280
+ buffer?.destroy();
281
+ }
282
+ }
283
+ function createViewProjectionMatrix(props) {
284
+ return new Matrix4(props.projectionMatrix).multiplyRight(props.viewMatrix);
285
+ }
286
+ function shouldRebuildInstanceData(props, sizePropNames) {
287
+ if ('lights' in props || 'bounds' in props || 'markerScale' in props) {
288
+ return true;
289
+ }
290
+ return sizePropNames.some(sizePropName => sizePropName in props);
291
+ }
292
+ function mergeLightMarkerParameters(parameters) {
293
+ return {
294
+ ...LIGHT_MARKER_PARAMETERS,
295
+ ...(parameters || {})
296
+ };
297
+ }
298
+ function getLightMarkerShaders(anchorMode) {
299
+ const localPositionWGSL = anchorMode === 'apex' ? APEX_LOCAL_POSITION_WGSL : CENTERED_LOCAL_POSITION_WGSL;
300
+ const localPositionGLSL = anchorMode === 'apex' ? APEX_LOCAL_POSITION_GLSL : CENTERED_LOCAL_POSITION_GLSL;
301
+ return {
302
+ source: `\
303
+ struct lightMarkerUniforms {
304
+ viewProjectionMatrix: mat4x4<f32>,
305
+ };
306
+
307
+ @group(0) @binding(auto) var<uniform> lightMarker : lightMarkerUniforms;
308
+
309
+ struct VertexInputs {
310
+ @location(0) positions : vec3<f32>,
311
+ @location(1) instancePosition : vec3<f32>,
312
+ @location(2) instanceDirection : vec3<f32>,
313
+ @location(3) instanceScale : vec3<f32>,
314
+ @location(4) instanceColor : vec4<f32>,
315
+ };
316
+
317
+ struct FragmentInputs {
318
+ @builtin(position) Position : vec4<f32>,
319
+ @location(0) color : vec4<f32>,
320
+ };
321
+
322
+ fn lightMarker_rotate(localPosition: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {
323
+ let forward = normalize(direction);
324
+ var helperAxis = vec3<f32>(0.0, 1.0, 0.0);
325
+ if (abs(forward.y) > 0.999) {
326
+ helperAxis = vec3<f32>(1.0, 0.0, 0.0);
327
+ }
328
+
329
+ let tangent = normalize(cross(helperAxis, forward));
330
+ let bitangent = cross(forward, tangent);
331
+ return tangent * localPosition.x + forward * localPosition.y + bitangent * localPosition.z;
332
+ }
333
+
334
+ @vertex
335
+ fn vertexMain(inputs: VertexInputs) -> FragmentInputs {
336
+ var outputs : FragmentInputs;
337
+ let localPosition = ${localPositionWGSL};
338
+ let worldPosition = inputs.instancePosition + lightMarker_rotate(localPosition, inputs.instanceDirection);
339
+ outputs.Position = lightMarker.viewProjectionMatrix * vec4<f32>(worldPosition, 1.0);
340
+ outputs.color = inputs.instanceColor;
341
+ return outputs;
342
+ }
343
+
344
+ @fragment
345
+ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
346
+ return inputs.color;
347
+ }
348
+ `,
349
+ vs: `\
350
+ #version 300 es
351
+
352
+ in vec3 positions;
353
+ in vec3 instancePosition;
354
+ in vec3 instanceDirection;
355
+ in vec3 instanceScale;
356
+ in vec4 instanceColor;
357
+
358
+ layout(std140) uniform lightMarkerUniforms {
359
+ mat4 viewProjectionMatrix;
360
+ } lightMarker;
361
+
362
+ out vec4 vColor;
363
+
364
+ vec3 lightMarker_rotate(vec3 localPosition, vec3 direction) {
365
+ vec3 forward = normalize(direction);
366
+ vec3 helperAxis = abs(forward.y) > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0);
367
+ vec3 tangent = normalize(cross(helperAxis, forward));
368
+ vec3 bitangent = cross(forward, tangent);
369
+ return tangent * localPosition.x + forward * localPosition.y + bitangent * localPosition.z;
370
+ }
371
+
372
+ void main(void) {
373
+ vec3 localPosition = ${localPositionGLSL};
374
+ vec3 worldPosition = instancePosition + lightMarker_rotate(localPosition, instanceDirection);
375
+ gl_Position = lightMarker.viewProjectionMatrix * vec4(worldPosition, 1.0);
376
+ vColor = instanceColor;
377
+ }
378
+ `,
379
+ fs: `\
380
+ #version 300 es
381
+ precision highp float;
382
+
383
+ in vec4 vColor;
384
+ out vec4 fragColor;
385
+
386
+ void main(void) {
387
+ fragColor = vColor;
388
+ }
389
+ `
390
+ };
391
+ }
392
+ function clamp(value, minValue, maxValue) {
393
+ return Math.min(maxValue, Math.max(minValue, value));
394
+ }
395
+ //# sourceMappingURL=light-model-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light-model-utils.js","sourceRoot":"","sources":["../../src/models/light-model-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Device } from '@luma.gl/core';
2
+ import { BaseLightModel, type PointLightModelProps } from "./light-model-utils.js";
3
+ export type { PointLightModelProps } from "./light-model-utils.js";
4
+ export declare class PointLightModel extends BaseLightModel<PointLightModelProps> {
5
+ constructor(device: Device, props: PointLightModelProps);
6
+ }
7
+ //# sourceMappingURL=point-light-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"point-light-model.d.ts","sourceRoot":"","sources":["../../src/models/point-light-model.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAErC,OAAO,EACL,cAAc,EAEd,KAAK,oBAAoB,EAC1B,+BAA4B;AAQ7B,YAAY,EAAC,oBAAoB,EAAC,+BAA4B;AAE9D,qBAAa,eAAgB,SAAQ,cAAc,CAAC,oBAAoB,CAAC;gBAC3D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB;CASxD"}
@@ -0,0 +1,22 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { SphereGeometry } from "../geometries/sphere-geometry.js";
5
+ import { BaseLightModel, buildPointLightInstanceData } from "./light-model-utils.js";
6
+ const POINT_LIGHT_GEOMETRY = new SphereGeometry({
7
+ nlat: 8,
8
+ nlong: 12,
9
+ radius: 1
10
+ });
11
+ export class PointLightModel extends BaseLightModel {
12
+ constructor(device, props) {
13
+ super(device, props, {
14
+ anchorMode: 'centered',
15
+ buildInstanceData: buildPointLightInstanceData,
16
+ geometry: POINT_LIGHT_GEOMETRY,
17
+ idPrefix: 'point-light-model',
18
+ sizePropNames: ['pointLightRadius']
19
+ });
20
+ }
21
+ }
22
+ //# sourceMappingURL=point-light-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"point-light-model.js","sourceRoot":"","sources":["../../src/models/point-light-model.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,cAAc,EAAC,yCAAsC;AAC7D,OAAO,EACL,cAAc,EACd,2BAA2B,EAE5B,+BAA4B;AAE7B,MAAM,oBAAoB,GAAG,IAAI,cAAc,CAAC;IAC9C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,CAAC;CACV,CAAC,CAAC;AAIH,MAAM,OAAO,eAAgB,SAAQ,cAAoC;IACvE,YAAY,MAAc,EAAE,KAA2B;QACrD,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE;YACnB,UAAU,EAAE,UAAU;YACtB,iBAAiB,EAAE,2BAA2B;YAC9C,QAAQ,EAAE,oBAAoB;YAC9B,QAAQ,EAAE,mBAAmB;YAC7B,aAAa,EAAE,CAAC,kBAAkB,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { Device } from '@luma.gl/core';
2
+ import { BaseLightModel, type SpotLightModelProps } from "./light-model-utils.js";
3
+ export type { SpotLightModelProps } from "./light-model-utils.js";
4
+ export declare class SpotLightModel extends BaseLightModel<SpotLightModelProps> {
5
+ constructor(device: Device, props: SpotLightModelProps);
6
+ }
7
+ //# sourceMappingURL=spot-light-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spot-light-model.d.ts","sourceRoot":"","sources":["../../src/models/spot-light-model.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAErC,OAAO,EACL,cAAc,EAEd,KAAK,mBAAmB,EACzB,+BAA4B;AAS7B,YAAY,EAAC,mBAAmB,EAAC,+BAA4B;AAE7D,qBAAa,cAAe,SAAQ,cAAc,CAAC,mBAAmB,CAAC;gBACzD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;CASvD"}
@@ -0,0 +1,23 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { ConeGeometry } from "../geometries/cone-geometry.js";
5
+ import { BaseLightModel, buildSpotLightInstanceData } from "./light-model-utils.js";
6
+ const SPOT_LIGHT_GEOMETRY = new ConeGeometry({
7
+ cap: true,
8
+ nradial: 16,
9
+ nvertical: 1,
10
+ radius: 1
11
+ });
12
+ export class SpotLightModel extends BaseLightModel {
13
+ constructor(device, props) {
14
+ super(device, props, {
15
+ anchorMode: 'apex',
16
+ buildInstanceData: buildSpotLightInstanceData,
17
+ geometry: SPOT_LIGHT_GEOMETRY,
18
+ idPrefix: 'spot-light-model',
19
+ sizePropNames: ['spotLightLength']
20
+ });
21
+ }
22
+ }
23
+ //# sourceMappingURL=spot-light-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spot-light-model.js","sourceRoot":"","sources":["../../src/models/spot-light-model.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,YAAY,EAAC,uCAAoC;AACzD,OAAO,EACL,cAAc,EACd,0BAA0B,EAE3B,+BAA4B;AAE7B,MAAM,mBAAmB,GAAG,IAAI,YAAY,CAAC;IAC3C,GAAG,EAAE,IAAI;IACT,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC;CACV,CAAC,CAAC;AAIH,MAAM,OAAO,cAAe,SAAQ,cAAmC;IACrE,YAAY,MAAc,EAAE,KAA0B;QACpD,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE;YACnB,UAAU,EAAE,MAAM;YAClB,iBAAiB,EAAE,0BAA0B;YAC7C,QAAQ,EAAE,mBAAmB;YAC7B,QAAQ,EAAE,kBAAkB;YAC5B,aAAa,EAAE,CAAC,iBAAiB,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -1,16 +1,12 @@
1
1
  import type { PickingProps, PickingUniforms } from "./picking-uniforms.js";
2
2
  /**
3
- * Provides support for color-coding-based picking and highlighting.
4
- * In particular, supports picking a specific instance in an instanced
5
- * draw call and highlighting an instance based on its picking color,
6
- * and correspondingly, supports picking and highlighting groups of
7
- * primitives with the same picking color in non-instanced draw-calls
3
+ * Provides support for object-index based color picking and highlighting.
8
4
  */
9
5
  export declare const picking: {
10
6
  readonly name: "picking";
11
- 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";
12
- 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\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_setObjectIndex(uint objectIndex) {\n if (bool(picking.isActive)) {\n uint index = objectIndex;\n if (picking.indexMode == PICKING_INDEX_MODE_INSTANCE) {\n index = uint(gl_InstanceID);\n }\n picking_vRGBcolor_Avalid.r = float(index % 255) / 255.0;\n picking_vRGBcolor_Avalid.g = float((index / 255) % 255) / 255.0;\n picking_vRGBcolor_Avalid.b = float((index / 255 / 255) %255) / 255.0;\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";
13
- 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\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";
7
+ 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 COLOR_PICKING_INVALID_INDEX = -1;\nconst COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;\nconst COLOR_PICKING_MAX_BATCH_INDEX = 254;\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_canEncodePickInfo(objectIndex: i32) -> bool {\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\nfn picking_getPickingColor(objectIndex: i32) -> vec4<f32> {\n if (!picking_canEncodePickInfo(objectIndex)) {\n return vec4<f32>(0.0, 0.0, 0.0, 0.0);\n }\n\n let encodedObjectIndex = objectIndex + 1;\n let red = encodedObjectIndex % 256;\n let green = (encodedObjectIndex / 256) % 256;\n let blue = (encodedObjectIndex / 65536) % 256;\n let alpha = picking.batchIndex + 1;\n\n return vec4<f32>(\n f32(red) / 255.0,\n f32(green) / 255.0,\n f32(blue) / 255.0,\n f32(alpha) / 255.0\n );\n}\n\nfn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {\n if (picking.isActive != 0) {\n if (!picking_canEncodePickInfo(objectIndex)) {\n discard;\n }\n return picking_getPickingColor(objectIndex);\n }\n\n return color;\n}\n";
8
+ 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";
9
+ 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";
14
10
  readonly props: PickingProps;
15
11
  readonly uniforms: PickingUniforms;
16
12
  readonly uniformTypes: Required<import("@luma.gl/shadertools").UniformTypes<PickingUniforms>>;
@@ -18,7 +14,7 @@ export declare const picking: {
18
14
  readonly isActive: false;
19
15
  readonly indexMode: 0;
20
16
  readonly batchIndex: 0;
21
- readonly isHighlightActive: true;
17
+ readonly isHighlightActive: false;
22
18
  readonly highlightedBatchIndex: -1;
23
19
  readonly highlightedObjectIndex: -1;
24
20
  readonly highlightColor: import("@math.gl/types").NumberArray4;
@@ -1 +1 @@
1
- {"version":3,"file":"color-picking.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/color-picking.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,YAAY,EAAE,eAAe,EAAkB,8BAA2B;AAyIvF;;;;;;GAMG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;CAM6D,CAAC"}
1
+ {"version":3,"file":"color-picking.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/color-picking.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkB,YAAY,EAAE,eAAe,EAAC,8BAA2B;AA+KvF;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;CAM6D,CAAC"}