@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.
- package/dist/animation-loop/animation-loop.d.ts +11 -5
- package/dist/animation-loop/animation-loop.d.ts.map +1 -1
- package/dist/animation-loop/animation-loop.js +83 -47
- package/dist/animation-loop/animation-loop.js.map +1 -1
- package/dist/animation-loop/make-animation-loop.js +7 -1
- package/dist/animation-loop/make-animation-loop.js.map +1 -1
- package/dist/animation-loop/request-animation-frame.d.ts.map +1 -1
- package/dist/animation-loop/request-animation-frame.js +23 -6
- package/dist/animation-loop/request-animation-frame.js.map +1 -1
- package/dist/compute/computation.d.ts +3 -7
- package/dist/compute/computation.d.ts.map +1 -1
- package/dist/compute/computation.js +16 -13
- package/dist/compute/computation.js.map +1 -1
- package/dist/compute/swap.d.ts +2 -0
- package/dist/compute/swap.d.ts.map +1 -1
- package/dist/compute/swap.js +10 -5
- package/dist/compute/swap.js.map +1 -1
- package/dist/dist.dev.js +2639 -1290
- package/dist/dist.min.js +325 -210
- package/dist/dynamic-texture/dynamic-texture.d.ts +102 -0
- package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -0
- package/dist/dynamic-texture/dynamic-texture.js +556 -0
- package/dist/dynamic-texture/dynamic-texture.js.map +1 -0
- package/dist/dynamic-texture/texture-data.d.ts +144 -0
- package/dist/dynamic-texture/texture-data.d.ts.map +1 -0
- package/dist/dynamic-texture/texture-data.js +208 -0
- package/dist/dynamic-texture/texture-data.js.map +1 -0
- package/dist/geometries/cone-geometry.d.ts +3 -1
- package/dist/geometries/cone-geometry.d.ts.map +1 -1
- package/dist/geometries/cone-geometry.js.map +1 -1
- package/dist/geometries/cylinder-geometry.d.ts +2 -1
- package/dist/geometries/cylinder-geometry.d.ts.map +1 -1
- package/dist/geometries/cylinder-geometry.js.map +1 -1
- package/dist/geometry/gpu-geometry.d.ts.map +1 -1
- package/dist/geometry/gpu-geometry.js +8 -3
- package/dist/geometry/gpu-geometry.js.map +1 -1
- package/dist/index.cjs +2497 -1212
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +20 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/material/material-factory.d.ts +73 -0
- package/dist/material/material-factory.d.ts.map +1 -0
- package/dist/material/material-factory.js +111 -0
- package/dist/material/material-factory.js.map +1 -0
- package/dist/material/material.d.ts +84 -0
- package/dist/material/material.d.ts.map +1 -0
- package/dist/material/material.js +176 -0
- package/dist/material/material.js.map +1 -0
- package/dist/model/model.d.ts +47 -16
- package/dist/model/model.d.ts.map +1 -1
- package/dist/model/model.js +113 -47
- package/dist/model/model.js.map +1 -1
- package/dist/model/split-uniforms-and-bindings.d.ts +4 -3
- package/dist/model/split-uniforms-and-bindings.d.ts.map +1 -1
- package/dist/model/split-uniforms-and-bindings.js +2 -2
- package/dist/model/split-uniforms-and-bindings.js.map +1 -1
- package/dist/models/billboard-texture-model.d.ts +8 -5
- package/dist/models/billboard-texture-model.d.ts.map +1 -1
- package/dist/models/billboard-texture-model.js +77 -23
- package/dist/models/billboard-texture-model.js.map +1 -1
- package/dist/models/billboard-texture-module.d.ts +1 -1
- package/dist/models/billboard-texture-module.js +1 -1
- package/dist/models/clip-space.js +7 -7
- package/dist/models/directional-light-model.d.ts +7 -0
- package/dist/models/directional-light-model.d.ts.map +1 -0
- package/dist/models/directional-light-model.js +23 -0
- package/dist/models/directional-light-model.js.map +1 -0
- package/dist/models/light-model-utils.d.ts +69 -0
- package/dist/models/light-model-utils.d.ts.map +1 -0
- package/dist/models/light-model-utils.js +395 -0
- package/dist/models/light-model-utils.js.map +1 -0
- package/dist/models/point-light-model.d.ts +7 -0
- package/dist/models/point-light-model.d.ts.map +1 -0
- package/dist/models/point-light-model.js +22 -0
- package/dist/models/point-light-model.js.map +1 -0
- package/dist/models/spot-light-model.d.ts +7 -0
- package/dist/models/spot-light-model.d.ts.map +1 -0
- package/dist/models/spot-light-model.js +23 -0
- package/dist/models/spot-light-model.js.map +1 -0
- package/dist/modules/picking/color-picking.d.ts +5 -9
- package/dist/modules/picking/color-picking.d.ts.map +1 -1
- package/dist/modules/picking/color-picking.js +122 -115
- package/dist/modules/picking/color-picking.js.map +1 -1
- package/dist/modules/picking/index-picking.d.ts +4 -4
- package/dist/modules/picking/index-picking.d.ts.map +1 -1
- package/dist/modules/picking/index-picking.js +36 -16
- package/dist/modules/picking/index-picking.js.map +1 -1
- package/dist/modules/picking/legacy-color-picking.d.ts +26 -0
- package/dist/modules/picking/legacy-color-picking.d.ts.map +1 -0
- package/dist/modules/picking/legacy-color-picking.js +7 -0
- package/dist/modules/picking/legacy-color-picking.js.map +1 -0
- package/dist/modules/picking/picking-manager.d.ts +29 -3
- package/dist/modules/picking/picking-manager.d.ts.map +1 -1
- package/dist/modules/picking/picking-manager.js +188 -41
- package/dist/modules/picking/picking-manager.js.map +1 -1
- package/dist/modules/picking/picking-uniforms.d.ts +13 -12
- package/dist/modules/picking/picking-uniforms.d.ts.map +1 -1
- package/dist/modules/picking/picking-uniforms.js +27 -14
- package/dist/modules/picking/picking-uniforms.js.map +1 -1
- package/dist/modules/picking/picking.d.ts +25 -0
- package/dist/modules/picking/picking.d.ts.map +1 -0
- package/dist/modules/picking/picking.js +18 -0
- package/dist/modules/picking/picking.js.map +1 -0
- package/dist/passes/get-fragment-shader.js +12 -27
- package/dist/passes/get-fragment-shader.js.map +1 -1
- package/dist/passes/shader-pass-renderer.d.ts +5 -7
- package/dist/passes/shader-pass-renderer.d.ts.map +1 -1
- package/dist/passes/shader-pass-renderer.js +16 -42
- package/dist/passes/shader-pass-renderer.js.map +1 -1
- package/dist/scenegraph/group-node.d.ts +5 -0
- package/dist/scenegraph/group-node.d.ts.map +1 -1
- package/dist/scenegraph/group-node.js +12 -0
- package/dist/scenegraph/group-node.js.map +1 -1
- package/dist/scenegraph/model-node.d.ts +2 -2
- package/dist/scenegraph/model-node.d.ts.map +1 -1
- package/dist/scenegraph/model-node.js.map +1 -1
- package/dist/scenegraph/scenegraph-node.d.ts +1 -1
- package/dist/scenegraph/scenegraph-node.d.ts.map +1 -1
- package/dist/scenegraph/scenegraph-node.js +23 -15
- package/dist/scenegraph/scenegraph-node.js.map +1 -1
- package/dist/shader-inputs.d.ts +9 -7
- package/dist/shader-inputs.d.ts.map +1 -1
- package/dist/shader-inputs.js +84 -4
- package/dist/shader-inputs.js.map +1 -1
- package/dist/utils/buffer-layout-order.d.ts.map +1 -1
- package/dist/utils/buffer-layout-order.js +12 -2
- package/dist/utils/buffer-layout-order.js.map +1 -1
- package/dist/utils/shader-module-utils.d.ts +7 -0
- package/dist/utils/shader-module-utils.d.ts.map +1 -0
- package/dist/utils/shader-module-utils.js +46 -0
- package/dist/utils/shader-module-utils.js.map +1 -0
- package/package.json +6 -6
- package/src/animation-loop/animation-loop.ts +89 -50
- package/src/animation-loop/make-animation-loop.ts +13 -5
- package/src/animation-loop/request-animation-frame.ts +32 -6
- package/src/compute/computation.ts +32 -17
- package/src/compute/swap.ts +13 -7
- package/src/dynamic-texture/dynamic-texture.ts +732 -0
- package/src/dynamic-texture/texture-data.ts +336 -0
- package/src/geometries/cone-geometry.ts +6 -1
- package/src/geometries/cylinder-geometry.ts +5 -1
- package/src/geometry/gpu-geometry.ts +8 -3
- package/src/index.ts +38 -8
- package/src/material/material-factory.ts +157 -0
- package/src/material/material.ts +254 -0
- package/src/model/model.ts +158 -67
- package/src/model/split-uniforms-and-bindings.ts +8 -6
- package/src/models/billboard-texture-model.ts +88 -27
- package/src/models/billboard-texture-module.ts +1 -1
- package/src/models/clip-space.ts +7 -7
- package/src/models/directional-light-model.ts +32 -0
- package/src/models/light-model-utils.ts +587 -0
- package/src/models/point-light-model.ts +31 -0
- package/src/models/spot-light-model.ts +32 -0
- package/src/modules/picking/color-picking.ts +123 -122
- package/src/modules/picking/index-picking.ts +36 -16
- package/src/modules/picking/legacy-color-picking.ts +8 -0
- package/src/modules/picking/picking-manager.ts +252 -50
- package/src/modules/picking/picking-uniforms.ts +39 -24
- package/src/modules/picking/picking.ts +22 -0
- package/src/passes/get-fragment-shader.ts +12 -27
- package/src/passes/shader-pass-renderer.ts +25 -48
- package/src/scenegraph/group-node.ts +16 -0
- package/src/scenegraph/model-node.ts +2 -2
- package/src/scenegraph/scenegraph-node.ts +27 -16
- package/src/shader-inputs.ts +165 -15
- package/src/utils/buffer-layout-order.ts +18 -2
- package/src/utils/shader-module-utils.ts +65 -0
- package/dist/async-texture/async-texture.d.ts +0 -166
- package/dist/async-texture/async-texture.d.ts.map +0 -1
- package/dist/async-texture/async-texture.js +0 -386
- package/dist/async-texture/async-texture.js.map +0 -1
- package/dist/factories/pipeline-factory.d.ts +0 -37
- package/dist/factories/pipeline-factory.d.ts.map +0 -1
- package/dist/factories/pipeline-factory.js +0 -181
- package/dist/factories/pipeline-factory.js.map +0 -1
- package/dist/factories/shader-factory.d.ts +0 -22
- package/dist/factories/shader-factory.d.ts.map +0 -1
- package/dist/factories/shader-factory.js +0 -88
- package/dist/factories/shader-factory.js.map +0 -1
- package/src/async-texture/async-texture.ts +0 -551
- package/src/factories/pipeline-factory.ts +0 -224
- package/src/factories/shader-factory.ts +0 -103
- /package/src/{async-texture/texture-setters.ts.disabled → dynamic-texture/texture-data.ts.disabled} +0 -0
|
@@ -4,87 +4,101 @@
|
|
|
4
4
|
|
|
5
5
|
import type {ShaderModule} from '@luma.gl/shadertools';
|
|
6
6
|
|
|
7
|
-
import type {PickingProps, PickingUniforms
|
|
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
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
29
|
-
|
|
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
|
-
|
|
33
|
-
|
|
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
|
-
|
|
37
|
-
bool isVertexHighlighted(vec3 vertexColor) {
|
|
38
|
-
vec3 highlightedObjectColor = picking_normalizeColor(picking.highlightedObjectColor);
|
|
44
|
+
fn picking_canEncodePickInfo(objectIndex: i32) -> bool {
|
|
39
45
|
return
|
|
40
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
74
|
-
if (bool(picking.isAttribute)) {
|
|
75
|
-
picking_vRGBcolor_Avalid.r = value;
|
|
76
|
-
}
|
|
80
|
+
return color;
|
|
77
81
|
}
|
|
82
|
+
`;
|
|
78
83
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
picking_vRGBcolor_Avalid.rg = value;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
+
const vs = /* glsl */ `\
|
|
85
|
+
${GLSL_UNIFORMS}
|
|
84
86
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
if (picking.isActive > 0.5) {
|
|
124
|
+
if (bool(picking.isActive)) {
|
|
103
125
|
return color;
|
|
104
126
|
}
|
|
105
127
|
|
|
106
|
-
|
|
128
|
+
if (!picking_isFragmentHighlighted()) {
|
|
129
|
+
return color;
|
|
130
|
+
}
|
|
107
131
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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 (
|
|
165
|
+
if (!picking_canEncodePickInfo(picking_objectIndex)) {
|
|
127
166
|
discard;
|
|
128
167
|
}
|
|
129
|
-
return
|
|
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
|
|
140
|
-
|
|
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
|
|
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
|
-
*
|
|
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:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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;
|