@luma.gl/engine 9.3.0-alpha.4 → 9.3.0-alpha.6

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 (88) hide show
  1. package/dist/animation-loop/animation-loop.d.ts +8 -4
  2. package/dist/animation-loop/animation-loop.d.ts.map +1 -1
  3. package/dist/animation-loop/animation-loop.js +70 -43
  4. package/dist/animation-loop/animation-loop.js.map +1 -1
  5. package/dist/animation-loop/make-animation-loop.js +7 -1
  6. package/dist/animation-loop/make-animation-loop.js.map +1 -1
  7. package/dist/animation-loop/request-animation-frame.d.ts.map +1 -1
  8. package/dist/animation-loop/request-animation-frame.js +23 -6
  9. package/dist/animation-loop/request-animation-frame.js.map +1 -1
  10. package/dist/dist.dev.js +679 -927
  11. package/dist/dist.min.js +39 -240
  12. package/dist/dynamic-texture/dynamic-texture.d.ts +3 -3
  13. package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -1
  14. package/dist/dynamic-texture/dynamic-texture.js +170 -52
  15. package/dist/dynamic-texture/dynamic-texture.js.map +1 -1
  16. package/dist/dynamic-texture/texture-data.d.ts +4 -0
  17. package/dist/dynamic-texture/texture-data.d.ts.map +1 -1
  18. package/dist/dynamic-texture/texture-data.js +8 -0
  19. package/dist/dynamic-texture/texture-data.js.map +1 -1
  20. package/dist/factories/pipeline-factory.d.ts +7 -5
  21. package/dist/factories/pipeline-factory.d.ts.map +1 -1
  22. package/dist/factories/pipeline-factory.js +71 -36
  23. package/dist/factories/pipeline-factory.js.map +1 -1
  24. package/dist/factories/shader-factory.d.ts +0 -3
  25. package/dist/factories/shader-factory.d.ts.map +1 -1
  26. package/dist/factories/shader-factory.js +13 -19
  27. package/dist/factories/shader-factory.js.map +1 -1
  28. package/dist/geometries/cone-geometry.d.ts +3 -1
  29. package/dist/geometries/cone-geometry.d.ts.map +1 -1
  30. package/dist/geometries/cone-geometry.js.map +1 -1
  31. package/dist/geometries/cylinder-geometry.d.ts +2 -1
  32. package/dist/geometries/cylinder-geometry.d.ts.map +1 -1
  33. package/dist/geometries/cylinder-geometry.js.map +1 -1
  34. package/dist/index.cjs +683 -922
  35. package/dist/index.cjs.map +4 -4
  36. package/dist/model/model.d.ts +3 -1
  37. package/dist/model/model.d.ts.map +1 -1
  38. package/dist/model/model.js +11 -9
  39. package/dist/model/model.js.map +1 -1
  40. package/dist/models/billboard-texture-model.d.ts.map +1 -1
  41. package/dist/models/billboard-texture-model.js +10 -8
  42. package/dist/models/billboard-texture-model.js.map +1 -1
  43. package/dist/models/clip-space.js +7 -7
  44. package/dist/modules/picking/index-picking.d.ts +1 -1
  45. package/dist/modules/picking/index-picking.d.ts.map +1 -1
  46. package/dist/modules/picking/index-picking.js +0 -6
  47. package/dist/modules/picking/index-picking.js.map +1 -1
  48. package/dist/passes/get-fragment-shader.js +11 -30
  49. package/dist/passes/get-fragment-shader.js.map +1 -1
  50. package/dist/passes/shader-pass-renderer.d.ts +0 -2
  51. package/dist/passes/shader-pass-renderer.d.ts.map +1 -1
  52. package/dist/passes/shader-pass-renderer.js +4 -31
  53. package/dist/passes/shader-pass-renderer.js.map +1 -1
  54. package/dist/scenegraph/group-node.d.ts +5 -0
  55. package/dist/scenegraph/group-node.d.ts.map +1 -1
  56. package/dist/scenegraph/group-node.js +12 -0
  57. package/dist/scenegraph/group-node.js.map +1 -1
  58. package/dist/scenegraph/model-node.d.ts +2 -2
  59. package/dist/scenegraph/model-node.d.ts.map +1 -1
  60. package/dist/scenegraph/model-node.js.map +1 -1
  61. package/dist/scenegraph/scenegraph-node.d.ts +1 -1
  62. package/dist/scenegraph/scenegraph-node.d.ts.map +1 -1
  63. package/dist/scenegraph/scenegraph-node.js +23 -15
  64. package/dist/scenegraph/scenegraph-node.js.map +1 -1
  65. package/package.json +2 -2
  66. package/src/animation-loop/animation-loop.ts +75 -46
  67. package/src/animation-loop/make-animation-loop.ts +13 -5
  68. package/src/animation-loop/request-animation-frame.ts +32 -6
  69. package/src/dynamic-texture/dynamic-texture.ts +226 -65
  70. package/src/dynamic-texture/texture-data.ts +14 -0
  71. package/src/factories/pipeline-factory.ts +87 -46
  72. package/src/factories/shader-factory.ts +16 -20
  73. package/src/geometries/cone-geometry.ts +6 -1
  74. package/src/geometries/cylinder-geometry.ts +5 -1
  75. package/src/model/model.ts +14 -10
  76. package/src/models/billboard-texture-model.ts +10 -8
  77. package/src/models/clip-space.ts +7 -7
  78. package/src/modules/picking/index-picking.ts +0 -6
  79. package/src/passes/get-fragment-shader.ts +11 -30
  80. package/src/passes/shader-pass-renderer.ts +4 -33
  81. package/src/scenegraph/group-node.ts +16 -0
  82. package/src/scenegraph/model-node.ts +2 -2
  83. package/src/scenegraph/scenegraph-node.ts +27 -16
  84. package/dist/dynamic-texture/mipmaps.d.ts +0 -6
  85. package/dist/dynamic-texture/mipmaps.d.ts.map +0 -1
  86. package/dist/dynamic-texture/mipmaps.js +0 -441
  87. package/dist/dynamic-texture/mipmaps.js.map +0 -1
  88. package/src/dynamic-texture/mipmaps.ts +0 -517
