Skip to content

Commit 04b66a0

Browse files
committed
Merge branch 'master' into chr/cleanup-widget-constructors
2 parents 05761ee + 17ab465 commit 04b66a0

File tree

675 files changed

+13387
-140
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

675 files changed

+13387
-140
lines changed

docs/api-reference/core/deck.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,19 @@ The following properties are used to initialize a `Deck` instance. Any custom va
4848

4949
The canvas to render into. Can be either a HTMLCanvasElement or the element id. Will be auto-created if not supplied.
5050

51-
#### `gl` (WebGLContext) {#gl}
51+
#### `device` ([Device](https://luma.gl/docs/api-reference/core/device))
52+
53+
luma.gl Device used to manage the application's connection with the GPU. Will be auto-created if not supplied.
54+
55+
#### `deviceProps` ([DeviceProps](https://luma.gl/docs/api-reference/core/device#deviceprops) | [WebGLDeviceProps](https://luma.gl/docs/api-reference/webgl/#webgldeviceprops)) {#deviceprops}
5256

53-
WebGL context. Will be auto-created if not supplied.
57+
Options used for creating a new luma.gl GPU [Device](https://luma.gl/docs/api-reference/core/device).
5458

55-
#### `glOptions` (object) {#gloptions}
59+
Note that when using WebGL, `props.deviceProps.webgl` can be used to specify [WebGL context attributes](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext#contextattributes).
60+
61+
#### `gl` (WebGLContext) {#gl}
5662

57-
Additional options used when creating the WebGLContext. See [WebGL context attributes](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext).
63+
WebGL context to use. This prop is deprecated and replaced by `device`.
5864

5965
#### `id` (string) {#id}
6066

@@ -434,7 +440,7 @@ Called once the [Device](https://luma.gl/docs/api-reference/core/device) context
434440
435441
Receives arguments:
436442
437-
* `device` (Device) - a `WEBGLDevice` or `WebGPUDevice`.
443+
* `device` (Device) - a `WebGLDevice` or `WebGPUDevice`.
438444
439445
#### `onViewStateChange` (Function) {#onviewstatechange}
440446

docs/upgrade-guide.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,13 @@ The biggest changes in deck.gl v9 are due to the upgrade to the luma.gl v9 API.
5050

5151
Quick summary:
5252

53-
- All references to `gl: WebGLRenderingContext` should be replaced with `device`: [Device](https://luma.gl/docs/api-reference/core/device).
54-
- Layer props `parameters` and `textureParameters` no longer use WebGL constants, but instead use (WebGPU style) [string constants](https://luma.gl/docs/api-reference/core/parameters/).
55-
- Deck class prop `onWebGLInitialized` is now `onDeviceInitialized`.
53+
- `DeckProps.gl (WebGLRenderingContext)` should be replaced with `device`: [Device](https://luma.gl/docs/api-reference/core/device).
54+
- `DeckProps.glOptions (WebGLContextAttributes)` should be replaced with `DeckProps.deviceProps.webgl`: `deviceProps: {type: 'webgl', webgl: ...glOptions}`: [WebGLDeviceProps](https://luma.gl/docs/api-reference/webgl/#webgldeviceprops)
55+
- `DeckProps.glOptions.preserveDrawingBuffers` is now set by default, and does not need to be overridden.
56+
- `DeckProps.onWebGLInitialized` callback is now `DeckProps.onDeviceInitialized`.
57+
- `LayerProps.parameters` and `LayerProps.textureParameters` no longer use WebGL constants, but instead use (WebGPU style) [string constants](https://luma.gl/docs/api-reference/core/parameters/).
5658
- When providing [binary data attributes](./api-reference/core/layer.md#data), `type` is now a WebGPU-style [string format](https://luma.gl/docs/api-guide/gpu/gpu-attributes#vertexformat) instead of a GL constant.
57-
- GPU resources should no longer be initiated from classes. For example, instead of `new Buffer()` use `device.createBuffer()`, instead of `new Texture()` use `device.createTexture()`. See [Device methods](https://luma.gl/docs/api-reference/core/device#methods).
59+
- GPU resources should no longer be created by directly instantiating classes. For example, instead of `new Buffer(gl)` use `device.createBuffer()`, instead of `new Texture()` use `device.createTexture()`. See [Device methods](https://luma.gl/docs/api-reference/core/device#methods).
5860

5961
#### Custom Layers
6062

examples/layer-browser/src/examples/aggregation-layers.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const ContourLayerExample = {
3131
id: 'contourLayer',
3232
cellSize: 200,
3333
getPosition: d => d.COORDINATES,
34-
gpuAggregation: false, // TODO(v9): Re-enable GPU aggregation.
34+
gpuAggregation: true,
3535
contours: [
3636
{threshold: 1, color: [255, 0, 0], strokeWidth: 4},
3737
{threshold: 5, color: [0, 255, 0], strokeWidth: 2},
@@ -47,7 +47,7 @@ const ContourLayerBandsExample = {
4747
id: 'contourLayer',
4848
cellSize: 200,
4949
getPosition: d => d.COORDINATES,
50-
gpuAggregation: false, // TODO(v9): Re-enable GPU aggregation.
50+
gpuAggregation: true,
5151
contours: [
5252
{threshold: [1, 5], color: [255, 0, 0]},
5353
{threshold: [5, 15], color: [0, 255, 0]},

examples/website/3d-heatmap/app.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export default function App({
8989
const layers = [
9090
new HexagonLayer<DataPoint>({
9191
id: 'heatmap',
92-
// gpuAggregation: true,
92+
gpuAggregation: true,
9393
colorRange,
9494
coverage,
9595
data,

examples/website/globe/animated-arc-layer.ts

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,27 @@
55
import {ArcLayer, ArcLayerProps} from '@deck.gl/layers';
66
import {Accessor, DefaultProps} from '@deck.gl/core';
77

8+
import type {ShaderModule} from '@luma.gl/shadertools';
9+
10+
const uniformBlock = `\
11+
uniform tripsUniforms {
12+
vec2 timeRange;
13+
} trips;
14+
`;
15+
16+
export type TripsProps = {
17+
timeRange: [number, number];
18+
};
19+
20+
export const tripsUniforms = {
21+
name: 'trips',
22+
vs: uniformBlock,
23+
fs: uniformBlock,
24+
uniformTypes: {
25+
timeRange: 'vec2<f32>'
26+
}
27+
} as const satisfies ShaderModule<TripsProps>;
28+
829
export type AnimatedArcLayerProps<DataT = any> = _AnimatedArcLayerProps<DataT> &
930
ArcLayerProps<DataT>;
1031

@@ -31,7 +52,6 @@ export default class AnimatedArcLayer<DataT = any, ExtraProps = {}> extends ArcL
3152
const shaders = super.getShaders();
3253
shaders.inject = {
3354
'vs:#decl': `\
34-
uniform vec2 timeRange;
3555
in float instanceSourceTimestamp;
3656
in float instanceTargetTimestamp;
3757
out float vTimestamp;
@@ -40,18 +60,18 @@ out float vTimestamp;
4060
vTimestamp = mix(instanceSourceTimestamp, instanceTargetTimestamp, segmentRatio);
4161
`,
4262
'fs:#decl': `\
43-
uniform vec2 timeRange;
4463
in float vTimestamp;
4564
`,
4665
'fs:#main-start': `\
47-
if (vTimestamp < timeRange.x || vTimestamp > timeRange.y) {
66+
if (vTimestamp < trips.timeRange.x || vTimestamp > trips.timeRange.y) {
4867
discard;
4968
}
5069
`,
5170
'fs:DECKGL_FILTER_COLOR': `\
52-
color.a *= (vTimestamp - timeRange.x) / (timeRange.y - timeRange.x);
71+
color.a *= (vTimestamp - trips.timeRange.x) / (trips.timeRange.y - trips.timeRange.x);
5372
`
5473
};
74+
shaders.modules = [...shaders.modules, tripsUniforms];
5575
return shaders;
5676
}
5777

@@ -70,10 +90,10 @@ color.a *= (vTimestamp - timeRange.x) / (timeRange.y - timeRange.x);
7090
}
7191

7292
draw(params) {
73-
params.uniforms = {
74-
...params.uniforms,
75-
timeRange: this.props.timeRange
76-
};
93+
const {timeRange} = this.props;
94+
const tripsProps: TripsProps = {timeRange};
95+
const model = this.state.model!;
96+
model.shaderInputs.setProps({trips: tripsProps});
7797
super.draw(params);
7898
}
7999
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// deck.gl
2+
// SPDX-License-Identifier: MIT
3+
// Copyright (c) vis.gl contributors
4+
5+
import type {Texture} from '@luma.gl/core';
6+
import type {ShaderModule} from '@luma.gl/shadertools';
7+
8+
const uniformBlock = `\
9+
uniform axesUniforms {
10+
float fontSize;
11+
vec3 gridCenter;
12+
vec3 gridDims;
13+
float gridOffset;
14+
float labelHeight;
15+
vec3 labelWidths;
16+
vec4 strokeColor;
17+
} axes;
18+
`;
19+
20+
export type AxesProps = {
21+
fontSize: number;
22+
gridCenter: [number, number, number];
23+
gridDims: [number, number, number];
24+
gridOffset: number;
25+
labelHeight: number;
26+
labelWidths: [number, number, number];
27+
strokeColor: [number, number, number, number];
28+
labelTexture: Texture;
29+
};
30+
31+
export const axesUniforms = {
32+
name: 'axes',
33+
vs: uniformBlock,
34+
fs: uniformBlock,
35+
uniformTypes: {
36+
fontSize: 'f32',
37+
gridCenter: 'vec3<f32>',
38+
gridDims: 'vec3<f32>',
39+
gridOffset: 'f32',
40+
labelHeight: 'f32',
41+
labelWidths: 'vec3<f32>',
42+
strokeColor: 'vec4<f32>'
43+
}
44+
} as const satisfies ShaderModule<AxesProps>;

examples/website/plot/plot-layer/axes-layer.ts

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,15 @@
22
// SPDX-License-Identifier: MIT
33
// Copyright (c) vis.gl contributors
44

5-
import {Color, DefaultProps, Layer, UpdateParameters, Attribute, LayerProps} from '@deck.gl/core';
5+
import {
6+
Color,
7+
DefaultProps,
8+
Layer,
9+
UpdateParameters,
10+
Attribute,
11+
LayerProps,
12+
project32
13+
} from '@deck.gl/core';
614
import {Model, Geometry} from '@luma.gl/engine';
715
import {Texture} from '@luma.gl/core';
816

@@ -13,6 +21,7 @@ import gridVertex from './grid-vertex.glsl';
1321
import labelVertex from './label-vertex.glsl';
1422
import labelFragment from './label-fragment.glsl';
1523
import {Axis, TickFormat, Vec3} from './types';
24+
import {AxesProps, axesUniforms} from './axes-layer-uniforms';
1625

1726
type Tick = {
1827
axis: 'x' | 'y' | 'z';
@@ -23,7 +32,7 @@ type Tick = {
2332

2433
interface LabelTexture {
2534
labelHeight: number;
26-
labelWidths: number[];
35+
labelWidths: [number, number, number];
2736
labelTexture: Texture;
2837
}
2938

@@ -56,7 +65,6 @@ export default class AxesLayer extends Layer<Required<_AxesLayerProps>> {
5665

5766
state!: {
5867
models: [Model, Model];
59-
modelsByName: {grids: Model; labels: Model};
6068
ticks: Tick[];
6169
gridDims: Vec3;
6270
gridCenter: Vec3;
@@ -112,34 +120,34 @@ export default class AxesLayer extends Layer<Required<_AxesLayerProps>> {
112120
}
113121
}
114122

115-
draw({uniforms}) {
116-
const {gridDims, gridCenter, modelsByName, ticks} = this.state;
117-
const {labelTexture, ...labelTextureUniforms} = this.state.labelTexture!;
118-
const {fontSize, color, padding} = this.props;
123+
getShaders() {
124+
return super.getShaders({
125+
modules: [project32, axesUniforms]
126+
});
127+
}
119128

120-
if (labelTexture) {
121-
const baseUniforms = {
122-
fontSize,
123-
gridDims,
124-
gridCenter,
125-
gridOffset: padding,
126-
strokeColor: color
127-
};
129+
draw(params) {
130+
if (!this.state.labelTexture) {
131+
return;
132+
}
128133

129-
modelsByName.grids.setInstanceCount(ticks.length);
130-
modelsByName.labels.setInstanceCount(ticks.length);
134+
const {gridDims, gridCenter, models, ticks} = this.state;
135+
const {fontSize, color, padding} = this.props;
131136

132-
modelsByName.grids.setUniforms({...uniforms, ...baseUniforms});
133-
modelsByName.labels.setBindings({labelTexture});
134-
modelsByName.labels.setUniforms({
135-
...uniforms,
136-
...baseUniforms,
137-
...labelTextureUniforms
138-
});
137+
const axesProps: AxesProps = {
138+
...this.state.labelTexture,
139+
fontSize,
140+
gridDims,
141+
gridCenter,
142+
gridOffset: padding,
143+
strokeColor: color as [number, number, number, number]
144+
};
139145

140-
modelsByName.grids.draw(this.context.renderPass);
141-
modelsByName.labels.draw(this.context.renderPass);
142-
}
146+
models.forEach(model => {
147+
model.setInstanceCount(ticks.length);
148+
model.shaderInputs.setProps({axes: axesProps});
149+
});
150+
super.draw(params);
143151
}
144152

145153
_getModels() {
@@ -187,6 +195,7 @@ export default class AxesLayer extends Layer<Required<_AxesLayerProps>> {
187195
const {device} = this.context;
188196

189197
const grids = new Model(device, {
198+
...this.getShaders(),
190199
id: `${this.props.id}-grids`,
191200
vs: gridVertex,
192201
fs: gridFragment,
@@ -237,6 +246,7 @@ export default class AxesLayer extends Layer<Required<_AxesLayerProps>> {
237246
}
238247

239248
const labels = new Model(device, {
249+
...this.getShaders(),
240250
id: `${this.props.id}-labels`,
241251
vs: labelVertex,
242252
fs: labelFragment,
@@ -254,8 +264,7 @@ export default class AxesLayer extends Layer<Required<_AxesLayerProps>> {
254264
});
255265

256266
return {
257-
models: [grids, labels].filter(Boolean),
258-
modelsByName: {grids, labels}
267+
models: [grids, labels].filter(Boolean)
259268
};
260269
}
261270

examples/website/plot/plot-layer/grid-vertex.glsl.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@ in vec2 instancePositions;
1212
in vec3 instanceNormals;
1313
in float instanceIsTitle;
1414
15-
uniform vec3 gridDims;
16-
uniform vec3 gridCenter;
17-
uniform float gridOffset;
18-
uniform vec4 strokeColor;
19-
2015
out vec4 vColor;
2116
out float shouldDiscard;
2217
@@ -51,14 +46,14 @@ void main(void) {
5146
shouldDiscard = frontFacing(gridLineNormal) + instanceIsTitle;
5247
5348
vec3 position_modelspace = vec3(instancePositions.x) *
54-
instanceNormals + gridVertexOffset * gridDims / 2.0 + gridCenter * abs(gridVertexOffset);
49+
instanceNormals + gridVertexOffset * axes.gridDims / 2.0 + axes.gridCenter * abs(gridVertexOffset);
5550
5651
// apply offsets
57-
position_modelspace += gridOffset * gridLineNormal;
52+
position_modelspace += axes.gridOffset * gridLineNormal;
5853
5954
vec3 position_commonspace = project_position(position_modelspace);
6055
gl_Position = project_common_position_to_clipspace(vec4(position_commonspace, 1.0));
6156
62-
vColor = strokeColor / 255.0;
57+
vColor = axes.strokeColor / 255.0;
6358
}
6459
`;

examples/website/plot/plot-layer/label-vertex.glsl.ts

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@ in vec2 instancePositions;
1313
in vec3 instanceNormals;
1414
in float instanceOffsets;
1515
16-
uniform vec3 gridDims;
17-
uniform vec3 gridCenter;
18-
uniform float gridOffset;
19-
uniform vec3 labelWidths;
20-
uniform float fontSize;
21-
uniform float labelHeight;
2216
uniform sampler2D labelTexture;
2317
2418
out vec2 vTexCoords;
@@ -71,18 +65,18 @@ void main(void) {
7165
// +----------+----------+----------+
7266
// | ... | ... | ... |
7367
vec2 textureOrigin = vec2(
74-
sum3(vec3(0.0, labelWidths.x, sum2(labelWidths.xy)) * instanceNormals),
75-
instancePositions.y * labelHeight
68+
sum3(vec3(0.0, axes.labelWidths.x, sum2(axes.labelWidths.xy)) * instanceNormals),
69+
instancePositions.y * axes.labelHeight
7670
);
77-
vec2 labelSize = vec2(sum3(labelWidths * instanceNormals), labelHeight);
71+
vec2 labelSize = vec2(sum3(axes.labelWidths * instanceNormals), axes.labelHeight);
7872
vTexCoords = (textureOrigin + labelSize * texCoords) / vec2(textureSize(labelTexture, 0));
7973
8074
vec3 position_modelspace = vec3(instancePositions.x) *
81-
instanceNormals + gridVertexOffset * gridDims / 2.0 + gridCenter * abs(gridVertexOffset);
75+
instanceNormals + gridVertexOffset * axes.gridDims / 2.0 + axes.gridCenter * abs(gridVertexOffset);
8276
8377
// apply offsets
84-
position_modelspace += gridOffset * gridLineNormal;
85-
position_modelspace += project_pixel_size(fontSize * instanceOffsets) * gridVertexOffset;
78+
position_modelspace += axes.gridOffset * gridLineNormal;
79+
position_modelspace += project_pixel_size(axes.fontSize * instanceOffsets) * gridVertexOffset;
8680
8781
vec3 position_commonspace = project_position(position_modelspace);
8882
vec4 position_clipspace = project_common_position_to_clipspace(vec4(position_commonspace, 1.0));
@@ -91,7 +85,7 @@ void main(void) {
9185
// project to clipspace
9286
labelVertexOffset = project_pixel_size_to_clipspace(labelVertexOffset).xy;
9387
// scale label to be constant size in pixels
94-
labelVertexOffset *= fontSize / labelHeight * position_clipspace.w;
88+
labelVertexOffset *= axes.fontSize / axes.labelHeight * position_clipspace.w;
9589
9690
gl_Position = position_clipspace + vec4(labelVertexOffset, 0.0, 0.0);
9791

0 commit comments

Comments
 (0)