@plasius/gpu-renderer 0.1.12 → 0.1.14

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasius/gpu-renderer",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "description": "Framework-agnostic WebGPU renderer runtime for Plasius projects.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -27,7 +27,7 @@
27
27
  "scripts": {
28
28
  "build": "tsup",
29
29
  "demo": "python3 -m http.server --directory ..",
30
- "typecheck": "node --check src/index.js",
30
+ "typecheck": "node --check src/index.js && node --check src/wavefront-compute.js",
31
31
  "audit:eslint": "eslint . --max-warnings=0",
32
32
  "audit:deps": "npm ls --all --omit=optional --omit=peer > /dev/null 2>&1 || true",
33
33
  "audit:npm": "npm audit --audit-level=high --omit=dev",
@@ -49,7 +49,6 @@
49
49
  "author": "Plasius LTD <development@plasius.co.uk>",
50
50
  "license": "Apache-2.0",
51
51
  "dependencies": {
52
- "@plasius/gpu-shared": "^0.1.9",
53
52
  "@plasius/gpu-xr": "^0.1.11"
54
53
  },
55
54
  "devDependencies": {
package/src/index.d.ts CHANGED
@@ -1,4 +1,490 @@
1
1
  export type RendererColor = string | [number, number, number, number?];
2
+ export type WavefrontSceneObjectKind = "sphere" | "box" | "aabb" | "bounds" | number;
3
+ export type WavefrontMaterialKind =
4
+ | "diffuse"
5
+ | "metal"
6
+ | "reflective"
7
+ | "dielectric"
8
+ | "refractive"
9
+ | "glass"
10
+ | "transparent"
11
+ | "transmission"
12
+ | "emissive"
13
+ | "light"
14
+ | number;
15
+
16
+ export interface WavefrontCameraOptions {
17
+ readonly position?: readonly [number, number, number] | readonly number[];
18
+ readonly target?: readonly [number, number, number] | readonly number[];
19
+ readonly up?: readonly [number, number, number] | readonly number[];
20
+ readonly fovYDegrees?: number;
21
+ readonly fov?: number;
22
+ }
23
+
24
+ export interface WavefrontSceneObjectInput {
25
+ readonly id?: number;
26
+ readonly kind?: WavefrontSceneObjectKind;
27
+ readonly type?: WavefrontSceneObjectKind;
28
+ readonly materialKind?: WavefrontMaterialKind;
29
+ readonly flags?: number;
30
+ readonly center?: readonly [number, number, number] | readonly number[];
31
+ readonly position?: readonly [number, number, number] | readonly number[];
32
+ readonly radius?: number;
33
+ readonly halfExtent?: readonly [number, number, number] | readonly number[];
34
+ readonly halfExtents?: readonly [number, number, number] | readonly number[];
35
+ readonly extents?: readonly [number, number, number] | readonly number[];
36
+ readonly min?: readonly [number, number, number] | readonly number[];
37
+ readonly max?: readonly [number, number, number] | readonly number[];
38
+ readonly bounds?: {
39
+ readonly min?: readonly [number, number, number] | readonly number[];
40
+ readonly max?: readonly [number, number, number] | readonly number[];
41
+ };
42
+ readonly color?: RendererColor | readonly number[];
43
+ readonly baseColor?: RendererColor | readonly number[];
44
+ readonly albedo?: RendererColor | readonly number[];
45
+ readonly emission?: readonly [number, number, number, number?] | readonly number[];
46
+ readonly emissive?: readonly [number, number, number, number?] | readonly number[];
47
+ readonly roughness?: number;
48
+ readonly metallic?: number;
49
+ readonly opacity?: number;
50
+ readonly ior?: number;
51
+ readonly material?: {
52
+ readonly kind?: WavefrontMaterialKind;
53
+ readonly color?: RendererColor | readonly number[];
54
+ readonly baseColor?: RendererColor | readonly number[];
55
+ readonly emission?: readonly [number, number, number, number?] | readonly number[];
56
+ readonly emissive?: readonly [number, number, number, number?] | readonly number[];
57
+ readonly roughness?: number;
58
+ readonly metallic?: number;
59
+ readonly opacity?: number;
60
+ readonly ior?: number;
61
+ };
62
+ }
63
+
64
+ export interface WavefrontSceneObject {
65
+ readonly id: number;
66
+ readonly kind: number;
67
+ readonly materialKind: number;
68
+ readonly flags: number;
69
+ readonly center: readonly [number, number, number] | readonly number[];
70
+ readonly halfExtent: readonly [number, number, number] | readonly number[];
71
+ readonly color: readonly [number, number, number, number] | readonly number[];
72
+ readonly emission: readonly [number, number, number, number] | readonly number[];
73
+ readonly roughness: number;
74
+ readonly metallic: number;
75
+ readonly opacity: number;
76
+ readonly ior: number;
77
+ }
78
+
79
+ export interface WavefrontMeshInput {
80
+ readonly id?: number;
81
+ readonly positions: readonly number[] | Float32Array;
82
+ readonly indices?: readonly number[] | Uint16Array | Uint32Array;
83
+ readonly normals?: readonly number[] | Float32Array | null;
84
+ readonly uvs?: readonly number[] | Float32Array | null;
85
+ readonly texcoords?: readonly number[] | Float32Array | null;
86
+ readonly uv?: readonly number[] | Float32Array | null;
87
+ readonly materialKind?: WavefrontMaterialKind;
88
+ readonly flags?: number;
89
+ readonly materialRefId?: number;
90
+ readonly materialId?: number;
91
+ readonly mediumRefId?: number;
92
+ readonly mediumId?: number;
93
+ readonly color?: RendererColor | readonly number[];
94
+ readonly baseColor?: RendererColor | readonly number[];
95
+ readonly albedo?: RendererColor | readonly number[];
96
+ readonly emission?: readonly [number, number, number, number?] | readonly number[];
97
+ readonly emissive?: readonly [number, number, number, number?] | readonly number[];
98
+ readonly roughness?: number;
99
+ readonly metallic?: number;
100
+ readonly opacity?: number;
101
+ readonly ior?: number;
102
+ readonly material?: {
103
+ readonly kind?: WavefrontMaterialKind;
104
+ readonly color?: RendererColor | readonly number[];
105
+ readonly baseColor?: RendererColor | readonly number[];
106
+ readonly emission?: readonly [number, number, number, number?] | readonly number[];
107
+ readonly emissive?: readonly [number, number, number, number?] | readonly number[];
108
+ readonly roughness?: number;
109
+ readonly metallic?: number;
110
+ readonly opacity?: number;
111
+ readonly ior?: number;
112
+ readonly id?: number;
113
+ };
114
+ readonly medium?: {
115
+ readonly id?: number;
116
+ };
117
+ }
118
+
119
+ export interface WavefrontTriangleRecord {
120
+ readonly triangleId: number;
121
+ readonly meshId: number;
122
+ readonly materialKind: number;
123
+ readonly flags: number;
124
+ readonly materialRefId: number;
125
+ readonly mediumRefId: number;
126
+ readonly v0: readonly number[];
127
+ readonly v1: readonly number[];
128
+ readonly v2: readonly number[];
129
+ readonly n0: readonly number[];
130
+ readonly n1: readonly number[];
131
+ readonly n2: readonly number[];
132
+ readonly uv0: readonly number[];
133
+ readonly uv1: readonly number[];
134
+ readonly uv2: readonly number[];
135
+ readonly color: readonly number[];
136
+ readonly emission: readonly number[];
137
+ readonly material: readonly number[];
138
+ readonly bounds: Readonly<{ min: readonly number[]; max: readonly number[] }>;
139
+ readonly centroid: readonly number[];
140
+ }
141
+
142
+ export interface WavefrontBvhNodeRecord {
143
+ readonly bounds: Readonly<{ min: readonly number[]; max: readonly number[] }>;
144
+ readonly firstTriangle: number;
145
+ readonly triangleCount: number;
146
+ readonly leftChild: number;
147
+ readonly rightChild: number;
148
+ }
149
+
150
+ export interface WavefrontBvhBuildLevel {
151
+ readonly start: number;
152
+ readonly count: number;
153
+ }
154
+
155
+ export interface WavefrontBvhSortStage {
156
+ readonly compareDistance: number;
157
+ readonly sequenceSize: number;
158
+ }
159
+
160
+ export interface WavefrontMeshAcceleration {
161
+ readonly nodes: readonly WavefrontBvhNodeRecord[];
162
+ readonly triangles: readonly WavefrontTriangleRecord[];
163
+ }
164
+
165
+ export type WavefrontAccelerationBuildMode = "gpu" | "cpu-debug";
166
+
167
+ export interface WavefrontGpuMeshSource {
168
+ readonly vertices: Readonly<{
169
+ readonly buffer: ArrayBuffer;
170
+ readonly count: number;
171
+ readonly recordBytes: number;
172
+ }>;
173
+ readonly indices: Readonly<{
174
+ readonly buffer: ArrayBuffer;
175
+ readonly count: number;
176
+ readonly recordBytes: 4;
177
+ }>;
178
+ readonly meshes: Readonly<{
179
+ readonly buffer: ArrayBuffer;
180
+ readonly records: readonly Readonly<{
181
+ readonly id: number;
182
+ readonly positions: readonly number[];
183
+ readonly indices: readonly number[];
184
+ readonly normals: readonly number[] | null;
185
+ readonly uvs: readonly number[] | null;
186
+ readonly materialKind: number;
187
+ readonly flags: number;
188
+ readonly materialRefId: number;
189
+ readonly mediumRefId: number;
190
+ readonly color: readonly number[];
191
+ readonly emission: readonly number[];
192
+ readonly roughness: number;
193
+ readonly metallic: number;
194
+ readonly opacity: number;
195
+ readonly ior: number;
196
+ }>[];
197
+ readonly count: number;
198
+ readonly recordBytes: number;
199
+ }>;
200
+ readonly triangleCount: number;
201
+ readonly bvhNodeCapacity: number;
202
+ }
203
+
204
+ export interface WavefrontEmissiveTriangleIndexSource {
205
+ readonly buffer: ArrayBuffer;
206
+ readonly indices: readonly number[];
207
+ readonly count: number;
208
+ readonly capacity: number;
209
+ readonly recordBytes: 4;
210
+ }
211
+
212
+ export interface WavefrontPathTracingComputeConfig {
213
+ readonly width: number;
214
+ readonly height: number;
215
+ readonly maxDepth: number;
216
+ readonly tileSize: number;
217
+ readonly samplesPerPixel: number;
218
+ readonly tilePixelCapacity: number;
219
+ readonly sceneObjects: readonly WavefrontSceneObject[];
220
+ readonly sceneObjectCount: number;
221
+ readonly sceneObjectCapacity: number;
222
+ readonly accelerationBuildMode: WavefrontAccelerationBuildMode;
223
+ readonly gpuAccelerationBuildRequired: boolean;
224
+ readonly gpuMeshSource: WavefrontGpuMeshSource;
225
+ readonly meshAcceleration: WavefrontMeshAcceleration;
226
+ readonly emissiveTriangleIndices: WavefrontEmissiveTriangleIndexSource;
227
+ readonly emissiveTriangleCount: number;
228
+ readonly emissiveTriangleCapacity: number;
229
+ readonly triangleCount: number;
230
+ readonly triangleCapacity: number;
231
+ readonly bvhNodeCount: number;
232
+ readonly bvhNodeCapacity: number;
233
+ readonly bvhLeafSortCapacity: number;
234
+ readonly bvhSortStages: readonly WavefrontBvhSortStage[];
235
+ readonly bvhBuildLevels: readonly WavefrontBvhBuildLevel[];
236
+ readonly camera: Readonly<{
237
+ readonly position: readonly number[];
238
+ readonly forward: readonly number[];
239
+ readonly right: readonly number[];
240
+ readonly up: readonly number[];
241
+ readonly fovYDegrees: number;
242
+ readonly aspect: number;
243
+ readonly tanHalfFovY: number;
244
+ }>;
245
+ readonly environmentColor: readonly [number, number, number, number] | readonly number[];
246
+ readonly ambientColor: readonly [number, number, number, number] | readonly number[];
247
+ readonly environmentLighting: WavefrontEnvironmentLightingConfig;
248
+ readonly displayQuality: boolean;
249
+ readonly requiresMeshBvhForDisplayQuality: true;
250
+ readonly denoise: boolean;
251
+ readonly frameIndex: number;
252
+ readonly memory: WavefrontPathTracingMemoryEstimate;
253
+ }
254
+
255
+ export interface WavefrontEnvironmentLightingInput {
256
+ readonly environmentColor?: readonly [number, number, number, number?] | readonly number[];
257
+ readonly ambientColor?: readonly [number, number, number, number?] | readonly number[];
258
+ readonly horizonColor?: readonly [number, number, number, number?] | readonly number[];
259
+ readonly zenithColor?: readonly [number, number, number, number?] | readonly number[];
260
+ readonly sunDirection?: readonly [number, number, number] | readonly number[];
261
+ readonly sunColor?: readonly [number, number, number, number?] | readonly number[];
262
+ readonly intensity?: number;
263
+ readonly mode?: number;
264
+ readonly exposure?: number;
265
+ }
266
+
267
+ export interface WavefrontEnvironmentLightingConfig {
268
+ readonly environmentColor: readonly [number, number, number, number] | readonly number[];
269
+ readonly ambientColor: readonly [number, number, number, number] | readonly number[];
270
+ readonly horizonColor: readonly [number, number, number, number] | readonly number[];
271
+ readonly zenithColor: readonly [number, number, number, number] | readonly number[];
272
+ readonly sunDirection: readonly [number, number, number] | readonly number[];
273
+ readonly sunColor: readonly [number, number, number, number] | readonly number[];
274
+ readonly intensity: number;
275
+ readonly mode: number;
276
+ readonly exposure: number;
277
+ }
278
+
279
+ export interface WavefrontPathTracingMemoryEstimate {
280
+ readonly queueBytes: number;
281
+ readonly queuePairBytes: number;
282
+ readonly hitBytes: number;
283
+ readonly accumulationBytes: number;
284
+ readonly sceneObjectBytes: number;
285
+ readonly triangleBytes: number;
286
+ readonly bvhNodeBytes: number;
287
+ readonly bvhLeafReferenceBytes: number;
288
+ readonly emissiveTriangleMetadataBytes: number;
289
+ readonly configBytes: number;
290
+ readonly counterBytes: number;
291
+ readonly totalHotBufferBytes: number;
292
+ }
293
+
294
+ export interface CreateWavefrontPathTracingComputeRendererOptions {
295
+ readonly canvas?: HTMLCanvasElement | string;
296
+ readonly navigator?: Navigator | { gpu?: GPU };
297
+ readonly document?: Document;
298
+ readonly powerPreference?: GPUPowerPreference;
299
+ readonly alpha?: boolean;
300
+ readonly format?: GPUTextureFormat;
301
+ readonly width?: number;
302
+ readonly height?: number;
303
+ readonly maxDepth?: number;
304
+ readonly tileSize?: number;
305
+ readonly samplesPerPixel?: number;
306
+ readonly tilePixelCapacity?: number;
307
+ readonly sceneObjectCapacity?: number;
308
+ readonly sceneObjects?: readonly WavefrontSceneObjectInput[];
309
+ readonly mesh?: WavefrontMeshInput;
310
+ readonly meshes?: readonly WavefrontMeshInput[];
311
+ readonly triangleCapacity?: number;
312
+ readonly bvhNodeCapacity?: number;
313
+ readonly bvhLeafSortCapacity?: number;
314
+ readonly emissiveTriangleCapacity?: number;
315
+ readonly accelerationBuildMode?: WavefrontAccelerationBuildMode;
316
+ readonly camera?: WavefrontCameraOptions;
317
+ readonly environmentColor?: readonly [number, number, number, number?] | readonly number[];
318
+ readonly ambientColor?: readonly [number, number, number, number?] | readonly number[];
319
+ readonly environmentLighting?: WavefrontEnvironmentLightingInput;
320
+ readonly displayQuality?: boolean;
321
+ readonly denoise?: boolean;
322
+ readonly frameIndex?: number;
323
+ }
324
+
325
+ export interface WavefrontPathTracingComputeRenderer {
326
+ readonly canvas: HTMLCanvasElement;
327
+ readonly context: GPUCanvasContext;
328
+ readonly device: GPUDevice;
329
+ readonly format: GPUTextureFormat | string;
330
+ readonly config: WavefrontPathTracingComputeConfig;
331
+ renderOnce(): Readonly<{
332
+ frame: number;
333
+ width: number;
334
+ height: number;
335
+ maxDepth: number;
336
+ tiles: number;
337
+ tileSize: number;
338
+ samplesPerPixel: number;
339
+ screenRays: number;
340
+ primaryRays: number;
341
+ sceneObjectCount: number;
342
+ triangleCount: number;
343
+ emissiveTriangleCount: number;
344
+ bvhNodeCount: number;
345
+ displayQuality: boolean;
346
+ accelerationBuildMode: WavefrontAccelerationBuildMode;
347
+ gpuAccelerationBuildRequired: boolean;
348
+ memory: WavefrontPathTracingMemoryEstimate;
349
+ }>;
350
+ readOutputProbe(options?: { x?: number; y?: number }): Promise<
351
+ Readonly<{
352
+ x: number;
353
+ y: number;
354
+ rgba: readonly number[];
355
+ luminance: number;
356
+ }>
357
+ >;
358
+ updateSceneObjects(sceneObjects: readonly WavefrontSceneObjectInput[]): WavefrontPathTracingComputeConfig;
359
+ getSnapshot(): Readonly<{
360
+ frame: number;
361
+ width: number;
362
+ height: number;
363
+ maxDepth: number;
364
+ tiles: number;
365
+ tileSize: number;
366
+ samplesPerPixel: number;
367
+ sceneObjectCount: number;
368
+ triangleCount: number;
369
+ emissiveTriangleCount: number;
370
+ bvhNodeCount: number;
371
+ displayQuality: boolean;
372
+ accelerationBuildMode: WavefrontAccelerationBuildMode;
373
+ gpuAccelerationBuildRequired: boolean;
374
+ memory: WavefrontPathTracingMemoryEstimate;
375
+ }>;
376
+ destroy(): void;
377
+ }
378
+
379
+ export function normalizeWavefrontSceneObject(
380
+ input?: WavefrontSceneObjectInput,
381
+ index?: number
382
+ ): WavefrontSceneObject;
383
+ export function createDefaultWavefrontSceneObjects(): readonly WavefrontSceneObject[];
384
+ export function estimateWavefrontPathTracingMemory(options?: {
385
+ tilePixelCapacity?: number;
386
+ sceneObjectCapacity?: number;
387
+ triangleCapacity?: number;
388
+ bvhNodeCapacity?: number;
389
+ bvhLeafSortCapacity?: number;
390
+ emissiveTriangleCapacity?: number;
391
+ }): WavefrontPathTracingMemoryEstimate;
392
+ export function normalizeWavefrontMesh(
393
+ input: WavefrontMeshInput,
394
+ meshIndex?: number
395
+ ): Readonly<{
396
+ id: number;
397
+ positions: readonly number[];
398
+ indices: readonly number[];
399
+ normals: readonly number[] | null;
400
+ uvs: readonly number[] | null;
401
+ materialKind: number;
402
+ flags: number;
403
+ materialRefId: number;
404
+ mediumRefId: number;
405
+ color: readonly number[];
406
+ emission: readonly number[];
407
+ roughness: number;
408
+ metallic: number;
409
+ opacity: number;
410
+ ior: number;
411
+ }>;
412
+ export function createWavefrontMeshAcceleration(
413
+ meshes?: readonly WavefrontMeshInput[] | WavefrontMeshInput
414
+ ): WavefrontMeshAcceleration;
415
+ export function createWavefrontGpuMeshSource(
416
+ meshes?: readonly WavefrontMeshInput[] | WavefrontMeshInput
417
+ ): WavefrontGpuMeshSource;
418
+ export function createWavefrontEmissiveTriangleIndexSource(
419
+ meshes?: readonly WavefrontMeshInput[] | WavefrontMeshInput,
420
+ capacity?: number
421
+ ): WavefrontEmissiveTriangleIndexSource;
422
+ export function createWavefrontBvhBuildLevels(
423
+ triangleCount: number
424
+ ): readonly WavefrontBvhBuildLevel[];
425
+ export function createWavefrontBvhSortStages(
426
+ itemCount: number
427
+ ): readonly WavefrontBvhSortStage[];
428
+ export function createWavefrontPathTracingComputeConfig(
429
+ options?: CreateWavefrontPathTracingComputeRendererOptions
430
+ ): WavefrontPathTracingComputeConfig;
431
+ export function packWavefrontSceneObjects(
432
+ sceneObjects: readonly WavefrontSceneObjectInput[],
433
+ capacity?: number
434
+ ): Readonly<{
435
+ buffer: ArrayBuffer;
436
+ objects: readonly WavefrontSceneObject[];
437
+ count: number;
438
+ capacity: number;
439
+ }>;
440
+ export function packWavefrontTriangles(
441
+ triangles: readonly WavefrontTriangleRecord[],
442
+ capacity?: number
443
+ ): Readonly<{
444
+ buffer: ArrayBuffer;
445
+ triangles: readonly WavefrontTriangleRecord[];
446
+ count: number;
447
+ capacity: number;
448
+ }>;
449
+ export function packWavefrontBvhNodes(
450
+ nodes: readonly WavefrontBvhNodeRecord[],
451
+ capacity?: number
452
+ ): Readonly<{
453
+ buffer: ArrayBuffer;
454
+ nodes: readonly WavefrontBvhNodeRecord[];
455
+ count: number;
456
+ capacity: number;
457
+ }>;
458
+ export function supportsWavefrontPathTracingCompute(options?: {
459
+ navigator?: Navigator | { gpu?: GPU };
460
+ }): boolean;
461
+ export function createWavefrontPathTracingComputeRenderer(
462
+ options?: CreateWavefrontPathTracingComputeRendererOptions
463
+ ): Promise<WavefrontPathTracingComputeRenderer>;
464
+
465
+ export const wavefrontPathTracingComputeLimits: Readonly<{
466
+ workgroupSize: 64;
467
+ rayRecordBytes: 80;
468
+ hitRecordBytes: 192;
469
+ sceneObjectRecordBytes: 96;
470
+ meshVertexRecordBytes: 48;
471
+ meshRangeRecordBytes: 96;
472
+ triangleRecordBytes: 208;
473
+ bvhNodeRecordBytes: 48;
474
+ bvhLeafReferenceRecordBytes: 16;
475
+ accumulationRecordBytes: 16;
476
+ }>;
477
+ export const wavefrontSceneObjectKinds: Readonly<{
478
+ sphere: 1;
479
+ box: 2;
480
+ }>;
481
+ export const wavefrontMaterialKinds: Readonly<{
482
+ diffuse: 0;
483
+ metal: 1;
484
+ dielectric: 2;
485
+ transparent: 3;
486
+ emissive: 4;
487
+ }>;
2
488
 
3
489
  export interface RendererFrameEvent {
4
490
  frame: number;
@@ -151,6 +637,19 @@ export type RendererAccelerationStructureUpdateClass =
151
637
  | "rigid-dynamic"
152
638
  | "deforming"
153
639
  | "proxy";
640
+ export type RendererWavefrontHitType =
641
+ | "surface"
642
+ | "emissive"
643
+ | "environment"
644
+ | "transparent"
645
+ | "miss";
646
+ export type RendererWavefrontPassKey =
647
+ | "generatePrimaryRays"
648
+ | "intersectActiveQueue"
649
+ | "resolveSurfaceRecords"
650
+ | "accumulateTerminalRadiance"
651
+ | "scatterContinuations"
652
+ | "compactAndSwapQueues";
154
653
 
155
654
  export interface RendererInputBoundary {
156
655
  readonly type: "stable-visual-snapshot";
@@ -288,9 +787,75 @@ export interface RayTracingRenderPlan {
288
787
  }
289
788
  )[];
290
789
  readonly accelerationStructureUpdates: readonly RendererAccelerationStructureUpdatePolicy[];
790
+ readonly wavefront: RendererWavefrontPathTracingPlan;
291
791
  readonly workerManifest: RendererWorkerManifest;
292
792
  }
293
793
 
794
+ export interface RendererWavefrontFieldContract {
795
+ readonly name: string;
796
+ readonly type: string;
797
+ readonly description: string;
798
+ }
799
+
800
+ export interface RendererWavefrontRecordContract {
801
+ readonly schemaVersion: typeof rendererWavefrontBufferSchemaVersion;
802
+ readonly recordName: string;
803
+ readonly fields: readonly RendererWavefrontFieldContract[];
804
+ }
805
+
806
+ export interface RendererWavefrontQueueDescriptor {
807
+ readonly name: "active" | "next";
808
+ readonly role: "current-bounce" | "next-bounce";
809
+ }
810
+
811
+ export interface RendererWavefrontBounceStep {
812
+ readonly bounce: number;
813
+ readonly readQueue: "active" | "next";
814
+ readonly writeQueue: "active" | "next";
815
+ readonly passOrder: readonly RendererWavefrontPassKey[];
816
+ }
817
+
818
+ export interface RendererWavefrontTerminationPolicy {
819
+ readonly terminalHitTypes: readonly RendererWavefrontHitType[];
820
+ readonly continuationHitTypes: readonly RendererWavefrontHitType[];
821
+ readonly emissive: Readonly<{
822
+ action: "accumulate-and-stop";
823
+ contributesRadiance: true;
824
+ }>;
825
+ readonly environment: Readonly<{
826
+ action: "accumulate-and-stop";
827
+ contributesRadiance: true;
828
+ }>;
829
+ readonly miss: Readonly<{
830
+ action: "accumulate-environment-or-dark-stop";
831
+ contributesRadiance: true;
832
+ }>;
833
+ }
834
+
835
+ export interface RendererWavefrontPathTracingPlan {
836
+ readonly schemaVersion: typeof rendererWavefrontBufferSchemaVersion;
837
+ readonly owner: typeof rendererDebugOwner;
838
+ readonly maxDepth: number;
839
+ readonly queueCapacity: number;
840
+ readonly explicitLightSampling: boolean;
841
+ readonly accumulationResetEpoch: number;
842
+ readonly queueLayout: Readonly<{
843
+ strategy: typeof rendererWavefrontQueuePairStrategy;
844
+ compactAfterScatter: true;
845
+ queues: readonly RendererWavefrontQueueDescriptor[];
846
+ }>;
847
+ readonly bufferContracts: Readonly<{
848
+ ray: RendererWavefrontRecordContract;
849
+ hit: RendererWavefrontRecordContract;
850
+ surface: RendererWavefrontRecordContract;
851
+ materialReference: RendererWavefrontRecordContract;
852
+ mediumReference: RendererWavefrontRecordContract;
853
+ accumulation: RendererWavefrontRecordContract;
854
+ }>;
855
+ readonly bounceSchedule: readonly RendererWavefrontBounceStep[];
856
+ readonly terminationPolicy: RendererWavefrontTerminationPolicy;
857
+ }
858
+
294
859
  export function getRendererWorkerProfile(
295
860
  name?: RendererWorkerProfileName
296
861
  ): RendererWorkerProfile;
@@ -309,11 +874,28 @@ export function createRayTracingRenderPlan(options: {
309
874
  readonly [key: string]: unknown;
310
875
  }
311
876
  )[];
877
+ wavefront?: {
878
+ maxDepth?: number;
879
+ queueCapacity?: number;
880
+ explicitLightSampling?: boolean;
881
+ accumulationResetEpoch?: number;
882
+ };
312
883
  }): RayTracingRenderPlan;
313
884
 
885
+ export function createWavefrontPathTracingPlan(options?: {
886
+ maxDepth?: number;
887
+ queueCapacity?: number;
888
+ explicitLightSampling?: boolean;
889
+ accumulationResetEpoch?: number;
890
+ }): RendererWavefrontPathTracingPlan;
891
+
314
892
  export const rendererRepresentationBands: readonly RendererRepresentationBand[];
315
893
  export const rendererAccelerationStructureUpdateClasses: readonly RendererAccelerationStructureUpdateClass[];
316
894
  export const rendererRayTracingStageOrder: readonly RendererRenderStage["key"][];
895
+ export const rendererWavefrontBufferSchemaVersion: 1;
896
+ export const rendererWavefrontQueuePairStrategy: "ping-pong-active-next";
897
+ export const rendererWavefrontHitTypes: readonly RendererWavefrontHitType[];
898
+ export const rendererWavefrontPassOrder: readonly RendererWavefrontPassKey[];
317
899
 
318
900
  export const defaultRendererClearColor: readonly [number, number, number, number];
319
901
  export const rendererDebugOwner: "renderer";