@@ -29,8 +29,6 @@ export class ShaderPassRenderer {
29
29
  shaderInputs: ShaderInputs;
30
30
  passRenderers: PassRenderer[];
31
31
  swapFramebuffers: SwapFramebuffers;
32
- /** For rendering to the screen */
33
- clipSpace: ClipSpace;
34
32
  textureModel: BackgroundTextureModel;
35
33
 
36
34
  constructor(device: Device, props: ShaderPassRendererProps) {
@@ -55,31 +53,6 @@ export class ShaderPassRenderer {
55
53
  backgroundTexture: this.swapFramebuffers.current.colorAttachments[0].texture
56
54
  });
57
55
 
58
- this.clipSpace = new ClipSpace(device, {
59
- source: /* wgsl */ `\
60
- @group(0) @binding(0) var sourceTexture: texture_2d<f32>;
61
- @group(0) @binding(1) var sourceTextureSampler: sampler;
62
-
63
- @fragment
64
- fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
65
- let texCoord: vec2<f32> = inputs.coordinate;
66
- return textureSample(sourceTexture, sourceTextureSampler, texCoord);
67
- }
68
- `,
69
-
70
- fs: /* glsl */ `\
71
- #version 300 es
72
-
73
- uniform sampler2D sourceTexture;
74
- in vec2 uv;
75
- out vec4 fragColor;
76
-
77
- void main() {
78
- fragColor = texture(sourceTexture, uv);
79
- }
80
- `
81
- });
82
-
83
56
  this.passRenderers = props.shaderPasses.map(shaderPass => new PassRenderer(device, shaderPass));
84
57
  }
85
58
 
@@ -89,7 +62,6 @@ void main() {
89
62
  subPassRenderer.destroy();
90
63
  }
91
64
  this.swapFramebuffers.destroy();
92
- this.clipSpace.destroy();
93
65
  this.textureModel.destroy();
94
66
  }
95
67
 
