@luma.gl/engine 9.1.0-alpha.9 → 9.1.0-beta.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.
- package/dist/animation/key-frames.js +1 -0
- package/dist/animation/key-frames.js.map +1 -0
- package/dist/animation/timeline.js +1 -0
- package/dist/animation/timeline.js.map +1 -0
- package/dist/animation-loop/animation-loop-template.js +1 -0
- package/dist/animation-loop/animation-loop-template.js.map +1 -0
- package/dist/animation-loop/animation-loop.d.ts +2 -0
- package/dist/animation-loop/animation-loop.d.ts.map +1 -1
- package/dist/animation-loop/animation-loop.js +24 -6
- package/dist/animation-loop/animation-loop.js.map +1 -0
- package/dist/animation-loop/animation-props.js +1 -0
- package/dist/animation-loop/animation-props.js.map +1 -0
- package/dist/animation-loop/make-animation-loop.d.ts +5 -1
- package/dist/animation-loop/make-animation-loop.d.ts.map +1 -1
- package/dist/animation-loop/make-animation-loop.js +3 -1
- package/dist/animation-loop/make-animation-loop.js.map +1 -0
- package/dist/animation-loop/request-animation-frame.d.ts +4 -2
- package/dist/animation-loop/request-animation-frame.d.ts.map +1 -1
- package/dist/animation-loop/request-animation-frame.js +5 -3
- package/dist/animation-loop/request-animation-frame.js.map +1 -0
- package/dist/application-utils/load-file.d.ts +1 -1
- package/dist/application-utils/load-file.d.ts.map +1 -1
- package/dist/application-utils/load-file.js +2 -2
- package/dist/application-utils/load-file.js.map +1 -0
- package/dist/application-utils/random.js +1 -0
- package/dist/application-utils/random.js.map +1 -0
- package/dist/async-texture/async-texture.d.ts +14 -2
- package/dist/async-texture/async-texture.d.ts.map +1 -1
- package/dist/async-texture/async-texture.js +31 -0
- package/dist/async-texture/async-texture.js.map +1 -0
- package/dist/compute/buffer-transform.d.ts +41 -0
- package/dist/compute/buffer-transform.d.ts.map +1 -0
- package/dist/{transform → compute}/buffer-transform.js +19 -12
- package/dist/compute/buffer-transform.js.map +1 -0
- package/dist/{computation.d.ts → compute/computation.d.ts} +3 -3
- package/dist/compute/computation.d.ts.map +1 -0
- package/dist/{computation.js → compute/computation.js} +7 -8
- package/dist/compute/computation.js.map +1 -0
- package/dist/compute/swap.d.ts +48 -0
- package/dist/compute/swap.d.ts.map +1 -0
- package/dist/compute/swap.js +91 -0
- package/dist/compute/swap.js.map +1 -0
- package/dist/{transform → compute}/texture-transform.d.ts +0 -6
- package/dist/compute/texture-transform.d.ts.map +1 -0
- package/dist/{transform → compute}/texture-transform.js +7 -13
- package/dist/compute/texture-transform.js.map +1 -0
- package/dist/debug/copy-texture-to-image.js +1 -0
- package/dist/debug/copy-texture-to-image.js.map +1 -0
- package/dist/debug/debug-framebuffer.js +2 -1
- package/dist/debug/debug-framebuffer.js.map +1 -0
- package/dist/debug/debug-shader-layout.js +2 -1
- package/dist/debug/debug-shader-layout.js.map +1 -0
- package/dist/debug/pixel-data-utils.js +1 -0
- package/dist/debug/pixel-data-utils.js.map +1 -0
- package/dist/dist.dev.js +2588 -5862
- package/dist/dist.min.js +420 -103
- package/dist/factories/pipeline-factory.d.ts.map +1 -0
- package/dist/{lib → factories}/pipeline-factory.js +1 -0
- package/dist/factories/pipeline-factory.js.map +1 -0
- package/dist/factories/shader-factory.d.ts.map +1 -0
- package/dist/{lib → factories}/shader-factory.js +1 -0
- package/dist/factories/shader-factory.js.map +1 -0
- package/dist/geometries/cone-geometry.js +1 -0
- package/dist/geometries/cone-geometry.js.map +1 -0
- package/dist/geometries/cube-geometry.js +1 -0
- package/dist/geometries/cube-geometry.js.map +1 -0
- package/dist/geometries/cylinder-geometry.js +1 -0
- package/dist/geometries/cylinder-geometry.js.map +1 -0
- package/dist/geometries/ico-sphere-geometry.js +1 -0
- package/dist/geometries/ico-sphere-geometry.js.map +1 -0
- package/dist/geometries/plane-geometry.js +1 -0
- package/dist/geometries/plane-geometry.js.map +1 -0
- package/dist/geometries/sphere-geometry.js +1 -0
- package/dist/geometries/sphere-geometry.js.map +1 -0
- package/dist/geometries/truncated-cone-geometry.js +1 -0
- package/dist/geometries/truncated-cone-geometry.js.map +1 -0
- package/dist/geometry/geometry-table.js +1 -0
- package/dist/geometry/geometry-table.js.map +1 -0
- package/dist/geometry/geometry-utils.js +1 -0
- package/dist/geometry/geometry-utils.js.map +1 -0
- package/dist/geometry/geometry.js +1 -0
- package/dist/geometry/geometry.js.map +1 -0
- package/dist/geometry/gpu-geometry.js +1 -0
- package/dist/geometry/gpu-geometry.js.map +1 -0
- package/dist/geometry/gpu-table.js +1 -0
- package/dist/geometry/gpu-table.js.map +1 -0
- package/dist/index.cjs +1268 -173
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +23 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -9
- package/dist/index.js.map +1 -0
- package/dist/model/model.d.ts +11 -10
- package/dist/model/model.d.ts.map +1 -1
- package/dist/model/model.js +77 -58
- package/dist/model/model.js.map +1 -0
- package/dist/model/split-uniforms-and-bindings.d.ts +1 -1
- package/dist/model/split-uniforms-and-bindings.d.ts.map +1 -1
- package/dist/model/split-uniforms-and-bindings.js +2 -1
- package/dist/model/split-uniforms-and-bindings.js.map +1 -0
- package/dist/models/billboard-texture-model.d.ts +23 -0
- package/dist/models/billboard-texture-model.d.ts.map +1 -0
- package/dist/models/billboard-texture-model.js +78 -0
- package/dist/models/billboard-texture-model.js.map +1 -0
- package/dist/models/billboard-texture-module.d.ts +10 -0
- package/dist/models/billboard-texture-module.d.ts.map +1 -0
- package/dist/models/billboard-texture-module.js +37 -0
- package/dist/models/billboard-texture-module.js.map +1 -0
- package/dist/{lib → models}/clip-space.d.ts +3 -1
- package/dist/models/clip-space.d.ts.map +1 -0
- package/dist/models/clip-space.js +77 -0
- package/dist/models/clip-space.js.map +1 -0
- package/dist/modules/picking/color-picking.d.ts +28 -0
- package/dist/modules/picking/color-picking.d.ts.map +1 -0
- package/dist/modules/picking/color-picking.js +177 -0
- package/dist/modules/picking/color-picking.js.map +1 -0
- package/dist/modules/picking/index-picking.d.ts +32 -0
- package/dist/modules/picking/index-picking.d.ts.map +1 -0
- package/dist/modules/picking/index-picking.js +148 -0
- package/dist/modules/picking/index-picking.js.map +1 -0
- package/dist/modules/picking/legacy-picking-manager.d.ts +27 -0
- package/dist/modules/picking/legacy-picking-manager.d.ts.map +1 -0
- package/dist/modules/picking/legacy-picking-manager.js +76 -0
- package/dist/modules/picking/legacy-picking-manager.js.map +1 -0
- package/dist/modules/picking/picking-manager.d.ts +45 -0
- package/dist/modules/picking/picking-manager.d.ts.map +1 -0
- package/dist/modules/picking/picking-manager.js +101 -0
- package/dist/modules/picking/picking-manager.js.map +1 -0
- package/dist/modules/picking/picking-uniforms.d.ts +79 -0
- package/dist/modules/picking/picking-uniforms.d.ts.map +1 -0
- package/dist/modules/picking/picking-uniforms.js +109 -0
- package/dist/modules/picking/picking-uniforms.js.map +1 -0
- package/dist/passes/get-fragment-shader.d.ts +12 -0
- package/dist/passes/get-fragment-shader.d.ts.map +1 -0
- package/dist/passes/get-fragment-shader.js +117 -0
- package/dist/passes/get-fragment-shader.js.map +1 -0
- package/dist/passes/shader-pass-renderer.d.ts +63 -0
- package/dist/passes/shader-pass-renderer.d.ts.map +1 -0
- package/dist/passes/shader-pass-renderer.js +197 -0
- package/dist/passes/shader-pass-renderer.js.map +1 -0
- package/dist/scenegraph/group-node.js +1 -0
- package/dist/scenegraph/group-node.js.map +1 -0
- package/dist/scenegraph/model-node.js +1 -0
- package/dist/scenegraph/model-node.js.map +1 -0
- package/dist/scenegraph/scenegraph-node.js +1 -0
- package/dist/scenegraph/scenegraph-node.js.map +1 -0
- package/dist/shader-inputs.d.ts +8 -21
- package/dist/shader-inputs.d.ts.map +1 -1
- package/dist/shader-inputs.js +15 -11
- package/dist/shader-inputs.js.map +1 -0
- package/dist/utils/deep-equal.js +1 -0
- package/dist/utils/deep-equal.js.map +1 -0
- package/dist/utils/uid.js +1 -0
- package/dist/utils/uid.js.map +1 -0
- package/package.json +6 -6
- package/src/animation-loop/animation-loop.ts +27 -6
- package/src/animation-loop/make-animation-loop.ts +8 -3
- package/src/animation-loop/request-animation-frame.ts +4 -3
- package/src/application-utils/load-file.ts +2 -4
- package/src/async-texture/async-texture.ts +39 -7
- package/src/{transform → compute}/buffer-transform.ts +30 -14
- package/src/{computation.ts → compute/computation.ts} +14 -8
- package/src/compute/swap.ts +116 -0
- package/src/{transform → compute}/texture-transform.ts +6 -16
- package/src/debug/debug-framebuffer.ts +1 -1
- package/src/debug/debug-shader-layout.ts +1 -1
- package/src/index.ts +35 -16
- package/src/model/model.ts +116 -66
- package/src/model/split-uniforms-and-bindings.ts +4 -4
- package/src/models/billboard-texture-model.ts +98 -0
- package/src/models/billboard-texture-module.ts +49 -0
- package/src/models/clip-space.ts +88 -0
- package/src/modules/picking/README.md +88 -0
- package/src/modules/picking/color-picking.ts +190 -0
- package/src/modules/picking/index-picking.ts +156 -0
- package/src/modules/picking/legacy-picking-manager.ts +99 -0
- package/src/modules/picking/picking-manager.ts +137 -0
- package/src/modules/picking/picking-uniforms.ts +179 -0
- package/src/passes/get-fragment-shader.ts +129 -0
- package/src/passes/shader-pass-renderer.ts +252 -0
- package/src/shader-inputs.ts +27 -48
- package/dist/computation.d.ts.map +0 -1
- package/dist/lib/clip-space.d.ts.map +0 -1
- package/dist/lib/clip-space.js +0 -46
- package/dist/lib/pipeline-factory.d.ts.map +0 -1
- package/dist/lib/shader-factory.d.ts.map +0 -1
- package/dist/transform/buffer-transform.d.ts +0 -35
- package/dist/transform/buffer-transform.d.ts.map +0 -1
- package/dist/transform/texture-transform.d.ts.map +0 -1
- package/src/lib/clip-space.ts +0 -53
- /package/dist/{lib → factories}/pipeline-factory.d.ts +0 -0
- /package/dist/{lib → factories}/shader-factory.d.ts +0 -0
- /package/src/{lib → factories}/pipeline-factory.ts +0 -0
- /package/src/{lib → factories}/shader-factory.ts +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { ClipSpace } from "./clip-space.js";
|
|
5
|
+
const BACKGROUND_FS_WGSL = /* wgsl */ `\
|
|
6
|
+
@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;
|
|
7
|
+
@group(0) @binding(1) var backgroundTextureSampler: sampler;
|
|
8
|
+
|
|
9
|
+
fn billboardTexture_getTextureUV(coordinates: vec2<f32>) -> vec2<f32> {
|
|
10
|
+
let iTexSize: vec2<u32> = textureDimensions(backgroundTexture, 0) * 2;
|
|
11
|
+
let texSize: vec2<f32> = vec2<f32>(f32(iTexSize.x), f32(iTexSize.y));
|
|
12
|
+
var position: vec2<f32> = coordinates.xy / texSize;
|
|
13
|
+
return position;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@fragment
|
|
17
|
+
fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
|
|
18
|
+
let position: vec2<f32> = billboardTexture_getTextureUV(inputs.coordinate);
|
|
19
|
+
return textureSample(backgroundTexture, backgroundTextureSampler, position);
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
const BACKGROUND_FS = /* glsl */ `\
|
|
23
|
+
#version 300 es
|
|
24
|
+
precision highp float;
|
|
25
|
+
|
|
26
|
+
uniform sampler2D backgroundTexture;
|
|
27
|
+
out vec4 fragColor;
|
|
28
|
+
|
|
29
|
+
vec2 billboardTexture_getTextureUV() {
|
|
30
|
+
ivec2 iTexSize = textureDimensions(backgroundTexture, 0) * 2;
|
|
31
|
+
vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));
|
|
32
|
+
vec2 position = gl_FragCoord.xy / texSize;
|
|
33
|
+
return position;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
void main(void) {
|
|
37
|
+
vec2 position = billboardTexture_getTextureUV();
|
|
38
|
+
fragColor = texture(backgroundTexture, position);
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
/**
|
|
42
|
+
* Model that renders a bitmap into the "background", i.e covering the screen
|
|
43
|
+
*/
|
|
44
|
+
export class BackgroundTextureModel extends ClipSpace {
|
|
45
|
+
constructor(device, props) {
|
|
46
|
+
super(device, {
|
|
47
|
+
id: props.id || 'background-texture-model',
|
|
48
|
+
source: BACKGROUND_FS_WGSL,
|
|
49
|
+
fs: BACKGROUND_FS,
|
|
50
|
+
parameters: {
|
|
51
|
+
depthWriteEnabled: false,
|
|
52
|
+
depthCompare: 'always',
|
|
53
|
+
...(props.blend
|
|
54
|
+
? {
|
|
55
|
+
blend: true,
|
|
56
|
+
blendColorOperation: 'add',
|
|
57
|
+
blendAlphaOperation: 'add',
|
|
58
|
+
blendColorSrcFactor: 'one',
|
|
59
|
+
blendColorDstFactor: 'one-minus-src-color',
|
|
60
|
+
blendAlphaSrcFactor: 'one',
|
|
61
|
+
blendAlphaDstFactor: 'one-minus-src-alpha'
|
|
62
|
+
}
|
|
63
|
+
: {})
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
this.setTexture(props.backgroundTexture);
|
|
67
|
+
}
|
|
68
|
+
setTexture(backgroundTexture) {
|
|
69
|
+
this.setBindings({
|
|
70
|
+
backgroundTexture
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
predraw() {
|
|
74
|
+
this.shaderInputs.setProps({});
|
|
75
|
+
super.predraw();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=billboard-texture-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billboard-texture-model.js","sourceRoot":"","sources":["../../src/models/billboard-texture-model.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAIpC,OAAO,EAAC,SAAS,EAAC,wBAAqB;AAEvC,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;CAgBrC,CAAC;AAEF,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;CAkBhC,CAAC;AAcF;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,SAAS;IACnD,YAAY,MAAc,EAAE,KAAkC;QAC5D,KAAK,CAAC,MAAM,EAAE;YACZ,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,0BAA0B;YAC1C,MAAM,EAAE,kBAAkB;YAC1B,EAAE,EAAE,aAAa;YACjB,UAAU,EAAE;gBACV,iBAAiB,EAAE,KAAK;gBACxB,YAAY,EAAE,QAAQ;gBACtB,GAAG,CAAC,KAAK,CAAC,KAAK;oBACb,CAAC,CAAC;wBACE,KAAK,EAAE,IAAI;wBACX,mBAAmB,EAAE,KAAK;wBAC1B,mBAAmB,EAAE,KAAK;wBAC1B,mBAAmB,EAAE,KAAK;wBAC1B,mBAAmB,EAAE,qBAAqB;wBAC1C,mBAAmB,EAAE,KAAK;wBAC1B,mBAAmB,EAAE,qBAAqB;qBAC3C;oBACH,CAAC,CAAC,EAAE,CAAC;aACR;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU,CAAC,iBAAyC;QAClD,IAAI,CAAC,WAAW,CAAC;YACf,iBAAiB;SAClB,CAAC,CAAC;IACL,CAAC;IAEQ,OAAO;QACd,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/B,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const billboardTexture: {
|
|
2
|
+
readonly name: "billboardTexture";
|
|
3
|
+
readonly fs: "#version 300 es\n\nuniform billboardTextureUniforms {\n vec2 topLeft;\n vec2 bottomRight;\n} billboardTexture;\n\nprecision highp float;\nuniform sampler2D backgroundTexture;\nout vec4 fragColor;\n\nvec2 billboardTexture_getTextureUV() {\n ivec2 iTexSize = textureSize(backgroundTexture, 0) * 2;\n vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));\n vec2 position = gl_FragCoord.xy / texSize;\n return position;\n}\n\nvoid main(void) {\n vec2 position = billboardTexture_getTextureUV();\n fragColor = texture(backgroundTexture, position);\n}\n";
|
|
4
|
+
readonly dependencies: [];
|
|
5
|
+
readonly uniformTypes: {
|
|
6
|
+
readonly topLeft: "vec2<f32>";
|
|
7
|
+
readonly bottomRight: "vec2<f32>";
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=billboard-texture-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billboard-texture-module.d.ts","sourceRoot":"","sources":["../../src/models/billboard-texture-module.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,gBAAgB;;;;;;;;CAQqD,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
const BACKGROUND_FS = /* glsl */ `\
|
|
5
|
+
#version 300 es
|
|
6
|
+
|
|
7
|
+
uniform billboardTextureUniforms {
|
|
8
|
+
vec2 topLeft;
|
|
9
|
+
vec2 bottomRight;
|
|
10
|
+
} billboardTexture;
|
|
11
|
+
|
|
12
|
+
precision highp float;
|
|
13
|
+
uniform sampler2D backgroundTexture;
|
|
14
|
+
out vec4 fragColor;
|
|
15
|
+
|
|
16
|
+
vec2 billboardTexture_getTextureUV() {
|
|
17
|
+
ivec2 iTexSize = textureSize(backgroundTexture, 0) * 2;
|
|
18
|
+
vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));
|
|
19
|
+
vec2 position = gl_FragCoord.xy / texSize;
|
|
20
|
+
return position;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
void main(void) {
|
|
24
|
+
vec2 position = billboardTexture_getTextureUV();
|
|
25
|
+
fragColor = texture(backgroundTexture, position);
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
export const billboardTexture = {
|
|
29
|
+
name: 'billboardTexture',
|
|
30
|
+
fs: BACKGROUND_FS,
|
|
31
|
+
dependencies: [],
|
|
32
|
+
uniformTypes: {
|
|
33
|
+
topLeft: 'vec2<f32>',
|
|
34
|
+
bottomRight: 'vec2<f32>'
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=billboard-texture-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billboard-texture-module.js","sourceRoot":"","sources":["../../src/models/billboard-texture-module.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAIpC,MAAM,aAAa,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBhC,CAAC;AAWF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,kBAAkB;IACxB,EAAE,EAAE,aAAa;IACjB,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE;QACZ,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,WAAW;KACzB;CAC+E,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Device } from '@luma.gl/core';
|
|
2
2
|
import { Model, ModelProps } from "../model/model.js";
|
|
3
|
+
/** Props for ClipSpace */
|
|
4
|
+
export type ClipSpaceProps = Omit<ModelProps, 'vs' | 'vertexCount' | 'geometry'>;
|
|
3
5
|
/**
|
|
4
6
|
* A flat geometry that covers the "visible area" that the GPU renders.
|
|
5
7
|
*/
|
|
6
8
|
export declare class ClipSpace extends Model {
|
|
7
|
-
constructor(device: Device,
|
|
9
|
+
constructor(device: Device, props: ClipSpaceProps);
|
|
8
10
|
}
|
|
9
11
|
//# sourceMappingURL=clip-space.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clip-space.d.ts","sourceRoot":"","sources":["../../src/models/clip-space.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EAAC,KAAK,EAAE,UAAU,EAAC,0BAAuB;AAkDjD,0BAA0B;AAC1B,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,aAAa,GAAG,UAAU,CAAC,CAAC;AAEjF;;GAEG;AACH,qBAAa,SAAU,SAAQ,KAAK;gBACtB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc;CAwBlD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { Model } from "../model/model.js";
|
|
5
|
+
import { Geometry } from "../geometry/geometry.js";
|
|
6
|
+
import { uid } from "../utils/uid.js";
|
|
7
|
+
const CLIPSPACE_VERTEX_SHADER_WGSL = /* wgsl */ `\
|
|
8
|
+
struct VertexInputs {
|
|
9
|
+
@location(0) clipSpacePosition: vec2<f32>,
|
|
10
|
+
@location(1) texCoord: vec2<f32>,
|
|
11
|
+
@location(2) coordinate: vec2<f32>
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
struct FragmentInputs {
|
|
15
|
+
@builtin(position) Position : vec4<f32>,
|
|
16
|
+
@location(0) position : vec2<f32>,
|
|
17
|
+
@location(1) coordinate : vec2<f32>,
|
|
18
|
+
@location(2) uv : vec2<f32>
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
@vertex
|
|
22
|
+
fn vertexMain(inputs: VertexInputs) -> FragmentInputs {
|
|
23
|
+
var outputs: FragmentInputs;
|
|
24
|
+
outputs.Position = vec4(inputs.clipSpacePosition, 0., 1.);
|
|
25
|
+
outputs.position = inputs.clipSpacePosition;
|
|
26
|
+
outputs.coordinate = inputs.coordinate;
|
|
27
|
+
outputs.uv = inputs.texCoord;
|
|
28
|
+
return outputs;
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
const CLIPSPACE_VERTEX_SHADER = /* glsl */ `\
|
|
32
|
+
#version 300 es
|
|
33
|
+
in vec2 clipSpacePositions;
|
|
34
|
+
in vec2 texCoords;
|
|
35
|
+
in vec2 coordinates;
|
|
36
|
+
|
|
37
|
+
out vec2 position;
|
|
38
|
+
out vec2 coordinate;
|
|
39
|
+
out vec2 uv;
|
|
40
|
+
|
|
41
|
+
void main(void) {
|
|
42
|
+
gl_Position = vec4(clipSpacePositions, 0., 1.);
|
|
43
|
+
position = clipSpacePositions;
|
|
44
|
+
coordinate = coordinates;
|
|
45
|
+
uv = texCoords;
|
|
46
|
+
}
|
|
47
|
+
`;
|
|
48
|
+
/* eslint-disable indent, no-multi-spaces */
|
|
49
|
+
const POSITIONS = [-1, -1, 1, -1, -1, 1, 1, 1];
|
|
50
|
+
/**
|
|
51
|
+
* A flat geometry that covers the "visible area" that the GPU renders.
|
|
52
|
+
*/
|
|
53
|
+
export class ClipSpace extends Model {
|
|
54
|
+
constructor(device, props) {
|
|
55
|
+
const TEX_COORDS = POSITIONS.map(coord => (coord === -1 ? 0 : coord));
|
|
56
|
+
// For WGSL we need to append the supplied fragment shader to the default vertex shader source
|
|
57
|
+
if (props.source) {
|
|
58
|
+
props = { ...props, source: `${CLIPSPACE_VERTEX_SHADER_WGSL}\n${props.source}` };
|
|
59
|
+
}
|
|
60
|
+
super(device, {
|
|
61
|
+
id: props.id || uid('clip-space'),
|
|
62
|
+
...props,
|
|
63
|
+
vs: CLIPSPACE_VERTEX_SHADER,
|
|
64
|
+
vertexCount: 4,
|
|
65
|
+
geometry: new Geometry({
|
|
66
|
+
topology: 'triangle-strip',
|
|
67
|
+
vertexCount: 4,
|
|
68
|
+
attributes: {
|
|
69
|
+
clipSpacePositions: { size: 2, value: new Float32Array(POSITIONS) },
|
|
70
|
+
texCoords: { size: 2, value: new Float32Array(TEX_COORDS) },
|
|
71
|
+
coordinates: { size: 2, value: new Float32Array(TEX_COORDS) }
|
|
72
|
+
}
|
|
73
|
+
})
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=clip-space.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clip-space.js","sourceRoot":"","sources":["../../src/models/clip-space.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAIpC,OAAO,EAAC,KAAK,EAAa,0BAAuB;AACjD,OAAO,EAAC,QAAQ,EAAC,gCAA6B;AAC9C,OAAO,EAAC,GAAG,EAAC,wBAAqB;AAEjC,MAAM,4BAA4B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuB/C,CAAC;AAEF,MAAM,uBAAuB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;CAgB1C,CAAC;AAEF,4CAA4C;AAC5C,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAK/C;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,MAAc,EAAE,KAAqB;QAC/C,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAEtE,8FAA8F;QAC9F,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,GAAG,EAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,4BAA4B,KAAK,KAAK,CAAC,MAAM,EAAE,EAAC,CAAC;QACjF,CAAC;QAED,KAAK,CAAC,MAAM,EAAE;YACZ,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC;YACjC,GAAG,KAAK;YACR,EAAE,EAAE,uBAAuB;YAC3B,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,IAAI,QAAQ,CAAC;gBACrB,QAAQ,EAAE,gBAAgB;gBAC1B,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE;oBACV,kBAAkB,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,SAAS,CAAC,EAAC;oBACjE,SAAS,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC,EAAC;oBACzD,WAAW,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC,EAAC;iBAC5D;aACF,CAAC;SACH,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { PickingProps, PickingUniforms } from "./picking-uniforms.js";
|
|
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
|
|
8
|
+
*/
|
|
9
|
+
export declare const picking: {
|
|
10
|
+
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";
|
|
14
|
+
readonly props: PickingProps;
|
|
15
|
+
readonly uniforms: PickingUniforms;
|
|
16
|
+
readonly uniformTypes: Required<import("modules/shadertools/dist/lib/utils/uniform-types").UniformTypes<PickingUniforms>>;
|
|
17
|
+
readonly defaultUniforms: {
|
|
18
|
+
readonly isActive: false;
|
|
19
|
+
readonly indexMode: 0;
|
|
20
|
+
readonly batchIndex: 0;
|
|
21
|
+
readonly isHighlightActive: true;
|
|
22
|
+
readonly highlightedBatchIndex: -1;
|
|
23
|
+
readonly highlightedObjectIndex: -1;
|
|
24
|
+
readonly highlightColor: import("@math.gl/types").NumberArray4;
|
|
25
|
+
};
|
|
26
|
+
readonly getUniforms: (props?: PickingProps, prevUniforms?: PickingUniforms) => PickingUniforms;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=color-picking.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS } from "./picking-uniforms.js";
|
|
5
|
+
const source = /* wgsl */ `\
|
|
6
|
+
${WGSL_UNIFORMS}
|
|
7
|
+
`;
|
|
8
|
+
const vs = /* glsl */ `\
|
|
9
|
+
${GLSL_UNIFORMS}
|
|
10
|
+
out vec4 picking_vRGBcolor_Avalid;
|
|
11
|
+
|
|
12
|
+
// Normalize unsigned byte color to 0-1 range
|
|
13
|
+
vec3 picking_normalizeColor(vec3 color) {
|
|
14
|
+
return picking.useFloatColors > 0.5 ? color : color / 255.0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Normalize unsigned byte color to 0-1 range
|
|
18
|
+
vec4 picking_normalizeColor(vec4 color) {
|
|
19
|
+
return picking.useFloatColors > 0.5 ? color : color / 255.0;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
bool picking_isColorZero(vec3 color) {
|
|
23
|
+
return dot(color, vec3(1.0)) < 0.00001;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
bool picking_isColorValid(vec3 color) {
|
|
27
|
+
return dot(color, vec3(1.0)) > 0.00001;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Check if this vertex is highlighted
|
|
31
|
+
bool isVertexHighlighted(vec3 vertexColor) {
|
|
32
|
+
vec3 highlightedObjectColor = picking_normalizeColor(picking.highlightedObjectColor);
|
|
33
|
+
return
|
|
34
|
+
bool(picking.isHighlightActive) && picking_isColorZero(abs(vertexColor - highlightedObjectColor));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Set the current picking color
|
|
38
|
+
void picking_setPickingColor(vec3 pickingColor) {
|
|
39
|
+
pickingColor = picking_normalizeColor(pickingColor);
|
|
40
|
+
|
|
41
|
+
if (bool(picking.isActive)) {
|
|
42
|
+
// Use alpha as the validity flag. If pickingColor is [0, 0, 0] fragment is non-pickable
|
|
43
|
+
picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));
|
|
44
|
+
|
|
45
|
+
if (!bool(picking.isAttribute)) {
|
|
46
|
+
// Stores the picking color so that the fragment shader can render it during picking
|
|
47
|
+
picking_vRGBcolor_Avalid.rgb = pickingColor;
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
// Do the comparison with selected item color in vertex shader as it should mean fewer compares
|
|
51
|
+
picking_vRGBcolor_Avalid.a = float(isVertexHighlighted(pickingColor));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
void picking_setObjectIndex(uint objectIndex) {
|
|
56
|
+
if (bool(picking.isActive)) {
|
|
57
|
+
uint index = objectIndex;
|
|
58
|
+
if (picking.indexMode == PICKING_INDEX_MODE_INSTANCE) {
|
|
59
|
+
index = uint(gl_InstanceID);
|
|
60
|
+
}
|
|
61
|
+
picking_vRGBcolor_Avalid.r = float(index % 255) / 255.0;
|
|
62
|
+
picking_vRGBcolor_Avalid.g = float((index / 255) % 255) / 255.0;
|
|
63
|
+
picking_vRGBcolor_Avalid.b = float((index / 255 / 255) %255) / 255.0;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
void picking_setPickingAttribute(float value) {
|
|
68
|
+
if (bool(picking.isAttribute)) {
|
|
69
|
+
picking_vRGBcolor_Avalid.r = value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
void picking_setPickingAttribute(vec2 value) {
|
|
74
|
+
if (bool(picking.isAttribute)) {
|
|
75
|
+
picking_vRGBcolor_Avalid.rg = value;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
void picking_setPickingAttribute(vec3 value) {
|
|
80
|
+
if (bool(picking.isAttribute)) {
|
|
81
|
+
picking_vRGBcolor_Avalid.rgb = value;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
`;
|
|
85
|
+
const fs = /* glsl */ `\
|
|
86
|
+
${GLSL_UNIFORMS}
|
|
87
|
+
|
|
88
|
+
in vec4 picking_vRGBcolor_Avalid;
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* Returns highlight color if this item is selected.
|
|
92
|
+
*/
|
|
93
|
+
vec4 picking_filterHighlightColor(vec4 color) {
|
|
94
|
+
// If we are still picking, we don't highlight
|
|
95
|
+
if (picking.isActive > 0.5) {
|
|
96
|
+
return color;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
bool selected = bool(picking_vRGBcolor_Avalid.a);
|
|
100
|
+
|
|
101
|
+
if (selected) {
|
|
102
|
+
// Blend in highlight color based on its alpha value
|
|
103
|
+
float highLightAlpha = picking.highlightColor.a;
|
|
104
|
+
float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
|
|
105
|
+
float highLightRatio = highLightAlpha / blendedAlpha;
|
|
106
|
+
|
|
107
|
+
vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
|
|
108
|
+
return vec4(blendedRGB, blendedAlpha);
|
|
109
|
+
} else {
|
|
110
|
+
return color;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/*
|
|
115
|
+
* Returns picking color if picking enabled else unmodified argument.
|
|
116
|
+
*/
|
|
117
|
+
vec4 picking_filterPickingColor(vec4 color) {
|
|
118
|
+
if (bool(picking.isActive)) {
|
|
119
|
+
if (picking_vRGBcolor_Avalid.a == 0.0) {
|
|
120
|
+
discard;
|
|
121
|
+
}
|
|
122
|
+
return picking_vRGBcolor_Avalid;
|
|
123
|
+
}
|
|
124
|
+
return color;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/*
|
|
128
|
+
* Returns picking color if picking is enabled if not
|
|
129
|
+
* highlight color if this item is selected, otherwise unmodified argument.
|
|
130
|
+
*/
|
|
131
|
+
vec4 picking_filterColor(vec4 color) {
|
|
132
|
+
vec4 highlightColor = picking_filterHighlightColor(color);
|
|
133
|
+
return picking_filterPickingColor(highlightColor);
|
|
134
|
+
}
|
|
135
|
+
`;
|
|
136
|
+
/**
|
|
137
|
+
* Provides support for color-coding-based picking and highlighting.
|
|
138
|
+
* In particular, supports picking a specific instance in an instanced
|
|
139
|
+
* draw call and highlighting an instance based on its picking color,
|
|
140
|
+
* and correspondingly, supports picking and highlighting groups of
|
|
141
|
+
* primitives with the same picking color in non-instanced draw-calls
|
|
142
|
+
*/
|
|
143
|
+
export const picking = {
|
|
144
|
+
...pickingUniforms,
|
|
145
|
+
name: 'picking',
|
|
146
|
+
source,
|
|
147
|
+
vs,
|
|
148
|
+
fs
|
|
149
|
+
};
|
|
150
|
+
// function getUniforms(opts: PickingProps = {}, prevUniforms?: PickingUniforms): PickingUniforms {
|
|
151
|
+
// const uniforms = {} as PickingUniforms;
|
|
152
|
+
// if (opts.highlightedObjectColor === undefined) {
|
|
153
|
+
// // Unless highlightedObjectColor explicitly null or set, do not update state
|
|
154
|
+
// } else if (opts.highlightedObjectColor === null) {
|
|
155
|
+
// uniforms.isHighlightActive = false;
|
|
156
|
+
// } else {
|
|
157
|
+
// uniforms.isHighlightActive = true;
|
|
158
|
+
// const highlightedObjectColor = opts.highlightedObjectColor.slice(0, 3);
|
|
159
|
+
// uniforms.highlightedObjectColor = highlightedObjectColor;
|
|
160
|
+
// }
|
|
161
|
+
// if (opts.highlightColor) {
|
|
162
|
+
// const color = Array.from(opts.highlightColor, x => x / 255);
|
|
163
|
+
// if (!Number.isFinite(color[3])) {
|
|
164
|
+
// color[3] = 1;
|
|
165
|
+
// }
|
|
166
|
+
// uniforms.highlightColor = color;
|
|
167
|
+
// }
|
|
168
|
+
// if (opts.isActive !== undefined) {
|
|
169
|
+
// uniforms.isActive = Boolean(opts.isActive);
|
|
170
|
+
// uniforms.isAttribute = Boolean(opts.isAttribute);
|
|
171
|
+
// }
|
|
172
|
+
// if (opts.useFloatColors !== undefined) {
|
|
173
|
+
// uniforms.useFloatColors = Boolean(opts.useFloatColors);
|
|
174
|
+
// }
|
|
175
|
+
// return uniforms;
|
|
176
|
+
// }
|
|
177
|
+
//# sourceMappingURL=color-picking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-picking.js","sourceRoot":"","sources":["../../../src/modules/picking/color-picking.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,OAAO,EAAC,eAAe,EAAE,aAAa,EAAE,aAAa,EAAC,8BAA2B;AAEjF,MAAM,MAAM,GAAG,UAAU,CAAC;EACxB,aAAa;CACd,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Ed,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDd,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,eAAe;IAClB,IAAI,EAAE,SAAS;IACf,MAAM;IACN,EAAE;IACF,EAAE;CAC6E,CAAC;AAElF,mGAAmG;AACnG,4CAA4C;AAE5C,qDAAqD;AACrD,mFAAmF;AACnF,uDAAuD;AACvD,0CAA0C;AAC1C,aAAa;AACb,yCAAyC;AACzC,8EAA8E;AAC9E,gEAAgE;AAChE,MAAM;AAEN,+BAA+B;AAC/B,mEAAmE;AACnE,wCAAwC;AACxC,sBAAsB;AACtB,QAAQ;AACR,uCAAuC;AACvC,MAAM;AAEN,uCAAuC;AACvC,kDAAkD;AAClD,wDAAwD;AACxD,MAAM;AAEN,6CAA6C;AAC7C,8DAA8D;AAC9D,MAAM;AAEN,qBAAqB;AACrB,IAAI"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { PickingProps, PickingUniforms } from "./picking-uniforms.js";
|
|
2
|
+
/**
|
|
3
|
+
* Provides support for color-based picking and highlighting.
|
|
4
|
+
*
|
|
5
|
+
* In particular, supports picking a specific instance in an instanced
|
|
6
|
+
* draw call and highlighting an instance based on its picking color,
|
|
7
|
+
* and correspondingly, supports picking and highlighting groups of
|
|
8
|
+
* primitives with the same picking color in non-instanced draw-calls
|
|
9
|
+
*
|
|
10
|
+
* @note Color based picking has the significant advantage in that it can be added to any
|
|
11
|
+
* existing shader without requiring any additional picking logic.
|
|
12
|
+
*/
|
|
13
|
+
export declare const picking: {
|
|
14
|
+
readonly name: "picking";
|
|
15
|
+
readonly source: "struct pickingUniforms {\n isActive: int32;\n indexMode: int32;\n batchIndex: int32;\n\n isHighlightActive: int32;\n highlightedBatchIndex: int32;\n highlightedObjectIndex: int32;\n highlightColor: vec4<f32>;\n} picking;\n\n\nconst INDEX_PICKING_MODE_INSTANCE = 0;\nconst INDEX_PICKING_MODE_CUSTOM = 1;\nconst INDEX_PICKING_INVALID_INDEX = -1; // 2^32 - 1\n\nstruct indexPickingFragmentInputs = {\n objectIndex: int32;\n};\n\nlet indexPickingFragmentInputs: indexPickingFragmentInputs;\n\n/**\n * Vertex shaders should call this function to set the object index.\n * If using instance or vertex mode, argument will be ignored, 0 can be supplied.\n */\nfn picking_setObjectIndex(objectIndex: int32) {\n switch (picking.indexMode) {\n case INDEX_PICKING_MODE_INSTANCE, default: {\n picking_objectIndex = instance_index;\n };\n case INDEX_PICKING_MODE_CUSTOM: {\n picking_objectIndex = objectIndex;\n };\n }\n}\n\n";
|
|
16
|
+
readonly vs: "precision highp float;\nprecision highp int;\n\nuniform pickingUniforms {\n int isActive;\n int indexMode;\n int batchIndex;\n\n int isHighlightActive;\n int highlightedBatchIndex;\n int highlightedObjectIndex;\n vec4 highlightColor;\n} picking;\n\n\nconst int INDEX_PICKING_MODE_INSTANCE = 0;\nconst int INDEX_PICKING_MODE_CUSTOM = 1;\n\nconst int INDEX_PICKING_INVALID_INDEX = -1; // 2^32 - 1\n\nflat out int picking_objectIndex;\n\n/**\n * Vertex shaders should call this function to set the object index.\n * If using instance or vertex mode, argument will be ignored, 0 can be supplied.\n */\nvoid picking_setObjectIndex(int objectIndex) {\n switch (picking.indexMode) {\n case INDEX_PICKING_MODE_INSTANCE:\n picking_objectIndex = gl_InstanceID;\n break;\n case INDEX_PICKING_MODE_CUSTOM:\n picking_objectIndex = objectIndex;\n break;\n }\n}\n";
|
|
17
|
+
readonly fs: "precision highp float;\nprecision highp int;\n\nuniform pickingUniforms {\n int isActive;\n int indexMode;\n int batchIndex;\n\n int isHighlightActive;\n int highlightedBatchIndex;\n int highlightedObjectIndex;\n vec4 highlightColor;\n} picking;\n\n\nconst int INDEX_PICKING_INVALID_INDEX = -1; // 2^32 - 1\n\nflat in int picking_objectIndex;\n\n/**\n * Check if this vertex is highlighted (part of the selected batch and object)\n */ \nbool picking_isFragmentHighlighted() {\n return \n bool(picking.isHighlightActive) &&\n picking.highlightedBatchIndex == picking.batchIndex &&\n picking.highlightedObjectIndex == picking_objectIndex\n ;\n}\n\n/**\n * Returns highlight color if this item is selected.\n */\nvec4 picking_filterHighlightColor(vec4 color) {\n // If we are still picking, we don't highlight\n if (bool(picking.isActive)) {\n return color;\n }\n\n // If we are not highlighted, return color as is\n if (!picking_isFragmentHighlighted()) {\n return color;\n }\n \n // Blend in highlight color based on its alpha value\n float highLightAlpha = picking.highlightColor.a;\n float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\n float highLightRatio = highLightAlpha / blendedAlpha;\n\n vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n}\n\n/*\n * Returns picking color if picking enabled else unmodified argument.\n */\nivec4 picking_getPickingColor() {\n // Assumes that colorAttachment0 is rg32int\n // TODO? - we could render indices into a second color attachment and not mess with fragColor\n return ivec4(picking_objectIndex, picking.batchIndex, 0u, 0u); \n}\n\nvec4 picking_filterPickingColor(vec4 color) {\n if (bool(picking.isActive)) {\n if (picking_objectIndex == INDEX_PICKING_INVALID_INDEX) {\n discard;\n }\n }\n return color;\n}\n\n/*\n * Returns picking color if picking is enabled if not\n * highlight color if this item is selected, otherwise unmodified argument.\n */\nvec4 picking_filterColor(vec4 color) {\n vec4 outColor = color;\n outColor = picking_filterHighlightColor(outColor);\n outColor = picking_filterPickingColor(outColor);\n return outColor;\n}\n";
|
|
18
|
+
readonly props: PickingProps;
|
|
19
|
+
readonly uniforms: PickingUniforms;
|
|
20
|
+
readonly uniformTypes: Required<import("modules/shadertools/dist/lib/utils/uniform-types").UniformTypes<PickingUniforms>>;
|
|
21
|
+
readonly defaultUniforms: {
|
|
22
|
+
readonly isActive: false;
|
|
23
|
+
readonly indexMode: 0;
|
|
24
|
+
readonly batchIndex: 0;
|
|
25
|
+
readonly isHighlightActive: true;
|
|
26
|
+
readonly highlightedBatchIndex: -1;
|
|
27
|
+
readonly highlightedObjectIndex: -1;
|
|
28
|
+
readonly highlightColor: import("@math.gl/types").NumberArray4;
|
|
29
|
+
};
|
|
30
|
+
readonly getUniforms: (props?: PickingProps, prevUniforms?: PickingUniforms) => PickingUniforms;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=index-picking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-picking.d.ts","sourceRoot":"","sources":["../../../src/modules/picking/index-picking.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkB,YAAY,EAAE,eAAe,EAAC,8BAA2B;AAoIvF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;CAM6D,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { pickingUniforms, GLSL_UNIFORMS, WGSL_UNIFORMS, INVALID_INDEX } from "./picking-uniforms.js";
|
|
5
|
+
// SHADERS
|
|
6
|
+
const source = /* wgsl */ `\
|
|
7
|
+
${WGSL_UNIFORMS}
|
|
8
|
+
|
|
9
|
+
const INDEX_PICKING_MODE_INSTANCE = 0;
|
|
10
|
+
const INDEX_PICKING_MODE_CUSTOM = 1;
|
|
11
|
+
const INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1
|
|
12
|
+
|
|
13
|
+
struct indexPickingFragmentInputs = {
|
|
14
|
+
objectIndex: int32;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
let indexPickingFragmentInputs: indexPickingFragmentInputs;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Vertex shaders should call this function to set the object index.
|
|
21
|
+
* If using instance or vertex mode, argument will be ignored, 0 can be supplied.
|
|
22
|
+
*/
|
|
23
|
+
fn picking_setObjectIndex(objectIndex: int32) {
|
|
24
|
+
switch (picking.indexMode) {
|
|
25
|
+
case INDEX_PICKING_MODE_INSTANCE, default: {
|
|
26
|
+
picking_objectIndex = instance_index;
|
|
27
|
+
};
|
|
28
|
+
case INDEX_PICKING_MODE_CUSTOM: {
|
|
29
|
+
picking_objectIndex = objectIndex;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
`;
|
|
35
|
+
const vs = /* glsl */ `\
|
|
36
|
+
${GLSL_UNIFORMS}
|
|
37
|
+
|
|
38
|
+
const int INDEX_PICKING_MODE_INSTANCE = 0;
|
|
39
|
+
const int INDEX_PICKING_MODE_CUSTOM = 1;
|
|
40
|
+
|
|
41
|
+
const int INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1
|
|
42
|
+
|
|
43
|
+
flat out int picking_objectIndex;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Vertex shaders should call this function to set the object index.
|
|
47
|
+
* If using instance or vertex mode, argument will be ignored, 0 can be supplied.
|
|
48
|
+
*/
|
|
49
|
+
void picking_setObjectIndex(int objectIndex) {
|
|
50
|
+
switch (picking.indexMode) {
|
|
51
|
+
case INDEX_PICKING_MODE_INSTANCE:
|
|
52
|
+
picking_objectIndex = gl_InstanceID;
|
|
53
|
+
break;
|
|
54
|
+
case INDEX_PICKING_MODE_CUSTOM:
|
|
55
|
+
picking_objectIndex = objectIndex;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
60
|
+
const fs = /* glsl */ `\
|
|
61
|
+
${GLSL_UNIFORMS}
|
|
62
|
+
|
|
63
|
+
const int INDEX_PICKING_INVALID_INDEX = ${INVALID_INDEX}; // 2^32 - 1
|
|
64
|
+
|
|
65
|
+
flat in int picking_objectIndex;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Check if this vertex is highlighted (part of the selected batch and object)
|
|
69
|
+
*/
|
|
70
|
+
bool picking_isFragmentHighlighted() {
|
|
71
|
+
return
|
|
72
|
+
bool(picking.isHighlightActive) &&
|
|
73
|
+
picking.highlightedBatchIndex == picking.batchIndex &&
|
|
74
|
+
picking.highlightedObjectIndex == picking_objectIndex
|
|
75
|
+
;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Returns highlight color if this item is selected.
|
|
80
|
+
*/
|
|
81
|
+
vec4 picking_filterHighlightColor(vec4 color) {
|
|
82
|
+
// If we are still picking, we don't highlight
|
|
83
|
+
if (bool(picking.isActive)) {
|
|
84
|
+
return color;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// If we are not highlighted, return color as is
|
|
88
|
+
if (!picking_isFragmentHighlighted()) {
|
|
89
|
+
return color;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Blend in highlight color based on its alpha value
|
|
93
|
+
float highLightAlpha = picking.highlightColor.a;
|
|
94
|
+
float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
|
|
95
|
+
float highLightRatio = highLightAlpha / blendedAlpha;
|
|
96
|
+
|
|
97
|
+
vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
|
|
98
|
+
return vec4(blendedRGB, blendedAlpha);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/*
|
|
102
|
+
* Returns picking color if picking enabled else unmodified argument.
|
|
103
|
+
*/
|
|
104
|
+
ivec4 picking_getPickingColor() {
|
|
105
|
+
// Assumes that colorAttachment0 is rg32int
|
|
106
|
+
// TODO? - we could render indices into a second color attachment and not mess with fragColor
|
|
107
|
+
return ivec4(picking_objectIndex, picking.batchIndex, 0u, 0u);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
vec4 picking_filterPickingColor(vec4 color) {
|
|
111
|
+
if (bool(picking.isActive)) {
|
|
112
|
+
if (picking_objectIndex == INDEX_PICKING_INVALID_INDEX) {
|
|
113
|
+
discard;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return color;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/*
|
|
120
|
+
* Returns picking color if picking is enabled if not
|
|
121
|
+
* highlight color if this item is selected, otherwise unmodified argument.
|
|
122
|
+
*/
|
|
123
|
+
vec4 picking_filterColor(vec4 color) {
|
|
124
|
+
vec4 outColor = color;
|
|
125
|
+
outColor = picking_filterHighlightColor(outColor);
|
|
126
|
+
outColor = picking_filterPickingColor(outColor);
|
|
127
|
+
return outColor;
|
|
128
|
+
}
|
|
129
|
+
`;
|
|
130
|
+
/**
|
|
131
|
+
* Provides support for color-based picking and highlighting.
|
|
132
|
+
*
|
|
133
|
+
* In particular, supports picking a specific instance in an instanced
|
|
134
|
+
* draw call and highlighting an instance based on its picking color,
|
|
135
|
+
* and correspondingly, supports picking and highlighting groups of
|
|
136
|
+
* primitives with the same picking color in non-instanced draw-calls
|
|
137
|
+
*
|
|
138
|
+
* @note Color based picking has the significant advantage in that it can be added to any
|
|
139
|
+
* existing shader without requiring any additional picking logic.
|
|
140
|
+
*/
|
|
141
|
+
export const picking = {
|
|
142
|
+
...pickingUniforms,
|
|
143
|
+
name: 'picking',
|
|
144
|
+
source,
|
|
145
|
+
vs,
|
|
146
|
+
fs
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=index-picking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-picking.js","sourceRoot":"","sources":["../../../src/modules/picking/index-picking.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAKpC,OAAO,EAAC,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAC,8BAA2B;AAEhG,UAAU;AAEV,MAAM,MAAM,GAAG,UAAU,CAAC;EACxB,aAAa;;;;sCAIuB,aAAa;;;;;;;;;;;;;;;;;;;;;;;CAuBlD,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;;;;0CAK2B,aAAa;;;;;;;;;;;;;;;;;;CAkBtD,CAAC;AAEF,MAAM,EAAE,GAAG,UAAU,CAAC;EACpB,aAAa;;0CAE2B,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEtD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,eAAe;IAClB,IAAI,EAAE,SAAS;IACf,MAAM;IACN,EAAE;IACF,EAAE;CAC6E,CAAC"}
|