@plasius/gpu-renderer 0.1.13 → 0.1.15
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/CHANGELOG.md +82 -4
- package/README.md +127 -2
- package/dist/index.cjs +3581 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3560 -8
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
- package/src/index.d.ts +551 -0
- package/src/index.js +20 -0
- package/src/wavefront-compute.js +3791 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plasius/gpu-renderer",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
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,555 @@
|
|
|
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 type WavefrontEnvironmentPortalMode =
|
|
213
|
+
| 0
|
|
214
|
+
| 1
|
|
215
|
+
| 2
|
|
216
|
+
| "disabled"
|
|
217
|
+
| "guide"
|
|
218
|
+
| "guide-and-gate"
|
|
219
|
+
| "gate";
|
|
220
|
+
|
|
221
|
+
export interface WavefrontEnvironmentPortalInput {
|
|
222
|
+
readonly kind?: "rectangle";
|
|
223
|
+
readonly shape?: "rectangle";
|
|
224
|
+
readonly position?: readonly [number, number, number] | readonly number[];
|
|
225
|
+
readonly center?: readonly [number, number, number] | readonly number[];
|
|
226
|
+
readonly normal?: readonly [number, number, number] | readonly number[];
|
|
227
|
+
readonly tangent?: readonly [number, number, number] | readonly number[];
|
|
228
|
+
readonly width?: number;
|
|
229
|
+
readonly height?: number;
|
|
230
|
+
readonly halfWidth?: number;
|
|
231
|
+
readonly halfHeight?: number;
|
|
232
|
+
readonly radianceScale?: number;
|
|
233
|
+
readonly intensity?: number;
|
|
234
|
+
readonly color?: readonly [number, number, number, number?] | readonly number[];
|
|
235
|
+
readonly twoSided?: boolean;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export interface WavefrontEnvironmentPortalRecord {
|
|
239
|
+
readonly kind: 1;
|
|
240
|
+
readonly flags: number;
|
|
241
|
+
readonly position: readonly [number, number, number, number] | readonly number[];
|
|
242
|
+
readonly normal: readonly [number, number, number, number] | readonly number[];
|
|
243
|
+
readonly tangent: readonly [number, number, number, number] | readonly number[];
|
|
244
|
+
readonly bitangent: readonly [number, number, number, number] | readonly number[];
|
|
245
|
+
readonly color: readonly [number, number, number, number] | readonly number[];
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export interface WavefrontPathTracingComputeConfig {
|
|
249
|
+
readonly width: number;
|
|
250
|
+
readonly height: number;
|
|
251
|
+
readonly maxDepth: number;
|
|
252
|
+
readonly tileSize: number;
|
|
253
|
+
readonly samplesPerPixel: number;
|
|
254
|
+
readonly tilePixelCapacity: number;
|
|
255
|
+
readonly sceneObjects: readonly WavefrontSceneObject[];
|
|
256
|
+
readonly sceneObjectCount: number;
|
|
257
|
+
readonly sceneObjectCapacity: number;
|
|
258
|
+
readonly accelerationBuildMode: WavefrontAccelerationBuildMode;
|
|
259
|
+
readonly gpuAccelerationBuildRequired: boolean;
|
|
260
|
+
readonly gpuMeshSource: WavefrontGpuMeshSource;
|
|
261
|
+
readonly meshAcceleration: WavefrontMeshAcceleration;
|
|
262
|
+
readonly emissiveTriangleIndices: WavefrontEmissiveTriangleIndexSource;
|
|
263
|
+
readonly emissiveTriangleCount: number;
|
|
264
|
+
readonly emissiveTriangleCapacity: number;
|
|
265
|
+
readonly environmentPortals: readonly WavefrontEnvironmentPortalRecord[];
|
|
266
|
+
readonly environmentPortalCount: number;
|
|
267
|
+
readonly environmentPortalCapacity: number;
|
|
268
|
+
readonly environmentPortalMode: 0 | 1 | 2;
|
|
269
|
+
readonly triangleCount: number;
|
|
270
|
+
readonly triangleCapacity: number;
|
|
271
|
+
readonly bvhNodeCount: number;
|
|
272
|
+
readonly bvhNodeCapacity: number;
|
|
273
|
+
readonly bvhLeafSortCapacity: number;
|
|
274
|
+
readonly bvhSortStages: readonly WavefrontBvhSortStage[];
|
|
275
|
+
readonly bvhBuildLevels: readonly WavefrontBvhBuildLevel[];
|
|
276
|
+
readonly camera: Readonly<{
|
|
277
|
+
readonly position: readonly number[];
|
|
278
|
+
readonly forward: readonly number[];
|
|
279
|
+
readonly right: readonly number[];
|
|
280
|
+
readonly up: readonly number[];
|
|
281
|
+
readonly fovYDegrees: number;
|
|
282
|
+
readonly aspect: number;
|
|
283
|
+
readonly tanHalfFovY: number;
|
|
284
|
+
}>;
|
|
285
|
+
readonly environmentColor: readonly [number, number, number, number] | readonly number[];
|
|
286
|
+
readonly ambientColor: readonly [number, number, number, number] | readonly number[];
|
|
287
|
+
readonly environmentLighting: WavefrontEnvironmentLightingConfig;
|
|
288
|
+
readonly displayQuality: boolean;
|
|
289
|
+
readonly requiresMeshBvhForDisplayQuality: true;
|
|
290
|
+
readonly denoise: boolean;
|
|
291
|
+
readonly frameIndex: number;
|
|
292
|
+
readonly memory: WavefrontPathTracingMemoryEstimate;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
export interface WavefrontEnvironmentLightingInput {
|
|
296
|
+
readonly environmentColor?: readonly [number, number, number, number?] | readonly number[];
|
|
297
|
+
readonly ambientColor?: readonly [number, number, number, number?] | readonly number[];
|
|
298
|
+
readonly horizonColor?: readonly [number, number, number, number?] | readonly number[];
|
|
299
|
+
readonly zenithColor?: readonly [number, number, number, number?] | readonly number[];
|
|
300
|
+
readonly sunDirection?: readonly [number, number, number] | readonly number[];
|
|
301
|
+
readonly sunColor?: readonly [number, number, number, number?] | readonly number[];
|
|
302
|
+
readonly intensity?: number;
|
|
303
|
+
readonly mode?: number;
|
|
304
|
+
readonly exposure?: number;
|
|
305
|
+
readonly environmentPortals?: readonly WavefrontEnvironmentPortalInput[];
|
|
306
|
+
readonly environmentPortalMode?: WavefrontEnvironmentPortalMode;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export interface WavefrontEnvironmentLightingConfig {
|
|
310
|
+
readonly environmentColor: readonly [number, number, number, number] | readonly number[];
|
|
311
|
+
readonly ambientColor: readonly [number, number, number, number] | readonly number[];
|
|
312
|
+
readonly horizonColor: readonly [number, number, number, number] | readonly number[];
|
|
313
|
+
readonly zenithColor: readonly [number, number, number, number] | readonly number[];
|
|
314
|
+
readonly sunDirection: readonly [number, number, number] | readonly number[];
|
|
315
|
+
readonly sunColor: readonly [number, number, number, number] | readonly number[];
|
|
316
|
+
readonly intensity: number;
|
|
317
|
+
readonly mode: number;
|
|
318
|
+
readonly exposure: number;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export interface WavefrontPathTracingMemoryEstimate {
|
|
322
|
+
readonly queueBytes: number;
|
|
323
|
+
readonly queuePairBytes: number;
|
|
324
|
+
readonly hitBytes: number;
|
|
325
|
+
readonly accumulationBytes: number;
|
|
326
|
+
readonly sceneObjectBytes: number;
|
|
327
|
+
readonly triangleBytes: number;
|
|
328
|
+
readonly bvhNodeBytes: number;
|
|
329
|
+
readonly bvhLeafReferenceBytes: number;
|
|
330
|
+
readonly emissiveTriangleMetadataBytes: number;
|
|
331
|
+
readonly environmentPortalBytes: number;
|
|
332
|
+
readonly configBytes: number;
|
|
333
|
+
readonly counterBytes: number;
|
|
334
|
+
readonly totalHotBufferBytes: number;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export interface CreateWavefrontPathTracingComputeRendererOptions {
|
|
338
|
+
readonly canvas?: HTMLCanvasElement | string;
|
|
339
|
+
readonly navigator?: Navigator | { gpu?: GPU };
|
|
340
|
+
readonly document?: Document;
|
|
341
|
+
readonly deviceDescriptor?: GPUDeviceDescriptor;
|
|
342
|
+
readonly requiredLimits?: Partial<Record<string, number>>;
|
|
343
|
+
readonly powerPreference?: GPUPowerPreference;
|
|
344
|
+
readonly alpha?: boolean;
|
|
345
|
+
readonly format?: GPUTextureFormat;
|
|
346
|
+
readonly width?: number;
|
|
347
|
+
readonly height?: number;
|
|
348
|
+
readonly maxDepth?: number;
|
|
349
|
+
readonly tileSize?: number;
|
|
350
|
+
readonly samplesPerPixel?: number;
|
|
351
|
+
readonly tilePixelCapacity?: number;
|
|
352
|
+
readonly sceneObjectCapacity?: number;
|
|
353
|
+
readonly sceneObjects?: readonly WavefrontSceneObjectInput[];
|
|
354
|
+
readonly mesh?: WavefrontMeshInput;
|
|
355
|
+
readonly meshes?: readonly WavefrontMeshInput[];
|
|
356
|
+
readonly triangleCapacity?: number;
|
|
357
|
+
readonly bvhNodeCapacity?: number;
|
|
358
|
+
readonly bvhLeafSortCapacity?: number;
|
|
359
|
+
readonly emissiveTriangleCapacity?: number;
|
|
360
|
+
readonly environmentPortalCapacity?: number;
|
|
361
|
+
readonly environmentPortals?: readonly WavefrontEnvironmentPortalInput[];
|
|
362
|
+
readonly environmentLightPortals?: readonly WavefrontEnvironmentPortalInput[];
|
|
363
|
+
readonly environmentPortalMode?: WavefrontEnvironmentPortalMode;
|
|
364
|
+
readonly portalMode?: WavefrontEnvironmentPortalMode;
|
|
365
|
+
readonly accelerationBuildMode?: WavefrontAccelerationBuildMode;
|
|
366
|
+
readonly camera?: WavefrontCameraOptions;
|
|
367
|
+
readonly environmentColor?: readonly [number, number, number, number?] | readonly number[];
|
|
368
|
+
readonly ambientColor?: readonly [number, number, number, number?] | readonly number[];
|
|
369
|
+
readonly environmentLighting?: WavefrontEnvironmentLightingInput;
|
|
370
|
+
readonly displayQuality?: boolean;
|
|
371
|
+
readonly denoise?: boolean;
|
|
372
|
+
readonly frameIndex?: number;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
export interface WavefrontPathTracingComputeRenderer {
|
|
376
|
+
readonly canvas: HTMLCanvasElement;
|
|
377
|
+
readonly context: GPUCanvasContext;
|
|
378
|
+
readonly device: GPUDevice;
|
|
379
|
+
readonly format: GPUTextureFormat | string;
|
|
380
|
+
readonly config: WavefrontPathTracingComputeConfig;
|
|
381
|
+
renderOnce(): Readonly<{
|
|
382
|
+
frame: number;
|
|
383
|
+
width: number;
|
|
384
|
+
height: number;
|
|
385
|
+
maxDepth: number;
|
|
386
|
+
tiles: number;
|
|
387
|
+
tileSize: number;
|
|
388
|
+
samplesPerPixel: number;
|
|
389
|
+
screenRays: number;
|
|
390
|
+
primaryRays: number;
|
|
391
|
+
sceneObjectCount: number;
|
|
392
|
+
triangleCount: number;
|
|
393
|
+
emissiveTriangleCount: number;
|
|
394
|
+
environmentPortalCount: number;
|
|
395
|
+
environmentPortalMode: 0 | 1 | 2;
|
|
396
|
+
bvhNodeCount: number;
|
|
397
|
+
displayQuality: boolean;
|
|
398
|
+
accelerationBuildMode: WavefrontAccelerationBuildMode;
|
|
399
|
+
gpuAccelerationBuildRequired: boolean;
|
|
400
|
+
accelerationBuildSubmitted: boolean;
|
|
401
|
+
accelerationBuilt: boolean;
|
|
402
|
+
accelerationBuildCount: number;
|
|
403
|
+
commandSubmissions: number;
|
|
404
|
+
frameConfigSlots: number;
|
|
405
|
+
memory: WavefrontPathTracingMemoryEstimate;
|
|
406
|
+
}>;
|
|
407
|
+
readOutputProbe(options?: { x?: number; y?: number }): Promise<
|
|
408
|
+
Readonly<{
|
|
409
|
+
x: number;
|
|
410
|
+
y: number;
|
|
411
|
+
rgba: readonly number[];
|
|
412
|
+
luminance: number;
|
|
413
|
+
}>
|
|
414
|
+
>;
|
|
415
|
+
updateSceneObjects(sceneObjects: readonly WavefrontSceneObjectInput[]): WavefrontPathTracingComputeConfig;
|
|
416
|
+
getSnapshot(): Readonly<{
|
|
417
|
+
frame: number;
|
|
418
|
+
width: number;
|
|
419
|
+
height: number;
|
|
420
|
+
maxDepth: number;
|
|
421
|
+
tiles: number;
|
|
422
|
+
tileSize: number;
|
|
423
|
+
samplesPerPixel: number;
|
|
424
|
+
sceneObjectCount: number;
|
|
425
|
+
triangleCount: number;
|
|
426
|
+
emissiveTriangleCount: number;
|
|
427
|
+
environmentPortalCount: number;
|
|
428
|
+
environmentPortalMode: 0 | 1 | 2;
|
|
429
|
+
bvhNodeCount: number;
|
|
430
|
+
displayQuality: boolean;
|
|
431
|
+
accelerationBuildMode: WavefrontAccelerationBuildMode;
|
|
432
|
+
gpuAccelerationBuildRequired: boolean;
|
|
433
|
+
accelerationBuilt: boolean;
|
|
434
|
+
accelerationBuildCount: number;
|
|
435
|
+
frameConfigSlots: number;
|
|
436
|
+
memory: WavefrontPathTracingMemoryEstimate;
|
|
437
|
+
}>;
|
|
438
|
+
destroy(): void;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
export function normalizeWavefrontSceneObject(
|
|
442
|
+
input?: WavefrontSceneObjectInput,
|
|
443
|
+
index?: number
|
|
444
|
+
): WavefrontSceneObject;
|
|
445
|
+
export function createDefaultWavefrontSceneObjects(): readonly WavefrontSceneObject[];
|
|
446
|
+
export function estimateWavefrontPathTracingMemory(options?: {
|
|
447
|
+
tilePixelCapacity?: number;
|
|
448
|
+
sceneObjectCapacity?: number;
|
|
449
|
+
triangleCapacity?: number;
|
|
450
|
+
bvhNodeCapacity?: number;
|
|
451
|
+
bvhLeafSortCapacity?: number;
|
|
452
|
+
emissiveTriangleCapacity?: number;
|
|
453
|
+
}): WavefrontPathTracingMemoryEstimate;
|
|
454
|
+
export function normalizeWavefrontMesh(
|
|
455
|
+
input: WavefrontMeshInput,
|
|
456
|
+
meshIndex?: number
|
|
457
|
+
): Readonly<{
|
|
458
|
+
id: number;
|
|
459
|
+
positions: readonly number[];
|
|
460
|
+
indices: readonly number[];
|
|
461
|
+
normals: readonly number[] | null;
|
|
462
|
+
uvs: readonly number[] | null;
|
|
463
|
+
materialKind: number;
|
|
464
|
+
flags: number;
|
|
465
|
+
materialRefId: number;
|
|
466
|
+
mediumRefId: number;
|
|
467
|
+
color: readonly number[];
|
|
468
|
+
emission: readonly number[];
|
|
469
|
+
roughness: number;
|
|
470
|
+
metallic: number;
|
|
471
|
+
opacity: number;
|
|
472
|
+
ior: number;
|
|
473
|
+
}>;
|
|
474
|
+
export function createWavefrontMeshAcceleration(
|
|
475
|
+
meshes?: readonly WavefrontMeshInput[] | WavefrontMeshInput
|
|
476
|
+
): WavefrontMeshAcceleration;
|
|
477
|
+
export function createWavefrontGpuMeshSource(
|
|
478
|
+
meshes?: readonly WavefrontMeshInput[] | WavefrontMeshInput
|
|
479
|
+
): WavefrontGpuMeshSource;
|
|
480
|
+
export function createWavefrontEmissiveTriangleIndexSource(
|
|
481
|
+
meshes?: readonly WavefrontMeshInput[] | WavefrontMeshInput,
|
|
482
|
+
capacity?: number
|
|
483
|
+
): WavefrontEmissiveTriangleIndexSource;
|
|
484
|
+
export function createWavefrontBvhBuildLevels(
|
|
485
|
+
triangleCount: number
|
|
486
|
+
): readonly WavefrontBvhBuildLevel[];
|
|
487
|
+
export function createWavefrontBvhSortStages(
|
|
488
|
+
itemCount: number
|
|
489
|
+
): readonly WavefrontBvhSortStage[];
|
|
490
|
+
export function createWavefrontPathTracingComputeConfig(
|
|
491
|
+
options?: CreateWavefrontPathTracingComputeRendererOptions
|
|
492
|
+
): WavefrontPathTracingComputeConfig;
|
|
493
|
+
export function packWavefrontSceneObjects(
|
|
494
|
+
sceneObjects: readonly WavefrontSceneObjectInput[],
|
|
495
|
+
capacity?: number
|
|
496
|
+
): Readonly<{
|
|
497
|
+
buffer: ArrayBuffer;
|
|
498
|
+
objects: readonly WavefrontSceneObject[];
|
|
499
|
+
count: number;
|
|
500
|
+
capacity: number;
|
|
501
|
+
}>;
|
|
502
|
+
export function packWavefrontTriangles(
|
|
503
|
+
triangles: readonly WavefrontTriangleRecord[],
|
|
504
|
+
capacity?: number
|
|
505
|
+
): Readonly<{
|
|
506
|
+
buffer: ArrayBuffer;
|
|
507
|
+
triangles: readonly WavefrontTriangleRecord[];
|
|
508
|
+
count: number;
|
|
509
|
+
capacity: number;
|
|
510
|
+
}>;
|
|
511
|
+
export function packWavefrontBvhNodes(
|
|
512
|
+
nodes: readonly WavefrontBvhNodeRecord[],
|
|
513
|
+
capacity?: number
|
|
514
|
+
): Readonly<{
|
|
515
|
+
buffer: ArrayBuffer;
|
|
516
|
+
nodes: readonly WavefrontBvhNodeRecord[];
|
|
517
|
+
count: number;
|
|
518
|
+
capacity: number;
|
|
519
|
+
}>;
|
|
520
|
+
export function supportsWavefrontPathTracingCompute(options?: {
|
|
521
|
+
navigator?: Navigator | { gpu?: GPU };
|
|
522
|
+
}): boolean;
|
|
523
|
+
export function createWavefrontPathTracingComputeRenderer(
|
|
524
|
+
options?: CreateWavefrontPathTracingComputeRendererOptions
|
|
525
|
+
): Promise<WavefrontPathTracingComputeRenderer>;
|
|
526
|
+
|
|
527
|
+
export const wavefrontPathTracingComputeLimits: Readonly<{
|
|
528
|
+
workgroupSize: 64;
|
|
529
|
+
rayRecordBytes: 80;
|
|
530
|
+
hitRecordBytes: 208;
|
|
531
|
+
sceneObjectRecordBytes: 96;
|
|
532
|
+
meshVertexRecordBytes: 48;
|
|
533
|
+
meshRangeRecordBytes: 96;
|
|
534
|
+
triangleRecordBytes: 208;
|
|
535
|
+
bvhNodeRecordBytes: 48;
|
|
536
|
+
bvhLeafReferenceRecordBytes: 16;
|
|
537
|
+
emissiveTriangleIndexBytes: 4;
|
|
538
|
+
emissiveTriangleMetadataRecordBytes: 48;
|
|
539
|
+
environmentPortalRecordBytes: 96;
|
|
540
|
+
accumulationRecordBytes: 16;
|
|
541
|
+
}>;
|
|
542
|
+
export const wavefrontSceneObjectKinds: Readonly<{
|
|
543
|
+
sphere: 1;
|
|
544
|
+
box: 2;
|
|
545
|
+
}>;
|
|
546
|
+
export const wavefrontMaterialKinds: Readonly<{
|
|
547
|
+
diffuse: 0;
|
|
548
|
+
metal: 1;
|
|
549
|
+
dielectric: 2;
|
|
550
|
+
transparent: 3;
|
|
551
|
+
emissive: 4;
|
|
552
|
+
}>;
|
|
2
553
|
|
|
3
554
|
export interface RendererFrameEvent {
|
|
4
555
|
frame: number;
|
package/src/index.js
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
const DEFAULT_CLEAR_COLOR = Object.freeze([0.07, 0.11, 0.18, 1.0]);
|
|
2
2
|
const DEFAULT_CANVAS_SELECTOR = "canvas[data-plasius-gpu-renderer]";
|
|
3
|
+
export {
|
|
4
|
+
createDefaultWavefrontSceneObjects,
|
|
5
|
+
createWavefrontBvhBuildLevels,
|
|
6
|
+
createWavefrontBvhSortStages,
|
|
7
|
+
createWavefrontEmissiveTriangleIndexSource,
|
|
8
|
+
createWavefrontGpuMeshSource,
|
|
9
|
+
createWavefrontMeshAcceleration,
|
|
10
|
+
createWavefrontPathTracingComputeConfig,
|
|
11
|
+
createWavefrontPathTracingComputeRenderer,
|
|
12
|
+
estimateWavefrontPathTracingMemory,
|
|
13
|
+
normalizeWavefrontMesh,
|
|
14
|
+
normalizeWavefrontSceneObject,
|
|
15
|
+
packWavefrontBvhNodes,
|
|
16
|
+
packWavefrontSceneObjects,
|
|
17
|
+
packWavefrontTriangles,
|
|
18
|
+
supportsWavefrontPathTracingCompute,
|
|
19
|
+
wavefrontMaterialKinds,
|
|
20
|
+
wavefrontPathTracingComputeLimits,
|
|
21
|
+
wavefrontSceneObjectKinds,
|
|
22
|
+
} from "./wavefront-compute.js";
|
|
3
23
|
export const rendererDebugOwner = "renderer";
|
|
4
24
|
export const rendererWorkerQueueClass = "render";
|
|
5
25
|
export const defaultRendererWorkerProfile = "realtime";
|