@@ -112,16 +84,15 @@ void main() {
112
84
 
113
85
  const framebuffer = this.device
114
86
  .getDefaultCanvasContext()
115
- // @ts-expect-error TODO - remove after republish
116
- .getCurrentFramebuffer({depthStencilAttachment: false});
87
+ .getCurrentFramebuffer({depthStencilFormat: false});
117
88
  const renderPass = this.device.beginRenderPass({
118
89
  id: 'shader-pass-renderer-to-screen',
119
90
  framebuffer,
120
91
  // clearColor: [1, 1, 0, 1],
121
- clearDepth: 1
92
+ clearDepth: false
122
93
  });
123
- this.clipSpace.setBindings({sourceTexture: outputTexture});
124
- this.clipSpace.draw(renderPass);
94
+ this.textureModel.setProps({backgroundTexture: outputTexture});
95
+ this.textureModel.draw(renderPass);
125
96
  renderPass.end();
126
97
  return true;
127
98
  }
@@ -108,4 +108,20 @@ export class GroupNode extends ScenegraphNode {
108
108
  }
109
109
  }
110
110
  }
111
+
112
+ preorderTraversal(
113
+ visitor: (node: ScenegraphNode, context: {worldMatrix: Matrix4}) => void,
114
+ {worldMatrix = new Matrix4()} = {}
115
+ ) {
116
+ const modelMatrix = new Matrix4(worldMatrix).multiplyRight(this.matrix);
117
+ visitor(this, {worldMatrix: modelMatrix});
118
+
119
+ for (const child of this.children) {
120
+ if (child instanceof GroupNode) {
121
+ child.preorderTraversal(visitor, {worldMatrix: modelMatrix});
122
+ } else {
123
+ visitor(child, {worldMatrix: modelMatrix});
124
+ }
125
+ }
126
+ }
111
127
  }
@@ -9,12 +9,12 @@ import {Model} from '../model/model';
9
9
  export type ModelNodeProps = ScenegraphNodeProps & {
10
10
  model: Model;
11
11
  managedResources?: any[];
12
- bounds?: [number[], number[]];
12
+ bounds?: [[number, number, number], [number, number, number]];
13
13
  };
14
14
 
15
15
  export class ModelNode extends ScenegraphNode {
16
16
  readonly model: Model;
17
- bounds: [number[], number[]] | null = null;
17
+ bounds: [[number, number, number], [number, number, number]] | null = null;
18
18
  managedResources: any[];
19
19
 
20
20
  // TODO - is this used? override callbacks to make sure we call them with this
@@ -5,6 +5,12 @@
5
5
  import {Vector3, Matrix4, NumericArray} from '@math.gl/core';
6
6
  import {uid} from '../utils/uid';
7
7
 
8
+ function assert(condition: boolean, message?: string): asserts condition {
9
+ if (!condition) {
10
+ throw new Error(message);
11
+ }
12
+ }
13
+
8
14
  /** Properties for creating a new Scenegraph */
9
15
  export type ScenegraphNodeProps = {
10
16
  id?: string;
@@ -57,19 +63,19 @@ export class ScenegraphNode {
57
63
  }
58
64
 
59
65
  setPosition(position: any): this {
60
- // assert(position.length === 3, 'setPosition requires vector argument');
66
+ assert(position.length === 3, 'setPosition requires vector argument');
61
67
  this.position = position;
62
68
  return this;
63
69
  }
64
70
 
65
71
  setRotation(rotation: any): this {
66
- // assert(rotation.length === 3, 'setRotation requires vector argument');
72
+ assert(rotation.length === 3 || rotation.length === 4, 'setRotation requires vector argument');
67
73
  this.rotation = rotation;
68
74
  return this;
69
75
  }
70
76
 
71
77
  setScale(scale: any): this {
72
- // assert(scale.length === 3, 'setScale requires vector argument');
78
+ assert(scale.length === 3, 'setScale requires vector argument');
73
79
  this.scale = scale;
74
80
  return this;
75
81
  }
@@ -105,19 +111,20 @@ export class ScenegraphNode {
105
111
  }
106
112
 
107
113
  updateMatrix(): this {
108
- const pos = this.position;
109
- const rot = this.rotation;
110
- const scale = this.scale;
111
-
112
114
  this.matrix.identity();
113
- this.matrix.translate(pos);
114
- this.matrix.rotateXYZ(rot);
115
- this.matrix.scale(scale);
115
+ this.matrix.translate(this.position);
116
+ if (this.rotation.length === 4) {
117
+ const rotationMatrix = new Matrix4().fromQuaternion(this.rotation);
118
+ this.matrix.multiplyRight(rotationMatrix);
119
+ } else {
120
+ this.matrix.rotateXYZ(this.rotation);
121
+ }
122
+ this.matrix.scale(this.scale);
123
+
116
124
  return this;
117
125
  }
118
126
 
119
- update(options: {position?: any; rotation?: any; scale?: any} = {}): this {
120
- const {position, rotation, scale} = options;
127
+ update({position, rotation, scale}: {position?: any; rotation?: any; scale?: any} = {}): this {
121
128
  if (position) {
122
129
  this.setPosition(position);
123
130
  }
@@ -127,7 +134,9 @@ export class ScenegraphNode {
127
134
  if (scale) {
128
135
  this.setScale(scale);
129
136
  }
137
+
130
138
  this.updateMatrix();
139
+
131
140
  return this;
132
141
  }
133
142
 
@@ -188,18 +197,20 @@ export class ScenegraphNode {
188
197
  // this.display = props.display;
189
198
  // }
190
199
 
191
- if ('position' in props) {
200
+ if (props?.position) {
192
201
  this.setPosition(props.position);
193
202
  }
194
- if ('rotation' in props) {
203
+ if (props?.rotation) {
195
204
  this.setRotation(props.rotation);
196
205
  }
197
- if ('scale' in props) {
206
+ if (props?.scale) {
198
207
  this.setScale(props.scale);
199
208
  }
200
209
 
210
+ this.updateMatrix();
211
+
201
212
  // Matrix overwrites other props
202
- if ('matrix' in props) {
213
+ if (props?.matrix) {
203
214
  this.setMatrix(props.matrix);
204
215
  }
205
216
 
@@ -1,6 +0,0 @@
1
- import type { Device, Texture } from '@luma.gl/core';
2
- /**
3
- * Generates mip levels from level 0 to the last mip for an existing texture.
4
- */
5
- export declare function generateMipmap(device: Device, texture: Texture): void;
6
- //# sourceMappingURL=mipmaps.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mipmaps.d.ts","sourceRoot":"","sources":["../../src/dynamic-texture/mipmaps.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,MAAM,EAAE,OAAO,EAAoC,MAAM,eAAe,CAAC;AAsBtF;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAwBrE"}
@@ -1,441 +0,0 @@
1
- // luma.gl
2
- // SPDX-License-Identifier: MIT
3
- // Copyright (c) vis.gl contributors
4
- import { Buffer, textureFormatDecoder } from '@luma.gl/core';
5
- import { Model } from "../model/model.js";
6
- import { Computation } from "../compute/computation.js";
7
- const RENDER_DIMENSIONS = [
8
- '2d',
9
- '2d-array',
10
- 'cube',
11
- 'cube-array'
12
- ];
13
- const WORKGROUP_SIZE = {
14
- x: 4,
15
- y: 4,
16
- z: 4
17
- };
18
- /**
19
- * Generates mip levels from level 0 to the last mip for an existing texture.
20
- */
21
- export function generateMipmap(device, texture) {
22
- if (texture.mipLevels <= 1) {
23
- return;
24
- }
25
- if (device.type !== 'webgpu') {
26
- throw new Error(`Cannot generate mipmaps on device type "${device.type}". Use generateMipmapsWebGL for WebGL devices.`);
27
- }
28
- if (texture.dimension === '3d') {
29
- generateMipmaps3D(device, texture);
30
- return;
31
- }
32
- if (RENDER_DIMENSIONS.includes(texture.dimension)) {
33
- generateMipmapsRender(device, texture);
34
- return;
35
- }
36
- throw new Error(`Cannot generate mipmaps for texture dimension "${texture.dimension}" with WebGPU.`);
37
- }
38
- function generateMipmapsRender(device, texture) {
39
- validateFormatCapabilities(device, texture, ['render', 'filter'], 'render');
40
- const colorAttachmentFormat = getColorAttachmentFormat(texture.format, 'render', texture.dimension);
41
- const viewDimension = texture.dimension;
42
- const shader = getRenderMipmapWGSL(viewDimension);
43
- const sampler = device.createSampler({ minFilter: 'linear', magFilter: 'linear' });
44
- const uniformValues = new Uint32Array(1);
45
- const uniformsBuffer = device.createBuffer({
46
- byteLength: 16,
47
- usage: Buffer.UNIFORM | Buffer.COPY_DST
48
- });
49
- const model = new Model(device, {
50
- source: shader,
51
- colorAttachmentFormats: [colorAttachmentFormat],
52
- topology: 'triangle-list',
53
- vertexCount: 3,
54
- shaderLayout: {
55
- attributes: [],
56
- bindings: [
57
- { type: 'sampler', name: 'sourceSampler', group: 0, location: 0 },
58
- {
59
- type: 'texture',
60
- name: 'sourceTexture',
61
- group: 0,
62
- location: 1,
63
- viewDimension,
64
- sampleType: 'float'
65
- },
66
- { type: 'uniform', name: 'uniforms', group: 0, location: 2 }
67
- ]
68
- },
69
- bindings: {
70
- sourceSampler: sampler,
71
- sourceTexture: texture,
72
- uniforms: uniformsBuffer
73
- }
74
- });
75
- let sourceWidth = texture.width;
76
- let sourceHeight = texture.height;
77
- const layerCount = texture.dimension === '2d' ? 1 : texture.depth;
78
- try {
79
- for (let baseMipLevel = 1; baseMipLevel < texture.mipLevels; ++baseMipLevel) {
80
- validateFormatCapabilities(device, texture, ['render', 'filter'], 'render');
81
- const sourceMipLevel = baseMipLevel - 1;
82
- const destinationWidth = Math.max(1, sourceWidth >> 1);
83
- const destinationHeight = Math.max(1, sourceHeight >> 1);
84
- const sourceView = texture.createView({
85
- dimension: viewDimension,
86
- baseMipLevel: sourceMipLevel,
87
- mipLevelCount: 1,
88
- baseArrayLayer: 0,
89
- arrayLayerCount: texture.depth
90
- });
91
- model.setBindings({ sourceTexture: sourceView });
92
- for (let baseArrayLayer = 0; baseArrayLayer < layerCount; ++baseArrayLayer) {
93
- uniformValues[0] = baseArrayLayer;
94
- uniformsBuffer.write(uniformValues);
95
- const destinationView = texture.createView({
96
- dimension: '2d',
97
- baseMipLevel,
98
- mipLevelCount: 1,
99
- baseArrayLayer,
100
- arrayLayerCount: 1
101
- });
102
- const framebuffer = device.createFramebuffer({
103
- colorAttachments: [destinationView]
104
- });
105
- const renderPass = device.beginRenderPass({
106
- id: `mipmap-generation:${texture.format}:${baseMipLevel}:${baseArrayLayer}`,
107
- framebuffer
108
- });
109
- renderPass.setParameters({
110
- viewport: [0, 0, destinationWidth, destinationHeight, 0, 1],
111
- scissorRect: [0, 0, destinationWidth, destinationHeight]
112
- });
113
- model.draw(renderPass);
114
- renderPass.end();
115
- device.submit();
116
- destinationView.destroy();
117
- framebuffer.destroy();
118
- }
119
- sourceView.destroy();
120
- sourceWidth = destinationWidth;
121
- sourceHeight = destinationHeight;
122
- }
123
- }
124
- finally {
125
- model.destroy();
126
- sampler.destroy();
127
- uniformsBuffer.destroy();
128
- }
129
- }
130
- function getColorAttachmentFormat(format, path, dimension) {
131
- if (textureFormatDecoder.isColor(format)) {
132
- return format;
133
- }
134
- throw new Error(`Cannot run ${path} mipmap generation for ${dimension} texture with format "${format}". ` +
135
- `Only color textures can be used for this operation. ` +
136
- `Required capabilities: color. ` +
137
- `Actual capabilities: color=false.`);
138
- }
139
- function generateMipmaps3D(device, texture) {
140
- validateFormatCapabilities(device, texture, ['filter', 'store'], 'compute');
141
- const format = getColorAttachmentFormat(texture.format, 'compute', texture.dimension);
142
- const shaderSource = get3DComputeMipmapWGSL(format);
143
- const uniformsBuffer = device.createBuffer({
144
- byteLength: 32,
145
- usage: Buffer.UNIFORM | Buffer.COPY_DST
146
- });
147
- const uniformValues = new Uint32Array(8);
148
- let sourceWidth = texture.width;
149
- let sourceHeight = texture.height;
150
- let sourceDepth = texture.depth;
151
- try {
152
- for (let destinationMipLevel = 1; destinationMipLevel < texture.mipLevels; ++destinationMipLevel) {
153
- validateFormatCapabilities(device, texture, ['filter', 'store'], 'compute');
154
- const destinationWidth = Math.max(1, sourceWidth >> 1);
155
- const destinationHeight = Math.max(1, sourceHeight >> 1);
156
- const destinationDepth = Math.max(1, sourceDepth >> 1);
157
- uniformValues[0] = sourceWidth;
158
- uniformValues[1] = sourceHeight;
159
- uniformValues[2] = sourceDepth;
160
- uniformValues[3] = destinationWidth;
161
- uniformValues[4] = destinationHeight;
162
- uniformValues[5] = destinationDepth;
163
- uniformValues[6] = 0;
164
- uniformsBuffer.write(uniformValues);
165
- const sourceView = texture.createView({
166
- dimension: '3d',
167
- baseMipLevel: destinationMipLevel - 1,
168
- mipLevelCount: 1,
169
- baseArrayLayer: 0,
170
- arrayLayerCount: 1
171
- });
172
- const destinationView = texture.createView({
173
- dimension: '3d',
174
- baseMipLevel: destinationMipLevel,
175
- mipLevelCount: 1,
176
- baseArrayLayer: 0,
177
- arrayLayerCount: 1
178
- });
179
- const computation = new Computation(device, {
180
- source: shaderSource,
181
- shaderLayout: {
182
- bindings: [
183
- {
184
- type: 'texture',
185
- name: 'sourceTexture',
186
- group: 0,
187
- location: 0,
188
- viewDimension: '3d',
189
- sampleType: 'float'
190
- },
191
- {
192
- type: 'storage',
193
- name: 'destinationTexture',
194
- group: 0,
195
- location: 1,
196
- format,
197
- viewDimension: '3d',
198
- access: 'write-only'
199
- },
200
- { type: 'uniform', name: 'uniforms', group: 0, location: 2 }
201
- ]
202
- },
203
- bindings: {
204
- sourceTexture: sourceView,
205
- destinationTexture: destinationView,
206
- uniforms: uniformsBuffer
207
- }
208
- });
209
- const workgroupsX = Math.ceil(destinationWidth / WORKGROUP_SIZE.x);
210
- const workgroupsY = Math.ceil(destinationHeight / WORKGROUP_SIZE.y);
211
- const workgroupsZ = Math.ceil(destinationDepth / WORKGROUP_SIZE.z);
212
- const computePass = device.beginComputePass({});
213
- computation.dispatch(computePass, workgroupsX, workgroupsY, workgroupsZ);
214
- computePass.end();
215
- device.submit();
216
- computation.destroy();
217
- sourceView.destroy();
218
- destinationView.destroy();
219
- sourceWidth = destinationWidth;
220
- sourceHeight = destinationHeight;
221
- sourceDepth = destinationDepth;
222
- }
223
- }
224
- finally {
225
- uniformsBuffer.destroy();
226
- }
227
- }
228
- function validateFormatCapabilities(device, texture, requiredCapabilities, path) {
229
- const { format, dimension } = texture;
230
- const capabilities = device.getTextureFormatCapabilities(format);
231
- const missingCapabilities = requiredCapabilities.filter(capability => !capabilities[capability]);
232
- if (missingCapabilities.length > 0) {
233
- const required = requiredCapabilities.join(' + ');
234
- const actual = requiredCapabilities
235
- .map(capability => `${capability}=${capabilities[capability]}`)
236
- .join(', ');
237
- throw new Error(`Cannot run ${path} mipmap generation for ${dimension} texture with format "${format}". ` +
238
- `Required capabilities: ${required}. ` +
239
- `Actual capabilities: ${actual}.`);
240
- }
241
- }
242
- function getSourceTextureType(dimension) {
243
- switch (dimension) {
244
- case '2d':
245
- return 'texture_2d<f32>';
246
- case '2d-array':
247
- return 'texture_2d_array<f32>';
248
- case 'cube':
249
- return 'texture_cube<f32>';
250
- case 'cube-array':
251
- return 'texture_cube_array<f32>';
252
- default:
253
- throw new Error(`Unsupported render dimension "${dimension}" for mipmap generation.`);
254
- }
255
- }
256
- function getRenderMipmapWGSL(dimension) {
257
- const sourceSnippet = getRenderMipmapSampleSnippet(dimension);
258
- return `
259
- struct MipmapUniforms {
260
- sourceLayer: u32,
261
- };
262
-
263
- fn _touchUniform(uniforms: MipmapUniforms) {
264
- let unusedSourceLayer = uniforms.sourceLayer;
265
- }
266
-
267
- const faceMat = array(
268
- mat3x3f(
269
- 0.0, 0.0, -2.0,
270
- 0.0, -2.0, 0.0,
271
- 1.0, 1.0, 1.0
272
- ), // pos-x
273
- mat3x3f(
274
- 0.0, 0.0, 2.0,
275
- 0.0, -2.0, 0.0,
276
- -1.0, 1.0, -1.0
277
- ), // neg-x
278
- mat3x3f(
279
- 2.0, 0.0, 0.0,
280
- 0.0, 0.0, 2.0,
281
- -1.0, 1.0, -1.0
282
- ), // pos-y
283
- mat3x3f(
284
- 2.0, 0.0, 0.0,
285
- 0.0, 0.0, -2.0,
286
- -1.0, -1.0, 1.0
287
- ), // neg-y
288
- mat3x3f(
289
- 2.0, 0.0, 0.0,
290
- 0.0, -2.0, 0.0,
291
- -1.0, 1.0, 1.0
292
- ), // pos-z
293
- mat3x3f(
294
- -2.0, 0.0, 0.0,
295
- 0.0, -2.0, 0.0,
296
- 1.0, 1.0, -1.0
297
- ) // neg-z
298
- );
299
-
300
- struct FragmentInputs {
301
- @builtin(position) position: vec4f,
302
- @location(0) texcoord: vec2f
303
- };
304
-
305
- struct VertexOutput {
306
- @builtin(position) position: vec4f,
307
- @location(0) texcoord: vec2f
308
- };
309
-
310
- @group(0) @binding(0) var sourceSampler: sampler;
311
- @group(0) @binding(1) var sourceTexture: ${getSourceTextureType(dimension)};
312
- @group(0) @binding(2) var<uniform> uniforms: MipmapUniforms;
313
-
314
- @vertex
315
- fn vertexMain(
316
- @builtin(vertex_index) vertexIndex: u32
317
- ) -> VertexOutput {
318
- const positions = array(
319
- vec2f(-1.0, -1.0),
320
- vec2f(-1.0, 3.0),
321
- vec2f( 3.0, -1.0)
322
- );
323
-
324
- let xy = positions[vertexIndex];
325
- return VertexOutput(
326
- vec4f(xy, 0.0, 1.0),
327
- xy * vec2f(0.5, -0.5) + vec2f(0.5)
328
- );
329
- }
330
-
331
- @fragment
332
- fn fragmentMain(fsInput: VertexOutput) -> @location(0) vec4f {
333
- _touchUniform(uniforms);
334
- return ${sourceSnippet};
335
- }
336
- `;
337
- }
338
- function getRenderMipmapSampleSnippet(dimension) {
339
- const layer = 'uniforms.sourceLayer';
340
- switch (dimension) {
341
- case '2d':
342
- return 'textureSampleLevel(sourceTexture, sourceSampler, fsInput.texcoord, 0.0)';
343
- case '2d-array':
344
- return ('textureSampleLevel(sourceTexture, sourceSampler, fsInput.texcoord, ' +
345
- `i32(${layer}), 0.0)`);
346
- case 'cube':
347
- return ('textureSampleLevel(sourceTexture, sourceSampler, ' +
348
- `faceMat[i32(${layer})] * vec3f(fract(fsInput.texcoord), 1.0), 0.0)`);
349
- case 'cube-array':
350
- return ('textureSampleLevel(sourceTexture, sourceSampler, ' +
351
- `faceMat[i32(${layer} % 6u)] * vec3f(fract(fsInput.texcoord), 1.0), ` +
352
- `i32(${layer} / 6u), 0.0)`);
353
- default:
354
- throw new Error(`Unsupported render dimension "${dimension}" for mipmap generation.`);
355
- }
356
- }
357
- function get3DComputeMipmapWGSL(format) {
358
- return `
359
- struct MipmapUniforms {
360
- sourceWidth: u32,
361
- sourceHeight: u32,
362
- sourceDepth: u32,
363
- destinationWidth: u32,
364
- destinationHeight: u32,
365
- destinationDepth: u32,
366
- padding: u32,
367
- };
368
-
369
- @group(0) @binding(0) var sourceTexture: texture_3d<f32>;
370
- @group(0) @binding(1) var destinationTexture: texture_storage_3d<${format}, write>;
371
- @group(0) @binding(2) var<uniform> uniforms: MipmapUniforms;
372
-
373
- @compute @workgroup_size(${WORKGROUP_SIZE.x}, ${WORKGROUP_SIZE.y}, ${WORKGROUP_SIZE.z})
374
- fn main(@builtin(global_invocation_id) id: vec3<u32>) {
375
- if (
376
- id.x >= uniforms.destinationWidth ||
377
- id.y >= uniforms.destinationHeight ||
378
- id.z >= uniforms.destinationDepth
379
- ) {
380
- return;
381
- }
382
-
383
- let sourceBase = id * 2u;
384
- let sourceX0 = min(sourceBase.x, uniforms.sourceWidth - 1u);
385
- let sourceY0 = min(sourceBase.y, uniforms.sourceHeight - 1u);
386
- let sourceZ0 = min(sourceBase.z, uniforms.sourceDepth - 1u);
387
-
388
- let sourceX1 = min(sourceBase.x + 1u, uniforms.sourceWidth - 1u);
389
- let sourceY1 = min(sourceBase.y + 1u, uniforms.sourceHeight - 1u);
390
- let sourceZ1 = min(sourceBase.z + 1u, uniforms.sourceDepth - 1u);
391
-
392
- var sum = textureLoad(
393
- sourceTexture,
394
- vec3<i32>(i32(sourceX0), i32(sourceY0), i32(sourceZ0)),
395
- 0
396
- );
397
- sum += textureLoad(
398
- sourceTexture,
399
- vec3<i32>(i32(sourceX1), i32(sourceY0), i32(sourceZ0)),
400
- 0
401
- );
402
- sum += textureLoad(
403
- sourceTexture,
404
- vec3<i32>(i32(sourceX0), i32(sourceY1), i32(sourceZ0)),
405
- 0
406
- );
407
- sum += textureLoad(
408
- sourceTexture,
409
- vec3<i32>(i32(sourceX1), i32(sourceY1), i32(sourceZ0)),
410
- 0
411
- );
412
- sum += textureLoad(
413
- sourceTexture,
414
- vec3<i32>(i32(sourceX0), i32(sourceY0), i32(sourceZ1)),
415
- 0
416
- );
417
- sum += textureLoad(
418
- sourceTexture,
419
- vec3<i32>(i32(sourceX1), i32(sourceY0), i32(sourceZ1)),
420
- 0
421
- );
422
- sum += textureLoad(
423
- sourceTexture,
424
- vec3<i32>(i32(sourceX0), i32(sourceY1), i32(sourceZ1)),
425
- 0
426
- );
427
- sum += textureLoad(
428
- sourceTexture,
429
- vec3<i32>(i32(sourceX1), i32(sourceY1), i32(sourceZ1)),
430
- 0
431
- );
432
-
433
- textureStore(
434
- destinationTexture,
435
- vec3<i32>(i32(id.x), i32(id.y), i32(id.z)),
436
- vec4<f32>(sum.xyz / 8.0, sum.w / 8.0)
437
- );
438
- }
439
- `;
440
- }
441
- //# sourceMappingURL=mipmaps.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mipmaps.js","sourceRoot":"","sources":["../../src/dynamic-texture/mipmaps.ts"],"names":[],"mappings":"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"}